]> git.saurik.com Git - apple/mdnsresponder.git/blobdiff - mDNSWindows/DLLStub/DLLStub.cpp
mDNSResponder-212.1.tar.gz
[apple/mdnsresponder.git] / mDNSWindows / DLLStub / DLLStub.cpp
diff --git a/mDNSWindows/DLLStub/DLLStub.cpp b/mDNSWindows/DLLStub/DLLStub.cpp
new file mode 100755 (executable)
index 0000000..c39a747
--- /dev/null
@@ -0,0 +1,693 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ *
+ * Copyright (c) 2009, Apple Computer, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1.  Redistributions of source code must retain the above copyright notice,
+ *     this list of conditions and the following disclaimer.
+ * 2.  Redistributions in binary form must reproduce the above copyright notice,
+ *     this list of conditions and the following disclaimer in the documentation
+ *     and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of its
+ *     contributors may be used to endorse or promote products derived from this
+ *     software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "DLLStub.h"
+
+static int             g_defaultErrorCode = kDNSServiceErr_Unknown;
+static DLLStub g_glueLayer;
+
+
+// ------------------------------------------
+// DLLStub implementation
+// ------------------------------------------
+DLLStub * DLLStub::m_instance;
+
+DLLStub::DLLStub()
+:
+       m_library( LoadLibrary( TEXT( "dnssd.dll" ) ) )
+{
+       m_instance = this;
+}
+
+
+DLLStub::~DLLStub()
+{
+       if ( m_library != NULL )
+       {
+               FreeLibrary( m_library );
+               m_library = NULL;
+       }
+
+       m_instance = NULL;
+}
+
+
+bool
+DLLStub::GetProcAddress( FARPROC * func, LPCSTR lpProcName )
+{ 
+       if ( m_instance && m_instance->m_library )
+       {
+               // Only call ::GetProcAddress if *func is NULL. This allows
+               // the calling code to cache the funcptr value, and we get
+               // some performance benefit.
+
+               if ( *func == NULL )
+               {
+                       *func = ::GetProcAddress( m_instance->m_library, lpProcName );
+               }
+       }
+       else
+       {
+               *func = NULL;
+       }
+
+       return ( *func != NULL );
+}
+
+
+int DNSSD_API
+DNSServiceRefSockFD(DNSServiceRef sdRef)
+{
+       typedef int (DNSSD_API * Func)(DNSServiceRef sdRef);
+       static Func func = NULL;
+       int ret = -1;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( sdRef );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceProcessResult(DNSServiceRef sdRef)
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)(DNSServiceRef sdRef);
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( sdRef );
+       }
+       
+       return ret;
+}
+
+
+void DNSSD_API
+DNSServiceRefDeallocate(DNSServiceRef sdRef)
+{
+       typedef void (DNSSD_API * Func)(DNSServiceRef sdRef);
+       static Func func = NULL;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               func( sdRef );
+       }
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceEnumerateDomains
+               (
+               DNSServiceRef                       *sdRef,
+               DNSServiceFlags                     flags,
+               uint32_t                            interfaceIndex,
+               DNSServiceDomainEnumReply           callBack,
+               void                                *context
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)(DNSServiceRef*, DNSServiceFlags, uint32_t, DNSServiceDomainEnumReply, void* );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( sdRef, flags, interfaceIndex, callBack, context );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceRegister
+               (
+               DNSServiceRef                       *sdRef,
+               DNSServiceFlags                     flags,
+               uint32_t                            interfaceIndex,
+               const char                          *name,
+               const char                          *regtype,
+               const char                          *domain,
+               const char                          *host,
+               uint16_t                            port,
+               uint16_t                            txtLen,
+               const void                          *txtRecord,
+               DNSServiceRegisterReply             callBack,
+               void                                *context
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)(DNSServiceRef*, DNSServiceFlags, uint32_t, const char*, const char*, const char*, const char*, uint16_t, uint16_t, const void*, DNSServiceRegisterReply, void* );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( sdRef, flags, interfaceIndex, name, regtype, domain, host, port, txtLen, txtRecord, callBack, context );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceAddRecord
+               (
+               DNSServiceRef                       sdRef,
+               DNSRecordRef                        *RecordRef,
+               DNSServiceFlags                     flags,
+               uint16_t                            rrtype,
+               uint16_t                            rdlen,
+               const void                          *rdata,
+               uint32_t                            ttl
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)(DNSServiceRef, DNSRecordRef*, DNSServiceFlags, uint16_t, uint16_t, const void*, uint32_t );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( sdRef, RecordRef, flags, rrtype, rdlen, rdata, ttl );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceUpdateRecord
+               (
+               DNSServiceRef                       sdRef,
+               DNSRecordRef                        RecordRef,     /* may be NULL */
+               DNSServiceFlags                     flags,
+               uint16_t                            rdlen,
+               const void                          *rdata,
+               uint32_t                            ttl
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)(DNSServiceRef, DNSRecordRef, DNSServiceFlags, uint16_t, const void*, uint32_t );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( sdRef, RecordRef, flags, rdlen, rdata, ttl );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceRemoveRecord
+               (
+               DNSServiceRef                 sdRef,
+               DNSRecordRef                  RecordRef,
+               DNSServiceFlags               flags
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)(DNSServiceRef, DNSRecordRef, DNSServiceFlags );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( sdRef, RecordRef, flags );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceBrowse
+               (
+               DNSServiceRef                       *sdRef,
+               DNSServiceFlags                     flags,
+               uint32_t                            interfaceIndex,
+               const char                          *regtype,
+               const char                          *domain,    /* may be NULL */
+               DNSServiceBrowseReply               callBack,
+               void                                *context    /* may be NULL */
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)(DNSServiceRef*, DNSServiceFlags, uint32_t, const char*, const char*, DNSServiceBrowseReply, void* );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( sdRef, flags, interfaceIndex, regtype, domain, callBack, context );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceResolve
+               (
+               DNSServiceRef                       *sdRef,
+               DNSServiceFlags                     flags,
+               uint32_t                            interfaceIndex,
+               const char                          *name,
+               const char                          *regtype,
+               const char                          *domain,
+               DNSServiceResolveReply              callBack,
+               void                                *context  /* may be NULL */
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)(DNSServiceRef*, DNSServiceFlags, uint32_t, const char*, const char*, const char*, DNSServiceResolveReply, void* );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( sdRef, flags, interfaceIndex, name, regtype, domain, callBack, context );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceConstructFullName
+               (
+               char                            *fullName,
+               const char                      *service,      /* may be NULL */
+               const char                      *regtype,
+               const char                      *domain
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)( char*, const char*, const char*, const char* );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( fullName, service, regtype, domain );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceCreateConnection(DNSServiceRef *sdRef)
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)( DNSServiceRef* );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( sdRef );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceRegisterRecord
+               (
+               DNSServiceRef                       sdRef,
+               DNSRecordRef                        *RecordRef,
+               DNSServiceFlags                     flags,
+               uint32_t                            interfaceIndex,
+               const char                          *fullname,
+               uint16_t                            rrtype,
+               uint16_t                            rrclass,
+               uint16_t                            rdlen,
+               const void                          *rdata,
+               uint32_t                            ttl,
+               DNSServiceRegisterRecordReply       callBack,
+               void                                *context    /* may be NULL */
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)(DNSServiceRef, DNSRecordRef*, DNSServiceFlags, uint32_t, const char*, uint16_t, uint16_t, uint16_t, const void*, uint16_t, DNSServiceRegisterRecordReply, void* );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( sdRef, RecordRef, flags, interfaceIndex, fullname, rrtype, rrclass, rdlen, rdata, ttl, callBack, context );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceQueryRecord
+               (
+               DNSServiceRef                       *sdRef,
+               DNSServiceFlags                     flags,
+               uint32_t                            interfaceIndex,
+               const char                          *fullname,
+               uint16_t                            rrtype,
+               uint16_t                            rrclass,
+               DNSServiceQueryRecordReply          callBack,
+               void                                *context  /* may be NULL */
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)(DNSServiceRef*, DNSServiceFlags, uint32_t, const char*, uint16_t, uint16_t, DNSServiceQueryRecordReply, void* );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( sdRef, flags, interfaceIndex, fullname, rrtype, rrclass, callBack, context );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceReconfirmRecord
+               (
+               DNSServiceFlags                    flags,
+               uint32_t                           interfaceIndex,
+               const char                         *fullname,
+               uint16_t                           rrtype,
+               uint16_t                           rrclass,
+               uint16_t                           rdlen,
+               const void                         *rdata
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)( DNSServiceFlags, uint32_t, const char*, uint16_t, uint16_t, uint16_t, const void* );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( flags, interfaceIndex, fullname, rrtype, rrclass, rdlen, rdata );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceNATPortMappingCreate
+               (
+               DNSServiceRef                    *sdRef,
+               DNSServiceFlags                  flags,
+               uint32_t                         interfaceIndex,
+               DNSServiceProtocol               protocol,          /* TCP and/or UDP          */
+               uint16_t                         internalPort,      /* network byte order      */
+               uint16_t                         externalPort,      /* network byte order      */
+               uint32_t                         ttl,               /* time to live in seconds */
+               DNSServiceNATPortMappingReply    callBack,
+               void                             *context           /* may be NULL             */
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)(DNSServiceRef*, DNSServiceFlags, uint32_t, DNSServiceProtocol, uint16_t, uint16_t, uint16_t, DNSServiceNATPortMappingReply, void* );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( sdRef, flags, interfaceIndex, protocol, internalPort, externalPort, ttl, callBack, context );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceGetAddrInfo
+               (
+               DNSServiceRef                    *sdRef,
+               DNSServiceFlags                  flags,
+               uint32_t                         interfaceIndex,
+               DNSServiceProtocol               protocol,
+               const char                       *hostname,
+               DNSServiceGetAddrInfoReply       callBack,
+               void                             *context          /* may be NULL */
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)(DNSServiceRef*, DNSServiceFlags, uint32_t, DNSServiceProtocol, const char*, DNSServiceGetAddrInfoReply, void* );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( sdRef, flags, interfaceIndex, protocol, hostname, callBack, context );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+DNSServiceGetProperty
+               (
+               const char *property,  /* Requested property (i.e. kDNSServiceProperty_DaemonVersion) */
+               void       *result,    /* Pointer to place to store result */
+               uint32_t   *size       /* size of result location */
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)( const char*, void*, uint32_t* );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( property, result, size );
+       }
+       
+       return ret;
+}
+
+
+void DNSSD_API
+TXTRecordCreate
+               (
+               TXTRecordRef     *txtRecord,
+               uint16_t         bufferLen,
+               void             *buffer
+               )
+{
+       typedef void (DNSSD_API * Func)( TXTRecordRef*, uint16_t, void* );
+       static Func func = NULL;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               func( txtRecord, bufferLen, buffer );
+       }
+}
+
+
+void DNSSD_API
+TXTRecordDeallocate
+               (
+               TXTRecordRef     *txtRecord
+               )
+{
+       typedef void (DNSSD_API * Func)( TXTRecordRef* );
+       static Func func = NULL;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               func( txtRecord );
+       }
+}
+
+
+DNSServiceErrorType DNSSD_API
+TXTRecordSetValue
+               (
+               TXTRecordRef     *txtRecord,
+               const char       *key,
+               uint8_t          valueSize,        /* may be zero */
+               const void       *value            /* may be NULL */
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)( TXTRecordRef*, const char*, uint8_t, const void* );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( txtRecord, key, valueSize, value );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+TXTRecordRemoveValue
+               (
+               TXTRecordRef     *txtRecord,
+               const char       *key
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)( TXTRecordRef*, const char* );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( txtRecord, key );
+       }
+       
+       return ret;
+}
+
+
+int DNSSD_API
+TXTRecordContainsKey
+               (
+               uint16_t         txtLen,
+               const void       *txtRecord,
+               const char       *key
+               )
+{
+       typedef int (DNSSD_API * Func)( uint16_t, const void*, const char* );
+       static Func func = NULL;
+       int ret = 0;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( txtLen, txtRecord, key );
+       }
+       
+       return ret;
+}
+
+
+uint16_t DNSSD_API
+TXTRecordGetCount
+               (
+               uint16_t         txtLen,
+               const void       *txtRecord
+               )
+{
+       typedef uint16_t (DNSSD_API * Func)( uint16_t, const void* );
+       static Func func = NULL;
+       uint16_t ret = 0;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( txtLen, txtRecord );
+       }
+       
+       return ret;
+}
+
+
+uint16_t DNSSD_API
+TXTRecordGetLength
+               (
+               const TXTRecordRef *txtRecord
+               )
+{
+       typedef uint16_t (DNSSD_API * Func)( const TXTRecordRef* );
+       static Func func = NULL;
+       uint16_t ret = 0;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( txtRecord );
+       }
+       
+       return ret;
+}
+
+
+const void * DNSSD_API
+TXTRecordGetBytesPtr
+               (
+               const TXTRecordRef *txtRecord
+               )
+{
+       typedef const void* (DNSSD_API * Func)( const TXTRecordRef* );
+       static Func func = NULL;
+       const void* ret = NULL;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( txtRecord );
+       }
+       
+       return ret;
+}
+
+
+const void * DNSSD_API
+TXTRecordGetValuePtr
+               (
+               uint16_t         txtLen,
+               const void       *txtRecord,
+               const char       *key,
+               uint8_t          *valueLen
+               )
+{
+       typedef const void* (DNSSD_API * Func)( uint16_t, const void*, const char*, uint8_t* );
+       static Func func = NULL;
+       const void* ret = NULL;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( txtLen, txtRecord, key, valueLen );
+       }
+       
+       return ret;
+}
+
+
+DNSServiceErrorType DNSSD_API
+TXTRecordGetItemAtIndex
+               (
+               uint16_t         txtLen,
+               const void       *txtRecord,
+               uint16_t         itemIndex,
+               uint16_t         keyBufLen,
+               char             *key,
+               uint8_t          *valueLen,
+               const void       **value
+               )
+{
+       typedef DNSServiceErrorType (DNSSD_API * Func)( uint16_t, const void*, uint16_t, uint16_t, char*, uint8_t*, const void** );
+       static Func func = NULL;
+       DNSServiceErrorType ret = g_defaultErrorCode;
+
+       if ( DLLStub::GetProcAddress( ( FARPROC* ) &func, __FUNCTION__ ) )
+       {
+               ret = func( txtLen, txtRecord, itemIndex, keyBufLen, key, valueLen, value );
+       }
+       
+       return ret;
+}
\ No newline at end of file