]> git.saurik.com Git - apple/configd.git/blobdiff - Plugins/KernelEventMonitor/ev_ipv4.c
configd-596.13.tar.gz
[apple/configd.git] / Plugins / KernelEventMonitor / ev_ipv4.c
index c8071e7827707b0c6418a06d4c055baef3af8985..14e2979db2089ed6156152b9a8f163cb45147dad 100644 (file)
@@ -1,5 +1,5 @@
 /*
 /*
- * Copyright (c) 2002-2003 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2002-2005, 2007, 2008, 2011 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
 #include "cache.h"
 #include "ev_ipv4.h"
 
 #include "cache.h"
 #include "ev_ipv4.h"
 
-#ifndef kSCEntNetIPv4ARPCollision
-#define kSCEntNetIPv4ARPCollision      CFSTR("IPv4ARPCollision")
-#endif kSCEntNetIPv4ARPCollision
+#ifndef        kSCEntNetIPv4ARPCollision
+#define        kSCEntNetIPv4ARPCollision       CFSTR("IPv4ARPCollision")
+#endif /* kSCEntNetIPv4ARPCollision */
+
+#if    !TARGET_OS_IPHONE
+#ifndef        kSCEntNetIPv4PortInUse
+#define        kSCEntNetIPv4PortInUse          CFSTR("PortInUse")
+#endif /* kSCEntNetIPv4PortInUse */
+#endif /* !TARGET_OS_IPHONE */
 
 #define IP_FORMAT      "%d.%d.%d.%d"
 #define IP_CH(ip, i)   (((u_char *)(ip))[i])
 
 #define IP_FORMAT      "%d.%d.%d.%d"
 #define IP_CH(ip, i)   (((u_char *)(ip))[i])
@@ -66,7 +72,7 @@ appendAddress(CFMutableDictionaryRef dict, CFStringRef key, struct in_addr *addr
 
 
 static CFMutableDictionaryRef
 
 
 static CFMutableDictionaryRef
-getIF(CFStringRef key, CFMutableDictionaryRef oldIFs, CFMutableDictionaryRef newIFs)
+copyIF(CFStringRef key, CFMutableDictionaryRef oldIFs, CFMutableDictionaryRef newIFs)
 {
        CFDictionaryRef         dict            = NULL;
        CFMutableDictionaryRef  newDict         = NULL;
 {
        CFDictionaryRef         dict            = NULL;
        CFMutableDictionaryRef  newDict         = NULL;
@@ -114,6 +120,7 @@ updateStore(const void *key, const void *value, void *context)
                } else if (dict) {
                        cache_SCDynamicStoreRemoveValue(store, key);
                }
                } else if (dict) {
                        cache_SCDynamicStoreRemoveValue(store, key);
                }
+               network_changed = TRUE;
        }
 
        return;
        }
 
        return;
@@ -143,7 +150,7 @@ interface_update_ipv4(struct ifaddrs *ifap, const char *if_name)
                                           &kCFTypeDictionaryValueCallBacks);
 
        if (!ifap) {
                                           &kCFTypeDictionaryValueCallBacks);
 
        if (!ifap) {
-               if (getifaddrs(&ifap_temp) < 0) {
+               if (getifaddrs(&ifap_temp) == -1) {
                        SCLog(TRUE, LOG_ERR, CFSTR("getifaddrs() failed: %s"), strerror(errno));
                        goto error;
                }
                        SCLog(TRUE, LOG_ERR, CFSTR("getifaddrs() failed: %s"), strerror(errno));
                        goto error;
                }
@@ -173,23 +180,28 @@ interface_update_ipv4(struct ifaddrs *ifap, const char *if_name)
                                                                          kSCEntNetIPv4);
                CFRelease(interface);
 
                                                                          kSCEntNetIPv4);
                CFRelease(interface);
 
