]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/dns.cpp
Bugfix (typo).
[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) // Padre
67     {
68         pid_t pid_recv = fork();
69         if (pid_recv == -1)
70         {
71             perror("fork() recv");
72             return 3;
73         }
74         if (pid_recv) // Padre
75         {
76             pid_t pid_req = fork();
77             if (pid_req == -1)
78             {
79                 perror("fork() req");
80                 return 3;
81             }
82             if (pid_req) // Padre (Entrada por teclado)
83             {
84                 int ret;
85                 send_loop(ns);
86                 kill(pid_send, SIGTERM);
87                 waitpid(pid_send, &ret, 0);
88                 kill(pid_recv, SIGTERM);
89                 waitpid(pid_recv, &ret, 0);
90                 kill(pid_req, SIGTERM);
91                 waitpid(pid_req, &ret, 0);
92                 return 0;
93             }
94             else // Hijo 1 (Proceso de request DNS)
95             {
96                 ns.req_loop();
97                 return 0;
98             }
99         }
100         else // Hijo 2 (envío del DNS)
101         {
102             ns.send_loop();
103             return 0;
104         }
105     }
106     else // Hijo 3 (recepción del DNS)
107     {
108         ns.recv_loop();
109         return 0;
110     }
111     return 0;
112 }
113
114 void send_loop(NameServer& ns)
115 {
116     std::string name;
117     while (std::getline(std::cin, name))
118     {
119         std::cout << "Resolviendo " << name << "...\n";
120         ResolvProtoResponse res = ns.resolv_recursive(name);
121         std::cout << "Resultado: " << res << "\n";
122     }
123 }
124
125 // vim: set et sw=4 sts=4 :