/*
- * Copyright (c) 2000-2003 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2000, 2001, 2003-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,
* 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@
*/
* - initial revision
*/
-#include <mach/mach.h>
-#include <mach/mach_error.h>
-
-#include <SystemConfiguration/SystemConfiguration.h>
-#include <SystemConfiguration/SCPrivate.h>
#include "SCDynamicStoreInternal.h"
#include "config.h" /* MiG generated file */
-
Boolean
SCDynamicStoreSetNotificationKeys(SCDynamicStoreRef store,
CFArrayRef keys,
xmlData_t myPatternsRef = NULL; /* patterns (serialized) */
CFIndex myPatternsLen = 0;
int sc_status;
+ CFMutableArrayRef tmp;
if (store == NULL) {
/* sorry, you must provide a session */
}
/* serialize the keys */
- if (keys) {
+ if (keys != NULL) {
if (!_SCSerialize(keys, &xmlKeys, (void **)&myKeysRef, &myKeysLen)) {
_SCErrorSet(kSCStatusFailed);
return FALSE;
}
/* serialize the patterns */
- if (patterns) {
+ if (patterns != NULL) {
if (!_SCSerialize(patterns, &xmlPatterns, (void **)&myPatternsRef, &myPatternsLen)) {
- CFRelease(xmlKeys);
+ if (xmlKeys != NULL) CFRelease(xmlKeys);
_SCErrorSet(kSCStatusFailed);
return FALSE;
}
}
+
+ retry :
+
/* send the keys and patterns, fetch the associated result from the server */
status = notifyset(storePrivate->server,
myKeysRef,
- myKeysLen,
+ (mach_msg_type_number_t)myKeysLen,
myPatternsRef,
- myPatternsLen,
+ (mach_msg_type_number_t)myPatternsLen,
(int *)&sc_status);
- /* clean up */
- if (xmlKeys) CFRelease(xmlKeys);
- if (xmlPatterns) CFRelease(xmlPatterns);
-
- if (status != KERN_SUCCESS) {
-#ifdef DEBUG
- if (status != MACH_SEND_INVALID_DEST)
- SCLog(_sc_verbose, LOG_DEBUG, CFSTR("SCDynamicStoreSetNotificationKeys notifyset(): %s"), mach_error_string(status));
-#endif /* DEBUG */
- (void) mach_port_destroy(mach_task_self(), storePrivate->server);
- storePrivate->server = MACH_PORT_NULL;
- _SCErrorSet(status);
- return FALSE;
+ if (__SCDynamicStoreCheckRetryAndHandleError(store,
+ status,
+ &sc_status,
+ "SCDynamicStoreSetNotificationKeys notifyset()")) {
+ goto retry;
}
+ /* clean up */
+ if (xmlKeys != NULL) CFRelease(xmlKeys);
+ if (xmlPatterns != NULL) CFRelease(xmlPatterns);
+
if (sc_status != kSCStatusOK) {
_SCErrorSet(sc_status);
return FALSE;
}
+ /* in case we need to re-connect, save the keys/patterns */
+ tmp = (keys != NULL) ? CFArrayCreateMutableCopy(NULL, 0, keys) : NULL;
+ if (storePrivate->keys != NULL) CFRelease(storePrivate->keys);
+ storePrivate->keys = tmp;
+
+ tmp = (patterns != NULL) ? CFArrayCreateMutableCopy(NULL, 0, patterns) : NULL;
+ if (storePrivate->patterns != NULL) CFRelease(storePrivate->patterns);
+ storePrivate->patterns = tmp;
+
return TRUE;
}