]> git.saurik.com Git - apple/configd.git/blob - configd.tproj/_configadd.c
configd-699.1.5.tar.gz
[apple/configd.git] / configd.tproj / _configadd.c
1 /*
2 * Copyright (c) 2000, 2001, 2003, 2004, 2006, 2008, 2011, 2012, 2014 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 "configd.h"
35 #include "session.h"
36
37 __private_extern__
38 int
39 __SCDynamicStoreAddValue(SCDynamicStoreRef store, CFStringRef key, CFDataRef value)
40 {
41 int sc_status = kSCStatusOK;
42 SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store;
43 CFDataRef tempValue;
44
45 if (_configd_trace) {
46 SCTrace(TRUE, _configd_trace,
47 CFSTR("%s%s : %5d : %@\n"),
48 "add ",
49 storePrivate->useSessionKeys ? "t " : " ",
50 storePrivate->server,
51 key);
52 }
53
54 /*
55 * Ensure that this is a new key.
56 */
57 sc_status = __SCDynamicStoreCopyValue(store, key, &tempValue, TRUE);
58 switch (sc_status) {
59 case kSCStatusNoKey :
60 /* store key does not exist, proceed */
61 break;
62
63 case kSCStatusOK :
64 /* store key exists, sorry */
65 CFRelease(tempValue);
66 sc_status = kSCStatusKeyExists;
67 goto done;
68
69 default :
70 #ifdef DEBUG
71 SCLog(_configd_verbose, LOG_DEBUG, CFSTR("__SCDynamicStoreAddValue __SCDynamicStoreCopyValue(): %s"), SCErrorString(sc_status));
72 #endif /* DEBUG */
73 goto done;
74 }
75
76 /*
77 * Save the new key.
78 */
79 sc_status = __SCDynamicStoreSetValue(store, key, value, TRUE);
80
81 /* push changes */
82 __SCDynamicStorePush();
83
84 done:
85
86 return sc_status;
87 }
88
89
90 __private_extern__
91 kern_return_t
92 _configadd(mach_port_t server,
93 xmlData_t keyRef, /* raw XML bytes */
94 mach_msg_type_number_t keyLen,
95 xmlData_t dataRef, /* raw XML bytes */
96 mach_msg_type_number_t dataLen,
97 int *newInstance,
98 int *sc_status,
99 audit_token_t audit_token)
100 {
101 CFStringRef key = NULL; /* key (un-serialized) */
102 CFDataRef data = NULL; /* data (un-serialized) */
103 serverSessionRef mySession;
104
105 *sc_status = kSCStatusOK;
106
107 /* un-serialize the key */
108 if (!_SCUnserializeString(&key, NULL, (void *)keyRef, keyLen)) {
109 *sc_status = kSCStatusFailed;
110 goto done;
111 }
112
113 /* un-serialize the data */
114 if (!_SCUnserializeData(&data, (void *)dataRef, dataLen)) {
115 *sc_status = kSCStatusFailed;
116 }
117
118 if (*sc_status != kSCStatusOK) {
119 goto done;
120 }
121
122 if (!isA_CFString(key)) {
123 *sc_status = kSCStatusInvalidArgument;
124 goto done;
125 }
126
127 mySession = getSession(server);
128 if (mySession == NULL) {
129 mySession = tempSession(server, CFSTR("SCDynamicStoreAddValue"), audit_token);
130 if (mySession == NULL) {
131 /* you must have an open session to play */
132 *sc_status = kSCStatusNoStoreSession;
133 goto done;
134 }
135 }
136
137 if (!hasWriteAccess(mySession, key)) {
138 *sc_status = kSCStatusAccessError;
139 goto done;
140 }
141
142 *sc_status = __SCDynamicStoreAddValue(mySession->store, key, data);
143 if (*sc_status == kSCStatusOK) {
144 *newInstance = 0;
145 }
146
147 done :
148
149 if (key != NULL) CFRelease(key);
150 if (data != NULL) CFRelease(data);
151
152 return KERN_SUCCESS;
153 }
154
155
156 __private_extern__
157 kern_return_t
158 _configadd_s(mach_port_t server,
159 xmlData_t keyRef, /* raw XML bytes */
160 mach_msg_type_number_t keyLen,
161 xmlData_t dataRef, /* raw XML bytes */
162 mach_msg_type_number_t dataLen,
163 int *newInstance,
164 int *sc_status)
165 {
166 CFDataRef data = NULL; /* data (un-serialized) */
167 CFStringRef key = NULL; /* key (un-serialized) */
168 serverSessionRef mySession;
169 SCDynamicStorePrivateRef storePrivate;
170 Boolean useSessionKeys;
171
172 *sc_status = kSCStatusOK;
173
174 /* un-serialize the key */
175 if (!_SCUnserializeString(&key, NULL, (void *)keyRef, keyLen)) {
176 *sc_status = kSCStatusFailed;
177 }
178
179 /* un-serialize the data */
180 if (!_SCUnserializeData(&data, (void *)dataRef, dataLen)) {
181 *sc_status = kSCStatusFailed;
182 }
183
184 if (*sc_status != kSCStatusOK) {
185 goto done;
186 }
187
188 if (!isA_CFString(key)) {
189 *sc_status = kSCStatusInvalidArgument;
190 goto done;
191 }
192
193 mySession = getSession(server);
194 if (mySession == NULL) {
195 /* you must have an open session to play */
196 *sc_status = kSCStatusNoStoreSession;
197 goto done;
198 }
199
200 if (!hasWriteAccess(mySession, key)) {
201 *sc_status = kSCStatusAccessError;
202 goto done;
203 }
204
205 // force "useSessionKeys"
206 storePrivate = (SCDynamicStorePrivateRef)mySession->store;
207 useSessionKeys = storePrivate->useSessionKeys;
208 storePrivate->useSessionKeys = TRUE;
209
210 *sc_status = __SCDynamicStoreAddValue(mySession->store, key, data);
211 if (*sc_status == kSCStatusOK) {
212 *newInstance = 0;
213 }
214
215 // restore "useSessionKeys"
216 storePrivate->useSessionKeys = useSessionKeys;
217
218 done :
219
220 if (key != NULL) CFRelease(key);
221 if (data != NULL) CFRelease(data);
222
223 return KERN_SUCCESS;
224 }