]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/nameserver.h
686fb52e410d1f81e8abfe12a8435a57863767b5
[z.facultad/75.74/practicos.git] / practicas / pipi / src / nameserver.h
1 #ifndef _NAMESERVER_H_
2 #define _NAMESERVER_H_
3
4 #include "ipaddr.h"
5 //XXX#include "resolvproto.h"
6 #include <string>
7 #include <vector>
8 #include <map>
9 #include <istream>
10 #include <ostream>
11 #include <stdexcept>
12
13 /// Petición del resolver a un nameserver
14 struct NameServer
15 {
16
17     /// Nombre de un dominio dividido en tokens
18     typedef std::vector< std::string > name_t;
19
20     /// Registro de una zona
21     struct Record
22     {
23         /// Tipo de registro
24         enum type_t { A, NS };
25         type_t type;
26         /// Dirección IP del registro
27         IPAddr ip;
28         /// Constructor
29         Record(type_t t, const IPAddr& i): type(t), ip(i) {}
30     };
31
32     /// Zona
33     struct Zone
34     {
35         /// Nombre
36         name_t name;
37         /// Time to live
38         size_t ttl;
39         /// Nodo padre
40         IPAddr parent;
41         /// Registros
42         typedef std::multimap< std::string, Record > records_t;
43         records_t records;
44         /// Constructores
45         Zone() {}
46         Zone(std::string sname, size_t ttl, const IPAddr& parent);
47         Zone(std::istream& is) throw (std::runtime_error);
48         /// Limpia una zona
49         void clear();
50     };
51
52     //TODO cache de _records_ (no zonas)
53
54     /// Zonas para las que este servidor de nombres es autoridad
55     typedef std::vector< Zone > zones_t;
56     zones_t zones;
57
58     /// Constructor
59     NameServer(std::istream& is) throw (std::runtime_error);
60
61 };
62
63 /// Impresión (para debug)
64 std::ostream& operator<< (std::ostream& os, const NameServer& ns);
65 std::ostream& operator<< (std::ostream& os, const NameServer::Record& r);
66 std::ostream& operator<< (std::ostream& os, const NameServer::Zone& z);
67
68 #endif // _NAMESERVER_H_
69
70 // vim: set et sw=4 sts=4 :