1#include "includes.h" 2#include <dlfcn.h> 3 4#include "common.h" 5 6#include <CoreFoundation/CoreFoundation.h> 7#include "MobileApple80211.h" 8 9/* 10 * Code for dynamically loading Apple80211 functions from Aeropuerto to avoid 11 * having to link with full Preferences.framework. 12 */ 13 14static void *aeropuerto = NULL; 15 16 17int _Apple80211Initialized(void) 18{ 19 return aeropuerto ? 1 : 0; 20} 21 22 23static int (*__Apple80211Open)(Apple80211Ref *ctx) = NULL; 24 25int Apple80211Open(Apple80211Ref *ctx) 26{ 27 return __Apple80211Open(ctx); 28} 29 30 31static int (*__Apple80211Close)(Apple80211Ref ctx) = NULL; 32 33int Apple80211Close(Apple80211Ref ctx) 34{ 35 return __Apple80211Close(ctx); 36} 37 38 39static int (*__Apple80211GetIfListCopy)(Apple80211Ref handle, CFArrayRef *list) 40 = NULL; 41 42int Apple80211GetIfListCopy(Apple80211Ref handle, CFArrayRef *list) 43{ 44 return __Apple80211GetIfListCopy(handle, list); 45} 46 47 48static int (*__Apple80211BindToInterface)(Apple80211Ref handle, 49 CFStringRef interface) = NULL; 50 51int Apple80211BindToInterface(Apple80211Ref handle, 52 CFStringRef interface) 53{ 54 return __Apple80211BindToInterface(handle, interface); 55} 56 57 58static int (*__Apple80211GetInterfaceNameCopy)(Apple80211Ref handle, 59 CFStringRef *name) = NULL; 60 61int Apple80211GetInterfaceNameCopy(Apple80211Ref handle, 62 CFStringRef *name) 63{ 64 return __Apple80211GetInterfaceNameCopy(handle, name); 65} 66 67 68static int (*__Apple80211GetInfoCopy)(Apple80211Ref handle, 69 CFDictionaryRef *info) = NULL; 70 71int Apple80211GetInfoCopy(Apple80211Ref handle, 72 CFDictionaryRef *info) 73{ 74 return __Apple80211GetInfoCopy(handle, info); 75} 76 77 78static int (*__Apple80211GetPower)(Apple80211Ref handle, char *pwr) = NULL; 79 80int Apple80211GetPower(Apple80211Ref handle, char *pwr) 81{ 82 return __Apple80211GetPower(handle, pwr); 83} 84 85 86static int (*__Apple80211SetPower)(Apple80211Ref handle, char pwr) = NULL; 87 88int Apple80211SetPower(Apple80211Ref handle, char pwr) 89{ 90 return __Apple80211SetPower(handle, pwr); 91} 92 93 94static int (*__Apple80211Scan)(Apple80211Ref handle, CFArrayRef *list, 95 CFDictionaryRef parameters) = NULL; 96 97int Apple80211Scan(Apple80211Ref handle, CFArrayRef *list, 98 CFDictionaryRef parameters) 99{ 100 return __Apple80211Scan(handle, list, parameters); 101} 102 103 104static int (*__Apple80211Associate)(Apple80211Ref handle, CFDictionaryRef bss, 105 CFStringRef password) = NULL; 106 107int Apple80211Associate(Apple80211Ref handle, CFDictionaryRef bss, 108 CFStringRef password) 109{ 110 return __Apple80211Associate(handle, bss, password); 111} 112 113 114static int (*__Apple80211AssociateAndCopyInfo)(Apple80211Ref handle, 115 CFDictionaryRef bss, 116 CFStringRef password, 117 CFDictionaryRef *info) = 118 NULL; 119 120int Apple80211AssociateAndCopyInfo(Apple80211Ref handle, CFDictionaryRef bss, 121 CFStringRef password, CFDictionaryRef *info) 122{ 123 return __Apple80211AssociateAndCopyInfo(handle, bss, password, info); 124} 125 126 127static int (*__Apple80211CopyValue)(Apple80211Ref handle, int field, 128 CFDictionaryRef arg2, void *value) = NULL; 129 130int Apple80211CopyValue(Apple80211Ref handle, int field, CFDictionaryRef arg2, 131 void *value) 132{ 133 return __Apple80211CopyValue(handle, field, arg2, value); 134} 135 136 137#define DLSYM(s) \ 138do { \ 139 __ ## s = dlsym(aeropuerto, #s); \ 140 if (__ ## s == NULL) { \ 141 wpa_printf(MSG_ERROR, "MobileApple80211: Could not resolve " \ 142 "symbol '" #s "' (%s)", dlerror()); \ 143 err = 1; \ 144 } \ 145} while (0) 146 147 148__attribute__ ((constructor)) 149void _Apple80211_constructor(void) 150{ 151 const char *fname = "/System/Library/SystemConfiguration/" 152 "Aeropuerto.bundle/Aeropuerto"; 153 int err = 0; 154 155 aeropuerto = dlopen(fname, RTLD_LAZY); 156 if (!aeropuerto) { 157 wpa_printf(MSG_ERROR, "MobileApple80211: Failed to open %s " 158 "for symbols", fname); 159 return; 160 } 161 162 DLSYM(Apple80211Open); 163 DLSYM(Apple80211Close); 164 DLSYM(Apple80211GetIfListCopy); 165 DLSYM(Apple80211BindToInterface); 166 DLSYM(Apple80211GetInterfaceNameCopy); 167 DLSYM(Apple80211GetInfoCopy); 168 DLSYM(Apple80211GetPower); 169 DLSYM(Apple80211SetPower); 170 DLSYM(Apple80211Scan); 171 DLSYM(Apple80211Associate); 172 DLSYM(Apple80211AssociateAndCopyInfo); 173 DLSYM(Apple80211CopyValue); 174 175 if (err) { 176 dlclose(aeropuerto); 177 aeropuerto = NULL; 178 } 179} 180 181 182__attribute__ ((destructor)) 183void _Apple80211_destructor(void) 184{ 185 if (aeropuerto) { 186 dlclose(aeropuerto); 187 aeropuerto = NULL; 188 } 189} 190