]> git.meshlink.io Git - catta/blob - examples/core-browse-services.c
fix switch fall through error
[catta] / examples / core-browse-services.c
1 /* $Id$ */
2
3 /* PLEASE NOTE *
4  * This file demonstrates how to use Avahi's core API, this is
5  * the embeddable mDNS stack for embedded applications.
6  *
7  * End user applications should *not* use this API and should use
8  * the DBUS or C APIs, please see
9  * client-browse-services.c and glib-integration.c
10  * 
11  * I repeat, you probably do *not* want to use this example.
12  */
13
14 /***
15   This file is part of avahi.
16  
17   avahi is free software; you can redistribute it and/or modify it
18   under the terms of the GNU Lesser General Public License as
19   published by the Free Software Foundation; either version 2.1 of the
20   License, or (at your option) any later version.
21  
22   avahi is distributed in the hope that it will be useful, but WITHOUT
23   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
24   or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
25   Public License for more details.
26  
27   You should have received a copy of the GNU Lesser General Public
28   License along with avahi; if not, write to the Free Software
29   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
30   USA.
31 ***/
32
33 #ifdef HAVE_CONFIG_H
34 #include <config.h>
35 #endif
36
37 #include <stdio.h>
38 #include <assert.h>
39 #include <stdlib.h>
40 #include <time.h>
41
42 #include <avahi-core/core.h>
43 #include <avahi-core/lookup.h>
44 #include <avahi-common/simple-watch.h>
45 #include <avahi-common/malloc.h>
46 #include <avahi-common/error.h>
47
48 static AvahiSimplePoll *simple_poll = NULL;
49 static AvahiServer *server = NULL;
50
51 static void resolve_callback(
52     AvahiSServiceResolver *r,
53     AvahiIfIndex interface,
54     AvahiProtocol protocol,
55     AvahiResolverEvent event,
56     const char *name,
57     const char *type,
58     const char *domain,
59     const char *host_name,
60     const AvahiAddress *address,
61     uint16_t port,
62     AvahiStringList *txt,
63     AvahiLookupResultFlags flags,
64     void* userdata) {
65     
66     assert(r);
67
68     /* Called whenever a service has been resolved successfully or timed out */
69
70     switch (event) {
71         case AVAHI_RESOLVER_TIMEOUT:
72         case AVAHI_RESOLVER_NOT_FOUND:
73         case AVAHI_RESOLVER_FAILURE:
74             fprintf(stderr, "Failed to resolve service '%s' of type '%s' in domain '%s': %s\n", name, type, domain,
75                     event == AVAHI_RESOLVER_TIMEOUT ? "TIMEOUT" : (event == AVAHI_RESOLVER_NOT_FOUND ? "NOT_FOUND" : "FAILURE"));
76             break;
77
78         case AVAHI_RESOLVER_FOUND: {
79             char a[128], *t;
80             
81             fprintf(stderr, "Service '%s' of type '%s' in domain '%s':\n", name, type, domain);
82             
83             avahi_address_snprint(a, sizeof(a), address);
84             t = avahi_string_list_to_string(txt);
85             fprintf(stderr,
86                     "\t%s:%u (%s)\n"
87                     "\tTXT=%s\n"
88                     "\tcookie is %u\n"
89                     "\tis_local: %i\n"
90                     "\twide_area: %i\n"
91                     "\tmulticast: %i\n"
92                     "\tcached: %i\n",
93                     host_name, port, a,
94                     t,
95                     avahi_string_list_get_service_cookie(txt),
96                     avahi_server_is_service_local(server, interface, protocol, name, type, domain),
97                     !!(flags & AVAHI_LOOKUP_RESULT_WIDE_AREA),
98                     !!(flags & AVAHI_LOOKUP_RESULT_MULTICAST),
99                     !!(flags & AVAHI_LOOKUP_RESULT_CACHED));
100             avahi_free(t);
101         }
102     }
103     
104     avahi_s_service_resolver_free(r);
105 }
106
107 static void browse_callback(
108     AvahiSServiceBrowser *b,
109     AvahiIfIndex interface,
110     AvahiProtocol protocol,
111     AvahiBrowserEvent event,
112     const char *name,
113     const char *type,
114     const char *domain,
115     AvahiLookupResultFlags flags,
116     void* userdata) {
117     
118     AvahiServer *s = userdata;
119     assert(b);
120
121     /* Called whenever a new services becomes available on the LAN or is removed from the LAN */
122
123     switch (event) {
124
125         case AVAHI_BROWSER_FAILURE:
126         case AVAHI_BROWSER_NOT_FOUND:
127             
128             fprintf(stderr, "(Browser) %s\n", event == AVAHI_BROWSER_FAILURE ? "FAILURE" : "NOT_FOUND");
129             avahi_simple_poll_quit(simple_poll);
130             return;
131
132         case AVAHI_BROWSER_NEW:
133             fprintf(stderr, "(Browser) NEW: service '%s' of type '%s' in domain '%s'\n", name, type, domain);
134
135             /* We ignore the returned resolver object. In the callback
136                function we free it. If the server is terminated before
137                the callback function is called the server will free
138                the resolver for us. */
139             
140             if (!(avahi_s_service_resolver_new(s, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, 0, resolve_callback, s)))
141                 fprintf(stderr, "Failed to resolve service '%s': %s\n", name, avahi_strerror(avahi_server_errno(s)));
142             
143             break;
144
145         case AVAHI_BROWSER_REMOVE:
146             fprintf(stderr, "(Browser) REMOVE: service '%s' of type '%s' in domain '%s'\n", name, type, domain);
147             break;
148
149         case AVAHI_BROWSER_ALL_FOR_NOW:
150         case AVAHI_BROWSER_CACHE_EXHAUSTED:
151             fprintf(stderr, "(Browser) %s\n", event == AVAHI_BROWSER_CACHE_EXHAUSTED ? "CACHE_EXHAUSTED" : "ALL_FOR_NOW");
152             break;
153     }
154 }
155
156 int main(int argc, char*argv[]) {
157     AvahiServerConfig config;
158     AvahiSServiceBrowser *sb;
159     int error;
160     int ret = 1;
161
162     /* Initialize the psuedo-RNG */
163     srand(time(NULL));
164
165     /* Allocate main loop object */
166     if (!(simple_poll = avahi_simple_poll_new())) {
167         fprintf(stderr, "Failed to create simple poll object.\n");
168         goto fail;
169     }
170
171     /* Do not publish any local records */
172     avahi_server_config_init(&config);
173     config.publish_hinfo = 0;
174     config.publish_addresses = 0;
175     config.publish_workstation = 0;
176     config.publish_domain = 0;
177
178     /* Set a unicast DNS server for wide area DNS-SD */
179     avahi_address_parse("192.168.50.1", AVAHI_PROTO_UNSPEC, &config.wide_area_servers[0]);
180     config.n_wide_area_servers = 1;
181     config.enable_wide_area = 1;
182     
183     /* Allocate a new server */
184     server = avahi_server_new(avahi_simple_poll_get(simple_poll), &config, NULL, NULL, &error);
185
186     /* Free the configuration data */
187     avahi_server_config_free(&config);
188
189     /* Check wether creating the server object succeeded */
190     if (!server) {
191         fprintf(stderr, "Failed to create server: %s\n", avahi_strerror(error));
192         goto fail;
193     }
194     
195     /* Create the service browser */
196     if (!(sb = avahi_s_service_browser_new(server, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_http._tcp", NULL, 0, browse_callback, server))) {
197         fprintf(stderr, "Failed to create service browser: %s\n", avahi_strerror(avahi_server_errno(server)));
198         goto fail;
199     }
200     
201     /* Run the main loop */
202     for (;;)
203         if (avahi_simple_poll_iterate(simple_poll, -1) != 0)
204             break;
205     
206     ret = 0;
207     
208 fail:
209     
210     /* Cleanup things */
211     if (sb)
212         avahi_s_service_browser_free(sb);
213     
214     if (server)
215         avahi_server_free(server);
216
217     if (simple_poll)
218         avahi_simple_poll_free(simple_poll);
219
220     return ret;
221 }