]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/nameserver.h
Se generaliza el devque para seguir (ab)usándolo como cola y poder pedir de
[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 #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     struct Name: std::vector< std::string >
19     {
20         /// Constructor
21         Name() {}
22         Name(const std::string& name);
23         operator std::string ();
24     };
25
26     /// Registro de una zona
27     struct Record
28     {
29         /// Tipo de registro
30         enum type_t { A, NS };
31         type_t type;
32         /// Dirección IP del registro
33         IPAddr ip;
34         /// Constructor
35         Record(type_t t, const IPAddr& i): type(t), ip(i) {}
36     };
37
38     /// Zona
39     struct Zone
40     {
41         /// Nombre
42         Name name;
43         /// Time to live
44         size_t ttl;
45         /// Nodo padre
46         IPAddr parent;
47         /// Registros
48         typedef std::multimap< std::string, Record > records_t;
49         records_t records;
50         /// Constructores
51         Zone() {}
52         Zone(std::string sname, size_t ttl, const IPAddr& parent);
53         Zone(std::istream& is) throw (std::runtime_error);
54         /// Limpia una zona
55         void clear();
56     };
57
58     /// Zonas para las que este servidor de nombres es autoridad
59     typedef std::vector< Zone > zones_t;
60     zones_t zones;
61
62     /// Cache de un registro
63     struct CacheRecord
64     {
65         /// Time to live
66         size_t ttl;
67         /// Dirección IP del registro
68         typedef ResolvProtoResponse::ipvec_t ipvec_t;
69         ipvec_t ips;
70         /// Constructor
71         CacheRecord(): ttl(0) {}
72         CacheRecord(size_t ttl, const ipvec_t& ips):
73             ttl(ttl), ips(ips) {}
74     };
75
76     /// Cache de records
77     typedef std::map< Name, CacheRecord > cache_t;
78     cache_t cache;
79
80     /// Constructor
81     NameServer(std::istream& is) throw (std::runtime_error);
82
83     /// Resuelve un nombre de forma directa (no recursiva)
84     ResolvProtoResponse resolv_direct(const Name& n);
85
86     /// Resuelve un nombre de forma recursiva
87     ResolvProtoResponse resolv_recursive(const Name& n);
88
89     /// Consulta a otro name server sobre un nombre
90     ResolvProtoResponse query(const Name&n, const IPAddr& ip);
91
92     private:
93     /// Resuelve un nombre de forma recursiva entrando a otros ns
94     ResolvProtoResponse resolv_recursive_r(const Name& n,
95             ResolvProtoResponse rpr);
96
97 };
98
99 /// Impresión (para debug)
100 std::ostream& operator<< (std::ostream& os, const NameServer& ns);
101 std::ostream& operator<< (std::ostream& os, const NameServer::Name& name);
102 std::ostream& operator<< (std::ostream& os, const NameServer::Record& r);
103 std::ostream& operator<< (std::ostream& os, const NameServer::Zone& z);
104 std::ostream& operator<< (std::ostream& os, const NameServer::CacheRecord& cr);
105
106 #endif // _NAMESERVER_H_
107
108 // vim: set et sw=4 sts=4 :