]> git.saurik.com Git - apple/mdnsresponder.git/blobdiff - mDNSMacOSX/helper-stubs.c
mDNSResponder-379.27.tar.gz
[apple/mdnsresponder.git] / mDNSMacOSX / helper-stubs.c
index 8cb7d5848630edb1120393691a424d552daab1be..9b1afaf5f084fba1507d36ef34c2b7c504e77ba7 100644 (file)
@@ -1,12 +1,12 @@
 /*
- * Copyright (c) 2007 Apple Inc. All rights reserved.
+ * Copyright (c) 2007-2012 Apple 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.
 
 #define ERROR(x, y) y,
 static const char *errorstring[] =
-       {
-       #include "helper-error.h"
-       NULL
-       };
+{
+    #include "helper-error.h"
+    NULL
+};
 #undef ERROR
 
 static mach_port_t getHelperPort(int retry)
-       {
-       static mach_port_t port = MACH_PORT_NULL;
-       if (retry) port = MACH_PORT_NULL;
-       if (port == MACH_PORT_NULL && BOOTSTRAP_SUCCESS != bootstrap_look_up(bootstrap_port, kmDNSHelperServiceName, &port))
-               LogMsg("%s: cannot contact helper", __func__);
-       return port;
-       }
+{
+    static mach_port_t port = MACH_PORT_NULL;
+    if (retry) port = MACH_PORT_NULL;
+    if (port == MACH_PORT_NULL && BOOTSTRAP_SUCCESS != bootstrap_look_up(bootstrap_port, kmDNSHelperServiceName, &port))
+        LogMsg("%s: cannot contact helper", __func__);
+    return port;
+}
 
 const char *mDNSHelperError(int err)
-       {
-       static const char *p = "<unknown error>";
-       if (mDNSHelperErrorBase < err && mDNSHelperErrorEnd > err)
-               p = errorstring[err - mDNSHelperErrorBase - 1];
-       return p;
-       }
+{
+    static const char *p = "<unknown error>";
+    if (mDNSHelperErrorBase < err && mDNSHelperErrorEnd > err)
+        p = errorstring[err - mDNSHelperErrorBase - 1];
+    return p;
+}
 
 /* Ugly but handy. */
 // We don't bother reporting kIOReturnNotReady because that error code occurs in "normal" operation
 // and doesn't indicate anything unexpected that needs to be investigated
 
 #define MACHRETRYLOOP_BEGIN(kr, retry, err, fin)                                            \
-       for (;;)                                                                                \
-               {
-#define MACHRETRYLOOP_END(kr, retry, err, fin)                                                                                         \
-               if (KERN_SUCCESS == (kr)) break;                                                                                                        \
-               else if (MACH_SEND_INVALID_DEST == (kr) && 0 == (retry)++) continue;                            \
-               else                                                                                                                                                            \
-                       {                                                                                                                                                               \
-                       (err) = kmDNSHelperCommunicationFailed;                                                                                 \
-                       LogMsg("%s: Mach communication failed: %d %X %s", __func__, kr, kr, mach_error_string(kr));     \
-                       goto fin;                                                                                                                                               \
-                       }                                                                                                                                                               \
-               }                                                                                                                                                                       \
-       if (0 != (err) && kIOReturnNotReady != (err))                                                                                   \
-               { LogMsg("%s: %d 0x%X (%s)", __func__, (err), (err), mDNSHelperError(err)); goto fin; }
+    for (;;)                                                                                \
+    {
+#define MACHRETRYLOOP_END(kr, retry, err, fin)                                              \
+    if (KERN_SUCCESS == (kr)) break;                                                                                             \
+    else if (MACH_SEND_INVALID_DEST == (kr) && 0 == (retry)++) continue;                                                                                             \
+    else                                                                                \
+    {                                                                               \
+        (err) = kmDNSHelperCommunicationFailed;                                         \
+        LogMsg("%s: Mach communication failed: %d %X %s", __func__, kr, kr, mach_error_string(kr)); \
+        goto fin;                                                                       \
+    }                                                                               \
+    }                                                                                   \
+    if (0 != (err) && kIOReturnNotReady != (err))                                           \
+    { LogMsg("%s: %d 0x%X (%s)", __func__, (err), (err), mDNSHelperError(err)); goto fin; }
 
 void mDNSPreferencesSetName(int key, domainlabel *old, domainlabel *new)
