]> git.meshlink.io Git - catta/blob - avahi-compat-howl/samples/browse.c
fix avahi_netlink_new to allow multiple netlinks per process
[catta] / avahi-compat-howl / samples / browse.c
1 /*
2  * Copyright 2003, 2004, 2004 Porchdog Software. All rights reserved.
3  *
4  *      Redistribution and use in source and binary forms, with or without modification,
5  *      are permitted provided that the following conditions are met:
6  *
7  *              1. Redistributions of source code must retain the above copyright notice,
8  *                 this list of conditions and the following disclaimer.
9  *              2. Redistributions in binary form must reproduce the above copyright notice,
10  *                 this list of conditions and the following disclaimer in the documentation
11  *                 and/or other materials provided with the distribution.
12  *
13  *      THIS SOFTWARE IS PROVIDED BY PORCHDOG SOFTWARE ``AS IS'' AND ANY
14  *      EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  *      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16  *      IN NO EVENT SHALL THE HOWL PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
17  *      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
18  *      BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19  *      DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
20  *      OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
21  *      OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
22  *      OF THE POSSIBILITY OF SUCH DAMAGE.
23  *
24  *      The views and conclusions contained in the software and documentation are those
25  *      of the authors and should not be interpreted as representing official policies,
26  *      either expressed or implied, of Porchdog Software.
27  */
28
29 #include <howl.h>
30 #include <salt/debug.h>
31 #include <stdio.h>
32
33
34 static sw_result HOWL_API
35 my_resolver(
36                                 sw_discovery                    discovery,
37                                 sw_discovery_oid                oid,
38                                 sw_uint32                               interface_index,
39                                 sw_const_string         name,
40                                 sw_const_string         type,
41                                 sw_const_string         domain,
42                                 sw_ipv4_address         address,
43                                 sw_port                                 port,
44                                 sw_octets                               text_record,
45                                 sw_uint32                               text_record_len,
46                                 sw_opaque_t                             extra)
47 {
48         sw_text_record_iterator                         it;
49         sw_int8                                                                 name_buf[16];
50         sw_int8                                                                 key[SW_TEXT_RECORD_MAX_LEN];
51         sw_int8                                                                 sval[SW_TEXT_RECORD_MAX_LEN];
52         sw_uint8                                                                        oval[SW_TEXT_RECORD_MAX_LEN];
53         sw_uint32                                                               oval_len;
54         sw_result                                                               err = SW_OKAY;
55
56         sw_discovery_cancel(discovery, oid);
57
58         fprintf(stderr, "resolve reply: 0x%x %s %s %s %s %d\n", interface_index, name, type, domain, sw_ipv4_address_name(address, name_buf, 16), port);
59
60         if ((text_record_len > 0) && (text_record) && (*text_record != '\0'))
61         {
62                 err = sw_text_record_iterator_init(&it, text_record, text_record_len);
63                 sw_check_okay(err, exit);
64
65                 while (sw_text_record_iterator_next(it, key, oval, &oval_len) == SW_OKAY)
66                 {
67                         fprintf(stderr, "Txt: [%s]=[%s] - (%d bytes)\n", key, oval, oval_len);
68                 }
69
70                 err = sw_text_record_iterator_fina(it);
71                 sw_check_okay(err, exit);
72         }
73
74 exit:
75
76         return err;
77 }
78
79
80 static sw_result HOWL_API
81 my_browser(
82                                 sw_discovery                                            discovery,
83                                 sw_discovery_oid                                        oid,
84                                 sw_discovery_browse_status              status,
85                                 sw_uint32                                                       interface_index,
86                                 sw_const_string                                 name,
87                                 sw_const_string                                 type,
88                                 sw_const_string                                 domain,
89                                 sw_opaque_t                                                     extra)
90 {
91         sw_discovery_resolve_id rid;
92
93         switch (status)
94         {
95                 case SW_DISCOVERY_BROWSE_INVALID:
96                 {
97                         fprintf(stderr, "browse reply: Invalid\n");
98                 }
99                 break;
100
101                 case SW_DISCOVERY_BROWSE_RELEASE:
102                 {
103                         fprintf(stderr, "browse reply: Release\n");
104                 }
105                 break;
106
107                 case SW_DISCOVERY_BROWSE_ADD_DOMAIN:
108                 {
109                         fprintf(stderr, "browse reply: Add Domain\n");
110                 }
111                 break;
112
113                 case SW_DISCOVERY_BROWSE_ADD_DEFAULT_DOMAIN:
114                 {
115                         fprintf(stderr, "browse reply: Add Default Domain\n");
116                 }
117                 break;
118
119                 case SW_DISCOVERY_BROWSE_REMOVE_DOMAIN:
120                 {
121                         fprintf(stderr, "browse reply: Remove Domain\n");
122                 }
123                 break;
124
125                 case SW_DISCOVERY_BROWSE_ADD_SERVICE:
126                 {
127                         fprintf(stderr, "browse reply: Add Service 0x%x %s %s %s\n", interface_index, name, type, domain);
128                         if (sw_discovery_resolve(discovery, interface_index, name, type, domain, my_resolver, NULL, &rid) != SW_OKAY)
129                         {
130                                 fprintf(stderr, "resolve failed\n");
131                         }
132                 }
133                 break;
134
135                 case SW_DISCOVERY_BROWSE_REMOVE_SERVICE:
136                 {
137                         fprintf(stderr, "browse reply: Remove Service\n");
138                         fprintf(stderr, "remove service: 0x%x %s %s %s\n", interface_index, name, type, domain);
139                 }
140                 break;
141
142                 case SW_DISCOVERY_BROWSE_RESOLVED:
143                 {
144                         fprintf(stderr, "browse reply: Resolved\n");
145                 }
146                 break;
147         }
148
149         return SW_OKAY;
150 }
151
152
153 #if defined(WIN32)
154 int __cdecl
155 #else
156 int
157 #endif
158 main(
159         int             argc,
160         char    **      argv)
161 {
162         sw_discovery            discovery;
163         sw_discovery_oid        oid;
164         sw_result                       err;
165
166         err = sw_discovery_init(&discovery);
167         sw_check_okay(err, exit);
168
169         if (argc != 2)
170         {
171                 fprintf(stderr, "usage: mDNSBrowse <type>\n");
172                 return -1;
173         }
174
175         err = sw_discovery_browse(discovery, 0, argv[1], NULL, my_browser, NULL, &oid);
176         sw_check_okay(err, exit);
177
178         err = sw_discovery_run(discovery);
179         sw_check_okay(err, exit);
180
181 exit:
182
183         return err;
184 }