/* -*- Mode: C; tab-width: 4 -*- * * Copyright (c) 2002-2004 Apple Computer, Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __MDNS_WIN32__ #define __MDNS_WIN32__ #include "CommonServices.h" #if( !defined( _WIN32_WCE ) ) #include #endif #include "mDNSEmbeddedAPI.h" #include "uDNS.h" #ifdef __cplusplus extern "C" { #endif typedef struct Overlapped { BOOL pending; OVERLAPPED data; WSABUF wbuf; DWORD error; DWORD bytesTransferred; mDNSAddr srcAddr; mDNSIPPort srcPort; mDNSAddr dstAddr; mDNSIPPort dstPort; } Overlapped; typedef void ( *TCPReadEventHandler )( TCPSocket * sock ); typedef void ( *TCPUserCallback )(); struct TCPSocket_struct { TCPSocketFlags flags; // MUST BE FIRST FIELD -- mDNSCore expects every TCPSocket_struct to begin with TCPSocketFlags flags SOCKET fd; TCPReadEventHandler readEventHandler; HANDLE connectEvent; BOOL connected; TCPUserCallback userCallback; void * userContext; Overlapped overlapped; DWORD lastError; BOOL closed; uint8_t bbuf[ 4192 ]; uint8_t * bptr; uint8_t * eptr; uint8_t * ebuf; TCPSocket * nextDispatchable; mDNS * m; }; struct UDPSocket_struct { mDNSIPPort port; // MUST BE FIRST FIELD -- mDNSCoreReceive expects every UDPSocket_struct to begin with mDNSIPPort port mDNSAddr addr; // This is initialized by our code. If we don't get the // dstAddr from WSARecvMsg we use this value instead. SOCKET fd; LPFN_WSARECVMSG recvMsgPtr; Overlapped overlapped; WSAMSG wmsg; DNSMessage packet; uint8_t controlBuffer[ 128 ]; struct sockaddr_storage srcAddr; // This is filled in by the WSARecv* function INT srcAddrLen; // See above struct mDNSInterfaceData * ifd; UDPSocket * nextDispatchable; UDPSocket * next; mDNS * m; }; //--------------------------------------------------------------------------------------------------------------------------- /*! @struct mDNSInterfaceData @abstract Structure containing interface-specific data. */ typedef struct mDNSInterfaceData mDNSInterfaceData; struct mDNSInterfaceData { char name[ 128 ]; uint32_t index; uint32_t scopeID; struct UDPSocket_struct sock; NetworkInterfaceInfo interfaceInfo; mDNSBool hostRegistered; mDNSInterfaceData * next; }; //--------------------------------------------------------------------------------------------------------------------------- /*! @typedef RegisterWaitableEventHandler */ typedef void (*RegisterWaitableEventHandler)(mDNS * const inMDNS, HANDLE event, void * context ); //--------------------------------------------------------------------------------------------------------------------------- /*! @typedef RegisterWaitableEventFunc */ typedef mStatus (*RegisterWaitableEventFunc)(mDNS * const inMDNS, HANDLE event, void * context, RegisterWaitableEventHandler handler ); //--------------------------------------------------------------------------------------------------------------------------- /*! @typedef UnregisterWaitableEventHandler */ typedef void (*UnregisterWaitableEventFunc)(mDNS * const inMDNS, HANDLE event ); //--------------------------------------------------------------------------------------------------------------------------- /*! @typedef ReportStatusFunc */ typedef void (*ReportStatusFunc)(int inType, const char *inFormat, ...); //--------------------------------------------------------------------------------------------------------------------------- /*! @struct mDNS_PlatformSupport_struct @abstract Structure containing platform-specific data. */ struct mDNS_PlatformSupport_struct { HANDLE mainThread; HANDLE checkFileSharesTimer; mDNSs32 checkFileSharesTimeout; RegisterWaitableEventFunc registerWaitableEventFunc; UnregisterWaitableEventFunc unregisterWaitableEventFunc; ReportStatusFunc reportStatusFunc; time_t nextDHCPLeaseExpires; char nbname[ 32 ]; char nbdomain[ 32 ]; mDNSBool smbFileSharing; mDNSBool smbPrintSharing; ServiceRecordSet smbSRS; AuthRecord smbSubTypes[ 2 ]; mDNSBool registeredLoopback4; int interfaceCount; mDNSInterfaceData * interfaceList; mDNSInterfaceData * inactiveInterfaceList; struct UDPSocket_struct unicastSock4; struct UDPSocket_struct unicastSock6; }; //--------------------------------------------------------------------------------------------------------------------------- /*! @struct ifaddrs @abstract Interface information */ struct ifaddrs { struct ifaddrs * ifa_next; char * ifa_name; u_int ifa_flags; struct sockaddr * ifa_addr; struct sockaddr * ifa_netmask; struct sockaddr * ifa_broadaddr; struct sockaddr * ifa_dstaddr; BYTE ifa_physaddr[6]; BOOL ifa_dhcpEnabled; time_t ifa_dhcpLeaseExpires; mDNSu8 ifa_womp; void * ifa_data; struct { uint32_t index; } ifa_extra; }; extern void InterfaceListDidChange( mDNS * const inMDNS ); extern void ComputerDescriptionDidChange( mDNS * const inMDNS ); extern void TCPIPConfigDidChange( mDNS * const inMDNS ); extern void DynDNSConfigDidChange( mDNS * const inMDNS ); extern void FileSharingDidChange( mDNS * const inMDNS ); extern void FirewallDidChange( mDNS * const inMDNS ); extern mStatus TCPAddSocket( mDNS * const inMDNS, TCPSocket *sock ); extern mStatus SetupInterfaceList( mDNS * const inMDNS ); extern mStatus TearDownInterfaceList( mDNS * const inMDNS ); extern BOOL IsWOMPEnabled(); extern void DispatchSocketEvents( mDNS * const inMDNS ); #ifdef __cplusplus } #endif #endif // __MDNS_WIN32__