-       {
-       kern_return_t kr = KERN_FAILURE;
-       int retry = 0;
-       int err = 0;
-       char oldname[MAX_DOMAIN_LABEL+1] = {0};
-       char newname[MAX_DOMAIN_LABEL+1] = {0};
-       ConvertDomainLabelToCString_unescaped(old, oldname);
-       if (new) ConvertDomainLabelToCString_unescaped(new, newname);
+{
+    kern_return_t kr = KERN_FAILURE;
+    int retry = 0;
+    int err = 0;
+    char oldname[MAX_DOMAIN_LABEL+1] = {0};
+    char newname[MAX_DOMAIN_LABEL+1] = {0};
+    ConvertDomainLabelToCString_unescaped(old, oldname);
+    if (new) ConvertDomainLabelToCString_unescaped(new, newname);
 
-       MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
-       kr = proxy_mDNSPreferencesSetName(getHelperPort(retry), key, oldname, newname);
-       MACHRETRYLOOP_END(kr, retry, err, fin);
+    MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
+    kr = proxy_mDNSPreferencesSetName(getHelperPort(retry), key, oldname, newname);
+    MACHRETRYLOOP_END(kr, retry, err, fin);
 
 fin:
-       (void)err;
-       }
+    (void)err;
+}
 
 void mDNSDynamicStoreSetConfig(int key, const char *subkey, CFPropertyListRef value)
-       {
-       CFWriteStreamRef stream = NULL;
-       CFDataRef bytes = NULL;
-       kern_return_t kr = KERN_FAILURE;
-       int retry = 0;
-       int err = 0;
+{
+    CFWriteStreamRef stream = NULL;
+    CFDataRef bytes = NULL;
+    kern_return_t kr = KERN_FAILURE;
+    int retry = 0;
+    int err = 0;
 
-       if (NULL == (stream = CFWriteStreamCreateWithAllocatedBuffers(NULL, NULL)))
-               {
-               err = kmDNSHelperCreationFailed;
-               LogMsg("%s: CFWriteStreamCreateWithAllocatedBuffers failed", __func__);
-               goto fin;
-               }
-       CFWriteStreamOpen(stream);
-       if (0 == CFPropertyListWriteToStream(value, stream, kCFPropertyListBinaryFormat_v1_0, NULL))
-               {
-               err = kmDNSHelperPListWriteFailed;
-               LogMsg("%s: CFPropertyListWriteToStream failed", __func__);
-               goto fin;
-               }
-       if (NULL == (bytes = CFWriteStreamCopyProperty(stream, kCFStreamPropertyDataWritten)))
-               {
-               err = kmDNSHelperCreationFailed;
-               LogMsg("%s: CFWriteStreamCopyProperty failed", __func__);
-               goto fin;
-               }
-       CFWriteStreamClose(stream);
-       CFRelease(stream);
-       stream = NULL;
-       MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
-       kr = proxy_mDNSDynamicStoreSetConfig(getHelperPort(retry), key, subkey ? subkey : "", (vm_offset_t)CFDataGetBytePtr(bytes), CFDataGetLength(bytes));
-       MACHRETRYLOOP_END(kr, retry, err, fin);
+    if (NULL == (stream = CFWriteStreamCreateWithAllocatedBuffers(NULL, NULL)))
+    {
+        err = kmDNSHelperCreationFailed;
+        LogMsg("%s: CFWriteStreamCreateWithAllocatedBuffers failed", __func__);
+        goto fin;
+    }
+    CFWriteStreamOpen(stream);
+    if (0 == CFPropertyListWriteToStream(value, stream, kCFPropertyListBinaryFormat_v1_0, NULL))
+    {
+        err = kmDNSHelperPListWriteFailed;
+        LogMsg("%s: CFPropertyListWriteToStream failed", __func__);
+        goto fin;
+    }
+    if (NULL == (bytes = CFWriteStreamCopyProperty(stream, kCFStreamPropertyDataWritten)))
+    {
+        err = kmDNSHelperCreationFailed;
+        LogMsg("%s: CFWriteStreamCopyProperty failed", __func__);
+        goto fin;
+    }
+    CFWriteStreamClose(stream);
+    CFRelease(stream);
+    stream = NULL;
+    MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
+    kr = proxy_mDNSDynamicStoreSetConfig(getHelperPort(retry), key, subkey ? subkey : "", (vm_offset_t)CFDataGetBytePtr(bytes), CFDataGetLength(bytes));
+    MACHRETRYLOOP_END(kr, retry, err, fin);
 
 fin:
-       if (NULL != stream) { CFWriteStreamClose(stream); CFRelease(stream); }
-       if (NULL != bytes) CFRelease(bytes);
-       (void)err;
-       }
+    if (NULL != stream) { CFWriteStreamClose(stream); CFRelease(stream); }
+    if (NULL != bytes) CFRelease(bytes);
+    (void)err;
+}
 
 void mDNSRequestBPF(void)
