• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
14 static void *aeropuerto = NULL;
15 
16 
_Apple80211Initialized(void)17 int _Apple80211Initialized(void)
18 {
19 	return aeropuerto ? 1 : 0;
20 }
21 
22 
23 static int (*__Apple80211Open)(Apple80211Ref *ctx) = NULL;
24 
Apple80211Open(Apple80211Ref * ctx)25 int Apple80211Open(Apple80211Ref *ctx)
26 {
27 	return __Apple80211Open(ctx);
28 }
29 
30 
31 static int (*__Apple80211Close)(Apple80211Ref ctx) = NULL;
32 
Apple80211Close(Apple80211Ref ctx)33 int Apple80211Close(Apple80211Ref ctx)
34 {
35 	return __Apple80211Close(ctx);
36 }
37 
38 
39 static int (*__Apple80211GetIfListCopy)(Apple80211Ref handle, CFArrayRef *list)
40 	= NULL;
41 
Apple80211GetIfListCopy(Apple80211Ref handle,CFArrayRef * list)42 int Apple80211GetIfListCopy(Apple80211Ref handle, CFArrayRef *list)
43 {
44 	return __Apple80211GetIfListCopy(handle, list);
45 }
46 
47 
48 static int (*__Apple80211BindToInterface)(Apple80211Ref handle,
49 					  CFStringRef interface) = NULL;
50 
Apple80211BindToInterface(Apple80211Ref handle,CFStringRef interface)51 int Apple80211BindToInterface(Apple80211Ref handle,
52 			      CFStringRef interface)
53 {
54 	return __Apple80211BindToInterface(handle, interface);
55 }
56 
57 
58 static int (*__Apple80211GetInterfaceNameCopy)(Apple80211Ref handle,
59 					       CFStringRef *name) = NULL;
60 
Apple80211GetInterfaceNameCopy(Apple80211Ref handle,CFStringRef * name)61 int Apple80211GetInterfaceNameCopy(Apple80211Ref handle,
62 				   CFStringRef *name)
63 {
64 	return __Apple80211GetInterfaceNameCopy(handle, name);
65 }
66 
67 
68 static int (*__Apple80211GetInfoCopy)(Apple80211Ref handle,
69 				      CFDictionaryRef *info) = NULL;
70 
Apple80211GetInfoCopy(Apple80211Ref handle,CFDictionaryRef * info)71 int Apple80211GetInfoCopy(Apple80211Ref handle,
72 			  CFDictionaryRef *info)
73 {
74 	return __Apple80211GetInfoCopy(handle, info);
75 }
76 
77 
78 static int (*__Apple80211GetPower)(Apple80211Ref handle, char *pwr) = NULL;
79 
Apple80211GetPower(Apple80211Ref handle,char * pwr)80 int Apple80211GetPower(Apple80211Ref handle, char *pwr)
81 {
82 	return __Apple80211GetPower(handle, pwr);
83 }
84 
85 
86 static int (*__Apple80211SetPower)(Apple80211Ref handle, char pwr) = NULL;
87 
Apple80211SetPower(Apple80211Ref handle,char pwr)88 int Apple80211SetPower(Apple80211Ref handle, char pwr)
89 {
90 	return __Apple80211SetPower(handle, pwr);
91 }
92 
93 
94 static int (*__Apple80211Scan)(Apple80211Ref handle, CFArrayRef *list,
95 			       CFDictionaryRef parameters) = NULL;
96 
Apple80211Scan(Apple80211Ref handle,CFArrayRef * list,CFDictionaryRef parameters)97 int Apple80211Scan(Apple80211Ref handle, CFArrayRef *list,
98 		   CFDictionaryRef parameters)
99 {
100 	return __Apple80211Scan(handle, list, parameters);
101 }
102 
103 
104 static int (*__Apple80211Associate)(Apple80211Ref handle, CFDictionaryRef bss,
105 				    CFStringRef password) = NULL;
106 
Apple80211Associate(Apple80211Ref handle,CFDictionaryRef bss,CFStringRef password)107 int Apple80211Associate(Apple80211Ref handle, CFDictionaryRef bss,
108 			CFStringRef password)
109 {
110 	return __Apple80211Associate(handle, bss, password);
111 }
112 
113 
114 static int (*__Apple80211AssociateAndCopyInfo)(Apple80211Ref handle,
115 					       CFDictionaryRef bss,
116 					       CFStringRef password,
117 					       CFDictionaryRef *info) =
118 	NULL;
119 
Apple80211AssociateAndCopyInfo(Apple80211Ref handle,CFDictionaryRef bss,CFStringRef password,CFDictionaryRef * info)120 int Apple80211AssociateAndCopyInfo(Apple80211Ref handle, CFDictionaryRef bss,
121 				   CFStringRef password, CFDictionaryRef *info)
122 {
123 	return __Apple80211AssociateAndCopyInfo(handle, bss, password, info);
124 }
125 
126 
127 static int (*__Apple80211CopyValue)(Apple80211Ref handle, int field,
128 				    CFDictionaryRef arg2, void *value) = NULL;
129 
Apple80211CopyValue(Apple80211Ref handle,int field,CFDictionaryRef arg2,void * value)130 int 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) \
138 do { \
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))
_Apple80211_constructor(void)149 void _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))
_Apple80211_destructor(void)183 void _Apple80211_destructor(void)
184 {
185 	if (aeropuerto) {
186 		dlclose(aeropuerto);
187 		aeropuerto = NULL;
188 	}
189 }
190