13dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin/* -*- Mode: C; tab-width: 4 -*-
23dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin *
33dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved.
43dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin *
53dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin * Licensed under the Apache License, Version 2.0 (the "License");
63dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin * you may not use this file except in compliance with the License.
73dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin * You may obtain a copy of the License at
83dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin *
93dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin *     http://www.apache.org/licenses/LICENSE-2.0
103dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin *
113dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin * Unless required by applicable law or agreed to in writing, software
123dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin * distributed under the License is distributed on an "AS IS" BASIS,
133dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin * See the License for the specific language governing permissions and
153dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin * limitations under the License.
163dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin */
173dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
183dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin#ifndef	__MDNS_WIN32__
193dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin#define	__MDNS_WIN32__
203dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
213dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin#include	"CommonServices.h"
223dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
233dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin#if( !defined( _WIN32_WCE ) )
243dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	#include	<mswsock.h>
253dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin#endif
263dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
273dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin#include	"mDNSEmbeddedAPI.h"
283dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin#include	"uDNS.h"
293dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
303dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin#ifdef	__cplusplus
313dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	extern "C" {
323dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin#endif
333dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
343dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
353dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlintypedef struct Overlapped
363dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin{
373dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	BOOL		pending;
383dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	OVERLAPPED	data;
393dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	WSABUF		wbuf;
403dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	DWORD		error;
413dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	DWORD		bytesTransferred;
423dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSAddr	srcAddr;
433dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSIPPort	srcPort;
443dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSAddr	dstAddr;
453dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSIPPort	dstPort;
463dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin} Overlapped;
473dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
483dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
493dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlintypedef void ( *TCPReadEventHandler )( TCPSocket * sock );
503dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlintypedef void ( *TCPUserCallback )();
513dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
523dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinstruct TCPSocket_struct
533dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin{
543dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	TCPSocketFlags				flags;		// MUST BE FIRST FIELD -- mDNSCore expects every TCPSocket_struct to begin with TCPSocketFlags flags
553dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	SOCKET						fd;
563dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	TCPReadEventHandler			readEventHandler;
573dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	HANDLE						connectEvent;
583dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	BOOL						connected;
593dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	TCPUserCallback				userCallback;
603dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	void					*	userContext;
613dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	Overlapped					overlapped;
623dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	DWORD						lastError;
633dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	BOOL						closed;
643dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	uint8_t						bbuf[ 4192 ];
653dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	uint8_t					*	bptr;
663dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	uint8_t					*	eptr;
673dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	uint8_t					*	ebuf;
683dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	TCPSocket				*	nextDispatchable;
693dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNS					*	m;
703dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin};
713dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
723dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
733dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinstruct UDPSocket_struct
743dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin{
753dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSIPPort						port; 			// MUST BE FIRST FIELD -- mDNSCoreReceive expects every UDPSocket_struct to begin with mDNSIPPort port
763dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSAddr						addr;			// This is initialized by our code. If we don't get the
773dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin													// dstAddr from WSARecvMsg we use this value instead.
783dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	SOCKET							fd;
793dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	LPFN_WSARECVMSG					recvMsgPtr;
803dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	Overlapped						overlapped;
813dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	WSAMSG							wmsg;
823dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	DNSMessage						packet;
833dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	uint8_t							controlBuffer[ 128 ];
843dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	struct sockaddr_storage			srcAddr;		// This is filled in by the WSARecv* function
853dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	INT								srcAddrLen;		// See above
863dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	struct mDNSInterfaceData	*	ifd;
873dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	UDPSocket					*	nextDispatchable;
883dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	UDPSocket					*	next;
893dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNS						*	m;
903dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin};
913dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
923dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
933dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin//---------------------------------------------------------------------------------------------------------------------------
943dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin/*!	@struct		mDNSInterfaceData
953dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
963dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	@abstract	Structure containing interface-specific data.
973dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin*/
983dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
993dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlintypedef struct	mDNSInterfaceData	mDNSInterfaceData;
1003dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinstruct	mDNSInterfaceData
1013dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin{
1023dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	char						name[ 128 ];
1033dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	uint32_t					index;
1043dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	uint32_t					scopeID;
1053dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	struct UDPSocket_struct		sock;
1063dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	NetworkInterfaceInfo		interfaceInfo;
1073dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSBool					hostRegistered;
1083dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSInterfaceData		*	next;
1093dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin};
1103dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1113dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1123dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin//---------------------------------------------------------------------------------------------------------------------------
1133dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin/*!	@typedef	RegisterWaitableEventHandler
1143dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin*/
1153dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlintypedef void		(*RegisterWaitableEventHandler)(mDNS * const inMDNS, HANDLE event, void * context );
1163dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1173dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin//---------------------------------------------------------------------------------------------------------------------------
1183dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin/*!	@typedef	RegisterWaitableEventFunc
1193dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin*/
1203dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlintypedef mStatus		(*RegisterWaitableEventFunc)(mDNS * const inMDNS, HANDLE event, void * context, RegisterWaitableEventHandler handler );
1213dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1223dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin//---------------------------------------------------------------------------------------------------------------------------
1233dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin/*!	@typedef	UnregisterWaitableEventHandler
1243dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin*/
1253dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlintypedef void		(*UnregisterWaitableEventFunc)(mDNS * const inMDNS, HANDLE event );
1263dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1273dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin//---------------------------------------------------------------------------------------------------------------------------
1283dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin/*!	@typedef	ReportStatusFunc
1293dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin*/
1303dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlintypedef void		(*ReportStatusFunc)(int inType, const char *inFormat, ...);
1313dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1323dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1333dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin//---------------------------------------------------------------------------------------------------------------------------
1343dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin/*!	@struct		mDNS_PlatformSupport_struct
1353dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1363dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	@abstract	Structure containing platform-specific data.
1373dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin*/
1383dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1393dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinstruct	mDNS_PlatformSupport_struct
1403dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin{
1413dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	HANDLE						mainThread;
1423dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	HANDLE						checkFileSharesTimer;
1433dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSs32						checkFileSharesTimeout;
1443dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	RegisterWaitableEventFunc	registerWaitableEventFunc;
1453dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	UnregisterWaitableEventFunc	unregisterWaitableEventFunc;
1463dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	ReportStatusFunc			reportStatusFunc;
1473dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	time_t						nextDHCPLeaseExpires;
1483dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	char						nbname[ 32 ];
1493dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	char						nbdomain[ 32 ];
1503dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSBool					smbFileSharing;
1513dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSBool					smbPrintSharing;
1523dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	ServiceRecordSet			smbSRS;
1533dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	AuthRecord					smbSubTypes[ 2 ];
1543dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSBool					registeredLoopback4;
1553dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	int							interfaceCount;
1563dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSInterfaceData *			interfaceList;
1573dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSInterfaceData *			inactiveInterfaceList;
1583dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	struct UDPSocket_struct		unicastSock4;
1593dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	struct UDPSocket_struct		unicastSock6;
1603dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin};
1613dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1623dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin//---------------------------------------------------------------------------------------------------------------------------
1633dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin/*!	@struct		ifaddrs
1643dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1653dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	@abstract	Interface information
1663dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin*/
1673dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1683dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinstruct ifaddrs
1693dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin{
1703dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	struct ifaddrs *	ifa_next;
1713dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	char *				ifa_name;
1723dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	u_int				ifa_flags;
1733dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	struct sockaddr	*	ifa_addr;
1743dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	struct sockaddr	*	ifa_netmask;
1753dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	struct sockaddr	*	ifa_broadaddr;
1763dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	struct sockaddr	*	ifa_dstaddr;
1773dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	BYTE				ifa_physaddr[6];
1783dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	BOOL				ifa_dhcpEnabled;
1793dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	time_t				ifa_dhcpLeaseExpires;
1803dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	mDNSu8				ifa_womp;
1813dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	void *				ifa_data;
1823dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1833dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	struct
1843dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	{
1853dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin		uint32_t		index;
1863dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1873dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	}	ifa_extra;
1883dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin};
1893dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1903dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
1913dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinextern void		InterfaceListDidChange( mDNS * const inMDNS );
1923dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinextern void		ComputerDescriptionDidChange( mDNS * const inMDNS );
1933dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinextern void		TCPIPConfigDidChange( mDNS * const inMDNS );
1943dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinextern void		DynDNSConfigDidChange( mDNS * const inMDNS );
1953dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinextern void		FileSharingDidChange( mDNS * const inMDNS );
1963dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinextern void		FirewallDidChange( mDNS * const inMDNS );
1973dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinextern mStatus  TCPAddSocket( mDNS * const inMDNS, TCPSocket *sock );
1983dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinextern mStatus	SetupInterfaceList( mDNS * const inMDNS );
1993dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinextern mStatus	TearDownInterfaceList( mDNS * const inMDNS );
2003dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinextern BOOL		IsWOMPEnabled();
2013dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlinextern void     DispatchSocketEvents( mDNS * const inMDNS );
2023dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
2033dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
2043dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin#ifdef	__cplusplus
2053dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin	}
2063dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin#endif
2073dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin
2083dfdc952a3e125868a0a4123e40e1f7fd868af21Casey Dahlin#endif	// __MDNS_WIN32__
209