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 42Boolean 43SCDynamicStoreAddTemporaryValue(SCDynamicStoreRef store, CFStringRef key, CFPropertyListRef value) 44{ 45 SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store; 46 kern_return_t status; 47 CFDataRef utfKey; /* serialized key */ 48 xmlData_t myKeyRef; 49 CFIndex myKeyLen; 50 CFDataRef xmlData; /* serialized data */ 51 xmlData_t myDataRef; 52 CFIndex myDataLen; 53 int newInstance; 54 int sc_status; 55 56 if (store == NULL) { 57 /* sorry, you must provide a session */ 58 _SCErrorSet(kSCStatusNoStoreSession); 59 return FALSE; 60 } 61 62 if (storePrivate->server == MACH_PORT_NULL) { 63 /* sorry, you must have an open session to play */ 64 _SCErrorSet(kSCStatusNoStoreServer); 65 return FALSE; 66 } 67 68 /* serialize the key */ 69 if (!_SCSerializeString(key, &utfKey, (void **)&myKeyRef, &myKeyLen)) { 70 _SCErrorSet(kSCStatusFailed); 71 return FALSE; 72 } 73 74 /* serialize the data */ 75 if (!_SCSerialize(value, &xmlData, (void **)&myDataRef, &myDataLen)) { 76 CFRelease(utfKey); 77 _SCErrorSet(kSCStatusFailed); 78 return FALSE; 79 } 80 81 retry : 82 83 /* send the key & data to the server */ 84 status = configadd_s(storePrivate->server, 85 myKeyRef, 86 (mach_msg_type_number_t)myKeyLen, 87 myDataRef, 88 (mach_msg_type_number_t)myDataLen, 89 &newInstance, 90 (int *)&sc_status); 91 92 if (__SCDynamicStoreCheckRetryAndHandleError(store, 93 status, 94 &sc_status, 95 "SCDynamicStoreAddTemporaryValue configadd_s()")) { 96 goto retry; 97 } 98 99 /* clean up */ 100 CFRelease(utfKey); 101 CFRelease(xmlData); 102 103 if (sc_status != kSCStatusOK) { 104 _SCErrorSet(sc_status); 105 return FALSE; 106 } 107 108 return TRUE; 109} 110 111Boolean 112SCDynamicStoreAddValue(SCDynamicStoreRef store, CFStringRef key, CFPropertyListRef value) 113{ 114 SCDynamicStorePrivateRef storePrivate; 115 kern_return_t status; 116 CFDataRef utfKey; /* serialized key */ 117 xmlData_t myKeyRef; 118 CFIndex myKeyLen; 119 CFDataRef xmlData; /* serialized data */ 120 xmlData_t myDataRef; 121 CFIndex myDataLen; 122 int newInstance; 123 int sc_status; 124 125 if (store == NULL) { 126 store = __SCDynamicStoreNullSession(); 127 if (store == NULL) { 128 /* sorry, you must provide a session */ 129 _SCErrorSet(kSCStatusNoStoreSession); 130 return FALSE; 131 } 132 } 133 134 storePrivate = (SCDynamicStorePrivateRef)store; 135 if (storePrivate->server == MACH_PORT_NULL) { 136 /* sorry, you must have an open session to play */ 137 _SCErrorSet(kSCStatusNoStoreServer); 138 return FALSE; 139 } 140 141 /* serialize the key */ 142 if (!_SCSerializeString(key, &utfKey, (void **)&myKeyRef, &myKeyLen)) { 143 _SCErrorSet(kSCStatusFailed); 144 return FALSE; 145 } 146 147 /* serialize the data */ 148 if (!_SCSerialize(value, &xmlData, (void **)&myDataRef, &myDataLen)) { 149 CFRelease(utfKey); 150 _SCErrorSet(kSCStatusFailed); 151 return FALSE; 152 } 153 154 retry : 155 156 /* send the key & data to the server */ 157 status = configadd(storePrivate->server, 158 myKeyRef, 159 (mach_msg_type_number_t)myKeyLen, 160 myDataRef, 161 (mach_msg_type_number_t)myDataLen, 162 &newInstance, 163 (int *)&sc_status); 164 165 if (__SCDynamicStoreCheckRetryAndHandleError(store, 166 status, 167 &sc_status, 168 "SCDynamicStoreAddValue configadd()")) { 169 goto retry; 170 } 171 172 /* clean up */ 173 CFRelease(utfKey); 174 CFRelease(xmlData); 175 176 if (sc_status != kSCStatusOK) { 177 _SCErrorSet(sc_status); 178 return FALSE; 179 } 180 181 return TRUE; 182} 183