1/* 2 * Copyright (c) 2000-2005, 2009-2011, 2013 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 * June 1, 2001 Allan Nathanson <ajn@apple.com> 28 * - public API conversion 29 * 30 * March 24, 2000 Allan Nathanson <ajn@apple.com> 31 * - initial revision 32 */ 33 34#include <mach/mach.h> 35#include <mach/mach_error.h> 36 37#include <SystemConfiguration/SystemConfiguration.h> 38#include <SystemConfiguration/SCPrivate.h> 39#include "SCDynamicStoreInternal.h" 40#include "config.h" /* MiG generated file */ 41 42CFArrayRef 43SCDynamicStoreCopyKeyList(SCDynamicStoreRef store, CFStringRef pattern) 44{ 45 SCDynamicStorePrivateRef storePrivate; 46 kern_return_t status; 47 CFDataRef utfPattern; /* serialized pattern */ 48 xmlData_t myPatternRef; 49 CFIndex myPatternLen; 50 xmlDataOut_t xmlDataRef = NULL; /* serialized data */ 51 mach_msg_type_number_t xmlDataLen = 0; 52 int sc_status; 53 CFArrayRef allKeys; 54 55 if (store == NULL) { 56 store = __SCDynamicStoreNullSession(); 57 if (store == NULL) { 58 /* sorry, you must provide a session */ 59 _SCErrorSet(kSCStatusNoStoreSession); 60 return NULL; 61 } 62 } 63 64 storePrivate = (SCDynamicStorePrivateRef)store; 65 if (storePrivate->server == MACH_PORT_NULL) { 66 _SCErrorSet(kSCStatusNoStoreServer); 67 return NULL; 68 } 69 70 /* serialize the pattern */ 71 if (!_SCSerializeString(pattern, &utfPattern, (void **)&myPatternRef, &myPatternLen)) { 72 _SCErrorSet(kSCStatusFailed); 73 return NULL; 74 } 75 76 retry : 77 78 /* send the pattern & fetch the associated data from the server */ 79 status = configlist(storePrivate->server, 80 myPatternRef, 81 (mach_msg_type_number_t)myPatternLen, 82 TRUE, /* isRegex == TRUE */ 83 &xmlDataRef, 84 &xmlDataLen, 85 (int *)&sc_status); 86 87 if (__SCDynamicStoreCheckRetryAndHandleError(store, 88 status, 89 &sc_status, 90 "SCDynamicStoreCopyKeyList configlist()")) { 91 goto retry; 92 } 93 94 /* clean up */ 95 CFRelease(utfPattern); 96 97 if (sc_status != kSCStatusOK) { 98 if (xmlDataRef != NULL) { 99 (void) vm_deallocate(mach_task_self(), (vm_address_t)xmlDataRef, xmlDataLen); 100 } 101 _SCErrorSet(sc_status); 102 return NULL; 103 } 104 105 /* un-serialize the list of keys */ 106 if (!_SCUnserialize((CFPropertyListRef *)&allKeys, NULL, xmlDataRef, xmlDataLen)) { 107 _SCErrorSet(kSCStatusFailed); 108 return NULL; 109 } 110 111 return allKeys; 112} 113