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 */
 /***************************************/