Mercurial > pidgin
diff 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 |
line wrap: on
line diff
--- a/src/protocols/rendezvous/mdns.c Sat Apr 10 20:55:58 2004 +0000 +++ b/src/protocols/rendezvous/mdns.c Sun Apr 11 03:27:11 2004 +0000 @@ -135,6 +135,23 @@ /***************************************/ static int +mdns_getlength_RR_txt(void *rdata) +{ + GSList *cur; + ResourceRecordTXTRDataNode *node; + int rdlength = 0; + + for (cur = (GSList *)rdata; cur != NULL; cur = cur->next) { + node = (ResourceRecordTXTRDataNode *)cur->data; + rdlength += 1 + strlen(node->name); + if (node->value != NULL) + rdlength += 1 + strlen(node->value); + } + + return rdlength; +} + +static int mdns_getlength_RR(const ResourceRecord *rr) { int ret = 0; @@ -146,6 +163,10 @@ case RENDEZVOUS_RRTYPE_PTR: ret += strlen((const char *)rr->rdata) + 2; break; + + case RENDEZVOUS_RRTYPE_TXT: + ret += mdns_getlength_RR_txt(rr->rdata); + break; } return ret; @@ -180,12 +201,36 @@ i += util_put16(&data[offset + i], rr->type); i += util_put16(&data[offset + i], rr->class); i += util_put32(&data[offset + i], rr->ttl); - i += util_put16(&data[offset + i], rr->rdlength); switch (rr->type) { case RENDEZVOUS_RRTYPE_PTR: + i += util_put16(&data[offset + i], strlen((const char *)rr->rdata) + 2); i += mdns_put_name(data, datalen, offset + i, (const char *)rr->rdata); break; + + case RENDEZVOUS_RRTYPE_TXT: { + GSList *cur; + ResourceRecordTXTRDataNode *node; + int rdlength = mdns_getlength_RR_txt(rr->rdata); + int mylength; + + i += util_put16(&data[offset + i], rdlength); + for (cur = (GSList *)rr->rdata; cur != NULL; cur = cur->next) { + node = (ResourceRecordTXTRDataNode *)cur->data; + mylength = 1 + strlen(node->name); + if (node->value) + mylength += 1 + strlen(node->value); + i += util_put8(&data[offset + i], mylength - 1); + memcpy(&data[offset + i], node->name, strlen(node->name)); + i += strlen(node->name); + if (node->value) { + data[offset + i] = '='; + i++; + memcpy(&data[offset + i], node->value, strlen(node->value)); + i += strlen(node->value); + } + } + } break; } return i; @@ -314,7 +359,7 @@ dns->answers[0].type = RENDEZVOUS_RRTYPE_PTR; dns->answers[0].class = 0x0001; dns->answers[0].ttl = 0x00001c20; - dns->answers[0].rdlength = strlen(domain) + 2; + dns->answers[0].rdlength = 0x0000; /* Set automatically */ dns->answers[0].rdata = (void *)g_strdup(domain); dns->authority = NULL; @@ -327,6 +372,46 @@ return ret; } +int +mdns_advertise_txt(int fd, const char *name, const GSList *rdata) +{ + int ret; + DNSPacket *dns; + + if ((strlen(name) > 255)) { + return -EINVAL; + } + + dns = (DNSPacket *)g_malloc(sizeof(DNSPacket)); + dns->header.id = 0x0000; + dns->header.flags = 0x8400; + dns->header.numquestions = 0x0000; + dns->header.numanswers = 0x0001; + dns->header.numauthority = 0x0000; + dns->header.numadditional = 0x0000; + dns->questions = NULL; + + dns->answers = (ResourceRecord *)g_malloc(1 * sizeof(ResourceRecord)); + dns->answers[0].name = g_strdup(name); + dns->answers[0].type = RENDEZVOUS_RRTYPE_TXT; + dns->answers[0].class = 0x0001; + dns->answers[0].ttl = 0x00001c20; + dns->answers[0].rdlength = 0x0000; /* Set automatically */ + dns->answers[0].rdata = (void *)rdata; + + dns->authority = NULL; + dns->additional = NULL; + + mdns_send_dns(fd, dns); + + /* The hash table should be freed by the caller of this function */ + dns->answers[0].rdata = NULL; + + mdns_free(dns); + + return ret; +} + /***************************************/ /* Functions for parsing mDNS messages */ /***************************************/