2  * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved. 
   4  * @APPLE_LICENSE_HEADER_START@ 
   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 
  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. 
  21  * @APPLE_LICENSE_HEADER_END@ 
  25  * Modification History 
  27  * June 1, 2001                 Allan Nathanson <ajn@apple.com> 
  28  * - public API conversion 
  30  * March 24, 2000               Allan Nathanson <ajn@apple.com> 
  34 #include <mach/mach.h> 
  35 #include <mach/mach_error.h> 
  37 #include <SystemConfiguration/SystemConfiguration.h> 
  38 #include <SystemConfiguration/SCPrivate.h> 
  39 #include "SCDynamicStoreInternal.h" 
  40 #include "config.h"             /* MiG generated file */ 
  44 SCDynamicStoreCopyMultiple(SCDynamicStoreRef    store
, 
  48         SCDynamicStorePrivateRef        storePrivate 
= (SCDynamicStorePrivateRef
)store
; 
  50         CFDataRef                       xmlKeys         
= NULL
; /* keys (XML serialized) */ 
  51         xmlData_t                       myKeysRef       
= NULL
; /* keys (serialized) */ 
  52         CFIndex                         myKeysLen       
= 0; 
  53         CFDataRef                       xmlPatterns     
= NULL
; /* patterns (XML serialized) */ 
  54         xmlData_t                       myPatternsRef   
= NULL
; /* patterns (serialized) */ 
  55         CFIndex                         myPatternsLen   
= 0; 
  56         xmlDataOut_t                    xmlDictRef
;             /* dict (serialized) */ 
  58         CFDictionaryRef                 dict            
= NULL
; /* dict (un-serialized) */ 
  59         CFDictionaryRef                 expDict         
= NULL
; /* dict (un-serialized / expanded) */ 
  63                 /* sorry, you must provide a session */ 
  64                 _SCErrorSet(kSCStatusNoStoreSession
); 
  68         if (storePrivate
->server 
== MACH_PORT_NULL
) { 
  69                 _SCErrorSet(kSCStatusNoStoreServer
); 
  70                 return NULL
;    /* you must have an open session to play */ 
  73         /* serialize the keys */ 
  75                 if (!_SCSerialize(keys
, &xmlKeys
, (void **)&myKeysRef
, &myKeysLen
)) { 
  76                         _SCErrorSet(kSCStatusFailed
); 
  81         /* serialize the patterns */ 
  83                 if (!_SCSerialize(patterns
, &xmlPatterns
, (void **)&myPatternsRef
, &myPatternsLen
)) { 
  85                         _SCErrorSet(kSCStatusFailed
); 
  90         /* send the keys and patterns, fetch the associated result from the server */ 
  91         status 
= configget_m(storePrivate
->server
, 
 101         if (xmlKeys
)            CFRelease(xmlKeys
); 
 102         if (xmlPatterns
)        CFRelease(xmlPatterns
); 
 104         if (status 
!= KERN_SUCCESS
) { 
 106                 if (status 
!= MACH_SEND_INVALID_DEST
) 
 107                         SCLog(_sc_verbose
, LOG_DEBUG
, CFSTR("SCDynamicStoreCopyMultiple configget_m(): %s"), mach_error_string(status
)); 
 109                 (void) mach_port_destroy(mach_task_self(), storePrivate
->server
); 
 110                 storePrivate
->server 
= MACH_PORT_NULL
; 
 115         if (sc_status 
!= kSCStatusOK
) { 
 116                 status 
= vm_deallocate(mach_task_self(), (vm_address_t
)xmlDictRef
, xmlDictLen
); 
 118                 if (status 
!= KERN_SUCCESS
) { 
 119                         SCLog(TRUE
, LOG_DEBUG
, CFSTR("SCDynamicStoreCopyMultiple vm_deallocate(): %s"), mach_error_string(status
)); 
 120                         /* non-fatal???, proceed */ 
 123                 _SCErrorSet(sc_status
); 
 127         /* un-serialize the dictionary */ 
 128         if (!_SCUnserialize((CFPropertyListRef 
*)&dict
, NULL
, xmlDictRef
, xmlDictLen
)) { 
 129                 _SCErrorSet(kSCStatusFailed
); 
 133         expDict 
= _SCUnserializeMultiple(dict
); 
 141 SCDynamicStoreCopyValue(SCDynamicStoreRef store
, CFStringRef key
) 
 143         SCDynamicStorePrivateRef        storePrivate 
= (SCDynamicStorePrivateRef
)store
; 
 144         kern_return_t                   status
; 
 145         CFDataRef                       utfKey
;         /* key (XML serialized) */ 
 146         xmlData_t                       myKeyRef
;       /* key (serialized) */ 
 148         xmlDataOut_t                    xmlDataRef
;     /* data (serialized) */ 
 150         CFPropertyListRef               data
;           /* data (un-serialized) */ 
 155                 /* sorry, you must provide a session */ 
 156                 _SCErrorSet(kSCStatusNoStoreSession
); 
 160         if (storePrivate
->server 
== MACH_PORT_NULL
) { 
 161                 _SCErrorSet(kSCStatusNoStoreServer
); 
 162                 return NULL
;    /* you must have an open session to play */ 
 165         /* serialize the key */ 
 166         if (!_SCSerializeString(key
, &utfKey
, (void **)&myKeyRef
, &myKeyLen
)) { 
 167                 _SCErrorSet(kSCStatusFailed
); 
 171         /* send the key & fetch the associated data from the server */ 
 172         status 
= configget(storePrivate
->server
, 
 183         if (status 
!= KERN_SUCCESS
) { 
 185                 if (status 
!= MACH_SEND_INVALID_DEST
) 
 186                         SCLog(_sc_verbose
, LOG_DEBUG
, CFSTR("SCDynamicStoreCopyValue configget(): %s"), mach_error_string(status
)); 
 188                 (void) mach_port_destroy(mach_task_self(), storePrivate
->server
); 
 189                 storePrivate
->server 
= MACH_PORT_NULL
; 
 194         if (sc_status 
!= kSCStatusOK
) { 
 195                 status 
= vm_deallocate(mach_task_self(), (vm_address_t
)xmlDataRef
, xmlDataLen
); 
 197                 if (status 
!= KERN_SUCCESS
) { 
 198                         SCLog(TRUE
, LOG_DEBUG
, CFSTR("SCDynamicStoreCopyValue vm_deallocate(): %s"), mach_error_string(status
)); 
 199                         /* non-fatal???, proceed */ 
 202                 _SCErrorSet(sc_status
); 
 206         /* un-serialize the data */ 
 207         if (!_SCUnserialize(&data
, NULL
, xmlDataRef
, xmlDataLen
)) { 
 208                 _SCErrorSet(kSCStatusFailed
);