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