Mercurial > pidgin
comparison src/protocols/rendezvous/mdns.c @ 8629:fdff0f31002d
[gaim-migrate @ 9381]
Rendezvous updates: Advertise txt stuff for Gaim; just a step
toward having Gaim users show up in iChat rendezvous buddy
lists. Also a fix to make away people show up as away and
available people to not show up as away.
No one should be using this yet.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 11 Apr 2004 03:27:11 +0000 |
parents | 219e9638e8f3 |
children | 7b8f2818f38a |
comparison
equal
deleted
inserted
replaced
8628:54baaec95c05 | 8629:fdff0f31002d |
---|---|
133 /***************************************/ | 133 /***************************************/ |
134 /* Functions for sending mDNS messages */ | 134 /* Functions for sending mDNS messages */ |
135 /***************************************/ | 135 /***************************************/ |
136 | 136 |
137 static int | 137 static int |
138 mdns_getlength_RR_txt(void *rdata) | |
139 { | |
140 GSList *cur; | |
141 ResourceRecordTXTRDataNode *node; | |
142 int rdlength = 0; | |
143 | |
144 for (cur = (GSList *)rdata; cur != NULL; cur = cur->next) { | |
145 node = (ResourceRecordTXTRDataNode *)cur->data; | |
146 rdlength += 1 + strlen(node->name); | |
147 if (node->value != NULL) | |
148 rdlength += 1 + strlen(node->value); | |
149 } | |
150 | |
151 return rdlength; | |
152 } | |
153 | |
154 static int | |
138 mdns_getlength_RR(const ResourceRecord *rr) | 155 mdns_getlength_RR(const ResourceRecord *rr) |
139 { | 156 { |
140 int ret = 0; | 157 int ret = 0; |
141 | 158 |
142 ret += strlen(rr->name) + 2; | 159 ret += strlen(rr->name) + 2; |
143 ret += 10; | 160 ret += 10; |
144 | 161 |
145 switch (rr->type) { | 162 switch (rr->type) { |
146 case RENDEZVOUS_RRTYPE_PTR: | 163 case RENDEZVOUS_RRTYPE_PTR: |
147 ret += strlen((const char *)rr->rdata) + 2; | 164 ret += strlen((const char *)rr->rdata) + 2; |
165 break; | |
166 | |
167 case RENDEZVOUS_RRTYPE_TXT: | |
168 ret += mdns_getlength_RR_txt(rr->rdata); | |
148 break; | 169 break; |
149 } | 170 } |
150 | 171 |
151 return ret; | 172 return ret; |
152 } | 173 } |
178 | 199 |
179 i += mdns_put_name(data, datalen, offset + i, rr->name); | 200 i += mdns_put_name(data, datalen, offset + i, rr->name); |
180 i += util_put16(&data[offset + i], rr->type); | 201 i += util_put16(&data[offset + i], rr->type); |
181 i += util_put16(&data[offset + i], rr->class); | 202 i += util_put16(&data[offset + i], rr->class); |
182 i += util_put32(&data[offset + i], rr->ttl); | 203 i += util_put32(&data[offset + i], rr->ttl); |
183 i += util_put16(&data[offset + i], rr->rdlength); | |
184 | 204 |
185 switch (rr->type) { | 205 switch (rr->type) { |
186 case RENDEZVOUS_RRTYPE_PTR: | 206 case RENDEZVOUS_RRTYPE_PTR: |
207 i += util_put16(&data[offset + i], strlen((const char *)rr->rdata) + 2); | |
187 i += mdns_put_name(data, datalen, offset + i, (const char *)rr->rdata); | 208 i += mdns_put_name(data, datalen, offset + i, (const char *)rr->rdata); |
188 break; | 209 break; |
210 | |
211 case RENDEZVOUS_RRTYPE_TXT: { | |
212 GSList *cur; | |
213 ResourceRecordTXTRDataNode *node; | |
214 int rdlength = mdns_getlength_RR_txt(rr->rdata); | |
215 int mylength; | |
216 | |
217 i += util_put16(&data[offset + i], rdlength); | |
218 for (cur = (GSList *)rr->rdata; cur != NULL; cur = cur->next) { | |
219 node = (ResourceRecordTXTRDataNode *)cur->data; | |
220 mylength = 1 + strlen(node->name); | |
221 if (node->value) | |
222 mylength += 1 + strlen(node->value); | |
223 i += util_put8(&data[offset + i], mylength - 1); | |
224 memcpy(&data[offset + i], node->name, strlen(node->name)); | |
225 i += strlen(node->name); | |
226 if (node->value) { | |
227 data[offset + i] = '='; | |
228 i++; | |
229 memcpy(&data[offset + i], node->value, strlen(node->value)); | |
230 i += strlen(node->value); | |
231 } | |
232 } | |
233 } break; | |
189 } | 234 } |
190 | 235 |
191 return i; | 236 return i; |
192 } | 237 } |
193 | 238 |
312 dns->answers = (ResourceRecord *)g_malloc(1 * sizeof(ResourceRecord)); | 357 dns->answers = (ResourceRecord *)g_malloc(1 * sizeof(ResourceRecord)); |
313 dns->answers[0].name = g_strdup(name); | 358 dns->answers[0].name = g_strdup(name); |
314 dns->answers[0].type = RENDEZVOUS_RRTYPE_PTR; | 359 dns->answers[0].type = RENDEZVOUS_RRTYPE_PTR; |
315 dns->answers[0].class = 0x0001; | 360 dns->answers[0].class = 0x0001; |
316 dns->answers[0].ttl = 0x00001c20; | 361 dns->answers[0].ttl = 0x00001c20; |
317 dns->answers[0].rdlength = strlen(domain) + 2; | 362 dns->answers[0].rdlength = 0x0000; /* Set automatically */ |
318 dns->answers[0].rdata = (void *)g_strdup(domain); | 363 dns->answers[0].rdata = (void *)g_strdup(domain); |
319 | 364 |
320 dns->authority = NULL; | 365 dns->authority = NULL; |
321 dns->additional = NULL; | 366 dns->additional = NULL; |
322 | 367 |
323 mdns_send_dns(fd, dns); | 368 mdns_send_dns(fd, dns); |
369 | |
370 mdns_free(dns); | |
371 | |
372 return ret; | |
373 } | |
374 | |
375 int | |
376 mdns_advertise_txt(int fd, const char *name, const GSList *rdata) | |
377 { | |
378 int ret; | |
379 DNSPacket *dns; | |
380 | |
381 if ((strlen(name) > 255)) { | |
382 return -EINVAL; | |
383 } | |
384 | |
385 dns = (DNSPacket *)g_malloc(sizeof(DNSPacket)); | |
386 dns->header.id = 0x0000; | |
387 dns->header.flags = 0x8400; | |
388 dns->header.numquestions = 0x0000; | |
389 dns->header.numanswers = 0x0001; | |
390 dns->header.numauthority = 0x0000; | |
391 dns->header.numadditional = 0x0000; | |
392 dns->questions = NULL; | |
393 | |
394 dns->answers = (ResourceRecord *)g_malloc(1 * sizeof(ResourceRecord)); | |
395 dns->answers[0].name = g_strdup(name); | |
396 dns->answers[0].type = RENDEZVOUS_RRTYPE_TXT; | |
397 dns->answers[0].class = 0x0001; | |
398 dns->answers[0].ttl = 0x00001c20; | |
399 dns->answers[0].rdlength = 0x0000; /* Set automatically */ | |
400 dns->answers[0].rdata = (void *)rdata; | |
401 | |
402 dns->authority = NULL; | |
403 dns->additional = NULL; | |
404 | |
405 mdns_send_dns(fd, dns); | |
406 | |
407 /* The hash table should be freed by the caller of this function */ | |
408 dns->answers[0].rdata = NULL; | |
324 | 409 |
325 mdns_free(dns); | 410 mdns_free(dns); |
326 | 411 |
327 return ret; | 412 return ret; |
328 } | 413 } |