Mercurial > pidgin
diff src/protocols/rendezvous/mdns.c @ 8834:beb7be215db3
[gaim-migrate @ 9598]
I removed account->ip because it isn't used anywhere and I think it's dumb.
Also added handling for a and aaaa records to rendezvous. Gaim peeps
show up in iChat rendezvous lists now. There are still problems.
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Wed, 28 Apr 2004 00:48:21 +0000 |
| parents | 8212661dc3cc |
| children | 518455386538 |
line wrap: on
line diff
--- a/src/protocols/rendezvous/mdns.c Tue Apr 27 23:17:12 2004 +0000 +++ b/src/protocols/rendezvous/mdns.c Wed Apr 28 00:48:21 2004 +0000 @@ -89,8 +89,10 @@ return; switch (type) { + case RENDEZVOUS_RRTYPE_A: case RENDEZVOUS_RRTYPE_NULL: case RENDEZVOUS_RRTYPE_PTR: + case RENDEZVOUS_RRTYPE_AAAA: g_free(rdata); break; @@ -237,18 +239,26 @@ return NULL; switch (type) { + case RENDEZVOUS_RRTYPE_A: + ret = g_memdup(rdata, rdlength); + break; + case RENDEZVOUS_RRTYPE_NULL: ret = g_memdup(rdata, rdlength); break; case RENDEZVOUS_RRTYPE_PTR: - ret = g_memdup(rdata, rdlength); + ret = g_strdup(rdata); break; case RENDEZVOUS_RRTYPE_TXT: ret = mdns_copy_rr_rdata_txt(rdata); break; + case RENDEZVOUS_RRTYPE_AAAA: + ret = g_memdup(rdata, rdlength); + break; + case RENDEZVOUS_RRTYPE_SRV: ret = mdns_copy_rr_rdata_srv(rdata); break; @@ -319,7 +329,7 @@ /******************************************/ int -mdns_establish_socket() +mdns_socket_establish() { int fd = -1; struct sockaddr_in addr; @@ -381,6 +391,15 @@ return fd; } +void +mdns_socket_close(int fd) +{ + if (fd >= 0) + close(fd); + + mdns_cache_remove_all(); +} + /** * Multicast raw data over a file descriptor. * @@ -457,6 +476,10 @@ int rdlength = 0; switch (type) { + case RENDEZVOUS_RRTYPE_A: + rdlength = 4; + break; + case RENDEZVOUS_RRTYPE_PTR: rdlength = mdns_getlength_name(rdata); break; @@ -473,6 +496,10 @@ } } break; + case RENDEZVOUS_RRTYPE_AAAA: + rdlength = 16; + break; + case RENDEZVOUS_RRTYPE_SRV: rdlength = 6 + mdns_getlength_name(((const ResourceRecordRDataSRV *)rdata)->target); break; @@ -580,6 +607,11 @@ i += util_put16(&data[offset + i], rr->rdlength); switch (rr->type) { + case RENDEZVOUS_RRTYPE_A: + memcpy(&data[offset + i], rr->rdata, rr->rdlength); + i += rr->rdlength; + break; + case RENDEZVOUS_RRTYPE_NULL: memcpy(&data[offset + i], rr->rdata, rr->rdlength); i += rr->rdlength; @@ -611,6 +643,11 @@ } } break; + case RENDEZVOUS_RRTYPE_AAAA: + memcpy(&data[offset + i], rr->rdata, rr->rdlength); + i += rr->rdlength; + break; + case RENDEZVOUS_RRTYPE_SRV: { ResourceRecordRDataSRV *srv = rr->rdata; i += util_put16(&data[offset + i], 0); @@ -735,6 +772,37 @@ } int +mdns_advertise_a(int fd, const char *name, unsigned char *ip) +{ + int ret; + ResourceRecord *rr; + ResourceRecordRDataA *rdata; + int i; + + if ((name == NULL) || (strlen(name) > 255)) { + return -EINVAL; + } + + rdata = g_malloc(4); + for (i = 0; i < 4; i++) + util_put8(&rdata[i], ip[i]); + + rr = (ResourceRecord *)g_malloc(sizeof(ResourceRecord)); + rr->name = g_strdup(name); + rr->type = RENDEZVOUS_RRTYPE_A; + rr->class = 0x0001; + rr->ttl = 0x000000f0; + rr->rdlength = 4; + rr->rdata = mdns_copy_rr_rdata(rr->type, rdata, rr->rdlength); + + ret = mdns_send_rr(fd, rr); + + mdns_free_rr(rr); + + return ret; +} + +int mdns_advertise_null(int fd, const char *name, const char *rdata, unsigned short rdlength) { int ret; @@ -810,6 +878,37 @@ } int +mdns_advertise_aaaa(int fd, const char *name, unsigned char *ip) +{ + int ret; + ResourceRecord *rr; + ResourceRecordRDataA *rdata; + int i; + + if ((name == NULL) || (strlen(name) > 255)) { + return -EINVAL; + } + + rdata = g_malloc(16); + for (i = 0; i < 16; i++) + util_put8(&rdata[i], ip[i]); + + rr = (ResourceRecord *)g_malloc(sizeof(ResourceRecord)); + rr->name = g_strdup(name); + rr->type = RENDEZVOUS_RRTYPE_A; + rr->class = 0x0001; + rr->ttl = 0x000000f0; + rr->rdlength = 16; + rr->rdata = mdns_copy_rr_rdata(rr->type, rdata, rr->rdlength); + + ret = mdns_send_rr(fd, rr); + + mdns_free_rr(rr); + + return ret; +} + +int mdns_advertise_srv(int fd, const char *name, unsigned short port, const char *target) { int ret; @@ -1194,7 +1293,14 @@ *offset += 2; /* RDATA */ - if (rr->type == RENDEZVOUS_RRTYPE_NULL) { + if (rr->type == RENDEZVOUS_RRTYPE_A) { + rr->rdata = mdns_read_rr_rdata_null(data, datalen, *offset, rr->rdlength); + if (rr->rdata == NULL) { + mdns_free_rr(rr); + return NULL; + } + + } else if (rr->type == RENDEZVOUS_RRTYPE_NULL) { rr->rdata = mdns_read_rr_rdata_null(data, datalen, *offset, rr->rdlength); if (rr->rdata == NULL) { mdns_free_rr(rr); @@ -1215,6 +1321,13 @@ return NULL; } + } else if (rr->type == RENDEZVOUS_RRTYPE_AAAA) { + rr->rdata = mdns_read_rr_rdata_null(data, datalen, *offset, rr->rdlength); + if (rr->rdata == NULL) { + mdns_free_rr(rr); + return NULL; + } + } else if (rr->type == RENDEZVOUS_RRTYPE_SRV) { rr->rdata = mdns_read_rr_rdata_srv(data, datalen, *offset, rr->rdlength); if (rr->rdata == NULL) { @@ -1298,11 +1411,6 @@ /* For the flags, some bits must be 0 and some must be 1, the rest are ignored */ dns->header.flags = util_get16(&data[offset]); /* Flags (QR, OPCODE, AA, TC, RD, RA, Z, AD, CD, and RCODE */ offset += 2; - if ((dns->header.flags & 0x8000) == 0) { - /* QR should be 1 */ - g_free(dns); - return NULL; - } if ((dns->header.flags & 0x7800) != 0) { /* OPCODE should be all 0's */ g_free(dns);
