X-Git-Url: https://git.saurik.com/apple/configd.git/blobdiff_plain/4c5e92e2493bdfbbce40e998f3b607c72c47af2c..d94708881e41bd90afd74b1a1dd0524d039ba3f7:/SystemConfiguration.fproj/SCDNotifierAdd.c?ds=sidebyside diff --git a/SystemConfiguration.fproj/SCDNotifierAdd.c b/SystemConfiguration.fproj/SCDNotifierAdd.c index 85c2969..42e5800 100644 --- a/SystemConfiguration.fproj/SCDNotifierAdd.c +++ b/SystemConfiguration.fproj/SCDNotifierAdd.c @@ -1,15 +1,15 @@ /* - * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2005, 2009-2011, 2013, 2016, 2017, 2019 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ - * + * * 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, @@ -17,7 +17,7 @@ * 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@ */ @@ -31,14 +31,22 @@ * - initial revision */ -#include -#include - -#include -#include #include "SCDynamicStoreInternal.h" #include "config.h" /* MiG generated file */ + +static void +addKey(CFMutableArrayRef *keysP, CFStringRef key) +{ + if (*keysP == NULL) { + *keysP = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks); + } + + CFArrayAppendValue(*keysP, key); + return; +} + + Boolean SCDynamicStoreAddWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean isRegex) { @@ -49,13 +57,7 @@ SCDynamicStoreAddWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean is CFIndex myKeyLen; int sc_status; - if (_sc_verbose) { - SCLog(TRUE, LOG_DEBUG, CFSTR("SCDynamicStoreAddWatchedKey:")); - SCLog(TRUE, LOG_DEBUG, CFSTR(" key = %@"), key); - SCLog(TRUE, LOG_DEBUG, CFSTR(" isRegex = %s"), isRegex ? "TRUE" : "FALSE"); - } - - if (!store) { + if (store == NULL) { /* sorry, you must provide a session */ _SCErrorSet(kSCStatusNoStoreSession); return FALSE; @@ -73,29 +75,34 @@ SCDynamicStoreAddWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean is return FALSE; } + retry : + /* send the key to the server */ status = notifyadd(storePrivate->server, myKeyRef, - myKeyLen, + (mach_msg_type_number_t)myKeyLen, isRegex, (int *)&sc_status); + if (__SCDynamicStoreCheckRetryAndHandleError(store, + status, + &sc_status, + "SCDynamicStoreAddWatchedKey notifyadd()")) { + goto retry; + } + /* clean up */ CFRelease(utfKey); - if (status != KERN_SUCCESS) { - if (status != MACH_SEND_INVALID_DEST) - SCLog(_sc_verbose, LOG_DEBUG, CFSTR("notifyadd(): %s"), mach_error_string(status)); - (void) mach_port_destroy(mach_task_self(), storePrivate->server); - storePrivate->server = MACH_PORT_NULL; - _SCErrorSet(status); - return FALSE; - } - if (sc_status != kSCStatusOK) { _SCErrorSet(sc_status); return FALSE; } + if (isRegex) { + addKey(&storePrivate->patterns, key); + } else { + addKey(&storePrivate->keys, key); + } return TRUE; }