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.h 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 | #ifndef _MDNS_H_ | |
| 27 | #define _MDNS_H_ | |
| 28 | ||
|
8546
59e40a3b08bf
[gaim-migrate @ 9288]
Mark Doliner <markdoliner@pidgin.im>
parents:
8487
diff
changeset
|
29 | #include "internal.h" |
| 8487 | 30 | #include "debug.h" |
| 31 | ||
| 32 | /* | |
| 33 | * Some #define's stolen from libfaim. Used to put | |
| 34 | * binary data (bytes, shorts and ints) into an array. | |
| 35 | */ | |
| 36 | #define util_put8(buf, data) ((*(buf) = (unsigned char)(data)&0xff),1) | |
| 37 | #define util_put16(buf, data) ( \ | |
| 38 | (*(buf) = (unsigned char)((data)>>8)&0xff), \ | |
| 39 | (*((buf)+1) = (unsigned char)(data)&0xff), \ | |
| 40 | 2) | |
| 41 | #define util_put32(buf, data) ( \ | |
| 42 | (*((buf)) = (unsigned char)((data)>>24)&0xff), \ | |
| 43 | (*((buf)+1) = (unsigned char)((data)>>16)&0xff), \ | |
| 44 | (*((buf)+2) = (unsigned char)((data)>>8)&0xff), \ | |
| 45 | (*((buf)+3) = (unsigned char)(data)&0xff), \ | |
| 46 | 4) | |
| 47 | #define util_get8(buf) ((*(buf))&0xff) | |
| 48 | #define util_get16(buf) ((((*(buf))<<8)&0xff00) + ((*((buf)+1)) & 0xff)) | |
| 49 | #define util_get32(buf) ((((*(buf))<<24)&0xff000000) + \ | |
| 50 | (((*((buf)+1))<<16)&0x00ff0000) + \ | |
| 51 | (((*((buf)+2))<< 8)&0x0000ff00) + \ | |
| 52 | (((*((buf)+3) )&0x000000ff))) | |
| 53 | ||
| 54 | /* | |
| 55 | * Merriam-Webster's | |
| 56 | */ | |
| 57 | #define RENDEZVOUS_RRTYPE_A 1 | |
| 58 | #define RENDEZVOUS_RRTYPE_NS 2 | |
| 59 | #define RENDEZVOUS_RRTYPE_CNAME 5 | |
| 60 | #define RENDEZVOUS_RRTYPE_NULL 10 | |
| 61 | #define RENDEZVOUS_RRTYPE_PTR 12 | |
| 62 | #define RENDEZVOUS_RRTYPE_TXT 16 | |
|
8594
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
63 | #define RENDEZVOUS_RRTYPE_SRV 33 |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
64 | #define RENDEZVOUS_RRTYPE_ALL 255 |
| 8487 | 65 | |
| 66 | /* | |
| 67 | * Express for Men's | |
| 68 | */ | |
| 69 | typedef struct _Header { | |
| 70 | unsigned short id; | |
| 71 | unsigned short flags; | |
| 72 | unsigned short numquestions; | |
| 73 | unsigned short numanswers; | |
| 74 | unsigned short numauthority; | |
| 75 | unsigned short numadditional; | |
| 76 | } Header; | |
| 77 | ||
| 78 | typedef struct _Question { | |
| 79 | gchar *name; | |
| 80 | unsigned short type; | |
| 81 | unsigned short class; | |
| 82 | } Question; | |
| 83 | ||
|
8594
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
84 | typedef struct _ResourceRecord { |
| 8487 | 85 | gchar *name; |
| 86 | unsigned short type; | |
| 87 | unsigned short class; | |
| 88 | int ttl; | |
| 89 | unsigned short rdlength; | |
| 90 | void *rdata; | |
| 91 | } ResourceRecord; | |
| 92 | ||
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
93 | typedef struct _ResourceRecordRDataTXTNode { |
|
8629
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
94 | char *name; |
|
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
95 | char *value; |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
96 | } ResourceRecordRDataTXTNode; |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
97 | |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
98 | typedef GSList ResourceRecordRDataTXT; |
|
8629
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
99 | |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
100 | typedef struct _ResourceRecordRDataSRV { |
|
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
101 | unsigned short port; |
|
8634
2781838b4e10
[gaim-migrate @ 9386]
Mark Doliner <markdoliner@pidgin.im>
parents:
8631
diff
changeset
|
102 | char *target; |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
103 | } ResourceRecordRDataSRV; |
|
8594
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
104 | |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
105 | typedef struct _ResourceRecordSRV { |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
106 | unsigned int priority; |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
107 | unsigned int weight; |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
108 | unsigned int port; |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
109 | gchar *target; |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
110 | } ResourceRecordSRV; |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
111 | |
| 8487 | 112 | typedef struct _DNSPacket { |
| 113 | Header header; | |
| 114 | Question *questions; | |
| 115 | ResourceRecord *answers; | |
| 116 | ResourceRecord *authority; | |
| 117 | ResourceRecord *additional; | |
| 118 | } DNSPacket; | |
| 119 | ||
| 120 | /* | |
| 121 | * Bring in 'Da Noise, Bring in 'Da Functions | |
| 122 | */ | |
| 123 | ||
| 124 | /** | |
| 125 | * Create a multicast socket that can be used for sending and | |
| 126 | * receiving multicast DNS packets. The socket joins the | |
| 127 | * link-local multicast group (224.0.0.251). | |
| 128 | * | |
| 129 | * @return The file descriptor of the new socket, or -1 if | |
| 130 | * there was an error establishing the socket. | |
| 131 | */ | |
| 132 | int mdns_establish_socket(); | |
| 133 | ||
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
134 | |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
135 | /** |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
136 | * Sends a multicast DNS datagram. Generally this is called |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
137 | * by other convenience functions such as mdns_query(), however |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
138 | * a client CAN construct its own DNSPacket if it wishes. |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
139 | * |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
140 | * @param fd The file descriptor of a pre-established socket to |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
141 | * be used for sending the outgoing mDNS datagram. |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
142 | * @param dns The DNS datagram you wish to send. |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
143 | * @return 0 on success, otherwise return the error number. |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
144 | */ |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
145 | int mdns_send_dns(int fd, const DNSPacket *dns); |
|
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
146 | |
| 8487 | 147 | /** |
| 148 | * Send a multicast DNS query for the given domain across the given | |
| 149 | * socket. | |
| 150 | * | |
| 151 | * @param fd The file descriptor of a pre-established socket to | |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
152 | * be used for sending the outgoing mDNS datagram. |
| 8487 | 153 | * @param domain This is the domain name you wish to query. It should |
| 154 | * be of the format "_presence._tcp.local" for example. | |
| 155 | * @return 0 if sucessful. | |
| 156 | */ | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
157 | int mdns_query(int fd, const char *domain, unsigned short type); |
| 8487 | 158 | |
|
8636
d49af923e2ce
[gaim-migrate @ 9388]
Mark Doliner <markdoliner@pidgin.im>
parents:
8634
diff
changeset
|
159 | int mdns_advertise_null(int fd, const char *name, const char *data, unsigned short rdlength); |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
160 | int mdns_advertise_ptr(int fd, const char *name, const char *domain); |
|
8629
0c35c1e5a316
[gaim-migrate @ 9381]
Mark Doliner <markdoliner@pidgin.im>
parents:
8612
diff
changeset
|
161 | int mdns_advertise_txt(int fd, const char *name, const GSList *txt); |
|
8631
f45bad880ec2
[gaim-migrate @ 9383]
Mark Doliner <markdoliner@pidgin.im>
parents:
8629
diff
changeset
|
162 | int mdns_advertise_srv(int fd, const char *name, unsigned short port, const char *target); |
|
8612
3af40ff62900
[gaim-migrate @ 9363]
Mark Doliner <markdoliner@pidgin.im>
parents:
8594
diff
changeset
|
163 | |
| 8487 | 164 | /** |
|
8594
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
165 | * Read a UDP packet from the given file descriptor and parse it |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
166 | * into a DNSPacket. |
| 8487 | 167 | * |
|
8594
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
168 | * @param fd A UDP listening socket to read from. |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
169 | * @return A newly allocated DNSPacket. This should be freed with |
|
b51dae7b7aa0
[gaim-migrate @ 9345]
Mark Doliner <markdoliner@pidgin.im>
parents:
8546
diff
changeset
|
170 | * mdns_free() when no longer needed. |
| 8487 | 171 | */ |
| 172 | DNSPacket *mdns_read(int fd); | |
| 173 | ||
| 174 | /** | |
| 175 | * Free a DNSPacket structure. | |
| 176 | * | |
| 177 | * @param dns The DNSPacket that you want to free. | |
| 178 | */ | |
| 179 | void mdns_free(DNSPacket *dns); | |
| 180 | ||
| 181 | #endif /* _MDNS_H_ */ |