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);