#include "includes.h" #include <dlfcn.h> #include "common.h" #include <CoreFoundation/CoreFoundation.h> #include "MobileApple80211.h" /* * Code for dynamically loading Apple80211 functions from Aeropuerto to avoid * having to link with full Preferences.framework. */ static void *aeropuerto = NULL; int _Apple80211Initialized(void) { return aeropuerto ? 1 : 0; } static int (*__Apple80211Open)(Apple80211Ref *ctx) = NULL; int Apple80211Open(Apple80211Ref *ctx) { return __Apple80211Open(ctx); } static int (*__Apple80211Close)(Apple80211Ref ctx) = NULL; int Apple80211Close(Apple80211Ref ctx) { return __Apple80211Close(ctx); } static int (*__Apple80211GetIfListCopy)(Apple80211Ref handle, CFArrayRef *list) = NULL; int Apple80211GetIfListCopy(Apple80211Ref handle, CFArrayRef *list) { return __Apple80211GetIfListCopy(handle, list); } static int (*__Apple80211BindToInterface)(Apple80211Ref handle, CFStringRef interface) = NULL; int Apple80211BindToInterface(Apple80211Ref handle, CFStringRef interface) { return __Apple80211BindToInterface(handle, interface); } static int (*__Apple80211GetInterfaceNameCopy)(Apple80211Ref handle, CFStringRef *name) = NULL; int Apple80211GetInterfaceNameCopy(Apple80211Ref handle, CFStringRef *name) { return __Apple80211GetInterfaceNameCopy(handle, name); } static int (*__Apple80211GetInfoCopy)(Apple80211Ref handle, CFDictionaryRef *info) = NULL; int Apple80211GetInfoCopy(Apple80211Ref handle, CFDictionaryRef *info) { return __Apple80211GetInfoCopy(handle, info); } static int (*__Apple80211GetPower)(Apple80211Ref handle, char *pwr) = NULL; int Apple80211GetPower(Apple80211Ref handle, char *pwr) { return __Apple80211GetPower(handle, pwr); } static int (*__Apple80211SetPower)(Apple80211Ref handle, char pwr) = NULL; int Apple80211SetPower(Apple80211Ref handle, char pwr) { return __Apple80211SetPower(handle, pwr); } static int (*__Apple80211Scan)(Apple80211Ref handle, CFArrayRef *list, CFDictionaryRef parameters) = NULL; int Apple80211Scan(Apple80211Ref handle, CFArrayRef *list, CFDictionaryRef parameters) { return __Apple80211Scan(handle, list, parameters); } static int (*__Apple80211Associate)(Apple80211Ref handle, CFDictionaryRef bss, CFStringRef password) = NULL; int Apple80211Associate(Apple80211Ref handle, CFDictionaryRef bss, CFStringRef password) { return __Apple80211Associate(handle, bss, password); } static int (*__Apple80211AssociateAndCopyInfo)(Apple80211Ref handle, CFDictionaryRef bss, CFStringRef password, CFDictionaryRef *info) = NULL; int Apple80211AssociateAndCopyInfo(Apple80211Ref handle, CFDictionaryRef bss, CFStringRef password, CFDictionaryRef *info) { return __Apple80211AssociateAndCopyInfo(handle, bss, password, info); } static int (*__Apple80211CopyValue)(Apple80211Ref handle, int field, CFDictionaryRef arg2, void *value) = NULL; int Apple80211CopyValue(Apple80211Ref handle, int field, CFDictionaryRef arg2, void *value) { return __Apple80211CopyValue(handle, field, arg2, value); } #define DLSYM(s) \ do { \ __ ## s = dlsym(aeropuerto, #s); \ if (__ ## s == NULL) { \ wpa_printf(MSG_ERROR, "MobileApple80211: Could not resolve " \ "symbol '" #s "' (%s)", dlerror()); \ err = 1; \ } \ } while (0) __attribute__ ((constructor)) void _Apple80211_constructor(void) { const char *fname = "/System/Library/SystemConfiguration/" "Aeropuerto.bundle/Aeropuerto"; int err = 0; aeropuerto = dlopen(fname, RTLD_LAZY); if (!aeropuerto) { wpa_printf(MSG_ERROR, "MobileApple80211: Failed to open %s " "for symbols", fname); return; } DLSYM(Apple80211Open); DLSYM(Apple80211Close); DLSYM(Apple80211GetIfListCopy); DLSYM(Apple80211BindToInterface); DLSYM(Apple80211GetInterfaceNameCopy); DLSYM(Apple80211GetInfoCopy); DLSYM(Apple80211GetPower); DLSYM(Apple80211SetPower); DLSYM(Apple80211Scan); DLSYM(Apple80211Associate); DLSYM(Apple80211AssociateAndCopyInfo); DLSYM(Apple80211CopyValue); if (err) { dlclose(aeropuerto); aeropuerto = NULL; } } __attribute__ ((destructor)) void _Apple80211_destructor(void) { if (aeropuerto) { dlclose(aeropuerto); aeropuerto = NULL; } }