]> git.saurik.com Git - apple/configd.git/blob - SystemConfiguration.fproj/dy_framework.c
configd-395.10.tar.gz
[apple/configd.git] / SystemConfiguration.fproj / dy_framework.c
1 /*
2 * Copyright (c) 2002-2008, 2010, 2011 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 * Modification History
26 *
27 * October 31, 2000 Allan Nathanson <ajn@apple.com>
28 * - initial revision
29 */
30
31
32 #include <sys/types.h>
33 #include <sys/param.h>
34 #include <sys/stat.h>
35 #include <dlfcn.h>
36
37 #include "dy_framework.h"
38
39
40
41 #pragma mark -
42 #pragma mark IOKit.framework APIs
43
44 static void *
45 __loadIOKit(void) {
46 static void *image = NULL;
47 if (NULL == image) {
48 const char *framework = "/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit";
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
65 __private_extern__ CFMutableDictionaryRef
66 _IOBSDNameMatching(mach_port_t masterPort, unsigned int options, const char *bsdName)
67 {
68 #undef IOBSDNameMatching
69 static typeof (IOBSDNameMatching) *dyfunc = NULL;
70 if (!dyfunc) {
71 void *image = __loadIOKit();
72 if (image) dyfunc = dlsym(image, "IOBSDNameMatching");
73 }
74 return dyfunc ? dyfunc(masterPort, options, bsdName) : NULL;
75 }
76
77
78 __private_extern__ io_object_t
79 _IOIteratorNext(io_iterator_t iterator)
80 {
81 #undef IOIteratorNext
82 static typeof (IOIteratorNext) *dyfunc = NULL;
83 if (!dyfunc) {
84 void *image = __loadIOKit();
85 if (image) dyfunc = dlsym(image, "IOIteratorNext");
86 }
87 return dyfunc ? dyfunc(iterator) : 0;
88 }
89
90
91 __private_extern__ kern_return_t
92 _IOMasterPort(mach_port_t bootstrapPort, mach_port_t *masterPort)
93 {
94 #undef IOMasterPort
95 static typeof (IOMasterPort) *dyfunc = NULL;
96 if (!dyfunc) {
97 void *image = __loadIOKit();
98 if (image) dyfunc = dlsym(image, "IOMasterPort");
99 }
100 return dyfunc ? dyfunc(bootstrapPort, masterPort) : KERN_FAILURE;
101 }
102
103
104 __private_extern__ boolean_t
105 _IOObjectConformsTo(io_object_t object, const io_name_t className)
106 {
107 #undef IOObjectConformsTo
108 static typeof (IOObjectConformsTo) *dyfunc = NULL;
109 if (!dyfunc) {
110 void *image = __loadIOKit();
111 if (image) dyfunc = dlsym(image, "IOObjectConformsTo");
112 }
113 return dyfunc ? dyfunc(object, className) : FALSE;
114 }
115
116
117 __private_extern__ boolean_t
118 _IOObjectGetClass(io_object_t object, io_name_t className)
119 {
120 #undef IOObjectGetClass
121 static typeof (IOObjectGetClass) *dyfunc = NULL;
122 if (!dyfunc) {
123 void *image = __loadIOKit();
124 if (image) dyfunc = dlsym(image, "IOObjectGetClass");
125 }
126 return dyfunc ? dyfunc(object, className) : FALSE;
127 }
128
129
130 __private_extern__ kern_return_t
131 _IOObjectRelease(io_object_t object)
132 {
133 #undef IOObjectRelease
134 static typeof (IOObjectRelease) *dyfunc = NULL;
135 if (!dyfunc) {
136 void *image = __loadIOKit();
137 if (image) dyfunc = dlsym(image, "IOObjectRelease");
138 }
139 return dyfunc ? dyfunc(object) : KERN_FAILURE;
140 }
141
142
143 __private_extern__ CFTypeRef
144 _IORegistryEntryCreateCFProperty(io_registry_entry_t entry, CFStringRef key, CFAllocatorRef allocator, IOOptionBits options)
145 {
146 #undef IORegistryEntryCreateCFProperty
147 static typeof (IORegistryEntryCreateCFProperty) *dyfunc = NULL;
148 if (!dyfunc) {
149 void *image = __loadIOKit();
150 if (image) dyfunc = dlsym(image, "IORegistryEntryCreateCFProperty");
151 }
152 return dyfunc ? dyfunc(entry, key, allocator, options) : NULL;
153 }
154
155
156 __private_extern__ kern_return_t
157 _IORegistryEntryCreateCFProperties(io_registry_entry_t entry, CFMutableDictionaryRef *properties, CFAllocatorRef allocator, IOOptionBits options)
158 {
159 #undef IORegistryEntryCreateCFProperties
160 static typeof (IORegistryEntryCreateCFProperties) *dyfunc = NULL;
161 if (!dyfunc) {
162 void *image = __loadIOKit();
163 if (image) dyfunc = dlsym(image, "IORegistryEntryCreateCFProperties");
164 }
165 return dyfunc ? dyfunc(entry, properties, allocator, options) : KERN_FAILURE;
166 }
167
168
169 __private_extern__ kern_return_t
170 _IORegistryEntryCreateIterator(mach_port_t masterPort, const io_name_t plane, IOOptionBits options, io_iterator_t *iterator)
171 {
172 #undef IORegistryEntryCreateIterator
173 static typeof (IORegistryEntryCreateIterator) *dyfunc = NULL;
174 if (!dyfunc) {
175 void *image = __loadIOKit();
176 if (image) dyfunc = dlsym(image, "IORegistryEntryCreateIterator");
177 }
178 return dyfunc ? dyfunc(masterPort, plane, options, iterator) : KERN_FAILURE;
179 }
180
181
182 __private_extern__ kern_return_t
183 _IORegistryEntryGetName(io_registry_entry_t entry, io_name_t name)
184 {
185 #undef IORegistryEntryGetName
186 static typeof (IORegistryEntryGetName) *dyfunc = NULL;
187 if (!dyfunc) {
188 void *image = __loadIOKit();
189 if (image) dyfunc = dlsym(image, "IORegistryEntryGetName");
190 }
191 return dyfunc ? dyfunc(entry, name) : KERN_FAILURE;
192 }
193
194
195 __private_extern__ kern_return_t
196 _IORegistryEntryGetParentEntry(io_registry_entry_t entry, const io_name_t plane, io_registry_entry_t *parent)
197 {
198 #undef IORegistryEntryGetParentEntry
199 static typeof (IORegistryEntryGetParentEntry) *dyfunc = NULL;
200 if (!dyfunc) {
201 void *image = __loadIOKit();
202 if (image) dyfunc = dlsym(image, "IORegistryEntryGetParentEntry");
203 }
204 return dyfunc ? dyfunc(entry, plane, parent) : KERN_FAILURE;
205 }
206
207
208 __private_extern__ kern_return_t
209 _IORegistryEntryGetPath(io_registry_entry_t entry, const io_name_t plane, io_string_t path)
210 {
211 #undef IORegistryEntryGetPath
212 static typeof (IORegistryEntryGetPath) *dyfunc = NULL;
213 if (!dyfunc) {
214 void *image = __loadIOKit();
215 if (image) dyfunc = dlsym(image, "IORegistryEntryGetPath");
216 }
217 return dyfunc ? dyfunc(entry, plane, path) : KERN_FAILURE;
218 }
219
220
221 __private_extern__ CFTypeRef
222 _IORegistryEntrySearchCFProperty(io_registry_entry_t entry, const io_name_t plane, CFStringRef key, CFAllocatorRef allocator, IOOptionBits options)
223 {
224 #undef IORegistryEntrySearchCFProperty
225 static typeof (IORegistryEntrySearchCFProperty) *dyfunc = NULL;
226 if (!dyfunc) {
227 void *image = __loadIOKit();
228 if (image) dyfunc = dlsym(image, "IORegistryEntrySearchCFProperty");
229 }
230 return dyfunc ? dyfunc(entry, plane, key, allocator, options) : NULL;
231 }
232
233
234 __private_extern__ kern_return_t
235 _IOServiceGetMatchingServices(mach_port_t masterPort, CFDictionaryRef matching, io_iterator_t *existing)
236 {
237 #undef IOServiceGetMatchingServices
238 static typeof (IOServiceGetMatchingServices) *dyfunc = NULL;
239 if (!dyfunc) {
240 void *image = __loadIOKit();
241 if (image) dyfunc = dlsym(image, "IOServiceGetMatchingServices");
242 }
243 return dyfunc ? dyfunc(masterPort, matching, existing) : KERN_FAILURE;
244 }
245
246
247 __private_extern__ CFMutableDictionaryRef
248 _IOServiceMatching(const char *name)
249 {
250 #undef IOServiceMatching
251 static typeof (IOServiceMatching) *dyfunc = NULL;
252 if (!dyfunc) {
253 void *image = __loadIOKit();
254 if (image) dyfunc = dlsym(image, "IOServiceMatching");
255 }
256 return dyfunc ? dyfunc(name) : NULL;
257 }
258
259 #pragma mark -
260 #pragma mark Security.framework APIs
261
262 static void *
263 __loadSecurity(void) {
264 static void *image = NULL;
265 if (NULL == image) {
266 #if TARGET_OS_IPHONE
267 const char *framework = "/System/Library/Frameworks/Security.framework/Security";
268 #else
269 const char *framework = "/System/Library/Frameworks/Security.framework/Versions/A/Security";
270 #endif
271 struct stat statbuf;
272 const char *suffix = getenv("DYLD_IMAGE_SUFFIX");
273 char path[MAXPATHLEN];
274
275 strlcpy(path, framework, sizeof(path));
276 if (suffix) strlcat(path, suffix, sizeof(path));
277 if (0 <= stat(path, &statbuf)) {
278 image = dlopen(path, RTLD_LAZY | RTLD_LOCAL);
279 } else {
280 image = dlopen(framework, RTLD_LAZY | RTLD_LOCAL);
281 }
282 }
283 return (void *)image;
284 }
285
286 #if !TARGET_OS_IPHONE
287
288 #define SECURITY_FRAMEWORK_EXTERN(t, s) \
289 __private_extern__ t \
290 _ ## s() \
291 { \
292 static t *dysym = NULL; \
293 if (!dysym) { \
294 void *image = __loadSecurity(); \
295 if (image) dysym = dlsym(image, #s ); \
296 } \
297 return (dysym != NULL) ? *dysym : NULL; \
298 }
299
300 SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecAttrService)
301 SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecClass)
302 SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecClassGenericPassword)
303 SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecMatchLimit)
304 SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecMatchLimitAll)
305 SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecMatchSearchList)
306 SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecReturnRef)
307
308 __private_extern__ OSStatus
309 _AuthorizationMakeExternalForm(AuthorizationRef authorization, AuthorizationExternalForm *extForm)
310 {
311 #undef AuthorizationMakeExternalForm
312 static typeof (AuthorizationMakeExternalForm) *dyfunc = NULL;
313 if (!dyfunc) {
314 void *image = __loadSecurity();
315 if (image) dyfunc = dlsym(image, "AuthorizationMakeExternalForm");
316 }
317 return dyfunc ? dyfunc(authorization, extForm) : -1;
318 }
319
320 __private_extern__ OSStatus
321 _SecAccessCreate(CFStringRef descriptor, CFArrayRef trustedlist, SecAccessRef *accessRef)
322 {
323 #undef SecAccessCreate
324 static typeof (SecAccessCreate) *dyfunc = NULL;
325 if (!dyfunc) {
326 void *image = __loadSecurity();
327 if (image) dyfunc = dlsym(image, "SecAccessCreate");
328 }
329 return dyfunc ? dyfunc(descriptor, trustedlist, accessRef) : -1;
330 }
331
332 #if (__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
333 __private_extern__ OSStatus
334 _SecAccessCreateFromOwnerAndACL(const CSSM_ACL_OWNER_PROTOTYPE *owner, uint32 aclCount, const CSSM_ACL_ENTRY_INFO *acls, SecAccessRef *accessRef)
335 {
336 #undef SecAccessCreateFromOwnerAndACL
337 static typeof (SecAccessCreateFromOwnerAndACL) *dyfunc = NULL;
338 if (!dyfunc) {
339 void *image = __loadSecurity();
340 if (image) dyfunc = dlsym(image, "SecAccessCreateFromOwnerAndACL");
341 }
342 return dyfunc ? dyfunc(owner, aclCount, acls, accessRef) : -1;
343 }
344 #else // (__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
345 __private_extern__ SecAccessRef
346 _SecAccessCreateWithOwnerAndACL(uid_t userId, gid_t groupId, SecAccessOwnerType ownerType, CFArrayRef acls, CFErrorRef *error)
347 {
348 #undef SecAccessCreateWithOwnerAndACL
349 static typeof (SecAccessCreateWithOwnerAndACL) *dyfunc = NULL;
350 if (!dyfunc) {
351 void *image = __loadSecurity();
352 if (image) dyfunc = dlsym(image, "SecAccessCreateWithOwnerAndACL");
353 }
354 return dyfunc ? dyfunc(userId, groupId, ownerType, acls, error) : NULL;
355 }
356 #endif // (__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
357
358 __private_extern__ OSStatus
359 _SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result)
360 {
361 #undef SecItemCopyMatching
362 static typeof (SecItemCopyMatching) *dyfunc = NULL;
363 if (!dyfunc) {
364 void *image = __loadSecurity();
365 if (image) dyfunc = dlsym(image, "SecItemCopyMatching");
366 }
367 return dyfunc ? dyfunc(query, result) : -1;
368 }
369
370 __private_extern__ OSStatus
371 _SecKeychainCopyDomainDefault(SecPreferencesDomain domain, SecKeychainRef *keychain)
372 {
373 #undef SecKeychainCopyDomainDefault
374 static typeof (SecKeychainCopyDomainDefault) *dyfunc = NULL;
375 if (!dyfunc) {
376 void *image = __loadSecurity();
377 if (image) dyfunc = dlsym(image, "SecKeychainCopyDomainDefault");
378 }
379 return dyfunc ? dyfunc(domain, keychain) : -1;
380 }
381
382 __private_extern__ OSStatus
383 _SecKeychainGetPreferenceDomain(SecPreferencesDomain *domain)
384 {
385 #undef SecKeychainGetPreferenceDomain
386 static typeof (SecKeychainGetPreferenceDomain) *dyfunc = NULL;
387 if (!dyfunc) {
388 void *image = __loadSecurity();
389 if (image) dyfunc = dlsym(image, "SecKeychainGetPreferenceDomain");
390 }
391 return dyfunc ? dyfunc(domain) : -1;
392 }
393
394 __private_extern__ OSStatus
395 _SecKeychainOpen(const char *pathName, SecKeychainRef *keychain)
396 {
397 #undef SecKeychainOpen
398 static typeof (SecKeychainOpen) *dyfunc = NULL;
399 if (!dyfunc) {
400 void *image = __loadSecurity();
401 if (image) dyfunc = dlsym(image, "SecKeychainOpen");
402 }
403 return dyfunc ? dyfunc(pathName, keychain) : -1;
404 }
405
406 __private_extern__ OSStatus
407 _SecKeychainSetDomainDefault(SecPreferencesDomain domain, SecKeychainRef keychain)
408 {
409 #undef SecKeychainSetDomainDefault
410 static typeof (SecKeychainSetDomainDefault) *dyfunc = NULL;
411 if (!dyfunc) {
412 void *image = __loadSecurity();
413 if (image) dyfunc = dlsym(image, "SecKeychainSetDomainDefault");
414 }
415 return dyfunc ? dyfunc(domain, keychain) : -1;
416 }
417
418 __private_extern__ OSStatus
419 _SecKeychainSetPreferenceDomain(SecPreferencesDomain domain)
420 {
421 #undef SecKeychainSetPreferenceDomain
422 static typeof (SecKeychainSetPreferenceDomain) *dyfunc = NULL;
423 if (!dyfunc) {
424 void *image = __loadSecurity();
425 if (image) dyfunc = dlsym(image, "SecKeychainSetPreferenceDomain");
426 }
427 return dyfunc ? dyfunc(domain) : -1;
428 }
429
430 __private_extern__ OSStatus
431 _SecKeychainItemCopyContent(SecKeychainItemRef itemRef, SecItemClass *itemClass, SecKeychainAttributeList *attrList, UInt32 *length, void **outData)
432 {
433 #undef SecKeychainItemCopyContent
434 static typeof (SecKeychainItemCopyContent) *dyfunc = NULL;
435 if (!dyfunc) {
436 void *image = __loadSecurity();
437 if (image) dyfunc = dlsym(image, "SecKeychainItemCopyContent");
438 }
439 return dyfunc ? dyfunc(itemRef, itemClass, attrList, length, outData) : -1;
440 }
441
442 __private_extern__ OSStatus
443 _SecKeychainItemCreateFromContent(SecItemClass itemClass, SecKeychainAttributeList *attrList, UInt32 length, const void *data, SecKeychainRef keychainRef, SecAccessRef initialAccess, SecKeychainItemRef *itemRef)
444 {
445 #undef SecKeychainItemCreateFromContent
446 static typeof (SecKeychainItemCreateFromContent) *dyfunc = NULL;
447 if (!dyfunc) {
448 void *image = __loadSecurity();
449 if (image) dyfunc = dlsym(image, "SecKeychainItemCreateFromContent");
450 }
451 return dyfunc ? dyfunc(itemClass, attrList, length, data, keychainRef, initialAccess, itemRef) : -1;
452 }
453
454 __private_extern__ OSStatus
455 _SecKeychainItemDelete(SecKeychainItemRef itemRef)
456 {
457 #undef SecKeychainItemDelete
458 static typeof (SecKeychainItemDelete) *dyfunc = NULL;
459 if (!dyfunc) {
460 void *image = __loadSecurity();
461 if (image) dyfunc = dlsym(image, "SecKeychainItemDelete");
462 }
463 return dyfunc ? dyfunc(itemRef) : -1;
464 }
465
466 __private_extern__ OSStatus
467 _SecKeychainItemFreeContent(SecKeychainAttributeList *attrList, void *data)
468 {
469 #undef SecKeychainItemFreeContent
470 static typeof (SecKeychainItemFreeContent) *dyfunc = NULL;
471 if (!dyfunc) {
472 void *image = __loadSecurity();
473 if (image) dyfunc = dlsym(image, "SecKeychainItemFreeContent");
474 }
475 return dyfunc ? dyfunc(attrList, data) : -1;
476 }
477
478 __private_extern__ OSStatus
479 _SecKeychainItemModifyContent(SecKeychainItemRef itemRef, const SecKeychainAttributeList *attrList, UInt32 length, const void *data)
480 {
481 #undef SecKeychainItemModifyContent
482 static typeof (SecKeychainItemModifyContent) *dyfunc = NULL;
483 if (!dyfunc) {
484 void *image = __loadSecurity();
485 if (image) dyfunc = dlsym(image, "SecKeychainItemModifyContent");
486 }
487 return dyfunc ? dyfunc(itemRef, attrList, length, data) : -1;
488 }
489
490
491 __private_extern__ OSStatus
492 _SecTrustedApplicationCreateFromPath(const char *path, SecTrustedApplicationRef *app)
493 {
494 #undef SecTrustedApplicationCreateFromPath
495 static typeof (SecTrustedApplicationCreateFromPath) *dyfunc = NULL;
496 if (!dyfunc) {
497 void *image = __loadSecurity();
498 if (image) dyfunc = dlsym(image, "SecTrustedApplicationCreateFromPath");
499 }
500 return dyfunc ? dyfunc(path, app) : -1;
501 }
502
503 #endif // !TARGET_OS_IPHONE
504
505 __private_extern__ SecCertificateRef
506 _SecCertificateCreateWithData(CFAllocatorRef allocator, CFDataRef data)
507 {
508 #undef SecCertificateCreateWithData
509 static typeof (SecCertificateCreateWithData) *dyfunc = NULL;
510 if (!dyfunc) {
511 void *image = __loadSecurity();
512 if (image) dyfunc = dlsym(image, "SecCertificateCreateWithData");
513 }
514 return dyfunc ? dyfunc(allocator, data) : NULL;
515 }
516