-               newDict = getIF(key, oldIFs, newIFs);
+               newDict = copyIF(key, oldIFs, newIFs);
 
 
-               sin = (struct sockaddr_in *)ifa->ifa_addr;
+               /* ALIGN: cast ok, this should be aligned (getifaddrs). */
+               sin = (struct sockaddr_in *)(void *)ifa->ifa_addr;
                appendAddress(newDict, kSCPropNetIPv4Addresses, &sin->sin_addr);
 
                if (ifa->ifa_flags & IFF_POINTOPOINT) {
                        struct sockaddr_in      *dst;
 
                appendAddress(newDict, kSCPropNetIPv4Addresses, &sin->sin_addr);
 
                if (ifa->ifa_flags & IFF_POINTOPOINT) {
                        struct sockaddr_in      *dst;
 
-                       dst = (struct sockaddr_in *)ifa->ifa_dstaddr;
+                       /* ALIGN: cast ok, this should be aligned (getifaddrs). */
+                       dst = (struct sockaddr_in *)(void *)ifa->ifa_dstaddr;
                        appendAddress(newDict, kSCPropNetIPv4DestAddresses, &dst->sin_addr);
                } else {
                        struct sockaddr_in      *brd;
                        struct sockaddr_in      *msk;
 
                        appendAddress(newDict, kSCPropNetIPv4DestAddresses, &dst->sin_addr);
                } else {
                        struct sockaddr_in      *brd;
                        struct sockaddr_in      *msk;
 
-                       brd = (struct sockaddr_in *)ifa->ifa_broadaddr;
-                       appendAddress(newDict, kSCPropNetIPv4BroadcastAddresses, &brd->sin_addr);
-                       msk = (struct sockaddr_in *)ifa->ifa_netmask;
+                       /* ALIGN: cast ok, this should be aligned (getifaddrs). */
+                       brd = (struct sockaddr_in *)(void *)ifa->ifa_broadaddr;
+                       appendAddress(newDict, kSCPropNetIPv4BroadcastAddresses,&brd->sin_addr);
+
+                       /* ALIGN: cast ok, this should be aligned (getifaddrs). */
+                       msk = (struct sockaddr_in *)(void *)ifa->ifa_netmask;
                        appendAddress(newDict, kSCPropNetIPv4SubnetMasks, &msk->sin_addr);
                }
 
                        appendAddress(newDict, kSCPropNetIPv4SubnetMasks, &msk->sin_addr);
                }
 
@@ -207,7 +219,7 @@ interface_update_ipv4(struct ifaddrs *ifap, const char *if_name)
                                                                          kSCEntNetIPv4);
                CFRelease(interface);
 
                                                                          kSCEntNetIPv4);
                CFRelease(interface);
 
-               newDict = getIF(key, oldIFs, newIFs);
+               newDict = copyIF(key, oldIFs, newIFs);
 
                CFDictionarySetValue(newIFs, key, newDict);
                CFRelease(newDict);
 
                CFDictionarySetValue(newIFs, key, newDict);
                CFRelease(newDict);
@@ -254,3 +266,23 @@ interface_collision_ipv4(const char *if_name, struct in_addr ip_addr, int hw_len
        CFRelease(if_name_cf);
        return;
 }
        CFRelease(if_name_cf);
        return;
 }
+
+#if    !TARGET_OS_IPHONE
+__private_extern__
+void
+port_in_use_ipv4(uint16_t port, pid_t req_pid)
+{
+       CFStringRef             key;
+
+       key = SCDynamicStoreKeyCreate(NULL,
+                                     CFSTR("%@/%@/Protocol/%@/%@/%d/%d"),
+                                     kSCDynamicStoreDomainState,
+                                     kSCCompNetwork,
+                                     kSCEntNetIPv4,
+                                     kSCEntNetIPv4PortInUse,
+                                     port, req_pid);
+       cache_SCDynamicStoreNotifyValue(store, key);
+       CFRelease(key);
+       return;
+}
+#endif /* !TARGET_OS_IPHONE */