]> git.meshlink.io Git - catta/blob - avahi-core/avahi-test.c
* add proper error codes and patch everything to make use of it
[catta] / avahi-core / avahi-test.c
1 /* $Id$ */
2
3 /***
4   This file is part of avahi.
5  
6   avahi is free software; you can redistribute it and/or modify it
7   under the terms of the GNU Lesser General Public License as
8   published by the Free Software Foundation; either version 2.1 of the
9   License, or (at your option) any later version.
10  
11   avahi is distributed in the hope that it will be useful, but WITHOUT
12   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13   or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
14   Public License for more details.
15  
16   You should have received a copy of the GNU Lesser General Public
17   License along with avahi; if not, write to the Free Software
18   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19   USA.
20 ***/
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <sys/socket.h>
27 #include <netinet/in.h>
28 #include <arpa/inet.h>
29 #include <stdlib.h>
30 #include <stdio.h>
31
32 #include <avahi-core/core.h>
33 #include <avahi-core/log.h>
34
35 static AvahiEntryGroup *group = NULL;
36 static AvahiServer *server = NULL;
37 static gchar *service_name = NULL;
38
39 static gboolean quit_timeout(gpointer data) {
40     g_main_loop_quit(data);
41     return FALSE;
42 }
43
44 static void dump_line(const gchar *text, gpointer userdata) {
45     printf("%s\n", text);
46 }
47
48 static gboolean dump_timeout(gpointer data) {
49     AvahiServer *Avahi = data;
50     avahi_server_dump(Avahi, dump_line, NULL);
51     return TRUE;
52 }
53
54 static void record_browser_callback(AvahiRecordBrowser *r, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, AvahiRecord *record, gpointer userdata) {
55     gchar *t;
56     
57     g_assert(r);
58     g_assert(record);
59     g_assert(interface > 0);
60     g_assert(protocol != AVAHI_PROTO_UNSPEC);
61
62     avahi_log_debug("SUBSCRIPTION: record [%s] on %i.%i is %s", t = avahi_record_to_string(record), interface, protocol,
63               event == AVAHI_BROWSER_NEW ? "new" : "remove");
64
65     g_free(t);
66 }
67
68 static void remove_entries(void);
69 static void create_entries(gboolean new_name);
70
71 static void entry_group_callback(AvahiServer *s, AvahiEntryGroup *g, AvahiEntryGroupState state, gpointer userdata) {
72     avahi_log_debug("entry group state: %i", state); 
73
74     if (state == AVAHI_ENTRY_GROUP_COLLISION) {
75         remove_entries();
76         create_entries(TRUE);
77         avahi_log_debug("Service name conflict, retrying with <%s>", service_name);
78     } else if (state == AVAHI_ENTRY_GROUP_ESTABLISHED) {
79         avahi_log_debug("Service established under name <%s>", service_name);
80     }
81 }
82
83 static void server_callback(AvahiServer *s, AvahiServerState state, gpointer userdata) {
84
85      avahi_log_debug("server state: %i", state); 
86     
87     if (state == AVAHI_SERVER_RUNNING) {
88         avahi_log_debug("Server startup complete.  Host name is <%s>", avahi_server_get_host_name_fqdn(s));
89         create_entries(FALSE);
90     } else if (state == AVAHI_SERVER_COLLISION) {
91         gchar *n;
92         remove_entries();
93
94         n = avahi_alternative_host_name(avahi_server_get_host_name(s));
95
96         avahi_log_debug("Host name conflict, retrying with <%s>", n);
97         avahi_server_set_host_name(s, n);
98         g_free(n);
99     }
100 }
101
102 static void remove_entries(void) {
103     if (group)
104         avahi_entry_group_reset(group);
105 }
106
107 static void create_entries(gboolean new_name) {
108     AvahiAddress a;
109
110     remove_entries();
111
112     if (!group) 
113         group = avahi_entry_group_new(server, entry_group_callback, NULL);
114
115     g_assert(avahi_entry_group_is_empty(group));
116     
117     if (!service_name)
118         service_name = g_strdup("Test Service");
119     else if (new_name) {
120         gchar *n = avahi_alternative_service_name(service_name);
121         g_free(service_name);
122         service_name = n;
123     }
124     
125     if (avahi_server_add_service(server, group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, service_name, "_http._tcp", NULL, NULL, 80, "foo", NULL) < 0) {
126         avahi_log_error("Failed to add HTTP service");
127         goto fail;
128     }
129
130     if (avahi_server_add_service(server, group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, service_name, "_ftp._tcp", NULL, NULL, 21, "foo", NULL) < 0) {
131         avahi_log_error("Failed to add FTP service");
132         goto fail;
133     }
134
135     if (avahi_server_add_service(server, group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, service_name, "_webdav._tcp", NULL, NULL, 80, "foo", NULL) < 0) {
136         avahi_log_error("Failed to add WEBDAV service");
137         goto fail;
138     }
139
140     if (avahi_server_add_dns_server_address(server, group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, NULL, AVAHI_DNS_SERVER_RESOLVE, avahi_address_parse("192.168.50.1", AVAHI_PROTO_UNSPEC, &a), 53) < 0) {
141         avahi_log_error("Failed to add new DNS Server address");
142         goto fail;
143     }
144
145     avahi_entry_group_commit(group);
146     return;
147
148 fail:
149     if (group)
150         avahi_entry_group_free(group);
151
152     group = NULL;
153 }
154
155 static void hnr_callback(AvahiHostNameResolver *r, AvahiIfIndex iface, AvahiProtocol protocol, AvahiBrowserEvent event, const gchar *hostname, const AvahiAddress *a, gpointer userdata) {
156     gchar t[64];
157
158     if (a)
159         avahi_address_snprint(t, sizeof(t), a);
160
161     avahi_log_debug("HNR: (%i.%i) <%s> -> %s [%s]", iface, protocol, hostname, a ? t : "n/a", event == AVAHI_RESOLVER_FOUND ? "found" : "timeout");
162 }
163
164 static void ar_callback(AvahiAddressResolver *r, AvahiIfIndex iface, AvahiProtocol protocol, AvahiBrowserEvent event, const AvahiAddress *a, const gchar *hostname, gpointer userdata) {
165     gchar t[64];
166
167     avahi_address_snprint(t, sizeof(t), a);
168
169     avahi_log_debug("AR: (%i.%i) %s -> <%s> [%s]", iface, protocol, t, hostname ? hostname : "n/a", event == AVAHI_RESOLVER_FOUND ? "found" : "timeout");
170 }
171
172 static void db_callback(AvahiDomainBrowser *b, AvahiIfIndex iface, AvahiProtocol protocol, AvahiBrowserEvent event, const gchar *domain, gpointer userdata) {
173
174     avahi_log_debug("DB: (%i.%i) <%s> [%s]", iface, protocol, domain, event == AVAHI_BROWSER_NEW ? "new" : "remove");
175 }
176
177 static void stb_callback(AvahiServiceTypeBrowser *b, AvahiIfIndex iface, AvahiProtocol protocol, AvahiBrowserEvent event, const gchar *service_type, const gchar *domain, gpointer userdata) {
178
179     avahi_log_debug("STB: (%i.%i) %s in <%s> [%s]", iface, protocol, service_type, domain, event == AVAHI_BROWSER_NEW ? "new" : "remove");
180 }
181
182 static void sb_callback(AvahiServiceBrowser *b, AvahiIfIndex iface, AvahiProtocol protocol, AvahiBrowserEvent event, const gchar *name, const gchar *service_type, const gchar *domain, gpointer userdata) {
183    avahi_log_debug("SB: (%i.%i) <%s> as %s in <%s> [%s]", iface, protocol, name, service_type, domain, event == AVAHI_BROWSER_NEW ? "new" : "remove");
184 }
185
186 static void sr_callback(AvahiServiceResolver *r, AvahiIfIndex iface, AvahiProtocol protocol, AvahiBrowserEvent event, const gchar *name, const gchar*service_type, const gchar*domain_name, const gchar*hostname, const AvahiAddress *a, guint16 port, AvahiStringList *txt, gpointer userdata) {
187
188     if (event == AVAHI_RESOLVER_TIMEOUT)
189         avahi_log_debug("SR: (%i.%i) <%s> as %s in <%s> [timeout]", iface, protocol, name, service_type, domain_name);
190     else {
191         gchar t[64], *s;
192         
193         avahi_address_snprint(t, sizeof(t), a);
194
195         s = avahi_string_list_to_string(txt);
196         avahi_log_debug("SR: (%i.%i) <%s> as %s in <%s>: %s/%s:%i (%s) [found]", iface, protocol, name, service_type, domain_name, hostname, t, port, s);
197         g_free(s);
198     }
199 }
200
201 static void dsb_callback(AvahiDNSServerBrowser *b, AvahiIfIndex iface, AvahiProtocol protocol, AvahiBrowserEvent event, const gchar*hostname, const AvahiAddress *a, guint16 port, gpointer userdata) {
202     gchar t[64];
203     avahi_address_snprint(t, sizeof(t), a);
204     avahi_log_debug("DSB: (%i.%i): %s/%s:%i [%s]", iface, protocol, hostname, t, port, event == AVAHI_BROWSER_NEW ? "new" : "remove");
205 }
206
207 int main(int argc, char *argv[]) {
208     GMainLoop *loop = NULL;
209     AvahiRecordBrowser *r;
210     AvahiHostNameResolver *hnr;
211     AvahiAddressResolver *ar;
212     AvahiKey *k;
213     AvahiServerConfig config;
214     AvahiAddress a;
215     AvahiDomainBrowser *db;
216     AvahiServiceTypeBrowser *stb;
217     AvahiServiceBrowser *sb;
218     AvahiServiceResolver *sr;
219     AvahiDNSServerBrowser *dsb;
220     gint error;
221     
222     avahi_server_config_init(&config);
223 /*     config.host_name = g_strdup("test"); */
224     server = avahi_server_new(NULL, &config, server_callback, NULL, &error);
225     avahi_server_config_free(&config);
226
227     k = avahi_key_new("_http._tcp.local", AVAHI_DNS_CLASS_IN, AVAHI_DNS_TYPE_PTR);
228     r = avahi_record_browser_new(server, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, k, record_browser_callback, NULL);
229     avahi_key_unref(k);
230
231     hnr = avahi_host_name_resolver_new(server, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "codes-CompUTER.local", AVAHI_PROTO_UNSPEC, hnr_callback, NULL);
232
233     ar = avahi_address_resolver_new(server, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, avahi_address_parse("192.168.50.15", AVAHI_PROTO_INET, &a), ar_callback, NULL);
234
235     db = avahi_domain_browser_new(server, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, NULL, AVAHI_DOMAIN_BROWSER_BROWSE, db_callback, NULL);
236
237     stb = avahi_service_type_browser_new(server, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, NULL, stb_callback, NULL);
238
239     sb = avahi_service_browser_new(server, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_http._tcp", NULL, sb_callback, NULL);
240
241     sr = avahi_service_resolver_new(server, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "Ecstasy HTTP", "_http._tcp", "local", AVAHI_PROTO_UNSPEC, sr_callback, NULL);
242
243     dsb = avahi_dns_server_browser_new(server, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "local", AVAHI_DNS_SERVER_RESOLVE, AVAHI_PROTO_UNSPEC, dsb_callback, NULL);
244
245     
246     g_timeout_add(1000*5, dump_timeout, server);
247     g_timeout_add(1000*60, quit_timeout, loop);     
248     
249     loop = g_main_loop_new(NULL, FALSE);
250     g_main_loop_run(loop);
251     g_main_loop_unref(loop);
252
253     avahi_record_browser_free(r);
254     avahi_host_name_resolver_free(hnr);
255     avahi_address_resolver_free(ar);
256     avahi_service_type_browser_free(stb);
257     avahi_service_browser_free(sb);
258     avahi_service_resolver_free(sr);
259     avahi_dns_server_browser_free(dsb);
260
261     if (group)
262         avahi_entry_group_free(group);   
263
264     if (server)
265         avahi_server_free(server);
266
267     g_free(service_name);
268     
269     return 0;
270 }