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 } |
