]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/dns.cpp
f0846d4fa1f6eb815201d643ea2920312c13ddd2
[z.facultad/75.74/practicos.git] / practicas / pipi / src / dns.cpp
1
2 #include "ipout.h"
3 #include "ipin.h"
4 #include "ipaddr.h"
5 #include "routetable.h"
6 #include "devtcp.h"
7 #include "devque.h"
8 #include "nameserver.h"
9 #include <iostream>
10 #include <fstream>
11 #include <sstream>
12 #include <string>
13 #include <cassert>
14 #include <unistd.h>
15 #include <fcntl.h>
16 #include <sys/types.h>
17 #include <sys/wait.h>
18 #include <sys/ipc.h>
19 #include <sys/msg.h>
20 #include <signal.h>
21
22 // Uso: ./dns ip [routes_file zones_file forward port]
23
24 void send_loop(NameServer& ns);
25
26 int main(int argc, char* argv[])
27 {
28     uint16_t port = DEVTCP_DEFAULT_PORT;
29     std::string rfile = "route.txt";
30     std::string zfile = "zones.txt";
31     if (argc < 2)
32     {
33         std::cerr << "Uso: " << argv[0] << " ip [route_file zone_file port]\n";
34         return 1;
35     }
36     IPAddr addr(argv[1]);
37     if (argc > 2)
38         rfile = argv[2];
39     if (argc > 3)
40         zfile = argv[3];
41     if (argc > 4)
42         port = atoi(argv[4]);
43     // Abro archivo con rutas
44     std::ifstream rifs(rfile.c_str()); assert(rifs);
45     // Abro archivo con zonas
46     std::ifstream zifs(zfile.c_str()); assert(zifs);
47     // Creo medio físico y colas para forwarding y NameServer
48     DevTCP dev(addr, port);
49     DevQue fwque(addr, DEVQUE_DEFAULT_KEY-1);
50     DevQue nsreqque(addr, DEVQUE_DEFAULT_KEY-2);
51     DevQue nsresque(addr, DEVQUE_DEFAULT_KEY-3);
52     DevQue nssndque(addr, DEVQUE_DEFAULT_KEY-4);
53     // Creo Rutas, IPOut, IPIn
54     RouteTable table(dev);
55     add_routes(table, rifs, dev);
56     IPOut ipout(addr, table, fwque, std::cerr);
57     IPIn ipin(addr, dev, fwque, false, false, std::cerr);
58     NameServer ns(zifs, ipin, ipout, nsreqque, nsresque, nssndque);
59     // Creo procesos
60     pid_t pid_send = fork();
61     if (pid_send == -1)
62     {
63         perror("fork() send");
64         return 2;
65     }
66     if (pid_send) // IPOut
67     {
68         pid_t pid_fw = fork();
69         if (pid_fw == -1)
70         {
71             perror("fork() forward");
72             return 3;
73         }
74         if (pid_fw) // Padre (Entrada por teclado)
75         {
76             int ret;
77             send_loop(ns);
78             kill(pid_send, SIGTERM);
79             waitpid(pid_send, &ret, 0);
80             kill(pid_fw, SIGTERM);
81             waitpid(pid_fw, &ret, 0);
82             return 0;
83         }
84         else // Hijo 1 (envío del DNS)
85         {
86             ns.send_loop();
87             return 0;
88         }
89     }
90     else // Hijo 2 (recepción del DNS)
91     {
92         ns.recv_loop();
93         return 0;
94     }
95     return 0;
96 }
97
98 void send_loop(NameServer& ns)
99 {
100     std::string name;
101     while (std::getline(std::cin, name))
102     {
103         std::cout << "Resolviendo " << name << "...\n";
104         ResolvProtoResponse res = ns.resolv_recursive(name);
105         std::cout << "Resultado: " << res << "\n";
106     }
107 }
108
109 // vim: set et sw=4 sts=4 :