]> git.saurik.com Git - apple/configd.git/blob - SystemConfiguration.fproj/dy_framework.c
e69f9aba9781d18ca0290cbb68d635647e8e39eb
[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, uint32_t 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__ kern_return_t
222 _IORegistryEntryGetRegistryEntryID(io_registry_entry_t entry, uint64_t *entryID)
223 {
224 #undef IORegistryEntryGetRegistryEntryID
225 static typeof (IORegistryEntryGetRegistryEntryID) *dyfunc = NULL;
226 if (!dyfunc) {
227 void *image = __loadIOKit();
228 if (image) dyfunc = dlsym(image, "IORegistryEntryGetRegistryEntryID");
229 }
230 return dyfunc ? dyfunc(entry, entryID) : KERN_FAILURE;
231 }
232
233
234 __private_extern__ CFTypeRef
235 _IORegistryEntrySearchCFProperty(io_registry_entry_t entry, const io_name_t plane, CFStringRef key, CFAllocatorRef allocator, IOOptionBits options)
236 {
237 #undef IORegistryEntrySearchCFProperty
238 static typeof (IORegistryEntrySearchCFProperty) *dyfunc = NULL;
239 if (!dyfunc) {
240 void *image = __loadIOKit();
241 if (image) dyfunc = dlsym(image, "IORegistryEntrySearchCFProperty");
242 }
243 return dyfunc ? dyfunc(entry, plane, key, allocator, options) : NULL;
244 }
245
246
247 __private_extern__ kern_return_t
248 _IOServiceGetMatchingServices(mach_port_t masterPort, CFDictionaryRef matching, io_iterator_t *existing)
249 {
250 #undef IOServiceGetMatchingServices
251 static typeof (IOServiceGetMatchingServices) *dyfunc = NULL;
252 if (!dyfunc) {
253 void *image = __loadIOKit();
254 if (image) dyfunc = dlsym(image, "IOServiceGetMatchingServices");
255 }
256 return dyfunc ? dyfunc(masterPort, matching, existing) : KERN_FAILURE;
257 }
258
259
260 __private_extern__ CFMutableDictionaryRef
261 _IOServiceMatching(const char *name)
262 {
263 #undef IOServiceMatching
264 static typeof (IOServiceMatching) *dyfunc = NULL;
265 if (!dyfunc) {
266 void *image = __loadIOKit();
267 if (image) dyfunc = dlsym(image, "IOServiceMatching");
268 }
269 return dyfunc ? dyfunc(name) : NULL;
270 }
271
272 #pragma mark -
273 #pragma mark Security.framework APIs
274
275 static void *
276 __loadSecurity(void) {
277 static void *image = NULL;
278 if (NULL == image) {
279 #if TARGET_OS_IPHONE
280 const char *framework = "/System/Library/Frameworks/Security.framework/Security";
281 #else
282 const char *framework = "/System/Library/Frameworks/Security.framework/Versions/A/Security";
283 #endif
284 struct stat statbuf;
285 const char *suffix = getenv("DYLD_IMAGE_SUFFIX");
286 char path[MAXPATHLEN];
287
288 strlcpy(path, framework, sizeof(path));
289 if (suffix) strlcat(path, suffix, sizeof(path));
290 if (0 <= stat(path, &statbuf)) {
291 image = dlopen(path, RTLD_LAZY | RTLD_LOCAL);
292 } else {
293 image = dlopen(framework, RTLD_LAZY | RTLD_LOCAL);
294 }
295 }
296 return (void *)image;
297 }
298
299 #if !TARGET_OS_IPHONE
300
301 #define SECURITY_FRAMEWORK_EXTERN(t, s) \
302 __private_extern__ t \
303 _ ## s() \
304 { \
305 static t *dysym = NULL; \
306 if (!dysym) { \
307 void *image = __loadSecurity(); \
308 if (image) dysym = dlsym(image, #s ); \
309 } \
310 return (dysym != NULL) ? *dysym : NULL; \
311 }
312
313 SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecAttrService)
314 SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecClass)
315 SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecClassGenericPassword)
316 SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecMatchLimit)
317 SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecMatchLimitAll)
318 SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecMatchSearchList)
319 SECURITY_FRAMEWORK_EXTERN(CFTypeRef, kSecReturnRef)
320
321 __private_extern__ OSStatus
322 _AuthorizationMakeExternalForm(AuthorizationRef authorization, AuthorizationExternalForm *extForm)
323 {
324 #undef AuthorizationMakeExternalForm
325 static typeof (AuthorizationMakeExternalForm) *dyfunc = NULL;
326 if (!dyfunc) {
327 void *image = __loadSecurity();
328 if (image) dyfunc = dlsym(image, "AuthorizationMakeExternalForm");
329 }
330 return dyfunc ? dyfunc(authorization, extForm) : -1;
331 }
332
333 __private_extern__ OSStatus
334 _SecAccessCreate(CFStringRef descriptor, CFArrayRef trustedlist, SecAccessRef *accessRef)
335 {
336 #undef SecAccessCreate
337 static typeof (SecAccessCreate) *dyfunc = NULL;
338 if (!dyfunc) {
339 void *image = __loadSecurity();
340 if (image) dyfunc = dlsym(image, "SecAccessCreate");
341 }
342 return dyfunc ? dyfunc(descriptor, trustedlist, accessRef) : -1;
343 }
344
345 #if (__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
346 __private_extern__ OSStatus
347 _SecAccessCreateFromOwnerAndACL(const CSSM_ACL_OWNER_PROTOTYPE *owner, uint32 aclCount, const CSSM_ACL_ENTRY_INFO *acls, SecAccessRef *accessRef)
348 {
349 #undef SecAccessCreateFromOwnerAndACL
350 static typeof (SecAccessCreateFromOwnerAndACL) *dyfunc = NULL;
351 if (!dyfunc) {
352 void *image = __loadSecurity();
353 if (image) dyfunc = dlsym(image, "SecAccessCreateFromOwnerAndACL");
354 }
355 return dyfunc ? dyfunc(owner, aclCount, acls, accessRef) : -1;
356 }
357 #else // (__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
358 __private_extern__ SecAccessRef
359 _SecAccessCreateWithOwnerAndACL(uid_t userId, gid_t groupId, SecAccessOwnerType ownerType, CFArrayRef acls, CFErrorRef *error)
360 {
361 #undef SecAccessCreateWithOwnerAndACL
362 static typeof (SecAccessCreateWithOwnerAndACL) *dyfunc = NULL;
363 if (!dyfunc) {
364 void *image = __loadSecurity();
365 if (image) dyfunc = dlsym(image, "SecAccessCreateWithOwnerAndACL");
366 }
367 return dyfunc ? dyfunc(userId, groupId, ownerType, acls, error) : NULL;
368 }
369 #endif // (__MAC_OS_X_VERSION_MIN_REQUIRED < 1070)
370
371 __private_extern__ OSStatus
372 _SecItemCopyMatching(CFDictionaryRef query, CFTypeRef *result)
373 {
374 #undef SecItemCopyMatching
375 static typeof (SecItemCopyMatching) *dyfunc = NULL;
376 if (!dyfunc) {
377 void *image = __loadSecurity();
378 if (image) dyfunc = dlsym(image, "SecItemCopyMatching");
379 }
380 return dyfunc ? dyfunc(query, result) : -1;
381 }
382
383 __private_extern__ OSStatus
384 _SecKeychainCopyDomainDefault(SecPreferencesDomain domain, SecKeychainRef *keychain)
385 {
386 #undef SecKeychainCopyDomainDefault
387 static typeof (SecKeychainCopyDomainDefault) *dyfunc = NULL;
388 if (!dyfunc) {
389 void *image = __loadSecurity();
390 if (image) dyfunc = dlsym(image, "SecKeychainCopyDomainDefault");
391 }
392 return dyfunc ? dyfunc(domain, keychain) : -1;
393 }
394
395 __private_extern__ OSStatus
396 _SecKeychainGetPreferenceDomain(SecPreferencesDomain *domain)
397 {
398 #undef SecKeychainGetPreferenceDomain
399 static typeof (SecKeychainGetPreferenceDomain) *dyfunc = NULL;
400 if (!dyfunc) {
401 void *image = __loadSecurity();
402 if (image) dyfunc = dlsym(image, "SecKeychainGetPreferenceDomain");
403 }
404 return dyfunc ? dyfunc(domain) : -1;
405 }
406
407 __private_extern__ OSStatus
408 _SecKeychainOpen(const char *pathName, SecKeychainRef *keychain)
409 {
410 #undef SecKeychainOpen
411 static typeof (SecKeychainOpen) *dyfunc = NULL;
412 if (!dyfunc) {
413 void *image = __loadSecurity();
414 if (image) dyfunc = dlsym(image, "SecKeychainOpen");
415 }
416 return dyfunc ? dyfunc(pathName, keychain) : -1;
417 }
418
419 __private_extern__ OSStatus
420 _SecKeychainSetDomainDefault(SecPreferencesDomain domain, SecKeychainRef keychain)
421 {
422 #undef SecKeychainSetDomainDefault
423 static typeof (SecKeychainSetDomainDefault) *dyfunc = NULL;
424 if (!dyfunc) {
425 void *image = __loadSecurity();
426 if (image) dyfunc = dlsym(image, "SecKeychainSetDomainDefault");
427 }
428 return dyfunc ? dyfunc(domain, keychain) : -1;
429 }
430
431 __private_extern__ OSStatus
432 _SecKeychainSetPreferenceDomain(SecPreferencesDomain domain)
433 {
434 #undef SecKeychainSetPreferenceDomain
435 static typeof (SecKeychainSetPreferenceDomain) *dyfunc = NULL;
436 if (!dyfunc) {
437 void *image = __loadSecurity();
438 if (image) dyfunc = dlsym(image, "SecKeychainSetPreferenceDomain");
439 }
440 return dyfunc ? dyfunc(domain) : -1;
441 }
442
443 __private_extern__ OSStatus
444 _SecKeychainItemCopyContent(SecKeychainItemRef itemRef, SecItemClass *itemClass, SecKeychainAttributeList *attrList, UInt32 *length, void **outData)
445 {
446 #undef SecKeychainItemCopyContent
447 static typeof (SecKeychainItemCopyContent) *dyfunc = NULL;
448 if (!dyfunc) {
449 void *image = __loadSecurity();
450 if (image) dyfunc = dlsym(image, "SecKeychainItemCopyContent");
451 }
452 return dyfunc ? dyfunc(itemRef, itemClass, attrList, length, outData) : -1;
453 }
454
455 __private_extern__ OSStatus
456 _SecKeychainItemCreateFromContent(SecItemClass itemClass, SecKeychainAttributeList *attrList, UInt32 length, const void *data, SecKeychainRef keychainRef, SecAccessRef initialAccess, SecKeychainItemRef *itemRef)
457 {
458 #undef SecKeychainItemCreateFromContent
459 static typeof (SecKeychainItemCreateFromContent) *dyfunc = NULL;
460 if (!dyfunc) {
461 void *image = __loadSecurity();
462 if (image) dyfunc = dlsym(image, "SecKeychainItemCreateFromContent");
463 }
464 return dyfunc ? dyfunc(itemClass, attrList, length, data, keychainRef, initialAccess, itemRef) : -1;
465 }
466
467 __private_extern__ OSStatus
468 _SecKeychainItemDelete(SecKeychainItemRef itemRef)
469 {
470 #undef SecKeychainItemDelete
471 static typeof (SecKeychainItemDelete) *dyfunc = NULL;
472 if (!dyfunc) {
473 void *image = __loadSecurity();
474 if (image) dyfunc = dlsym(image, "SecKeychainItemDelete");
475 }
476 return dyfunc ? dyfunc(itemRef) : -1;
477 }
478
479 __private_extern__ OSStatus
480 _SecKeychainItemFreeContent(SecKeychainAttributeList *attrList, void *data)
481 {
482 #undef SecKeychainItemFreeContent
483 static typeof (SecKeychainItemFreeContent) *dyfunc = NULL;
484 if (!dyfunc) {
485 void *image = __loadSecurity();
486 if (image) dyfunc = dlsym(image, "SecKeychainItemFreeContent");
487 }
488 return dyfunc ? dyfunc(attrList, data) : -1;
489 }
490
491 __private_extern__ OSStatus
492 _SecKeychainItemModifyContent(SecKeychainItemRef itemRef, const SecKeychainAttributeList *attrList, UInt32 length, const void *data)
493 {
494 #undef SecKeychainItemModifyContent
495 static typeof (SecKeychainItemModifyContent) *dyfunc = NULL;
496 if (!dyfunc) {
497 void *image = __loadSecurity();
498 if (image) dyfunc = dlsym(image, "SecKeychainItemModifyContent");
499 }
500 return dyfunc ? dyfunc(itemRef, attrList, length, data) : -1;
501 }
502
503
504 __private_extern__ OSStatus
505 _SecTrustedApplicationCreateFromPath(const char *path, SecTrustedApplicationRef *app)
506 {
507 #undef SecTrustedApplicationCreateFromPath
508 static typeof (SecTrustedApplicationCreateFromPath) *dyfunc = NULL;
509 if (!dyfunc) {
510 void *image = __loadSecurity();
511 if (image) dyfunc = dlsym(image, "SecTrustedApplicationCreateFromPath");
512 }
513 return dyfunc ? dyfunc(path, app) : -1;
514 }
515
516 #endif // !TARGET_OS_IPHONE
517
518 __private_extern__ SecCertificateRef
519 _SecCertificateCreateWithData(CFAllocatorRef allocator, CFDataRef data)
520 {
521 #undef SecCertificateCreateWithData
522 static typeof (SecCertificateCreateWithData) *dyfunc = NULL;
523 if (!dyfunc) {
524 void *image = __loadSecurity();
525 if (image) dyfunc = dlsym(image, "SecCertificateCreateWithData");
526 }
527 return dyfunc ? dyfunc(allocator, data) : NULL;
528 }
529