diff options
author | Martin Schanzenbach <mschanzenbach@posteo.de> | 2012-02-20 16:31:47 +0000 |
---|---|---|
committer | Martin Schanzenbach <mschanzenbach@posteo.de> | 2012-02-20 16:31:47 +0000 |
commit | 2a3f7ede791d3ae2ee809b242abe9fff3969c64a (patch) | |
tree | 7f44361b2f1ed3186bf4c8c507447bf36bace26d /src/gns/gnunet-service-gns.c | |
parent | c7e7b05c19dd113c065a73dde7d60a68e5fe7659 (diff) | |
download | gnunet-2a3f7ede791d3ae2ee809b242abe9fff3969c64a.tar.gz gnunet-2a3f7ede791d3ae2ee809b242abe9fff3969c64a.zip |
-gns service with dns/namestore api added
Diffstat (limited to 'src/gns/gnunet-service-gns.c')
-rw-r--r-- | src/gns/gnunet-service-gns.c | 174 |
1 files changed, 155 insertions, 19 deletions
diff --git a/src/gns/gnunet-service-gns.c b/src/gns/gnunet-service-gns.c index 9d3b93aee..902c2adec 100644 --- a/src/gns/gnunet-service-gns.c +++ b/src/gns/gnunet-service-gns.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include "gnunet_transport_service.h" | 28 | #include "gnunet_transport_service.h" |
29 | #include "gnunet_dns_service.h" | 29 | #include "gnunet_dns_service.h" |
30 | #include "gnunet_dnsparser_lib.h" | 30 | #include "gnunet_dnsparser_lib.h" |
31 | #include "gnunet_namestore_service.h" | ||
31 | #include "gnunet_gns_service.h" | 32 | #include "gnunet_gns_service.h" |
32 | #include "gns.h" | 33 | #include "gns.h" |
33 | 34 | ||
@@ -37,11 +38,38 @@ | |||
37 | #define GNUNET_MESSAGE_TYPE_GNS_CLIENT_RESULT 24 | 38 | #define GNUNET_MESSAGE_TYPE_GNS_CLIENT_RESULT 24 |
38 | 39 | ||
39 | /** | 40 | /** |
41 | * A result list for namestore queries | ||
42 | */ | ||
43 | struct GNUNET_GNS_PendingQuery | ||
44 | { | ||
45 | /* the answer packet */ | ||
46 | struct GNUNET_DNSPARSER_Packet *answer; | ||
47 | |||
48 | /* records to put into answer packet */ | ||
49 | struct GNUNET_CONTAINER_SList *records; | ||
50 | |||
51 | int num_records; | ||
52 | int num_authority_records; //FIXME are all of our replies auth? | ||
53 | |||
54 | /* the dns request id */ | ||
55 | int id; // FIXME can handle->request_id also be used here? | ||
56 | |||
57 | /* the request handle to reply to */ | ||
58 | struct GNUNET_DNS_RequestHandle *request_handle; | ||
59 | }; | ||
60 | |||
61 | |||
62 | /** | ||
40 | * Our handle to the DNS handler library | 63 | * Our handle to the DNS handler library |
41 | */ | 64 | */ |
42 | struct GNUNET_DNS_Handle *dns_handle; | 65 | struct GNUNET_DNS_Handle *dns_handle; |
43 | 66 | ||
44 | /** | 67 | /** |
68 | * Our handle to the namestore service | ||
69 | */ | ||
70 | struct GNUNET_NAMESTORE_Handle *namestore_handle; | ||
71 | |||
72 | /** | ||
45 | * The configuration the GNS service is running with | 73 | * The configuration the GNS service is running with |
46 | */ | 74 | */ |
47 | const struct GNUNET_CONFIGURATION_Handle *GNS_cfg; | 75 | const struct GNUNET_CONFIGURATION_Handle *GNS_cfg; |
@@ -52,6 +80,11 @@ const struct GNUNET_CONFIGURATION_Handle *GNS_cfg; | |||
52 | static struct GNUNET_SERVER_NotificationContext *nc; | 80 | static struct GNUNET_SERVER_NotificationContext *nc; |
53 | 81 | ||
54 | /** | 82 | /** |
83 | * Our zone hash | ||
84 | */ | ||
85 | const GNUNET_HashCode *my_zone; | ||
86 | |||
87 | /** | ||
55 | * Task run during shutdown. | 88 | * Task run during shutdown. |
56 | * | 89 | * |
57 | * @param cls unused | 90 | * @param cls unused |
@@ -63,6 +96,87 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
63 | GNUNET_DNS_disconnect(dns_handle); | 96 | GNUNET_DNS_disconnect(dns_handle); |
64 | } | 97 | } |
65 | 98 | ||
99 | static void | ||
100 | process_ns_result(void* cls, const GNUNET_HashCode *zone, | ||
101 | const char *name, uint32_t record_type, | ||
102 | struct GNUNET_TIME_Absolute expiration, | ||
103 | enum GNUNET_NAMESTORE_RecordFlags flags, | ||
104 | const struct GNUNET_NAMESTORE_SignatureLocation *sig_loc, | ||
105 | size_t size, const void *data) | ||
106 | { | ||
107 | struct GNUNET_GNS_PendingQuery *answer; | ||
108 | struct GNUNET_DNSPARSER_Record *record; | ||
109 | struct GNUNET_DNSPARSER_Packet *packet; | ||
110 | struct GNUNET_DNSPARSER_Flags dnsflags; | ||
111 | char *reply_buffer; | ||
112 | |||
113 | answer = (struct GNUNET_GNS_PendingQuery *) cls; | ||
114 | |||
115 | |||
116 | if (NULL == data) | ||
117 | { | ||
118 | /** | ||
119 | * Last result received (or none) | ||
120 | * FIXME extract to func | ||
121 | */ | ||
122 | reply_buffer = GNUNET_malloc(6000); //FIXME magic number | ||
123 | packet = GNUNET_malloc(sizeof(struct GNUNET_DNSPARSER_Packet)); | ||
124 | packet->answers = | ||
125 | GNUNET_malloc(sizeof(struct GNUNET_DNSPARSER_Record) * answer->num_records); | ||
126 | /* FIXME how to handle auth, additional etc */ | ||
127 | packet->num_answers = answer->num_records; | ||
128 | packet->num_authority_records = answer->num_authority_records; | ||
129 | |||
130 | dnsflags.authoritative_answer = 1; | ||
131 | dnsflags.return_code = GNUNET_DNSPARSER_RETURN_CODE_YXDOMAIN; //not sure | ||
132 | dnsflags.query_or_response = 1; | ||
133 | packet->flags = dnsflags; | ||
134 | |||
135 | packet->id = answer->id; | ||
136 | size_t bufsize = 6000; | ||
137 | int ret = GNUNET_DNSPARSER_pack (packet, | ||
138 | 600, /* FIXME max udp payload */ | ||
139 | &reply_buffer, | ||
140 | &bufsize); // FIXME magic number bufsize | ||
141 | if (ret == GNUNET_OK) | ||
142 | { | ||
143 | GNUNET_DNS_request_answer(answer->request_handle, | ||
144 | 6000, //FIXME what length here | ||
145 | reply_buffer); | ||
146 | } | ||
147 | else | ||
148 | { | ||
149 | //FIXME log | ||
150 | } | ||
151 | } | ||
152 | else | ||
153 | { | ||
154 | /** | ||
155 | * New result | ||
156 | */ | ||
157 | record = GNUNET_malloc(sizeof(struct GNUNET_DNSPARSER_Record)); | ||
158 | record->name = (char*)name; | ||
159 | /* FIXME for gns records this requires the dnsparser to be modified!*/ | ||
160 | //record->data = data; FIXME! | ||
161 | record->expiration_time = expiration; | ||
162 | record->type = record_type; | ||
163 | record->class = GNUNET_DNSPARSER_CLASS_INTERNET; /* srsly? */ | ||
164 | |||
165 | if (flags == GNUNET_NAMESTORE_RF_AUTHORITY) | ||
166 | { | ||
167 | answer->num_authority_records++; | ||
168 | } | ||
169 | |||
170 | answer->num_records++; | ||
171 | |||
172 | //FIXME watch for leaks | ||
173 | GNUNET_CONTAINER_slist_add (answer->records, | ||
174 | GNUNET_CONTAINER_SLIST_DISPOSITION_DYNAMIC, | ||
175 | &record, sizeof(struct GNUNET_DNSPARSER_Record*)); | ||
176 | } | ||
177 | } | ||
178 | |||
179 | |||
66 | /** | 180 | /** |
67 | * The DNS request handler | 181 | * The DNS request handler |
68 | * Is this supposed to happen here in the service (config option) | 182 | * Is this supposed to happen here in the service (config option) |
@@ -81,8 +195,9 @@ handle_dns_request(void *cls, | |||
81 | { | 195 | { |
82 | /** | 196 | /** |
83 | * parse request for tld | 197 | * parse request for tld |
84 | **/ | 198 | */ |
85 | struct GNUNET_DNSPARSER_Packet *p; | 199 | struct GNUNET_DNSPARSER_Packet *p; |
200 | struct GNUNET_GNS_PendingQuery *answer; | ||
86 | int namelen; | 201 | int namelen; |
87 | int i; | 202 | int i; |
88 | char *tail; | 203 | char *tail; |
@@ -98,27 +213,40 @@ handle_dns_request(void *cls, | |||
98 | * FIXME factor out | 213 | * FIXME factor out |
99 | * Check tld and decide if we or | 214 | * Check tld and decide if we or |
100 | * legacy dns is responsible | 215 | * legacy dns is responsible |
101 | **/ | 216 | */ |
102 | for (i=0;i<p->num_queries;i++) | 217 | for (i=0;i<p->num_queries;i++) |
103 | { | 218 | { |
104 | namelen = strlen(p->queries[i].name); | 219 | namelen = strlen(p->queries[i].name); |
105 | if (namelen >= 7) | 220 | |
221 | if (namelen < 7) /* this can't be .gnunet */ | ||
222 | continue; | ||
223 | /** | ||
224 | * FIXME off by 1? | ||
225 | * Move our tld/root to config file | ||
226 | * Generate fake DNS reply that replaces .gnunet with .org for testing? | ||
227 | */ | ||
228 | tail = p->queries[i].name+(namelen-7); | ||
229 | if (0 == strcmp(tail, ".gnunet")) | ||
106 | { | 230 | { |
107 | /** | 231 | /** |
108 | * FIXME off by 1? | 232 | * Do db lookup here. Make dht lookup if necessary |
109 | * Move our tld/root to config file | 233 | * FIXME for now only local lookups for our zone! |
110 | * Generate fake DNS reply that replaces .gnunet with .org | 234 | */ |
111 | **/ | 235 | answer = GNUNET_malloc(sizeof (struct GNUNET_GNS_PendingQuery)); |
112 | tail = p->queries[i].name+(namelen-7); | 236 | answer->records = GNUNET_CONTAINER_slist_create (); |
113 | if (0 == strcmp(tail, ".gnunet")) | 237 | answer->id = p->id; |
114 | { | 238 | |
115 | /* Do db lookup here. Make dht lookup if necessary */ | 239 | GNUNET_NAMESTORE_lookup_name(namestore_handle, |
116 | GNUNET_DNS_request_answer(rh, 0 /*length*/, NULL/*reply*/); | 240 | my_zone, |
117 | } | 241 | p->queries[i].name, |
118 | else | 242 | p->queries[i].type, |
119 | { | 243 | &process_ns_result, |
120 | GNUNET_DNS_request_forward (rh); | 244 | answer); |
121 | } | 245 | //GNUNET_DNS_request_answer(rh, 0 /*length*/, NULL/*reply*/); |
246 | } | ||
247 | else | ||
248 | { | ||
249 | GNUNET_DNS_request_forward (rh); | ||
122 | } | 250 | } |
123 | } | 251 | } |
124 | } | 252 | } |
@@ -152,17 +280,25 @@ run (void *cls, struct GNUNET_SERVER_Handle *server, | |||
152 | 280 | ||
153 | nc = GNUNET_SERVER_notification_context_create (server, 1); | 281 | nc = GNUNET_SERVER_notification_context_create (server, 1); |
154 | 282 | ||
155 | /* TODO do some config parsing */ | 283 | /* FIXME - do some config parsing |
284 | * - Maybe only hijack dns if option is set (HIJACK_DNS=1) | ||
285 | */ | ||
156 | 286 | ||
157 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task, | 287 | GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task, |
158 | NULL); | 288 | NULL); |
159 | /** | 289 | /** |
160 | * Do gnunet dns init here | 290 | * Do gnunet dns init here |
161 | * */ | 291 | */ |
162 | dns_handle = GNUNET_DNS_connect(c, | 292 | dns_handle = GNUNET_DNS_connect(c, |
163 | GNUNET_DNS_FLAG_PRE_RESOLUTION, | 293 | GNUNET_DNS_FLAG_PRE_RESOLUTION, |
164 | &handle_dns_request, /* rh */ | 294 | &handle_dns_request, /* rh */ |
165 | NULL); /* Closure */ | 295 | NULL); /* Closure */ |
296 | |||
297 | /** | ||
298 | * handle to our local namestore | ||
299 | */ | ||
300 | namestore_handle = GNUNET_NAMESTORE_connect(c); | ||
301 | |||
166 | GNUNET_SERVER_add_handlers (server, handlers); | 302 | GNUNET_SERVER_add_handlers (server, handlers); |
167 | /** | 303 | /** |
168 | * Esp the lookup would require to keep track of the clients' context | 304 | * Esp the lookup would require to keep track of the clients' context |