X-Git-Url: https://git.saurik.com/apple/configd.git/blobdiff_plain/dbf6a266c384fc8b55e00a396eebe5cb62e21547..085a2e6a11110e1303f99ce18f80f98e067cb876:/Plugins/KernelEventMonitor/ev_ipv4.c?ds=sidebyside diff --git a/Plugins/KernelEventMonitor/ev_ipv4.c b/Plugins/KernelEventMonitor/ev_ipv4.c index c8071e7..14e2979 100644 --- a/Plugins/KernelEventMonitor/ev_ipv4.c +++ b/Plugins/KernelEventMonitor/ev_ipv4.c @@ -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@ * @@ -32,9 +32,15 @@ #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]) @@ -66,7 +72,7 @@ appendAddress(CFMutableDictionaryRef dict, CFStringRef key, struct in_addr *addr static CFMutableDictionaryRef -getIF(CFStringRef key, CFMutableDictionaryRef oldIFs, CFMutableDictionaryRef newIFs) +copyIF(CFStringRef key, CFMutableDictionaryRef oldIFs, CFMutableDictionaryRef newIFs) { 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); } + network_changed = TRUE; } return; @@ -143,7 +150,7 @@ interface_update_ipv4(struct ifaddrs *ifap, const char *if_name) &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; } @@ -173,23 +180,28 @@ interface_update_ipv4(struct ifaddrs *ifap, const char *if_name) 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; - 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; - 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); } @@ -207,7 +219,7 @@ interface_update_ipv4(struct ifaddrs *ifap, const char *if_name) kSCEntNetIPv4); CFRelease(interface); - newDict = getIF(key, oldIFs, newIFs); + newDict = copyIF(key, oldIFs, newIFs); 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; } + +#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 */