]> git.saurik.com Git - apple/configd.git/blobdiff - configd.tproj/_configtouch.c
configd-293.8.tar.gz
[apple/configd.git] / configd.tproj / _configtouch.c
index f241ad839f74f34dd651b2b2f6ef297bd0bf03a0..fb301310330a580afd0bff7e064974d8ac69f504 100644 (file)
@@ -1,22 +1,23 @@
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000-2004, 2006, 2008, 2009 Apple Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
- *
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
- *
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
- *
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
  * @APPLE_LICENSE_HEADER_END@
  */
 
 #include "configd.h"
 #include "session.h"
 
+__private_extern__
 int
 __SCDynamicStoreTouchValue(SCDynamicStoreRef store, CFStringRef key)
 {
        SCDynamicStorePrivateRef        storePrivate    = (SCDynamicStorePrivateRef)store;
-       int                             sc_status;
-       Boolean                         newValue        = FALSE;
-       CFPropertyListRef               value;
-
-       SCLog(_configd_verbose, LOG_DEBUG, CFSTR("__SCDynamicStoreTouchValue:"));
-       SCLog(_configd_verbose, LOG_DEBUG, CFSTR("  key = %@"), key);
+       int                             sc_status       = kSCStatusOK;
+       CFDataRef                       value;
 
-       if (!store || (storePrivate->server == MACH_PORT_NULL)) {
+       if ((store == NULL) || (storePrivate->server == MACH_PORT_NULL)) {
                return kSCStatusNoStoreSession; /* you must have an open session to play */
        }
 
+       if (_configd_trace) {
+               SCTrace(TRUE, _configd_trace, CFSTR("touch   : %5d : %@\n"), storePrivate->server, key);
+       }
+
        /*
         * 1. Ensure that we hold the lock.
         */
@@ -59,36 +61,42 @@ __SCDynamicStoreTouchValue(SCDynamicStoreRef store, CFStringRef key)
        /*
         * 2. Grab the current (or establish a new) store entry for this key.
         */
-       sc_status = __SCDynamicStoreCopyValue(store, key, &value);
+       sc_status = __SCDynamicStoreCopyValue(store, key, &value, TRUE);
        switch (sc_status) {
-               case kSCStatusNoKey :
+               case kSCStatusNoKey : {
+                       CFDateRef       now;
+
                        /* store entry does not exist, create */
-                       value    = CFDateCreate(NULL, CFAbsoluteTimeGetCurrent());
-                       newValue = TRUE;
-                       SCLog(_configd_verbose, LOG_DEBUG, CFSTR("  new time stamp = %@"), value);
+
+                       now = CFDateCreate(NULL, CFAbsoluteTimeGetCurrent());
+                       (void) _SCSerialize(now, &value, NULL, NULL);
+                       CFRelease(now);
                        break;
+               }
+
+               case kSCStatusOK : {
+                       CFDateRef       now;
 
-               case kSCStatusOK :
                        /* store entry exists */
-                       if (CFGetTypeID(value) == CFDateGetTypeID()) {
+
+                       (void) _SCUnserialize((CFPropertyListRef *)&now, value, NULL, 0);
+                       if (isA_CFDate(now)) {
                                /* the value is a CFDate, update the time stamp */
+                               CFRelease(now);
                                CFRelease(value);
-                               value = CFDateCreate(NULL, CFAbsoluteTimeGetCurrent());
-                               newValue = TRUE;
-                               SCLog(_configd_verbose, LOG_DEBUG, CFSTR("  new time stamp = %@"), value);
+                               now = CFDateCreate(NULL, CFAbsoluteTimeGetCurrent());
+                               (void) _SCSerialize(now, &value, NULL, NULL);
                        } /* else, we'll just save the data (again) to bump the instance */
-                       break;
+                       CFRelease(now);
 
+                       break;
+               }
                default :
-                       SCLog(_configd_verbose, LOG_DEBUG, CFSTR("  __SCDynamicStoreCopyValue(): %s"), SCErrorString(sc_status));
                        goto done;
        }
 
-       sc_status = __SCDynamicStoreSetValue(store, key, value);
-
-       if (newValue) {
-               CFRelease(value);
-       }
+       sc_status = __SCDynamicStoreSetValue(store, key, value, TRUE);
+       CFRelease(value);
 
     done :
 
@@ -97,10 +105,11 @@ __SCDynamicStoreTouchValue(SCDynamicStoreRef store, CFStringRef key)
         */
        __SCDynamicStoreUnlock(store, TRUE);
 
-       return kSCStatusOK;
+       return sc_status;
 }
 
 
+__private_extern__
 kern_return_t
 _configtouch(mach_port_t               server,
             xmlData_t                  keyRef,         /* raw XML bytes */
@@ -108,43 +117,30 @@ _configtouch(mach_port_t          server,
             int                        *sc_status
 )
 {
-       kern_return_t           status;
-       serverSessionRef        mySession = getSession(server);
-       CFDataRef               xmlKey;         /* key  (XML serialized) */
-       CFStringRef             key;            /* key  (un-serialized) */
-       CFStringRef             xmlError;
-
-       SCLog(_configd_verbose, LOG_DEBUG, CFSTR("Touch key in configuration database."));
-       SCLog(_configd_verbose, LOG_DEBUG, CFSTR("  server = %d"), server);
+       CFStringRef             key             = NULL;         /* key  (un-serialized) */
+       serverSessionRef        mySession;
 
        /* un-serialize the key */
-       xmlKey = CFDataCreate(NULL, keyRef, keyLen);
-       status = vm_deallocate(mach_task_self(), (vm_address_t)keyRef, keyLen);
-       if (status != KERN_SUCCESS) {
-               SCLog(_configd_verbose, LOG_DEBUG, CFSTR("vm_deallocate(): %s"), mach_error_string(status));
-               /* non-fatal???, proceed */
-       }
-       key = CFPropertyListCreateFromXMLData(NULL,
-                                             xmlKey,
-                                             kCFPropertyListImmutable,
-                                             &xmlError);
-       CFRelease(xmlKey);
-       if (!key) {
-               if (xmlError) {
-                       SCLog(_configd_verbose, LOG_DEBUG,
-                              CFSTR("CFPropertyListCreateFromXMLData() key: %@"),
-                              xmlError);
-                       CFRelease(xmlError);
-               }
+       if (!_SCUnserializeString(&key, NULL, (void *)keyRef, keyLen)) {
                *sc_status = kSCStatusFailed;
-               return KERN_SUCCESS;
-       } else if (!isA_CFString(key)) {
+               goto done;
+       }
+
+       if (!isA_CFString(key)) {
                *sc_status = kSCStatusInvalidArgument;
-               return KERN_SUCCESS;
+               goto done;
+       }
+
+       mySession = getSession(server);
+       if (mySession == NULL) {
+               *sc_status = kSCStatusNoStoreSession;   /* you must have an open session to play */
+               goto done;
        }
 
        *sc_status = __SCDynamicStoreTouchValue(mySession->store, key);
-       CFRelease(key);
 
+    done :
+
+       if (key)        CFRelease(key);
        return KERN_SUCCESS;
 }