this repo has no description
at fixPythonPipStalling 152 lines 3.9 kB view raw
1/* 2 * Copyright (c) 2000-2004, 2006, 2008, 2010-2012, 2015, 2016 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 35#include "configd.h" 36#include "session.h" 37#include "pattern.h" 38 39 40static int 41removeKey(CFMutableArrayRef keys, CFStringRef key) 42{ 43 CFIndex i; 44 CFIndex n; 45 46 if (keys == NULL) { 47 /* sorry, empty notifier list */ 48 return kSCStatusNoKey; 49 } 50 51 n = CFArrayGetCount(keys); 52 i = CFArrayGetFirstIndexOfValue(keys, CFRangeMake(0, n), key); 53 if (i == kCFNotFound) { 54 /* sorry, key does not exist in notifier list */ 55 return kSCStatusNoKey; 56 } 57 58 /* remove key from this sessions notifier list */ 59 CFArrayRemoveValueAtIndex(keys, i); 60 return kSCStatusOK; 61} 62 63 64__private_extern__ 65int 66__SCDynamicStoreRemoveWatchedKey(SCDynamicStoreRef store, CFStringRef key, Boolean isRegex, Boolean internal) 67{ 68 int sc_status = kSCStatusOK; 69 CFNumberRef sessionNum; 70 SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store; 71 72 SC_trace("%s : %5d : %s : %@", 73 internal ? "*watch-" : "watch- ", 74 storePrivate->server, 75 isRegex ? "pattern" : "key", 76 key); 77 78 /* 79 * remove key from this sessions notifier list after checking that 80 * it was previously defined. 81 */ 82 if (isRegex) { 83 sc_status = removeKey(storePrivate->patterns, key); 84 if (sc_status != kSCStatusOK) { 85 goto done; 86 } 87 88 /* remove this session as a pattern watcher */ 89 sessionNum = CFNumberCreate(NULL, kCFNumberIntType, &storePrivate->server); 90 patternRemoveSession(key, sessionNum); 91 CFRelease(sessionNum); 92 } else { 93 sc_status = removeKey(storePrivate->keys, key); 94 if (sc_status != kSCStatusOK) { 95 goto done; 96 } 97 98 /* 99 * We are watching a specific key. As such, update the 100 * store to remove our interest in any changes. 101 */ 102 sessionNum = CFNumberCreate(NULL, kCFNumberIntType, &storePrivate->server); 103 _removeWatcher(sessionNum, key); 104 CFRelease(sessionNum); 105 } 106 107 done : 108 109 return sc_status; 110} 111 112 113__private_extern__ 114kern_return_t 115_notifyremove(mach_port_t server, 116 xmlData_t keyRef, /* raw XML bytes */ 117 mach_msg_type_number_t keyLen, 118 int isRegex, 119 int *sc_status 120) 121{ 122 CFStringRef key = NULL; /* key (un-serialized) */ 123 serverSessionRef mySession; 124 125 /* un-serialize the key */ 126 if (!_SCUnserializeString(&key, NULL, (void *)keyRef, keyLen)) { 127 *sc_status = kSCStatusFailed; 128 goto done; 129 } 130 131 if (!isA_CFString(key)) { 132 *sc_status = kSCStatusInvalidArgument; 133 goto done; 134 } 135 136 mySession = getSession(server); 137 if (mySession == NULL) { 138 *sc_status = kSCStatusNoStoreSession; /* you must have an open session to play */ 139 goto done; 140 } 141 142 *sc_status = __SCDynamicStoreRemoveWatchedKey(mySession->store, 143 key, 144 isRegex != 0, 145 FALSE); 146 147 done : 148 149 if (key) CFRelease(key); 150 return KERN_SUCCESS; 151} 152