Blame


1 aa152579 2003-02-23 alex /*
2 aa152579 2003-02-23 alex * ngIRCd -- The Next Generation IRC Daemon
3 292879ac 2004-12-26 alex * Copyright (c)2001-2004 by Alexander Barton (alex@barton.de)
4 aa152579 2003-02-23 alex *
5 aa152579 2003-02-23 alex * This program is free software; you can redistribute it and/or modify
6 aa152579 2003-02-23 alex * it under the terms of the GNU General Public License as published by
7 aa152579 2003-02-23 alex * the Free Software Foundation; either version 2 of the License, or
8 aa152579 2003-02-23 alex * (at your option) any later version.
9 aa152579 2003-02-23 alex * Please read the file COPYING, README and AUTHORS for more information.
10 aa152579 2003-02-23 alex *
11 292879ac 2004-12-26 alex * Rendezvous service registration.
12 292879ac 2004-12-26 alex *
13 292879ac 2004-12-26 alex * Supported APIs are:
14 292879ac 2004-12-26 alex * - Apple Mac OS X
15 292879ac 2004-12-26 alex * - Howl
16 aa152579 2003-02-23 alex */
17 aa152579 2003-02-23 alex
18 aa152579 2003-02-23 alex
19 aa152579 2003-02-23 alex #include "portab.h"
20 aa152579 2003-02-23 alex
21 02b0a515 2005-07-08 alex #ifdef ZEROCONF
22 aa152579 2003-02-23 alex
23 aa152579 2003-02-23 alex
24 dd3a3bc6 2006-05-10 alex static char UNUSED id[] = "$Id: rendezvous.c,v 1.8 2006/05/10 21:24:01 alex Exp $";
25 aa152579 2003-02-23 alex
26 aa152579 2003-02-23 alex #include "imp.h"
27 aa152579 2003-02-23 alex #include <assert.h>
28 aa152579 2003-02-23 alex
29 aa152579 2003-02-23 alex #include <stdio.h>
30 aa152579 2003-02-23 alex #include <string.h>
31 aa152579 2003-02-23 alex
32 aa152579 2003-02-23 alex #ifdef HAVE_MACH_PORT_H
33 aa152579 2003-02-23 alex #include "mach/port.h"
34 aa152579 2003-02-23 alex #include "mach/message.h"
35 aa152579 2003-02-23 alex #endif
36 aa152579 2003-02-23 alex
37 aa152579 2003-02-23 alex #ifdef HAVE_DNSSERVICEDISCOVERY_DNSSERVICEDISCOVERY_H
38 aa152579 2003-02-23 alex #include <DNSServiceDiscovery/DNSServiceDiscovery.h>
39 aa152579 2003-02-23 alex #endif
40 aa152579 2003-02-23 alex
41 292879ac 2004-12-26 alex #ifdef HAVE_RENDEZVOUS_RENDEZVOUS_H
42 292879ac 2004-12-26 alex #include <rendezvous/rendezvous.h>
43 292879ac 2004-12-26 alex #endif
44 292879ac 2004-12-26 alex
45 aa152579 2003-02-23 alex #include "defines.h"
46 aa152579 2003-02-23 alex #include "log.h"
47 aa152579 2003-02-23 alex
48 aa152579 2003-02-23 alex #include "exp.h"
49 aa152579 2003-02-23 alex #include "rendezvous.h"
50 aa152579 2003-02-23 alex
51 aa152579 2003-02-23 alex
52 292879ac 2004-12-26 alex #if defined(HAVE_DNSSERVICEREGISTRATIONCREATE)
53 292879ac 2004-12-26 alex # define APPLE
54 292879ac 2004-12-26 alex #elif defined(HAVE_SW_DISCOVERY_INIT)
55 292879ac 2004-12-26 alex # define HOWL
56 292879ac 2004-12-26 alex #else
57 292879ac 2004-12-26 alex # error "Can't detect Rendezvous API!?"
58 292879ac 2004-12-26 alex #endif
59 292879ac 2004-12-26 alex
60 292879ac 2004-12-26 alex
61 292879ac 2004-12-26 alex #define MAX_RENDEZVOUS 1000
62 292879ac 2004-12-26 alex
63 aa152579 2003-02-23 alex typedef struct _service
64 aa152579 2003-02-23 alex {
65 8adff592 2005-03-19 fw char Desc[CLIENT_ID_LEN];
66 292879ac 2004-12-26 alex #ifdef APPLE
67 aa152579 2003-02-23 alex dns_service_discovery_ref Discovery_Ref;
68 aa152579 2003-02-23 alex mach_port_t Mach_Port;
69 292879ac 2004-12-26 alex #endif
70 292879ac 2004-12-26 alex #ifdef HOWL
71 292879ac 2004-12-26 alex sw_discovery_oid Id;
72 292879ac 2004-12-26 alex #endif
73 aa152579 2003-02-23 alex } SERVICE;
74 aa152579 2003-02-23 alex
75 77f54693 2005-07-31 alex static SERVICE My_Rendezvous[MAX_RENDEZVOUS];
76 aa152579 2003-02-23 alex
77 292879ac 2004-12-26 alex
78 77f54693 2005-07-31 alex static void Unregister( int Idx );
79 aa152579 2003-02-23 alex
80 aa152579 2003-02-23 alex
81 292879ac 2004-12-26 alex /* -- Apple API -- */
82 292879ac 2004-12-26 alex
83 292879ac 2004-12-26 alex #ifdef APPLE
84 292879ac 2004-12-26 alex
85 aa152579 2003-02-23 alex #define MAX_MACH_MSG_SIZE 512
86 aa152579 2003-02-23 alex
87 77f54693 2005-07-31 alex static void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context );
88 aa152579 2003-02-23 alex
89 292879ac 2004-12-26 alex #endif /* Apple */
90 aa152579 2003-02-23 alex
91 aa152579 2003-02-23 alex
92 292879ac 2004-12-26 alex /* -- Howl API -- */
93 292879ac 2004-12-26 alex
94 292879ac 2004-12-26 alex #ifdef HOWL
95 292879ac 2004-12-26 alex
96 77f54693 2005-07-31 alex static sw_discovery My_Discovery_Session = NULL;
97 77f54693 2005-07-31 alex static sw_salt My_Salt;
98 292879ac 2004-12-26 alex
99 77f54693 2005-07-31 alex static sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, sw_discovery_oid Id, sw_opaque Extra );
100 292879ac 2004-12-26 alex
101 292879ac 2004-12-26 alex #endif /* Howl */
102 292879ac 2004-12-26 alex
103 292879ac 2004-12-26 alex
104 8adff592 2005-03-19 fw GLOBAL void Rendezvous_Init( void )
105 aa152579 2003-02-23 alex {
106 aa152579 2003-02-23 alex /* Initialize structures */
107 aa152579 2003-02-23 alex
108 8adff592 2005-03-19 fw int i;
109 aa152579 2003-02-23 alex
110 292879ac 2004-12-26 alex #ifdef HOWL
111 292879ac 2004-12-26 alex if( sw_discovery_init( &My_Discovery_Session ) != SW_OKAY )
112 aa152579 2003-02-23 alex {
113 292879ac 2004-12-26 alex Log( LOG_EMERG, "Can't initialize Rendezvous (Howl): sw_discovery_init() failed!" );
114 292879ac 2004-12-26 alex Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
115 292879ac 2004-12-26 alex exit( 1 );
116 aa152579 2003-02-23 alex }
117 5049c5c6 2004-12-26 alex
118 5049c5c6 2004-12-26 alex if( sw_discovery_salt( My_Discovery_Session, &My_Salt ) != SW_OKAY )
119 5049c5c6 2004-12-26 alex {
120 5049c5c6 2004-12-26 alex Log( LOG_EMERG, "Can't initialize Rendezvous (Howl): sw_discovery_salt() failed!" );
121 5049c5c6 2004-12-26 alex Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
122 5049c5c6 2004-12-26 alex exit( 1 );
123 5049c5c6 2004-12-26 alex }
124 292879ac 2004-12-26 alex #endif
125 292879ac 2004-12-26 alex
126 292879ac 2004-12-26 alex for( i = 0; i < MAX_RENDEZVOUS; i++ ) My_Rendezvous[i].Desc[0] = '\0';
127 aa152579 2003-02-23 alex } /* Rendezvous_Init */
128 aa152579 2003-02-23 alex
129 aa152579 2003-02-23 alex
130 8adff592 2005-03-19 fw GLOBAL void Rendezvous_Exit( void )
131 aa152579 2003-02-23 alex {
132 aa152579 2003-02-23 alex /* Clean up & exit module */
133 aa152579 2003-02-23 alex
134 8adff592 2005-03-19 fw int i;
135 aa152579 2003-02-23 alex
136 aa152579 2003-02-23 alex for( i = 0; i < MAX_RENDEZVOUS; i++ )
137 aa152579 2003-02-23 alex {
138 292879ac 2004-12-26 alex if( My_Rendezvous[i].Desc[0] ) Unregister( i );
139 aa152579 2003-02-23 alex }
140 292879ac 2004-12-26 alex
141 292879ac 2004-12-26 alex #ifdef HOWL
142 292879ac 2004-12-26 alex sw_discovery_fina( My_Discovery_Session );
143 292879ac 2004-12-26 alex #endif
144 aa152579 2003-02-23 alex } /* Rendezvous_Exit */
145 aa152579 2003-02-23 alex
146 aa152579 2003-02-23 alex
147 dd3a3bc6 2006-05-10 alex GLOBAL bool Rendezvous_Register( char *Name, char *Type, UINT16 Port )
148 aa152579 2003-02-23 alex {
149 aa152579 2003-02-23 alex /* Register new service */
150 aa152579 2003-02-23 alex
151 8adff592 2005-03-19 fw int i;
152 aa152579 2003-02-23 alex
153 aa152579 2003-02-23 alex /* Search free port structure */
154 292879ac 2004-12-26 alex for( i = 0; i < MAX_RENDEZVOUS; i++ ) if( ! My_Rendezvous[i].Desc[0] ) break;
155 aa152579 2003-02-23 alex if( i >= MAX_RENDEZVOUS )
156 aa152579 2003-02-23 alex {
157 aa152579 2003-02-23 alex Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: limit (%d) reached!", Name, MAX_RENDEZVOUS );
158 8adff592 2005-03-19 fw return false;
159 aa152579 2003-02-23 alex }
160 aa152579 2003-02-23 alex strlcpy( My_Rendezvous[i].Desc, Name, sizeof( My_Rendezvous[i].Desc ));
161 aa152579 2003-02-23 alex
162 292879ac 2004-12-26 alex #ifdef APPLE
163 aa152579 2003-02-23 alex /* Register new service */
164 292879ac 2004-12-26 alex My_Rendezvous[i].Discovery_Ref = DNSServiceRegistrationCreate( Name, Type, "", htonl( Port ), "", Registration_Reply_Handler, &My_Rendezvous[i] );
165 aa152579 2003-02-23 alex if( ! My_Rendezvous[i].Discovery_Ref )
166 aa152579 2003-02-23 alex {
167 aa152579 2003-02-23 alex Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: can't register service!", My_Rendezvous[i].Desc );
168 292879ac 2004-12-26 alex My_Rendezvous[i].Desc[0] = '\0';
169 8adff592 2005-03-19 fw return false;
170 aa152579 2003-02-23 alex }
171 aa152579 2003-02-23 alex
172 aa152579 2003-02-23 alex /* Get and save the corresponding Mach Port */
173 aa152579 2003-02-23 alex My_Rendezvous[i].Mach_Port = DNSServiceDiscoveryMachPort( My_Rendezvous[i].Discovery_Ref );
174 aa152579 2003-02-23 alex if( ! My_Rendezvous[i].Mach_Port )
175 aa152579 2003-02-23 alex {
176 aa152579 2003-02-23 alex Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: got no Mach Port!", My_Rendezvous[i].Desc );
177 aa152579 2003-02-23 alex /* Here we actually leek a descriptor :-( */
178 aa152579 2003-02-23 alex My_Rendezvous[i].Discovery_Ref = 0;
179 292879ac 2004-12-26 alex My_Rendezvous[i].Desc[0] = '\0';
180 8adff592 2005-03-19 fw return false;
181 aa152579 2003-02-23 alex }
182 292879ac 2004-12-26 alex #endif /* Apple */
183 aa152579 2003-02-23 alex
184 292879ac 2004-12-26 alex #ifdef HOWL
185 292879ac 2004-12-26 alex if( sw_discovery_publish( My_Discovery_Session, 0, Name, Type, NULL, NULL, Port, NULL, 0, Registration_Reply_Handler, &My_Rendezvous[i], &My_Rendezvous[i].Id ) != SW_OKAY )
186 292879ac 2004-12-26 alex {
187 292879ac 2004-12-26 alex Log( LOG_ERR, "Can't register \"%s\" with Rendezvous: can't register service!", My_Rendezvous[i].Desc );
188 292879ac 2004-12-26 alex My_Rendezvous[i].Desc[0] = '\0';
189 8adff592 2005-03-19 fw return false;
190 292879ac 2004-12-26 alex }
191 292879ac 2004-12-26 alex #endif /* Howl */
192 292879ac 2004-12-26 alex
193 aa152579 2003-02-23 alex Log( LOG_DEBUG, "Rendezvous: Registering \"%s\" ...", My_Rendezvous[i].Desc );
194 8adff592 2005-03-19 fw return true;
195 aa152579 2003-02-23 alex } /* Rendezvous_Register */
196 aa152579 2003-02-23 alex
197 aa152579 2003-02-23 alex
198 8adff592 2005-03-19 fw GLOBAL bool Rendezvous_Unregister( char *Name )
199 aa152579 2003-02-23 alex {
200 aa152579 2003-02-23 alex /* Unregister service from rendezvous */
201 aa152579 2003-02-23 alex
202 8adff592 2005-03-19 fw int i;
203 8adff592 2005-03-19 fw bool ok;
204 aa152579 2003-02-23 alex
205 8adff592 2005-03-19 fw ok = false;
206 aa152579 2003-02-23 alex for( i = 0; i < MAX_RENDEZVOUS; i++ )
207 aa152579 2003-02-23 alex {
208 aa152579 2003-02-23 alex if( strcmp( Name, My_Rendezvous[i].Desc ) == 0 )
209 aa152579 2003-02-23 alex {
210 aa152579 2003-02-23 alex Unregister( i );
211 8adff592 2005-03-19 fw ok = true;
212 aa152579 2003-02-23 alex }
213 aa152579 2003-02-23 alex }
214 aa152579 2003-02-23 alex
215 aa152579 2003-02-23 alex return ok;
216 aa152579 2003-02-23 alex } /* Rendezvous_Unregister */
217 aa152579 2003-02-23 alex
218 aa152579 2003-02-23 alex
219 8adff592 2005-03-19 fw GLOBAL void Rendezvous_UnregisterListeners( void )
220 aa152579 2003-02-23 alex {
221 aa152579 2003-02-23 alex /* Unregister all our listening sockets from Rendezvous */
222 aa152579 2003-02-23 alex
223 8adff592 2005-03-19 fw int i;
224 aa152579 2003-02-23 alex
225 aa152579 2003-02-23 alex for( i = 0; i < MAX_RENDEZVOUS; i++ )
226 aa152579 2003-02-23 alex {
227 292879ac 2004-12-26 alex if( My_Rendezvous[i].Desc[0] ) Unregister( i );
228 aa152579 2003-02-23 alex }
229 aa152579 2003-02-23 alex } /* Rendezvous_UnregisterListeners */
230 aa152579 2003-02-23 alex
231 aa152579 2003-02-23 alex
232 8adff592 2005-03-19 fw GLOBAL void Rendezvous_Handler( void )
233 aa152579 2003-02-23 alex {
234 aa152579 2003-02-23 alex /* Handle all Rendezvous stuff; this function must be called
235 aa152579 2003-02-23 alex * periodically from the run loop of the main program */
236 aa152579 2003-02-23 alex
237 292879ac 2004-12-26 alex #ifdef APPLE
238 8adff592 2005-03-19 fw int i;
239 8adff592 2005-03-19 fw char buffer[MAX_MACH_MSG_SIZE];
240 aa152579 2003-02-23 alex mach_msg_return_t result;
241 aa152579 2003-02-23 alex mach_msg_header_t *msg;
242 aa152579 2003-02-23 alex
243 aa152579 2003-02-23 alex for( i = 0; i < MAX_RENDEZVOUS; i++ )
244 aa152579 2003-02-23 alex {
245 aa152579 2003-02-23 alex if( ! My_Rendezvous[i].Discovery_Ref ) continue;
246 aa152579 2003-02-23 alex
247 aa152579 2003-02-23 alex /* Read message from Mach Port */
248 aa152579 2003-02-23 alex msg = (mach_msg_header_t *)buffer;
249 aa152579 2003-02-23 alex result = mach_msg( msg, MACH_RCV_MSG|MACH_RCV_TIMEOUT, 0, MAX_MACH_MSG_SIZE, My_Rendezvous[i].Mach_Port, 1, 0 );
250 aa152579 2003-02-23 alex
251 aa152579 2003-02-23 alex /* Handle message */
252 aa152579 2003-02-23 alex if( result == MACH_MSG_SUCCESS ) DNSServiceDiscovery_handleReply( msg );
253 aa152579 2003-02-23 alex #ifdef DEBUG
254 8adff592 2005-03-19 fw else if( result != MACH_RCV_TIMED_OUT ) Log( LOG_DEBUG, "mach_msg(): %ld", (long)result );
255 292879ac 2004-12-26 alex #endif /* Debug */
256 aa152579 2003-02-23 alex }
257 292879ac 2004-12-26 alex #endif /* Apple */
258 292879ac 2004-12-26 alex
259 292879ac 2004-12-26 alex #ifdef HOWL
260 5049c5c6 2004-12-26 alex sw_ulong msecs = 10;
261 5049c5c6 2004-12-26 alex sw_salt_step( My_Salt, &msecs );
262 292879ac 2004-12-26 alex #endif
263 aa152579 2003-02-23 alex } /* Rendezvous_Handler */
264 aa152579 2003-02-23 alex
265 aa152579 2003-02-23 alex
266 77f54693 2005-07-31 alex static void Unregister( int Idx )
267 292879ac 2004-12-26 alex {
268 292879ac 2004-12-26 alex /* Unregister service */
269 292879ac 2004-12-26 alex
270 292879ac 2004-12-26 alex #ifdef APPLE
271 292879ac 2004-12-26 alex DNSServiceDiscoveryDeallocate( My_Rendezvous[Idx].Discovery_Ref );
272 292879ac 2004-12-26 alex #endif /* Apple */
273 292879ac 2004-12-26 alex
274 292879ac 2004-12-26 alex #ifdef HOWL
275 292879ac 2004-12-26 alex if( sw_discovery_cancel( My_Discovery_Session, My_Rendezvous[Idx].Id ) != SW_OKAY )
276 292879ac 2004-12-26 alex {
277 292879ac 2004-12-26 alex Log( LOG_ERR, "Rendezvous: Failed to unregister \"%s\"!", My_Rendezvous[Idx].Desc );
278 292879ac 2004-12-26 alex return;
279 292879ac 2004-12-26 alex }
280 292879ac 2004-12-26 alex #endif /* Howl */
281 292879ac 2004-12-26 alex
282 292879ac 2004-12-26 alex Log( LOG_INFO, "Unregistered \"%s\" from Rendezvous.", My_Rendezvous[Idx].Desc );
283 292879ac 2004-12-26 alex My_Rendezvous[Idx].Desc[0] = '\0';
284 292879ac 2004-12-26 alex } /* Unregister */
285 292879ac 2004-12-26 alex
286 292879ac 2004-12-26 alex
287 292879ac 2004-12-26 alex /* -- Apple API -- */
288 292879ac 2004-12-26 alex
289 292879ac 2004-12-26 alex #ifdef APPLE
290 292879ac 2004-12-26 alex
291 292879ac 2004-12-26 alex
292 77f54693 2005-07-31 alex static void Registration_Reply_Handler( DNSServiceRegistrationReplyErrorType ErrCode, void *Context )
293 aa152579 2003-02-23 alex {
294 292879ac 2004-12-26 alex SERVICE *s = (SERVICE *)Context;
295 8adff592 2005-03-19 fw char txt[50];
296 aa152579 2003-02-23 alex
297 aa152579 2003-02-23 alex if( ErrCode == kDNSServiceDiscoveryNoError )
298 aa152579 2003-02-23 alex {
299 aa152579 2003-02-23 alex /* Success! */
300 292879ac 2004-12-26 alex Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", s->Desc );
301 aa152579 2003-02-23 alex return;
302 aa152579 2003-02-23 alex }
303 aa152579 2003-02-23 alex
304 aa152579 2003-02-23 alex switch( ErrCode )
305 aa152579 2003-02-23 alex {
306 aa152579 2003-02-23 alex case kDNSServiceDiscoveryAlreadyRegistered:
307 aa152579 2003-02-23 alex strcpy( txt, "name already registered!" );
308 aa152579 2003-02-23 alex break;
309 aa152579 2003-02-23 alex case kDNSServiceDiscoveryNameConflict:
310 aa152579 2003-02-23 alex strcpy( txt, "name conflict!" );
311 aa152579 2003-02-23 alex break;
312 aa152579 2003-02-23 alex default:
313 dd3a3bc6 2006-05-10 alex snprintf(txt, sizeof txt, "error code %ld!",
314 dd3a3bc6 2006-05-10 alex (long)ErrCode);
315 aa152579 2003-02-23 alex }
316 aa152579 2003-02-23 alex
317 292879ac 2004-12-26 alex Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
318 292879ac 2004-12-26 alex s->Desc[0] = '\0';
319 aa152579 2003-02-23 alex } /* Registration_Reply_Handler */
320 aa152579 2003-02-23 alex
321 aa152579 2003-02-23 alex
322 292879ac 2004-12-26 alex #endif /* Apple */
323 292879ac 2004-12-26 alex
324 292879ac 2004-12-26 alex
325 292879ac 2004-12-26 alex /* -- Howl API -- */
326 292879ac 2004-12-26 alex
327 292879ac 2004-12-26 alex #ifdef HOWL
328 292879ac 2004-12-26 alex
329 292879ac 2004-12-26 alex
330 77f54693 2005-07-31 alex static sw_result HOWL_API Registration_Reply_Handler( sw_discovery Session, sw_discovery_publish_status Status, UNUSED sw_discovery_oid Id, sw_opaque Extra )
331 aa152579 2003-02-23 alex {
332 292879ac 2004-12-26 alex SERVICE *s = (SERVICE *)Extra;
333 8adff592 2005-03-19 fw char txt[50];
334 aa152579 2003-02-23 alex
335 292879ac 2004-12-26 alex assert( Session == My_Discovery_Session );
336 292879ac 2004-12-26 alex assert( Extra != NULL );
337 aa152579 2003-02-23 alex
338 292879ac 2004-12-26 alex if( Status == SW_DISCOVERY_PUBLISH_STARTED || Status == SW_DISCOVERY_PUBLISH_STOPPED )
339 292879ac 2004-12-26 alex {
340 292879ac 2004-12-26 alex /* Success! */
341 292879ac 2004-12-26 alex Log( LOG_INFO, "Successfully registered \"%s\" with Rendezvous.", s->Desc );
342 292879ac 2004-12-26 alex return SW_OKAY;
343 292879ac 2004-12-26 alex }
344 292879ac 2004-12-26 alex
345 292879ac 2004-12-26 alex switch( Status )
346 292879ac 2004-12-26 alex {
347 292879ac 2004-12-26 alex case SW_DISCOVERY_PUBLISH_NAME_COLLISION:
348 292879ac 2004-12-26 alex strcpy( txt, "name conflict!" );
349 292879ac 2004-12-26 alex break;
350 292879ac 2004-12-26 alex default:
351 dd3a3bc6 2006-05-10 alex snprintf(txt, sizeof txt, "error code %ld!",
352 dd3a3bc6 2006-05-10 alex (long)Status);
353 292879ac 2004-12-26 alex }
354 aa152579 2003-02-23 alex
355 292879ac 2004-12-26 alex Log( LOG_INFO, "Can't register \"%s\" with Rendezvous: %s", s->Desc, txt );
356 292879ac 2004-12-26 alex s->Desc[0] = '\0';
357 292879ac 2004-12-26 alex
358 292879ac 2004-12-26 alex return SW_OKAY;
359 292879ac 2004-12-26 alex } /* Registration_Reply_Handler */
360 292879ac 2004-12-26 alex
361 292879ac 2004-12-26 alex
362 292879ac 2004-12-26 alex #endif /* Howl */
363 292879ac 2004-12-26 alex
364 292879ac 2004-12-26 alex
365 02b0a515 2005-07-08 alex #endif /* ZEROCONF */
366 aa152579 2003-02-23 alex
367 aa152579 2003-02-23 alex
368 aa152579 2003-02-23 alex /* -eof- */