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