this repo has no description
at fixPythonPipStalling 118 lines 3.0 kB view raw
1/* 2 * Copyright (c) 2000-2005, 2009-2011, 2013, 2016, 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 "SCDynamicStoreInternal.h" 35#include "config.h" /* MiG generated file */ 36 37static void 38removeKey(CFMutableArrayRef keys, CFStringRef key) 39{ 40 CFIndex i; 41 CFIndex n; 42 43 if (keys == NULL) { 44 /* if no keys */ 45 return; 46 } 47 48 n = CFArrayGetCount(keys); 49 i = CFArrayGetFirstIndexOfValue(keys, CFRangeMake(0, n), key); 50 if (i == kCFNotFound) { 51 /* if key not in list */ 52 } 53 54 /* remove key from list */ 55 CFArrayRemoveValueAtIndex(keys, i); 56 return; 57} 58 59 60Boolean 61SCDynamicStoreRemoveWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean isRegex) 62{ 63 SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store; 64 kern_return_t status; 65 CFDataRef utfKey; /* serialized key */ 66 xmlData_t myKeyRef; 67 CFIndex myKeyLen; 68 int sc_status; 69 70 if (store == NULL) { 71 /* sorry, you must provide a session */ 72 _SCErrorSet(kSCStatusNoStoreSession); 73 return FALSE; 74 } 75 76 if (storePrivate->server == MACH_PORT_NULL) { 77 /* sorry, you must have an open session to play */ 78 _SCErrorSet(kSCStatusNoStoreServer); 79 return FALSE; 80 } 81 82 /* serialize the key */ 83 if (!_SCSerializeString(key, &utfKey, (void **)&myKeyRef, &myKeyLen)) { 84 _SCErrorSet(kSCStatusFailed); 85 return FALSE; 86 } 87 88 retry : 89 90 /* send the key to the server */ 91 status = notifyremove(storePrivate->server, 92 myKeyRef, 93 (mach_msg_type_number_t)myKeyLen, 94 isRegex, 95 (int *)&sc_status); 96 97 if (__SCDynamicStoreCheckRetryAndHandleError(store, 98 status, 99 &sc_status, 100 "SCDynamicStoreRemoveWatchedKey notifyremove()")) { 101 goto retry; 102 } 103 104 /* clean up */ 105 CFRelease(utfKey); 106 107 if (sc_status != kSCStatusOK) { 108 _SCErrorSet(sc_status); 109 return FALSE; 110 } 111 112 if (isRegex) { 113 removeKey(storePrivate->patterns, key); 114 } else { 115 removeKey(storePrivate->keys, key); 116 } 117 return TRUE; 118}