Mon, 12 Apr 2004 01:17:10 +0000
[gaim-migrate @ 9388]
I finished all my overflow checking and what not. If anyone else
wants to look over it feel free... Null resource records (buddy
icons) should be getting sent now, too. I'm not really sure why
I'm not showing up in my iChat buddy list. Gaim rendezvous people
show up in gaim rendezvous buddy lists, I think.
Eh, I still have to deal with caching and handling queries.
And then messaging.
| 8487 | 1 | /** |
| 2 | * @file mdns.c Multicast DNS connection code used by rendezvous. | |
| 3 | * | |
| 4 | * gaim | |
| 5 | * | |
| 6 | * Gaim is the legal property of its developers, whose names are too numerous | |
| 7 | * to list here. Please refer to the COPYRIGHT file distributed with this | |
| 8 | * source distribution. | |
| 9 | * | |
| 10 | * This program is free software; you can redistribute it and/or modify | |
| 11 | * it under the terms of the GNU General Public License as published by | |
| 12 | * the Free Software Foundation; either version 2 of the License, or | |
| 13 | * (at your option) any later version. | |
| 14 | * | |
| 15 | * This program is distributed in the hope that it will be useful, | |
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 18 | * GNU General Public License for more details. | |
| 19 | * | |
| 20 | * You should have received a copy of the GNU General Public License | |
| 21 | * along with this program; if not, write to the Free Software | |
| 22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| 23 | * | |
| 24 | */ | |
| 25 | ||
| 26 | /* | |
| 27 | * If you want to understand this, read RFC1035 and | |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
28 | * draft-cheshire-dnsext-multicastdns.txt, and buy |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
29 | * me a doughnut. thx k bye. |
| 8487 | 30 | */ |
| 31 | ||
| 32 | /* | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
33 | * XXX - This entire file could use another pair of eyes to audit for |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
34 | * any possible buffer overflow exploits. |
| 8487 | 35 | */ |
| 36 | ||
|
8546
59e40a3b08bf
[gaim-migrate @ 9288]
Mark Doliner <markdoliner@pidgin.im>
parents:
8487
diff
changeset
|
37 | #include "internal.h" |
| 8487 | 38 | #include "debug.h" |
| 39 | ||
| 40 | #include "mdns.h" | |
| 41 | #include "util.h" | |
| 42 | ||
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
43 | /******************************************/ |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
44 | /* Functions for freeing a DNS structure */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
45 | /******************************************/ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
46 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
47 | /** |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
48 | * Free the rdata associated with a given resource record. |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
49 | */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
50 | static void |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
51 | mdns_free_rr_rdata(unsigned short type, void *rdata) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
52 | { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
53 | if (rdata == NULL) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
54 | return; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
55 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
56 | switch (type) { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
57 | case RENDEZVOUS_RRTYPE_NULL: |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
58 | case RENDEZVOUS_RRTYPE_PTR: |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
59 | g_free(rdata); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
60 | break; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
61 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
62 | case RENDEZVOUS_RRTYPE_TXT: |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
63 | g_hash_table_destroy(rdata); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
64 | break; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
65 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
66 | case RENDEZVOUS_RRTYPE_SRV: |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
67 | g_free(((ResourceRecordRDataSRV *)rdata)->target); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
68 | g_free(rdata); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
69 | break; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
70 | } |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
71 | } |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
72 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
73 | /** |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
74 | * Free a given question |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
75 | */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
76 | static void |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
77 | mdns_free_q(Question *q) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
78 | { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
79 | g_free(q->name); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
80 | } |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
81 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
82 | /** |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
83 | * Free a given resource record. |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
84 | */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
85 | static void |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
86 | mdns_free_rr(ResourceRecord *rr) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
87 | { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
88 | g_free(rr->name); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
89 | mdns_free_rr_rdata(rr->type, rr->rdata); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
90 | } |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
91 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
92 | void |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
93 | mdns_free(DNSPacket *dns) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
94 | { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
95 | int i; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
96 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
97 | for (i = 0; i < dns->header.numquestions; i++) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
98 | mdns_free_q(&dns->questions[i]); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
99 | for (i = 0; i < dns->header.numanswers; i++) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
100 | mdns_free_rr(&dns->answers[i]); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
101 | for (i = 0; i < dns->header.numauthority; i++) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
102 | mdns_free_rr(&dns->authority[i]); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
103 | for (i = 0; i < dns->header.numadditional; i++) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
104 | mdns_free_rr(&dns->additional[i]); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
105 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
106 | g_free(dns->questions); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
107 | g_free(dns->answers); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
108 | g_free(dns->authority); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
109 | g_free(dns->additional); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
110 | g_free(dns); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
111 | } |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
112 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
113 | /******************************************/ |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
114 | /* Functions for connection establishment */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
115 | /******************************************/ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
116 | |
| 8487 | 117 | int |
| 118 | mdns_establish_socket() | |
| 119 | { | |
| 120 | int fd = -1; | |
| 121 | struct sockaddr_in addr; | |
| 122 | struct ip_mreq mreq; | |
| 123 | unsigned char loop; | |
| 124 | unsigned char ttl; | |
| 125 | int reuseaddr; | |
| 126 | ||
| 127 | gaim_debug_info("mdns", "Establishing multicast socket\n"); | |
| 128 | ||
| 129 | /* What's the difference between AF_INET and PF_INET? */ | |
| 130 | if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { | |
| 131 | gaim_debug_error("mdns", "Unable to create socket: %s\n", strerror(errno)); | |
| 132 | return -1; | |
| 133 | } | |
| 134 | ||
| 135 | /* Make the socket non-blocking (although it shouldn't matter) */ | |
| 136 | fcntl(fd, F_SETFL, O_NONBLOCK); | |
| 137 | ||
| 138 | /* Bind the socket to a local IP and port */ | |
| 139 | addr.sin_family = AF_INET; | |
| 140 | addr.sin_port = htons(5353); | |
| 141 | addr.sin_addr.s_addr = INADDR_ANY; | |
| 142 | if (bind(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { | |
| 143 | gaim_debug_error("mdns", "Unable to bind socket to interface.\n"); | |
| 144 | close(fd); | |
| 145 | return -1; | |
| 146 | } | |
| 147 | ||
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
148 | /* Ensure loopback is enabled (it should be enabled by default, but let's be sure) */ |
| 8487 | 149 | loop = 1; |
| 150 | if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(unsigned char)) == -1) { | |
| 151 | gaim_debug_error("mdns", "Error calling setsockopt for IP_MULTICAST_LOOP\n"); | |
| 152 | } | |
| 153 | ||
| 154 | /* Set TTL to 255--required by mDNS */ | |
| 155 | ttl = 255; | |
| 156 | if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(unsigned char)) == -1) { | |
| 157 | gaim_debug_error("mdns", "Error calling setsockopt for IP_MULTICAST_TTL\n"); | |
| 158 | close(fd); | |
| 159 | return -1; | |
| 160 | } | |
| 161 | ||
| 162 | /* Join the .local multicast group */ | |
| 163 | mreq.imr_multiaddr.s_addr = inet_addr("224.0.0.251"); | |
| 164 | mreq.imr_interface.s_addr = htonl(INADDR_ANY); | |
| 165 | if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(struct ip_mreq)) == -1) { | |
| 166 | gaim_debug_error("mdns", "Error calling setsockopt for IP_ADD_MEMBERSHIP\n"); | |
| 167 | close(fd); | |
| 168 | return -1; | |
| 169 | } | |
| 170 | ||
| 171 | /* Make the local IP re-usable */ | |
| 172 | reuseaddr = 1; | |
| 173 | if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(int)) == -1) { | |
| 174 | gaim_debug_error("mdns", "Error calling setsockopt for SO_REUSEADDR: %s\n", strerror(errno)); | |
| 175 | } | |
| 176 | ||
| 177 | return fd; | |
| 178 | } | |
| 179 | ||
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
180 | /** |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
181 | * Multicast raw data over a file descriptor. |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
182 | * |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
183 | * @param fd A file descriptor that is a socket bound to a UDP port. |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
184 | * @param datalen The length of the data you wish to send. |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
185 | * @param data The data you wish to send. |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
186 | * @return 0 on success, otherwise return -1. |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
187 | */ |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
188 | static int |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
189 | mdns_send_raw(int fd, unsigned int datalen, unsigned char *data) |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
190 | { |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
191 | struct sockaddr_in addr; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
192 | int n; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
193 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
194 | addr.sin_family = AF_INET; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
195 | addr.sin_port = htons(5353); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
196 | addr.sin_addr.s_addr = inet_addr("224.0.0.251"); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
197 | n = sendto(fd, data, datalen, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
198 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
199 | if (n == -1) { |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
200 | gaim_debug_error("mdns", "Error sending packet: %d\n", errno); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
201 | return -1; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
202 | } else if (n != datalen) { |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
203 | gaim_debug_error("mdns", "Only sent %d of %d bytes of data.\n", n, datalen); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
204 | return -1; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
205 | } |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
206 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
207 | return 0; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
208 | } |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
209 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
210 | /***************************************/ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
211 | /* Functions for sending mDNS messages */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
212 | /***************************************/ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
213 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
214 | static int |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
215 | mdns_getlength_name(const void *name) |
|
8629
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
216 | { |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
217 | return strlen((const char *)name) + 2; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
218 | } |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
219 | |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
220 | static int |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
221 | mdns_getlength_RR_rdata(unsigned short type, const void *rdata) |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
222 | { |
|
8629
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
223 | int rdlength = 0; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
224 | |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
225 | switch (type) { |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
226 | case RENDEZVOUS_RRTYPE_PTR: |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
227 | rdlength = mdns_getlength_name(rdata); |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
228 | break; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
229 | |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
230 | case RENDEZVOUS_RRTYPE_TXT: { |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
231 | GSList *cur; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
232 | ResourceRecordRDataTXTNode *node; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
233 | |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
234 | for (cur = (GSList *)rdata; cur != NULL; cur = cur->next) { |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
235 | node = (ResourceRecordRDataTXTNode *)cur->data; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
236 | rdlength += 1 + strlen(node->name); |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
237 | if (node->value != NULL) |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
238 | rdlength += 1 + strlen(node->value); |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
239 | } |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
240 | } break; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
241 | |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
242 | case RENDEZVOUS_RRTYPE_SRV: |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
243 | rdlength = 6 + mdns_getlength_name(((const ResourceRecordRDataSRV *)rdata)->target); |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
244 | break; |
|
8629
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
245 | } |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
246 | |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
247 | return rdlength; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
248 | } |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
249 | |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
250 | static int |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
251 | mdns_getlength_RR(ResourceRecord *rr) |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
252 | { |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
253 | return mdns_getlength_name(rr->name) + 10 + rr->rdlength; |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
254 | } |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
255 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
256 | static int |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
257 | mdns_put_name(char *data, unsigned int datalen, unsigned int offset, const char *name) |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
258 | { |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
259 | int i = 0; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
260 | char *b, *c; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
261 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
262 | b = (char *)name; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
263 | while ((c = strchr(b, '.'))) { |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
264 | i += util_put8(&data[offset + i], c - b); /* Length of domain-name segment */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
265 | memcpy(&data[offset + i], b, c - b); /* Domain-name segment */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
266 | i += c - b; /* Increment the destination pointer */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
267 | b = c + 1; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
268 | } |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
269 | i += util_put8(&data[offset + i], strlen(b)); /* Length of domain-name segment */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
270 | strcpy(&data[offset + i], b); /* Domain-name segment */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
271 | i += strlen(b) + 1; /* Increment the destination pointer */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
272 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
273 | return i; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
274 | } |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
275 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
276 | static int |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
277 | mdns_put_RR(char *data, unsigned int datalen, unsigned int offset, const ResourceRecord *rr) |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
278 | { |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
279 | int i = 0; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
280 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
281 | i += mdns_put_name(data, datalen, offset + i, rr->name); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
282 | i += util_put16(&data[offset + i], rr->type); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
283 | i += util_put16(&data[offset + i], rr->class); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
284 | i += util_put32(&data[offset + i], rr->ttl); |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
285 | i += util_put16(&data[offset + i], rr->rdlength); |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
286 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
287 | switch (rr->type) { |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
288 | case RENDEZVOUS_RRTYPE_NULL: |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
289 | memcpy(&data[offset + i], rr->rdata, rr->rdlength); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
290 | i += rr->rdlength; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
291 | break; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
292 | |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
293 | case RENDEZVOUS_RRTYPE_PTR: |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
294 | i += mdns_put_name(data, datalen, offset + i, (const char *)rr->rdata); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
295 | break; |
|
8629
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
296 | |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
297 | case RENDEZVOUS_RRTYPE_TXT: { |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
298 | GSList *cur; |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
299 | ResourceRecordRDataTXTNode *node; |
|
8629
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
300 | int mylength; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
301 | |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
302 | for (cur = (GSList *)rr->rdata; cur != NULL; cur = cur->next) { |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
303 | node = (ResourceRecordRDataTXTNode *)cur->data; |
|
8629
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
304 | mylength = 1 + strlen(node->name); |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
305 | if (node->value) |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
306 | mylength += 1 + strlen(node->value); |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
307 | i += util_put8(&data[offset + i], mylength - 1); |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
308 | memcpy(&data[offset + i], node->name, strlen(node->name)); |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
309 | i += strlen(node->name); |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
310 | if (node->value) { |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
311 | data[offset + i] = '='; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
312 | i++; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
313 | memcpy(&data[offset + i], node->value, strlen(node->value)); |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
314 | i += strlen(node->value); |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
315 | } |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
316 | } |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
317 | } break; |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
318 | |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
319 | case RENDEZVOUS_RRTYPE_SRV: { |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
320 | ResourceRecordRDataSRV *srv = rr->rdata; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
321 | i += util_put16(&data[offset + i], 0); |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
322 | i += util_put16(&data[offset + i], 0); |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
323 | i += util_put16(&data[offset + i], srv->port); |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
324 | i += mdns_put_name(data, datalen, offset + i, srv->target); |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
325 | } break; |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
326 | } |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
327 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
328 | return i; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
329 | } |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
330 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
331 | int |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
332 | mdns_send_dns(int fd, const DNSPacket *dns) |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
333 | { |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
334 | int ret; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
335 | unsigned int datalen; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
336 | unsigned char *data; |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
337 | unsigned int offset; |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
338 | int i; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
339 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
340 | /* Calculate the length of the buffer we'll need to hold the DNS packet */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
341 | datalen = 0; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
342 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
343 | /* Header */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
344 | datalen += 12; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
345 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
346 | /* Questions */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
347 | for (i = 0; i < dns->header.numquestions; i++) |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
348 | datalen += mdns_getlength_name(dns->questions[i].name) + 4; |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
349 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
350 | /* Resource records */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
351 | for (i = 0; i < dns->header.numanswers; i++) |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
352 | datalen += mdns_getlength_RR(&dns->answers[i]); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
353 | for (i = 0; i < dns->header.numauthority; i++) |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
354 | datalen += mdns_getlength_RR(&dns->authority[i]); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
355 | for (i = 0; i < dns->header.numadditional; i++) |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
356 | datalen += mdns_getlength_RR(&dns->additional[i]); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
357 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
358 | /* Allocate a buffer */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
359 | if (!(data = (unsigned char *)g_malloc(datalen))) { |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
360 | return -ENOMEM; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
361 | } |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
362 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
363 | /* Construct the datagram */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
364 | /* Header */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
365 | offset = 0; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
366 | offset += util_put16(&data[offset], dns->header.id); /* ID */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
367 | offset += util_put16(&data[offset], dns->header.flags); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
368 | offset += util_put16(&data[offset], dns->header.numquestions); /* QDCOUNT */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
369 | offset += util_put16(&data[offset], dns->header.numanswers); /* ANCOUNT */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
370 | offset += util_put16(&data[offset], dns->header.numauthority); /* NSCOUNT */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
371 | offset += util_put16(&data[offset], dns->header.numadditional); /* ARCOUNT */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
372 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
373 | /* Questions */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
374 | for (i = 0; i < dns->header.numquestions; i++) { |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
375 | offset += mdns_put_name(data, datalen, offset, dns->questions[i].name); /* QNAME */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
376 | offset += util_put16(&data[offset], dns->questions[i].type); /* QTYPE */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
377 | offset += util_put16(&data[offset], dns->questions[i].class); /* QCLASS */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
378 | } |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
379 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
380 | /* Resource records */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
381 | for (i = 0; i < dns->header.numanswers; i++) |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
382 | offset += mdns_put_RR(data, datalen, offset, &dns->answers[i]); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
383 | for (i = 0; i < dns->header.numauthority; i++) |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
384 | offset += mdns_put_RR(data, datalen, offset, &dns->authority[i]); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
385 | for (i = 0; i < dns->header.numadditional; i++) |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
386 | offset += mdns_put_RR(data, datalen, offset, &dns->additional[i]); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
387 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
388 | /* Send the datagram */ |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
389 | /* Offset can be shorter than datalen because of name compression */ |
|
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
390 | ret = mdns_send_raw(fd, offset, data); |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
391 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
392 | g_free(data); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
393 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
394 | return ret; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
395 | } |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
396 | |
| 8487 | 397 | int |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
398 | mdns_query(int fd, const char *domain, unsigned short type) |
| 8487 | 399 | { |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
400 | int ret; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
401 | DNSPacket *dns; |
| 8487 | 402 | |
| 403 | if (strlen(domain) > 255) { | |
| 404 | return -EINVAL; | |
| 405 | } | |
| 406 | ||
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
407 | dns = (DNSPacket *)g_malloc(sizeof(DNSPacket)); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
408 | dns->header.id = 0x0000; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
409 | dns->header.flags = 0x0000; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
410 | dns->header.numquestions = 0x0001; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
411 | dns->header.numanswers = 0x0000; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
412 | dns->header.numauthority = 0x0000; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
413 | dns->header.numadditional = 0x0000; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
414 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
415 | dns->questions = (Question *)g_malloc(1 * sizeof(Question)); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
416 | dns->questions[0].name = g_strdup(domain); |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
417 | dns->questions[0].type = type; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
418 | dns->questions[0].class = 0x0001; |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
419 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
420 | dns->answers = NULL; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
421 | dns->authority = NULL; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
422 | dns->additional = NULL; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
423 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
424 | mdns_send_dns(fd, dns); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
425 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
426 | mdns_free(dns); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
427 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
428 | return ret; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
429 | } |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
430 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
431 | int |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
432 | mdns_advertise_null(int fd, const char *name, const char *rdata, unsigned short rdlength) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
433 | { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
434 | int ret; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
435 | DNSPacket *dns; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
436 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
437 | if ((strlen(name) > 255)) { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
438 | return -EINVAL; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
439 | } |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
440 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
441 | dns = (DNSPacket *)g_malloc(sizeof(DNSPacket)); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
442 | dns->header.id = 0x0000; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
443 | dns->header.flags = 0x8400; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
444 | dns->header.numquestions = 0x0000; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
445 | dns->header.numanswers = 0x0001; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
446 | dns->header.numauthority = 0x0000; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
447 | dns->header.numadditional = 0x0000; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
448 | dns->questions = NULL; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
449 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
450 | dns->answers = (ResourceRecord *)g_malloc(1 * sizeof(ResourceRecord)); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
451 | dns->answers[0].name = g_strdup(name); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
452 | dns->answers[0].type = RENDEZVOUS_RRTYPE_NULL; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
453 | dns->answers[0].class = 0x0001; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
454 | dns->answers[0].ttl = 0x00001c20; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
455 | dns->answers[0].rdlength = rdlength; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
456 | dns->answers[0].rdata = (void *)rdata; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
457 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
458 | dns->authority = NULL; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
459 | dns->additional = NULL; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
460 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
461 | mdns_send_dns(fd, dns); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
462 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
463 | /* The rdata should be freed by the caller of this function */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
464 | dns->answers[0].rdata = NULL; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
465 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
466 | mdns_free(dns); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
467 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
468 | return ret; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
469 | } |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
470 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
471 | int |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
472 | mdns_advertise_ptr(int fd, const char *name, const char *domain) |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
473 | { |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
474 | int ret; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
475 | DNSPacket *dns; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
476 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
477 | if ((strlen(name) > 255) || (strlen(domain) > 255)) { |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
478 | return -EINVAL; |
| 8487 | 479 | } |
| 480 | ||
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
481 | dns = (DNSPacket *)g_malloc(sizeof(DNSPacket)); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
482 | dns->header.id = 0x0000; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
483 | dns->header.flags = 0x8400; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
484 | dns->header.numquestions = 0x0000; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
485 | dns->header.numanswers = 0x0001; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
486 | dns->header.numauthority = 0x0000; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
487 | dns->header.numadditional = 0x0000; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
488 | dns->questions = NULL; |
| 8487 | 489 | |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
490 | dns->answers = (ResourceRecord *)g_malloc(1 * sizeof(ResourceRecord)); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
491 | dns->answers[0].name = g_strdup(name); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
492 | dns->answers[0].type = RENDEZVOUS_RRTYPE_PTR; |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
493 | dns->answers[0].class = 0x8001; |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
494 | dns->answers[0].ttl = 0x00001c20; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
495 | dns->answers[0].rdata = (void *)g_strdup(domain); |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
496 | dns->answers[0].rdlength = mdns_getlength_RR_rdata(dns->answers[0].type, dns->answers[0].rdata); |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
497 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
498 | dns->authority = NULL; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
499 | dns->additional = NULL; |
| 8487 | 500 | |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
501 | mdns_send_dns(fd, dns); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
502 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
503 | mdns_free(dns); |
| 8487 | 504 | |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
505 | return ret; |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
506 | } |
| 8487 | 507 | |
|
8629
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
508 | int |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
509 | mdns_advertise_txt(int fd, const char *name, const GSList *rdata) |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
510 | { |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
511 | int ret; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
512 | DNSPacket *dns; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
513 | |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
514 | if ((strlen(name) > 255)) { |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
515 | return -EINVAL; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
516 | } |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
517 | |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
518 | dns = (DNSPacket *)g_malloc(sizeof(DNSPacket)); |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
519 | dns->header.id = 0x0000; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
520 | dns->header.flags = 0x8400; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
521 | dns->header.numquestions = 0x0000; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
522 | dns->header.numanswers = 0x0001; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
523 | dns->header.numauthority = 0x0000; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
524 | dns->header.numadditional = 0x0000; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
525 | dns->questions = NULL; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
526 | |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
527 | dns->answers = (ResourceRecord *)g_malloc(1 * sizeof(ResourceRecord)); |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
528 | dns->answers[0].name = g_strdup(name); |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
529 | dns->answers[0].type = RENDEZVOUS_RRTYPE_TXT; |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
530 | dns->answers[0].class = 0x8001; |
|
8629
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
531 | dns->answers[0].ttl = 0x00001c20; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
532 | dns->answers[0].rdata = (void *)rdata; |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
533 | dns->answers[0].rdlength = mdns_getlength_RR_rdata(dns->answers[0].type, dns->answers[0].rdata); |
|
8629
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
534 | |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
535 | dns->authority = NULL; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
536 | dns->additional = NULL; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
537 | |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
538 | mdns_send_dns(fd, dns); |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
539 | |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
540 | /* The rdata should be freed by the caller of this function */ |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
541 | dns->answers[0].rdata = NULL; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
542 | |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
543 | mdns_free(dns); |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
544 | |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
545 | return ret; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
546 | } |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
547 | |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
548 | int |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
549 | mdns_advertise_srv(int fd, const char *name, unsigned short port, const char *target) |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
550 | { |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
551 | int ret; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
552 | DNSPacket *dns; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
553 | ResourceRecordRDataSRV *rdata; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
554 | |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
555 | if ((strlen(target) > 255)) { |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
556 | return -EINVAL; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
557 | } |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
558 | |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
559 | rdata = g_malloc(sizeof(ResourceRecordRDataSRV)); |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
560 | rdata->port = port; |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
561 | rdata->target = g_strdup(target); |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
562 | |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
563 | dns = (DNSPacket *)g_malloc(sizeof(DNSPacket)); |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
564 | dns->header.id = 0x0000; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
565 | dns->header.flags = 0x8400; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
566 | dns->header.numquestions = 0x0000; |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
567 | dns->header.numanswers = 0x0000; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
568 | dns->header.numauthority = 0x0001; |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
569 | dns->header.numadditional = 0x0000; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
570 | dns->questions = NULL; |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
571 | dns->answers = NULL; |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
572 | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
573 | dns->authority = (ResourceRecord *)g_malloc(1 * sizeof(ResourceRecord)); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
574 | dns->authority[0].name = g_strdup(name); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
575 | dns->authority[0].type = RENDEZVOUS_RRTYPE_SRV; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
576 | dns->authority[0].class = 0x8001; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
577 | dns->authority[0].ttl = 0x00001c20; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
578 | dns->authority[0].rdata = rdata; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
579 | dns->authority[0].rdlength = mdns_getlength_RR_rdata(dns->authority[0].type, dns->authority[0].rdata); |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
580 | |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
581 | dns->additional = NULL; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
582 | |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
583 | mdns_send_dns(fd, dns); |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
584 | |
|
8629
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
585 | mdns_free(dns); |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
586 | |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
587 | return ret; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
588 | } |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
589 | |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
590 | /***************************************/ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
591 | /* Functions for parsing mDNS messages */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
592 | /***************************************/ |
| 8487 | 593 | |
| 594 | /* | |
| 595 | * Read in a domain name from the given buffer starting at the given | |
| 596 | * offset. This handles using domain name compression to jump around | |
| 597 | * the data buffer, if needed. | |
| 598 | * | |
| 599 | * @return A null-terminated string representation of the domain name. | |
| 600 | * This should be g_free'd when no longer needed. | |
| 601 | */ | |
| 602 | static gchar * | |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
603 | mdns_read_name(const char *data, int datalen, unsigned int offset) |
| 8487 | 604 | { |
| 605 | GString *ret = g_string_new(""); | |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
606 | unsigned char tmp, newoffset; |
| 8487 | 607 | |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
608 | while ((offset <= datalen) && ((tmp = util_get8(&data[offset])) != 0)) { |
|
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
609 | offset++; |
| 8487 | 610 | |
| 611 | if ((tmp & 0xc0) == 0) { /* First two bits are 00 */ | |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
612 | if (offset + tmp > datalen) |
|
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
613 | /* Attempt to read past end of data! Bailing! */ |
|
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
614 | return g_string_free(ret, TRUE); |
|
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
615 | if (*ret->str != '\0') |
| 8487 | 616 | g_string_append_c(ret, '.'); |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
617 | g_string_append_len(ret, &data[offset], tmp); |
|
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
618 | offset += tmp; |
| 8487 | 619 | |
| 620 | } else if ((tmp & 0x40) == 0) { /* First two bits are 10 */ | |
| 621 | /* Reserved for future use */ | |
| 622 | ||
| 623 | } else if ((tmp & 0x80) == 1) { /* First two bits are 01 */ | |
| 624 | /* Reserved for future use */ | |
| 625 | ||
| 626 | } else { /* First two bits are 11 */ | |
| 627 | /* Jump to another position in the data */ | |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
628 | newoffset = util_get8(&data[offset]); |
|
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
629 | if (newoffset >= offset) |
|
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
630 | /* Invalid pointer! Could lead to infinite recursion! Bailing! */ |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
631 | return g_string_free(ret, TRUE); |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
632 | offset = newoffset; |
| 8487 | 633 | } |
| 634 | } | |
| 635 | ||
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
636 | if (offset > datalen) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
637 | return g_string_free(ret, TRUE); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
638 | |
| 8487 | 639 | return g_string_free(ret, FALSE); |
| 640 | } | |
| 641 | ||
| 642 | /* | |
| 643 | * Determine how many bytes long a portion of the domain name is | |
| 644 | * at the given offset. This does NOT jump around the data array | |
| 645 | * in the case of domain name compression. | |
| 646 | * | |
| 647 | * @return The length of the portion of the domain name. | |
| 648 | */ | |
| 649 | static int | |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
650 | mdns_read_name_len(const char *data, unsigned int datalen, unsigned int offset) |
| 8487 | 651 | { |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
652 | int startoffset = offset; |
| 8487 | 653 | unsigned char tmp; |
| 654 | ||
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
655 | while ((offset <= datalen) && ((tmp = util_get8(&data[offset])) != 0)) { |
|
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
656 | offset++; |
| 8487 | 657 | |
| 658 | if ((tmp & 0xc0) == 0) { /* First two bits are 00 */ | |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
659 | if (offset + tmp > datalen) |
|
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
660 | /* Attempt to read past end of data! Bailing! */ |
|
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
661 | return 0; |
|
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
662 | offset += tmp; |
| 8487 | 663 | |
| 664 | } else if ((tmp & 0x40) == 0) { /* First two bits are 10 */ | |
| 665 | /* Reserved for future use */ | |
| 666 | ||
| 667 | } else if ((tmp & 0x80) == 1) { /* First two bits are 01 */ | |
| 668 | /* Reserved for future use */ | |
| 669 | ||
| 670 | } else { /* First two bits are 11 */ | |
| 671 | /* End of this portion of the domain name */ | |
| 672 | break; | |
| 673 | ||
| 674 | } | |
| 675 | } | |
| 676 | ||
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
677 | return offset - startoffset + 1; |
| 8487 | 678 | } |
| 679 | ||
| 680 | /* | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
681 | * |
| 8487 | 682 | * |
| 683 | */ | |
| 684 | static Question * | |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
685 | mdns_read_questions(int numquestions, const char *data, unsigned int datalen, int *offset) |
| 8487 | 686 | { |
| 687 | Question *ret; | |
| 688 | int i; | |
| 689 | ||
| 690 | ret = (Question *)g_malloc0(numquestions * sizeof(Question)); | |
| 691 | for (i = 0; i < numquestions; i++) { | |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
692 | ret[i].name = mdns_read_name(data, datalen, *offset); |
|
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
693 | *offset += mdns_read_name_len(data, datalen, *offset); |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
694 | if (*offset + 4 > datalen) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
695 | break; |
| 8487 | 696 | ret[i].type = util_get16(&data[*offset]); /* QTYPE */ |
| 697 | *offset += 2; | |
| 698 | ret[i].class = util_get16(&data[*offset]); /* QCLASS */ | |
| 699 | *offset += 2; | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
700 | if (*offset > datalen) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
701 | break; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
702 | } |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
703 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
704 | /* Malformed packet check */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
705 | if (i < numquestions) { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
706 | for (i = 0; i < numquestions; i++) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
707 | g_free(ret[i].name); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
708 | g_free(ret); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
709 | return NULL; |
| 8487 | 710 | } |
| 711 | ||
| 712 | return ret; | |
| 713 | } | |
| 714 | ||
| 715 | /* | |
| 716 | * Read in a chunk of data, probably a buddy icon. | |
| 717 | * | |
| 718 | */ | |
| 719 | static unsigned char * | |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
720 | mdns_read_rr_rdata_null(const char *data, unsigned int datalen, unsigned int offset, unsigned short rdlength) |
| 8487 | 721 | { |
| 722 | unsigned char *ret = NULL; | |
| 723 | ||
| 724 | if (offset + rdlength > datalen) | |
| 725 | return NULL; | |
| 726 | ||
| 727 | ret = (unsigned char *)g_malloc(rdlength); | |
| 728 | memcpy(ret, &data[offset], rdlength); | |
| 729 | ||
| 730 | return ret; | |
| 731 | } | |
| 732 | ||
| 733 | /* | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
734 | * Read in a compressed name. |
| 8487 | 735 | * |
| 736 | */ | |
| 737 | static char * | |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
738 | mdns_read_rr_rdata_ptr(const char *data, unsigned int datalen, unsigned int offset) |
| 8487 | 739 | { |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
740 | return mdns_read_name(data, datalen, offset); |
| 8487 | 741 | } |
| 742 | ||
| 743 | /* | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
744 | * Read in a list of name=value pairs into a GHashTable. |
| 8487 | 745 | * |
| 746 | */ | |
| 747 | static GHashTable * | |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
748 | mdns_read_rr_rdata_txt(const char *data, unsigned int datalen, unsigned int offset, unsigned short rdlength) |
| 8487 | 749 | { |
| 750 | GHashTable *ret = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
| 751 | int endoffset = offset + rdlength; | |
| 752 | unsigned char tmp; | |
| 753 | char buf[256], *key, *value; | |
| 754 | ||
| 755 | while (offset < endoffset) { | |
| 756 | /* Read in the length of the next name/value pair */ | |
| 757 | tmp = util_get8(&data[offset]); | |
| 758 | offset++; | |
| 759 | ||
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
760 | /* Malformed packet check */ |
| 8487 | 761 | if (offset + tmp > endoffset) |
| 762 | break; | |
| 763 | ||
| 764 | /* Read in the next name/value pair */ | |
| 765 | strncpy(buf, &data[offset], tmp); | |
| 766 | offset += tmp; | |
| 767 | ||
| 768 | if (buf[0] == '=') { | |
| 769 | /* Name/value pairs beginning with = are silently ignored */ | |
| 770 | continue; | |
| 771 | } | |
| 772 | ||
| 773 | /* The value is a substring of buf, starting just after the = */ | |
| 774 | buf[tmp] = '\0'; | |
| 775 | value = strchr(buf, '='); | |
| 776 | if (value != NULL) { | |
| 777 | value[0] = '\0'; | |
| 778 | value++; | |
| 779 | } | |
| 780 | ||
| 781 | /* Make the key all lowercase */ | |
| 782 | key = g_utf8_strdown(buf, -1); | |
| 783 | if (!g_hash_table_lookup(ret, key)) | |
| 784 | g_hash_table_insert(ret, key, g_strdup(value)); | |
| 785 | else | |
| 786 | g_free(key); | |
| 787 | } | |
| 788 | ||
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
789 | /* Malformed packet check */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
790 | if ((offset > datalen) || (offset != endoffset)) { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
791 | g_hash_table_destroy(ret); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
792 | return NULL; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
793 | } |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
794 | |
| 8487 | 795 | return ret; |
| 796 | } | |
| 797 | ||
| 798 | /* | |
|
8594
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
799 | * |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
800 | * |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
801 | */ |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
802 | static ResourceRecordSRV * |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
803 | mdns_read_rr_rdata_srv(const char *data, unsigned int datalen, unsigned int offset, unsigned short rdlength) |
|
8594
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
804 | { |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
805 | ResourceRecordSRV *ret = NULL; |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
806 | int endoffset = offset + rdlength; |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
807 | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
808 | /* Malformed packet check */ |
|
8594
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
809 | if (offset + 7 > endoffset) |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
810 | return NULL; |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
811 | |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
812 | ret = g_malloc(sizeof(ResourceRecordSRV)); |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
813 | |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
814 | /* Read in the priority */ |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
815 | ret->priority = util_get16(&data[offset]); |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
816 | offset += 2; |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
817 | |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
818 | /* Read in the weight */ |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
819 | ret->weight = util_get16(&data[offset]); |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
820 | offset += 2; |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
821 | |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
822 | /* Read in the port */ |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
823 | ret->port = util_get16(&data[offset]); |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
824 | offset += 2; |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
825 | |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
826 | /* Read in the target name */ |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
827 | /* |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
828 | * XXX - RFC2782 says it's not supposed to be an alias... |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
829 | * but it was in the packet capture I looked at from iChat. |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
830 | */ |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
831 | ret->target = mdns_read_name(data, datalen, offset); |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
832 | offset += mdns_read_name_len(data, datalen, offset); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
833 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
834 | /* Malformed packet check */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
835 | if ((offset > endoffset) || (ret->target == NULL)) { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
836 | g_free(ret->target); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
837 | g_free(ret); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
838 | return NULL; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
839 | } |
|
8594
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
840 | |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
841 | return ret; |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
842 | } |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
843 | |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
844 | /* |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
845 | * |
| 8487 | 846 | * |
| 847 | */ | |
| 848 | static ResourceRecord * | |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
849 | mdns_read_rr(int numrecords, const char *data, unsigned int datalen, int *offset) |
| 8487 | 850 | { |
| 851 | ResourceRecord *ret; | |
| 852 | int i; | |
| 853 | ||
| 854 | ret = (ResourceRecord *)g_malloc0(numrecords * sizeof(ResourceRecord)); | |
| 855 | for (i = 0; i < numrecords; i++) { | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
856 | /* NAME */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
857 | ret[i].name = mdns_read_name(data, datalen, *offset); |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
858 | *offset += mdns_read_name_len(data, datalen, *offset); |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
859 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
860 | /* Malformed packet check */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
861 | if (*offset + 10 > datalen) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
862 | break; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
863 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
864 | /* TYPE */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
865 | ret[i].type = util_get16(&data[*offset]); |
| 8487 | 866 | *offset += 2; |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
867 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
868 | /* CLASS */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
869 | ret[i].class = util_get16(&data[*offset]); |
| 8487 | 870 | *offset += 2; |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
871 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
872 | /* TTL */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
873 | ret[i].ttl = util_get32(&data[*offset]); |
| 8487 | 874 | *offset += 4; |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
875 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
876 | /* RDLENGTH */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
877 | ret[i].rdlength = util_get16(&data[*offset]); |
| 8487 | 878 | *offset += 2; |
| 879 | ||
| 880 | /* RDATA */ | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
881 | if (ret[i].type == RENDEZVOUS_RRTYPE_NULL) { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
882 | ret[i].rdata = mdns_read_rr_rdata_null(data, datalen, *offset, ret[i].rdlength); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
883 | if (ret[i].rdata == NULL) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
884 | break; |
| 8487 | 885 | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
886 | } else if (ret[i].type == RENDEZVOUS_RRTYPE_PTR) { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
887 | ret[i].rdata = mdns_read_rr_rdata_ptr(data, datalen, *offset); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
888 | if (ret[i].rdata == NULL) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
889 | break; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
890 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
891 | } else if (ret[i].type == RENDEZVOUS_RRTYPE_TXT) { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
892 | ret[i].rdata = mdns_read_rr_rdata_txt(data, datalen, *offset, ret[i].rdlength); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
893 | if (ret[i].rdata == NULL) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
894 | break; |
| 8487 | 895 | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
896 | } else if (ret[i].type == RENDEZVOUS_RRTYPE_SRV) { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
897 | ret[i].rdata = mdns_read_rr_rdata_srv(data, datalen, *offset, ret[i].rdlength); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
898 | if (ret[i].rdata == NULL) |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
899 | break; |
| 8487 | 900 | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
901 | } |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
902 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
903 | /* Malformed packet check */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
904 | *offset += ret[i].rdlength; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
905 | if (*offset > datalen) |
|
8594
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
906 | break; |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
907 | } |
|
8594
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
908 | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
909 | /* Malformed packet check */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
910 | if (i < numrecords) { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
911 | for (i = 0; i < numrecords; i++) { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
912 | g_free(ret[i].name); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
913 | mdns_free_rr_rdata(ret[i].type, ret[i].rdata); |
| 8487 | 914 | } |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
915 | g_free(ret); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
916 | return NULL; |
| 8487 | 917 | } |
| 918 | ||
| 919 | return ret; | |
| 920 | } | |
| 921 | ||
| 922 | /* | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
923 | * |
| 8487 | 924 | * |
| 925 | */ | |
| 926 | DNSPacket * | |
| 927 | mdns_read(int fd) | |
| 928 | { | |
| 929 | DNSPacket *ret = NULL; | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
930 | int offset; /* Current position in datagram */ |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
931 | /* XXX - Find out what to use as a maximum incoming UDP packet size */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
932 | /* char data[512]; */ |
| 8487 | 933 | char data[10096]; |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
934 | unsigned int datalen; |
| 8487 | 935 | struct sockaddr_in addr; |
| 936 | socklen_t addrlen; | |
| 937 | ||
| 938 | /* Read in an mDNS packet */ | |
| 939 | addrlen = sizeof(struct sockaddr_in); | |
| 940 | if ((datalen = recvfrom(fd, data, sizeof(data), 0, (struct sockaddr *)&addr, &addrlen)) == -1) { | |
| 941 | gaim_debug_error("mdns", "Error reading packet: %d\n", errno); | |
| 942 | return NULL; | |
| 943 | } | |
| 944 | ||
| 945 | ret = (DNSPacket *)g_malloc0(sizeof(DNSPacket)); | |
| 946 | ||
| 947 | /* Parse the incoming packet, starting from 0 */ | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
948 | offset = 0; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
949 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
950 | if (offset + 12 > datalen) { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
951 | g_free(ret); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
952 | return NULL; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
953 | } |
| 8487 | 954 | |
| 955 | /* The header section */ | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
956 | ret->header.id = util_get16(&data[offset]); /* ID */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
957 | offset += 2; |
| 8487 | 958 | |
| 959 | /* For the flags, some bits must be 0 and some must be 1, the rest are ignored */ | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
960 | ret->header.flags = util_get16(&data[offset]); /* Flags (QR, OPCODE, AA, TC, RD, RA, Z, AD, CD, and RCODE */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
961 | offset += 2; |
| 8487 | 962 | if ((ret->header.flags & 0x8000) == 0) { |
| 963 | /* QR should be 1 */ | |
| 964 | g_free(ret); | |
| 965 | return NULL; | |
| 966 | } | |
| 967 | if ((ret->header.flags & 0x7800) != 0) { | |
| 968 | /* OPCODE should be all 0's */ | |
| 969 | g_free(ret); | |
| 970 | return NULL; | |
| 971 | } | |
| 972 | ||
| 973 | /* Read in the number of other things in the packet */ | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
974 | ret->header.numquestions = util_get16(&data[offset]); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
975 | offset += 2; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
976 | ret->header.numanswers = util_get16(&data[offset]); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
977 | offset += 2; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
978 | ret->header.numauthority = util_get16(&data[offset]); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
979 | offset += 2; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
980 | ret->header.numadditional = util_get16(&data[offset]); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
981 | offset += 2; |
| 8487 | 982 | |
| 983 | /* Read in all the questions */ | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
984 | ret->questions = mdns_read_questions(ret->header.numquestions, data, datalen, &offset); |
| 8487 | 985 | |
| 986 | /* Read in all resource records */ | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
987 | ret->answers = mdns_read_rr(ret->header.numanswers, data, datalen, &offset); |
| 8487 | 988 | |
| 989 | /* Read in all authority records */ | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
990 | ret->authority = mdns_read_rr(ret->header.numauthority, data, datalen, &offset); |
| 8487 | 991 | |
| 992 | /* Read in all additional records */ | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
993 | ret->additional = mdns_read_rr(ret->header.numadditional, data, datalen, &offset); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
994 | |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
995 | /* Malformed packet check */ |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
996 | if ((ret->header.numquestions > 0 && ret->questions == NULL) || |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
997 | (ret->header.numanswers > 0 && ret->answers == NULL) || |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
998 | (ret->header.numauthority > 0 && ret->authority == NULL) || |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
999 | (ret->header.numadditional > 0 && ret->additional == NULL)) { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
1000 | gaim_debug_error("mdns", "Received an invalid DNS packet.\n"); |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
1001 | return NULL; |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
1002 | } |
| 8487 | 1003 | |
| 1004 | /* We should be at the end of the packet */ | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
1005 | if (offset != datalen) { |
|
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
1006 | gaim_debug_error("mdns", "Finished parsing before end of DNS packet! Only parsed %d of %d bytes.", offset, datalen); |
| 8487 | 1007 | g_free(ret); |
| 1008 | return NULL; | |
| 1009 | } | |
| 1010 | ||
| 1011 | return ret; | |
| 1012 | } |