]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/nameserver.h
Primera aproximación al cache y a la resolución de nombres.
[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     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 std::vector< Record > records_t;
69         records_t records;
70         /// Constructor
71         CacheRecord(): ttl(0) {}
72         CacheRecord(size_t ttl, const records_t& records):
73             ttl(ttl), records(records) {}
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 no recursiva
84     void resolv_next(const Name& n);
85 };
86
87 /// Impresión (para debug)
88 std::ostream& operator<< (std::ostream& os, const NameServer& ns);
89 std::ostream& operator<< (std::ostream& os, const NameServer::Name& name);
90 std::ostream& operator<< (std::ostream& os, const NameServer::Record& r);
91 std::ostream& operator<< (std::ostream& os, const NameServer::Zone& z);
92 std::ostream& operator<< (std::ostream& os, const NameServer::CacheRecord& cr);
93
94 #endif // _NAMESERVER_H_
95
96 // vim: set et sw=4 sts=4 :