-       {
-       kern_return_t kr = KERN_FAILURE;
-       int retry = 0, err = 0;
-       MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
-       kr = proxy_mDNSRequestBPF(getHelperPort(retry));
-       MACHRETRYLOOP_END(kr, retry, err, fin);
+{
+    kern_return_t kr = KERN_FAILURE;
+    int retry = 0, err = 0;
+    MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
+    kr = proxy_mDNSRequestBPF(getHelperPort(retry));
+    MACHRETRYLOOP_END(kr, retry, err, fin);
 fin:
-       (void)err;
-       }
+    (void)err;
+}
 
 int mDNSPowerRequest(int key, int interval)
-       {
-       kern_return_t kr = KERN_FAILURE;
-       int retry = 0, err = 0;
-       MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
-       kr = proxy_mDNSPowerRequest(getHelperPort(retry), key, interval, &err);
-       MACHRETRYLOOP_END(kr, retry, err, fin);
+{
+    kern_return_t kr = KERN_FAILURE;
+    int retry = 0, err = 0;
+    MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
+    kr = proxy_mDNSPowerRequest(getHelperPort(retry), key, interval, &err);
+    MACHRETRYLOOP_END(kr, retry, err, fin);
 fin:
-       return err;
-       }
+    return err;
+}
 
 int mDNSSetLocalAddressCacheEntry(int ifindex, int family, const v6addr_t ip, const ethaddr_t eth)
-       {
-       kern_return_t kr = KERN_FAILURE;
-       int retry = 0, err = 0;
-       MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
-       kr = proxy_mDNSSetLocalAddressCacheEntry(getHelperPort(retry), ifindex, family, (uint8_t*)ip, (uint8_t*)eth, &err);
-       MACHRETRYLOOP_END(kr, retry, err, fin);
+{
+    kern_return_t kr = KERN_FAILURE;
+    int retry = 0, err = 0;
+    MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
+    kr = proxy_mDNSSetLocalAddressCacheEntry(getHelperPort(retry), ifindex, family, (uint8_t*)ip, (uint8_t*)eth, &err);
+    MACHRETRYLOOP_END(kr, retry, err, fin);
 fin:
-       return err;
-       }
+    return err;
+}
 
