1/* 2 * Copyright (c) 2009, 2010, 2012, 2013 Apple Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24 25#include <sys/types.h> 26#include <sys/param.h> 27#include <sys/stat.h> 28#include <dlfcn.h> 29 30#include <SystemConfiguration/CaptiveNetwork.h> 31 32 33#pragma mark - 34#pragma mark CaptiveNetwork.framework APIs (exported through the SystemConfiguration.framework) 35 36 37#if TARGET_OS_IPHONE 38const CFStringRef kCNNetworkInfoKeySSIDData = CFSTR("SSIDDATA"); 39const CFStringRef kCNNetworkInfoKeySSID = CFSTR("SSID"); 40const CFStringRef kCNNetworkInfoKeyBSSID = CFSTR("BSSID"); 41#endif // TARGET_OS_IPHONE 42 43 44static void * 45__loadCaptiveNetwork(void) { 46 static void *image = NULL; 47 if (NULL == image) { 48 const char *framework = "/System/Library/PrivateFrameworks/CaptiveNetwork.framework/CaptiveNetwork"; 49 struct stat statbuf; 50 const char *suffix = getenv("DYLD_IMAGE_SUFFIX"); 51 char path[MAXPATHLEN]; 52 53 strlcpy(path, framework, sizeof(path)); 54 if (suffix) strlcat(path, suffix, sizeof(path)); 55 if (0 <= stat(path, &statbuf)) { 56 image = dlopen(path, RTLD_LAZY | RTLD_LOCAL); 57 } else { 58 image = dlopen(framework, RTLD_LAZY | RTLD_LOCAL); 59 } 60 } 61 return (void *)image; 62} 63 64 65Boolean 66CNSetSupportedSSIDs(CFArrayRef ssidArray) 67{ 68 static typeof (CNSetSupportedSSIDs) *dyfunc = NULL; 69 if (!dyfunc) { 70 void *image = __loadCaptiveNetwork(); 71 if (image) dyfunc = dlsym(image, "__CNSetSupportedSSIDs"); 72 } 73 return dyfunc ? dyfunc(ssidArray) : FALSE; 74} 75 76 77Boolean 78CNMarkPortalOnline(CFStringRef interfaceName) 79{ 80 static typeof (CNMarkPortalOnline) *dyfunc = NULL; 81 if (!dyfunc) { 82 void *image = __loadCaptiveNetwork(); 83 if (image) dyfunc = dlsym(image, "__CNMarkPortalOnline"); 84 } 85 return dyfunc ? dyfunc(interfaceName) : FALSE; 86} 87 88 89Boolean 90CNMarkPortalOffline(CFStringRef interfaceName) 91{ 92 static typeof (CNMarkPortalOffline) *dyfunc = NULL; 93 if (!dyfunc) { 94 void *image = __loadCaptiveNetwork(); 95 if (image) dyfunc = dlsym(image, "__CNMarkPortalOffline"); 96 } 97 return dyfunc ? dyfunc(interfaceName) : FALSE; 98} 99 100CFArrayRef 101CNCopySupportedInterfaces(void) 102{ 103 static typeof (CNCopySupportedInterfaces) *dyfunc = NULL; 104 if (!dyfunc) { 105 void *image = __loadCaptiveNetwork(); 106 if (image) dyfunc = dlsym(image, "__CNCopySupportedInterfaces"); 107 } 108 return dyfunc ? dyfunc() : NULL; 109} 110 111 112#if TARGET_OS_IPHONE 113CFDictionaryRef 114CNCopyCurrentNetworkInfo(CFStringRef interfaceName) 115{ 116 static typeof (CNCopyCurrentNetworkInfo) *dyfunc = NULL; 117 if (!dyfunc) { 118 void *image = __loadCaptiveNetwork(); 119 if (image) dyfunc = dlsym(image, "__CNCopyCurrentNetworkInfo"); 120 } 121 return dyfunc ? dyfunc(interfaceName) : NULL; 122} 123#endif // TARGET_OS_IPHONE 124