this repo has no description
at fixPythonPipStalling 133 lines 3.5 kB view raw
1/* 2 * Copyright (c) 2000, 2001, 2003-2005, 2008-2011, 2013, 2015-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 * April 5, 2000 Allan Nathanson <ajn@apple.com> 31 * - initial revision 32 */ 33 34#include "SCDynamicStoreInternal.h" 35#include "config.h" /* MiG generated file */ 36 37#include <paths.h> 38#include <unistd.h> 39#include <sys/types.h> 40#include <sys/socket.h> 41#include <sys/un.h> 42 43Boolean 44SCDynamicStoreNotifyFileDescriptor(SCDynamicStoreRef store, 45 int32_t identifier, 46 int *fd) 47{ 48 int fildes[2] = { -1, -1 }; 49 fileport_t fileport = MACH_PORT_NULL; 50 int ret; 51 int sc_status; 52 SCDynamicStorePrivateRef storePrivate = (SCDynamicStorePrivateRef)store; 53 kern_return_t status; 54 55 if (store == NULL) { 56 /* sorry, you must provide a session */ 57 _SCErrorSet(kSCStatusNoStoreSession); 58 return FALSE; 59 } 60 61 if (storePrivate->server == MACH_PORT_NULL) { 62 /* sorry, you must have an open session to play */ 63 _SCErrorSet(kSCStatusNoStoreServer); 64 return FALSE; 65 } 66 67 if (storePrivate->notifyStatus != NotifierNotRegistered) { 68 /* sorry, you can only have one notification registered at once */ 69 _SCErrorSet(kSCStatusNotifierActive); 70 return FALSE; 71 } 72 73 ret = pipe(fildes); 74 if (ret == -1) { 75 _SCErrorSet(errno); 76 SC_log(LOG_ERR, "pipe() failed: %s", strerror(errno)); 77 goto fail; 78 } 79 80 /* 81 * send fildes[1], the sender's fd, to configd using a fileport and 82 * return fildes[0] to the caller. 83 */ 84 85 fileport = MACH_PORT_NULL; 86 ret = fileport_makeport(fildes[1], &fileport); 87 if (ret < 0) { 88 _SCErrorSet(errno); 89 SC_log(LOG_ERR, "fileport_makeport() failed: %s", strerror(errno)); 90 goto fail; 91 } 92 93 retry : 94 95 status = notifyviafd(storePrivate->server, 96 fileport, 97 identifier, 98 (int *)&sc_status); 99 100 if (__SCDynamicStoreCheckRetryAndHandleError(store, 101 status, 102 &sc_status, 103 "SCDynamicStoreNotifyFileDescriptor notifyviafd()")) { 104 goto retry; 105 } 106 107 if (status != KERN_SUCCESS) { 108 _SCErrorSet(status); 109 goto fail; 110 } 111 112 if (sc_status != kSCStatusOK) { 113 _SCErrorSet(sc_status); 114 goto fail; 115 } 116 117 /* the SCDynamicStore server now has a copy of the write side, close our reference */ 118 (void) close(fildes[1]); 119 120 /* and keep the read side */ 121 *fd = fildes[0]; 122 123 /* set notifier active */ 124 storePrivate->notifyStatus = Using_NotifierInformViaFD; 125 126 return TRUE; 127 128 fail : 129 130 if (fildes[0] != -1) close(fildes[0]); 131 if (fildes[1] != -1) close(fildes[1]); 132 return FALSE; 133}