-void mDNSNotify(const char *title, const char *msg)    // Both strings are UTF-8 text
-       {
-       kern_return_t kr = KERN_FAILURE;
-       int retry = 0, err = 0;
-       MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
-       kr = proxy_mDNSNotify(getHelperPort(retry), title, msg);
-       MACHRETRYLOOP_END(kr, retry, err, fin);
+void mDNSNotify(const char *title, const char *msg) // Both strings are UTF-8 text
+{
+    kern_return_t kr = KERN_FAILURE;
+    int retry = 0, err = 0;
+    MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
+    kr = proxy_mDNSNotify(getHelperPort(retry), title, msg);
+    MACHRETRYLOOP_END(kr, retry, err, fin);
 fin:
-       (void)err;
-       }
+    (void)err;
+}
 
 int mDNSKeychainGetSecrets(CFArrayRef *result)
-       {
-       CFPropertyListRef plist = NULL;
-       CFDataRef bytes = NULL;
-       kern_return_t kr = KERN_FAILURE;
-       unsigned int numsecrets = 0;
-       vm_offset_t secrets = 0;
-       mach_msg_type_number_t secretsCnt = 0;
-       int retry = 0, err = 0;
-
-       MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
-       kr = proxy_mDNSKeychainGetSecrets(getHelperPort(retry), &numsecrets, &secrets, &secretsCnt, &err);
-       MACHRETRYLOOP_END(kr, retry, err, fin);
+{
+    CFPropertyListRef plist = NULL;
+    CFDataRef bytes = NULL;
+    kern_return_t kr = KERN_FAILURE;
+    unsigned int numsecrets = 0;
+    vm_offset_t secrets = 0;
+    mach_msg_type_number_t secretsCnt = 0;
+    int retry = 0, err = 0;
 
-       if (NULL == (bytes = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, (void*)secrets, secretsCnt, kCFAllocatorNull)))
-               {
-               err = kmDNSHelperCreationFailed;
-               LogMsg("%s: CFDataCreateWithBytesNoCopy failed", __func__);
-               goto fin;
-               }
-       if (NULL == (plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, bytes, kCFPropertyListImmutable, NULL)))
-               {
-               err = kmDNSHelperInvalidPList;
-               LogMsg("%s: CFPropertyListCreateFromXMLData failed", __func__);
-               goto fin;
-               }
-       if (CFArrayGetTypeID() != CFGetTypeID(plist))
-               {
-               err = kmDNSHelperTypeError;
-               LogMsg("%s: Unexpected result type", __func__);
-               CFRelease(plist);
-               plist = NULL;
-               goto fin;
-               }
-       *result = (CFArrayRef)plist;
+    MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
+    kr = proxy_mDNSKeychainGetSecrets(getHelperPort(retry), &numsecrets, &secrets, &secretsCnt, &err);
+    MACHRETRYLOOP_END(kr, retry, err, fin);
 
-fin:
-       if (bytes) CFRelease(bytes);
-       if (secrets) vm_deallocate(mach_task_self(), secrets, secretsCnt);
-       return err;
-       }
+    if (NULL == (bytes = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, (void*)secrets, secretsCnt, kCFAllocatorNull)))
+    {
+        err = kmDNSHelperCreationFailed;
+        LogMsg("%s: CFDataCreateWithBytesNoCopy failed", __func__);
+        goto fin;
+    }
+    if (NULL == (plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, bytes, kCFPropertyListImmutable, NULL)))
+    {
+        err = kmDNSHelperInvalidPList;
+        LogMsg("%s: CFPropertyListCreateFromXMLData failed", __func__);
+        goto fin;
+    }
+    if (CFArrayGetTypeID() != CFGetTypeID(plist))
+    {
+        err = kmDNSHelperTypeError;
+        LogMsg("%s: Unexpected result type", __func__);
+        CFRelease(plist);
+        plist = NULL;
+        goto fin;
+    }
+    *result = (CFArrayRef)plist;
 
