1b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/** @file 2b410d6e4ce58c177569d42b51772f7bb239a24a3darylm OS-specific module implementation for EDK II and UEFI. 3b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Derived from posixmodule.c in Python 2.7.2. 4b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5d78fab6b4e9be83b781212f6a9f3fde0c092e81ddarylm Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR> 6b410d6e4ce58c177569d42b51772f7bb239a24a3darylm This program and the accompanying materials are licensed and made available under 7b410d6e4ce58c177569d42b51772f7bb239a24a3darylm the terms and conditions of the BSD License that accompanies this distribution. 8b410d6e4ce58c177569d42b51772f7bb239a24a3darylm The full text of the license may be found at 9b410d6e4ce58c177569d42b51772f7bb239a24a3darylm http://opensource.org/licenses/bsd-license. 10b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 11b410d6e4ce58c177569d42b51772f7bb239a24a3darylm THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13b410d6e4ce58c177569d42b51772f7bb239a24a3darylm**/ 14b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define PY_SSIZE_T_CLEAN 15b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 16b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include "Python.h" 17b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include "structseq.h" 18b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 19b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <stdio.h> 20b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <stdlib.h> 21b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <wchar.h> 22b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <sys/syslimits.h> 23b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 24b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef __cplusplus 25b410d6e4ce58c177569d42b51772f7bb239a24a3darylmextern "C" { 26b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 27b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 28521527e0b63910d6d4d0d011e86738f21fbd32bfdarylmPyDoc_STRVAR(edk2__doc__, 29521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm "This module provides access to UEFI firmware functionality that is\n\ 30521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm standardized by the C Standard and the POSIX standard (a thinly\n\ 31521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm disguised Unix interface). Refer to the library manual and\n\ 32521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm corresponding UEFI Specification entries for more information on calls."); 33b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 34b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifndef Py_USING_UNICODE 35b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* This is used in signatures of functions. */ 36b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define Py_UNICODE void 37b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 38b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 39b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYS_TYPES_H 40b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <sys/types.h> 41b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SYS_TYPES_H */ 42b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 43b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYS_STAT_H 44b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <sys/stat.h> 45b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SYS_STAT_H */ 46b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 47b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYS_WAIT_H 48b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <sys/wait.h> /* For WNOHANG */ 49b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 50b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 51b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SIGNAL_H 52b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <signal.h> 53b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 54b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 55b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FCNTL_H 56b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <fcntl.h> 57b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_FCNTL_H */ 58b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 59b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GRP_H 60b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <grp.h> 61b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 62b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 63b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYSEXITS_H 64b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <sysexits.h> 65b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SYSEXITS_H */ 66b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 67b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYS_LOADAVG_H 68b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <sys/loadavg.h> 69b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 70b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 71b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_UTIME_H 72b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <utime.h> 73b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_UTIME_H */ 74b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 75b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYS_UTIME_H 76b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <sys/utime.h> 77b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define HAVE_UTIME_H /* pretend we do for the rest of this file */ 78b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SYS_UTIME_H */ 79b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 80b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYS_TIMES_H 81b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <sys/times.h> 82b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SYS_TIMES_H */ 83b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 84b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYS_PARAM_H 85b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <sys/param.h> 86b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SYS_PARAM_H */ 87b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 88b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYS_UTSNAME_H 89b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <sys/utsname.h> 90b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SYS_UTSNAME_H */ 91b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 92b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_DIRENT_H 93b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <dirent.h> 94b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define NAMLEN(dirent) wcslen((dirent)->FileName) 95b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 96b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define dirent direct 97b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define NAMLEN(dirent) (dirent)->d_namlen 98b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #ifdef HAVE_SYS_NDIR_H 99b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <sys/ndir.h> 100b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #endif 101b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #ifdef HAVE_SYS_DIR_H 102b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <sys/dir.h> 103b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #endif 104b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #ifdef HAVE_NDIR_H 105b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #include <ndir.h> 106b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #endif 107b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 108b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 109b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifndef MAXPATHLEN 110b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #if defined(PATH_MAX) && PATH_MAX > 1024 111b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define MAXPATHLEN PATH_MAX 112b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #else 113b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define MAXPATHLEN 1024 114b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #endif 115b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* MAXPATHLEN */ 116b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 117b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define WAIT_TYPE int 118b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define WAIT_STATUS_INT(s) (s) 119b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 120b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* Issue #1983: pid_t can be longer than a C long on some systems */ 121b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if !defined(SIZEOF_PID_T) || SIZEOF_PID_T == SIZEOF_INT 122b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define PARSE_PID "i" 123b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define PyLong_FromPid PyInt_FromLong 124b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define PyLong_AsPid PyInt_AsLong 125b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#elif SIZEOF_PID_T == SIZEOF_LONG 126b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define PARSE_PID "l" 127b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define PyLong_FromPid PyInt_FromLong 128b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define PyLong_AsPid PyInt_AsLong 129b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#elif defined(SIZEOF_LONG_LONG) && SIZEOF_PID_T == SIZEOF_LONG_LONG 130b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define PARSE_PID "L" 131b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define PyLong_FromPid PyLong_FromLongLong 132b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define PyLong_AsPid PyInt_AsLongLong 133b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 134b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)" 135b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* SIZEOF_PID_T */ 136b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 137b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* Don't use the "_r" form if we don't need it (also, won't have a 138b410d6e4ce58c177569d42b51772f7bb239a24a3darylm prototype for it, at least on Solaris -- maybe others as well?). */ 139b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_CTERMID_R) && defined(WITH_THREAD) 140b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define USE_CTERMID_R 141b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 142b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 143b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_TMPNAM_R) && defined(WITH_THREAD) 144b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define USE_TMPNAM_R 145b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 146b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 147b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* choose the appropriate stat and fstat functions and return structs */ 148b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#undef STAT 149b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#undef FSTAT 150b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#undef STRUCT_STAT 151b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define STAT stat 152b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define FSTAT fstat 153b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define STRUCT_STAT struct stat 154b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 155b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* dummy version. _PyVerify_fd() is already defined in fileobject.h */ 156b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define _PyVerify_fd_dup2(A, B) (1) 157b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 158d78fab6b4e9be83b781212f6a9f3fde0c092e81ddarylm#ifndef UEFI_C_SOURCE 159b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* Return a dictionary corresponding to the POSIX environment table */ 160b410d6e4ce58c177569d42b51772f7bb239a24a3darylmextern char **environ; 161b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 162b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 163b410d6e4ce58c177569d42b51772f7bb239a24a3darylmconvertenviron(void) 164b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 165b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *d; 166b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char **e; 167b410d6e4ce58c177569d42b51772f7bb239a24a3darylm d = PyDict_New(); 168b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (d == NULL) 169b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 170b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (environ == NULL) 171b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return d; 172b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* This part ignores errors */ 173b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (e = environ; *e != NULL; e++) { 174b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *k; 175b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *v; 176b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *p = strchr(*e, '='); 177b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (p == NULL) 178b410d6e4ce58c177569d42b51772f7bb239a24a3darylm continue; 179b410d6e4ce58c177569d42b51772f7bb239a24a3darylm k = PyString_FromStringAndSize(*e, (int)(p-*e)); 180b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (k == NULL) { 181b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_Clear(); 182b410d6e4ce58c177569d42b51772f7bb239a24a3darylm continue; 183b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 184b410d6e4ce58c177569d42b51772f7bb239a24a3darylm v = PyString_FromString(p+1); 185b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (v == NULL) { 186b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_Clear(); 187b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(k); 188b410d6e4ce58c177569d42b51772f7bb239a24a3darylm continue; 189b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 190b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyDict_GetItem(d, k) == NULL) { 191b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyDict_SetItem(d, k, v) != 0) 192b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_Clear(); 193b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 194b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(k); 195b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(v); 196b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 197b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return d; 198b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 199d78fab6b4e9be83b781212f6a9f3fde0c092e81ddarylm#endif /* UEFI_C_SOURCE */ 200b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 201b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* Set a POSIX-specific error from errno, and return NULL */ 202b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 203b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 204b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_error(void) 205b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 206b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyErr_SetFromErrno(PyExc_OSError); 207b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 208b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 209b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_error_with_filename(char* name) 210b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 211b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name); 212b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 213b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 214b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 215b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 216b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_error_with_allocated_filename(char* name) 217b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 218b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *rc = PyErr_SetFromErrnoWithFilename(PyExc_OSError, name); 219b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(name); 220b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return rc; 221b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 222b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 223b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* POSIX generic methods */ 224b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 225521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm#ifndef UEFI_C_SOURCE 226521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm static PyObject * 227521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm posix_fildes(PyObject *fdobj, int (*func)(int)) 228521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm { 229521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm int fd; 230521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm int res; 231521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm fd = PyObject_AsFileDescriptor(fdobj); 232521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm if (fd < 0) 233521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm return NULL; 234521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm if (!_PyVerify_fd(fd)) 235521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm return posix_error(); 236521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm Py_BEGIN_ALLOW_THREADS 237521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm res = (*func)(fd); 238521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm Py_END_ALLOW_THREADS 239521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm if (res < 0) 240521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm return posix_error(); 241521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm Py_INCREF(Py_None); 242521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm return Py_None; 243521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm } 244521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm#endif /* UEFI_C_SOURCE */ 245b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 246b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 247b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_1str(PyObject *args, char *format, int (*func)(const char*)) 248b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 249b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path1 = NULL; 250b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 251b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, format, 252b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, &path1)) 253b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 254b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 255b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = (*func)(path1); 256b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 257b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 258b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_allocated_filename(path1); 259b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path1); 260b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 261b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 262b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 263b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 264b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 265b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_2str(PyObject *args, 266b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *format, 267b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int (*func)(const char *, const char *)) 268b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 269b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path1 = NULL, *path2 = NULL; 270b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 271b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, format, 272b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, &path1, 273b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, &path2)) 274b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 275b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 276b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = (*func)(path1, path2); 277b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 278b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path1); 279b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path2); 280b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res != 0) 281b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* XXX how to report both path1 and path2??? */ 282b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 283b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 284b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 285b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 286b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 287b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(stat_result__doc__, 288b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"stat_result: Result from stat or lstat.\n\n\ 289b410d6e4ce58c177569d42b51772f7bb239a24a3darylmThis object may be accessed either as a tuple of\n\ 290b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\ 291b410d6e4ce58c177569d42b51772f7bb239a24a3darylmor via the attributes st_mode, st_ino, st_dev, st_nlink, st_uid, and so on.\n\ 292b410d6e4ce58c177569d42b51772f7bb239a24a3darylm\n\ 293b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPosix/windows: If your platform supports st_blksize, st_blocks, st_rdev,\n\ 294b410d6e4ce58c177569d42b51772f7bb239a24a3darylmor st_flags, they are available as attributes only.\n\ 295b410d6e4ce58c177569d42b51772f7bb239a24a3darylm\n\ 296b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSee os.stat for more information."); 297b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 298b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyStructSequence_Field stat_result_fields[] = { 299b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"st_mode", "protection bits"}, 300b410d6e4ce58c177569d42b51772f7bb239a24a3darylm //{"st_ino", "inode"}, 301b410d6e4ce58c177569d42b51772f7bb239a24a3darylm //{"st_dev", "device"}, 302b410d6e4ce58c177569d42b51772f7bb239a24a3darylm //{"st_nlink", "number of hard links"}, 303b410d6e4ce58c177569d42b51772f7bb239a24a3darylm //{"st_uid", "user ID of owner"}, 304b410d6e4ce58c177569d42b51772f7bb239a24a3darylm //{"st_gid", "group ID of owner"}, 305b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"st_size", "total size, in bytes"}, 306b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* The NULL is replaced with PyStructSequence_UnnamedField later. */ 307b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {NULL, "integer time of last access"}, 308b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {NULL, "integer time of last modification"}, 309b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {NULL, "integer time of last change"}, 310b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"st_atime", "time of last access"}, 311b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"st_mtime", "time of last modification"}, 312b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"st_ctime", "time of last change"}, 313b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE 314b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"st_blksize", "blocksize for filesystem I/O"}, 315b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 316b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_BLOCKS 317b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"st_blocks", "number of blocks allocated"}, 318b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 319b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_RDEV 320b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"st_rdev", "device type (if inode device)"}, 321b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 322b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_FLAGS 323b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"st_flags", "user defined flags for file"}, 324b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 325b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_GEN 326b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"st_gen", "generation number"}, 327b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 328b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME 329b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"st_birthtime", "time of creation"}, 330b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 331b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {0} 332b410d6e4ce58c177569d42b51772f7bb239a24a3darylm}; 333b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 334b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE 335b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ST_BLKSIZE_IDX 8 336b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 337b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ST_BLKSIZE_IDX 12 338b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 339b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 340b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_BLOCKS 341b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ST_BLOCKS_IDX (ST_BLKSIZE_IDX+1) 342b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 343b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ST_BLOCKS_IDX ST_BLKSIZE_IDX 344b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 345b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 346b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_RDEV 347b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ST_RDEV_IDX (ST_BLOCKS_IDX+1) 348b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 349b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ST_RDEV_IDX ST_BLOCKS_IDX 350b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 351b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 352b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_FLAGS 353b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ST_FLAGS_IDX (ST_RDEV_IDX+1) 354b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 355b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ST_FLAGS_IDX ST_RDEV_IDX 356b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 357b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 358b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_GEN 359b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ST_GEN_IDX (ST_FLAGS_IDX+1) 360b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 361b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ST_GEN_IDX ST_FLAGS_IDX 362b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 363b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 364b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME 365b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ST_BIRTHTIME_IDX (ST_GEN_IDX+1) 366b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 367b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ST_BIRTHTIME_IDX ST_GEN_IDX 368b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 369b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 370b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyStructSequence_Desc stat_result_desc = { 371b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "stat_result", /* name */ 372b410d6e4ce58c177569d42b51772f7bb239a24a3darylm stat_result__doc__, /* doc */ 373b410d6e4ce58c177569d42b51772f7bb239a24a3darylm stat_result_fields, 374b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 10 375b410d6e4ce58c177569d42b51772f7bb239a24a3darylm}; 376b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 377d78fab6b4e9be83b781212f6a9f3fde0c092e81ddarylm#ifndef UEFI_C_SOURCE /* Not in UEFI */ 378b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(statvfs_result__doc__, 379b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"statvfs_result: Result from statvfs or fstatvfs.\n\n\ 380b410d6e4ce58c177569d42b51772f7bb239a24a3darylmThis object may be accessed either as a tuple of\n\ 381b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax),\n\ 382b410d6e4ce58c177569d42b51772f7bb239a24a3darylmor via the attributes f_bsize, f_frsize, f_blocks, f_bfree, and so on.\n\ 383b410d6e4ce58c177569d42b51772f7bb239a24a3darylm\n\ 384b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSee os.statvfs for more information."); 385b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 386b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyStructSequence_Field statvfs_result_fields[] = { 387b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"f_bsize", }, 388b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"f_frsize", }, 389b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"f_blocks", }, 390b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"f_bfree", }, 391b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"f_bavail", }, 392b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"f_files", }, 393b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"f_ffree", }, 394b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"f_favail", }, 395b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"f_flag", }, 396b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"f_namemax",}, 397b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {0} 398b410d6e4ce58c177569d42b51772f7bb239a24a3darylm}; 399b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 400b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyStructSequence_Desc statvfs_result_desc = { 401b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "statvfs_result", /* name */ 402b410d6e4ce58c177569d42b51772f7bb239a24a3darylm statvfs_result__doc__, /* doc */ 403b410d6e4ce58c177569d42b51772f7bb239a24a3darylm statvfs_result_fields, 404b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 10 405b410d6e4ce58c177569d42b51772f7bb239a24a3darylm}; 406521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm 407521527e0b63910d6d4d0d011e86738f21fbd32bfdarylmstatic PyTypeObject StatVFSResultType; 408b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 409b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 410b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int initialized; 411b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyTypeObject StatResultType; 412b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic newfunc structseq_new; 413b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 414b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 415b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatresult_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 416b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 417b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence *result; 418b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int i; 419b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 420b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = (PyStructSequence*)structseq_new(type, args, kwds); 421b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!result) 422b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 423b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* If we have been initialized from a tuple, 424b410d6e4ce58c177569d42b51772f7bb239a24a3darylm st_?time might be set to None. Initialize it 425b410d6e4ce58c177569d42b51772f7bb239a24a3darylm from the int slots. */ 426b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (i = 7; i <= 9; i++) { 427b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (result->ob_item[i+3] == Py_None) { 428b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(Py_None); 429b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(result->ob_item[i]); 430b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result->ob_item[i+3] = result->ob_item[i]; 431b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 432b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 433b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return (PyObject*)result; 434b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 435b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 436b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 437b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 438b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* If true, st_?time is float. */ 439d78fab6b4e9be83b781212f6a9f3fde0c092e81ddarylm#if defined(UEFI_C_SOURCE) 440b410d6e4ce58c177569d42b51772f7bb239a24a3darylm static int _stat_float_times = 0; 441b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 442b410d6e4ce58c177569d42b51772f7bb239a24a3darylm static int _stat_float_times = 1; 443b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 444b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(stat_float_times__doc__, 445b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"stat_float_times([newval]) -> oldval\n\n\ 446b410d6e4ce58c177569d42b51772f7bb239a24a3darylmDetermine whether os.[lf]stat represents time stamps as float objects.\n\ 447b410d6e4ce58c177569d42b51772f7bb239a24a3darylmIf newval is True, future calls to stat() return floats, if it is False,\n\ 448b410d6e4ce58c177569d42b51772f7bb239a24a3darylmfuture calls return ints. \n\ 449b410d6e4ce58c177569d42b51772f7bb239a24a3darylmIf newval is omitted, return the current setting.\n"); 450b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 451b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject* 452b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstat_float_times(PyObject* self, PyObject *args) 453b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 454b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int newval = -1; 455b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 456b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "|i:stat_float_times", &newval)) 457b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 458b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (newval == -1) 459b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Return old value */ 460b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyBool_FromLong(_stat_float_times); 461b410d6e4ce58c177569d42b51772f7bb239a24a3darylm _stat_float_times = newval; 462b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 463b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 464b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 465521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm#endif /* UEFI_C_SOURCE */ 466b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 467b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic void 468b410d6e4ce58c177569d42b51772f7bb239a24a3darylmfill_time(PyObject *v, int index, time_t sec, unsigned long nsec) 469b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 470b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *fval,*ival; 471b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if SIZEOF_TIME_T > SIZEOF_LONG 472b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ival = PyLong_FromLongLong((PY_LONG_LONG)sec); 473b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 474b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ival = PyInt_FromLong((long)sec); 475b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 476b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!ival) 477b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return; 478b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (_stat_float_times) { 479b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fval = PyFloat_FromDouble(sec + 1e-9*nsec); 480b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 481b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fval = ival; 482b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(fval); 483b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 484b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, index, ival); 485b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, index+3, fval); 486b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 487b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 488b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* pack a system stat C structure into the Python stat tuple 489b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (used by posix_stat() and posix_fstat()) */ 490b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject* 491b410d6e4ce58c177569d42b51772f7bb239a24a3darylm_pystat_fromstructstat(STRUCT_STAT *st) 492b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 493b410d6e4ce58c177569d42b51772f7bb239a24a3darylm unsigned long ansec, mnsec, cnsec; 494b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *v = PyStructSequence_New(&StatResultType); 495b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (v == NULL) 496b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 497b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 498b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 0, PyInt_FromLong((long)st->st_mode)); 499b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 1, 500b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyLong_FromLongLong((PY_LONG_LONG)st->st_size)); 501b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 502b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ansec = mnsec = cnsec = 0; 503b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* The index used by fill_time is the index of the integer time. 504b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fill_time will add 3 to the index to get the floating time index. 505b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 506b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fill_time(v, 2, st->st_atime, ansec); 507b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fill_time(v, 3, st->st_mtime, mnsec); 508b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fill_time(v, 4, st->st_mtime, cnsec); 509b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 510b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE 511b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, ST_BLKSIZE_IDX, 512b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyInt_FromLong((long)st->st_blksize)); 513b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 514b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_BLOCKS 515b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, ST_BLOCKS_IDX, 516b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyInt_FromLong((long)st->st_blocks)); 517b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 518b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_RDEV 519b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, ST_RDEV_IDX, 520b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyInt_FromLong((long)st->st_rdev)); 521b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 522b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_GEN 523b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, ST_GEN_IDX, 524b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyInt_FromLong((long)st->st_gen)); 525b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 526b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME 527b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 528b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *val; 529b410d6e4ce58c177569d42b51772f7bb239a24a3darylm unsigned long bsec,bnsec; 530b410d6e4ce58c177569d42b51772f7bb239a24a3darylm bsec = (long)st->st_birthtime; 531b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STAT_TV_NSEC2 532b410d6e4ce58c177569d42b51772f7bb239a24a3darylm bnsec = st->st_birthtimespec.tv_nsec; 533b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 534b410d6e4ce58c177569d42b51772f7bb239a24a3darylm bnsec = 0; 535b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 536b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (_stat_float_times) { 537b410d6e4ce58c177569d42b51772f7bb239a24a3darylm val = PyFloat_FromDouble(bsec + 1e-9*bnsec); 538b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 539b410d6e4ce58c177569d42b51772f7bb239a24a3darylm val = PyInt_FromLong((long)bsec); 540b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 541b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, ST_BIRTHTIME_IDX, 542b410d6e4ce58c177569d42b51772f7bb239a24a3darylm val); 543b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 544b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 545b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STRUCT_STAT_ST_FLAGS 546b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, ST_FLAGS_IDX, 547b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyInt_FromLong((long)st->st_flags)); 548b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 549b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 550b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyErr_Occurred()) { 551b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(v); 552b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 553b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 554b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 555b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return v; 556b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 557b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 558b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 559b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_do_stat(PyObject *self, PyObject *args, 560b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *format, 561b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int (*statfunc)(const char *, STRUCT_STAT *), 562b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *wformat, 563b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int (*wstatfunc)(const Py_UNICODE *, STRUCT_STAT *)) 564b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 565b410d6e4ce58c177569d42b51772f7bb239a24a3darylm STRUCT_STAT st; 566b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path = NULL; /* pass this to stat; do not free() it */ 567b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *pathfree = NULL; /* this memory must be free'd */ 568b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 569b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *result; 570b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 571b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, format, 572b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, &path)) 573b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 574b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pathfree = path; 575b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 576b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 577b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = (*statfunc)(path, &st); 578b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 579b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 580b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res != 0) { 581b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = posix_error_with_filename(pathfree); 582b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 583b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 584b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = _pystat_fromstructstat(&st); 585b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 586b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(pathfree); 587b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return result; 588b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 589b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 590b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* POSIX methods */ 591b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 592b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_access__doc__, 593b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"access(path, mode) -> True if granted, False otherwise\n\n\ 594b410d6e4ce58c177569d42b51772f7bb239a24a3darylmUse the real uid/gid to test for access to a path. Note that most\n\ 595b410d6e4ce58c177569d42b51772f7bb239a24a3darylmoperations will use the effective uid/gid, therefore this routine can\n\ 596b410d6e4ce58c177569d42b51772f7bb239a24a3darylmbe used in a suid/sgid environment to test if the invoking user has the\n\ 597b410d6e4ce58c177569d42b51772f7bb239a24a3darylmspecified access to the path. The mode argument can be F_OK to test\n\ 598b410d6e4ce58c177569d42b51772f7bb239a24a3darylmexistence, or the inclusive-OR of R_OK, W_OK, and X_OK."); 599b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 600b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 601b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_access(PyObject *self, PyObject *args) 602b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 603b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path; 604b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int mode; 605b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 606b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 607b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "eti:access", 608b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, &path, &mode)) 609b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 610b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 611b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = access(path, mode); 612b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 613b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 614b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyBool_FromLong(res == 0); 615b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 616b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 617b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifndef F_OK 618b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define F_OK 0 619b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 620b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifndef R_OK 621b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define R_OK 4 622b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 623b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifndef W_OK 624b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define W_OK 2 625b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 626b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifndef X_OK 627b410d6e4ce58c177569d42b51772f7bb239a24a3darylm #define X_OK 1 628b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 629b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 630b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_chdir__doc__, 631b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"chdir(path)\n\n\ 632b410d6e4ce58c177569d42b51772f7bb239a24a3darylmChange the current working directory to the specified path."); 633b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 634b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 635b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_chdir(PyObject *self, PyObject *args) 636b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 637b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_1str(args, "et:chdir", chdir); 638b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 639b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 640b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_chmod__doc__, 641b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"chmod(path, mode)\n\n\ 642b410d6e4ce58c177569d42b51772f7bb239a24a3darylmChange the access permissions of a file."); 643b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 644b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 645b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_chmod(PyObject *self, PyObject *args) 646b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 647b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path = NULL; 648b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int i; 649b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 650b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "eti:chmod", Py_FileSystemDefaultEncoding, 651b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &path, &i)) 652b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 653b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 654b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = chmod(path, i); 655b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 656b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 657b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_allocated_filename(path); 658b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 659b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 660b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 661b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 662b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 663b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FCHMOD 664b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_fchmod__doc__, 665b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"fchmod(fd, mode)\n\n\ 666b410d6e4ce58c177569d42b51772f7bb239a24a3darylmChange the access permissions of the file given by file\n\ 667b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdescriptor fd."); 668b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 669b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 670b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_fchmod(PyObject *self, PyObject *args) 671b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 672b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd, mode, res; 673b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "ii:fchmod", &fd, &mode)) 674b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 675b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 676b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = fchmod(fd, mode); 677b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 678b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 679b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 680b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_RETURN_NONE; 681b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 682b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_FCHMOD */ 683b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 684b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_LCHMOD 685b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_lchmod__doc__, 686b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"lchmod(path, mode)\n\n\ 687b410d6e4ce58c177569d42b51772f7bb239a24a3darylmChange the access permissions of a file. If path is a symlink, this\n\ 688b410d6e4ce58c177569d42b51772f7bb239a24a3darylmaffects the link itself rather than the target."); 689b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 690b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 691b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_lchmod(PyObject *self, PyObject *args) 692b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 693b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path = NULL; 694b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int i; 695b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 696b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "eti:lchmod", Py_FileSystemDefaultEncoding, 697b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &path, &i)) 698b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 699b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 700b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = lchmod(path, i); 701b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 702b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 703b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_allocated_filename(path); 704b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 705b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_RETURN_NONE; 706b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 707b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_LCHMOD */ 708b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 709b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 710b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_CHFLAGS 711b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_chflags__doc__, 712b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"chflags(path, flags)\n\n\ 713b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet file flags."); 714b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 715b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 716b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_chflags(PyObject *self, PyObject *args) 717b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 718b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path; 719b410d6e4ce58c177569d42b51772f7bb239a24a3darylm unsigned long flags; 720b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 721b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "etk:chflags", 722b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, &path, &flags)) 723b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 724b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 725b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = chflags(path, flags); 726b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 727b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 728b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_allocated_filename(path); 729b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 730b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 731b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 732b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 733b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_CHFLAGS */ 734b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 735b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_LCHFLAGS 736b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_lchflags__doc__, 737b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"lchflags(path, flags)\n\n\ 738b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet file flags.\n\ 739b410d6e4ce58c177569d42b51772f7bb239a24a3darylmThis function will not follow symbolic links."); 740b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 741b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 742b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_lchflags(PyObject *self, PyObject *args) 743b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 744b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path; 745b410d6e4ce58c177569d42b51772f7bb239a24a3darylm unsigned long flags; 746b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 747b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "etk:lchflags", 748b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, &path, &flags)) 749b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 750b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 751b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = lchflags(path, flags); 752b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 753b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 754b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_allocated_filename(path); 755b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 756b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 757b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 758b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 759b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_LCHFLAGS */ 760b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 761b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_CHROOT 762b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_chroot__doc__, 763b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"chroot(path)\n\n\ 764b410d6e4ce58c177569d42b51772f7bb239a24a3darylmChange root directory to path."); 765b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 766b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 767b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_chroot(PyObject *self, PyObject *args) 768b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 769b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_1str(args, "et:chroot", chroot); 770b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 771b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 772b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 773b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FSYNC 774b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_fsync__doc__, 775b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"fsync(fildes)\n\n\ 776b410d6e4ce58c177569d42b51772f7bb239a24a3darylmforce write of file with filedescriptor to disk."); 777b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 778b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 779b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_fsync(PyObject *self, PyObject *fdobj) 780b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 781b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_fildes(fdobj, fsync); 782b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 783b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_FSYNC */ 784b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 785b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FDATASYNC 786b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 787b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef __hpux 788b410d6e4ce58c177569d42b51772f7bb239a24a3darylmextern int fdatasync(int); /* On HP-UX, in libc but not in unistd.h */ 789b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 790b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 791b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_fdatasync__doc__, 792b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"fdatasync(fildes)\n\n\ 793b410d6e4ce58c177569d42b51772f7bb239a24a3darylmforce write of file with filedescriptor to disk.\n\ 794b410d6e4ce58c177569d42b51772f7bb239a24a3darylm does not force update of metadata."); 795b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 796b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 797b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_fdatasync(PyObject *self, PyObject *fdobj) 798b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 799b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_fildes(fdobj, fdatasync); 800b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 801b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_FDATASYNC */ 802b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 803b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 804b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_CHOWN 805b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_chown__doc__, 806b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"chown(path, uid, gid)\n\n\ 807b410d6e4ce58c177569d42b51772f7bb239a24a3darylmChange the owner and group id of path to the numeric uid and gid."); 808b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 809b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 810b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_chown(PyObject *self, PyObject *args) 811b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 812b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path = NULL; 813b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long uid, gid; 814b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 815b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "etll:chown", 816b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, &path, 817b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &uid, &gid)) 818b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 819b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 820b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = chown(path, (uid_t) uid, (gid_t) gid); 821b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 822b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 823b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_allocated_filename(path); 824b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 825b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 826b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 827b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 828b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_CHOWN */ 829b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 830b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FCHOWN 831b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_fchown__doc__, 832b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"fchown(fd, uid, gid)\n\n\ 833b410d6e4ce58c177569d42b51772f7bb239a24a3darylmChange the owner and group id of the file given by file descriptor\n\ 834b410d6e4ce58c177569d42b51772f7bb239a24a3darylmfd to the numeric uid and gid."); 835b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 836b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 837b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_fchown(PyObject *self, PyObject *args) 838b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 839b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd; 840b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long uid, gid; 841b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 842b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "ill:chown", &fd, &uid, &gid)) 843b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 844b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 845b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = fchown(fd, (uid_t) uid, (gid_t) gid); 846b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 847b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 848b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 849b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_RETURN_NONE; 850b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 851b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_FCHOWN */ 852b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 853b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_LCHOWN 854b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_lchown__doc__, 855b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"lchown(path, uid, gid)\n\n\ 856b410d6e4ce58c177569d42b51772f7bb239a24a3darylmChange the owner and group id of path to the numeric uid and gid.\n\ 857b410d6e4ce58c177569d42b51772f7bb239a24a3darylmThis function will not follow symbolic links."); 858b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 859b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 860b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_lchown(PyObject *self, PyObject *args) 861b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 862b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path = NULL; 863b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long uid, gid; 864b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 865b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "etll:lchown", 866b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, &path, 867b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &uid, &gid)) 868b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 869b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 870b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = lchown(path, (uid_t) uid, (gid_t) gid); 871b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 872b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 873b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_allocated_filename(path); 874b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 875b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 876b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 877b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 878b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_LCHOWN */ 879b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 880b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 881b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETCWD 882b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_getcwd__doc__, 883b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"getcwd() -> path\n\n\ 884b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn a string representing the current working directory."); 885b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 886b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 887b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_getcwd(PyObject *self, PyObject *noargs) 888b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 889b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int bufsize_incr = 1024; 890b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int bufsize = 0; 891b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *tmpbuf = NULL; 892b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *res = NULL; 893b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *dynamic_return; 894b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 895b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 896b410d6e4ce58c177569d42b51772f7bb239a24a3darylm do { 897b410d6e4ce58c177569d42b51772f7bb239a24a3darylm bufsize = bufsize + bufsize_incr; 898b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tmpbuf = malloc(bufsize); 899b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (tmpbuf == NULL) { 900b410d6e4ce58c177569d42b51772f7bb239a24a3darylm break; 901b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 902b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = getcwd(tmpbuf, bufsize); 903b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res == NULL) { 904b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free(tmpbuf); 905b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 906b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } while ((res == NULL) && (errno == ERANGE)); 907b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 908b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 909b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res == NULL) 910b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 911b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 912b410d6e4ce58c177569d42b51772f7bb239a24a3darylm dynamic_return = PyString_FromString(tmpbuf); 913b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free(tmpbuf); 914b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 915b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return dynamic_return; 916b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 917b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 918b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef Py_USING_UNICODE 919b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_getcwdu__doc__, 920b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"getcwdu() -> path\n\n\ 921b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn a unicode string representing the current working directory."); 922b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 923b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 924b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_getcwdu(PyObject *self, PyObject *noargs) 925b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 926b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char buf[1026]; 927b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *res; 928b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 929b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 930b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = getcwd(buf, sizeof buf); 931b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 932b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res == NULL) 933b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 934b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyUnicode_Decode(buf, strlen(buf), Py_FileSystemDefaultEncoding,"strict"); 935b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 936b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* Py_USING_UNICODE */ 937b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_GETCWD */ 938b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 939b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 940b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_listdir__doc__, 941b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"listdir(path) -> list_of_strings\n\n\ 942b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn a list containing the names of the entries in the directory.\n\ 943b410d6e4ce58c177569d42b51772f7bb239a24a3darylm\n\ 944b410d6e4ce58c177569d42b51772f7bb239a24a3darylm path: path of directory to list\n\ 945b410d6e4ce58c177569d42b51772f7bb239a24a3darylm\n\ 946b410d6e4ce58c177569d42b51772f7bb239a24a3darylmThe list is in arbitrary order. It does not include the special\n\ 947b410d6e4ce58c177569d42b51772f7bb239a24a3darylmentries '.' and '..' even if they are present in the directory."); 948b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 949b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 950b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_listdir(PyObject *self, PyObject *args) 951b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 952b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* XXX Should redo this putting the (now four) versions of opendir 953b410d6e4ce58c177569d42b51772f7bb239a24a3darylm in separate files instead of having them all here... */ 954b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 955b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *name = NULL; 956b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *MBname; 957b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *d, *v; 958b410d6e4ce58c177569d42b51772f7bb239a24a3darylm DIR *dirp; 959b410d6e4ce58c177569d42b51772f7bb239a24a3darylm struct dirent *ep; 960b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int arg_is_unicode = 1; 961b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 962b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = 0; 963b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "U:listdir", &v)) { 964b410d6e4ce58c177569d42b51772f7bb239a24a3darylm arg_is_unicode = 0; 965b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_Clear(); 966b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 967b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "et:listdir", Py_FileSystemDefaultEncoding, &name)) 968b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 969b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 970b410d6e4ce58c177569d42b51772f7bb239a24a3darylm dirp = opendir(name); 971b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 972b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (dirp == NULL) { 973b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_allocated_filename(name); 974b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 975b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((d = PyList_New(0)) == NULL) { 976b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 977b410d6e4ce58c177569d42b51772f7bb239a24a3darylm closedir(dirp); 978b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 979b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(name); 980b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 981b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 982b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if((MBname = malloc(NAME_MAX)) == NULL) { 983b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 984b410d6e4ce58c177569d42b51772f7bb239a24a3darylm closedir(dirp); 985b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 986b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(d); 987b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(name); 988b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 989b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 990b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (;;) { 991b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = 0; 992b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 993b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ep = readdir(dirp); 994b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 995b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ep == NULL) { 996b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((errno == 0) || (errno == EISDIR)) { 997b410d6e4ce58c177569d42b51772f7bb239a24a3darylm break; 998b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 999b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 1000b410d6e4ce58c177569d42b51772f7bb239a24a3darylm closedir(dirp); 1001b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 1002b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(d); 1003b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_allocated_filename(name); 1004b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1005b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1006b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ep->FileName[0] == L'.' && 1007b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (NAMLEN(ep) == 1 || 1008b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (ep->FileName[1] == L'.' && NAMLEN(ep) == 2))) 1009b410d6e4ce58c177569d42b51772f7bb239a24a3darylm continue; 1010b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if(wcstombs(MBname, ep->FileName, NAME_MAX) == -1) { 1011b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free(MBname); 1012b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 1013b410d6e4ce58c177569d42b51772f7bb239a24a3darylm closedir(dirp); 1014b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 1015b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(d); 1016b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(name); 1017b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1018b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1019b410d6e4ce58c177569d42b51772f7bb239a24a3darylm v = PyString_FromStringAndSize(MBname, strlen(MBname)); 1020b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (v == NULL) { 1021b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(d); 1022b410d6e4ce58c177569d42b51772f7bb239a24a3darylm d = NULL; 1023b410d6e4ce58c177569d42b51772f7bb239a24a3darylm break; 1024b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1025b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef Py_USING_UNICODE 1026b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (arg_is_unicode) { 1027b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *w; 1028b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1029b410d6e4ce58c177569d42b51772f7bb239a24a3darylm w = PyUnicode_FromEncodedObject(v, 1030b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, 1031b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "strict"); 1032b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (w != NULL) { 1033b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(v); 1034b410d6e4ce58c177569d42b51772f7bb239a24a3darylm v = w; 1035b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1036b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 1037b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* fall back to the original byte string, as 1038b410d6e4ce58c177569d42b51772f7bb239a24a3darylm discussed in patch #683592 */ 1039b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_Clear(); 1040b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1041b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1042b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 1043b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyList_Append(d, v) != 0) { 1044b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(v); 1045b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(d); 1046b410d6e4ce58c177569d42b51772f7bb239a24a3darylm d = NULL; 1047b410d6e4ce58c177569d42b51772f7bb239a24a3darylm break; 1048b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1049b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(v); 1050b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1051b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 1052b410d6e4ce58c177569d42b51772f7bb239a24a3darylm closedir(dirp); 1053b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 1054b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(name); 1055b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if(MBname != NULL) { 1056b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free(MBname); 1057b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1058b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1059b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return d; 1060b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1061b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} /* end of posix_listdir */ 1062b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1063b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef MS_WINDOWS 1064b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* A helper function for abspath on win32 */ 1065b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1066b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix__getfullpathname(PyObject *self, PyObject *args) 1067b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1068b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* assume encoded strings won't more than double no of chars */ 1069b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char inbuf[MAX_PATH*2]; 1070b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *inbufp = inbuf; 1071b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_ssize_t insize = sizeof(inbuf); 1072b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char outbuf[MAX_PATH*2]; 1073b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *temp; 1074b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1075b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyUnicodeObject *po; 1076b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyArg_ParseTuple(args, "U|:_getfullpathname", &po)) { 1077b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po); 1078b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_UNICODE woutbuf[MAX_PATH*2], *woutbufp = woutbuf; 1079b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_UNICODE *wtemp; 1080b410d6e4ce58c177569d42b51772f7bb239a24a3darylm DWORD result; 1081b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *v; 1082b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = GetFullPathNameW(wpath, 1083b410d6e4ce58c177569d42b51772f7bb239a24a3darylm sizeof(woutbuf)/sizeof(woutbuf[0]), 1084b410d6e4ce58c177569d42b51772f7bb239a24a3darylm woutbuf, &wtemp); 1085b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (result > sizeof(woutbuf)/sizeof(woutbuf[0])) { 1086b410d6e4ce58c177569d42b51772f7bb239a24a3darylm woutbufp = malloc(result * sizeof(Py_UNICODE)); 1087b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!woutbufp) 1088b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyErr_NoMemory(); 1089b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = GetFullPathNameW(wpath, result, woutbufp, &wtemp); 1090b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1091b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (result) 1092b410d6e4ce58c177569d42b51772f7bb239a24a3darylm v = PyUnicode_FromUnicode(woutbufp, wcslen(woutbufp)); 1093b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 1094b410d6e4ce58c177569d42b51772f7bb239a24a3darylm v = win32_error_unicode("GetFullPathNameW", wpath); 1095b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (woutbufp != woutbuf) 1096b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free(woutbufp); 1097b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return v; 1098b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1099b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Drop the argument parsing error as narrow strings 1100b410d6e4ce58c177569d42b51772f7bb239a24a3darylm are also valid. */ 1101b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_Clear(); 1102b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1103b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple (args, "et#:_getfullpathname", 1104b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, &inbufp, 1105b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &insize)) 1106b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1107b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!GetFullPathName(inbuf, sizeof(outbuf)/sizeof(outbuf[0]), 1108b410d6e4ce58c177569d42b51772f7bb239a24a3darylm outbuf, &temp)) 1109b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return win32_error("GetFullPathName", inbuf); 1110b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyUnicode_Check(PyTuple_GetItem(args, 0))) { 1111b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyUnicode_Decode(outbuf, strlen(outbuf), 1112b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, NULL); 1113b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1114b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyString_FromString(outbuf); 1115b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} /* end of posix__getfullpathname */ 1116b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* MS_WINDOWS */ 1117b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1118b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_mkdir__doc__, 1119b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"mkdir(path [, mode=0777])\n\n\ 1120b410d6e4ce58c177569d42b51772f7bb239a24a3darylmCreate a directory."); 1121b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1122b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1123b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_mkdir(PyObject *self, PyObject *args) 1124b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1125b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 1126b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path = NULL; 1127b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int mode = 0777; 1128b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1129b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "et|i:mkdir", 1130b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, &path, &mode)) 1131b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1132b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 1133b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = mkdir(path, mode); 1134b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 1135b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 1136b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_allocated_filename(path); 1137b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1138b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 1139b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 1140b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1141b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1142b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1143b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* sys/resource.h is needed for at least: wait3(), wait4(), broken nice. */ 1144b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_SYS_RESOURCE_H) 1145b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <sys/resource.h> 1146b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 1147b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1148b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1149b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_NICE 1150b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_nice__doc__, 1151b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"nice(inc) -> new_priority\n\n\ 1152b410d6e4ce58c177569d42b51772f7bb239a24a3darylmDecrease the priority of process by inc and return the new priority."); 1153b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1154b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1155b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_nice(PyObject *self, PyObject *args) 1156b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1157b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int increment, value; 1158b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1159b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:nice", &increment)) 1160b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1161b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1162b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* There are two flavours of 'nice': one that returns the new 1163b410d6e4ce58c177569d42b51772f7bb239a24a3darylm priority (as required by almost all standards out there) and the 1164b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Linux/FreeBSD/BSDI one, which returns '0' on success and advices 1165b410d6e4ce58c177569d42b51772f7bb239a24a3darylm the use of getpriority() to get the new priority. 1166b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1167b410d6e4ce58c177569d42b51772f7bb239a24a3darylm If we are of the nice family that returns the new priority, we 1168b410d6e4ce58c177569d42b51772f7bb239a24a3darylm need to clear errno before the call, and check if errno is filled 1169b410d6e4ce58c177569d42b51772f7bb239a24a3darylm before calling posix_error() on a returnvalue of -1, because the 1170b410d6e4ce58c177569d42b51772f7bb239a24a3darylm -1 may be the actual new priority! */ 1171b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1172b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = 0; 1173b410d6e4ce58c177569d42b51772f7bb239a24a3darylm value = nice(increment); 1174b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_BROKEN_NICE) && defined(HAVE_GETPRIORITY) 1175b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (value == 0) 1176b410d6e4ce58c177569d42b51772f7bb239a24a3darylm value = getpriority(PRIO_PROCESS, 0); 1177b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 1178b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (value == -1 && errno != 0) 1179b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* either nice() or getpriority() returned an error */ 1180b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 1181b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromLong((long) value); 1182b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1183b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_NICE */ 1184b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1185b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_rename__doc__, 1186b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"rename(old, new)\n\n\ 1187b410d6e4ce58c177569d42b51772f7bb239a24a3darylmRename a file or directory."); 1188b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1189b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1190b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_rename(PyObject *self, PyObject *args) 1191b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1192b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_2str(args, "etet:rename", rename); 1193b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1194b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1195b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1196b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_rmdir__doc__, 1197b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"rmdir(path)\n\n\ 1198b410d6e4ce58c177569d42b51772f7bb239a24a3darylmRemove a directory."); 1199b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1200b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1201b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_rmdir(PyObject *self, PyObject *args) 1202b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1203b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_1str(args, "et:rmdir", rmdir); 1204b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1205b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1206b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1207b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_stat__doc__, 1208b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"stat(path) -> stat result\n\n\ 1209b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPerform a stat system call on the given path."); 1210b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1211b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1212b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_stat(PyObject *self, PyObject *args) 1213b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1214b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_do_stat(self, args, "et:stat", STAT, NULL, NULL); 1215b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1216b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1217b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1218b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYSTEM 1219b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_system__doc__, 1220b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"system(command) -> exit_status\n\n\ 1221b410d6e4ce58c177569d42b51772f7bb239a24a3darylmExecute the command (a string) in a subshell."); 1222b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1223b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1224b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_system(PyObject *self, PyObject *args) 1225b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1226b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *command; 1227b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long sts; 1228b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s:system", &command)) 1229b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1230b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 1231b410d6e4ce58c177569d42b51772f7bb239a24a3darylm sts = system(command); 1232b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 1233b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromLong(sts); 1234b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1235b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 1236b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1237b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1238b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_umask__doc__, 1239b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"umask(new_mask) -> old_mask\n\n\ 1240b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet the current numeric umask and return the previous umask."); 1241b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1242b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1243b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_umask(PyObject *self, PyObject *args) 1244b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1245b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int i; 1246b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:umask", &i)) 1247b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1248b410d6e4ce58c177569d42b51772f7bb239a24a3darylm i = (int)umask(i); 1249b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (i < 0) 1250b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 1251b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromLong((long)i); 1252b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1253b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1254b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1255b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_unlink__doc__, 1256b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"unlink(path)\n\n\ 1257b410d6e4ce58c177569d42b51772f7bb239a24a3darylmRemove a file (same as remove(path))."); 1258b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1259b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_remove__doc__, 1260b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"remove(path)\n\n\ 1261b410d6e4ce58c177569d42b51772f7bb239a24a3darylmRemove a file (same as unlink(path))."); 1262b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1263b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1264b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_unlink(PyObject *self, PyObject *args) 1265b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1266b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_1str(args, "et:remove", unlink); 1267b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1268b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1269b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1270b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int 1271b410d6e4ce58c177569d42b51772f7bb239a24a3darylmextract_time(PyObject *t, time_t* sec, long* usec) 1272b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1273b410d6e4ce58c177569d42b51772f7bb239a24a3darylm time_t intval; 1274b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyFloat_Check(t)) { 1275b410d6e4ce58c177569d42b51772f7bb239a24a3darylm double tval = PyFloat_AsDouble(t); 1276b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *intobj = PyNumber_Long(t); 1277b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!intobj) 1278b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return -1; 1279b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if SIZEOF_TIME_T > SIZEOF_LONG 1280b410d6e4ce58c177569d42b51772f7bb239a24a3darylm intval = PyInt_AsUnsignedLongLongMask(intobj); 1281b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 1282b410d6e4ce58c177569d42b51772f7bb239a24a3darylm intval = PyInt_AsLong(intobj); 1283b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 1284b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(intobj); 1285b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (intval == -1 && PyErr_Occurred()) 1286b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return -1; 1287b410d6e4ce58c177569d42b51772f7bb239a24a3darylm *sec = intval; 1288b410d6e4ce58c177569d42b51772f7bb239a24a3darylm *usec = (long)((tval - intval) * 1e6); /* can't exceed 1000000 */ 1289b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (*usec < 0) 1290b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* If rounding gave us a negative number, 1291b410d6e4ce58c177569d42b51772f7bb239a24a3darylm truncate. */ 1292b410d6e4ce58c177569d42b51772f7bb239a24a3darylm *usec = 0; 1293b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return 0; 1294b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1295b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if SIZEOF_TIME_T > SIZEOF_LONG 1296b410d6e4ce58c177569d42b51772f7bb239a24a3darylm intval = PyInt_AsUnsignedLongLongMask(t); 1297b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 1298b410d6e4ce58c177569d42b51772f7bb239a24a3darylm intval = PyInt_AsLong(t); 1299b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 1300b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (intval == -1 && PyErr_Occurred()) 1301b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return -1; 1302b410d6e4ce58c177569d42b51772f7bb239a24a3darylm *sec = intval; 1303b410d6e4ce58c177569d42b51772f7bb239a24a3darylm *usec = 0; 1304b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return 0; 1305b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1306b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1307b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_utime__doc__, 1308b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"utime(path, (atime, mtime))\n\ 1309b410d6e4ce58c177569d42b51772f7bb239a24a3darylmutime(path, None)\n\n\ 1310b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet the access and modified time of the file to the given values. If the\n\ 1311b410d6e4ce58c177569d42b51772f7bb239a24a3darylmsecond form is used, set the access and modified times to the current time."); 1312b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1313b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1314b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_utime(PyObject *self, PyObject *args) 1315b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1316b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path = NULL; 1317b410d6e4ce58c177569d42b51772f7bb239a24a3darylm time_t atime, mtime; 1318b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long ausec, musec; 1319b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 1320b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject* arg; 1321b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1322b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_UTIMES) 1323b410d6e4ce58c177569d42b51772f7bb239a24a3darylm struct timeval buf[2]; 1324b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ATIME buf[0].tv_sec 1325b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define MTIME buf[1].tv_sec 1326b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#elif defined(HAVE_UTIME_H) 1327b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* XXX should define struct utimbuf instead, above */ 1328b410d6e4ce58c177569d42b51772f7bb239a24a3darylm struct utimbuf buf; 1329b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ATIME buf.actime 1330b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define MTIME buf.modtime 1331b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define UTIME_ARG &buf 1332b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else /* HAVE_UTIMES */ 1333b410d6e4ce58c177569d42b51772f7bb239a24a3darylm time_t buf[2]; 1334b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define ATIME buf[0] 1335b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define MTIME buf[1] 1336b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define UTIME_ARG buf 1337b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_UTIMES */ 1338b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1339b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1340b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "etO:utime", 1341b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, &path, &arg)) 1342b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1343b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (arg == Py_None) { 1344b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* optional time values not given */ 1345b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 1346b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = utime(path, NULL); 1347b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 1348b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1349b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (!PyTuple_Check(arg) || PyTuple_Size(arg) != 2) { 1350b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 1351b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "utime() arg 2 must be a tuple (atime, mtime)"); 1352b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1353b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1354b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1355b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 1356b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (extract_time(PyTuple_GET_ITEM(arg, 0), 1357b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &atime, &ausec) == -1) { 1358b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1359b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1360b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1361b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (extract_time(PyTuple_GET_ITEM(arg, 1), 1362b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &mtime, &musec) == -1) { 1363b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1364b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1365b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1366b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ATIME = atime; 1367b410d6e4ce58c177569d42b51772f7bb239a24a3darylm MTIME = mtime; 1368b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_UTIMES 1369b410d6e4ce58c177569d42b51772f7bb239a24a3darylm buf[0].tv_usec = ausec; 1370b410d6e4ce58c177569d42b51772f7bb239a24a3darylm buf[1].tv_usec = musec; 1371b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 1372b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = utimes(path, buf); 1373b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 1374b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 1375b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 1376b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = utime(path, UTIME_ARG); 1377b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 1378b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_UTIMES */ 1379b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1380b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) { 1381b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_allocated_filename(path); 1382b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1383b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1384b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 1385b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 1386b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#undef UTIME_ARG 1387b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#undef ATIME 1388b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#undef MTIME 1389b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1390b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1391b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1392b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* Process operations */ 1393b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1394b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix__exit__doc__, 1395b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"_exit(status)\n\n\ 1396b410d6e4ce58c177569d42b51772f7bb239a24a3darylmExit to the system with specified status, without normal exit processing."); 1397b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1398b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1399b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix__exit(PyObject *self, PyObject *args) 1400b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1401b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int sts; 1402b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:_exit", &sts)) 1403b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1404b410d6e4ce58c177569d42b51772f7bb239a24a3darylm _Exit(sts); 1405b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; /* Make gcc -Wall happy */ 1406b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1407b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1408b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_EXECV) || defined(HAVE_SPAWNV) 1409b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic void 1410b410d6e4ce58c177569d42b51772f7bb239a24a3darylmfree_string_array(char **array, Py_ssize_t count) 1411b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1412b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_ssize_t i; 1413b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (i = 0; i < count; i++) 1414b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(array[i]); 1415b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_DEL(array); 1416b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1417b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 1418b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1419b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1420b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_EXECV 1421b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_execv__doc__, 1422b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"execv(path, args)\n\n\ 1423b410d6e4ce58c177569d42b51772f7bb239a24a3darylmExecute an executable path with arguments, replacing current process.\n\ 1424b410d6e4ce58c177569d42b51772f7bb239a24a3darylm\n\ 1425b410d6e4ce58c177569d42b51772f7bb239a24a3darylm path: path of executable file\n\ 1426b410d6e4ce58c177569d42b51772f7bb239a24a3darylm args: tuple or list of strings"); 1427b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1428b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1429b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_execv(PyObject *self, PyObject *args) 1430b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1431b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path; 1432b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *argv; 1433b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char **argvlist; 1434b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_ssize_t i, argc; 1435b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *(*getitem)(PyObject *, Py_ssize_t); 1436b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1437b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* execv has two arguments: (path, argv), where 1438b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argv is a list or tuple of strings. */ 1439b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1440b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "etO:execv", 1441b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, 1442b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &path, &argv)) 1443b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1444b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyList_Check(argv)) { 1445b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argc = PyList_Size(argv); 1446b410d6e4ce58c177569d42b51772f7bb239a24a3darylm getitem = PyList_GetItem; 1447b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1448b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (PyTuple_Check(argv)) { 1449b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argc = PyTuple_Size(argv); 1450b410d6e4ce58c177569d42b51772f7bb239a24a3darylm getitem = PyTuple_GetItem; 1451b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1452b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 1453b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, "execv() arg 2 must be a tuple or list"); 1454b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1455b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1456b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1457b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (argc < 1) { 1458b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, "execv() arg 2 must not be empty"); 1459b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1460b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1461b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1462b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1463b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argvlist = PyMem_NEW(char *, argc+1); 1464b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (argvlist == NULL) { 1465b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1466b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyErr_NoMemory(); 1467b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1468b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (i = 0; i < argc; i++) { 1469b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_Parse((*getitem)(argv, i), "et", 1470b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, 1471b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &argvlist[i])) { 1472b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free_string_array(argvlist, i); 1473b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 1474b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "execv() arg 2 must contain only strings"); 1475b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1476b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1477b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1478b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1479b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1480b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argvlist[argc] = NULL; 1481b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1482b410d6e4ce58c177569d42b51772f7bb239a24a3darylm execv(path, argvlist); 1483b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1484b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* If we get here it's definitely an error */ 1485b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1486b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free_string_array(argvlist, argc); 1487b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1488b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 1489b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1490b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1491b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1492b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_execve__doc__, 1493b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"execve(path, args, env)\n\n\ 1494b410d6e4ce58c177569d42b51772f7bb239a24a3darylmExecute a path with arguments and environment, replacing current process.\n\ 1495b410d6e4ce58c177569d42b51772f7bb239a24a3darylm\n\ 1496b410d6e4ce58c177569d42b51772f7bb239a24a3darylm path: path of executable file\n\ 1497b410d6e4ce58c177569d42b51772f7bb239a24a3darylm args: tuple or list of arguments\n\ 1498b410d6e4ce58c177569d42b51772f7bb239a24a3darylm env: dictionary of strings mapping to strings"); 1499b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1500b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1501b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_execve(PyObject *self, PyObject *args) 1502b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1503b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path; 1504b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *argv, *env; 1505b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char **argvlist; 1506b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char **envlist; 1507b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *key, *val, *keys=NULL, *vals=NULL; 1508b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_ssize_t i, pos, argc, envc; 1509b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *(*getitem)(PyObject *, Py_ssize_t); 1510b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_ssize_t lastarg = 0; 1511b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1512b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* execve has three arguments: (path, argv, env), where 1513b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argv is a list or tuple of strings and env is a dictionary 1514b410d6e4ce58c177569d42b51772f7bb239a24a3darylm like posix.environ. */ 1515b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1516b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "etOO:execve", 1517b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, 1518b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &path, &argv, &env)) 1519b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1520b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyList_Check(argv)) { 1521b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argc = PyList_Size(argv); 1522b410d6e4ce58c177569d42b51772f7bb239a24a3darylm getitem = PyList_GetItem; 1523b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1524b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (PyTuple_Check(argv)) { 1525b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argc = PyTuple_Size(argv); 1526b410d6e4ce58c177569d42b51772f7bb239a24a3darylm getitem = PyTuple_GetItem; 1527b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1528b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 1529b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 1530b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "execve() arg 2 must be a tuple or list"); 1531b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_0; 1532b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1533b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyMapping_Check(env)) { 1534b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 1535b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "execve() arg 3 must be a mapping object"); 1536b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_0; 1537b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1538b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1539b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argvlist = PyMem_NEW(char *, argc+1); 1540b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (argvlist == NULL) { 1541b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_NoMemory(); 1542b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_0; 1543b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1544b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (i = 0; i < argc; i++) { 1545b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_Parse((*getitem)(argv, i), 1546b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "et;execve() arg 2 must contain only strings", 1547b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, 1548b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &argvlist[i])) 1549b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 1550b410d6e4ce58c177569d42b51772f7bb239a24a3darylm lastarg = i; 1551b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_1; 1552b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1553b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1554b410d6e4ce58c177569d42b51772f7bb239a24a3darylm lastarg = argc; 1555b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argvlist[argc] = NULL; 1556b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1557b410d6e4ce58c177569d42b51772f7bb239a24a3darylm i = PyMapping_Size(env); 1558b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (i < 0) 1559b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_1; 1560b410d6e4ce58c177569d42b51772f7bb239a24a3darylm envlist = PyMem_NEW(char *, i + 1); 1561b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (envlist == NULL) { 1562b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_NoMemory(); 1563b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_1; 1564b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1565b410d6e4ce58c177569d42b51772f7bb239a24a3darylm envc = 0; 1566b410d6e4ce58c177569d42b51772f7bb239a24a3darylm keys = PyMapping_Keys(env); 1567b410d6e4ce58c177569d42b51772f7bb239a24a3darylm vals = PyMapping_Values(env); 1568b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!keys || !vals) 1569b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 1570b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyList_Check(keys) || !PyList_Check(vals)) { 1571b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 1572b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "execve(): env.keys() or env.values() is not a list"); 1573b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 1574b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1575b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1576b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (pos = 0; pos < i; pos++) { 1577b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *p, *k, *v; 1578b410d6e4ce58c177569d42b51772f7bb239a24a3darylm size_t len; 1579b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1580b410d6e4ce58c177569d42b51772f7bb239a24a3darylm key = PyList_GetItem(keys, pos); 1581b410d6e4ce58c177569d42b51772f7bb239a24a3darylm val = PyList_GetItem(vals, pos); 1582b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!key || !val) 1583b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 1584b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1585b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_Parse( 1586b410d6e4ce58c177569d42b51772f7bb239a24a3darylm key, 1587b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "s;execve() arg 3 contains a non-string key", 1588b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &k) || 1589b410d6e4ce58c177569d42b51772f7bb239a24a3darylm !PyArg_Parse( 1590b410d6e4ce58c177569d42b51772f7bb239a24a3darylm val, 1591b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "s;execve() arg 3 contains a non-string value", 1592b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &v)) 1593b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 1594b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 1595b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1596b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1597b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYOS_OS2) 1598b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Omit Pseudo-Env Vars that Would Confuse Programs if Passed On */ 1599b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (stricmp(k, "BEGINLIBPATH") != 0 && stricmp(k, "ENDLIBPATH") != 0) { 1600b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 1601b410d6e4ce58c177569d42b51772f7bb239a24a3darylm len = PyString_Size(key) + PyString_Size(val) + 2; 1602b410d6e4ce58c177569d42b51772f7bb239a24a3darylm p = PyMem_NEW(char, len); 1603b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (p == NULL) { 1604b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_NoMemory(); 1605b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 1606b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1607b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyOS_snprintf(p, len, "%s=%s", k, v); 1608b410d6e4ce58c177569d42b51772f7bb239a24a3darylm envlist[envc++] = p; 1609b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYOS_OS2) 1610b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1611b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 1612b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1613b410d6e4ce58c177569d42b51772f7bb239a24a3darylm envlist[envc] = 0; 1614b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1615b410d6e4ce58c177569d42b51772f7bb239a24a3darylm execve(path, argvlist, envlist); 1616b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1617b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* If we get here it's definitely an error */ 1618b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1619b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (void) posix_error(); 1620b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1621b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fail_2: 1622b410d6e4ce58c177569d42b51772f7bb239a24a3darylm while (--envc >= 0) 1623b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_DEL(envlist[envc]); 1624b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_DEL(envlist); 1625b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fail_1: 1626b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free_string_array(argvlist, lastarg); 1627b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(vals); 1628b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(keys); 1629b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fail_0: 1630b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1631b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1632b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1633b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_EXECV */ 1634b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1635b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1636b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SPAWNV 1637b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_spawnv__doc__, 1638b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"spawnv(mode, path, args)\n\n\ 1639b410d6e4ce58c177569d42b51772f7bb239a24a3darylmExecute the program 'path' in a new process.\n\ 1640b410d6e4ce58c177569d42b51772f7bb239a24a3darylm\n\ 1641b410d6e4ce58c177569d42b51772f7bb239a24a3darylm mode: mode of process creation\n\ 1642b410d6e4ce58c177569d42b51772f7bb239a24a3darylm path: path of executable file\n\ 1643b410d6e4ce58c177569d42b51772f7bb239a24a3darylm args: tuple or list of strings"); 1644b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1645b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1646b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_spawnv(PyObject *self, PyObject *args) 1647b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1648b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path; 1649b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *argv; 1650b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char **argvlist; 1651b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int mode, i; 1652b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_ssize_t argc; 1653b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_intptr_t spawnval; 1654b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *(*getitem)(PyObject *, Py_ssize_t); 1655b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1656b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* spawnv has three arguments: (mode, path, argv), where 1657b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argv is a list or tuple of strings. */ 1658b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1659b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "ietO:spawnv", &mode, 1660b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, 1661b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &path, &argv)) 1662b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1663b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyList_Check(argv)) { 1664b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argc = PyList_Size(argv); 1665b410d6e4ce58c177569d42b51772f7bb239a24a3darylm getitem = PyList_GetItem; 1666b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1667b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (PyTuple_Check(argv)) { 1668b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argc = PyTuple_Size(argv); 1669b410d6e4ce58c177569d42b51772f7bb239a24a3darylm getitem = PyTuple_GetItem; 1670b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1671b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 1672b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 1673b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "spawnv() arg 2 must be a tuple or list"); 1674b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1675b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1676b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1677b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1678b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argvlist = PyMem_NEW(char *, argc+1); 1679b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (argvlist == NULL) { 1680b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1681b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyErr_NoMemory(); 1682b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1683b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (i = 0; i < argc; i++) { 1684b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_Parse((*getitem)(argv, i), "et", 1685b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, 1686b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &argvlist[i])) { 1687b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free_string_array(argvlist, i); 1688b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString( 1689b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyExc_TypeError, 1690b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "spawnv() arg 2 must contain only strings"); 1691b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1692b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1693b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1694b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1695b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argvlist[argc] = NULL; 1696b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1697b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYOS_OS2) && defined(PYCC_GCC) 1698b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 1699b410d6e4ce58c177569d42b51772f7bb239a24a3darylm spawnval = spawnv(mode, path, argvlist); 1700b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 1701b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 1702b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (mode == _OLD_P_OVERLAY) 1703b410d6e4ce58c177569d42b51772f7bb239a24a3darylm mode = _P_OVERLAY; 1704b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1705b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 1706b410d6e4ce58c177569d42b51772f7bb239a24a3darylm spawnval = _spawnv(mode, path, argvlist); 1707b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 1708b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 1709b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1710b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free_string_array(argvlist, argc); 1711b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1712b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1713b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (spawnval == -1) 1714b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 1715b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 1716b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if SIZEOF_LONG == SIZEOF_VOID_P 1717b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("l", (long) spawnval); 1718b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 1719b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("L", (PY_LONG_LONG) spawnval); 1720b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 1721b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1722b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1723b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1724b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_spawnve__doc__, 1725b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"spawnve(mode, path, args, env)\n\n\ 1726b410d6e4ce58c177569d42b51772f7bb239a24a3darylmExecute the program 'path' in a new process.\n\ 1727b410d6e4ce58c177569d42b51772f7bb239a24a3darylm\n\ 1728b410d6e4ce58c177569d42b51772f7bb239a24a3darylm mode: mode of process creation\n\ 1729b410d6e4ce58c177569d42b51772f7bb239a24a3darylm path: path of executable file\n\ 1730b410d6e4ce58c177569d42b51772f7bb239a24a3darylm args: tuple or list of arguments\n\ 1731b410d6e4ce58c177569d42b51772f7bb239a24a3darylm env: dictionary of strings mapping to strings"); 1732b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1733b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1734b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_spawnve(PyObject *self, PyObject *args) 1735b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1736b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path; 1737b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *argv, *env; 1738b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char **argvlist; 1739b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char **envlist; 1740b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL; 1741b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int mode, pos, envc; 1742b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_ssize_t argc, i; 1743b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_intptr_t spawnval; 1744b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *(*getitem)(PyObject *, Py_ssize_t); 1745b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_ssize_t lastarg = 0; 1746b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1747b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* spawnve has four arguments: (mode, path, argv, env), where 1748b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argv is a list or tuple of strings and env is a dictionary 1749b410d6e4ce58c177569d42b51772f7bb239a24a3darylm like posix.environ. */ 1750b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1751b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "ietOO:spawnve", &mode, 1752b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, 1753b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &path, &argv, &env)) 1754b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1755b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyList_Check(argv)) { 1756b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argc = PyList_Size(argv); 1757b410d6e4ce58c177569d42b51772f7bb239a24a3darylm getitem = PyList_GetItem; 1758b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1759b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (PyTuple_Check(argv)) { 1760b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argc = PyTuple_Size(argv); 1761b410d6e4ce58c177569d42b51772f7bb239a24a3darylm getitem = PyTuple_GetItem; 1762b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1763b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 1764b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 1765b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "spawnve() arg 2 must be a tuple or list"); 1766b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_0; 1767b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1768b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyMapping_Check(env)) { 1769b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 1770b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "spawnve() arg 3 must be a mapping object"); 1771b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_0; 1772b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1773b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1774b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argvlist = PyMem_NEW(char *, argc+1); 1775b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (argvlist == NULL) { 1776b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_NoMemory(); 1777b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_0; 1778b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1779b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (i = 0; i < argc; i++) { 1780b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_Parse((*getitem)(argv, i), 1781b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "et;spawnve() arg 2 must contain only strings", 1782b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, 1783b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &argvlist[i])) 1784b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 1785b410d6e4ce58c177569d42b51772f7bb239a24a3darylm lastarg = i; 1786b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_1; 1787b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1788b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1789b410d6e4ce58c177569d42b51772f7bb239a24a3darylm lastarg = argc; 1790b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argvlist[argc] = NULL; 1791b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1792b410d6e4ce58c177569d42b51772f7bb239a24a3darylm i = PyMapping_Size(env); 1793b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (i < 0) 1794b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_1; 1795b410d6e4ce58c177569d42b51772f7bb239a24a3darylm envlist = PyMem_NEW(char *, i + 1); 1796b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (envlist == NULL) { 1797b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_NoMemory(); 1798b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_1; 1799b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1800b410d6e4ce58c177569d42b51772f7bb239a24a3darylm envc = 0; 1801b410d6e4ce58c177569d42b51772f7bb239a24a3darylm keys = PyMapping_Keys(env); 1802b410d6e4ce58c177569d42b51772f7bb239a24a3darylm vals = PyMapping_Values(env); 1803b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!keys || !vals) 1804b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 1805b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyList_Check(keys) || !PyList_Check(vals)) { 1806b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 1807b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "spawnve(): env.keys() or env.values() is not a list"); 1808b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 1809b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1810b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1811b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (pos = 0; pos < i; pos++) { 1812b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *p, *k, *v; 1813b410d6e4ce58c177569d42b51772f7bb239a24a3darylm size_t len; 1814b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1815b410d6e4ce58c177569d42b51772f7bb239a24a3darylm key = PyList_GetItem(keys, pos); 1816b410d6e4ce58c177569d42b51772f7bb239a24a3darylm val = PyList_GetItem(vals, pos); 1817b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!key || !val) 1818b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 1819b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1820b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_Parse( 1821b410d6e4ce58c177569d42b51772f7bb239a24a3darylm key, 1822b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "s;spawnve() arg 3 contains a non-string key", 1823b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &k) || 1824b410d6e4ce58c177569d42b51772f7bb239a24a3darylm !PyArg_Parse( 1825b410d6e4ce58c177569d42b51772f7bb239a24a3darylm val, 1826b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "s;spawnve() arg 3 contains a non-string value", 1827b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &v)) 1828b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 1829b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 1830b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1831b410d6e4ce58c177569d42b51772f7bb239a24a3darylm len = PyString_Size(key) + PyString_Size(val) + 2; 1832b410d6e4ce58c177569d42b51772f7bb239a24a3darylm p = PyMem_NEW(char, len); 1833b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (p == NULL) { 1834b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_NoMemory(); 1835b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 1836b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1837b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyOS_snprintf(p, len, "%s=%s", k, v); 1838b410d6e4ce58c177569d42b51772f7bb239a24a3darylm envlist[envc++] = p; 1839b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1840b410d6e4ce58c177569d42b51772f7bb239a24a3darylm envlist[envc] = 0; 1841b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1842b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYOS_OS2) && defined(PYCC_GCC) 1843b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 1844b410d6e4ce58c177569d42b51772f7bb239a24a3darylm spawnval = spawnve(mode, path, argvlist, envlist); 1845b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 1846b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 1847b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (mode == _OLD_P_OVERLAY) 1848b410d6e4ce58c177569d42b51772f7bb239a24a3darylm mode = _P_OVERLAY; 1849b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1850b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 1851b410d6e4ce58c177569d42b51772f7bb239a24a3darylm spawnval = _spawnve(mode, path, argvlist, envlist); 1852b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 1853b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 1854b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1855b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (spawnval == -1) 1856b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (void) posix_error(); 1857b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 1858b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if SIZEOF_LONG == SIZEOF_VOID_P 1859b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = Py_BuildValue("l", (long) spawnval); 1860b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 1861b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = Py_BuildValue("L", (PY_LONG_LONG) spawnval); 1862b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 1863b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1864b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fail_2: 1865b410d6e4ce58c177569d42b51772f7bb239a24a3darylm while (--envc >= 0) 1866b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_DEL(envlist[envc]); 1867b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_DEL(envlist); 1868b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fail_1: 1869b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free_string_array(argvlist, lastarg); 1870b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(vals); 1871b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(keys); 1872b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fail_0: 1873b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1874b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return res; 1875b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1876b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1877b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* OS/2 supports spawnvp & spawnvpe natively */ 1878b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYOS_OS2) 1879b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_spawnvp__doc__, 1880b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"spawnvp(mode, file, args)\n\n\ 1881b410d6e4ce58c177569d42b51772f7bb239a24a3darylmExecute the program 'file' in a new process, using the environment\n\ 1882b410d6e4ce58c177569d42b51772f7bb239a24a3darylmsearch path to find the file.\n\ 1883b410d6e4ce58c177569d42b51772f7bb239a24a3darylm\n\ 1884b410d6e4ce58c177569d42b51772f7bb239a24a3darylm mode: mode of process creation\n\ 1885b410d6e4ce58c177569d42b51772f7bb239a24a3darylm file: executable file name\n\ 1886b410d6e4ce58c177569d42b51772f7bb239a24a3darylm args: tuple or list of strings"); 1887b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1888b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1889b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_spawnvp(PyObject *self, PyObject *args) 1890b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1891b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path; 1892b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *argv; 1893b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char **argvlist; 1894b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int mode, i, argc; 1895b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_intptr_t spawnval; 1896b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *(*getitem)(PyObject *, Py_ssize_t); 1897b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1898b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* spawnvp has three arguments: (mode, path, argv), where 1899b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argv is a list or tuple of strings. */ 1900b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1901b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "ietO:spawnvp", &mode, 1902b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, 1903b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &path, &argv)) 1904b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1905b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyList_Check(argv)) { 1906b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argc = PyList_Size(argv); 1907b410d6e4ce58c177569d42b51772f7bb239a24a3darylm getitem = PyList_GetItem; 1908b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1909b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (PyTuple_Check(argv)) { 1910b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argc = PyTuple_Size(argv); 1911b410d6e4ce58c177569d42b51772f7bb239a24a3darylm getitem = PyTuple_GetItem; 1912b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1913b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 1914b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 1915b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "spawnvp() arg 2 must be a tuple or list"); 1916b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1917b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1918b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1919b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1920b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argvlist = PyMem_NEW(char *, argc+1); 1921b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (argvlist == NULL) { 1922b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1923b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyErr_NoMemory(); 1924b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1925b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (i = 0; i < argc; i++) { 1926b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_Parse((*getitem)(argv, i), "et", 1927b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, 1928b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &argvlist[i])) { 1929b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free_string_array(argvlist, i); 1930b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString( 1931b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyExc_TypeError, 1932b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "spawnvp() arg 2 must contain only strings"); 1933b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1934b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1935b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1936b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1937b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argvlist[argc] = NULL; 1938b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1939b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 1940b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYCC_GCC) 1941b410d6e4ce58c177569d42b51772f7bb239a24a3darylm spawnval = spawnvp(mode, path, argvlist); 1942b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 1943b410d6e4ce58c177569d42b51772f7bb239a24a3darylm spawnval = _spawnvp(mode, path, argvlist); 1944b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 1945b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 1946b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1947b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free_string_array(argvlist, argc); 1948b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 1949b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1950b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (spawnval == -1) 1951b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 1952b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 1953b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("l", (long) spawnval); 1954b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 1955b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1956b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1957b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_spawnvpe__doc__, 1958b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"spawnvpe(mode, file, args, env)\n\n\ 1959b410d6e4ce58c177569d42b51772f7bb239a24a3darylmExecute the program 'file' in a new process, using the environment\n\ 1960b410d6e4ce58c177569d42b51772f7bb239a24a3darylmsearch path to find the file.\n\ 1961b410d6e4ce58c177569d42b51772f7bb239a24a3darylm\n\ 1962b410d6e4ce58c177569d42b51772f7bb239a24a3darylm mode: mode of process creation\n\ 1963b410d6e4ce58c177569d42b51772f7bb239a24a3darylm file: executable file name\n\ 1964b410d6e4ce58c177569d42b51772f7bb239a24a3darylm args: tuple or list of arguments\n\ 1965b410d6e4ce58c177569d42b51772f7bb239a24a3darylm env: dictionary of strings mapping to strings"); 1966b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1967b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 1968b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_spawnvpe(PyObject *self, PyObject *args) 1969b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 1970b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path; 1971b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *argv, *env; 1972b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char **argvlist; 1973b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char **envlist; 1974b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL; 1975b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int mode, i, pos, argc, envc; 1976b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_intptr_t spawnval; 1977b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *(*getitem)(PyObject *, Py_ssize_t); 1978b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int lastarg = 0; 1979b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1980b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* spawnvpe has four arguments: (mode, path, argv, env), where 1981b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argv is a list or tuple of strings and env is a dictionary 1982b410d6e4ce58c177569d42b51772f7bb239a24a3darylm like posix.environ. */ 1983b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 1984b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "ietOO:spawnvpe", &mode, 1985b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, 1986b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &path, &argv, &env)) 1987b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 1988b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyList_Check(argv)) { 1989b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argc = PyList_Size(argv); 1990b410d6e4ce58c177569d42b51772f7bb239a24a3darylm getitem = PyList_GetItem; 1991b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1992b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (PyTuple_Check(argv)) { 1993b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argc = PyTuple_Size(argv); 1994b410d6e4ce58c177569d42b51772f7bb239a24a3darylm getitem = PyTuple_GetItem; 1995b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 1996b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 1997b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 1998b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "spawnvpe() arg 2 must be a tuple or list"); 1999b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_0; 2000b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2001b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyMapping_Check(env)) { 2002b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 2003b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "spawnvpe() arg 3 must be a mapping object"); 2004b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_0; 2005b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2006b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2007b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argvlist = PyMem_NEW(char *, argc+1); 2008b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (argvlist == NULL) { 2009b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_NoMemory(); 2010b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_0; 2011b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2012b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (i = 0; i < argc; i++) { 2013b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_Parse((*getitem)(argv, i), 2014b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "et;spawnvpe() arg 2 must contain only strings", 2015b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, 2016b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &argvlist[i])) 2017b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 2018b410d6e4ce58c177569d42b51772f7bb239a24a3darylm lastarg = i; 2019b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_1; 2020b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2021b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2022b410d6e4ce58c177569d42b51772f7bb239a24a3darylm lastarg = argc; 2023b410d6e4ce58c177569d42b51772f7bb239a24a3darylm argvlist[argc] = NULL; 2024b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2025b410d6e4ce58c177569d42b51772f7bb239a24a3darylm i = PyMapping_Size(env); 2026b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (i < 0) 2027b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_1; 2028b410d6e4ce58c177569d42b51772f7bb239a24a3darylm envlist = PyMem_NEW(char *, i + 1); 2029b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (envlist == NULL) { 2030b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_NoMemory(); 2031b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_1; 2032b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2033b410d6e4ce58c177569d42b51772f7bb239a24a3darylm envc = 0; 2034b410d6e4ce58c177569d42b51772f7bb239a24a3darylm keys = PyMapping_Keys(env); 2035b410d6e4ce58c177569d42b51772f7bb239a24a3darylm vals = PyMapping_Values(env); 2036b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!keys || !vals) 2037b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 2038b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyList_Check(keys) || !PyList_Check(vals)) { 2039b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 2040b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "spawnvpe(): env.keys() or env.values() is not a list"); 2041b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 2042b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2043b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2044b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (pos = 0; pos < i; pos++) { 2045b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *p, *k, *v; 2046b410d6e4ce58c177569d42b51772f7bb239a24a3darylm size_t len; 2047b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2048b410d6e4ce58c177569d42b51772f7bb239a24a3darylm key = PyList_GetItem(keys, pos); 2049b410d6e4ce58c177569d42b51772f7bb239a24a3darylm val = PyList_GetItem(vals, pos); 2050b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!key || !val) 2051b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 2052b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2053b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_Parse( 2054b410d6e4ce58c177569d42b51772f7bb239a24a3darylm key, 2055b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "s;spawnvpe() arg 3 contains a non-string key", 2056b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &k) || 2057b410d6e4ce58c177569d42b51772f7bb239a24a3darylm !PyArg_Parse( 2058b410d6e4ce58c177569d42b51772f7bb239a24a3darylm val, 2059b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "s;spawnvpe() arg 3 contains a non-string value", 2060b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &v)) 2061b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 2062b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 2063b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2064b410d6e4ce58c177569d42b51772f7bb239a24a3darylm len = PyString_Size(key) + PyString_Size(val) + 2; 2065b410d6e4ce58c177569d42b51772f7bb239a24a3darylm p = PyMem_NEW(char, len); 2066b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (p == NULL) { 2067b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_NoMemory(); 2068b410d6e4ce58c177569d42b51772f7bb239a24a3darylm goto fail_2; 2069b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2070b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyOS_snprintf(p, len, "%s=%s", k, v); 2071b410d6e4ce58c177569d42b51772f7bb239a24a3darylm envlist[envc++] = p; 2072b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2073b410d6e4ce58c177569d42b51772f7bb239a24a3darylm envlist[envc] = 0; 2074b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2075b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 2076b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYCC_GCC) 2077b410d6e4ce58c177569d42b51772f7bb239a24a3darylm spawnval = spawnvpe(mode, path, argvlist, envlist); 2078b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 2079b410d6e4ce58c177569d42b51772f7bb239a24a3darylm spawnval = _spawnvpe(mode, path, argvlist, envlist); 2080b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2081b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 2082b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2083b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (spawnval == -1) 2084b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (void) posix_error(); 2085b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 2086b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = Py_BuildValue("l", (long) spawnval); 2087b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2088b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fail_2: 2089b410d6e4ce58c177569d42b51772f7bb239a24a3darylm while (--envc >= 0) 2090b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_DEL(envlist[envc]); 2091b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_DEL(envlist); 2092b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fail_1: 2093b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free_string_array(argvlist, lastarg); 2094b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(vals); 2095b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(keys); 2096b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fail_0: 2097b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 2098b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return res; 2099b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2100b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* PYOS_OS2 */ 2101b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SPAWNV */ 2102b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2103b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2104b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FORK1 2105b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_fork1__doc__, 2106b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"fork1() -> pid\n\n\ 2107b410d6e4ce58c177569d42b51772f7bb239a24a3darylmFork a child process with a single multiplexed (i.e., not bound) thread.\n\ 2108b410d6e4ce58c177569d42b51772f7bb239a24a3darylm\n\ 2109b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn 0 to child process and PID of child to parent process."); 2110b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2111b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2112b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_fork1(PyObject *self, PyObject *noargs) 2113b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2114b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pid; 2115b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int result = 0; 2116b410d6e4ce58c177569d42b51772f7bb239a24a3darylm _PyImport_AcquireLock(); 2117b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid = fork1(); 2118b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pid == 0) { 2119b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* child: this clobbers and resets the import lock. */ 2120b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyOS_AfterFork(); 2121b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 2122b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* parent: release the import lock. */ 2123b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = _PyImport_ReleaseLock(); 2124b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2125b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pid == -1) 2126b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2127b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (result < 0) { 2128b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Don't clobber the OSError if the fork failed. */ 2129b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_RuntimeError, 2130b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "not holding the import lock"); 2131b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2132b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2133b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyLong_FromPid(pid); 2134b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2135b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2136b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2137b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2138b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FORK 2139b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_fork__doc__, 2140b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"fork() -> pid\n\n\ 2141b410d6e4ce58c177569d42b51772f7bb239a24a3darylmFork a child process.\n\ 2142b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn 0 to child process and PID of child to parent process."); 2143b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2144b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2145b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_fork(PyObject *self, PyObject *noargs) 2146b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2147b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pid; 2148b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int result = 0; 2149b410d6e4ce58c177569d42b51772f7bb239a24a3darylm _PyImport_AcquireLock(); 2150b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid = fork(); 2151b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pid == 0) { 2152b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* child: this clobbers and resets the import lock. */ 2153b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyOS_AfterFork(); 2154b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 2155b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* parent: release the import lock. */ 2156b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = _PyImport_ReleaseLock(); 2157b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2158b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pid == -1) 2159b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2160b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (result < 0) { 2161b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Don't clobber the OSError if the fork failed. */ 2162b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_RuntimeError, 2163b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "not holding the import lock"); 2164b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2165b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2166b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyLong_FromPid(pid); 2167b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2168b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2169b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2170b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* AIX uses /dev/ptc but is otherwise the same as /dev/ptmx */ 2171b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* IRIX has both /dev/ptc and /dev/ptmx, use ptmx */ 2172b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_DEV_PTC) && !defined(HAVE_DEV_PTMX) 2173b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define DEV_PTY_FILE "/dev/ptc" 2174b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define HAVE_DEV_PTMX 2175b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 2176b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define DEV_PTY_FILE "/dev/ptmx" 2177b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2178b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2179b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX) 2180b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_PTY_H 2181b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <pty.h> 2182b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 2183b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_LIBUTIL_H 2184b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <libutil.h> 2185b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 2186b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_UTIL_H 2187b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <util.h> 2188b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_UTIL_H */ 2189b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_LIBUTIL_H */ 2190b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_PTY_H */ 2191b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_STROPTS_H 2192b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <stropts.h> 2193b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2194b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX */ 2195b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2196b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) 2197b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_openpty__doc__, 2198b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"openpty() -> (master_fd, slave_fd)\n\n\ 2199b410d6e4ce58c177569d42b51772f7bb239a24a3darylmOpen a pseudo-terminal, returning open fd's for both master and slave end.\n"); 2200b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2201b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2202b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_openpty(PyObject *self, PyObject *noargs) 2203b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2204b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int master_fd, slave_fd; 2205b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifndef HAVE_OPENPTY 2206b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char * slave_name; 2207b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2208b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_DEV_PTMX) && !defined(HAVE_OPENPTY) && !defined(HAVE__GETPTY) 2209b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyOS_sighandler_t sig_saved; 2210b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef sun 2211b410d6e4ce58c177569d42b51772f7bb239a24a3darylm extern char *ptsname(int fildes); 2212b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2213b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2214b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2215b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_OPENPTY 2216b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) != 0) 2217b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2218b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#elif defined(HAVE__GETPTY) 2219b410d6e4ce58c177569d42b51772f7bb239a24a3darylm slave_name = _getpty(&master_fd, O_RDWR, 0666, 0); 2220b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (slave_name == NULL) 2221b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2222b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2223b410d6e4ce58c177569d42b51772f7bb239a24a3darylm slave_fd = open(slave_name, O_RDWR); 2224b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (slave_fd < 0) 2225b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2226b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 2227b410d6e4ce58c177569d42b51772f7bb239a24a3darylm master_fd = open(DEV_PTY_FILE, O_RDWR | O_NOCTTY); /* open master */ 2228b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (master_fd < 0) 2229b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2230b410d6e4ce58c177569d42b51772f7bb239a24a3darylm sig_saved = PyOS_setsig(SIGCHLD, SIG_DFL); 2231b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* change permission of slave */ 2232b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (grantpt(master_fd) < 0) { 2233b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyOS_setsig(SIGCHLD, sig_saved); 2234b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2235b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2236b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* unlock slave */ 2237b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (unlockpt(master_fd) < 0) { 2238b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyOS_setsig(SIGCHLD, sig_saved); 2239b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2240b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2241b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyOS_setsig(SIGCHLD, sig_saved); 2242b410d6e4ce58c177569d42b51772f7bb239a24a3darylm slave_name = ptsname(master_fd); /* get name of slave */ 2243b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (slave_name == NULL) 2244b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2245b410d6e4ce58c177569d42b51772f7bb239a24a3darylm slave_fd = open(slave_name, O_RDWR | O_NOCTTY); /* open slave */ 2246b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (slave_fd < 0) 2247b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2248b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if !defined(__CYGWIN__) && !defined(HAVE_DEV_PTC) 2249b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ioctl(slave_fd, I_PUSH, "ptem"); /* push ptem */ 2250b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ioctl(slave_fd, I_PUSH, "ldterm"); /* push ldterm */ 2251b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifndef __hpux 2252b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ioctl(slave_fd, I_PUSH, "ttcompat"); /* push ttcompat */ 2253b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* __hpux */ 2254b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_CYGWIN */ 2255b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_OPENPTY */ 2256b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2257b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("(ii)", master_fd, slave_fd); 2258b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2259b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2260b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) */ 2261b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2262b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FORKPTY 2263b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_forkpty__doc__, 2264b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"forkpty() -> (pid, master_fd)\n\n\ 2265b410d6e4ce58c177569d42b51772f7bb239a24a3darylmFork a new process with a new pseudo-terminal as controlling tty.\n\n\ 2266b410d6e4ce58c177569d42b51772f7bb239a24a3darylmLike fork(), return 0 as pid to child process, and PID of child to parent.\n\ 2267b410d6e4ce58c177569d42b51772f7bb239a24a3darylmTo both, return fd of newly opened pseudo-terminal.\n"); 2268b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2269b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2270b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_forkpty(PyObject *self, PyObject *noargs) 2271b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2272b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int master_fd = -1, result = 0; 2273b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pid; 2274b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2275b410d6e4ce58c177569d42b51772f7bb239a24a3darylm _PyImport_AcquireLock(); 2276b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid = forkpty(&master_fd, NULL, NULL, NULL); 2277b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pid == 0) { 2278b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* child: this clobbers and resets the import lock. */ 2279b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyOS_AfterFork(); 2280b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 2281b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* parent: release the import lock. */ 2282b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = _PyImport_ReleaseLock(); 2283b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2284b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pid == -1) 2285b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2286b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (result < 0) { 2287b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Don't clobber the OSError if the fork failed. */ 2288b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_RuntimeError, 2289b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "not holding the import lock"); 2290b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2291b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2292b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("(Ni)", PyLong_FromPid(pid), master_fd); 2293b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2294b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2295b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2296b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETEGID 2297b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_getegid__doc__, 2298b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"getegid() -> egid\n\n\ 2299b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn the current process's effective group id."); 2300b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2301b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2302b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_getegid(PyObject *self, PyObject *noargs) 2303b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2304b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromLong((long)getegid()); 2305b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2306b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2307b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2308b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2309b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETEUID 2310b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_geteuid__doc__, 2311b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"geteuid() -> euid\n\n\ 2312b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn the current process's effective user id."); 2313b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2314b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2315b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_geteuid(PyObject *self, PyObject *noargs) 2316b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2317b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromLong((long)geteuid()); 2318b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2319b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2320b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2321b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2322b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETGID 2323b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_getgid__doc__, 2324b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"getgid() -> gid\n\n\ 2325b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn the current process's group id."); 2326b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2327b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2328b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_getgid(PyObject *self, PyObject *noargs) 2329b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2330b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromLong((long)getgid()); 2331b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2332b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2333b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2334b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2335b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_getpid__doc__, 2336b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"getpid() -> pid\n\n\ 2337b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn the current process id"); 2338b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2339b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2340b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_getpid(PyObject *self, PyObject *noargs) 2341b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2342b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyLong_FromPid(getpid()); 2343b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2344b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2345b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2346b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETGROUPS 2347b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_getgroups__doc__, 2348b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"getgroups() -> list of group IDs\n\n\ 2349b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn list of supplemental group IDs for the process."); 2350b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2351b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2352b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_getgroups(PyObject *self, PyObject *noargs) 2353b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2354b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *result = NULL; 2355b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2356b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef NGROUPS_MAX 2357b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define MAX_GROUPS NGROUPS_MAX 2358b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 2359b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* defined to be 16 on Solaris7, so this should be a small number */ 2360b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define MAX_GROUPS 64 2361b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2362b410d6e4ce58c177569d42b51772f7bb239a24a3darylm gid_t grouplist[MAX_GROUPS]; 2363b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2364b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* On MacOSX getgroups(2) can return more than MAX_GROUPS results 2365b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * This is a helper variable to store the intermediate result when 2366b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * that happens. 2367b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 2368b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * To keep the code readable the OSX behaviour is unconditional, 2369b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * according to the POSIX spec this should be safe on all unix-y 2370b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * systems. 2371b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 2372b410d6e4ce58c177569d42b51772f7bb239a24a3darylm gid_t* alt_grouplist = grouplist; 2373b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int n; 2374b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2375b410d6e4ce58c177569d42b51772f7bb239a24a3darylm n = getgroups(MAX_GROUPS, grouplist); 2376b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (n < 0) { 2377b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (errno == EINVAL) { 2378b410d6e4ce58c177569d42b51772f7bb239a24a3darylm n = getgroups(0, NULL); 2379b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (n == -1) { 2380b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2381b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2382b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (n == 0) { 2383b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Avoid malloc(0) */ 2384b410d6e4ce58c177569d42b51772f7bb239a24a3darylm alt_grouplist = grouplist; 2385b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 2386b410d6e4ce58c177569d42b51772f7bb239a24a3darylm alt_grouplist = PyMem_Malloc(n * sizeof(gid_t)); 2387b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (alt_grouplist == NULL) { 2388b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = EINVAL; 2389b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2390b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2391b410d6e4ce58c177569d42b51772f7bb239a24a3darylm n = getgroups(n, alt_grouplist); 2392b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (n == -1) { 2393b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(alt_grouplist); 2394b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2395b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2396b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2397b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 2398b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2399b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2400b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2401b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = PyList_New(n); 2402b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (result != NULL) { 2403b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int i; 2404b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (i = 0; i < n; ++i) { 2405b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *o = PyInt_FromLong((long)alt_grouplist[i]); 2406b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (o == NULL) { 2407b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(result); 2408b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = NULL; 2409b410d6e4ce58c177569d42b51772f7bb239a24a3darylm break; 2410b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2411b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyList_SET_ITEM(result, i, o); 2412b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2413b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2414b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2415b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (alt_grouplist != grouplist) { 2416b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(alt_grouplist); 2417b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2418b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2419b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return result; 2420b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2421b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2422b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2423b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_INITGROUPS 2424b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_initgroups__doc__, 2425b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"initgroups(username, gid) -> None\n\n\ 2426b410d6e4ce58c177569d42b51772f7bb239a24a3darylmCall the system initgroups() to initialize the group access list with all of\n\ 2427b410d6e4ce58c177569d42b51772f7bb239a24a3darylmthe groups of which the specified username is a member, plus the specified\n\ 2428b410d6e4ce58c177569d42b51772f7bb239a24a3darylmgroup id."); 2429b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2430b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2431b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_initgroups(PyObject *self, PyObject *args) 2432b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2433b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *username; 2434b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long gid; 2435b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2436b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "sl:initgroups", &username, &gid)) 2437b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2438b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2439b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (initgroups(username, (gid_t) gid) == -1) 2440b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyErr_SetFromErrno(PyExc_OSError); 2441b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2442b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 2443b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 2444b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2445b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2446b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2447b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETPGID 2448b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_getpgid__doc__, 2449b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"getpgid(pid) -> pgid\n\n\ 2450b410d6e4ce58c177569d42b51772f7bb239a24a3darylmCall the system call getpgid()."); 2451b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2452b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2453b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_getpgid(PyObject *self, PyObject *args) 2454b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2455b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pid, pgid; 2456b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, PARSE_PID ":getpgid", &pid)) 2457b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2458b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pgid = getpgid(pid); 2459b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pgid < 0) 2460b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2461b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyLong_FromPid(pgid); 2462b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2463b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_GETPGID */ 2464b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2465b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2466b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETPGRP 2467b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_getpgrp__doc__, 2468b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"getpgrp() -> pgrp\n\n\ 2469b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn the current process group id."); 2470b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2471b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2472b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_getpgrp(PyObject *self, PyObject *noargs) 2473b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2474b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef GETPGRP_HAVE_ARG 2475b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyLong_FromPid(getpgrp(0)); 2476b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else /* GETPGRP_HAVE_ARG */ 2477b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyLong_FromPid(getpgrp()); 2478b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* GETPGRP_HAVE_ARG */ 2479b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2480b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_GETPGRP */ 2481b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2482b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2483b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETPGRP 2484b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_setpgrp__doc__, 2485b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"setpgrp()\n\n\ 2486b410d6e4ce58c177569d42b51772f7bb239a24a3darylmMake this process the process group leader."); 2487b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2488b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2489b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_setpgrp(PyObject *self, PyObject *noargs) 2490b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2491b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef SETPGRP_HAVE_ARG 2492b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setpgrp(0, 0) < 0) 2493b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else /* SETPGRP_HAVE_ARG */ 2494b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setpgrp() < 0) 2495b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* SETPGRP_HAVE_ARG */ 2496b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2497b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 2498b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 2499b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2500b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2501b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETPGRP */ 2502b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2503b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETPPID 2504b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_getppid__doc__, 2505b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"getppid() -> ppid\n\n\ 2506b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn the parent's process id."); 2507b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2508b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2509b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_getppid(PyObject *self, PyObject *noargs) 2510b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2511b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyLong_FromPid(getppid()); 2512b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2513b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2514b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2515b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2516b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETLOGIN 2517b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_getlogin__doc__, 2518b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"getlogin() -> string\n\n\ 2519b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn the actual login name."); 2520b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2521b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2522b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_getlogin(PyObject *self, PyObject *noargs) 2523b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2524b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *result = NULL; 2525b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *name; 2526b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int old_errno = errno; 2527b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2528b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = 0; 2529b410d6e4ce58c177569d42b51772f7bb239a24a3darylm name = getlogin(); 2530b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (name == NULL) { 2531b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (errno) 2532b410d6e4ce58c177569d42b51772f7bb239a24a3darylm posix_error(); 2533b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 2534b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_OSError, 2535b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "unable to determine login name"); 2536b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2537b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 2538b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = PyString_FromString(name); 2539b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = old_errno; 2540b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2541b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return result; 2542b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2543b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2544b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2545521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm#ifndef UEFI_C_SOURCE 2546b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_getuid__doc__, 2547b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"getuid() -> uid\n\n\ 2548b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn the current process's user id."); 2549b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2550b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2551b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_getuid(PyObject *self, PyObject *noargs) 2552b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2553b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromLong((long)getuid()); 2554b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2555521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm#endif /* UEFI_C_SOURCE */ 2556b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2557b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_KILL 2558b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_kill__doc__, 2559b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"kill(pid, sig)\n\n\ 2560b410d6e4ce58c177569d42b51772f7bb239a24a3darylmKill a process with a signal."); 2561b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2562b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2563b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_kill(PyObject *self, PyObject *args) 2564b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2565b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pid; 2566b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int sig; 2567b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, PARSE_PID "i:kill", &pid, &sig)) 2568b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2569b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYOS_OS2) && !defined(PYCC_GCC) 2570b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) { 2571b410d6e4ce58c177569d42b51772f7bb239a24a3darylm APIRET rc; 2572b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR) 2573b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return os2_error(rc); 2574b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2575b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else if (sig == XCPT_SIGNAL_KILLPROC) { 2576b410d6e4ce58c177569d42b51772f7bb239a24a3darylm APIRET rc; 2577b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR) 2578b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return os2_error(rc); 2579b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2580b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else 2581b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; /* Unrecognized Signal Requested */ 2582b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 2583b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (kill(pid, sig) == -1) 2584b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2585b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2586b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 2587b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 2588b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2589b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2590b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2591b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_KILLPG 2592b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_killpg__doc__, 2593b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"killpg(pgid, sig)\n\n\ 2594b410d6e4ce58c177569d42b51772f7bb239a24a3darylmKill a process group with a signal."); 2595b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2596b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2597b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_killpg(PyObject *self, PyObject *args) 2598b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2599b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int sig; 2600b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pgid; 2601b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* XXX some man pages make the `pgid` parameter an int, others 2602b410d6e4ce58c177569d42b51772f7bb239a24a3darylm a pid_t. Since getpgrp() returns a pid_t, we assume killpg should 2603b410d6e4ce58c177569d42b51772f7bb239a24a3darylm take the same type. Moreover, pid_t is always at least as wide as 2604b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int (else compilation of this module fails), which is safe. */ 2605b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, PARSE_PID "i:killpg", &pgid, &sig)) 2606b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2607b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (killpg(pgid, sig) == -1) 2608b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2609b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 2610b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 2611b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2612b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2613b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2614b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_PLOCK 2615b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2616b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYS_LOCK_H 2617b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <sys/lock.h> 2618b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2619b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2620b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_plock__doc__, 2621b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"plock(op)\n\n\ 2622b410d6e4ce58c177569d42b51772f7bb239a24a3darylmLock program segments into memory."); 2623b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2624b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2625b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_plock(PyObject *self, PyObject *args) 2626b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2627b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int op; 2628b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:plock", &op)) 2629b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2630b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (plock(op) == -1) 2631b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2632b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 2633b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 2634b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2635b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 2636b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2637b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2638b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_POPEN 2639b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_popen__doc__, 2640b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"popen(command [, mode='r' [, bufsize]]) -> pipe\n\n\ 2641b410d6e4ce58c177569d42b51772f7bb239a24a3darylmOpen a pipe to/from a command returning a file object."); 2642b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2643b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYOS_OS2) 2644b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYCC_VACPP) 2645b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int 2646b410d6e4ce58c177569d42b51772f7bb239a24a3darylmasync_system(const char *command) 2647b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2648b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char errormsg[256], args[1024]; 2649b410d6e4ce58c177569d42b51772f7bb239a24a3darylm RESULTCODES rcodes; 2650b410d6e4ce58c177569d42b51772f7bb239a24a3darylm APIRET rc; 2651b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2652b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *shell = getenv("COMSPEC"); 2653b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!shell) 2654b410d6e4ce58c177569d42b51772f7bb239a24a3darylm shell = "cmd"; 2655b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2656b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* avoid overflowing the argument buffer */ 2657b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (strlen(shell) + 3 + strlen(command) >= 1024) 2658b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return ERROR_NOT_ENOUGH_MEMORY 2659b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2660b410d6e4ce58c177569d42b51772f7bb239a24a3darylm args[0] = '\0'; 2661b410d6e4ce58c177569d42b51772f7bb239a24a3darylm strcat(args, shell); 2662b410d6e4ce58c177569d42b51772f7bb239a24a3darylm strcat(args, "/c "); 2663b410d6e4ce58c177569d42b51772f7bb239a24a3darylm strcat(args, command); 2664b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2665b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* execute asynchronously, inheriting the environment */ 2666b410d6e4ce58c177569d42b51772f7bb239a24a3darylm rc = DosExecPgm(errormsg, 2667b410d6e4ce58c177569d42b51772f7bb239a24a3darylm sizeof(errormsg), 2668b410d6e4ce58c177569d42b51772f7bb239a24a3darylm EXEC_ASYNC, 2669b410d6e4ce58c177569d42b51772f7bb239a24a3darylm args, 2670b410d6e4ce58c177569d42b51772f7bb239a24a3darylm NULL, 2671b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &rcodes, 2672b410d6e4ce58c177569d42b51772f7bb239a24a3darylm shell); 2673b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return rc; 2674b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2675b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2676b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic FILE * 2677b410d6e4ce58c177569d42b51772f7bb239a24a3darylmpopen(const char *command, const char *mode, int pipesize, int *err) 2678b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2679b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int oldfd, tgtfd; 2680b410d6e4ce58c177569d42b51772f7bb239a24a3darylm HFILE pipeh[2]; 2681b410d6e4ce58c177569d42b51772f7bb239a24a3darylm APIRET rc; 2682b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2683b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* mode determines which of stdin or stdout is reconnected to 2684b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * the pipe to the child 2685b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 2686b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (strchr(mode, 'r') != NULL) { 2687b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tgt_fd = 1; /* stdout */ 2688b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else if (strchr(mode, 'w')) { 2689b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tgt_fd = 0; /* stdin */ 2690b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 2691b410d6e4ce58c177569d42b51772f7bb239a24a3darylm *err = ERROR_INVALID_ACCESS; 2692b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2693b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2694b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2695b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* setup the pipe */ 2696b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((rc = DosCreatePipe(&pipeh[0], &pipeh[1], pipesize)) != NO_ERROR) { 2697b410d6e4ce58c177569d42b51772f7bb239a24a3darylm *err = rc; 2698b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2699b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2700b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2701b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* prevent other threads accessing stdio */ 2702b410d6e4ce58c177569d42b51772f7bb239a24a3darylm DosEnterCritSec(); 2703b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2704b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* reconnect stdio and execute child */ 2705b410d6e4ce58c177569d42b51772f7bb239a24a3darylm oldfd = dup(tgtfd); 2706b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(tgtfd); 2707b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (dup2(pipeh[tgtfd], tgtfd) == 0) { 2708b410d6e4ce58c177569d42b51772f7bb239a24a3darylm DosClose(pipeh[tgtfd]); 2709b410d6e4ce58c177569d42b51772f7bb239a24a3darylm rc = async_system(command); 2710b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2711b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2712b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* restore stdio */ 2713b410d6e4ce58c177569d42b51772f7bb239a24a3darylm dup2(oldfd, tgtfd); 2714b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(oldfd); 2715b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2716b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* allow other threads access to stdio */ 2717b410d6e4ce58c177569d42b51772f7bb239a24a3darylm DosExitCritSec(); 2718b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2719b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* if execution of child was successful return file stream */ 2720b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (rc == NO_ERROR) 2721b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return fdopen(pipeh[1 - tgtfd], mode); 2722b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 2723b410d6e4ce58c177569d42b51772f7bb239a24a3darylm DosClose(pipeh[1 - tgtfd]); 2724b410d6e4ce58c177569d42b51772f7bb239a24a3darylm *err = rc; 2725b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2726b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2727b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2728b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2729b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2730b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_popen(PyObject *self, PyObject *args) 2731b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2732b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *name; 2733b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *mode = "r"; 2734b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int err, bufsize = -1; 2735b410d6e4ce58c177569d42b51772f7bb239a24a3darylm FILE *fp; 2736b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *f; 2737b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize)) 2738b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2739b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 2740b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fp = popen(name, mode, (bufsize > 0) ? bufsize : 4096, &err); 2741b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 2742b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (fp == NULL) 2743b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return os2_error(err); 2744b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2745b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = PyFile_FromFile(fp, name, mode, fclose); 2746b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (f != NULL) 2747b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(f, bufsize); 2748b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return f; 2749b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2750b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2751b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#elif defined(PYCC_GCC) 2752b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2753b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* standard posix version of popen() support */ 2754b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2755b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_popen(PyObject *self, PyObject *args) 2756b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2757b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *name; 2758b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *mode = "r"; 2759b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int bufsize = -1; 2760b410d6e4ce58c177569d42b51772f7bb239a24a3darylm FILE *fp; 2761b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *f; 2762b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize)) 2763b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2764b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 2765b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fp = popen(name, mode); 2766b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 2767b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (fp == NULL) 2768b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2769b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = PyFile_FromFile(fp, name, mode, pclose); 2770b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (f != NULL) 2771b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(f, bufsize); 2772b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return f; 2773b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2774b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2775b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* fork() under OS/2 has lots'o'warts 2776b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * EMX supports pipe() and spawn*() so we can synthesize popen[234]() 2777b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * most of this code is a ripoff of the win32 code, but using the 2778b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * capabilities of EMX's C library routines 2779b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 2780b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2781b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* These tell _PyPopen() whether to return 1, 2, or 3 file objects. */ 2782b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define POPEN_1 1 2783b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define POPEN_2 2 2784b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define POPEN_3 3 2785b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define POPEN_4 4 2786b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2787b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject *_PyPopen(char *, int, int, int); 2788b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int _PyPclose(FILE *file); 2789b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2790b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* 2791b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Internal dictionary mapping popen* file pointers to process handles, 2792b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * for use when retrieving the process exit code. See _PyPclose() below 2793b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * for more information on this dictionary's use. 2794b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 2795b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject *_PyPopenProcs = NULL; 2796b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2797b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* os2emx version of popen2() 2798b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 2799b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * The result of this function is a pipe (file) connected to the 2800b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * process's stdin, and a pipe connected to the process's stdout. 2801b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 2802b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2803b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2804b410d6e4ce58c177569d42b51772f7bb239a24a3darylmos2emx_popen2(PyObject *self, PyObject *args) 2805b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2806b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *f; 2807b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int tm=0; 2808b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2809b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *cmdstring; 2810b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *mode = "t"; 2811b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int bufsize = -1; 2812b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s|si:popen2", &cmdstring, &mode, &bufsize)) 2813b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2814b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2815b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (*mode == 't') 2816b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tm = O_TEXT; 2817b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (*mode != 'b') { 2818b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, "mode must be 't' or 'b'"); 2819b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2820b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else 2821b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tm = O_BINARY; 2822b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2823b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = _PyPopen(cmdstring, tm, POPEN_2, bufsize); 2824b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2825b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return f; 2826b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2827b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2828b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* 2829b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Variation on os2emx.popen2 2830b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 2831b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * The result of this function is 3 pipes - the process's stdin, 2832b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * stdout and stderr 2833b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 2834b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2835b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2836b410d6e4ce58c177569d42b51772f7bb239a24a3darylmos2emx_popen3(PyObject *self, PyObject *args) 2837b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2838b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *f; 2839b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int tm = 0; 2840b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2841b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *cmdstring; 2842b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *mode = "t"; 2843b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int bufsize = -1; 2844b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s|si:popen3", &cmdstring, &mode, &bufsize)) 2845b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2846b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2847b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (*mode == 't') 2848b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tm = O_TEXT; 2849b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (*mode != 'b') { 2850b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, "mode must be 't' or 'b'"); 2851b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2852b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else 2853b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tm = O_BINARY; 2854b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2855b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = _PyPopen(cmdstring, tm, POPEN_3, bufsize); 2856b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2857b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return f; 2858b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2859b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2860b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* 2861b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Variation on os2emx.popen2 2862b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 2863b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * The result of this function is 2 pipes - the processes stdin, 2864b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * and stdout+stderr combined as a single pipe. 2865b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 2866b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2867b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2868b410d6e4ce58c177569d42b51772f7bb239a24a3darylmos2emx_popen4(PyObject *self, PyObject *args) 2869b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2870b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *f; 2871b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int tm = 0; 2872b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2873b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *cmdstring; 2874b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *mode = "t"; 2875b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int bufsize = -1; 2876b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s|si:popen4", &cmdstring, &mode, &bufsize)) 2877b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2878b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2879b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (*mode == 't') 2880b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tm = O_TEXT; 2881b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (*mode != 'b') { 2882b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, "mode must be 't' or 'b'"); 2883b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 2884b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else 2885b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tm = O_BINARY; 2886b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2887b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = _PyPopen(cmdstring, tm, POPEN_4, bufsize); 2888b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2889b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return f; 2890b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 2891b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2892b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* a couple of structures for convenient handling of multiple 2893b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * file handles and pipes 2894b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 2895b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstruct file_ref 2896b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2897b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int handle; 2898b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int flags; 2899b410d6e4ce58c177569d42b51772f7bb239a24a3darylm}; 2900b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2901b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstruct pipe_ref 2902b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2903b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int rd; 2904b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int wr; 2905b410d6e4ce58c177569d42b51772f7bb239a24a3darylm}; 2906b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2907b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* The following code is derived from the win32 code */ 2908b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2909b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 2910b410d6e4ce58c177569d42b51772f7bb239a24a3darylm_PyPopen(char *cmdstring, int mode, int n, int bufsize) 2911b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 2912b410d6e4ce58c177569d42b51772f7bb239a24a3darylm struct file_ref stdio[3]; 2913b410d6e4ce58c177569d42b51772f7bb239a24a3darylm struct pipe_ref p_fd[3]; 2914b410d6e4ce58c177569d42b51772f7bb239a24a3darylm FILE *p_s[3]; 2915b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int file_count, i, pipe_err; 2916b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pipe_pid; 2917b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *shell, *sh_name, *opt, *rd_mode, *wr_mode; 2918b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *f, *p_f[3]; 2919b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2920b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* file modes for subsequent fdopen's on pipe handles */ 2921b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (mode == O_TEXT) 2922b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 2923b410d6e4ce58c177569d42b51772f7bb239a24a3darylm rd_mode = "rt"; 2924b410d6e4ce58c177569d42b51772f7bb239a24a3darylm wr_mode = "wt"; 2925b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2926b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 2927b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 2928b410d6e4ce58c177569d42b51772f7bb239a24a3darylm rd_mode = "rb"; 2929b410d6e4ce58c177569d42b51772f7bb239a24a3darylm wr_mode = "wb"; 2930b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2931b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2932b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* prepare shell references */ 2933b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((shell = getenv("EMXSHELL")) == NULL) 2934b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((shell = getenv("COMSPEC")) == NULL) 2935b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 2936b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = ENOENT; 2937b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2938b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2939b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2940b410d6e4ce58c177569d42b51772f7bb239a24a3darylm sh_name = _getname(shell); 2941b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (stricmp(sh_name, "cmd.exe") == 0 || stricmp(sh_name, "4os2.exe") == 0) 2942b410d6e4ce58c177569d42b51772f7bb239a24a3darylm opt = "/c"; 2943b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 2944b410d6e4ce58c177569d42b51772f7bb239a24a3darylm opt = "-c"; 2945b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2946b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* save current stdio fds + their flags, and set not inheritable */ 2947b410d6e4ce58c177569d42b51772f7bb239a24a3darylm i = pipe_err = 0; 2948b410d6e4ce58c177569d42b51772f7bb239a24a3darylm while (pipe_err >= 0 && i < 3) 2949b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 2950b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pipe_err = stdio[i].handle = dup(i); 2951b410d6e4ce58c177569d42b51772f7bb239a24a3darylm stdio[i].flags = fcntl(i, F_GETFD, 0); 2952b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fcntl(stdio[i].handle, F_SETFD, stdio[i].flags | FD_CLOEXEC); 2953b410d6e4ce58c177569d42b51772f7bb239a24a3darylm i++; 2954b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2955b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pipe_err < 0) 2956b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 2957b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* didn't get them all saved - clean up and bail out */ 2958b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int saved_err = errno; 2959b410d6e4ce58c177569d42b51772f7bb239a24a3darylm while (i-- > 0) 2960b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 2961b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(stdio[i].handle); 2962b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2963b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = saved_err; 2964b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2965b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2966b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2967b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* create pipe ends */ 2968b410d6e4ce58c177569d42b51772f7bb239a24a3darylm file_count = 2; 2969b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (n == POPEN_3) 2970b410d6e4ce58c177569d42b51772f7bb239a24a3darylm file_count = 3; 2971b410d6e4ce58c177569d42b51772f7bb239a24a3darylm i = pipe_err = 0; 2972b410d6e4ce58c177569d42b51772f7bb239a24a3darylm while ((pipe_err == 0) && (i < file_count)) 2973b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pipe_err = pipe((int *)&p_fd[i++]); 2974b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pipe_err < 0) 2975b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 2976b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* didn't get them all made - clean up and bail out */ 2977b410d6e4ce58c177569d42b51772f7bb239a24a3darylm while (i-- > 0) 2978b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 2979b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(p_fd[i].wr); 2980b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(p_fd[i].rd); 2981b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2982b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = EPIPE; 2983b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 2984b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 2985b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2986b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* change the actual standard IO streams over temporarily, 2987b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * making the retained pipe ends non-inheritable 2988b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 2989b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pipe_err = 0; 2990b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 2991b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* - stdin */ 2992b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (dup2(p_fd[0].rd, 0) == 0) 2993b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 2994b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(p_fd[0].rd); 2995b410d6e4ce58c177569d42b51772f7bb239a24a3darylm i = fcntl(p_fd[0].wr, F_GETFD, 0); 2996b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fcntl(p_fd[0].wr, F_SETFD, i | FD_CLOEXEC); 2997b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((p_s[0] = fdopen(p_fd[0].wr, wr_mode)) == NULL) 2998b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 2999b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(p_fd[0].wr); 3000b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pipe_err = -1; 3001b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3002b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3003b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 3004b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3005b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pipe_err = -1; 3006b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3007b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3008b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* - stdout */ 3009b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pipe_err == 0) 3010b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3011b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (dup2(p_fd[1].wr, 1) == 1) 3012b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3013b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(p_fd[1].wr); 3014b410d6e4ce58c177569d42b51772f7bb239a24a3darylm i = fcntl(p_fd[1].rd, F_GETFD, 0); 3015b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fcntl(p_fd[1].rd, F_SETFD, i | FD_CLOEXEC); 3016b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((p_s[1] = fdopen(p_fd[1].rd, rd_mode)) == NULL) 3017b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3018b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(p_fd[1].rd); 3019b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pipe_err = -1; 3020b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3021b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3022b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 3023b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3024b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pipe_err = -1; 3025b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3026b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3027b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3028b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* - stderr, as required */ 3029b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pipe_err == 0) 3030b410d6e4ce58c177569d42b51772f7bb239a24a3darylm switch (n) 3031b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3032b410d6e4ce58c177569d42b51772f7bb239a24a3darylm case POPEN_3: 3033b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3034b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (dup2(p_fd[2].wr, 2) == 2) 3035b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3036b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(p_fd[2].wr); 3037b410d6e4ce58c177569d42b51772f7bb239a24a3darylm i = fcntl(p_fd[2].rd, F_GETFD, 0); 3038b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fcntl(p_fd[2].rd, F_SETFD, i | FD_CLOEXEC); 3039b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((p_s[2] = fdopen(p_fd[2].rd, rd_mode)) == NULL) 3040b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3041b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(p_fd[2].rd); 3042b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pipe_err = -1; 3043b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3044b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3045b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 3046b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3047b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pipe_err = -1; 3048b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3049b410d6e4ce58c177569d42b51772f7bb239a24a3darylm break; 3050b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3051b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3052b410d6e4ce58c177569d42b51772f7bb239a24a3darylm case POPEN_4: 3053b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3054b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (dup2(1, 2) != 2) 3055b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3056b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pipe_err = -1; 3057b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3058b410d6e4ce58c177569d42b51772f7bb239a24a3darylm break; 3059b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3060b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3061b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3062b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* spawn the child process */ 3063b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pipe_err == 0) 3064b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3065b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pipe_pid = spawnlp(P_NOWAIT, shell, shell, opt, cmdstring, (char *)0); 3066b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pipe_pid == -1) 3067b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3068b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pipe_err = -1; 3069b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3070b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 3071b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3072b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* save the PID into the FILE structure 3073b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * NOTE: this implementation doesn't actually 3074b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * take advantage of this, but do it for 3075b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * completeness - AIM Apr01 3076b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3077b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (i = 0; i < file_count; i++) 3078b410d6e4ce58c177569d42b51772f7bb239a24a3darylm p_s[i]->_pid = pipe_pid; 3079b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3080b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3081b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3082b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* reset standard IO to normal */ 3083b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (i = 0; i < 3; i++) 3084b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3085b410d6e4ce58c177569d42b51772f7bb239a24a3darylm dup2(stdio[i].handle, i); 3086b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fcntl(i, F_SETFD, stdio[i].flags); 3087b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(stdio[i].handle); 3088b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3089b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3090b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* if any remnant problems, clean up and bail out */ 3091b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pipe_err < 0) 3092b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3093b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (i = 0; i < 3; i++) 3094b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3095b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(p_fd[i].rd); 3096b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(p_fd[i].wr); 3097b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3098b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = EPIPE; 3099b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_filename(cmdstring); 3100b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3101b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3102b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* build tuple of file objects to return */ 3103b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((p_f[0] = PyFile_FromFile(p_s[0], cmdstring, wr_mode, _PyPclose)) != NULL) 3104b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(p_f[0], bufsize); 3105b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((p_f[1] = PyFile_FromFile(p_s[1], cmdstring, rd_mode, _PyPclose)) != NULL) 3106b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(p_f[1], bufsize); 3107b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (n == POPEN_3) 3108b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3109b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((p_f[2] = PyFile_FromFile(p_s[2], cmdstring, rd_mode, _PyPclose)) != NULL) 3110b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(p_f[0], bufsize); 3111b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = PyTuple_Pack(3, p_f[0], p_f[1], p_f[2]); 3112b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3113b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 3114b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = PyTuple_Pack(2, p_f[0], p_f[1]); 3115b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3116b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* 3117b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Insert the files we've created into the process dictionary 3118b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * all referencing the list with the process handle and the 3119b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * initial number of files (see description below in _PyPclose). 3120b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Since if _PyPclose later tried to wait on a process when all 3121b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * handles weren't closed, it could create a deadlock with the 3122b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * child, we spend some energy here to try to ensure that we 3123b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * either insert all file handles into the dictionary or none 3124b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * at all. It's a little clumsy with the various popen modes 3125b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * and variable number of files involved. 3126b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3127b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!_PyPopenProcs) 3128b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3129b410d6e4ce58c177569d42b51772f7bb239a24a3darylm _PyPopenProcs = PyDict_New(); 3130b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3131b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3132b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (_PyPopenProcs) 3133b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3134b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *procObj, *pidObj, *intObj, *fileObj[3]; 3135b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int ins_rc[3]; 3136b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3137b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[0] = fileObj[1] = fileObj[2] = NULL; 3138b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ins_rc[0] = ins_rc[1] = ins_rc[2] = 0; 3139b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3140b410d6e4ce58c177569d42b51772f7bb239a24a3darylm procObj = PyList_New(2); 3141b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pidObj = PyLong_FromPid(pipe_pid); 3142b410d6e4ce58c177569d42b51772f7bb239a24a3darylm intObj = PyInt_FromLong((long) file_count); 3143b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3144b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (procObj && pidObj && intObj) 3145b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3146b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyList_SetItem(procObj, 0, pidObj); 3147b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyList_SetItem(procObj, 1, intObj); 3148b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3149b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[0] = PyLong_FromVoidPtr(p_s[0]); 3150b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (fileObj[0]) 3151b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3152b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ins_rc[0] = PyDict_SetItem(_PyPopenProcs, 3153b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[0], 3154b410d6e4ce58c177569d42b51772f7bb239a24a3darylm procObj); 3155b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3156b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[1] = PyLong_FromVoidPtr(p_s[1]); 3157b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (fileObj[1]) 3158b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3159b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ins_rc[1] = PyDict_SetItem(_PyPopenProcs, 3160b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[1], 3161b410d6e4ce58c177569d42b51772f7bb239a24a3darylm procObj); 3162b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3163b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (file_count >= 3) 3164b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3165b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[2] = PyLong_FromVoidPtr(p_s[2]); 3166b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (fileObj[2]) 3167b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3168b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ins_rc[2] = PyDict_SetItem(_PyPopenProcs, 3169b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[2], 3170b410d6e4ce58c177569d42b51772f7bb239a24a3darylm procObj); 3171b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3172b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3173b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3174b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins_rc[0] < 0 || !fileObj[0] || 3175b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ins_rc[1] < 0 || (file_count > 1 && !fileObj[1]) || 3176b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ins_rc[2] < 0 || (file_count > 2 && !fileObj[2])) 3177b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3178b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Something failed - remove any dictionary 3179b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * entries that did make it. 3180b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3181b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!ins_rc[0] && fileObj[0]) 3182b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3183b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyDict_DelItem(_PyPopenProcs, 3184b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[0]); 3185b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3186b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!ins_rc[1] && fileObj[1]) 3187b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3188b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyDict_DelItem(_PyPopenProcs, 3189b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[1]); 3190b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3191b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!ins_rc[2] && fileObj[2]) 3192b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3193b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyDict_DelItem(_PyPopenProcs, 3194b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[2]); 3195b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3196b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3197b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3198b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3199b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* 3200b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Clean up our localized references for the dictionary keys 3201b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * and value since PyDict_SetItem will Py_INCREF any copies 3202b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * that got placed in the dictionary. 3203b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3204b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(procObj); 3205b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(fileObj[0]); 3206b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(fileObj[1]); 3207b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(fileObj[2]); 3208b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3209b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3210b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Child is launched. */ 3211b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return f; 3212b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 3213b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3214b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* 3215b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Wrapper for fclose() to use for popen* files, so we can retrieve the 3216b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * exit code for the child process and return as a result of the close. 3217b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 3218b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * This function uses the _PyPopenProcs dictionary in order to map the 3219b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * input file pointer to information about the process that was 3220b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * originally created by the popen* call that created the file pointer. 3221b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * The dictionary uses the file pointer as a key (with one entry 3222b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * inserted for each file returned by the original popen* call) and a 3223b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * single list object as the value for all files from a single call. 3224b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * The list object contains the Win32 process handle at [0], and a file 3225b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * count at [1], which is initialized to the total number of file 3226b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * handles using that list. 3227b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 3228b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * This function closes whichever handle it is passed, and decrements 3229b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * the file count in the dictionary for the process handle pointed to 3230b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * by this file. On the last close (when the file count reaches zero), 3231b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * this function will wait for the child process and then return its 3232b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * exit code as the result of the close() operation. This permits the 3233b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * files to be closed in any order - it is always the close() of the 3234b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * final handle that will return the exit code. 3235b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 3236b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * NOTE: This function is currently called with the GIL released. 3237b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * hence we use the GILState API to manage our state. 3238b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3239b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3240b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int _PyPclose(FILE *file) 3241b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 3242b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int result; 3243b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int exit_code; 3244b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pipe_pid; 3245b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *procObj, *pidObj, *intObj, *fileObj; 3246b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int file_count; 3247b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WITH_THREAD 3248b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyGILState_STATE state; 3249b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 3250b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3251b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Close the file handle first, to ensure it can't block the 3252b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * child from exiting if it's the last handle. 3253b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3254b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = fclose(file); 3255b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3256b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WITH_THREAD 3257b410d6e4ce58c177569d42b51772f7bb239a24a3darylm state = PyGILState_Ensure(); 3258b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 3259b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (_PyPopenProcs) 3260b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3261b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((fileObj = PyLong_FromVoidPtr(file)) != NULL && 3262b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (procObj = PyDict_GetItem(_PyPopenProcs, 3263b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj)) != NULL && 3264b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (pidObj = PyList_GetItem(procObj,0)) != NULL && 3265b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (intObj = PyList_GetItem(procObj,1)) != NULL) 3266b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3267b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pipe_pid = (pid_t) PyLong_AsPid(pidObj); 3268b410d6e4ce58c177569d42b51772f7bb239a24a3darylm file_count = (int) PyInt_AsLong(intObj); 3269b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3270b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (file_count > 1) 3271b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3272b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Still other files referencing process */ 3273b410d6e4ce58c177569d42b51772f7bb239a24a3darylm file_count--; 3274b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyList_SetItem(procObj,1, 3275b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyInt_FromLong((long) file_count)); 3276b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3277b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 3278b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3279b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Last file for this process */ 3280b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (result != EOF && 3281b410d6e4ce58c177569d42b51772f7bb239a24a3darylm waitpid(pipe_pid, &exit_code, 0) == pipe_pid) 3282b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3283b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* extract exit status */ 3284b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (WIFEXITED(exit_code)) 3285b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3286b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = WEXITSTATUS(exit_code); 3287b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3288b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 3289b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3290b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = EPIPE; 3291b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = -1; 3292b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3293b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3294b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 3295b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3296b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Indicate failure - this will cause the file object 3297b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * to raise an I/O error and translate the last 3298b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * error code from errno. We do have a problem with 3299b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * last errors that overlap the normal errno table, 3300b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * but that's a consistent problem with the file object. 3301b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3302b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = -1; 3303b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3304b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3305b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3306b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Remove this file pointer from dictionary */ 3307b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyDict_DelItem(_PyPopenProcs, fileObj); 3308b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3309b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyDict_Size(_PyPopenProcs) == 0) 3310b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3311b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(_PyPopenProcs); 3312b410d6e4ce58c177569d42b51772f7bb239a24a3darylm _PyPopenProcs = NULL; 3313b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3314b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3315b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } /* if object retrieval ok */ 3316b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3317b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(fileObj); 3318b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } /* if _PyPopenProcs */ 3319b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3320b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WITH_THREAD 3321b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyGILState_Release(state); 3322b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 3323b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return result; 3324b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 3325b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3326b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* PYCC_??? */ 3327b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3328b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#elif defined(MS_WINDOWS) 3329b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3330b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* 3331b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Portable 'popen' replacement for Win32. 3332b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 3333b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Written by Bill Tutt <billtut@microsoft.com>. Minor tweaks 3334b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * and 2.0 integration by Fredrik Lundh <fredrik@pythonware.com> 3335b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Return code handling by David Bolen <db3l@fitlinxx.com>. 3336b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3337b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3338b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <malloc.h> 3339b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <io.h> 3340b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <fcntl.h> 3341b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3342b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* These tell _PyPopen() wether to return 1, 2, or 3 file objects. */ 3343b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define POPEN_1 1 3344b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define POPEN_2 2 3345b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define POPEN_3 3 3346b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define POPEN_4 4 3347b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3348b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject *_PyPopen(char *, int, int); 3349b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int _PyPclose(FILE *file); 3350b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3351b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* 3352b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Internal dictionary mapping popen* file pointers to process handles, 3353b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * for use when retrieving the process exit code. See _PyPclose() below 3354b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * for more information on this dictionary's use. 3355b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3356b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject *_PyPopenProcs = NULL; 3357b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3358b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3359b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* popen that works from a GUI. 3360b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 3361b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * The result of this function is a pipe (file) connected to the 3362b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * processes stdin or stdout, depending on the requested mode. 3363b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3364b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3365b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 3366b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_popen(PyObject *self, PyObject *args) 3367b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 3368b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *f; 3369b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int tm = 0; 3370b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3371b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *cmdstring; 3372b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *mode = "r"; 3373b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int bufsize = -1; 3374b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s|si:popen", &cmdstring, &mode, &bufsize)) 3375b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 3376b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3377b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (*mode == 'r') 3378b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tm = _O_RDONLY; 3379b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (*mode != 'w') { 3380b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, "popen() arg 2 must be 'r' or 'w'"); 3381b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 3382b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else 3383b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tm = _O_WRONLY; 3384b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3385b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (bufsize != -1) { 3386b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, "popen() arg 3 must be -1"); 3387b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 3388b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3389b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3390b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (*(mode+1) == 't') 3391b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = _PyPopen(cmdstring, tm | _O_TEXT, POPEN_1); 3392b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (*(mode+1) == 'b') 3393b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = _PyPopen(cmdstring, tm | _O_BINARY, POPEN_1); 3394b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 3395b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = _PyPopen(cmdstring, tm | _O_TEXT, POPEN_1); 3396b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3397b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return f; 3398b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 3399b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3400b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* Variation on win32pipe.popen 3401b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 3402b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * The result of this function is a pipe (file) connected to the 3403b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * process's stdin, and a pipe connected to the process's stdout. 3404b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3405b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3406b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 3407b410d6e4ce58c177569d42b51772f7bb239a24a3darylmwin32_popen2(PyObject *self, PyObject *args) 3408b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 3409b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *f; 3410b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int tm=0; 3411b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3412b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *cmdstring; 3413b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *mode = "t"; 3414b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int bufsize = -1; 3415b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s|si:popen2", &cmdstring, &mode, &bufsize)) 3416b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 3417b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3418b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (*mode == 't') 3419b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tm = _O_TEXT; 3420b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (*mode != 'b') { 3421b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, "popen2() arg 2 must be 't' or 'b'"); 3422b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 3423b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else 3424b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tm = _O_BINARY; 3425b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3426b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (bufsize != -1) { 3427b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, "popen2() arg 3 must be -1"); 3428b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 3429b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3430b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3431b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = _PyPopen(cmdstring, tm, POPEN_2); 3432b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3433b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return f; 3434b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 3435b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3436b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* 3437b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Variation on <om win32pipe.popen> 3438b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 3439b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * The result of this function is 3 pipes - the process's stdin, 3440b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * stdout and stderr 3441b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3442b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3443b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 3444b410d6e4ce58c177569d42b51772f7bb239a24a3darylmwin32_popen3(PyObject *self, PyObject *args) 3445b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 3446b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *f; 3447b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int tm = 0; 3448b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3449b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *cmdstring; 3450b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *mode = "t"; 3451b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int bufsize = -1; 3452b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s|si:popen3", &cmdstring, &mode, &bufsize)) 3453b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 3454b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3455b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (*mode == 't') 3456b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tm = _O_TEXT; 3457b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (*mode != 'b') { 3458b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, "popen3() arg 2 must be 't' or 'b'"); 3459b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 3460b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else 3461b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tm = _O_BINARY; 3462b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3463b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (bufsize != -1) { 3464b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, "popen3() arg 3 must be -1"); 3465b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 3466b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3467b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3468b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = _PyPopen(cmdstring, tm, POPEN_3); 3469b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3470b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return f; 3471b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 3472b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3473b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* 3474b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Variation on win32pipe.popen 3475b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 3476b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * The result of this function is 2 pipes - the processes stdin, 3477b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * and stdout+stderr combined as a single pipe. 3478b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3479b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3480b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 3481b410d6e4ce58c177569d42b51772f7bb239a24a3darylmwin32_popen4(PyObject *self, PyObject *args) 3482b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 3483b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *f; 3484b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int tm = 0; 3485b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3486b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *cmdstring; 3487b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *mode = "t"; 3488b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int bufsize = -1; 3489b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s|si:popen4", &cmdstring, &mode, &bufsize)) 3490b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 3491b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3492b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (*mode == 't') 3493b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tm = _O_TEXT; 3494b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (*mode != 'b') { 3495b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, "popen4() arg 2 must be 't' or 'b'"); 3496b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 3497b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else 3498b410d6e4ce58c177569d42b51772f7bb239a24a3darylm tm = _O_BINARY; 3499b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3500b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (bufsize != -1) { 3501b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, "popen4() arg 3 must be -1"); 3502b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 3503b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3504b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3505b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = _PyPopen(cmdstring, tm, POPEN_4); 3506b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3507b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return f; 3508b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 3509b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3510b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic BOOL 3511b410d6e4ce58c177569d42b51772f7bb239a24a3darylm_PyPopenCreateProcess(char *cmdstring, 3512b410d6e4ce58c177569d42b51772f7bb239a24a3darylm HANDLE hStdin, 3513b410d6e4ce58c177569d42b51772f7bb239a24a3darylm HANDLE hStdout, 3514b410d6e4ce58c177569d42b51772f7bb239a24a3darylm HANDLE hStderr, 3515b410d6e4ce58c177569d42b51772f7bb239a24a3darylm HANDLE *hProcess) 3516b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 3517b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PROCESS_INFORMATION piProcInfo; 3518b410d6e4ce58c177569d42b51772f7bb239a24a3darylm STARTUPINFO siStartInfo; 3519b410d6e4ce58c177569d42b51772f7bb239a24a3darylm DWORD dwProcessFlags = 0; /* no NEW_CONSOLE by default for Ctrl+C handling */ 3520b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *s1,*s2, *s3 = " /c "; 3521b410d6e4ce58c177569d42b51772f7bb239a24a3darylm const char *szConsoleSpawn = "w9xpopen.exe"; 3522b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int i; 3523b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_ssize_t x; 3524b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3525b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (i = GetEnvironmentVariable("COMSPEC",NULL,0)) { 3526b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *comshell; 3527b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3528b410d6e4ce58c177569d42b51772f7bb239a24a3darylm s1 = (char *)alloca(i); 3529b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!(x = GetEnvironmentVariable("COMSPEC", s1, i))) 3530b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* x < i, so x fits into an integer */ 3531b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return (int)x; 3532b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3533b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Explicitly check if we are using COMMAND.COM. If we are 3534b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * then use the w9xpopen hack. 3535b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3536b410d6e4ce58c177569d42b51772f7bb239a24a3darylm comshell = s1 + x; 3537b410d6e4ce58c177569d42b51772f7bb239a24a3darylm while (comshell >= s1 && *comshell != '\\') 3538b410d6e4ce58c177569d42b51772f7bb239a24a3darylm --comshell; 3539b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ++comshell; 3540b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3541b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (GetVersion() < 0x80000000 && 3542b410d6e4ce58c177569d42b51772f7bb239a24a3darylm _stricmp(comshell, "command.com") != 0) { 3543b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* NT/2000 and not using command.com. */ 3544b410d6e4ce58c177569d42b51772f7bb239a24a3darylm x = i + strlen(s3) + strlen(cmdstring) + 1; 3545b410d6e4ce58c177569d42b51772f7bb239a24a3darylm s2 = (char *)alloca(x); 3546b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ZeroMemory(s2, x); 3547b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyOS_snprintf(s2, x, "%s%s%s", s1, s3, cmdstring); 3548b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3549b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 3550b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* 3551b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Oh gag, we're on Win9x or using COMMAND.COM. Use 3552b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * the workaround listed in KB: Q150956 3553b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3554b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char modulepath[_MAX_PATH]; 3555b410d6e4ce58c177569d42b51772f7bb239a24a3darylm struct stat statinfo; 3556b410d6e4ce58c177569d42b51772f7bb239a24a3darylm GetModuleFileName(NULL, modulepath, sizeof(modulepath)); 3557b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (x = i = 0; modulepath[i]; i++) 3558b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (modulepath[i] == SEP) 3559b410d6e4ce58c177569d42b51772f7bb239a24a3darylm x = i+1; 3560b410d6e4ce58c177569d42b51772f7bb239a24a3darylm modulepath[x] = '\0'; 3561b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Create the full-name to w9xpopen, so we can test it exists */ 3562b410d6e4ce58c177569d42b51772f7bb239a24a3darylm strncat(modulepath, 3563b410d6e4ce58c177569d42b51772f7bb239a24a3darylm szConsoleSpawn, 3564b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (sizeof(modulepath)/sizeof(modulepath[0])) 3565b410d6e4ce58c177569d42b51772f7bb239a24a3darylm -strlen(modulepath)); 3566b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (stat(modulepath, &statinfo) != 0) { 3567b410d6e4ce58c177569d42b51772f7bb239a24a3darylm size_t mplen = sizeof(modulepath)/sizeof(modulepath[0]); 3568b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Eeek - file-not-found - possibly an embedding 3569b410d6e4ce58c177569d42b51772f7bb239a24a3darylm situation - see if we can locate it in sys.prefix 3570b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3571b410d6e4ce58c177569d42b51772f7bb239a24a3darylm strncpy(modulepath, 3572b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_GetExecPrefix(), 3573b410d6e4ce58c177569d42b51772f7bb239a24a3darylm mplen); 3574b410d6e4ce58c177569d42b51772f7bb239a24a3darylm modulepath[mplen-1] = '\0'; 3575b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (modulepath[strlen(modulepath)-1] != '\\') 3576b410d6e4ce58c177569d42b51772f7bb239a24a3darylm strcat(modulepath, "\\"); 3577b410d6e4ce58c177569d42b51772f7bb239a24a3darylm strncat(modulepath, 3578b410d6e4ce58c177569d42b51772f7bb239a24a3darylm szConsoleSpawn, 3579b410d6e4ce58c177569d42b51772f7bb239a24a3darylm mplen-strlen(modulepath)); 3580b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* No where else to look - raise an easily identifiable 3581b410d6e4ce58c177569d42b51772f7bb239a24a3darylm error, rather than leaving Windows to report 3582b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "file not found" - as the user is probably blissfully 3583b410d6e4ce58c177569d42b51772f7bb239a24a3darylm unaware this shim EXE is used, and it will confuse them. 3584b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (well, it confused me for a while ;-) 3585b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3586b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (stat(modulepath, &statinfo) != 0) { 3587b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_Format(PyExc_RuntimeError, 3588b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "Can not locate '%s' which is needed " 3589b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "for popen to work with your shell " 3590b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "or platform.", 3591b410d6e4ce58c177569d42b51772f7bb239a24a3darylm szConsoleSpawn); 3592b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return FALSE; 3593b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3594b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3595b410d6e4ce58c177569d42b51772f7bb239a24a3darylm x = i + strlen(s3) + strlen(cmdstring) + 1 + 3596b410d6e4ce58c177569d42b51772f7bb239a24a3darylm strlen(modulepath) + 3597b410d6e4ce58c177569d42b51772f7bb239a24a3darylm strlen(szConsoleSpawn) + 1; 3598b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3599b410d6e4ce58c177569d42b51772f7bb239a24a3darylm s2 = (char *)alloca(x); 3600b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ZeroMemory(s2, x); 3601b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* To maintain correct argument passing semantics, 3602b410d6e4ce58c177569d42b51772f7bb239a24a3darylm we pass the command-line as it stands, and allow 3603b410d6e4ce58c177569d42b51772f7bb239a24a3darylm quoting to be applied. w9xpopen.exe will then 3604b410d6e4ce58c177569d42b51772f7bb239a24a3darylm use its argv vector, and re-quote the necessary 3605b410d6e4ce58c177569d42b51772f7bb239a24a3darylm args for the ultimate child process. 3606b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3607b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyOS_snprintf( 3608b410d6e4ce58c177569d42b51772f7bb239a24a3darylm s2, x, 3609b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "\"%s\" %s%s%s", 3610b410d6e4ce58c177569d42b51772f7bb239a24a3darylm modulepath, 3611b410d6e4ce58c177569d42b51772f7bb239a24a3darylm s1, 3612b410d6e4ce58c177569d42b51772f7bb239a24a3darylm s3, 3613b410d6e4ce58c177569d42b51772f7bb239a24a3darylm cmdstring); 3614b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Not passing CREATE_NEW_CONSOLE has been known to 3615b410d6e4ce58c177569d42b51772f7bb239a24a3darylm cause random failures on win9x. Specifically a 3616b410d6e4ce58c177569d42b51772f7bb239a24a3darylm dialog: 3617b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "Your program accessed mem currently in use at xxx" 3618b410d6e4ce58c177569d42b51772f7bb239a24a3darylm and a hopeful warning about the stability of your 3619b410d6e4ce58c177569d42b51772f7bb239a24a3darylm system. 3620b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Cost is Ctrl+C won't kill children, but anyone 3621b410d6e4ce58c177569d42b51772f7bb239a24a3darylm who cares can have a go! 3622b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3623b410d6e4ce58c177569d42b51772f7bb239a24a3darylm dwProcessFlags |= CREATE_NEW_CONSOLE; 3624b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3625b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3626b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3627b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Could be an else here to try cmd.exe / command.com in the path 3628b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Now we'll just error out.. */ 3629b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 3630b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_RuntimeError, 3631b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "Cannot locate a COMSPEC environment variable to " 3632b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "use as the shell"); 3633b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return FALSE; 3634b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3635b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3636b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ZeroMemory(&siStartInfo, sizeof(STARTUPINFO)); 3637b410d6e4ce58c177569d42b51772f7bb239a24a3darylm siStartInfo.cb = sizeof(STARTUPINFO); 3638b410d6e4ce58c177569d42b51772f7bb239a24a3darylm siStartInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; 3639b410d6e4ce58c177569d42b51772f7bb239a24a3darylm siStartInfo.hStdInput = hStdin; 3640b410d6e4ce58c177569d42b51772f7bb239a24a3darylm siStartInfo.hStdOutput = hStdout; 3641b410d6e4ce58c177569d42b51772f7bb239a24a3darylm siStartInfo.hStdError = hStderr; 3642b410d6e4ce58c177569d42b51772f7bb239a24a3darylm siStartInfo.wShowWindow = SW_HIDE; 3643b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3644b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (CreateProcess(NULL, 3645b410d6e4ce58c177569d42b51772f7bb239a24a3darylm s2, 3646b410d6e4ce58c177569d42b51772f7bb239a24a3darylm NULL, 3647b410d6e4ce58c177569d42b51772f7bb239a24a3darylm NULL, 3648b410d6e4ce58c177569d42b51772f7bb239a24a3darylm TRUE, 3649b410d6e4ce58c177569d42b51772f7bb239a24a3darylm dwProcessFlags, 3650b410d6e4ce58c177569d42b51772f7bb239a24a3darylm NULL, 3651b410d6e4ce58c177569d42b51772f7bb239a24a3darylm NULL, 3652b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &siStartInfo, 3653b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &piProcInfo) ) { 3654b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Close the handles now so anyone waiting is woken. */ 3655b410d6e4ce58c177569d42b51772f7bb239a24a3darylm CloseHandle(piProcInfo.hThread); 3656b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3657b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Return process handle */ 3658b410d6e4ce58c177569d42b51772f7bb239a24a3darylm *hProcess = piProcInfo.hProcess; 3659b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return TRUE; 3660b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3661b410d6e4ce58c177569d42b51772f7bb239a24a3darylm win32_error("CreateProcess", s2); 3662b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return FALSE; 3663b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 3664b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3665b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* The following code is based off of KB: Q190351 */ 3666b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3667b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 3668b410d6e4ce58c177569d42b51772f7bb239a24a3darylm_PyPopen(char *cmdstring, int mode, int n) 3669b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 3670b410d6e4ce58c177569d42b51772f7bb239a24a3darylm HANDLE hChildStdinRd, hChildStdinWr, hChildStdoutRd, hChildStdoutWr, 3671b410d6e4ce58c177569d42b51772f7bb239a24a3darylm hChildStderrRd, hChildStderrWr, hChildStdinWrDup, hChildStdoutRdDup, 3672b410d6e4ce58c177569d42b51772f7bb239a24a3darylm hChildStderrRdDup, hProcess; /* hChildStdoutWrDup; */ 3673b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3674b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SECURITY_ATTRIBUTES saAttr; 3675b410d6e4ce58c177569d42b51772f7bb239a24a3darylm BOOL fSuccess; 3676b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd1, fd2, fd3; 3677b410d6e4ce58c177569d42b51772f7bb239a24a3darylm FILE *f1, *f2, *f3; 3678b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long file_count; 3679b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *f; 3680b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3681b410d6e4ce58c177569d42b51772f7bb239a24a3darylm saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 3682b410d6e4ce58c177569d42b51772f7bb239a24a3darylm saAttr.bInheritHandle = TRUE; 3683b410d6e4ce58c177569d42b51772f7bb239a24a3darylm saAttr.lpSecurityDescriptor = NULL; 3684b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3685b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0)) 3686b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return win32_error("CreatePipe", NULL); 3687b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3688b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Create new output read handle and the input write handle. Set 3689b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * the inheritance properties to FALSE. Otherwise, the child inherits 3690b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * these handles; resulting in non-closeable handles to the pipes 3691b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * being created. */ 3692b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdinWr, 3693b410d6e4ce58c177569d42b51772f7bb239a24a3darylm GetCurrentProcess(), &hChildStdinWrDup, 0, 3694b410d6e4ce58c177569d42b51772f7bb239a24a3darylm FALSE, 3695b410d6e4ce58c177569d42b51772f7bb239a24a3darylm DUPLICATE_SAME_ACCESS); 3696b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!fSuccess) 3697b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return win32_error("DuplicateHandle", NULL); 3698b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3699b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Close the inheritable version of ChildStdin 3700b410d6e4ce58c177569d42b51772f7bb239a24a3darylm that we're using. */ 3701b410d6e4ce58c177569d42b51772f7bb239a24a3darylm CloseHandle(hChildStdinWr); 3702b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3703b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) 3704b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return win32_error("CreatePipe", NULL); 3705b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3706b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdoutRd, 3707b410d6e4ce58c177569d42b51772f7bb239a24a3darylm GetCurrentProcess(), &hChildStdoutRdDup, 0, 3708b410d6e4ce58c177569d42b51772f7bb239a24a3darylm FALSE, DUPLICATE_SAME_ACCESS); 3709b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!fSuccess) 3710b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return win32_error("DuplicateHandle", NULL); 3711b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3712b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Close the inheritable version of ChildStdout 3713b410d6e4ce58c177569d42b51772f7bb239a24a3darylm that we're using. */ 3714b410d6e4ce58c177569d42b51772f7bb239a24a3darylm CloseHandle(hChildStdoutRd); 3715b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3716b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (n != POPEN_4) { 3717b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!CreatePipe(&hChildStderrRd, &hChildStderrWr, &saAttr, 0)) 3718b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return win32_error("CreatePipe", NULL); 3719b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fSuccess = DuplicateHandle(GetCurrentProcess(), 3720b410d6e4ce58c177569d42b51772f7bb239a24a3darylm hChildStderrRd, 3721b410d6e4ce58c177569d42b51772f7bb239a24a3darylm GetCurrentProcess(), 3722b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &hChildStderrRdDup, 0, 3723b410d6e4ce58c177569d42b51772f7bb239a24a3darylm FALSE, DUPLICATE_SAME_ACCESS); 3724b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!fSuccess) 3725b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return win32_error("DuplicateHandle", NULL); 3726b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Close the inheritable version of ChildStdErr that we're using. */ 3727b410d6e4ce58c177569d42b51772f7bb239a24a3darylm CloseHandle(hChildStderrRd); 3728b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3729b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3730b410d6e4ce58c177569d42b51772f7bb239a24a3darylm switch (n) { 3731b410d6e4ce58c177569d42b51772f7bb239a24a3darylm case POPEN_1: 3732b410d6e4ce58c177569d42b51772f7bb239a24a3darylm switch (mode & (_O_RDONLY | _O_TEXT | _O_BINARY | _O_WRONLY)) { 3733b410d6e4ce58c177569d42b51772f7bb239a24a3darylm case _O_WRONLY | _O_TEXT: 3734b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Case for writing to child Stdin in text mode. */ 3735b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fd1 = _open_osfhandle((Py_intptr_t)hChildStdinWrDup, mode); 3736b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f1 = _fdopen(fd1, "w"); 3737b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = PyFile_FromFile(f1, cmdstring, "w", _PyPclose); 3738b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(f, 0); 3739b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* We don't care about these pipes anymore, so close them. */ 3740b410d6e4ce58c177569d42b51772f7bb239a24a3darylm CloseHandle(hChildStdoutRdDup); 3741b410d6e4ce58c177569d42b51772f7bb239a24a3darylm CloseHandle(hChildStderrRdDup); 3742b410d6e4ce58c177569d42b51772f7bb239a24a3darylm break; 3743b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3744b410d6e4ce58c177569d42b51772f7bb239a24a3darylm case _O_RDONLY | _O_TEXT: 3745b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Case for reading from child Stdout in text mode. */ 3746b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fd1 = _open_osfhandle((Py_intptr_t)hChildStdoutRdDup, mode); 3747b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f1 = _fdopen(fd1, "r"); 3748b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = PyFile_FromFile(f1, cmdstring, "r", _PyPclose); 3749b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(f, 0); 3750b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* We don't care about these pipes anymore, so close them. */ 3751b410d6e4ce58c177569d42b51772f7bb239a24a3darylm CloseHandle(hChildStdinWrDup); 3752b410d6e4ce58c177569d42b51772f7bb239a24a3darylm CloseHandle(hChildStderrRdDup); 3753b410d6e4ce58c177569d42b51772f7bb239a24a3darylm break; 3754b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3755b410d6e4ce58c177569d42b51772f7bb239a24a3darylm case _O_RDONLY | _O_BINARY: 3756b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Case for readinig from child Stdout in binary mode. */ 3757b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fd1 = _open_osfhandle((Py_intptr_t)hChildStdoutRdDup, mode); 3758b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f1 = _fdopen(fd1, "rb"); 3759b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = PyFile_FromFile(f1, cmdstring, "rb", _PyPclose); 3760b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(f, 0); 3761b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* We don't care about these pipes anymore, so close them. */ 3762b410d6e4ce58c177569d42b51772f7bb239a24a3darylm CloseHandle(hChildStdinWrDup); 3763b410d6e4ce58c177569d42b51772f7bb239a24a3darylm CloseHandle(hChildStderrRdDup); 3764b410d6e4ce58c177569d42b51772f7bb239a24a3darylm break; 3765b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3766b410d6e4ce58c177569d42b51772f7bb239a24a3darylm case _O_WRONLY | _O_BINARY: 3767b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Case for writing to child Stdin in binary mode. */ 3768b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fd1 = _open_osfhandle((Py_intptr_t)hChildStdinWrDup, mode); 3769b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f1 = _fdopen(fd1, "wb"); 3770b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = PyFile_FromFile(f1, cmdstring, "wb", _PyPclose); 3771b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(f, 0); 3772b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* We don't care about these pipes anymore, so close them. */ 3773b410d6e4ce58c177569d42b51772f7bb239a24a3darylm CloseHandle(hChildStdoutRdDup); 3774b410d6e4ce58c177569d42b51772f7bb239a24a3darylm CloseHandle(hChildStderrRdDup); 3775b410d6e4ce58c177569d42b51772f7bb239a24a3darylm break; 3776b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3777b410d6e4ce58c177569d42b51772f7bb239a24a3darylm file_count = 1; 3778b410d6e4ce58c177569d42b51772f7bb239a24a3darylm break; 3779b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3780b410d6e4ce58c177569d42b51772f7bb239a24a3darylm case POPEN_2: 3781b410d6e4ce58c177569d42b51772f7bb239a24a3darylm case POPEN_4: 3782b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3783b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *m1, *m2; 3784b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *p1, *p2; 3785b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3786b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (mode & _O_TEXT) { 3787b410d6e4ce58c177569d42b51772f7bb239a24a3darylm m1 = "r"; 3788b410d6e4ce58c177569d42b51772f7bb239a24a3darylm m2 = "w"; 3789b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 3790b410d6e4ce58c177569d42b51772f7bb239a24a3darylm m1 = "rb"; 3791b410d6e4ce58c177569d42b51772f7bb239a24a3darylm m2 = "wb"; 3792b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3793b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3794b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fd1 = _open_osfhandle((Py_intptr_t)hChildStdinWrDup, mode); 3795b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f1 = _fdopen(fd1, m2); 3796b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fd2 = _open_osfhandle((Py_intptr_t)hChildStdoutRdDup, mode); 3797b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f2 = _fdopen(fd2, m1); 3798b410d6e4ce58c177569d42b51772f7bb239a24a3darylm p1 = PyFile_FromFile(f1, cmdstring, m2, _PyPclose); 3799b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(p1, 0); 3800b410d6e4ce58c177569d42b51772f7bb239a24a3darylm p2 = PyFile_FromFile(f2, cmdstring, m1, _PyPclose); 3801b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(p2, 0); 3802b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3803b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (n != 4) 3804b410d6e4ce58c177569d42b51772f7bb239a24a3darylm CloseHandle(hChildStderrRdDup); 3805b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3806b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = PyTuple_Pack(2,p1,p2); 3807b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(p1); 3808b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(p2); 3809b410d6e4ce58c177569d42b51772f7bb239a24a3darylm file_count = 2; 3810b410d6e4ce58c177569d42b51772f7bb239a24a3darylm break; 3811b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3812b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3813b410d6e4ce58c177569d42b51772f7bb239a24a3darylm case POPEN_3: 3814b410d6e4ce58c177569d42b51772f7bb239a24a3darylm { 3815b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *m1, *m2; 3816b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *p1, *p2, *p3; 3817b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3818b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (mode & _O_TEXT) { 3819b410d6e4ce58c177569d42b51772f7bb239a24a3darylm m1 = "r"; 3820b410d6e4ce58c177569d42b51772f7bb239a24a3darylm m2 = "w"; 3821b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 3822b410d6e4ce58c177569d42b51772f7bb239a24a3darylm m1 = "rb"; 3823b410d6e4ce58c177569d42b51772f7bb239a24a3darylm m2 = "wb"; 3824b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3825b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3826b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fd1 = _open_osfhandle((Py_intptr_t)hChildStdinWrDup, mode); 3827b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f1 = _fdopen(fd1, m2); 3828b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fd2 = _open_osfhandle((Py_intptr_t)hChildStdoutRdDup, mode); 3829b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f2 = _fdopen(fd2, m1); 3830b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fd3 = _open_osfhandle((Py_intptr_t)hChildStderrRdDup, mode); 3831b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f3 = _fdopen(fd3, m1); 3832b410d6e4ce58c177569d42b51772f7bb239a24a3darylm p1 = PyFile_FromFile(f1, cmdstring, m2, _PyPclose); 3833b410d6e4ce58c177569d42b51772f7bb239a24a3darylm p2 = PyFile_FromFile(f2, cmdstring, m1, _PyPclose); 3834b410d6e4ce58c177569d42b51772f7bb239a24a3darylm p3 = PyFile_FromFile(f3, cmdstring, m1, _PyPclose); 3835b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(p1, 0); 3836b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(p2, 0); 3837b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(p3, 0); 3838b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = PyTuple_Pack(3,p1,p2,p3); 3839b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(p1); 3840b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(p2); 3841b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(p3); 3842b410d6e4ce58c177569d42b51772f7bb239a24a3darylm file_count = 3; 3843b410d6e4ce58c177569d42b51772f7bb239a24a3darylm break; 3844b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3845b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3846b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3847b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (n == POPEN_4) { 3848b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!_PyPopenCreateProcess(cmdstring, 3849b410d6e4ce58c177569d42b51772f7bb239a24a3darylm hChildStdinRd, 3850b410d6e4ce58c177569d42b51772f7bb239a24a3darylm hChildStdoutWr, 3851b410d6e4ce58c177569d42b51772f7bb239a24a3darylm hChildStdoutWr, 3852b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &hProcess)) 3853b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 3854b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3855b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 3856b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!_PyPopenCreateProcess(cmdstring, 3857b410d6e4ce58c177569d42b51772f7bb239a24a3darylm hChildStdinRd, 3858b410d6e4ce58c177569d42b51772f7bb239a24a3darylm hChildStdoutWr, 3859b410d6e4ce58c177569d42b51772f7bb239a24a3darylm hChildStderrWr, 3860b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &hProcess)) 3861b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 3862b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3863b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3864b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* 3865b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Insert the files we've created into the process dictionary 3866b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * all referencing the list with the process handle and the 3867b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * initial number of files (see description below in _PyPclose). 3868b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Since if _PyPclose later tried to wait on a process when all 3869b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * handles weren't closed, it could create a deadlock with the 3870b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * child, we spend some energy here to try to ensure that we 3871b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * either insert all file handles into the dictionary or none 3872b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * at all. It's a little clumsy with the various popen modes 3873b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * and variable number of files involved. 3874b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3875b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!_PyPopenProcs) { 3876b410d6e4ce58c177569d42b51772f7bb239a24a3darylm _PyPopenProcs = PyDict_New(); 3877b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3878b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3879b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (_PyPopenProcs) { 3880b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *procObj, *hProcessObj, *intObj, *fileObj[3]; 3881b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int ins_rc[3]; 3882b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3883b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[0] = fileObj[1] = fileObj[2] = NULL; 3884b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ins_rc[0] = ins_rc[1] = ins_rc[2] = 0; 3885b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3886b410d6e4ce58c177569d42b51772f7bb239a24a3darylm procObj = PyList_New(2); 3887b410d6e4ce58c177569d42b51772f7bb239a24a3darylm hProcessObj = PyLong_FromVoidPtr(hProcess); 3888b410d6e4ce58c177569d42b51772f7bb239a24a3darylm intObj = PyInt_FromLong(file_count); 3889b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3890b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (procObj && hProcessObj && intObj) { 3891b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyList_SetItem(procObj,0,hProcessObj); 3892b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyList_SetItem(procObj,1,intObj); 3893b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3894b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[0] = PyLong_FromVoidPtr(f1); 3895b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (fileObj[0]) { 3896b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ins_rc[0] = PyDict_SetItem(_PyPopenProcs, 3897b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[0], 3898b410d6e4ce58c177569d42b51772f7bb239a24a3darylm procObj); 3899b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3900b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (file_count >= 2) { 3901b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[1] = PyLong_FromVoidPtr(f2); 3902b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (fileObj[1]) { 3903b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ins_rc[1] = PyDict_SetItem(_PyPopenProcs, 3904b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[1], 3905b410d6e4ce58c177569d42b51772f7bb239a24a3darylm procObj); 3906b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3907b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3908b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (file_count >= 3) { 3909b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[2] = PyLong_FromVoidPtr(f3); 3910b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (fileObj[2]) { 3911b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ins_rc[2] = PyDict_SetItem(_PyPopenProcs, 3912b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[2], 3913b410d6e4ce58c177569d42b51772f7bb239a24a3darylm procObj); 3914b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3915b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3916b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3917b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins_rc[0] < 0 || !fileObj[0] || 3918b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ins_rc[1] < 0 || (file_count > 1 && !fileObj[1]) || 3919b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ins_rc[2] < 0 || (file_count > 2 && !fileObj[2])) { 3920b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Something failed - remove any dictionary 3921b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * entries that did make it. 3922b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3923b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!ins_rc[0] && fileObj[0]) { 3924b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyDict_DelItem(_PyPopenProcs, 3925b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[0]); 3926b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3927b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!ins_rc[1] && fileObj[1]) { 3928b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyDict_DelItem(_PyPopenProcs, 3929b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[1]); 3930b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3931b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!ins_rc[2] && fileObj[2]) { 3932b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyDict_DelItem(_PyPopenProcs, 3933b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj[2]); 3934b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3935b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3936b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3937b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3938b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* 3939b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Clean up our localized references for the dictionary keys 3940b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * and value since PyDict_SetItem will Py_INCREF any copies 3941b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * that got placed in the dictionary. 3942b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3943b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(procObj); 3944b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(fileObj[0]); 3945b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(fileObj[1]); 3946b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(fileObj[2]); 3947b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 3948b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3949b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Child is launched. Close the parents copy of those pipe 3950b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * handles that only the child should have open. You need to 3951b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * make sure that no handles to the write end of the output pipe 3952b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * are maintained in this process or else the pipe will not close 3953b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * when the child process exits and the ReadFile will hang. */ 3954b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3955b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!CloseHandle(hChildStdinRd)) 3956b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return win32_error("CloseHandle", NULL); 3957b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3958b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!CloseHandle(hChildStdoutWr)) 3959b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return win32_error("CloseHandle", NULL); 3960b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3961b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((n != 4) && (!CloseHandle(hChildStderrWr))) 3962b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return win32_error("CloseHandle", NULL); 3963b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3964b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return f; 3965b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 3966b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3967b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* 3968b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Wrapper for fclose() to use for popen* files, so we can retrieve the 3969b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * exit code for the child process and return as a result of the close. 3970b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 3971b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * This function uses the _PyPopenProcs dictionary in order to map the 3972b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * input file pointer to information about the process that was 3973b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * originally created by the popen* call that created the file pointer. 3974b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * The dictionary uses the file pointer as a key (with one entry 3975b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * inserted for each file returned by the original popen* call) and a 3976b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * single list object as the value for all files from a single call. 3977b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * The list object contains the Win32 process handle at [0], and a file 3978b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * count at [1], which is initialized to the total number of file 3979b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * handles using that list. 3980b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 3981b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * This function closes whichever handle it is passed, and decrements 3982b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * the file count in the dictionary for the process handle pointed to 3983b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * by this file. On the last close (when the file count reaches zero), 3984b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * this function will wait for the child process and then return its 3985b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * exit code as the result of the close() operation. This permits the 3986b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * files to be closed in any order - it is always the close() of the 3987b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * final handle that will return the exit code. 3988b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 3989b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * NOTE: This function is currently called with the GIL released. 3990b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * hence we use the GILState API to manage our state. 3991b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 3992b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 3993b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int _PyPclose(FILE *file) 3994b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 3995b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int result; 3996b410d6e4ce58c177569d42b51772f7bb239a24a3darylm DWORD exit_code; 3997b410d6e4ce58c177569d42b51772f7bb239a24a3darylm HANDLE hProcess; 3998b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *procObj, *hProcessObj, *intObj, *fileObj; 3999b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long file_count; 4000b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WITH_THREAD 4001b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyGILState_STATE state; 4002b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 4003b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4004b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Close the file handle first, to ensure it can't block the 4005b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * child from exiting if it's the last handle. 4006b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 4007b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = fclose(file); 4008b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WITH_THREAD 4009b410d6e4ce58c177569d42b51772f7bb239a24a3darylm state = PyGILState_Ensure(); 4010b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 4011b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (_PyPopenProcs) { 4012b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((fileObj = PyLong_FromVoidPtr(file)) != NULL && 4013b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (procObj = PyDict_GetItem(_PyPopenProcs, 4014b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fileObj)) != NULL && 4015b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (hProcessObj = PyList_GetItem(procObj,0)) != NULL && 4016b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (intObj = PyList_GetItem(procObj,1)) != NULL) { 4017b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4018b410d6e4ce58c177569d42b51772f7bb239a24a3darylm hProcess = PyLong_AsVoidPtr(hProcessObj); 4019b410d6e4ce58c177569d42b51772f7bb239a24a3darylm file_count = PyInt_AsLong(intObj); 4020b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4021b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (file_count > 1) { 4022b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Still other files referencing process */ 4023b410d6e4ce58c177569d42b51772f7bb239a24a3darylm file_count--; 4024b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyList_SetItem(procObj,1, 4025b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyInt_FromLong(file_count)); 4026b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 4027b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Last file for this process */ 4028b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (result != EOF && 4029b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WaitForSingleObject(hProcess, INFINITE) != WAIT_FAILED && 4030b410d6e4ce58c177569d42b51772f7bb239a24a3darylm GetExitCodeProcess(hProcess, &exit_code)) { 4031b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Possible truncation here in 16-bit environments, but 4032b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * real exit codes are just the lower byte in any event. 4033b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 4034b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = exit_code; 4035b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 4036b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Indicate failure - this will cause the file object 4037b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * to raise an I/O error and translate the last Win32 4038b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * error code from errno. We do have a problem with 4039b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * last errors that overlap the normal errno table, 4040b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * but that's a consistent problem with the file object. 4041b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 4042b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (result != EOF) { 4043b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* If the error wasn't from the fclose(), then 4044b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * set errno for the file object error handling. 4045b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 4046b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = GetLastError(); 4047b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4048b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = -1; 4049b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4050b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4051b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Free up the native handle at this point */ 4052b410d6e4ce58c177569d42b51772f7bb239a24a3darylm CloseHandle(hProcess); 4053b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4054b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4055b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Remove this file pointer from dictionary */ 4056b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyDict_DelItem(_PyPopenProcs, fileObj); 4057b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4058b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyDict_Size(_PyPopenProcs) == 0) { 4059b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(_PyPopenProcs); 4060b410d6e4ce58c177569d42b51772f7bb239a24a3darylm _PyPopenProcs = NULL; 4061b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4062b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4063b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } /* if object retrieval ok */ 4064b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4065b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(fileObj); 4066b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } /* if _PyPopenProcs */ 4067b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4068b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WITH_THREAD 4069b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyGILState_Release(state); 4070b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 4071b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return result; 4072b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4073b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4074b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else /* which OS? */ 4075b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4076b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_popen(PyObject *self, PyObject *args) 4077b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4078b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *name; 4079b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *mode = "r"; 4080b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int bufsize = -1; 4081b410d6e4ce58c177569d42b51772f7bb239a24a3darylm FILE *fp; 4082b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *f; 4083b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize)) 4084b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4085b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Strip mode of binary or text modifiers */ 4086b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (strcmp(mode, "rb") == 0 || strcmp(mode, "rt") == 0) 4087b410d6e4ce58c177569d42b51772f7bb239a24a3darylm mode = "r"; 4088b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (strcmp(mode, "wb") == 0 || strcmp(mode, "wt") == 0) 4089b410d6e4ce58c177569d42b51772f7bb239a24a3darylm mode = "w"; 4090b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4091b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fp = popen(name, mode); 4092b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4093b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (fp == NULL) 4094b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4095b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = PyFile_FromFile(fp, name, mode, pclose); 4096b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (f != NULL) 4097b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(f, bufsize); 4098b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return f; 4099b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4100b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4101b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* PYOS_??? */ 4102b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_POPEN */ 4103b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4104b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4105b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETUID 4106b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_setuid__doc__, 4107b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"setuid(uid)\n\n\ 4108b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet the current process's user id."); 4109b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4110b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4111b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_setuid(PyObject *self, PyObject *args) 4112b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4113b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long uid_arg; 4114b410d6e4ce58c177569d42b51772f7bb239a24a3darylm uid_t uid; 4115b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "l:setuid", &uid_arg)) 4116b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4117b410d6e4ce58c177569d42b51772f7bb239a24a3darylm uid = uid_arg; 4118b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (uid != uid_arg) { 4119b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_OverflowError, "user id too big"); 4120b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4121b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4122b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setuid(uid) < 0) 4123b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4124b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 4125b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 4126b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4127b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETUID */ 4128b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4129b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4130b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETEUID 4131b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_seteuid__doc__, 4132b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"seteuid(uid)\n\n\ 4133b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet the current process's effective user id."); 4134b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4135b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4136b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_seteuid (PyObject *self, PyObject *args) 4137b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4138b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long euid_arg; 4139b410d6e4ce58c177569d42b51772f7bb239a24a3darylm uid_t euid; 4140b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "l", &euid_arg)) 4141b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4142b410d6e4ce58c177569d42b51772f7bb239a24a3darylm euid = euid_arg; 4143b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (euid != euid_arg) { 4144b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_OverflowError, "user id too big"); 4145b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4146b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4147b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (seteuid(euid) < 0) { 4148b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4149b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 4150b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 4151b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 4152b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4153b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4154b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETEUID */ 4155b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4156b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETEGID 4157b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_setegid__doc__, 4158b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"setegid(gid)\n\n\ 4159b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet the current process's effective group id."); 4160b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4161b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4162b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_setegid (PyObject *self, PyObject *args) 4163b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4164b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long egid_arg; 4165b410d6e4ce58c177569d42b51772f7bb239a24a3darylm gid_t egid; 4166b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "l", &egid_arg)) 4167b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4168b410d6e4ce58c177569d42b51772f7bb239a24a3darylm egid = egid_arg; 4169b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (egid != egid_arg) { 4170b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_OverflowError, "group id too big"); 4171b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4172b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4173b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setegid(egid) < 0) { 4174b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4175b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 4176b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 4177b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 4178b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4179b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4180b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETEGID */ 4181b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4182b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETREUID 4183b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_setreuid__doc__, 4184b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"setreuid(ruid, euid)\n\n\ 4185b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet the current process's real and effective user ids."); 4186b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4187b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4188b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_setreuid (PyObject *self, PyObject *args) 4189b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4190b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long ruid_arg, euid_arg; 4191b410d6e4ce58c177569d42b51772f7bb239a24a3darylm uid_t ruid, euid; 4192b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "ll", &ruid_arg, &euid_arg)) 4193b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4194b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ruid_arg == -1) 4195b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ruid = (uid_t)-1; /* let the compiler choose how -1 fits */ 4196b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 4197b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ruid = ruid_arg; /* otherwise, assign from our long */ 4198b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (euid_arg == -1) 4199b410d6e4ce58c177569d42b51772f7bb239a24a3darylm euid = (uid_t)-1; 4200b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 4201b410d6e4ce58c177569d42b51772f7bb239a24a3darylm euid = euid_arg; 4202b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((euid_arg != -1 && euid != euid_arg) || 4203b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (ruid_arg != -1 && ruid != ruid_arg)) { 4204b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_OverflowError, "user id too big"); 4205b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4206b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4207b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setreuid(ruid, euid) < 0) { 4208b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4209b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 4210b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 4211b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 4212b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4213b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4214b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETREUID */ 4215b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4216b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETREGID 4217b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_setregid__doc__, 4218b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"setregid(rgid, egid)\n\n\ 4219b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet the current process's real and effective group ids."); 4220b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4221b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4222b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_setregid (PyObject *self, PyObject *args) 4223b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4224b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long rgid_arg, egid_arg; 4225b410d6e4ce58c177569d42b51772f7bb239a24a3darylm gid_t rgid, egid; 4226b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "ll", &rgid_arg, &egid_arg)) 4227b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4228b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (rgid_arg == -1) 4229b410d6e4ce58c177569d42b51772f7bb239a24a3darylm rgid = (gid_t)-1; /* let the compiler choose how -1 fits */ 4230b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 4231b410d6e4ce58c177569d42b51772f7bb239a24a3darylm rgid = rgid_arg; /* otherwise, assign from our long */ 4232b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (egid_arg == -1) 4233b410d6e4ce58c177569d42b51772f7bb239a24a3darylm egid = (gid_t)-1; 4234b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 4235b410d6e4ce58c177569d42b51772f7bb239a24a3darylm egid = egid_arg; 4236b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((egid_arg != -1 && egid != egid_arg) || 4237b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (rgid_arg != -1 && rgid != rgid_arg)) { 4238b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_OverflowError, "group id too big"); 4239b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4240b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4241b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setregid(rgid, egid) < 0) { 4242b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4243b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 4244b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 4245b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 4246b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4247b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4248b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETREGID */ 4249b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4250b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETGID 4251b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_setgid__doc__, 4252b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"setgid(gid)\n\n\ 4253b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet the current process's group id."); 4254b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4255b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4256b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_setgid(PyObject *self, PyObject *args) 4257b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4258b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long gid_arg; 4259b410d6e4ce58c177569d42b51772f7bb239a24a3darylm gid_t gid; 4260b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "l:setgid", &gid_arg)) 4261b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4262b410d6e4ce58c177569d42b51772f7bb239a24a3darylm gid = gid_arg; 4263b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (gid != gid_arg) { 4264b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_OverflowError, "group id too big"); 4265b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4266b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4267b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setgid(gid) < 0) 4268b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4269b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 4270b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 4271b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4272b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETGID */ 4273b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4274b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETGROUPS 4275b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_setgroups__doc__, 4276b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"setgroups(list)\n\n\ 4277b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet the groups of the current process to list."); 4278b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4279b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4280b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_setgroups(PyObject *self, PyObject *groups) 4281b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4282b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int i, len; 4283b410d6e4ce58c177569d42b51772f7bb239a24a3darylm gid_t grouplist[MAX_GROUPS]; 4284b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4285b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PySequence_Check(groups)) { 4286b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, "setgroups argument must be a sequence"); 4287b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4288b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4289b410d6e4ce58c177569d42b51772f7bb239a24a3darylm len = PySequence_Size(groups); 4290b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (len > MAX_GROUPS) { 4291b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, "too many groups"); 4292b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4293b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4294b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for(i = 0; i < len; i++) { 4295b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *elem; 4296b410d6e4ce58c177569d42b51772f7bb239a24a3darylm elem = PySequence_GetItem(groups, i); 4297b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!elem) 4298b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4299b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyInt_Check(elem)) { 4300b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyLong_Check(elem)) { 4301b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 4302b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "groups must be integers"); 4303b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(elem); 4304b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4305b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 4306b410d6e4ce58c177569d42b51772f7bb239a24a3darylm unsigned long x = PyLong_AsUnsignedLong(elem); 4307b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyErr_Occurred()) { 4308b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 4309b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "group id too big"); 4310b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(elem); 4311b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4312b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4313b410d6e4ce58c177569d42b51772f7bb239a24a3darylm grouplist[i] = x; 4314b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* read back to see if it fits in gid_t */ 4315b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (grouplist[i] != x) { 4316b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 4317b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "group id too big"); 4318b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(elem); 4319b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4320b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4321b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4322b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 4323b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long x = PyInt_AsLong(elem); 4324b410d6e4ce58c177569d42b51772f7bb239a24a3darylm grouplist[i] = x; 4325b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (grouplist[i] != x) { 4326b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 4327b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "group id too big"); 4328b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(elem); 4329b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4330b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4331b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4332b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(elem); 4333b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4334b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4335b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setgroups(len, grouplist) < 0) 4336b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4337b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 4338b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 4339b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4340b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETGROUPS */ 4341b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4342b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) 4343b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4344b410d6e4ce58c177569d42b51772f7bb239a24a3darylmwait_helper(pid_t pid, int status, struct rusage *ru) 4345b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4346b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *result; 4347b410d6e4ce58c177569d42b51772f7bb239a24a3darylm static PyObject *struct_rusage; 4348b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4349b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pid == -1) 4350b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4351b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4352b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (struct_rusage == NULL) { 4353b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *m = PyImport_ImportModuleNoBlock("resource"); 4354b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (m == NULL) 4355b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4356b410d6e4ce58c177569d42b51772f7bb239a24a3darylm struct_rusage = PyObject_GetAttrString(m, "struct_rusage"); 4357b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(m); 4358b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (struct_rusage == NULL) 4359b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4360b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4361b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4362b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* XXX(nnorwitz): Copied (w/mods) from resource.c, there should be only one. */ 4363b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = PyStructSequence_New((PyTypeObject*) struct_rusage); 4364b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!result) 4365b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4366b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4367b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifndef doubletime 4368b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define doubletime(TV) ((double)(TV).tv_sec + (TV).tv_usec * 0.000001) 4369b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 4370b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4371b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(result, 0, 4372b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFloat_FromDouble(doubletime(ru->ru_utime))); 4373b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(result, 1, 4374b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFloat_FromDouble(doubletime(ru->ru_stime))); 4375b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define SET_INT(result, index, value)\ 4376b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(result, index, PyInt_FromLong(value)) 4377b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SET_INT(result, 2, ru->ru_maxrss); 4378b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SET_INT(result, 3, ru->ru_ixrss); 4379b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SET_INT(result, 4, ru->ru_idrss); 4380b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SET_INT(result, 5, ru->ru_isrss); 4381b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SET_INT(result, 6, ru->ru_minflt); 4382b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SET_INT(result, 7, ru->ru_majflt); 4383b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SET_INT(result, 8, ru->ru_nswap); 4384b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SET_INT(result, 9, ru->ru_inblock); 4385b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SET_INT(result, 10, ru->ru_oublock); 4386b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SET_INT(result, 11, ru->ru_msgsnd); 4387b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SET_INT(result, 12, ru->ru_msgrcv); 4388b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SET_INT(result, 13, ru->ru_nsignals); 4389b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SET_INT(result, 14, ru->ru_nvcsw); 4390b410d6e4ce58c177569d42b51772f7bb239a24a3darylm SET_INT(result, 15, ru->ru_nivcsw); 4391b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#undef SET_INT 4392b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4393b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyErr_Occurred()) { 4394b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(result); 4395b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4396b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4397b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4398b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("NiN", PyLong_FromPid(pid), status, result); 4399b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4400b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_WAIT3 || HAVE_WAIT4 */ 4401b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4402b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_WAIT3 4403b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_wait3__doc__, 4404b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"wait3(options) -> (pid, status, rusage)\n\n\ 4405b410d6e4ce58c177569d42b51772f7bb239a24a3darylmWait for completion of a child process."); 4406b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4407b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4408b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_wait3(PyObject *self, PyObject *args) 4409b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4410b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pid; 4411b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int options; 4412b410d6e4ce58c177569d42b51772f7bb239a24a3darylm struct rusage ru; 4413b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_TYPE status; 4414b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_STATUS_INT(status) = 0; 4415b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4416b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:wait3", &options)) 4417b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4418b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4419b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4420b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid = wait3(&status, options, &ru); 4421b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4422b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4423b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return wait_helper(pid, WAIT_STATUS_INT(status), &ru); 4424b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4425b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_WAIT3 */ 4426b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4427b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_WAIT4 4428b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_wait4__doc__, 4429b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"wait4(pid, options) -> (pid, status, rusage)\n\n\ 4430b410d6e4ce58c177569d42b51772f7bb239a24a3darylmWait for completion of a given child process."); 4431b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4432b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4433b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_wait4(PyObject *self, PyObject *args) 4434b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4435b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pid; 4436b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int options; 4437b410d6e4ce58c177569d42b51772f7bb239a24a3darylm struct rusage ru; 4438b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_TYPE status; 4439b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_STATUS_INT(status) = 0; 4440b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4441b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, PARSE_PID "i:wait4", &pid, &options)) 4442b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4443b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4444b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4445b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid = wait4(pid, &status, options, &ru); 4446b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4447b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4448b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return wait_helper(pid, WAIT_STATUS_INT(status), &ru); 4449b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4450b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_WAIT4 */ 4451b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4452b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_WAITPID 4453b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_waitpid__doc__, 4454b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"waitpid(pid, options) -> (pid, status)\n\n\ 4455b410d6e4ce58c177569d42b51772f7bb239a24a3darylmWait for completion of a given child process."); 4456b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4457b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4458b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_waitpid(PyObject *self, PyObject *args) 4459b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4460b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pid; 4461b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int options; 4462b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_TYPE status; 4463b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_STATUS_INT(status) = 0; 4464b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4465b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, PARSE_PID "i:waitpid", &pid, &options)) 4466b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4467b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4468b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid = waitpid(pid, &status, options); 4469b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4470b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pid == -1) 4471b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4472b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4473b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status)); 4474b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4475b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4476b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#elif defined(HAVE_CWAIT) 4477b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4478b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* MS C has a variant of waitpid() that's usable for most purposes. */ 4479b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_waitpid__doc__, 4480b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"waitpid(pid, options) -> (pid, status << 8)\n\n" 4481b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"Wait for completion of a given process. options is ignored on Windows."); 4482b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4483b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4484b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_waitpid(PyObject *self, PyObject *args) 4485b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4486b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_intptr_t pid; 4487b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int status, options; 4488b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4489b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, PARSE_PID "i:waitpid", &pid, &options)) 4490b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4491b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4492b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid = _cwait(&status, pid, options); 4493b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4494b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pid == -1) 4495b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4496b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4497b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* shift the status left a byte so this is more like the POSIX waitpid */ 4498b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("Ni", PyLong_FromPid(pid), status << 8); 4499b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4500b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_WAITPID || HAVE_CWAIT */ 4501b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4502b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_WAIT 4503b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_wait__doc__, 4504b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"wait() -> (pid, status)\n\n\ 4505b410d6e4ce58c177569d42b51772f7bb239a24a3darylmWait for completion of a child process."); 4506b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4507b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4508b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_wait(PyObject *self, PyObject *noargs) 4509b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4510b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pid; 4511b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_TYPE status; 4512b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_STATUS_INT(status) = 0; 4513b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4514b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4515b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid = wait(&status); 4516b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4517b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pid == -1) 4518b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4519b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4520b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status)); 4521b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4522b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 4523b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4524b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4525b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_lstat__doc__, 4526b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"lstat(path) -> stat result\n\n\ 4527b410d6e4ce58c177569d42b51772f7bb239a24a3darylmLike stat(path), but do not follow symbolic links."); 4528b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4529b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4530b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_lstat(PyObject *self, PyObject *args) 4531b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4532b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_LSTAT 4533b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_do_stat(self, args, "et:lstat", lstat, NULL, NULL); 4534b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else /* !HAVE_LSTAT */ 4535b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_do_stat(self, args, "et:lstat", STAT, NULL, NULL); 4536b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* !HAVE_LSTAT */ 4537b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4538b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4539b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4540b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_READLINK 4541b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_readlink__doc__, 4542b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"readlink(path) -> path\n\n\ 4543b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn a string representing the path to which the symbolic link points."); 4544b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4545b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4546b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_readlink(PyObject *self, PyObject *args) 4547b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4548b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject* v; 4549b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char buf[MAXPATHLEN]; 4550b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path; 4551b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int n; 4552b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef Py_USING_UNICODE 4553b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int arg_is_unicode = 0; 4554b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 4555b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4556b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "et:readlink", 4557b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, &path)) 4558b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4559b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef Py_USING_UNICODE 4560b410d6e4ce58c177569d42b51772f7bb239a24a3darylm v = PySequence_GetItem(args, 0); 4561b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (v == NULL) { 4562b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 4563b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4564b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4565b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4566b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyUnicode_Check(v)) { 4567b410d6e4ce58c177569d42b51772f7bb239a24a3darylm arg_is_unicode = 1; 4568b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4569b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(v); 4570b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 4571b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4572b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4573b410d6e4ce58c177569d42b51772f7bb239a24a3darylm n = readlink(path, buf, (int) sizeof buf); 4574b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4575b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (n < 0) 4576b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_allocated_filename(path); 4577b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4578b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(path); 4579b410d6e4ce58c177569d42b51772f7bb239a24a3darylm v = PyString_FromStringAndSize(buf, n); 4580b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef Py_USING_UNICODE 4581b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (arg_is_unicode) { 4582b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *w; 4583b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4584b410d6e4ce58c177569d42b51772f7bb239a24a3darylm w = PyUnicode_FromEncodedObject(v, 4585b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, 4586b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "strict"); 4587b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (w != NULL) { 4588b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(v); 4589b410d6e4ce58c177569d42b51772f7bb239a24a3darylm v = w; 4590b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4591b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 4592b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* fall back to the original byte string, as 4593b410d6e4ce58c177569d42b51772f7bb239a24a3darylm discussed in patch #683592 */ 4594b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_Clear(); 4595b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4596b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4597b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 4598b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return v; 4599b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4600b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_READLINK */ 4601b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4602b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4603b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYMLINK 4604b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_symlink__doc__, 4605b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"symlink(src, dst)\n\n\ 4606b410d6e4ce58c177569d42b51772f7bb239a24a3darylmCreate a symbolic link pointing to src named dst."); 4607b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4608b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4609b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_symlink(PyObject *self, PyObject *args) 4610b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4611b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_2str(args, "etet:symlink", symlink); 4612b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4613b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SYMLINK */ 4614b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4615b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4616b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_TIMES 4617b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYCC_VACPP) && defined(PYOS_OS2) 4618b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic long 4619b410d6e4ce58c177569d42b51772f7bb239a24a3darylmsystem_uptime(void) 4620b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4621b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ULONG value = 0; 4622b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4623b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4624b410d6e4ce58c177569d42b51772f7bb239a24a3darylm DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &value, sizeof(value)); 4625b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4626b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4627b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return value; 4628b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4629b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4630b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4631b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_times(PyObject *self, PyObject *noargs) 4632b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4633b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Currently Only Uptime is Provided -- Others Later */ 4634b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("ddddd", 4635b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (double)0 /* t.tms_utime / HZ */, 4636b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (double)0 /* t.tms_stime / HZ */, 4637b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (double)0 /* t.tms_cutime / HZ */, 4638b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (double)0 /* t.tms_cstime / HZ */, 4639b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (double)system_uptime() / 1000); 4640b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4641b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else /* not OS2 */ 4642b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define NEED_TICKS_PER_SECOND 4643b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic long ticks_per_second = -1; 4644b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4645b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_times(PyObject *self, PyObject *noargs) 4646b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4647b410d6e4ce58c177569d42b51772f7bb239a24a3darylm struct tms t; 4648b410d6e4ce58c177569d42b51772f7bb239a24a3darylm clock_t c; 4649b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = 0; 4650b410d6e4ce58c177569d42b51772f7bb239a24a3darylm c = times(&t); 4651b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (c == (clock_t) -1) 4652b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4653b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("ddddd", 4654b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (double)t.tms_utime / ticks_per_second, 4655b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (double)t.tms_stime / ticks_per_second, 4656b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (double)t.tms_cutime / ticks_per_second, 4657b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (double)t.tms_cstime / ticks_per_second, 4658b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (double)c / ticks_per_second); 4659b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4660b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* not OS2 */ 4661b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_TIMES */ 4662b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4663b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4664b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_TIMES 4665b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_times__doc__, 4666b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\n\ 4667b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn a tuple of floating point numbers indicating process times."); 4668b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 4669b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4670b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4671b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETSID 4672b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_getsid__doc__, 4673b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"getsid(pid) -> sid\n\n\ 4674b410d6e4ce58c177569d42b51772f7bb239a24a3darylmCall the system call getsid()."); 4675b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4676b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4677b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_getsid(PyObject *self, PyObject *args) 4678b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4679b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pid; 4680b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int sid; 4681b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, PARSE_PID ":getsid", &pid)) 4682b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4683b410d6e4ce58c177569d42b51772f7bb239a24a3darylm sid = getsid(pid); 4684b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (sid < 0) 4685b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4686b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromLong((long)sid); 4687b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4688b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_GETSID */ 4689b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4690b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4691b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETSID 4692b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_setsid__doc__, 4693b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"setsid()\n\n\ 4694b410d6e4ce58c177569d42b51772f7bb239a24a3darylmCall the system call setsid()."); 4695b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4696b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4697b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_setsid(PyObject *self, PyObject *noargs) 4698b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4699b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setsid() < 0) 4700b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4701b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 4702b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 4703b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4704b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETSID */ 4705b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4706b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETPGID 4707b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_setpgid__doc__, 4708b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"setpgid(pid, pgrp)\n\n\ 4709b410d6e4ce58c177569d42b51772f7bb239a24a3darylmCall the system call setpgid()."); 4710b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4711b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4712b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_setpgid(PyObject *self, PyObject *args) 4713b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4714b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pid; 4715b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int pgrp; 4716b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, PARSE_PID "i:setpgid", &pid, &pgrp)) 4717b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4718b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setpgid(pid, pgrp) < 0) 4719b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4720b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 4721b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 4722b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4723b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETPGID */ 4724b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4725b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4726b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_TCGETPGRP 4727b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_tcgetpgrp__doc__, 4728b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"tcgetpgrp(fd) -> pgid\n\n\ 4729b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn the process group associated with the terminal given by a fd."); 4730b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4731b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4732b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_tcgetpgrp(PyObject *self, PyObject *args) 4733b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4734b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd; 4735b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pgid; 4736b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:tcgetpgrp", &fd)) 4737b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4738b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pgid = tcgetpgrp(fd); 4739b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (pgid < 0) 4740b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4741b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyLong_FromPid(pgid); 4742b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4743b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_TCGETPGRP */ 4744b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4745b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4746b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_TCSETPGRP 4747b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_tcsetpgrp__doc__, 4748b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"tcsetpgrp(fd, pgid)\n\n\ 4749b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet the process group associated with the terminal given by a fd."); 4750b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4751b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4752b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_tcsetpgrp(PyObject *self, PyObject *args) 4753b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4754b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd; 4755b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pid_t pgid; 4756b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i" PARSE_PID ":tcsetpgrp", &fd, &pgid)) 4757b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4758b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (tcsetpgrp(fd, pgid) < 0) 4759b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4760b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 4761b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 4762b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4763b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_TCSETPGRP */ 4764b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4765b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* Functions acting on file descriptors */ 4766b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4767b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_open__doc__, 4768b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"open(filename, flag [, mode=0777]) -> fd\n\n\ 4769b410d6e4ce58c177569d42b51772f7bb239a24a3darylmOpen a file (for low level IO)."); 4770b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4771b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4772b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_open(PyObject *self, PyObject *args) 4773b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4774b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *file = NULL; 4775b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int flag; 4776b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int mode = 0777; 4777b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd; 4778b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4779b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "eti|i", 4780b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FileSystemDefaultEncoding, &file, 4781b410d6e4ce58c177569d42b51772f7bb239a24a3darylm &flag, &mode)) 4782b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4783b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4784b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4785b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fd = open(file, flag, mode); 4786b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4787b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (fd < 0) 4788b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_allocated_filename(file); 4789b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_Free(file); 4790b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromLong((long)fd); 4791b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4792b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4793b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4794b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_close__doc__, 4795b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"close(fd)\n\n\ 4796b410d6e4ce58c177569d42b51772f7bb239a24a3darylmClose a file descriptor (for low level IO)."); 4797b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4798b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4799b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_close(PyObject *self, PyObject *args) 4800b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4801b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd, res; 4802b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:close", &fd)) 4803b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4804b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!_PyVerify_fd(fd)) 4805b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4806b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4807b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = close(fd); 4808b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4809b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 4810b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4811b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 4812b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 4813b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4814b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4815b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4816b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_closerange__doc__, 4817b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"closerange(fd_low, fd_high)\n\n\ 4818b410d6e4ce58c177569d42b51772f7bb239a24a3darylmCloses all file descriptors in [fd_low, fd_high), ignoring errors."); 4819b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4820b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4821b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_closerange(PyObject *self, PyObject *args) 4822b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4823b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd_from, fd_to, i; 4824b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "ii:closerange", &fd_from, &fd_to)) 4825b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4826b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4827b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (i = fd_from; i < fd_to; i++) 4828b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (_PyVerify_fd(i)) 4829b410d6e4ce58c177569d42b51772f7bb239a24a3darylm close(i); 4830b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4831b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_RETURN_NONE; 4832b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4833b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4834b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4835b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_dup__doc__, 4836b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"dup(fd) -> fd2\n\n\ 4837b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn a duplicate of a file descriptor."); 4838b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4839b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4840b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_dup(PyObject *self, PyObject *args) 4841b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4842b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd; 4843b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:dup", &fd)) 4844b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4845b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!_PyVerify_fd(fd)) 4846b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4847b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4848b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fd = dup(fd); 4849b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4850b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (fd < 0) 4851b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4852b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromLong((long)fd); 4853b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4854b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4855b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4856b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_dup2__doc__, 4857b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"dup2(old_fd, new_fd)\n\n\ 4858b410d6e4ce58c177569d42b51772f7bb239a24a3darylmDuplicate file descriptor."); 4859b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4860b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4861b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_dup2(PyObject *self, PyObject *args) 4862b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4863b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd, fd2, res; 4864b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "ii:dup2", &fd, &fd2)) 4865b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4866b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!_PyVerify_fd_dup2(fd, fd2)) 4867b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4868b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4869b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = dup2(fd, fd2); 4870b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4871b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 4872b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4873b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 4874b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 4875b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4876b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4877b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4878b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_lseek__doc__, 4879b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"lseek(fd, pos, how) -> newpos\n\n\ 4880b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet the current position of a file descriptor."); 4881b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4882b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4883b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_lseek(PyObject *self, PyObject *args) 4884b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4885b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd, how; 4886b410d6e4ce58c177569d42b51772f7bb239a24a3darylm off_t pos, res; 4887b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *posobj; 4888b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "iOi:lseek", &fd, &posobj, &how)) 4889b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4890b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef SEEK_SET 4891b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */ 4892b410d6e4ce58c177569d42b51772f7bb239a24a3darylm switch (how) { 4893b410d6e4ce58c177569d42b51772f7bb239a24a3darylm case 0: how = SEEK_SET; break; 4894b410d6e4ce58c177569d42b51772f7bb239a24a3darylm case 1: how = SEEK_CUR; break; 4895b410d6e4ce58c177569d42b51772f7bb239a24a3darylm case 2: how = SEEK_END; break; 4896b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4897b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* SEEK_END */ 4898b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4899b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if !defined(HAVE_LARGEFILE_SUPPORT) 4900b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pos = PyInt_AsLong(posobj); 4901b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 4902b410d6e4ce58c177569d42b51772f7bb239a24a3darylm pos = PyLong_Check(posobj) ? 4903b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj); 4904b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 4905b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyErr_Occurred()) 4906b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4907b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4908b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!_PyVerify_fd(fd)) 4909b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4910b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4911b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = lseek(fd, pos, how); 4912b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4913b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 4914b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4915b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4916b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if !defined(HAVE_LARGEFILE_SUPPORT) 4917b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromLong(res); 4918b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 4919b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyLong_FromLongLong(res); 4920b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 4921b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4922b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4923b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4924b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_read__doc__, 4925b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"read(fd, buffersize) -> string\n\n\ 4926b410d6e4ce58c177569d42b51772f7bb239a24a3darylmRead a file descriptor."); 4927b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4928b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4929b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_read(PyObject *self, PyObject *args) 4930b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4931b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd, size, n; 4932b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *buffer; 4933b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "ii:read", &fd, &size)) 4934b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4935b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (size < 0) { 4936b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = EINVAL; 4937b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4938b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4939b410d6e4ce58c177569d42b51772f7bb239a24a3darylm buffer = PyString_FromStringAndSize((char *)NULL, size); 4940b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (buffer == NULL) 4941b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4942b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!_PyVerify_fd(fd)) { 4943b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(buffer); 4944b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4945b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4946b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4947b410d6e4ce58c177569d42b51772f7bb239a24a3darylm n = read(fd, PyString_AsString(buffer), size); 4948b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4949b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (n < 0) { 4950b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(buffer); 4951b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4952b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4953b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (n != size) 4954b410d6e4ce58c177569d42b51772f7bb239a24a3darylm _PyString_Resize(&buffer, n); 4955b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return buffer; 4956b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4957b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4958b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4959b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_write__doc__, 4960b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"write(fd, string) -> byteswritten\n\n\ 4961b410d6e4ce58c177569d42b51772f7bb239a24a3darylmWrite a string to a file descriptor."); 4962b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4963b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4964b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_write(PyObject *self, PyObject *args) 4965b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4966b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_buffer pbuf; 4967b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd; 4968b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_ssize_t size; 4969b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4970b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "is*:write", &fd, &pbuf)) 4971b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4972b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!_PyVerify_fd(fd)) { 4973b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyBuffer_Release(&pbuf); 4974b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4975b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 4976b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 4977b410d6e4ce58c177569d42b51772f7bb239a24a3darylm size = write(fd, pbuf.buf, (size_t)pbuf.len); 4978b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 4979b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyBuffer_Release(&pbuf); 4980b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (size < 0) 4981b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 4982b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromSsize_t(size); 4983b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 4984b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4985b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4986b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_fstat__doc__, 4987b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"fstat(fd) -> stat result\n\n\ 4988b410d6e4ce58c177569d42b51772f7bb239a24a3darylmLike stat(), but for an open file descriptor."); 4989b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 4990b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 4991b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_fstat(PyObject *self, PyObject *args) 4992b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 4993b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd; 4994b410d6e4ce58c177569d42b51772f7bb239a24a3darylm STRUCT_STAT st; 4995b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 4996b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:fstat", &fd)) 4997b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 4998b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!_PyVerify_fd(fd)) 4999b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 5000b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 5001b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = FSTAT(fd, &st); 5002b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 5003b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res != 0) { 5004b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 5005b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5006b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5007b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return _pystat_fromstructstat(&st); 5008b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5009b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5010b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5011b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_fdopen__doc__, 5012b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"fdopen(fd [, mode='r' [, bufsize]]) -> file_object\n\n\ 5013b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn an open file object connected to a file descriptor."); 5014b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5015b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5016b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_fdopen(PyObject *self, PyObject *args) 5017b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5018b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd; 5019b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *orgmode = "r"; 5020b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int bufsize = -1; 5021b410d6e4ce58c177569d42b51772f7bb239a24a3darylm FILE *fp; 5022b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *f; 5023b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *mode; 5024b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i|si", &fd, &orgmode, &bufsize)) 5025b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5026b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5027b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Sanitize mode. See fileobject.c */ 5028b410d6e4ce58c177569d42b51772f7bb239a24a3darylm mode = PyMem_MALLOC(strlen(orgmode)+3); 5029b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!mode) { 5030b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_NoMemory(); 5031b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5032b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5033b410d6e4ce58c177569d42b51772f7bb239a24a3darylm strcpy(mode, orgmode); 5034b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (_PyFile_SanitizeMode(mode)) { 5035b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_FREE(mode); 5036b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5037b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5038b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!_PyVerify_fd(fd)) 5039b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 5040b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 5041b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if !defined(MS_WINDOWS) && defined(HAVE_FCNTL_H) 5042b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (mode[0] == 'a') { 5043b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* try to make sure the O_APPEND flag is set */ 5044b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int flags; 5045b410d6e4ce58c177569d42b51772f7bb239a24a3darylm flags = fcntl(fd, F_GETFL); 5046b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (flags != -1) 5047b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fcntl(fd, F_SETFL, flags | O_APPEND); 5048b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fp = fdopen(fd, mode); 5049b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (fp == NULL && flags != -1) 5050b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* restore old mode if fdopen failed */ 5051b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fcntl(fd, F_SETFL, flags); 5052b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 5053b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fp = fdopen(fd, mode); 5054b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5055b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 5056b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fp = fdopen(fd, mode); 5057b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5058b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 5059b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyMem_FREE(mode); 5060b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (fp == NULL) 5061b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 5062b410d6e4ce58c177569d42b51772f7bb239a24a3darylm f = PyFile_FromFile(fp, "<fdopen>", orgmode, fclose); 5063b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (f != NULL) 5064b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyFile_SetBufSize(f, bufsize); 5065b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return f; 5066b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5067b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5068b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_isatty__doc__, 5069b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"isatty(fd) -> bool\n\n\ 5070b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn True if the file descriptor 'fd' is an open file descriptor\n\ 5071b410d6e4ce58c177569d42b51772f7bb239a24a3darylmconnected to the slave end of a terminal."); 5072b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5073b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5074b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_isatty(PyObject *self, PyObject *args) 5075b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5076b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd; 5077b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:isatty", &fd)) 5078b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5079b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!_PyVerify_fd(fd)) 5080b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyBool_FromLong(0); 5081b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyBool_FromLong(isatty(fd)); 5082b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5083b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5084b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_PIPE 5085b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_pipe__doc__, 5086b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"pipe() -> (read_end, write_end)\n\n\ 5087b410d6e4ce58c177569d42b51772f7bb239a24a3darylmCreate a pipe."); 5088b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5089b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5090b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_pipe(PyObject *self, PyObject *noargs) 5091b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5092b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYOS_OS2) 5093b410d6e4ce58c177569d42b51772f7bb239a24a3darylm HFILE read, write; 5094b410d6e4ce58c177569d42b51772f7bb239a24a3darylm APIRET rc; 5095b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5096b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 5097b410d6e4ce58c177569d42b51772f7bb239a24a3darylm rc = DosCreatePipe( &read, &write, 4096); 5098b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 5099b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (rc != NO_ERROR) 5100b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return os2_error(rc); 5101b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5102b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("(ii)", read, write); 5103b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 5104b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if !defined(MS_WINDOWS) 5105b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fds[2]; 5106b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 5107b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 5108b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = pipe(fds); 5109b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 5110b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res != 0) 5111b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 5112b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("(ii)", fds[0], fds[1]); 5113b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else /* MS_WINDOWS */ 5114b410d6e4ce58c177569d42b51772f7bb239a24a3darylm HANDLE read, write; 5115b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int read_fd, write_fd; 5116b410d6e4ce58c177569d42b51772f7bb239a24a3darylm BOOL ok; 5117b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 5118b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ok = CreatePipe(&read, &write, NULL, 0); 5119b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 5120b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!ok) 5121b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return win32_error("CreatePipe", NULL); 5122b410d6e4ce58c177569d42b51772f7bb239a24a3darylm read_fd = _open_osfhandle((Py_intptr_t)read, 0); 5123b410d6e4ce58c177569d42b51772f7bb239a24a3darylm write_fd = _open_osfhandle((Py_intptr_t)write, 1); 5124b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("(ii)", read_fd, write_fd); 5125b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* MS_WINDOWS */ 5126b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5127b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5128b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_PIPE */ 5129b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5130b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5131b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_MKFIFO 5132b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_mkfifo__doc__, 5133b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"mkfifo(filename [, mode=0666])\n\n\ 5134b410d6e4ce58c177569d42b51772f7bb239a24a3darylmCreate a FIFO (a POSIX named pipe)."); 5135b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5136b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5137b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_mkfifo(PyObject *self, PyObject *args) 5138b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5139b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *filename; 5140b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int mode = 0666; 5141b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 5142b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s|i:mkfifo", &filename, &mode)) 5143b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5144b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 5145b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = mkfifo(filename, mode); 5146b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 5147b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 5148b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 5149b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 5150b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 5151b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5152b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5153b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5154b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5155b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV) 5156b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_mknod__doc__, 5157b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"mknod(filename [, mode=0600, device])\n\n\ 5158b410d6e4ce58c177569d42b51772f7bb239a24a3darylmCreate a filesystem node (file, device special file or named pipe)\n\ 5159b410d6e4ce58c177569d42b51772f7bb239a24a3darylmnamed filename. mode specifies both the permissions to use and the\n\ 5160b410d6e4ce58c177569d42b51772f7bb239a24a3darylmtype of node to be created, being combined (bitwise OR) with one of\n\ 5161b410d6e4ce58c177569d42b51772f7bb239a24a3darylmS_IFREG, S_IFCHR, S_IFBLK, and S_IFIFO. For S_IFCHR and S_IFBLK,\n\ 5162b410d6e4ce58c177569d42b51772f7bb239a24a3darylmdevice defines the newly created device special file (probably using\n\ 5163b410d6e4ce58c177569d42b51772f7bb239a24a3darylmos.makedev()), otherwise it is ignored."); 5164b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5165b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5166b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5167b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_mknod(PyObject *self, PyObject *args) 5168b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5169b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *filename; 5170b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int mode = 0600; 5171b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int device = 0; 5172b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 5173b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s|ii:mknod", &filename, &mode, &device)) 5174b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5175b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 5176b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = mknod(filename, mode, device); 5177b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 5178b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 5179b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 5180b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 5181b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 5182b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5183b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5184b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5185b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_DEVICE_MACROS 5186b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_major__doc__, 5187b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"major(device) -> major number\n\ 5188b410d6e4ce58c177569d42b51772f7bb239a24a3darylmExtracts a device major number from a raw device number."); 5189b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5190b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5191b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_major(PyObject *self, PyObject *args) 5192b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5193b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int device; 5194b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:major", &device)) 5195b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5196b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromLong((long)major(device)); 5197b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5198b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5199b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_minor__doc__, 5200b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"minor(device) -> minor number\n\ 5201b410d6e4ce58c177569d42b51772f7bb239a24a3darylmExtracts a device minor number from a raw device number."); 5202b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5203b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5204b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_minor(PyObject *self, PyObject *args) 5205b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5206b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int device; 5207b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:minor", &device)) 5208b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5209b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromLong((long)minor(device)); 5210b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5211b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5212b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_makedev__doc__, 5213b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"makedev(major, minor) -> device number\n\ 5214b410d6e4ce58c177569d42b51772f7bb239a24a3darylmComposes a raw device number from the major and minor device numbers."); 5215b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5216b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5217b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_makedev(PyObject *self, PyObject *args) 5218b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5219b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int major, minor; 5220b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "ii:makedev", &major, &minor)) 5221b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5222b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyInt_FromLong((long)makedev(major, minor)); 5223b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5224b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* device macros */ 5225b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5226b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5227b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FTRUNCATE 5228b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_ftruncate__doc__, 5229b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"ftruncate(fd, length)\n\n\ 5230b410d6e4ce58c177569d42b51772f7bb239a24a3darylmTruncate a file to a specified length."); 5231b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5232b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5233b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_ftruncate(PyObject *self, PyObject *args) 5234b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5235b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd; 5236b410d6e4ce58c177569d42b51772f7bb239a24a3darylm off_t length; 5237b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 5238b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *lenobj; 5239b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5240b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "iO:ftruncate", &fd, &lenobj)) 5241b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5242b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5243b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if !defined(HAVE_LARGEFILE_SUPPORT) 5244b410d6e4ce58c177569d42b51772f7bb239a24a3darylm length = PyInt_AsLong(lenobj); 5245b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 5246b410d6e4ce58c177569d42b51772f7bb239a24a3darylm length = PyLong_Check(lenobj) ? 5247b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj); 5248b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5249b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyErr_Occurred()) 5250b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5251b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5252b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 5253b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = ftruncate(fd, length); 5254b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 5255b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res < 0) 5256b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 5257b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 5258b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 5259b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5260b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5261b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5262b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_PUTENV 5263b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_putenv__doc__, 5264b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"putenv(key, value)\n\n\ 5265b410d6e4ce58c177569d42b51772f7bb239a24a3darylmChange or add an environment variable."); 5266b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5267b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* Save putenv() parameters as values here, so we can collect them when they 5268b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * get re-set with another call for the same key. */ 5269b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject *posix_putenv_garbage; 5270b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5271b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5272b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_putenv(PyObject *self, PyObject *args) 5273b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5274b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *s1, *s2; 5275b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *newenv; 5276b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *newstr; 5277b410d6e4ce58c177569d42b51772f7bb239a24a3darylm size_t len; 5278b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5279b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "ss:putenv", &s1, &s2)) 5280b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5281b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5282b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYOS_OS2) 5283b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (stricmp(s1, "BEGINLIBPATH") == 0) { 5284b410d6e4ce58c177569d42b51772f7bb239a24a3darylm APIRET rc; 5285b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5286b410d6e4ce58c177569d42b51772f7bb239a24a3darylm rc = DosSetExtLIBPATH(s2, BEGIN_LIBPATH); 5287b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (rc != NO_ERROR) 5288b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return os2_error(rc); 5289b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5290b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else if (stricmp(s1, "ENDLIBPATH") == 0) { 5291b410d6e4ce58c177569d42b51772f7bb239a24a3darylm APIRET rc; 5292b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5293b410d6e4ce58c177569d42b51772f7bb239a24a3darylm rc = DosSetExtLIBPATH(s2, END_LIBPATH); 5294b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (rc != NO_ERROR) 5295b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return os2_error(rc); 5296b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } else { 5297b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5298b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5299b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* XXX This can leak memory -- not easy to fix :-( */ 5300b410d6e4ce58c177569d42b51772f7bb239a24a3darylm len = strlen(s1) + strlen(s2) + 2; 5301b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* len includes space for a trailing \0; the size arg to 5302b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyString_FromStringAndSize does not count that */ 5303b410d6e4ce58c177569d42b51772f7bb239a24a3darylm newstr = PyString_FromStringAndSize(NULL, (int)len - 1); 5304b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (newstr == NULL) 5305b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyErr_NoMemory(); 5306b410d6e4ce58c177569d42b51772f7bb239a24a3darylm newenv = PyString_AS_STRING(newstr); 5307b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyOS_snprintf(newenv, len, "%s=%s", s1, s2); 5308b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (putenv(newenv)) { 5309b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(newstr); 5310b410d6e4ce58c177569d42b51772f7bb239a24a3darylm posix_error(); 5311b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5312b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5313b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Install the first arg and newstr in posix_putenv_garbage; 5314b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * this will cause previous value to be collected. This has to 5315b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * happen after the real putenv() call because the old value 5316b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * was still accessible until then. */ 5317b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyDict_SetItem(posix_putenv_garbage, 5318b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyTuple_GET_ITEM(args, 0), newstr)) { 5319b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* really not much we can do; just leak */ 5320b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_Clear(); 5321b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5322b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 5323b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(newstr); 5324b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5325b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5326b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYOS_OS2) 5327b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5328b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5329b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 5330b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 5331b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5332b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* putenv */ 5333b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5334b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_UNSETENV 5335b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_unsetenv__doc__, 5336b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"unsetenv(key)\n\n\ 5337b410d6e4ce58c177569d42b51772f7bb239a24a3darylmDelete an environment variable."); 5338b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5339b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5340b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_unsetenv(PyObject *self, PyObject *args) 5341b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5342b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *s1; 5343b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5344b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s:unsetenv", &s1)) 5345b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5346b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5347b410d6e4ce58c177569d42b51772f7bb239a24a3darylm unsetenv(s1); 5348b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5349b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Remove the key from posix_putenv_garbage; 5350b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * this will cause it to be collected. This has to 5351b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * happen after the real unsetenv() call because the 5352b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * old value was still accessible until then. 5353b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 5354b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyDict_DelItem(posix_putenv_garbage, 5355b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyTuple_GET_ITEM(args, 0))) { 5356b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* really not much we can do; just leak */ 5357b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_Clear(); 5358b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5359b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5360b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 5361b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_None; 5362b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5363b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* unsetenv */ 5364b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5365b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_strerror__doc__, 5366b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"strerror(code) -> string\n\n\ 5367b410d6e4ce58c177569d42b51772f7bb239a24a3darylmTranslate an error code to a message string."); 5368b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5369b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5370b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_strerror(PyObject *self, PyObject *args) 5371b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5372b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int code; 5373b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *message; 5374b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:strerror", &code)) 5375b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5376b410d6e4ce58c177569d42b51772f7bb239a24a3darylm message = strerror(code); 5377b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (message == NULL) { 5378b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, 5379b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "strerror() argument out of range"); 5380b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5381b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5382b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyString_FromString(message); 5383b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5384b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5385b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5386b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYS_WAIT_H 5387b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5388b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WCOREDUMP 5389b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_WCOREDUMP__doc__, 5390b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"WCOREDUMP(status) -> bool\n\n\ 5391b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn True if the process returning 'status' was dumped to a core file."); 5392b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5393b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5394b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_WCOREDUMP(PyObject *self, PyObject *args) 5395b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5396b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_TYPE status; 5397b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_STATUS_INT(status) = 0; 5398b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5399b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:WCOREDUMP", &WAIT_STATUS_INT(status))) 5400b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5401b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5402b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyBool_FromLong(WCOREDUMP(status)); 5403b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5404b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WCOREDUMP */ 5405b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5406b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WIFCONTINUED 5407b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_WIFCONTINUED__doc__, 5408b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"WIFCONTINUED(status) -> bool\n\n\ 5409b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn True if the process returning 'status' was continued from a\n\ 5410b410d6e4ce58c177569d42b51772f7bb239a24a3darylmjob control stop."); 5411b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5412b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5413b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_WIFCONTINUED(PyObject *self, PyObject *args) 5414b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5415b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_TYPE status; 5416b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_STATUS_INT(status) = 0; 5417b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5418b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:WCONTINUED", &WAIT_STATUS_INT(status))) 5419b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5420b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5421b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyBool_FromLong(WIFCONTINUED(status)); 5422b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5423b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WIFCONTINUED */ 5424b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5425b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WIFSTOPPED 5426b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_WIFSTOPPED__doc__, 5427b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"WIFSTOPPED(status) -> bool\n\n\ 5428b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn True if the process returning 'status' was stopped."); 5429b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5430b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5431b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_WIFSTOPPED(PyObject *self, PyObject *args) 5432b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5433b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_TYPE status; 5434b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_STATUS_INT(status) = 0; 5435b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5436b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &WAIT_STATUS_INT(status))) 5437b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5438b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5439b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyBool_FromLong(WIFSTOPPED(status)); 5440b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5441b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WIFSTOPPED */ 5442b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5443b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WIFSIGNALED 5444b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_WIFSIGNALED__doc__, 5445b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"WIFSIGNALED(status) -> bool\n\n\ 5446b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn True if the process returning 'status' was terminated by a signal."); 5447b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5448b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5449b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_WIFSIGNALED(PyObject *self, PyObject *args) 5450b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5451b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_TYPE status; 5452b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_STATUS_INT(status) = 0; 5453b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5454b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &WAIT_STATUS_INT(status))) 5455b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5456b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5457b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyBool_FromLong(WIFSIGNALED(status)); 5458b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5459b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WIFSIGNALED */ 5460b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5461b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WIFEXITED 5462b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_WIFEXITED__doc__, 5463b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"WIFEXITED(status) -> bool\n\n\ 5464b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn true if the process returning 'status' exited using the exit()\n\ 5465b410d6e4ce58c177569d42b51772f7bb239a24a3darylmsystem call."); 5466b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5467b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5468b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_WIFEXITED(PyObject *self, PyObject *args) 5469b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5470b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_TYPE status; 5471b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_STATUS_INT(status) = 0; 5472b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5473b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:WIFEXITED", &WAIT_STATUS_INT(status))) 5474b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5475b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5476b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyBool_FromLong(WIFEXITED(status)); 5477b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5478b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WIFEXITED */ 5479b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5480b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WEXITSTATUS 5481b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_WEXITSTATUS__doc__, 5482b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"WEXITSTATUS(status) -> integer\n\n\ 5483b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn the process return code from 'status'."); 5484b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5485b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5486b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_WEXITSTATUS(PyObject *self, PyObject *args) 5487b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5488b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_TYPE status; 5489b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_STATUS_INT(status) = 0; 5490b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5491b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &WAIT_STATUS_INT(status))) 5492b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5493b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5494b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("i", WEXITSTATUS(status)); 5495b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5496b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WEXITSTATUS */ 5497b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5498b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WTERMSIG 5499b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_WTERMSIG__doc__, 5500b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"WTERMSIG(status) -> integer\n\n\ 5501b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn the signal that terminated the process that provided the 'status'\n\ 5502b410d6e4ce58c177569d42b51772f7bb239a24a3darylmvalue."); 5503b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5504b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5505b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_WTERMSIG(PyObject *self, PyObject *args) 5506b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5507b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_TYPE status; 5508b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_STATUS_INT(status) = 0; 5509b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5510b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:WTERMSIG", &WAIT_STATUS_INT(status))) 5511b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5512b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5513b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("i", WTERMSIG(status)); 5514b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5515b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WTERMSIG */ 5516b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5517b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WSTOPSIG 5518b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_WSTOPSIG__doc__, 5519b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"WSTOPSIG(status) -> integer\n\n\ 5520b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn the signal that stopped the process that provided\n\ 5521b410d6e4ce58c177569d42b51772f7bb239a24a3darylmthe 'status' value."); 5522b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5523b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5524b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_WSTOPSIG(PyObject *self, PyObject *args) 5525b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5526b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_TYPE status; 5527b410d6e4ce58c177569d42b51772f7bb239a24a3darylm WAIT_STATUS_INT(status) = 0; 5528b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5529b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &WAIT_STATUS_INT(status))) 5530b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5531b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5532b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("i", WSTOPSIG(status)); 5533b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5534b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WSTOPSIG */ 5535b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5536b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SYS_WAIT_H */ 5537b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5538b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5539b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H) 5540b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SCO_DS 5541b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* SCO OpenServer 5.0 and later requires _SVID3 before it reveals the 5542b410d6e4ce58c177569d42b51772f7bb239a24a3darylm needed definitions in sys/statvfs.h */ 5543b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define _SVID3 5544b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5545b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <sys/statvfs.h> 5546b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5547b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject* 5548b410d6e4ce58c177569d42b51772f7bb239a24a3darylm_pystatvfs_fromstructstatvfs(struct statvfs st) { 5549b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *v = PyStructSequence_New(&StatVFSResultType); 5550b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (v == NULL) 5551b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5552b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5553b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if !defined(HAVE_LARGEFILE_SUPPORT) 5554b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 0, PyInt_FromLong((long) st.f_bsize)); 5555b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long) st.f_frsize)); 5556b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 2, PyInt_FromLong((long) st.f_blocks)); 5557b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 3, PyInt_FromLong((long) st.f_bfree)); 5558b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 4, PyInt_FromLong((long) st.f_bavail)); 5559b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 5, PyInt_FromLong((long) st.f_files)); 5560b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 6, PyInt_FromLong((long) st.f_ffree)); 5561b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 7, PyInt_FromLong((long) st.f_favail)); 5562b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 8, PyInt_FromLong((long) st.f_flag)); 5563b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 9, PyInt_FromLong((long) st.f_namemax)); 5564b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 5565b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 0, PyInt_FromLong((long) st.f_bsize)); 5566b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long) st.f_frsize)); 5567b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 2, 5568b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyLong_FromLongLong((PY_LONG_LONG) st.f_blocks)); 5569b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 3, 5570b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyLong_FromLongLong((PY_LONG_LONG) st.f_bfree)); 5571b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 4, 5572b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyLong_FromLongLong((PY_LONG_LONG) st.f_bavail)); 5573b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 5, 5574b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyLong_FromLongLong((PY_LONG_LONG) st.f_files)); 5575b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 6, 5576b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyLong_FromLongLong((PY_LONG_LONG) st.f_ffree)); 5577b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 7, 5578b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyLong_FromLongLong((PY_LONG_LONG) st.f_favail)); 5579b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 8, PyInt_FromLong((long) st.f_flag)); 5580b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_SET_ITEM(v, 9, PyInt_FromLong((long) st.f_namemax)); 5581b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5582b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5583b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return v; 5584b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5585b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5586b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_fstatvfs__doc__, 5587b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"fstatvfs(fd) -> statvfs result\n\n\ 5588b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPerform an fstatvfs system call on the given fd."); 5589b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5590b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5591b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_fstatvfs(PyObject *self, PyObject *args) 5592b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5593b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int fd, res; 5594b410d6e4ce58c177569d42b51772f7bb239a24a3darylm struct statvfs st; 5595b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5596b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "i:fstatvfs", &fd)) 5597b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5598b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 5599b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = fstatvfs(fd, &st); 5600b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 5601b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res != 0) 5602b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 5603b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5604b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return _pystatvfs_fromstructstatvfs(st); 5605b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5606b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_FSTATVFS && HAVE_SYS_STATVFS_H */ 5607b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5608b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5609b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H) 5610b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#include <sys/statvfs.h> 5611b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5612b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_statvfs__doc__, 5613b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"statvfs(path) -> statvfs result\n\n\ 5614b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPerform a statvfs system call on the given path."); 5615b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5616b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5617b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_statvfs(PyObject *self, PyObject *args) 5618b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5619b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path; 5620b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int res; 5621b410d6e4ce58c177569d42b51772f7bb239a24a3darylm struct statvfs st; 5622b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "s:statvfs", &path)) 5623b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5624b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_BEGIN_ALLOW_THREADS 5625b410d6e4ce58c177569d42b51772f7bb239a24a3darylm res = statvfs(path, &st); 5626b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_END_ALLOW_THREADS 5627b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (res != 0) 5628b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error_with_filename(path); 5629b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5630b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return _pystatvfs_fromstructstatvfs(st); 5631b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5632b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_STATVFS */ 5633b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5634b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5635b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_TEMPNAM 5636b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_tempnam__doc__, 5637b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"tempnam([dir[, prefix]]) -> string\n\n\ 5638b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn a unique name for a temporary file.\n\ 5639b410d6e4ce58c177569d42b51772f7bb239a24a3darylmThe directory and a prefix may be specified as strings; they may be omitted\n\ 5640b410d6e4ce58c177569d42b51772f7bb239a24a3darylmor None if not needed."); 5641b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5642b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5643b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_tempnam(PyObject *self, PyObject *args) 5644b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5645b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *result = NULL; 5646b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *dir = NULL; 5647b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *pfx = NULL; 5648b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *name; 5649b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5650b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "|zz:tempnam", &dir, &pfx)) 5651b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5652b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5653b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyErr_Warn(PyExc_RuntimeWarning, 5654b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "tempnam is a potential security risk to your program") < 0) 5655b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5656b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5657b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyErr_WarnPy3k("tempnam has been removed in 3.x; " 5658b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "use the tempfile module", 1) < 0) 5659b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5660b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5661b410d6e4ce58c177569d42b51772f7bb239a24a3darylm name = tempnam(dir, pfx); 5662b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (name == NULL) 5663b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyErr_NoMemory(); 5664b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = PyString_FromString(name); 5665b410d6e4ce58c177569d42b51772f7bb239a24a3darylm free(name); 5666b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return result; 5667b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5668b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5669b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5670b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5671b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_TMPFILE 5672b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_tmpfile__doc__, 5673b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"tmpfile() -> file object\n\n\ 5674b410d6e4ce58c177569d42b51772f7bb239a24a3darylmCreate a temporary file with no directory entries."); 5675b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5676b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5677b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_tmpfile(PyObject *self, PyObject *noargs) 5678b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5679b410d6e4ce58c177569d42b51772f7bb239a24a3darylm FILE *fp; 5680b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5681b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyErr_WarnPy3k("tmpfile has been removed in 3.x; " 5682b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "use the tempfile module", 1) < 0) 5683b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5684b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5685b410d6e4ce58c177569d42b51772f7bb239a24a3darylm fp = tmpfile(); 5686b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (fp == NULL) 5687b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 5688b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyFile_FromFile(fp, "<tmpfile>", "w+b", fclose); 5689b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5690b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5691b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5692b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5693b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_TMPNAM 5694b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_tmpnam__doc__, 5695b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"tmpnam() -> string\n\n\ 5696b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn a unique name for a temporary file."); 5697b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5698b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5699b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_tmpnam(PyObject *self, PyObject *noargs) 5700b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5701b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char buffer[L_tmpnam]; 5702b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *name; 5703b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5704b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyErr_Warn(PyExc_RuntimeWarning, 5705b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "tmpnam is a potential security risk to your program") < 0) 5706b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5707b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5708b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyErr_WarnPy3k("tmpnam has been removed in 3.x; " 5709b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "use the tempfile module", 1) < 0) 5710b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5711b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5712b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef USE_TMPNAM_R 5713b410d6e4ce58c177569d42b51772f7bb239a24a3darylm name = tmpnam_r(buffer); 5714b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 5715b410d6e4ce58c177569d42b51772f7bb239a24a3darylm name = tmpnam(buffer); 5716b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5717b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (name == NULL) { 5718b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *err = Py_BuildValue("is", 0, 5719b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef USE_TMPNAM_R 5720b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "unexpected NULL from tmpnam_r" 5721b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 5722b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "unexpected NULL from tmpnam" 5723b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5724b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ); 5725b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetObject(PyExc_OSError, err); 5726b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(err); 5727b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 5728b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5729b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyString_FromString(buffer); 5730b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5731b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5732b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5733b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5734b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* This is used for fpathconf(), pathconf(), confstr() and sysconf(). 5735b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * It maps strings representing configuration variable names to 5736b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * integer values, allowing those functions to be called with the 5737b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * magic names instead of polluting the module's namespace with tons of 5738b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * rarely-used constants. There are three separate tables that use 5739b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * these definitions. 5740b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 5741b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * This code is always included, even if none of the interfaces that 5742b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * need it are included. The #if hackery needed to avoid it would be 5743b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * sufficiently pervasive that it's not worth the loss of readability. 5744b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 5745b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstruct constdef { 5746b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *name; 5747b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long value; 5748b410d6e4ce58c177569d42b51772f7bb239a24a3darylm}; 5749b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5750521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm#ifndef UEFI_C_SOURCE 5751b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int 5752b410d6e4ce58c177569d42b51772f7bb239a24a3darylmconv_confname(PyObject *arg, int *valuep, struct constdef *table, 5753b410d6e4ce58c177569d42b51772f7bb239a24a3darylm size_t tablesize) 5754b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5755b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyInt_Check(arg)) { 5756b410d6e4ce58c177569d42b51772f7bb239a24a3darylm *valuep = PyInt_AS_LONG(arg); 5757b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return 1; 5758b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5759b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyString_Check(arg)) { 5760b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* look up the value in the table using a binary search */ 5761b410d6e4ce58c177569d42b51772f7bb239a24a3darylm size_t lo = 0; 5762b410d6e4ce58c177569d42b51772f7bb239a24a3darylm size_t mid; 5763b410d6e4ce58c177569d42b51772f7bb239a24a3darylm size_t hi = tablesize; 5764b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int cmp; 5765b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *confname = PyString_AS_STRING(arg); 5766b410d6e4ce58c177569d42b51772f7bb239a24a3darylm while (lo < hi) { 5767b410d6e4ce58c177569d42b51772f7bb239a24a3darylm mid = (lo + hi) / 2; 5768b410d6e4ce58c177569d42b51772f7bb239a24a3darylm cmp = strcmp(confname, table[mid].name); 5769b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (cmp < 0) 5770b410d6e4ce58c177569d42b51772f7bb239a24a3darylm hi = mid; 5771b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else if (cmp > 0) 5772b410d6e4ce58c177569d42b51772f7bb239a24a3darylm lo = mid + 1; 5773b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 5774b410d6e4ce58c177569d42b51772f7bb239a24a3darylm *valuep = table[mid].value; 5775b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return 1; 5776b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5777b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5778b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_ValueError, "unrecognized configuration name"); 5779b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5780b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 5781b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyErr_SetString(PyExc_TypeError, 5782b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "configuration names must be strings or integers"); 5783b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return 0; 5784b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5785521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm#endif /* UEFI_C_SOURCE */ 5786b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5787b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF) 5788b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic struct constdef posix_constants_pathconf[] = { 5789b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_ABI_AIO_XFER_MAX 5790b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_ABI_AIO_XFER_MAX", _PC_ABI_AIO_XFER_MAX}, 5791b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5792b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_ABI_ASYNC_IO 5793b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_ABI_ASYNC_IO", _PC_ABI_ASYNC_IO}, 5794b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5795b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_ASYNC_IO 5796b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_ASYNC_IO", _PC_ASYNC_IO}, 5797b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5798b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_CHOWN_RESTRICTED 5799b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED}, 5800b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5801b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_FILESIZEBITS 5802b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_FILESIZEBITS", _PC_FILESIZEBITS}, 5803b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5804b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_LAST 5805b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_LAST", _PC_LAST}, 5806b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5807b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_LINK_MAX 5808b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_LINK_MAX", _PC_LINK_MAX}, 5809b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5810b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_MAX_CANON 5811b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_MAX_CANON", _PC_MAX_CANON}, 5812b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5813b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_MAX_INPUT 5814b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_MAX_INPUT", _PC_MAX_INPUT}, 5815b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5816b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_NAME_MAX 5817b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_NAME_MAX", _PC_NAME_MAX}, 5818b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5819b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_NO_TRUNC 5820b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_NO_TRUNC", _PC_NO_TRUNC}, 5821b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5822b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_PATH_MAX 5823b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_PATH_MAX", _PC_PATH_MAX}, 5824b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5825b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_PIPE_BUF 5826b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_PIPE_BUF", _PC_PIPE_BUF}, 5827b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5828b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_PRIO_IO 5829b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_PRIO_IO", _PC_PRIO_IO}, 5830b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5831b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_SOCK_MAXBUF 5832b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_SOCK_MAXBUF", _PC_SOCK_MAXBUF}, 5833b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5834b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_SYNC_IO 5835b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_SYNC_IO", _PC_SYNC_IO}, 5836b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5837b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _PC_VDISABLE 5838b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"PC_VDISABLE", _PC_VDISABLE}, 5839b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5840b410d6e4ce58c177569d42b51772f7bb239a24a3darylm}; 5841b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5842b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int 5843b410d6e4ce58c177569d42b51772f7bb239a24a3darylmconv_path_confname(PyObject *arg, int *valuep) 5844b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5845b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return conv_confname(arg, valuep, posix_constants_pathconf, 5846b410d6e4ce58c177569d42b51772f7bb239a24a3darylm sizeof(posix_constants_pathconf) 5847b410d6e4ce58c177569d42b51772f7bb239a24a3darylm / sizeof(struct constdef)); 5848b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5849b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5850b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5851b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FPATHCONF 5852b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_fpathconf__doc__, 5853b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"fpathconf(fd, name) -> integer\n\n\ 5854b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn the configuration limit name for the file descriptor fd.\n\ 5855b410d6e4ce58c177569d42b51772f7bb239a24a3darylmIf there is no limit, return -1."); 5856b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5857b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5858b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_fpathconf(PyObject *self, PyObject *args) 5859b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5860b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *result = NULL; 5861b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int name, fd; 5862b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5863b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyArg_ParseTuple(args, "iO&:fpathconf", &fd, 5864b410d6e4ce58c177569d42b51772f7bb239a24a3darylm conv_path_confname, &name)) { 5865b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long limit; 5866b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5867b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = 0; 5868b410d6e4ce58c177569d42b51772f7bb239a24a3darylm limit = fpathconf(fd, name); 5869b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (limit == -1 && errno != 0) 5870b410d6e4ce58c177569d42b51772f7bb239a24a3darylm posix_error(); 5871b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 5872b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = PyInt_FromLong(limit); 5873b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5874b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return result; 5875b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5876b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5877b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5878b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5879b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_PATHCONF 5880b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_pathconf__doc__, 5881b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"pathconf(path, name) -> integer\n\n\ 5882b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn the configuration limit name for the file or directory path.\n\ 5883b410d6e4ce58c177569d42b51772f7bb239a24a3darylmIf there is no limit, return -1."); 5884b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5885b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 5886b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_pathconf(PyObject *self, PyObject *args) 5887b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 5888b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *result = NULL; 5889b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int name; 5890b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *path; 5891b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5892b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyArg_ParseTuple(args, "sO&:pathconf", &path, 5893b410d6e4ce58c177569d42b51772f7bb239a24a3darylm conv_path_confname, &name)) { 5894b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long limit; 5895b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5896b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = 0; 5897b410d6e4ce58c177569d42b51772f7bb239a24a3darylm limit = pathconf(path, name); 5898b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (limit == -1 && errno != 0) { 5899b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (errno == EINVAL) 5900b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* could be a path or name problem */ 5901b410d6e4ce58c177569d42b51772f7bb239a24a3darylm posix_error(); 5902b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 5903b410d6e4ce58c177569d42b51772f7bb239a24a3darylm posix_error_with_filename(path); 5904b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5905b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 5906b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = PyInt_FromLong(limit); 5907b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 5908b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return result; 5909b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 5910b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5911b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 5912b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_CONFSTR 5913b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic struct constdef posix_constants_confstr[] = { 5914b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_ARCHITECTURE 5915b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_ARCHITECTURE", _CS_ARCHITECTURE}, 5916b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5917b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_HOSTNAME 5918b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_HOSTNAME", _CS_HOSTNAME}, 5919b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5920b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_HW_PROVIDER 5921b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_HW_PROVIDER", _CS_HW_PROVIDER}, 5922b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5923b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_HW_SERIAL 5924b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_HW_SERIAL", _CS_HW_SERIAL}, 5925b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5926b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_INITTAB_NAME 5927b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_INITTAB_NAME", _CS_INITTAB_NAME}, 5928b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5929b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_LFS64_CFLAGS 5930b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_LFS64_CFLAGS", _CS_LFS64_CFLAGS}, 5931b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5932b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_LFS64_LDFLAGS 5933b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_LFS64_LDFLAGS", _CS_LFS64_LDFLAGS}, 5934b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5935b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_LFS64_LIBS 5936b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_LFS64_LIBS", _CS_LFS64_LIBS}, 5937b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5938b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_LFS64_LINTFLAGS 5939b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS}, 5940b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5941b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_LFS_CFLAGS 5942b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_LFS_CFLAGS", _CS_LFS_CFLAGS}, 5943b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5944b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_LFS_LDFLAGS 5945b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_LFS_LDFLAGS", _CS_LFS_LDFLAGS}, 5946b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5947b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_LFS_LIBS 5948b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_LFS_LIBS", _CS_LFS_LIBS}, 5949b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5950b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_LFS_LINTFLAGS 5951b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_LFS_LINTFLAGS", _CS_LFS_LINTFLAGS}, 5952b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5953b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_MACHINE 5954b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_MACHINE", _CS_MACHINE}, 5955b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5956b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_PATH 5957b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_PATH", _CS_PATH}, 5958b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5959b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_RELEASE 5960b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_RELEASE", _CS_RELEASE}, 5961b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5962b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_SRPC_DOMAIN 5963b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_SRPC_DOMAIN", _CS_SRPC_DOMAIN}, 5964b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5965b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_SYSNAME 5966b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_SYSNAME", _CS_SYSNAME}, 5967b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5968b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_VERSION 5969b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_VERSION", _CS_VERSION}, 5970b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5971b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS 5972b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS}, 5973b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5974b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS 5975b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS}, 5976b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5977b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_ILP32_OFF32_LIBS 5978b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS}, 5979b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5980b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS 5981b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS}, 5982b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5983b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS 5984b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS}, 5985b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5986b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS 5987b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS}, 5988b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5989b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS 5990b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS}, 5991b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5992b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS 5993b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS}, 5994b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5995b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_LP64_OFF64_CFLAGS 5996b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS}, 5997b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 5998b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS 5999b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS}, 6000b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6001b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_LP64_OFF64_LIBS 6002b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS}, 6003b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6004b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS 6005b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS}, 6006b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6007b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS 6008b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS}, 6009b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6010b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS 6011b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS}, 6012b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6013b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS 6014b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS}, 6015b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6016b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS 6017b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"CS_XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS}, 6018b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6019b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _MIPS_CS_AVAIL_PROCESSORS 6020b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"MIPS_CS_AVAIL_PROCESSORS", _MIPS_CS_AVAIL_PROCESSORS}, 6021b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6022b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _MIPS_CS_BASE 6023b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"MIPS_CS_BASE", _MIPS_CS_BASE}, 6024b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6025b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _MIPS_CS_HOSTID 6026b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"MIPS_CS_HOSTID", _MIPS_CS_HOSTID}, 6027b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6028b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _MIPS_CS_HW_NAME 6029b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"MIPS_CS_HW_NAME", _MIPS_CS_HW_NAME}, 6030b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6031b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _MIPS_CS_NUM_PROCESSORS 6032b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"MIPS_CS_NUM_PROCESSORS", _MIPS_CS_NUM_PROCESSORS}, 6033b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6034b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _MIPS_CS_OSREL_MAJ 6035b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"MIPS_CS_OSREL_MAJ", _MIPS_CS_OSREL_MAJ}, 6036b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6037b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _MIPS_CS_OSREL_MIN 6038b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"MIPS_CS_OSREL_MIN", _MIPS_CS_OSREL_MIN}, 6039b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6040b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _MIPS_CS_OSREL_PATCH 6041b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"MIPS_CS_OSREL_PATCH", _MIPS_CS_OSREL_PATCH}, 6042b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6043b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _MIPS_CS_OS_NAME 6044b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"MIPS_CS_OS_NAME", _MIPS_CS_OS_NAME}, 6045b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6046b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _MIPS_CS_OS_PROVIDER 6047b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"MIPS_CS_OS_PROVIDER", _MIPS_CS_OS_PROVIDER}, 6048b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6049b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _MIPS_CS_PROCESSORS 6050b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"MIPS_CS_PROCESSORS", _MIPS_CS_PROCESSORS}, 6051b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6052b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _MIPS_CS_SERIAL 6053b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"MIPS_CS_SERIAL", _MIPS_CS_SERIAL}, 6054b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6055b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _MIPS_CS_VENDOR 6056b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"MIPS_CS_VENDOR", _MIPS_CS_VENDOR}, 6057b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6058b410d6e4ce58c177569d42b51772f7bb239a24a3darylm}; 6059b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6060b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int 6061b410d6e4ce58c177569d42b51772f7bb239a24a3darylmconv_confstr_confname(PyObject *arg, int *valuep) 6062b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 6063b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return conv_confname(arg, valuep, posix_constants_confstr, 6064b410d6e4ce58c177569d42b51772f7bb239a24a3darylm sizeof(posix_constants_confstr) 6065b410d6e4ce58c177569d42b51772f7bb239a24a3darylm / sizeof(struct constdef)); 6066b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 6067b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6068b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_confstr__doc__, 6069b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"confstr(name) -> string\n\n\ 6070b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn a string-valued system configuration variable."); 6071b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6072b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 6073b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_confstr(PyObject *self, PyObject *args) 6074b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 6075b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *result = NULL; 6076b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int name; 6077b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char buffer[256]; 6078b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6079b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) { 6080b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int len; 6081b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6082b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = 0; 6083b410d6e4ce58c177569d42b51772f7bb239a24a3darylm len = confstr(name, buffer, sizeof(buffer)); 6084b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (len == 0) { 6085b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (errno) { 6086b410d6e4ce58c177569d42b51772f7bb239a24a3darylm posix_error(); 6087b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 6088b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 6089b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = Py_None; 6090b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(Py_None); 6091b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 6092b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 6093b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else { 6094b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if ((unsigned int)len >= sizeof(buffer)) { 6095b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = PyString_FromStringAndSize(NULL, len-1); 6096b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (result != NULL) 6097b410d6e4ce58c177569d42b51772f7bb239a24a3darylm confstr(name, PyString_AS_STRING(result), len); 6098b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 6099b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 6100b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = PyString_FromStringAndSize(buffer, len-1); 6101b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 6102b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 6103b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return result; 6104b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 6105b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6106b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6107b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6108b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYSCONF 6109b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic struct constdef posix_constants_sysconf[] = { 6110b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_2_CHAR_TERM 6111b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_2_CHAR_TERM", _SC_2_CHAR_TERM}, 6112b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6113b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_2_C_BIND 6114b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_2_C_BIND", _SC_2_C_BIND}, 6115b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6116b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_2_C_DEV 6117b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_2_C_DEV", _SC_2_C_DEV}, 6118b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6119b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_2_C_VERSION 6120b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_2_C_VERSION", _SC_2_C_VERSION}, 6121b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6122b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_2_FORT_DEV 6123b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_2_FORT_DEV", _SC_2_FORT_DEV}, 6124b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6125b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_2_FORT_RUN 6126b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_2_FORT_RUN", _SC_2_FORT_RUN}, 6127b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6128b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_2_LOCALEDEF 6129b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_2_LOCALEDEF", _SC_2_LOCALEDEF}, 6130b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6131b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_2_SW_DEV 6132b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_2_SW_DEV", _SC_2_SW_DEV}, 6133b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6134b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_2_UPE 6135b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_2_UPE", _SC_2_UPE}, 6136b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6137b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_2_VERSION 6138b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_2_VERSION", _SC_2_VERSION}, 6139b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6140b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_ABI_ASYNCHRONOUS_IO 6141b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_ABI_ASYNCHRONOUS_IO", _SC_ABI_ASYNCHRONOUS_IO}, 6142b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6143b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_ACL 6144b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_ACL", _SC_ACL}, 6145b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6146b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_AIO_LISTIO_MAX 6147b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX}, 6148b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6149b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_AIO_MAX 6150b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_AIO_MAX", _SC_AIO_MAX}, 6151b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6152b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_AIO_PRIO_DELTA_MAX 6153b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX}, 6154b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6155b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_ARG_MAX 6156b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_ARG_MAX", _SC_ARG_MAX}, 6157b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6158b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_ASYNCHRONOUS_IO 6159b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO}, 6160b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6161b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_ATEXIT_MAX 6162b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_ATEXIT_MAX", _SC_ATEXIT_MAX}, 6163b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6164b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_AUDIT 6165b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_AUDIT", _SC_AUDIT}, 6166b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6167b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_AVPHYS_PAGES 6168b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES}, 6169b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6170b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_BC_BASE_MAX 6171b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_BC_BASE_MAX", _SC_BC_BASE_MAX}, 6172b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6173b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_BC_DIM_MAX 6174b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_BC_DIM_MAX", _SC_BC_DIM_MAX}, 6175b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6176b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_BC_SCALE_MAX 6177b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX}, 6178b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6179b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_BC_STRING_MAX 6180b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_BC_STRING_MAX", _SC_BC_STRING_MAX}, 6181b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6182b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_CAP 6183b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_CAP", _SC_CAP}, 6184b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6185b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_CHARCLASS_NAME_MAX 6186b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX}, 6187b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6188b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_CHAR_BIT 6189b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_CHAR_BIT", _SC_CHAR_BIT}, 6190b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6191b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_CHAR_MAX 6192b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_CHAR_MAX", _SC_CHAR_MAX}, 6193b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6194b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_CHAR_MIN 6195b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_CHAR_MIN", _SC_CHAR_MIN}, 6196b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6197b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_CHILD_MAX 6198b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_CHILD_MAX", _SC_CHILD_MAX}, 6199b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6200b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_CLK_TCK 6201b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_CLK_TCK", _SC_CLK_TCK}, 6202b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6203b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_COHER_BLKSZ 6204b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_COHER_BLKSZ", _SC_COHER_BLKSZ}, 6205b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6206b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_COLL_WEIGHTS_MAX 6207b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX}, 6208b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6209b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_DCACHE_ASSOC 6210b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_DCACHE_ASSOC", _SC_DCACHE_ASSOC}, 6211b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6212b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_DCACHE_BLKSZ 6213b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_DCACHE_BLKSZ", _SC_DCACHE_BLKSZ}, 6214b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6215b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_DCACHE_LINESZ 6216b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_DCACHE_LINESZ", _SC_DCACHE_LINESZ}, 6217b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6218b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_DCACHE_SZ 6219b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_DCACHE_SZ", _SC_DCACHE_SZ}, 6220b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6221b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_DCACHE_TBLKSZ 6222b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_DCACHE_TBLKSZ", _SC_DCACHE_TBLKSZ}, 6223b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6224b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_DELAYTIMER_MAX 6225b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_DELAYTIMER_MAX", _SC_DELAYTIMER_MAX}, 6226b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6227b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_EQUIV_CLASS_MAX 6228b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX}, 6229b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6230b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_EXPR_NEST_MAX 6231b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX}, 6232b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6233b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_FSYNC 6234b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_FSYNC", _SC_FSYNC}, 6235b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6236b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_GETGR_R_SIZE_MAX 6237b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_GETGR_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX}, 6238b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6239b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_GETPW_R_SIZE_MAX 6240b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX}, 6241b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6242b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_ICACHE_ASSOC 6243b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_ICACHE_ASSOC", _SC_ICACHE_ASSOC}, 6244b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6245b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_ICACHE_BLKSZ 6246b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_ICACHE_BLKSZ", _SC_ICACHE_BLKSZ}, 6247b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6248b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_ICACHE_LINESZ 6249b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_ICACHE_LINESZ", _SC_ICACHE_LINESZ}, 6250b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6251b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_ICACHE_SZ 6252b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_ICACHE_SZ", _SC_ICACHE_SZ}, 6253b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6254b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_INF 6255b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_INF", _SC_INF}, 6256b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6257b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_INT_MAX 6258b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_INT_MAX", _SC_INT_MAX}, 6259b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6260b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_INT_MIN 6261b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_INT_MIN", _SC_INT_MIN}, 6262b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6263b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_IOV_MAX 6264b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_IOV_MAX", _SC_IOV_MAX}, 6265b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6266b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_IP_SECOPTS 6267b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_IP_SECOPTS", _SC_IP_SECOPTS}, 6268b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6269b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_JOB_CONTROL 6270b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_JOB_CONTROL", _SC_JOB_CONTROL}, 6271b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6272b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_KERN_POINTERS 6273b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_KERN_POINTERS", _SC_KERN_POINTERS}, 6274b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6275b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_KERN_SIM 6276b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_KERN_SIM", _SC_KERN_SIM}, 6277b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6278b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_LINE_MAX 6279b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_LINE_MAX", _SC_LINE_MAX}, 6280b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6281b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_LOGIN_NAME_MAX 6282b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX}, 6283b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6284b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_LOGNAME_MAX 6285b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_LOGNAME_MAX", _SC_LOGNAME_MAX}, 6286b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6287b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_LONG_BIT 6288b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_LONG_BIT", _SC_LONG_BIT}, 6289b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6290b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_MAC 6291b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_MAC", _SC_MAC}, 6292b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6293b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_MAPPED_FILES 6294b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_MAPPED_FILES", _SC_MAPPED_FILES}, 6295b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6296b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_MAXPID 6297b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_MAXPID", _SC_MAXPID}, 6298b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6299b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_MB_LEN_MAX 6300b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_MB_LEN_MAX", _SC_MB_LEN_MAX}, 6301b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6302b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_MEMLOCK 6303b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_MEMLOCK", _SC_MEMLOCK}, 6304b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6305b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_MEMLOCK_RANGE 6306b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE}, 6307b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6308b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_MEMORY_PROTECTION 6309b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION}, 6310b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6311b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_MESSAGE_PASSING 6312b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_MESSAGE_PASSING", _SC_MESSAGE_PASSING}, 6313b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6314b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_MMAP_FIXED_ALIGNMENT 6315b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_MMAP_FIXED_ALIGNMENT", _SC_MMAP_FIXED_ALIGNMENT}, 6316b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6317b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_MQ_OPEN_MAX 6318b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_MQ_OPEN_MAX", _SC_MQ_OPEN_MAX}, 6319b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6320b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_MQ_PRIO_MAX 6321b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_MQ_PRIO_MAX", _SC_MQ_PRIO_MAX}, 6322b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6323b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_NACLS_MAX 6324b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_NACLS_MAX", _SC_NACLS_MAX}, 6325b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6326b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_NGROUPS_MAX 6327b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_NGROUPS_MAX", _SC_NGROUPS_MAX}, 6328b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6329b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_NL_ARGMAX 6330b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_NL_ARGMAX", _SC_NL_ARGMAX}, 6331b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6332b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_NL_LANGMAX 6333b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_NL_LANGMAX", _SC_NL_LANGMAX}, 6334b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6335b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_NL_MSGMAX 6336b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_NL_MSGMAX", _SC_NL_MSGMAX}, 6337b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6338b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_NL_NMAX 6339b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_NL_NMAX", _SC_NL_NMAX}, 6340b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6341b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_NL_SETMAX 6342b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_NL_SETMAX", _SC_NL_SETMAX}, 6343b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6344b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_NL_TEXTMAX 6345b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_NL_TEXTMAX", _SC_NL_TEXTMAX}, 6346b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6347b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_NPROCESSORS_CONF 6348b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF}, 6349b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6350b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_NPROCESSORS_ONLN 6351b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN}, 6352b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6353b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_NPROC_CONF 6354b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_NPROC_CONF", _SC_NPROC_CONF}, 6355b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6356b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_NPROC_ONLN 6357b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_NPROC_ONLN", _SC_NPROC_ONLN}, 6358b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6359b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_NZERO 6360b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_NZERO", _SC_NZERO}, 6361b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6362b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_OPEN_MAX 6363b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_OPEN_MAX", _SC_OPEN_MAX}, 6364b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6365b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PAGESIZE 6366b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PAGESIZE", _SC_PAGESIZE}, 6367b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6368b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PAGE_SIZE 6369b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PAGE_SIZE", _SC_PAGE_SIZE}, 6370b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6371b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PASS_MAX 6372b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PASS_MAX", _SC_PASS_MAX}, 6373b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6374b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PHYS_PAGES 6375b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PHYS_PAGES", _SC_PHYS_PAGES}, 6376b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6377b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PII 6378b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PII", _SC_PII}, 6379b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6380b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PII_INTERNET 6381b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PII_INTERNET", _SC_PII_INTERNET}, 6382b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6383b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PII_INTERNET_DGRAM 6384b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM}, 6385b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6386b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PII_INTERNET_STREAM 6387b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM}, 6388b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6389b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PII_OSI 6390b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PII_OSI", _SC_PII_OSI}, 6391b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6392b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PII_OSI_CLTS 6393b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PII_OSI_CLTS", _SC_PII_OSI_CLTS}, 6394b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6395b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PII_OSI_COTS 6396b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PII_OSI_COTS", _SC_PII_OSI_COTS}, 6397b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6398b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PII_OSI_M 6399b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PII_OSI_M", _SC_PII_OSI_M}, 6400b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6401b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PII_SOCKET 6402b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PII_SOCKET", _SC_PII_SOCKET}, 6403b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6404b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PII_XTI 6405b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PII_XTI", _SC_PII_XTI}, 6406b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6407b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_POLL 6408b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_POLL", _SC_POLL}, 6409b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6410b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PRIORITIZED_IO 6411b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PRIORITIZED_IO", _SC_PRIORITIZED_IO}, 6412b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6413b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_PRIORITY_SCHEDULING 6414b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING}, 6415b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6416b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_REALTIME_SIGNALS 6417b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS}, 6418b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6419b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_RE_DUP_MAX 6420b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_RE_DUP_MAX", _SC_RE_DUP_MAX}, 6421b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6422b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_RTSIG_MAX 6423b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_RTSIG_MAX", _SC_RTSIG_MAX}, 6424b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6425b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SAVED_IDS 6426b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SAVED_IDS", _SC_SAVED_IDS}, 6427b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6428b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SCHAR_MAX 6429b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SCHAR_MAX", _SC_SCHAR_MAX}, 6430b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6431b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SCHAR_MIN 6432b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SCHAR_MIN", _SC_SCHAR_MIN}, 6433b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6434b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SELECT 6435b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SELECT", _SC_SELECT}, 6436b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6437b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SEMAPHORES 6438b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SEMAPHORES", _SC_SEMAPHORES}, 6439b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6440b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SEM_NSEMS_MAX 6441b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX}, 6442b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6443b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SEM_VALUE_MAX 6444b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SEM_VALUE_MAX", _SC_SEM_VALUE_MAX}, 6445b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6446b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SHARED_MEMORY_OBJECTS 6447b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS}, 6448b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6449b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SHRT_MAX 6450b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SHRT_MAX", _SC_SHRT_MAX}, 6451b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6452b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SHRT_MIN 6453b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SHRT_MIN", _SC_SHRT_MIN}, 6454b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6455b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SIGQUEUE_MAX 6456b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX}, 6457b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6458b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SIGRT_MAX 6459b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SIGRT_MAX", _SC_SIGRT_MAX}, 6460b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6461b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SIGRT_MIN 6462b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SIGRT_MIN", _SC_SIGRT_MIN}, 6463b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6464b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SOFTPOWER 6465b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SOFTPOWER", _SC_SOFTPOWER}, 6466b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6467b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SPLIT_CACHE 6468b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SPLIT_CACHE", _SC_SPLIT_CACHE}, 6469b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6470b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SSIZE_MAX 6471b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SSIZE_MAX", _SC_SSIZE_MAX}, 6472b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6473b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_STACK_PROT 6474b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_STACK_PROT", _SC_STACK_PROT}, 6475b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6476b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_STREAM_MAX 6477b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_STREAM_MAX", _SC_STREAM_MAX}, 6478b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6479b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_SYNCHRONIZED_IO 6480b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO}, 6481b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6482b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_THREADS 6483b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_THREADS", _SC_THREADS}, 6484b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6485b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_THREAD_ATTR_STACKADDR 6486b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR}, 6487b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6488b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_THREAD_ATTR_STACKSIZE 6489b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE}, 6490b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6491b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS 6492b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS}, 6493b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6494b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_THREAD_KEYS_MAX 6495b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX}, 6496b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6497b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_THREAD_PRIORITY_SCHEDULING 6498b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING}, 6499b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6500b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_THREAD_PRIO_INHERIT 6501b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT}, 6502b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6503b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_THREAD_PRIO_PROTECT 6504b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT}, 6505b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6506b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_THREAD_PROCESS_SHARED 6507b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED}, 6508b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6509b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_THREAD_SAFE_FUNCTIONS 6510b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS}, 6511b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6512b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_THREAD_STACK_MIN 6513b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_THREAD_STACK_MIN", _SC_THREAD_STACK_MIN}, 6514b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6515b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_THREAD_THREADS_MAX 6516b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX}, 6517b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6518b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_TIMERS 6519b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_TIMERS", _SC_TIMERS}, 6520b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6521b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_TIMER_MAX 6522b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_TIMER_MAX", _SC_TIMER_MAX}, 6523b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6524b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_TTY_NAME_MAX 6525b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX}, 6526b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6527b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_TZNAME_MAX 6528b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_TZNAME_MAX", _SC_TZNAME_MAX}, 6529b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6530b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_T_IOV_MAX 6531b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_T_IOV_MAX", _SC_T_IOV_MAX}, 6532b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6533b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_UCHAR_MAX 6534b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_UCHAR_MAX", _SC_UCHAR_MAX}, 6535b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6536b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_UINT_MAX 6537b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_UINT_MAX", _SC_UINT_MAX}, 6538b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6539b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_UIO_MAXIOV 6540b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_UIO_MAXIOV", _SC_UIO_MAXIOV}, 6541b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6542b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_ULONG_MAX 6543b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_ULONG_MAX", _SC_ULONG_MAX}, 6544b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6545b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_USHRT_MAX 6546b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_USHRT_MAX", _SC_USHRT_MAX}, 6547b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6548b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_VERSION 6549b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_VERSION", _SC_VERSION}, 6550b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6551b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_WORD_BIT 6552b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_WORD_BIT", _SC_WORD_BIT}, 6553b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6554b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XBS5_ILP32_OFF32 6555b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32}, 6556b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6557b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XBS5_ILP32_OFFBIG 6558b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG}, 6559b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6560b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XBS5_LP64_OFF64 6561b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64}, 6562b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6563b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XBS5_LPBIG_OFFBIG 6564b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG}, 6565b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6566b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XOPEN_CRYPT 6567b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XOPEN_CRYPT", _SC_XOPEN_CRYPT}, 6568b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6569b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XOPEN_ENH_I18N 6570b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N}, 6571b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6572b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XOPEN_LEGACY 6573b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY}, 6574b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6575b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XOPEN_REALTIME 6576b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XOPEN_REALTIME", _SC_XOPEN_REALTIME}, 6577b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6578b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XOPEN_REALTIME_THREADS 6579b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS}, 6580b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6581b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XOPEN_SHM 6582b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XOPEN_SHM", _SC_XOPEN_SHM}, 6583b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6584b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XOPEN_UNIX 6585b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XOPEN_UNIX", _SC_XOPEN_UNIX}, 6586b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6587b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XOPEN_VERSION 6588b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XOPEN_VERSION", _SC_XOPEN_VERSION}, 6589b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6590b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XOPEN_XCU_VERSION 6591b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION}, 6592b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6593b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XOPEN_XPG2 6594b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XOPEN_XPG2", _SC_XOPEN_XPG2}, 6595b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6596b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XOPEN_XPG3 6597b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XOPEN_XPG3", _SC_XOPEN_XPG3}, 6598b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6599b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _SC_XOPEN_XPG4 6600b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"SC_XOPEN_XPG4", _SC_XOPEN_XPG4}, 6601b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6602b410d6e4ce58c177569d42b51772f7bb239a24a3darylm}; 6603b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6604b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int 6605b410d6e4ce58c177569d42b51772f7bb239a24a3darylmconv_sysconf_confname(PyObject *arg, int *valuep) 6606b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 6607b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return conv_confname(arg, valuep, posix_constants_sysconf, 6608b410d6e4ce58c177569d42b51772f7bb239a24a3darylm sizeof(posix_constants_sysconf) 6609b410d6e4ce58c177569d42b51772f7bb239a24a3darylm / sizeof(struct constdef)); 6610b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 6611b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6612b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_sysconf__doc__, 6613b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"sysconf(name) -> integer\n\n\ 6614b410d6e4ce58c177569d42b51772f7bb239a24a3darylmReturn an integer-valued system configuration variable."); 6615b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6616b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 6617b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_sysconf(PyObject *self, PyObject *args) 6618b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 6619b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *result = NULL; 6620b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int name; 6621b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6622b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (PyArg_ParseTuple(args, "O&:sysconf", conv_sysconf_confname, &name)) { 6623b410d6e4ce58c177569d42b51772f7bb239a24a3darylm int value; 6624b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6625b410d6e4ce58c177569d42b51772f7bb239a24a3darylm errno = 0; 6626b410d6e4ce58c177569d42b51772f7bb239a24a3darylm value = sysconf(name); 6627b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (value == -1 && errno != 0) 6628b410d6e4ce58c177569d42b51772f7bb239a24a3darylm posix_error(); 6629b410d6e4ce58c177569d42b51772f7bb239a24a3darylm else 6630b410d6e4ce58c177569d42b51772f7bb239a24a3darylm result = PyInt_FromLong(value); 6631b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 6632b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return result; 6633b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 6634b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6635b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6636b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6637521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF) || defined(HAVE_CONFSTR) || defined(HAVE_SYSCONF) 6638b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* This code is used to ensure that the tables of configuration value names 6639b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * are in sorted order as required by conv_confname(), and also to build the 6640b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * the exported dictionaries that are used to publish information about the 6641b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * names available on the host platform. 6642b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * 6643b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * Sorting the table at runtime ensures that the table is properly ordered 6644b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * when used, even for platforms we're not able to test on. It also makes 6645b410d6e4ce58c177569d42b51772f7bb239a24a3darylm * it easier to add additional entries to the tables. 6646b410d6e4ce58c177569d42b51772f7bb239a24a3darylm */ 6647b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6648b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int 6649b410d6e4ce58c177569d42b51772f7bb239a24a3darylmcmp_constdefs(const void *v1, const void *v2) 6650b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 6651b410d6e4ce58c177569d42b51772f7bb239a24a3darylm const struct constdef *c1 = 6652b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (const struct constdef *) v1; 6653b410d6e4ce58c177569d42b51772f7bb239a24a3darylm const struct constdef *c2 = 6654b410d6e4ce58c177569d42b51772f7bb239a24a3darylm (const struct constdef *) v2; 6655b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6656b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return strcmp(c1->name, c2->name); 6657b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 6658b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6659b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int 6660b410d6e4ce58c177569d42b51772f7bb239a24a3darylmsetup_confname_table(struct constdef *table, size_t tablesize, 6661b410d6e4ce58c177569d42b51772f7bb239a24a3darylm char *tablename, PyObject *module) 6662b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 6663b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *d = NULL; 6664b410d6e4ce58c177569d42b51772f7bb239a24a3darylm size_t i; 6665b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6666b410d6e4ce58c177569d42b51772f7bb239a24a3darylm qsort(table, tablesize, sizeof(struct constdef), cmp_constdefs); 6667b410d6e4ce58c177569d42b51772f7bb239a24a3darylm d = PyDict_New(); 6668b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (d == NULL) 6669b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return -1; 6670b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6671b410d6e4ce58c177569d42b51772f7bb239a24a3darylm for (i=0; i < tablesize; ++i) { 6672b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyObject *o = PyInt_FromLong(table[i].value); 6673b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (o == NULL || PyDict_SetItemString(d, table[i].name, o) == -1) { 6674b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XDECREF(o); 6675b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(d); 6676b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return -1; 6677b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 6678b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(o); 6679b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 6680b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyModule_AddObject(module, tablename, d); 6681b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 6682521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm#endif /* HAVE_FPATHCONF || HAVE_PATHCONF || HAVE_CONFSTR || HAVE_SYSCONF */ 6683b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6684b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* Return -1 on failure, 0 on success. */ 6685b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int 6686b410d6e4ce58c177569d42b51772f7bb239a24a3darylmsetup_confname_tables(PyObject *module) 6687b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 6688b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF) 6689b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setup_confname_table(posix_constants_pathconf, 6690b410d6e4ce58c177569d42b51772f7bb239a24a3darylm sizeof(posix_constants_pathconf) 6691b410d6e4ce58c177569d42b51772f7bb239a24a3darylm / sizeof(struct constdef), 6692b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "pathconf_names", module)) 6693b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return -1; 6694b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6695b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_CONFSTR 6696b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setup_confname_table(posix_constants_confstr, 6697b410d6e4ce58c177569d42b51772f7bb239a24a3darylm sizeof(posix_constants_confstr) 6698b410d6e4ce58c177569d42b51772f7bb239a24a3darylm / sizeof(struct constdef), 6699b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "confstr_names", module)) 6700b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return -1; 6701b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6702b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYSCONF 6703b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setup_confname_table(posix_constants_sysconf, 6704b410d6e4ce58c177569d42b51772f7bb239a24a3darylm sizeof(posix_constants_sysconf) 6705b410d6e4ce58c177569d42b51772f7bb239a24a3darylm / sizeof(struct constdef), 6706b410d6e4ce58c177569d42b51772f7bb239a24a3darylm "sysconf_names", module)) 6707b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return -1; 6708b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6709b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return 0; 6710b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 6711b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6712b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6713b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_abort__doc__, 6714b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"abort() -> does not return!\n\n\ 6715b410d6e4ce58c177569d42b51772f7bb239a24a3darylmAbort the interpreter immediately. This 'dumps core' or otherwise fails\n\ 6716b410d6e4ce58c177569d42b51772f7bb239a24a3darylmin the hardest way possible on the hosting operating system."); 6717b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6718b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject * 6719b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_abort(PyObject *self, PyObject *noargs) 6720b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 6721b410d6e4ce58c177569d42b51772f7bb239a24a3darylm abort(); 6722b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /*NOTREACHED*/ 6723b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_FatalError("abort() called from Python code didn't abort!"); 6724b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 6725b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 6726b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6727b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETRESUID 6728b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_setresuid__doc__, 6729b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"setresuid(ruid, euid, suid)\n\n\ 6730b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet the current process's real, effective, and saved user ids."); 6731b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6732b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject* 6733b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_setresuid (PyObject *self, PyObject *args) 6734b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 6735b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* We assume uid_t is no larger than a long. */ 6736b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long ruid, euid, suid; 6737b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "lll", &ruid, &euid, &suid)) 6738b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 6739b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setresuid(ruid, euid, suid) < 0) 6740b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 6741b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_RETURN_NONE; 6742b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 6743b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6744b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6745b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETRESGID 6746b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_setresgid__doc__, 6747b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"setresgid(rgid, egid, sgid)\n\n\ 6748b410d6e4ce58c177569d42b51772f7bb239a24a3darylmSet the current process's real, effective, and saved group ids."); 6749b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6750b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject* 6751b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_setresgid (PyObject *self, PyObject *args) 6752b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 6753b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* We assume uid_t is no larger than a long. */ 6754b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long rgid, egid, sgid; 6755b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!PyArg_ParseTuple(args, "lll", &rgid, &egid, &sgid)) 6756b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return NULL; 6757b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setresgid(rgid, egid, sgid) < 0) 6758b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 6759b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_RETURN_NONE; 6760b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 6761b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6762b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6763b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETRESUID 6764b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_getresuid__doc__, 6765b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"getresuid() -> (ruid, euid, suid)\n\n\ 6766b410d6e4ce58c177569d42b51772f7bb239a24a3darylmGet tuple of the current process's real, effective, and saved user ids."); 6767b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6768b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject* 6769b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_getresuid (PyObject *self, PyObject *noargs) 6770b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 6771b410d6e4ce58c177569d42b51772f7bb239a24a3darylm uid_t ruid, euid, suid; 6772b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long l_ruid, l_euid, l_suid; 6773b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (getresuid(&ruid, &euid, &suid) < 0) 6774b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 6775b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Force the values into long's as we don't know the size of uid_t. */ 6776b410d6e4ce58c177569d42b51772f7bb239a24a3darylm l_ruid = ruid; 6777b410d6e4ce58c177569d42b51772f7bb239a24a3darylm l_euid = euid; 6778b410d6e4ce58c177569d42b51772f7bb239a24a3darylm l_suid = suid; 6779b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("(lll)", l_ruid, l_euid, l_suid); 6780b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 6781b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6782b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6783b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETRESGID 6784b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyDoc_STRVAR(posix_getresgid__doc__, 6785b410d6e4ce58c177569d42b51772f7bb239a24a3darylm"getresgid() -> (rgid, egid, sgid)\n\n\ 6786b410d6e4ce58c177569d42b51772f7bb239a24a3darylmGet tuple of the current process's real, effective, and saved group ids."); 6787b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6788b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyObject* 6789b410d6e4ce58c177569d42b51772f7bb239a24a3darylmposix_getresgid (PyObject *self, PyObject *noargs) 6790b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 6791b410d6e4ce58c177569d42b51772f7bb239a24a3darylm uid_t rgid, egid, sgid; 6792b410d6e4ce58c177569d42b51772f7bb239a24a3darylm long l_rgid, l_egid, l_sgid; 6793b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (getresgid(&rgid, &egid, &sgid) < 0) 6794b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return posix_error(); 6795b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Force the values into long's as we don't know the size of uid_t. */ 6796b410d6e4ce58c177569d42b51772f7bb239a24a3darylm l_rgid = rgid; 6797b410d6e4ce58c177569d42b51772f7bb239a24a3darylm l_egid = egid; 6798b410d6e4ce58c177569d42b51772f7bb239a24a3darylm l_sgid = sgid; 6799b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return Py_BuildValue("(lll)", l_rgid, l_egid, l_sgid); 6800b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 6801b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6802b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 6803b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic PyMethodDef posix_methods[] = { 6804b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"access", posix_access, METH_VARARGS, posix_access__doc__}, 6805b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_TTYNAME 6806b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__}, 6807b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6808b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"chdir", posix_chdir, METH_VARARGS, posix_chdir__doc__}, 6809b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_CHFLAGS 6810b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"chflags", posix_chflags, METH_VARARGS, posix_chflags__doc__}, 6811b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_CHFLAGS */ 6812b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__}, 6813b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FCHMOD 6814b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"fchmod", posix_fchmod, METH_VARARGS, posix_fchmod__doc__}, 6815b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_FCHMOD */ 6816b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_CHOWN 6817b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"chown", posix_chown, METH_VARARGS, posix_chown__doc__}, 6818b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_CHOWN */ 6819b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_LCHMOD 6820b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"lchmod", posix_lchmod, METH_VARARGS, posix_lchmod__doc__}, 6821b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_LCHMOD */ 6822b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FCHOWN 6823b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"fchown", posix_fchown, METH_VARARGS, posix_fchown__doc__}, 6824b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_FCHOWN */ 6825b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_LCHFLAGS 6826b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"lchflags", posix_lchflags, METH_VARARGS, posix_lchflags__doc__}, 6827b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_LCHFLAGS */ 6828b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_LCHOWN 6829b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"lchown", posix_lchown, METH_VARARGS, posix_lchown__doc__}, 6830b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_LCHOWN */ 6831b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_CHROOT 6832b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"chroot", posix_chroot, METH_VARARGS, posix_chroot__doc__}, 6833b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6834b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_CTERMID 6835b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"ctermid", posix_ctermid, METH_NOARGS, posix_ctermid__doc__}, 6836b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6837b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETCWD 6838b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"getcwd", posix_getcwd, METH_NOARGS, posix_getcwd__doc__}, 6839b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef Py_USING_UNICODE 6840b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"getcwdu", posix_getcwdu, METH_NOARGS, posix_getcwdu__doc__}, 6841b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6842b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6843b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_LINK 6844b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"link", posix_link, METH_VARARGS, posix_link__doc__}, 6845b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_LINK */ 6846b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__}, 6847b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__}, 6848b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__}, 6849b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_NICE 6850b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"nice", posix_nice, METH_VARARGS, posix_nice__doc__}, 6851b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_NICE */ 6852b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_READLINK 6853b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"readlink", posix_readlink, METH_VARARGS, posix_readlink__doc__}, 6854b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_READLINK */ 6855b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"rename", posix_rename, METH_VARARGS, posix_rename__doc__}, 6856b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__}, 6857b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"stat", posix_stat, METH_VARARGS, posix_stat__doc__}, 6858b410d6e4ce58c177569d42b51772f7bb239a24a3darylm //{"stat_float_times", stat_float_times, METH_VARARGS, stat_float_times__doc__}, 6859b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYMLINK 6860b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"symlink", posix_symlink, METH_VARARGS, posix_symlink__doc__}, 6861b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SYMLINK */ 6862b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYSTEM 6863b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"system", posix_system, METH_VARARGS, posix_system__doc__}, 6864b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6865b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"umask", posix_umask, METH_VARARGS, posix_umask__doc__}, 6866b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_UNAME 6867b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"uname", posix_uname, METH_NOARGS, posix_uname__doc__}, 6868b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_UNAME */ 6869b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__}, 6870b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"remove", posix_unlink, METH_VARARGS, posix_remove__doc__}, 6871b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"utime", posix_utime, METH_VARARGS, posix_utime__doc__}, 6872b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_TIMES 6873b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"times", posix_times, METH_NOARGS, posix_times__doc__}, 6874b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_TIMES */ 6875b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"_exit", posix__exit, METH_VARARGS, posix__exit__doc__}, 6876b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_EXECV 6877b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"execv", posix_execv, METH_VARARGS, posix_execv__doc__}, 6878b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"execve", posix_execve, METH_VARARGS, posix_execve__doc__}, 6879b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_EXECV */ 6880b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SPAWNV 6881b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"spawnv", posix_spawnv, METH_VARARGS, posix_spawnv__doc__}, 6882b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"spawnve", posix_spawnve, METH_VARARGS, posix_spawnve__doc__}, 6883b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYOS_OS2) 6884b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"spawnvp", posix_spawnvp, METH_VARARGS, posix_spawnvp__doc__}, 6885b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"spawnvpe", posix_spawnvpe, METH_VARARGS, posix_spawnvpe__doc__}, 6886b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* PYOS_OS2 */ 6887b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SPAWNV */ 6888b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FORK1 6889b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"fork1", posix_fork1, METH_NOARGS, posix_fork1__doc__}, 6890b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_FORK1 */ 6891b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FORK 6892b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"fork", posix_fork, METH_NOARGS, posix_fork__doc__}, 6893b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_FORK */ 6894b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) 6895b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"openpty", posix_openpty, METH_NOARGS, posix_openpty__doc__}, 6896b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_OPENPTY || HAVE__GETPTY || HAVE_DEV_PTMX */ 6897b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FORKPTY 6898b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"forkpty", posix_forkpty, METH_NOARGS, posix_forkpty__doc__}, 6899b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_FORKPTY */ 6900b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETEGID 6901b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"getegid", posix_getegid, METH_NOARGS, posix_getegid__doc__}, 6902b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_GETEGID */ 6903b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETEUID 6904b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"geteuid", posix_geteuid, METH_NOARGS, posix_geteuid__doc__}, 6905b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_GETEUID */ 6906b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETGID 6907b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"getgid", posix_getgid, METH_NOARGS, posix_getgid__doc__}, 6908b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_GETGID */ 6909b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETGROUPS 6910b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"getgroups", posix_getgroups, METH_NOARGS, posix_getgroups__doc__}, 6911b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6912b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"getpid", posix_getpid, METH_NOARGS, posix_getpid__doc__}, 6913b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETPGRP 6914b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"getpgrp", posix_getpgrp, METH_NOARGS, posix_getpgrp__doc__}, 6915b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_GETPGRP */ 6916b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETPPID 6917b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"getppid", posix_getppid, METH_NOARGS, posix_getppid__doc__}, 6918b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_GETPPID */ 6919b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETUID 6920b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"getuid", posix_getuid, METH_NOARGS, posix_getuid__doc__}, 6921b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_GETUID */ 6922b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETLOGIN 6923b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"getlogin", posix_getlogin, METH_NOARGS, posix_getlogin__doc__}, 6924b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6925b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_KILL 6926b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"kill", posix_kill, METH_VARARGS, posix_kill__doc__}, 6927b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_KILL */ 6928b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_KILLPG 6929b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"killpg", posix_killpg, METH_VARARGS, posix_killpg__doc__}, 6930b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_KILLPG */ 6931b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_PLOCK 6932b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"plock", posix_plock, METH_VARARGS, posix_plock__doc__}, 6933b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_PLOCK */ 6934b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_POPEN 6935b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"popen", posix_popen, METH_VARARGS, posix_popen__doc__}, 6936b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef MS_WINDOWS 6937b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"popen2", win32_popen2, METH_VARARGS}, 6938b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"popen3", win32_popen3, METH_VARARGS}, 6939b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"popen4", win32_popen4, METH_VARARGS}, 6940b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"startfile", win32_startfile, METH_VARARGS, win32_startfile__doc__}, 6941b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"kill", win32_kill, METH_VARARGS, win32_kill__doc__}, 6942b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 6943b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYOS_OS2) && defined(PYCC_GCC) 6944b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"popen2", os2emx_popen2, METH_VARARGS}, 6945b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"popen3", os2emx_popen3, METH_VARARGS}, 6946b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"popen4", os2emx_popen4, METH_VARARGS}, 6947b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6948b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 6949b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_POPEN */ 6950b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETUID 6951b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__}, 6952b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETUID */ 6953b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETEUID 6954b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"seteuid", posix_seteuid, METH_VARARGS, posix_seteuid__doc__}, 6955b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETEUID */ 6956b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETEGID 6957b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"setegid", posix_setegid, METH_VARARGS, posix_setegid__doc__}, 6958b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETEGID */ 6959b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETREUID 6960b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"setreuid", posix_setreuid, METH_VARARGS, posix_setreuid__doc__}, 6961b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETREUID */ 6962b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETREGID 6963b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"setregid", posix_setregid, METH_VARARGS, posix_setregid__doc__}, 6964b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETREGID */ 6965b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETGID 6966b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"setgid", posix_setgid, METH_VARARGS, posix_setgid__doc__}, 6967b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETGID */ 6968b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETGROUPS 6969b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"setgroups", posix_setgroups, METH_O, posix_setgroups__doc__}, 6970b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETGROUPS */ 6971b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_INITGROUPS 6972b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"initgroups", posix_initgroups, METH_VARARGS, posix_initgroups__doc__}, 6973b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_INITGROUPS */ 6974b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETPGID 6975b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"getpgid", posix_getpgid, METH_VARARGS, posix_getpgid__doc__}, 6976b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_GETPGID */ 6977b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETPGRP 6978b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"setpgrp", posix_setpgrp, METH_NOARGS, posix_setpgrp__doc__}, 6979b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETPGRP */ 6980b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_WAIT 6981b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"wait", posix_wait, METH_NOARGS, posix_wait__doc__}, 6982b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_WAIT */ 6983b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_WAIT3 6984b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"wait3", posix_wait3, METH_VARARGS, posix_wait3__doc__}, 6985b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_WAIT3 */ 6986b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_WAIT4 6987b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"wait4", posix_wait4, METH_VARARGS, posix_wait4__doc__}, 6988b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_WAIT4 */ 6989b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_WAITPID) || defined(HAVE_CWAIT) 6990b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__}, 6991b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_WAITPID */ 6992b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETSID 6993b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"getsid", posix_getsid, METH_VARARGS, posix_getsid__doc__}, 6994b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_GETSID */ 6995b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETSID 6996b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"setsid", posix_setsid, METH_NOARGS, posix_setsid__doc__}, 6997b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETSID */ 6998b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETPGID 6999b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"setpgid", posix_setpgid, METH_VARARGS, posix_setpgid__doc__}, 7000b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SETPGID */ 7001b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_TCGETPGRP 7002b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"tcgetpgrp", posix_tcgetpgrp, METH_VARARGS, posix_tcgetpgrp__doc__}, 7003b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_TCGETPGRP */ 7004b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_TCSETPGRP 7005b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__}, 7006b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_TCSETPGRP */ 7007b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"open", posix_open, METH_VARARGS, posix_open__doc__}, 7008b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"close", posix_close, METH_VARARGS, posix_close__doc__}, 7009b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"closerange", posix_closerange, METH_VARARGS, posix_closerange__doc__}, 7010b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"dup", posix_dup, METH_VARARGS, posix_dup__doc__}, 7011b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__}, 7012b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__}, 7013b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"read", posix_read, METH_VARARGS, posix_read__doc__}, 7014b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"write", posix_write, METH_VARARGS, posix_write__doc__}, 7015b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__}, 7016b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"fdopen", posix_fdopen, METH_VARARGS, posix_fdopen__doc__}, 7017b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"isatty", posix_isatty, METH_VARARGS, posix_isatty__doc__}, 7018b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_PIPE 7019b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"pipe", posix_pipe, METH_NOARGS, posix_pipe__doc__}, 7020b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7021b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_MKFIFO 7022b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"mkfifo", posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__}, 7023b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7024b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV) 7025b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"mknod", posix_mknod, METH_VARARGS, posix_mknod__doc__}, 7026b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7027b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_DEVICE_MACROS 7028b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"major", posix_major, METH_VARARGS, posix_major__doc__}, 7029b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"minor", posix_minor, METH_VARARGS, posix_minor__doc__}, 7030b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"makedev", posix_makedev, METH_VARARGS, posix_makedev__doc__}, 7031b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7032b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FTRUNCATE 7033b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"ftruncate", posix_ftruncate, METH_VARARGS, posix_ftruncate__doc__}, 7034b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7035b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_PUTENV 7036b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"putenv", posix_putenv, METH_VARARGS, posix_putenv__doc__}, 7037b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7038b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_UNSETENV 7039b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"unsetenv", posix_unsetenv, METH_VARARGS, posix_unsetenv__doc__}, 7040b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7041b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"strerror", posix_strerror, METH_VARARGS, posix_strerror__doc__}, 7042b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FCHDIR 7043b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"fchdir", posix_fchdir, METH_O, posix_fchdir__doc__}, 7044b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7045b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FSYNC 7046b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"fsync", posix_fsync, METH_O, posix_fsync__doc__}, 7047b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7048b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FDATASYNC 7049b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"fdatasync", posix_fdatasync, METH_O, posix_fdatasync__doc__}, 7050b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7051b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYS_WAIT_H 7052b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WCOREDUMP 7053b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"WCOREDUMP", posix_WCOREDUMP, METH_VARARGS, posix_WCOREDUMP__doc__}, 7054b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WCOREDUMP */ 7055b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WIFCONTINUED 7056b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"WIFCONTINUED",posix_WIFCONTINUED, METH_VARARGS, posix_WIFCONTINUED__doc__}, 7057b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WIFCONTINUED */ 7058b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WIFSTOPPED 7059b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"WIFSTOPPED", posix_WIFSTOPPED, METH_VARARGS, posix_WIFSTOPPED__doc__}, 7060b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WIFSTOPPED */ 7061b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WIFSIGNALED 7062b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"WIFSIGNALED", posix_WIFSIGNALED, METH_VARARGS, posix_WIFSIGNALED__doc__}, 7063b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WIFSIGNALED */ 7064b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WIFEXITED 7065b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"WIFEXITED", posix_WIFEXITED, METH_VARARGS, posix_WIFEXITED__doc__}, 7066b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WIFEXITED */ 7067b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WEXITSTATUS 7068b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"WEXITSTATUS", posix_WEXITSTATUS, METH_VARARGS, posix_WEXITSTATUS__doc__}, 7069b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WEXITSTATUS */ 7070b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WTERMSIG 7071b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"WTERMSIG", posix_WTERMSIG, METH_VARARGS, posix_WTERMSIG__doc__}, 7072b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WTERMSIG */ 7073b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WSTOPSIG 7074b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"WSTOPSIG", posix_WSTOPSIG, METH_VARARGS, posix_WSTOPSIG__doc__}, 7075b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* WSTOPSIG */ 7076b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* HAVE_SYS_WAIT_H */ 7077b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H) 7078b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"fstatvfs", posix_fstatvfs, METH_VARARGS, posix_fstatvfs__doc__}, 7079b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7080b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H) 7081b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"statvfs", posix_statvfs, METH_VARARGS, posix_statvfs__doc__}, 7082b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7083b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_TMPFILE 7084b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"tmpfile", posix_tmpfile, METH_NOARGS, posix_tmpfile__doc__}, 7085b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7086b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_TEMPNAM 7087b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"tempnam", posix_tempnam, METH_VARARGS, posix_tempnam__doc__}, 7088b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7089b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_TMPNAM 7090b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"tmpnam", posix_tmpnam, METH_NOARGS, posix_tmpnam__doc__}, 7091b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7092b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_CONFSTR 7093b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"confstr", posix_confstr, METH_VARARGS, posix_confstr__doc__}, 7094b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7095b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SYSCONF 7096b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"sysconf", posix_sysconf, METH_VARARGS, posix_sysconf__doc__}, 7097b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7098b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_FPATHCONF 7099b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"fpathconf", posix_fpathconf, METH_VARARGS, posix_fpathconf__doc__}, 7100b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7101b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_PATHCONF 7102b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"pathconf", posix_pathconf, METH_VARARGS, posix_pathconf__doc__}, 7103b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7104b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"abort", posix_abort, METH_NOARGS, posix_abort__doc__}, 7105b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETRESUID 7106b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"setresuid", posix_setresuid, METH_VARARGS, posix_setresuid__doc__}, 7107b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7108b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SETRESGID 7109b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"setresgid", posix_setresgid, METH_VARARGS, posix_setresgid__doc__}, 7110b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7111b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETRESUID 7112b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"getresuid", posix_getresuid, METH_NOARGS, posix_getresuid__doc__}, 7113b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7114b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_GETRESGID 7115b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {"getresgid", posix_getresgid, METH_NOARGS, posix_getresgid__doc__}, 7116b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7117b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7118b410d6e4ce58c177569d42b51772f7bb239a24a3darylm {NULL, NULL} /* Sentinel */ 7119b410d6e4ce58c177569d42b51772f7bb239a24a3darylm}; 7120b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7121b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7122b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int 7123b410d6e4ce58c177569d42b51772f7bb239a24a3darylmins(PyObject *module, char *symbol, long value) 7124b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 7125b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return PyModule_AddIntConstant(module, symbol, value); 7126b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 7127b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7128b410d6e4ce58c177569d42b51772f7bb239a24a3darylmstatic int 7129b410d6e4ce58c177569d42b51772f7bb239a24a3darylmall_ins(PyObject *d) 7130b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 7131b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef F_OK 7132b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "F_OK", (long)F_OK)) return -1; 7133b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7134b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef R_OK 7135b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "R_OK", (long)R_OK)) return -1; 7136b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7137b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef W_OK 7138b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "W_OK", (long)W_OK)) return -1; 7139b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7140b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef X_OK 7141b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "X_OK", (long)X_OK)) return -1; 7142b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7143b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef NGROUPS_MAX 7144b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1; 7145b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7146b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef TMP_MAX 7147b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1; 7148b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7149b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WCONTINUED 7150b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "WCONTINUED", (long)WCONTINUED)) return -1; 7151b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7152b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WNOHANG 7153b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "WNOHANG", (long)WNOHANG)) return -1; 7154b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7155b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef WUNTRACED 7156b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "WUNTRACED", (long)WUNTRACED)) return -1; 7157b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7158b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_RDONLY 7159b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1; 7160b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7161b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_WRONLY 7162b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1; 7163b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7164b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_RDWR 7165b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_RDWR", (long)O_RDWR)) return -1; 7166b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7167b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_NDELAY 7168b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1; 7169b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7170b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_NONBLOCK 7171b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1; 7172b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7173b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_APPEND 7174b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_APPEND", (long)O_APPEND)) return -1; 7175b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7176b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_DSYNC 7177b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1; 7178b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7179b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_RSYNC 7180b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1; 7181b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7182b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_SYNC 7183b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_SYNC", (long)O_SYNC)) return -1; 7184b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7185b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_NOCTTY 7186b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1; 7187b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7188b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_CREAT 7189b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_CREAT", (long)O_CREAT)) return -1; 7190b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7191b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_EXCL 7192b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_EXCL", (long)O_EXCL)) return -1; 7193b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7194b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_TRUNC 7195b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1; 7196b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7197b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_BINARY 7198b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_BINARY", (long)O_BINARY)) return -1; 7199b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7200b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_TEXT 7201b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_TEXT", (long)O_TEXT)) return -1; 7202b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7203b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_LARGEFILE 7204b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_LARGEFILE", (long)O_LARGEFILE)) return -1; 7205b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7206b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_SHLOCK 7207b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_SHLOCK", (long)O_SHLOCK)) return -1; 7208b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7209b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_EXLOCK 7210b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_EXLOCK", (long)O_EXLOCK)) return -1; 7211b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7212b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7213b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* MS Windows */ 7214b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_NOINHERIT 7215b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Don't inherit in child processes. */ 7216b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_NOINHERIT", (long)O_NOINHERIT)) return -1; 7217b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7218b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef _O_SHORT_LIVED 7219b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Optimize for short life (keep in memory). */ 7220b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* MS forgot to define this one with a non-underscore form too. */ 7221b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_SHORT_LIVED", (long)_O_SHORT_LIVED)) return -1; 7222b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7223b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_TEMPORARY 7224b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Automatically delete when last handle is closed. */ 7225b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_TEMPORARY", (long)O_TEMPORARY)) return -1; 7226b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7227b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_RANDOM 7228b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Optimize for random access. */ 7229b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_RANDOM", (long)O_RANDOM)) return -1; 7230b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7231b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_SEQUENTIAL 7232b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Optimize for sequential access. */ 7233b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_SEQUENTIAL", (long)O_SEQUENTIAL)) return -1; 7234b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7235b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7236b410d6e4ce58c177569d42b51772f7bb239a24a3darylm/* GNU extensions. */ 7237b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_ASYNC 7238b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Send a SIGIO signal whenever input or output 7239b410d6e4ce58c177569d42b51772f7bb239a24a3darylm becomes available on file descriptor */ 7240b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_ASYNC", (long)O_ASYNC)) return -1; 7241b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7242b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_DIRECT 7243b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Direct disk access. */ 7244b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_DIRECT", (long)O_DIRECT)) return -1; 7245b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7246b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_DIRECTORY 7247b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Must be a directory. */ 7248b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_DIRECTORY", (long)O_DIRECTORY)) return -1; 7249b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7250b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_NOFOLLOW 7251b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Do not follow links. */ 7252b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_NOFOLLOW", (long)O_NOFOLLOW)) return -1; 7253b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7254b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef O_NOATIME 7255b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Do not update the access time. */ 7256b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "O_NOATIME", (long)O_NOATIME)) return -1; 7257b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7258b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7259b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* These come from sysexits.h */ 7260b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_OK 7261b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_OK", (long)EX_OK)) return -1; 7262b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_OK */ 7263b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_USAGE 7264b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_USAGE", (long)EX_USAGE)) return -1; 7265b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_USAGE */ 7266b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_DATAERR 7267b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_DATAERR", (long)EX_DATAERR)) return -1; 7268b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_DATAERR */ 7269b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_NOINPUT 7270b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_NOINPUT", (long)EX_NOINPUT)) return -1; 7271b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_NOINPUT */ 7272b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_NOUSER 7273b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_NOUSER", (long)EX_NOUSER)) return -1; 7274b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_NOUSER */ 7275b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_NOHOST 7276b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_NOHOST", (long)EX_NOHOST)) return -1; 7277b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_NOHOST */ 7278b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_UNAVAILABLE 7279b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_UNAVAILABLE", (long)EX_UNAVAILABLE)) return -1; 7280b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_UNAVAILABLE */ 7281b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_SOFTWARE 7282b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_SOFTWARE", (long)EX_SOFTWARE)) return -1; 7283b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_SOFTWARE */ 7284b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_OSERR 7285b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_OSERR", (long)EX_OSERR)) return -1; 7286b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_OSERR */ 7287b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_OSFILE 7288b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_OSFILE", (long)EX_OSFILE)) return -1; 7289b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_OSFILE */ 7290b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_CANTCREAT 7291b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_CANTCREAT", (long)EX_CANTCREAT)) return -1; 7292b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_CANTCREAT */ 7293b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_IOERR 7294b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_IOERR", (long)EX_IOERR)) return -1; 7295b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_IOERR */ 7296b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_TEMPFAIL 7297b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_TEMPFAIL", (long)EX_TEMPFAIL)) return -1; 7298b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_TEMPFAIL */ 7299b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_PROTOCOL 7300b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_PROTOCOL", (long)EX_PROTOCOL)) return -1; 7301b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_PROTOCOL */ 7302b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_NOPERM 7303b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_NOPERM", (long)EX_NOPERM)) return -1; 7304b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_NOPERM */ 7305b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_CONFIG 7306b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_CONFIG", (long)EX_CONFIG)) return -1; 7307b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_CONFIG */ 7308b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef EX_NOTFOUND 7309b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "EX_NOTFOUND", (long)EX_NOTFOUND)) return -1; 7310b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif /* EX_NOTFOUND */ 7311b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7312b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_SPAWNV 7313b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#if defined(PYOS_OS2) && defined(PYCC_GCC) 7314b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_WAIT", (long)P_WAIT)) return -1; 7315b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_NOWAIT", (long)P_NOWAIT)) return -1; 7316b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_OVERLAY", (long)P_OVERLAY)) return -1; 7317b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_DEBUG", (long)P_DEBUG)) return -1; 7318b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_SESSION", (long)P_SESSION)) return -1; 7319b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_DETACH", (long)P_DETACH)) return -1; 7320b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_PM", (long)P_PM)) return -1; 7321b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_DEFAULT", (long)P_DEFAULT)) return -1; 7322b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_MINIMIZE", (long)P_MINIMIZE)) return -1; 7323b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_MAXIMIZE", (long)P_MAXIMIZE)) return -1; 7324b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_FULLSCREEN", (long)P_FULLSCREEN)) return -1; 7325b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_WINDOWED", (long)P_WINDOWED)) return -1; 7326b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_FOREGROUND", (long)P_FOREGROUND)) return -1; 7327b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_BACKGROUND", (long)P_BACKGROUND)) return -1; 7328b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_NOCLOSE", (long)P_NOCLOSE)) return -1; 7329b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_NOSESSION", (long)P_NOSESSION)) return -1; 7330b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_QUOTE", (long)P_QUOTE)) return -1; 7331b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_TILDE", (long)P_TILDE)) return -1; 7332b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_UNRELATED", (long)P_UNRELATED)) return -1; 7333b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_DEBUGDESC", (long)P_DEBUGDESC)) return -1; 7334b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#else 7335b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1; 7336b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1; 7337b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1; 7338b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1; 7339b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1; 7340b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7341b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7342b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return 0; 7343b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 7344b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7345b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define INITFUNC initedk2 7346b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#define MODNAME "edk2" 7347b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7348b410d6e4ce58c177569d42b51772f7bb239a24a3darylmPyMODINIT_FUNC 7349b410d6e4ce58c177569d42b51772f7bb239a24a3darylmINITFUNC(void) 7350b410d6e4ce58c177569d42b51772f7bb239a24a3darylm{ 7351521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm PyObject *m; 7352521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm 7353521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm#ifndef UEFI_C_SOURCE 7354521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm PyObject *v; 7355521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm#endif 7356b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7357b410d6e4ce58c177569d42b51772f7bb239a24a3darylm m = Py_InitModule3(MODNAME, 7358b410d6e4ce58c177569d42b51772f7bb239a24a3darylm posix_methods, 7359521527e0b63910d6d4d0d011e86738f21fbd32bfdarylm edk2__doc__); 7360b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (m == NULL) 7361b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return; 7362b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7363d78fab6b4e9be83b781212f6a9f3fde0c092e81ddarylm#ifndef UEFI_C_SOURCE 7364b410d6e4ce58c177569d42b51772f7bb239a24a3darylm /* Initialize environ dictionary */ 7365b410d6e4ce58c177569d42b51772f7bb239a24a3darylm v = convertenviron(); 7366b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_XINCREF(v); 7367b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (v == NULL || PyModule_AddObject(m, "environ", v) != 0) 7368b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return; 7369b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_DECREF(v); 7370d78fab6b4e9be83b781212f6a9f3fde0c092e81ddarylm#endif /* UEFI_C_SOURCE */ 7371b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7372b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (all_ins(m)) 7373b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return; 7374b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7375b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (setup_confname_tables(m)) 7376b410d6e4ce58c177569d42b51772f7bb239a24a3darylm return; 7377b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7378b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF(PyExc_OSError); 7379b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyModule_AddObject(m, "error", PyExc_OSError); 7380b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7381b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef HAVE_PUTENV 7382b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (posix_putenv_garbage == NULL) 7383b410d6e4ce58c177569d42b51772f7bb239a24a3darylm posix_putenv_garbage = PyDict_New(); 7384b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7385b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7386b410d6e4ce58c177569d42b51772f7bb239a24a3darylm if (!initialized) { 7387b410d6e4ce58c177569d42b51772f7bb239a24a3darylm stat_result_desc.name = MODNAME ".stat_result"; 7388b410d6e4ce58c177569d42b51772f7bb239a24a3darylm stat_result_desc.fields[2].name = PyStructSequence_UnnamedField; 7389b410d6e4ce58c177569d42b51772f7bb239a24a3darylm stat_result_desc.fields[3].name = PyStructSequence_UnnamedField; 7390b410d6e4ce58c177569d42b51772f7bb239a24a3darylm stat_result_desc.fields[4].name = PyStructSequence_UnnamedField; 7391b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyStructSequence_InitType(&StatResultType, &stat_result_desc); 7392b410d6e4ce58c177569d42b51772f7bb239a24a3darylm structseq_new = StatResultType.tp_new; 7393b410d6e4ce58c177569d42b51772f7bb239a24a3darylm StatResultType.tp_new = statresult_new; 7394b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7395b410d6e4ce58c177569d42b51772f7bb239a24a3darylm //statvfs_result_desc.name = MODNAME ".statvfs_result"; 7396b410d6e4ce58c177569d42b51772f7bb239a24a3darylm //PyStructSequence_InitType(&StatVFSResultType, &statvfs_result_desc); 7397b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef NEED_TICKS_PER_SECOND 7398b410d6e4ce58c177569d42b51772f7bb239a24a3darylm# if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK) 7399b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ticks_per_second = sysconf(_SC_CLK_TCK); 7400b410d6e4ce58c177569d42b51772f7bb239a24a3darylm# elif defined(HZ) 7401b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ticks_per_second = HZ; 7402b410d6e4ce58c177569d42b51772f7bb239a24a3darylm# else 7403b410d6e4ce58c177569d42b51772f7bb239a24a3darylm ticks_per_second = 60; /* magic fallback value; may be bogus */ 7404b410d6e4ce58c177569d42b51772f7bb239a24a3darylm# endif 7405b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7406b410d6e4ce58c177569d42b51772f7bb239a24a3darylm } 7407b410d6e4ce58c177569d42b51772f7bb239a24a3darylm Py_INCREF((PyObject*) &StatResultType); 7408b410d6e4ce58c177569d42b51772f7bb239a24a3darylm PyModule_AddObject(m, "stat_result", (PyObject*) &StatResultType); 7409b410d6e4ce58c177569d42b51772f7bb239a24a3darylm //Py_INCREF((PyObject*) &StatVFSResultType); 7410b410d6e4ce58c177569d42b51772f7bb239a24a3darylm //PyModule_AddObject(m, "statvfs_result", 7411b410d6e4ce58c177569d42b51772f7bb239a24a3darylm // (PyObject*) &StatVFSResultType); 7412b410d6e4ce58c177569d42b51772f7bb239a24a3darylm initialized = 1; 7413b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7414b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 7415b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7416b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#ifdef __cplusplus 7417b410d6e4ce58c177569d42b51772f7bb239a24a3darylm} 7418b410d6e4ce58c177569d42b51772f7bb239a24a3darylm#endif 7419b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7420b410d6e4ce58c177569d42b51772f7bb239a24a3darylm 7421