Mercurial > pidgin.yaz
annotate src/protocols/rendezvous/mdns.h @ 8749:d7b8eb1f0a18
[gaim-migrate @ 9504]
Bumped up the plugin API version number, and added version numbers for
loader plugins and protocol plugins. Authors will want to update their
plugins, and possibly use GAIM_PLUGIN_API_VERSION, GAIM_PRPL_API_VERSION,
and GAIM_LOADER_API_VERSION constants.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Thu, 22 Apr 2004 01:53:18 +0000 |
parents | dbbf5470ba05 |
children | 8212661dc3cc |
rev | line source |
---|---|
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 | 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 | 63 #define RENDEZVOUS_RRTYPE_SRV 33 |
8636 | 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 | 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 | 93 typedef struct _ResourceRecordRDataTXTNode { |
8629 | 94 char *name; |
95 char *value; | |
8631 | 96 } ResourceRecordRDataTXTNode; |
97 | |
98 typedef GSList ResourceRecordRDataTXT; | |
8629 | 99 |
8631 | 100 typedef struct _ResourceRecordRDataSRV { |
101 unsigned short port; | |
8634 | 102 char *target; |
8631 | 103 } ResourceRecordRDataSRV; |
8594 | 104 |
105 typedef struct _ResourceRecordSRV { | |
106 unsigned int priority; | |
107 unsigned int weight; | |
108 unsigned int port; | |
109 gchar *target; | |
110 } ResourceRecordSRV; | |
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 | 134 |
135 /** | |
136 * Sends a multicast DNS datagram. Generally this is called | |
137 * by other convenience functions such as mdns_query(), however | |
138 * a client CAN construct its own DNSPacket if it wishes. | |
139 * | |
140 * @param fd The file descriptor of a pre-established socket to | |
141 * be used for sending the outgoing mDNS datagram. | |
142 * @param dns The DNS datagram you wish to send. | |
143 * @return 0 on success, otherwise return the error number. | |
144 */ | |
145 int mdns_send_dns(int fd, const DNSPacket *dns); | |
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 | 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. | |
8735
92cbf9713795
[gaim-migrate @ 9490]
Christian Hammond <chipx86@chipx86.com>
parents:
8636
diff
changeset
|
155 * @return 0 if successful. |
8487 | 156 */ |
8636 | 157 int mdns_query(int fd, const char *domain, unsigned short type); |
8487 | 158 |
8738 | 159 int mdns_send_rr(int fd, ResourceRecord *rr); |
8636 | 160 int mdns_advertise_null(int fd, const char *name, const char *data, unsigned short rdlength); |
8612 | 161 int mdns_advertise_ptr(int fd, const char *name, const char *domain); |
8629 | 162 int mdns_advertise_txt(int fd, const char *name, const GSList *txt); |
8631 | 163 int mdns_advertise_srv(int fd, const char *name, unsigned short port, const char *target); |
8612 | 164 |
8487 | 165 /** |
8594 | 166 * Read a UDP packet from the given file descriptor and parse it |
167 * into a DNSPacket. | |
8487 | 168 * |
8594 | 169 * @param fd A UDP listening socket to read from. |
170 * @return A newly allocated DNSPacket. This should be freed with | |
171 * mdns_free() when no longer needed. | |
8487 | 172 */ |
173 DNSPacket *mdns_read(int fd); | |
174 | |
175 /** | |
176 * Free a DNSPacket structure. | |
177 * | |
178 * @param dns The DNSPacket that you want to free. | |
179 */ | |
180 void mdns_free(DNSPacket *dns); | |
8738 | 181 void mdns_free_rr(ResourceRecord *rr); |
8487 | 182 |
183 #endif /* _MDNS_H_ */ |