-void mDNSAutoTunnelInterfaceUpDown(int updown, v6addr_t address)
-       {
-       kern_return_t kr = KERN_SUCCESS;
-       int retry = 0, err = 0;
-       MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
-       kr = proxy_mDNSAutoTunnelInterfaceUpDown(getHelperPort(retry), updown, address);
-       MACHRETRYLOOP_END(kr, retry, err, fin);
 fin:
-       (void)err;
-       }
-
-extern const char dnsprefix[];
+    if (bytes) CFRelease(bytes);
+    if (secrets) vm_deallocate(mach_task_self(), secrets, secretsCnt);
+    return err;
+}
 
 void mDNSConfigureServer(int updown, const char *const prefix, const domainname *const fqdn)
-       {
-       kern_return_t kr = KERN_SUCCESS;
-       int retry = 0, err = 0;
-       char fqdnStr[MAX_ESCAPED_DOMAIN_NAME + 10] = { 0 }; // Assume the prefix is no larger than 10 chars
-       if (fqdn)
-               {
-               mDNSPlatformStrCopy(fqdnStr, prefix);
-               if (ConvertDomainNameToCString(fqdn, fqdnStr + mDNSPlatformStrLen(prefix)) && prefix == dnsprefix)
-                       {
-                       // remove the trailing dot, as that is not used in the keychain entry racoon will lookup
-                       mDNSu32 fqdnEnd = mDNSPlatformStrLen(fqdnStr);
-                       if (fqdnEnd) fqdnStr[fqdnEnd - 1] = 0;
-                       }
-               }
-       MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
-       kr = proxy_mDNSConfigureServer(getHelperPort(retry), updown, fqdnStr);
-       MACHRETRYLOOP_END(kr, retry, err, fin);
+{
+    kern_return_t kr = KERN_SUCCESS;
+    int retry = 0, err = 0;
+    char fqdnStr[MAX_ESCAPED_DOMAIN_NAME + 10] = { 0 }; // Assume the prefix is no larger than 10 chars
+    if (fqdn)
+    {
+        mDNSPlatformStrCopy(fqdnStr, prefix);
+        ConvertDomainNameToCString(fqdn, fqdnStr + mDNSPlatformStrLen(prefix));
+    }
+    MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
+    kr = proxy_mDNSConfigureServer(getHelperPort(retry), updown, fqdnStr);
+    MACHRETRYLOOP_END(kr, retry, err, fin);
 fin:
-       (void)err;
-       }
+    (void)err;
+}
 
 int mDNSAutoTunnelSetKeys(int replacedelete, v6addr_t local_inner,
-    v6addr_t local_outer, short local_port, v6addr_t remote_inner,
-    v6addr_t remote_outer, short remote_port, const char* const prefix, const domainname *const fqdn)
-       {
-       kern_return_t kr = KERN_SUCCESS;
-       int retry = 0, err = 0;
-       char fqdnStr[MAX_ESCAPED_DOMAIN_NAME + 10] = { 0 }; // Assume the prefix is no larger than 10 chars
-       if (fqdn)
-               {
-               mDNSPlatformStrCopy(fqdnStr, prefix);
-               if (ConvertDomainNameToCString(fqdn, fqdnStr + mDNSPlatformStrLen(prefix)) && prefix == dnsprefix)
-                       {
-                       // remove the trailing dot, as that is not used in the keychain entry racoon will lookup
-                       mDNSu32 fqdnEnd = mDNSPlatformStrLen(fqdnStr);
-                       if (fqdnEnd) fqdnStr[fqdnEnd - 1] = 0;
-                       }
-               }
-       MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
-       kr = proxy_mDNSAutoTunnelSetKeys(getHelperPort(retry), replacedelete, local_inner, local_outer, local_port, remote_inner, remote_outer, remote_port, fqdnStr, &err);
-       MACHRETRYLOOP_END(kr, retry, err, fin);
+                          v6addr_t local_outer, short local_port, v6addr_t remote_inner,
+                          v6addr_t remote_outer, short remote_port, const char* const prefix, const domainname *const fqdn)
+{
+    kern_return_t kr = KERN_SUCCESS;
+    int retry = 0, err = 0;
+    char fqdnStr[MAX_ESCAPED_DOMAIN_NAME + 10] = { 0 }; // Assume the prefix is no larger than 10 chars
+    if (fqdn)
+    {
+        mDNSPlatformStrCopy(fqdnStr, prefix);
+        ConvertDomainNameToCString(fqdn, fqdnStr + mDNSPlatformStrLen(prefix));
+    }
+    MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
+    kr = proxy_mDNSAutoTunnelSetKeys(getHelperPort(retry), replacedelete, local_inner, local_outer, local_port, remote_inner, remote_outer, remote_port, fqdnStr, &err);
+    MACHRETRYLOOP_END(kr, retry, err, fin);
 fin:
-       return err;
-       }
+    return err;
+}
 
 void mDNSSendWakeupPacket(unsigned ifid, char *eth_addr, char *ip_addr, int iteration)
