5 #include "routetable.h"
8 #include "nameserver.h"
16 #include <sys/types.h>
22 // Uso: ./dns ip [routes_file zones_file forward port]
24 void send_loop(NameServer& ns);
26 void add_routes(RouteTable& rt, std::istream& is, Dev& dev);
28 int main(int argc, char* argv[])
30 uint16_t port = DEVTCP_DEFAULT_PORT;
31 std::string rfile = "route.txt";
32 std::string zfile = "zones.txt";
35 std::cerr << "Uso: " << argv[0] << " ip [route_file zone_file port]\n";
45 // Abro archivo con rutas
46 std::ifstream rifs(rfile.c_str()); assert(rifs);
47 // Abro archivo con zonas
48 std::ifstream zifs(zfile.c_str()); assert(zifs);
49 // Creo medio físico y colas para forwarding y NameServer
50 DevTCP dev(addr, port);
51 DevQue fwque(addr, DEVQUE_DEFAULT_KEY-1);
52 DevQue nsreqque(addr, DEVQUE_DEFAULT_KEY-2);
53 DevQue nsresque(addr, DEVQUE_DEFAULT_KEY-3);
54 DevQue nssndque(addr, DEVQUE_DEFAULT_KEY-4);
55 // Creo Rutas, IPOut, IPIn
56 RouteTable table(dev);
57 add_routes(table, rifs, dev);
58 IPOut ipout(addr, table, fwque, std::cerr);
59 IPIn ipin(addr, dev, fwque, false, false, std::cerr);
60 NameServer ns(zifs, ipin, ipout, nsreqque, nsresque, nssndque);
62 pid_t pid_send = fork();
65 perror("fork() send");
68 if (pid_send) // IPOut
70 pid_t pid_fw = fork();
73 perror("fork() forward");
76 if (pid_fw) // Padre (Entrada por teclado)
80 kill(pid_send, SIGTERM);
81 waitpid(pid_send, &ret, 0);
82 kill(pid_fw, SIGTERM);
83 waitpid(pid_fw, &ret, 0);
86 else // Hijo 1 (envío del DNS)
92 else // Hijo 2 (recepción del DNS)
100 void send_loop(NameServer& ns)
103 while (std::getline(std::cin, name))
105 std::cout << "Resolviendo " << name << "...\n";
106 ResolvProtoResponse res = ns.resolv_recursive(name);
107 std::cout << "Resultado: " << res << "\n";
111 void add_routes(RouteTable& rt, std::istream& is, Dev& dev)
114 while (std::getline(is, line))
116 std::istringstream iss(line);
121 iss >> net >> gw >> mtu >> metric;
122 if (net == "0") net = "0.0.0.0";
123 if (gw == "0") gw = "0.0.0.0";
124 rt.add(net, gw, metric, mtu, dev);
128 // vim: set et sw=4 sts=4 :