-       {
-       kern_return_t kr = KERN_SUCCESS;
-       int retry = 0, err = 0;
-       MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
-       kr = proxy_mDNSSendWakeupPacket(getHelperPort(retry), ifid, eth_addr, ip_addr, iteration);
-       MACHRETRYLOOP_END(kr, retry, err, fin);
+{
+    kern_return_t kr = KERN_SUCCESS;
+    int retry = 0, err = 0;
+    MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
+    kr = proxy_mDNSSendWakeupPacket(getHelperPort(retry), ifid, eth_addr, ip_addr, iteration);
+    MACHRETRYLOOP_END(kr, retry, err, fin);
+fin:
+    (void) err;
+}
+
+void mDNSPacketFilterControl(uint32_t command, char * ifname, uint32_t count, pfArray_t portArray, pfArray_t protocolArray)
+{
+    kern_return_t kr = KERN_SUCCESS;
+    int retry = 0, err = 0;
+    MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
+    kr = proxy_mDNSPacketFilterControl(getHelperPort(retry), command, ifname, count, portArray, protocolArray);
+    MACHRETRYLOOP_END(kr, retry, err, fin);
+fin:
+    (void) err;
+}
+
+int mDNSSendKeepalive(v6addr_t sadd, v6addr_t dadd, uint16_t lport, uint16_t rport, unsigned seq, unsigned ack, uint16_t win)
+{
+    kern_return_t kr = KERN_FAILURE;
+    int retry = 0, err = 0;
+    MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
+    kr = proxy_mDNSSendKeepalive(getHelperPort(retry), sadd, dadd, lport, rport, seq, ack, win);
+    MACHRETRYLOOP_END(kr, retry, err, fin);
 fin:
-       (void) err;
-       }
+    return err;
+}
+
+
+int mDNSInterfaceAdvtIoctl(const char *ifname, int op)
+{
+    kern_return_t kr = KERN_FAILURE;
+    int retry = 0, err = 0;
+
+    MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
+    kr = proxy_mDNSInterfaceAdvtIoctl(getHelperPort(retry), ifname, op);
+    MACHRETRYLOOP_END(kr, retry, err, fin);
 
-void mDNSPacketFilterControl(uint32_t command, char * ifname, uint16_t servicePort, uint16_t protocol)
-       {
-       kern_return_t kr = KERN_SUCCESS;
-       int retry = 0, err = 0;
-       MACHRETRYLOOP_BEGIN(kr, retry, err, fin);
-       kr = proxy_mDNSPacketFilterControl(getHelperPort(retry), command, ifname, servicePort, protocol);
-       MACHRETRYLOOP_END(kr, retry, err, fin);
 fin:
-       (void) err;
-       }
+    return err;
+}