13ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/** @file 23ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel OS-specific module implementation for EDK II and UEFI. 33ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Derived from posixmodule.c in Python 2.7.2. 43ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 55285ac3eba73d3f6ad8cf356a0a8815fe97b3cf3Daryl McDaniel Copyright (c) 2015, Daryl McDaniel. All rights reserved.<BR> 63ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Copyright (c) 2011 - 2012, Intel Corporation. All rights reserved.<BR> 73ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel This program and the accompanying materials are licensed and made available under 83ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel the terms and conditions of the BSD License that accompanies this distribution. 93ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel The full text of the license may be found at 103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel http://opensource.org/licenses/bsd-license. 113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel**/ 153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define PY_SSIZE_T_CLEAN 163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#include "Python.h" 183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#include "structseq.h" 193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#include <stdio.h> 213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#include <stdlib.h> 223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#include <wchar.h> 233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#include <sys/syslimits.h> 243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef __cplusplus 263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielextern "C" { 273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielPyDoc_STRVAR(edk2__doc__, 303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "This module provides access to UEFI firmware functionality that is\n\ 313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel standardized by the C Standard and the POSIX standard (a thinly\n\ 323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel disguised Unix interface). Refer to the library manual and\n\ 333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel corresponding UEFI Specification entries for more information on calls."); 343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifndef Py_USING_UNICODE 363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* This is used in signatures of functions. */ 373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define Py_UNICODE void 383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYS_TYPES_H 413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <sys/types.h> 423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SYS_TYPES_H */ 433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYS_STAT_H 453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <sys/stat.h> 463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SYS_STAT_H */ 473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYS_WAIT_H 493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <sys/wait.h> /* For WNOHANG */ 503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SIGNAL_H 533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <signal.h> 543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FCNTL_H 573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <fcntl.h> 583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_FCNTL_H */ 593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_GRP_H 613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <grp.h> 623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYSEXITS_H 653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <sysexits.h> 663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SYSEXITS_H */ 673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYS_LOADAVG_H 693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <sys/loadavg.h> 703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_UTIME_H 733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <utime.h> 743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_UTIME_H */ 753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYS_UTIME_H 773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <sys/utime.h> 783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define HAVE_UTIME_H /* pretend we do for the rest of this file */ 793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SYS_UTIME_H */ 803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYS_TIMES_H 823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <sys/times.h> 833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SYS_TIMES_H */ 843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYS_PARAM_H 863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <sys/param.h> 873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SYS_PARAM_H */ 883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYS_UTSNAME_H 903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <sys/utsname.h> 913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SYS_UTSNAME_H */ 923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_DIRENT_H 943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <dirent.h> 953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define NAMLEN(dirent) wcslen((dirent)->FileName) 963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define dirent direct 983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define NAMLEN(dirent) (dirent)->d_namlen 993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #ifdef HAVE_SYS_NDIR_H 1003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <sys/ndir.h> 1013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #endif 1023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #ifdef HAVE_SYS_DIR_H 1033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <sys/dir.h> 1043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #endif 1053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #ifdef HAVE_NDIR_H 1063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #include <ndir.h> 1073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #endif 1083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 1093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifndef MAXPATHLEN 1113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #if defined(PATH_MAX) && PATH_MAX > 1024 1123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define MAXPATHLEN PATH_MAX 1133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #else 1143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define MAXPATHLEN 1024 1153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #endif 1163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* MAXPATHLEN */ 1173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define WAIT_TYPE int 1193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define WAIT_STATUS_INT(s) (s) 1203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* Issue #1983: pid_t can be longer than a C long on some systems */ 1223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if !defined(SIZEOF_PID_T) || SIZEOF_PID_T == SIZEOF_INT 1233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define PARSE_PID "i" 1243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define PyLong_FromPid PyInt_FromLong 1253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define PyLong_AsPid PyInt_AsLong 1263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#elif SIZEOF_PID_T == SIZEOF_LONG 1273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define PARSE_PID "l" 1283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define PyLong_FromPid PyInt_FromLong 1293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define PyLong_AsPid PyInt_AsLong 1303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#elif defined(SIZEOF_LONG_LONG) && SIZEOF_PID_T == SIZEOF_LONG_LONG 1313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define PARSE_PID "L" 1323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define PyLong_FromPid PyLong_FromLongLong 1333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define PyLong_AsPid PyInt_AsLongLong 1343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 1353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)" 1363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* SIZEOF_PID_T */ 1373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* Don't use the "_r" form if we don't need it (also, won't have a 1393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel prototype for it, at least on Solaris -- maybe others as well?). */ 1403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_CTERMID_R) && defined(WITH_THREAD) 1413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define USE_CTERMID_R 1423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 1433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_TMPNAM_R) && defined(WITH_THREAD) 1453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define USE_TMPNAM_R 1463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 1473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* choose the appropriate stat and fstat functions and return structs */ 1493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#undef STAT 1503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#undef FSTAT 1513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#undef STRUCT_STAT 1523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define STAT stat 1533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define FSTAT fstat 1543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define STRUCT_STAT struct stat 1553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* dummy version. _PyVerify_fd() is already defined in fileobject.h */ 1573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define _PyVerify_fd_dup2(A, B) (1) 1583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifndef UEFI_C_SOURCE 1603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* Return a dictionary corresponding to the POSIX environment table */ 1613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielextern char **environ; 1623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 1633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 1643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielconvertenviron(void) 1653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 1663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *d; 1673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char **e; 1683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel d = PyDict_New(); 1693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (d == NULL) 1703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 1713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (environ == NULL) 1723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return d; 1733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* This part ignores errors */ 1743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for (e = environ; *e != NULL; e++) { 1753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *k; 1763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *v; 1773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *p = strchr(*e, '='); 1783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (p == NULL) 1793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel continue; 1803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel k = PyString_FromStringAndSize(*e, (int)(p-*e)); 1813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (k == NULL) { 1823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_Clear(); 1833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel continue; 1843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 1853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel v = PyString_FromString(p+1); 1863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (v == NULL) { 1873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_Clear(); 1883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(k); 1893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel continue; 1903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 1913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (PyDict_GetItem(d, k) == NULL) { 1923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (PyDict_SetItem(d, k, v) != 0) 1933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_Clear(); 1943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 1953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(k); 1963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(v); 1973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 1983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return d; 1993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 2003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* UEFI_C_SOURCE */ 2013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* Set a POSIX-specific error from errno, and return NULL */ 2033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 20542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_error(void) 2063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyErr_SetFromErrno(PyExc_OSError); 2083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 2093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 21042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_error_with_filename(char* name) 2113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name); 2133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 2143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 21742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_error_with_allocated_filename(char* name) 2183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *rc = PyErr_SetFromErrnoWithFilename(PyExc_OSError, name); 2203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(name); 2213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return rc; 2223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 2233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* POSIX generic methods */ 2253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifndef UEFI_C_SOURCE 2273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel static PyObject * 22842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel edk2_fildes(PyObject *fdobj, int (*func)(int)) 2293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel { 2303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int fd; 2313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int res; 2323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fd = PyObject_AsFileDescriptor(fdobj); 2333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (fd < 0) 2343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 2353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!_PyVerify_fd(fd)) 23642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 2383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = (*func)(fd); 2393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 2403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res < 0) 24142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 2433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 2443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 2453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* UEFI_C_SOURCE */ 2463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 24842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_1str(PyObject *args, char *format, int (*func)(const char*)) 2493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path1 = NULL; 2513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int res; 2523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, format, 2533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, &path1)) 2543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 2553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 2563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = (*func)(path1); 2573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 2583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res < 0) 25942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error_with_allocated_filename(path1); 2603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path1); 2613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 2623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 2633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 2643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 26642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_2str(PyObject *args, 2673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *format, 2683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int (*func)(const char *, const char *)) 2693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path1 = NULL, *path2 = NULL; 2713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int res; 2723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, format, 2733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, &path1, 2743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, &path2)) 2753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 2763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 2773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = (*func)(path1, path2); 2783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 2793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path1); 2803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path2); 2813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res != 0) 2823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* XXX how to report both path1 and path2??? */ 28342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 2853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 2863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 2873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielPyDoc_STRVAR(stat_result__doc__, 2893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"stat_result: Result from stat or lstat.\n\n\ 2903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielThis object may be accessed either as a tuple of\n\ 2913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\ 2923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielor via the attributes st_mode, st_ino, st_dev, st_nlink, st_uid, and so on.\n\ 2933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel\n\ 2943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielPosix/windows: If your platform supports st_blksize, st_blocks, st_rdev,\n\ 2953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielor st_flags, they are available as attributes only.\n\ 2963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel\n\ 2973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielSee os.stat for more information."); 2983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyStructSequence_Field stat_result_fields[] = { 3003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"st_mode", "protection bits"}, 3013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel //{"st_ino", "inode"}, 3023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel //{"st_dev", "device"}, 3033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel //{"st_nlink", "number of hard links"}, 3043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel //{"st_uid", "user ID of owner"}, 3053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel //{"st_gid", "group ID of owner"}, 3063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"st_size", "total size, in bytes"}, 3073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* The NULL is replaced with PyStructSequence_UnnamedField later. */ 3083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {NULL, "integer time of last access"}, 3093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {NULL, "integer time of last modification"}, 3103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {NULL, "integer time of last change"}, 3113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"st_atime", "time of last access"}, 3123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"st_mtime", "time of last modification"}, 3133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"st_ctime", "time of last change"}, 3143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE 3153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"st_blksize", "blocksize for filesystem I/O"}, 3163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 3173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_BLOCKS 3183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"st_blocks", "number of blocks allocated"}, 3193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 3203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_RDEV 3213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"st_rdev", "device type (if inode device)"}, 3223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 3233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_FLAGS 3243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"st_flags", "user defined flags for file"}, 3253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 3263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_GEN 3273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"st_gen", "generation number"}, 3283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 3293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME 3303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"st_birthtime", "time of creation"}, 3313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 3323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {0} 3333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel}; 3343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE 3363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ST_BLKSIZE_IDX 8 3373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 3383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ST_BLKSIZE_IDX 12 3393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 3403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_BLOCKS 3423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ST_BLOCKS_IDX (ST_BLKSIZE_IDX+1) 3433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 3443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ST_BLOCKS_IDX ST_BLKSIZE_IDX 3453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 3463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_RDEV 3483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ST_RDEV_IDX (ST_BLOCKS_IDX+1) 3493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 3503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ST_RDEV_IDX ST_BLOCKS_IDX 3513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 3523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_FLAGS 3543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ST_FLAGS_IDX (ST_RDEV_IDX+1) 3553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 3563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ST_FLAGS_IDX ST_RDEV_IDX 3573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 3583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_GEN 3603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ST_GEN_IDX (ST_FLAGS_IDX+1) 3613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 3623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ST_GEN_IDX ST_FLAGS_IDX 3633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 3643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME 3663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ST_BIRTHTIME_IDX (ST_GEN_IDX+1) 3673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 3683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ST_BIRTHTIME_IDX ST_GEN_IDX 3693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 3703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyStructSequence_Desc stat_result_desc = { 3723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "stat_result", /* name */ 3733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel stat_result__doc__, /* doc */ 3743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel stat_result_fields, 3753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 10 3763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel}; 3773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifndef UEFI_C_SOURCE /* Not in UEFI */ 3793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielPyDoc_STRVAR(statvfs_result__doc__, 3803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"statvfs_result: Result from statvfs or fstatvfs.\n\n\ 3813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielThis object may be accessed either as a tuple of\n\ 3823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax),\n\ 3833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielor via the attributes f_bsize, f_frsize, f_blocks, f_bfree, and so on.\n\ 3843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel\n\ 3853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielSee os.statvfs for more information."); 3863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyStructSequence_Field statvfs_result_fields[] = { 3883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"f_bsize", }, 3893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"f_frsize", }, 3903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"f_blocks", }, 3913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"f_bfree", }, 3923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"f_bavail", }, 3933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"f_files", }, 3943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"f_ffree", }, 3953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"f_favail", }, 3963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"f_flag", }, 3973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {"f_namemax",}, 3983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {0} 3993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel}; 4003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyStructSequence_Desc statvfs_result_desc = { 4023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "statvfs_result", /* name */ 4033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel statvfs_result__doc__, /* doc */ 4043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel statvfs_result_fields, 4053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 10 4063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel}; 4073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyTypeObject StatVFSResultType; 4093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 4103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic int initialized; 4123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyTypeObject StatResultType; 4133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic newfunc structseq_new; 4143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 4163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatresult_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 4173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 4183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyStructSequence *result; 4193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int i; 4203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel result = (PyStructSequence*)structseq_new(type, args, kwds); 4223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!result) 4233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 4243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* If we have been initialized from a tuple, 4253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel st_?time might be set to None. Initialize it 4263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel from the int slots. */ 4273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for (i = 7; i <= 9; i++) { 4283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (result->ob_item[i+3] == Py_None) { 4293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(Py_None); 4303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(result->ob_item[i]); 4313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel result->ob_item[i+3] = result->ob_item[i]; 4323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 4333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 4343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return (PyObject*)result; 4353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 4363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* If true, st_?time is float. */ 4403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(UEFI_C_SOURCE) 4413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel static int _stat_float_times = 0; 4423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 4433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel static int _stat_float_times = 1; 4443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielPyDoc_STRVAR(stat_float_times__doc__, 4463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"stat_float_times([newval]) -> oldval\n\n\ 4473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielDetermine whether os.[lf]stat represents time stamps as float objects.\n\ 4483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielIf newval is True, future calls to stat() return floats, if it is False,\n\ 4493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielfuture calls return ints. \n\ 4503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielIf newval is omitted, return the current setting.\n"); 4513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject* 4533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstat_float_times(PyObject* self, PyObject *args) 4543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 4553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int newval = -1; 4563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "|i:stat_float_times", &newval)) 4583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 4593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (newval == -1) 4603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Return old value */ 4613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyBool_FromLong(_stat_float_times); 4623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel _stat_float_times = newval; 4633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 4643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 4653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 4663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* UEFI_C_SOURCE */ 4673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic void 4693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielfill_time(PyObject *v, int index, time_t sec, unsigned long nsec) 4703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 4713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *fval,*ival; 4723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if SIZEOF_TIME_T > SIZEOF_LONG 4733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel ival = PyLong_FromLongLong((PY_LONG_LONG)sec); 4743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 4753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel ival = PyInt_FromLong((long)sec); 4763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 4773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!ival) 4783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return; 4793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (_stat_float_times) { 4803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fval = PyFloat_FromDouble(sec + 1e-9*nsec); 4813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } else { 4823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fval = ival; 4833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(fval); 4843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 4853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyStructSequence_SET_ITEM(v, index, ival); 4863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyStructSequence_SET_ITEM(v, index+3, fval); 4873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 4883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* pack a system stat C structure into the Python stat tuple 49042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel (used by edk2_stat() and edk2_fstat()) */ 4913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject* 4923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel_pystat_fromstructstat(STRUCT_STAT *st) 4933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 4943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel unsigned long ansec, mnsec, cnsec; 4953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *v = PyStructSequence_New(&StatResultType); 4963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (v == NULL) 4973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 4983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyStructSequence_SET_ITEM(v, 0, PyInt_FromLong((long)st->st_mode)); 5003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyStructSequence_SET_ITEM(v, 1, 5013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyLong_FromLongLong((PY_LONG_LONG)st->st_size)); 5023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 5033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel ansec = mnsec = cnsec = 0; 5043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* The index used by fill_time is the index of the integer time. 5053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fill_time will add 3 to the index to get the floating time index. 5063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel */ 5073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fill_time(v, 2, st->st_atime, ansec); 5083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fill_time(v, 3, st->st_mtime, mnsec); 5093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fill_time(v, 4, st->st_mtime, cnsec); 5103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 5113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE 5123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyStructSequence_SET_ITEM(v, ST_BLKSIZE_IDX, 5133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyInt_FromLong((long)st->st_blksize)); 5143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 5153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_BLOCKS 5163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyStructSequence_SET_ITEM(v, ST_BLOCKS_IDX, 5173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyInt_FromLong((long)st->st_blocks)); 5183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 5193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_RDEV 5203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyStructSequence_SET_ITEM(v, ST_RDEV_IDX, 5213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyInt_FromLong((long)st->st_rdev)); 5223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 5233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_GEN 5243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyStructSequence_SET_ITEM(v, ST_GEN_IDX, 5253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyInt_FromLong((long)st->st_gen)); 5263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 5273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME 5283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel { 5293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *val; 5303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel unsigned long bsec,bnsec; 5313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel bsec = (long)st->st_birthtime; 5323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STAT_TV_NSEC2 5333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel bnsec = st->st_birthtimespec.tv_nsec; 5343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 5353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel bnsec = 0; 5363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 5373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (_stat_float_times) { 5383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel val = PyFloat_FromDouble(bsec + 1e-9*bnsec); 5393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } else { 5403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel val = PyInt_FromLong((long)bsec); 5413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 5423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyStructSequence_SET_ITEM(v, ST_BIRTHTIME_IDX, 5433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel val); 5443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 5453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 5463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STRUCT_STAT_ST_FLAGS 5473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyStructSequence_SET_ITEM(v, ST_FLAGS_IDX, 5483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyInt_FromLong((long)st->st_flags)); 5493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 5503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 5513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (PyErr_Occurred()) { 5523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(v); 5533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 5543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 5553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 5563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return v; 5573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 5583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 5593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 56042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_do_stat(PyObject *self, PyObject *args, 5613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *format, 5623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int (*statfunc)(const char *, STRUCT_STAT *), 5633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *wformat, 5643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int (*wstatfunc)(const Py_UNICODE *, STRUCT_STAT *)) 5653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 5663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel STRUCT_STAT st; 5673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path = NULL; /* pass this to stat; do not free() it */ 5683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *pathfree = NULL; /* this memory must be free'd */ 5693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int res; 5703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *result; 5713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 5723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, format, 5733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, &path)) 5743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 5753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel pathfree = path; 5763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 5773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 5783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = (*statfunc)(path, &st); 5793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 5803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 5813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res != 0) { 58242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel result = edk2_error_with_filename(pathfree); 5833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 5843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else 5853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel result = _pystat_fromstructstat(&st); 5863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 5873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(pathfree); 5883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return result; 5893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 5903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 5913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* POSIX methods */ 5923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 59342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_access__doc__, 5943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"access(path, mode) -> True if granted, False otherwise\n\n\ 5953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielUse the real uid/gid to test for access to a path. Note that most\n\ 5963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieloperations will use the effective uid/gid, therefore this routine can\n\ 5973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielbe used in a suid/sgid environment to test if the invoking user has the\n\ 5983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielspecified access to the path. The mode argument can be F_OK to test\n\ 5993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielexistence, or the inclusive-OR of R_OK, W_OK, and X_OK."); 6003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 6013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 60242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_access(PyObject *self, PyObject *args) 6033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 6043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path; 6053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int mode; 6063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 6073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int res; 6083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "eti:access", 6093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, &path, &mode)) 6103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 6113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 6123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = access(path, mode); 6133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 6143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 6153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyBool_FromLong(res == 0); 6163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 6173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 6183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifndef F_OK 6193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define F_OK 0 6203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 6213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifndef R_OK 6223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define R_OK 4 6233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 6243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifndef W_OK 6253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define W_OK 2 6263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 6273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifndef X_OK 6283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel #define X_OK 1 6293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 6303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 63142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_chdir__doc__, 6323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"chdir(path)\n\n\ 6333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielChange the current working directory to the specified path."); 6343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 6353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 63642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_chdir(PyObject *self, PyObject *args) 6373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 63842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_1str(args, "et:chdir", chdir); 6393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 6403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 64142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_chmod__doc__, 6423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"chmod(path, mode)\n\n\ 6433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielChange the access permissions of a file."); 6443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 6453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 64642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_chmod(PyObject *self, PyObject *args) 6473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 6483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path = NULL; 6493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int i; 6503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int res; 6513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "eti:chmod", Py_FileSystemDefaultEncoding, 6523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &path, &i)) 6533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 6543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 6553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = chmod(path, i); 6563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 6573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res < 0) 65842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error_with_allocated_filename(path); 6593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 6603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 6613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 6623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 6633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 6643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FCHMOD 66542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_fchmod__doc__, 6663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"fchmod(fd, mode)\n\n\ 6673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielChange the access permissions of the file given by file\n\ 6683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanieldescriptor fd."); 6693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 6703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 67142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_fchmod(PyObject *self, PyObject *args) 6723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 6733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int fd, mode, res; 6743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "ii:fchmod", &fd, &mode)) 6753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 6763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 6773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = fchmod(fd, mode); 6783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 6793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res < 0) 68042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 6813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_RETURN_NONE; 6823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 6833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_FCHMOD */ 6843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 6853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_LCHMOD 68642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_lchmod__doc__, 6873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"lchmod(path, mode)\n\n\ 6883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielChange the access permissions of a file. If path is a symlink, this\n\ 6893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielaffects the link itself rather than the target."); 6903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 6913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 69242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_lchmod(PyObject *self, PyObject *args) 6933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 6943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path = NULL; 6953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int i; 6963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int res; 6973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "eti:lchmod", Py_FileSystemDefaultEncoding, 6983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &path, &i)) 6993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 7003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 7013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = lchmod(path, i); 7023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 7033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res < 0) 70442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error_with_allocated_filename(path); 7053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 7063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_RETURN_NONE; 7073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 7083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_LCHMOD */ 7093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 7103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 7113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_CHFLAGS 71242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_chflags__doc__, 7133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"chflags(path, flags)\n\n\ 7143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielSet file flags."); 7153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 7163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 71742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_chflags(PyObject *self, PyObject *args) 7183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 7193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path; 7203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel unsigned long flags; 7213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int res; 7223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "etk:chflags", 7233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, &path, &flags)) 7243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 7253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 7263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = chflags(path, flags); 7273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 7283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res < 0) 72942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error_with_allocated_filename(path); 7303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 7313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 7323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 7333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 7343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_CHFLAGS */ 7353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 7363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_LCHFLAGS 73742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_lchflags__doc__, 7383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"lchflags(path, flags)\n\n\ 7393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielSet file flags.\n\ 7403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielThis function will not follow symbolic links."); 7413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 7423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 74342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_lchflags(PyObject *self, PyObject *args) 7443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 7453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path; 7463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel unsigned long flags; 7473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int res; 7483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "etk:lchflags", 7493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, &path, &flags)) 7503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 7513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 7523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = lchflags(path, flags); 7533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 7543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res < 0) 75542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error_with_allocated_filename(path); 7563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 7573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 7583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 7593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 7603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_LCHFLAGS */ 7613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 7623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_CHROOT 76342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_chroot__doc__, 7643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"chroot(path)\n\n\ 7653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielChange root directory to path."); 7663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 7673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 76842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_chroot(PyObject *self, PyObject *args) 7693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 77042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_1str(args, "et:chroot", chroot); 7713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 7723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 7733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 7743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FSYNC 77542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_fsync__doc__, 7763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"fsync(fildes)\n\n\ 7773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielforce write of file with filedescriptor to disk."); 7783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 7793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 78042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_fsync(PyObject *self, PyObject *fdobj) 7813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 78242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_fildes(fdobj, fsync); 7833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 7843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_FSYNC */ 7853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 7863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FDATASYNC 7873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 7883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef __hpux 7893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielextern int fdatasync(int); /* On HP-UX, in libc but not in unistd.h */ 7903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 7913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 79242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_fdatasync__doc__, 7933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"fdatasync(fildes)\n\n\ 7943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielforce write of file with filedescriptor to disk.\n\ 7953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel does not force update of metadata."); 7963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 7973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 79842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_fdatasync(PyObject *self, PyObject *fdobj) 7993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 80042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_fildes(fdobj, fdatasync); 8013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 8023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_FDATASYNC */ 8033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 8043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 8053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_CHOWN 80642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_chown__doc__, 8073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"chown(path, uid, gid)\n\n\ 8083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielChange the owner and group id of path to the numeric uid and gid."); 8093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 8103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 81142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_chown(PyObject *self, PyObject *args) 8123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 8133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path = NULL; 8143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel long uid, gid; 8153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int res; 8163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "etll:chown", 8173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, &path, 8183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &uid, &gid)) 8193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 8203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 8213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = chown(path, (uid_t) uid, (gid_t) gid); 8223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 8233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res < 0) 82442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error_with_allocated_filename(path); 8253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 8263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 8273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 8283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 8293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_CHOWN */ 8303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 8313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FCHOWN 83242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_fchown__doc__, 8333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"fchown(fd, uid, gid)\n\n\ 8343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielChange the owner and group id of the file given by file descriptor\n\ 8353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielfd to the numeric uid and gid."); 8363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 8373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 83842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_fchown(PyObject *self, PyObject *args) 8393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 8403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int fd; 8413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel long uid, gid; 8423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int res; 8433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "ill:chown", &fd, &uid, &gid)) 8443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 8453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 8463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = fchown(fd, (uid_t) uid, (gid_t) gid); 8473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 8483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res < 0) 84942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 8503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_RETURN_NONE; 8513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 8523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_FCHOWN */ 8533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 8543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_LCHOWN 85542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_lchown__doc__, 8563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"lchown(path, uid, gid)\n\n\ 8573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielChange the owner and group id of path to the numeric uid and gid.\n\ 8583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielThis function will not follow symbolic links."); 8593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 8603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 86142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_lchown(PyObject *self, PyObject *args) 8623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 8633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path = NULL; 8643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel long uid, gid; 8653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int res; 8663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "etll:lchown", 8673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, &path, 8683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &uid, &gid)) 8693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 8703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 8713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = lchown(path, (uid_t) uid, (gid_t) gid); 8723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 8733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res < 0) 87442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error_with_allocated_filename(path); 8753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 8763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 8773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 8783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 8793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_LCHOWN */ 8803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 8813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 8823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_GETCWD 88342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_getcwd__doc__, 8843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"getcwd() -> path\n\n\ 8853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielReturn a string representing the current working directory."); 8863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 8873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 88842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_getcwd(PyObject *self, PyObject *noargs) 8893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 8903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int bufsize_incr = 1024; 8913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int bufsize = 0; 8923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *tmpbuf = NULL; 8933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *res = NULL; 8943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *dynamic_return; 8953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 8963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 8973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel do { 8983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel bufsize = bufsize + bufsize_incr; 8993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel tmpbuf = malloc(bufsize); 9003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (tmpbuf == NULL) { 9013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel break; 9023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 9033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = getcwd(tmpbuf, bufsize); 9043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res == NULL) { 9053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel free(tmpbuf); 9063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 9073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } while ((res == NULL) && (errno == ERANGE)); 9083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 9093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 9103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res == NULL) 91142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 9123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 9133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel dynamic_return = PyString_FromString(tmpbuf); 9143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel free(tmpbuf); 9153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 9163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return dynamic_return; 9173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 9183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 9193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef Py_USING_UNICODE 92042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_getcwdu__doc__, 9213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"getcwdu() -> path\n\n\ 9223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielReturn a unicode string representing the current working directory."); 9233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 9243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 92542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_getcwdu(PyObject *self, PyObject *noargs) 9263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 9273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char buf[1026]; 9283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *res; 9293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 9303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 9313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = getcwd(buf, sizeof buf); 9323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 9333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res == NULL) 93442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 9353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyUnicode_Decode(buf, strlen(buf), Py_FileSystemDefaultEncoding,"strict"); 9363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 9373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* Py_USING_UNICODE */ 9383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_GETCWD */ 9393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 9403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 94142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_listdir__doc__, 9423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"listdir(path) -> list_of_strings\n\n\ 9433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielReturn a list containing the names of the entries in the directory.\n\ 9443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel\n\ 9453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel path: path of directory to list\n\ 9463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel\n\ 9473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielThe list is in arbitrary order. It does not include the special\n\ 9483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielentries '.' and '..' even if they are present in the directory."); 9493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 9503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 95142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_listdir(PyObject *self, PyObject *args) 9523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 9533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* XXX Should redo this putting the (now four) versions of opendir 9543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel in separate files instead of having them all here... */ 9553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 9563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *name = NULL; 9573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *MBname; 9583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *d, *v; 9593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel DIR *dirp; 9603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel struct dirent *ep; 9613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int arg_is_unicode = 1; 9623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 9633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel errno = 0; 9643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "U:listdir", &v)) { 9653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel arg_is_unicode = 0; 9663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_Clear(); 9673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 9683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "et:listdir", Py_FileSystemDefaultEncoding, &name)) 9693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 9703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 9713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel dirp = opendir(name); 9723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 9733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (dirp == NULL) { 97442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error_with_allocated_filename(name); 9753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 9763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if ((d = PyList_New(0)) == NULL) { 9773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 9783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel closedir(dirp); 9793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 9803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(name); 9813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 9823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 9833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if((MBname = malloc(NAME_MAX)) == NULL) { 9843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 9853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel closedir(dirp); 9863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 9873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(d); 9883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(name); 9893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 9903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 9913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for (;;) { 9923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel errno = 0; 9933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 9943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel ep = readdir(dirp); 9953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 9963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ep == NULL) { 9973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if ((errno == 0) || (errno == EISDIR)) { 9983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel break; 9993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } else { 10003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 10013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel closedir(dirp); 10023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 10033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(d); 100442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error_with_allocated_filename(name); 10053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 10063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 10073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ep->FileName[0] == L'.' && 10083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel (NAMLEN(ep) == 1 || 10093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel (ep->FileName[1] == L'.' && NAMLEN(ep) == 2))) 10103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel continue; 10113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if(wcstombs(MBname, ep->FileName, NAME_MAX) == -1) { 10123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel free(MBname); 10133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 10143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel closedir(dirp); 10153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 10163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(d); 10173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(name); 10183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 10193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 10203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel v = PyString_FromStringAndSize(MBname, strlen(MBname)); 10213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (v == NULL) { 10223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(d); 10233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel d = NULL; 10243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel break; 10253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 10263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef Py_USING_UNICODE 10273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (arg_is_unicode) { 10283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *w; 10293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 10303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel w = PyUnicode_FromEncodedObject(v, 10313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, 10323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "strict"); 10333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (w != NULL) { 10343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(v); 10353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel v = w; 10363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 10373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else { 10383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* fall back to the original byte string, as 10393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel discussed in patch #683592 */ 10403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_Clear(); 10413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 10423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 10433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 10443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (PyList_Append(d, v) != 0) { 10453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(v); 10463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(d); 10473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel d = NULL; 10483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel break; 10493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 10503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(v); 10513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 10523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 10533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel closedir(dirp); 10543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 10553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(name); 10563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if(MBname != NULL) { 10573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel free(MBname); 10583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 10593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 10603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return d; 10613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 106242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel} /* end of edk2_listdir */ 10633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 106442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_mkdir__doc__, 10653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"mkdir(path [, mode=0777])\n\n\ 10663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielCreate a directory."); 10673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 10683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 106942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_mkdir(PyObject *self, PyObject *args) 10703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 10713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int res; 10723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path = NULL; 10733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int mode = 0777; 10743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 10753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "et|i:mkdir", 10763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, &path, &mode)) 10773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 10783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 10793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = mkdir(path, mode); 10803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 10813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res < 0) 108242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error_with_allocated_filename(path); 10833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 10843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 10853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 10863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 10873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 10883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 10893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* sys/resource.h is needed for at least: wait3(), wait4(), broken nice. */ 10903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_SYS_RESOURCE_H) 10913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#include <sys/resource.h> 10923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 10933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 10943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 10953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_NICE 109642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_nice__doc__, 10973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"nice(inc) -> new_priority\n\n\ 10983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielDecrease the priority of process by inc and return the new priority."); 10993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 110142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_nice(PyObject *self, PyObject *args) 11023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 11033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int increment, value; 11043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "i:nice", &increment)) 11063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 11073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* There are two flavours of 'nice': one that returns the new 11093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel priority (as required by almost all standards out there) and the 11103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Linux/FreeBSD/BSDI one, which returns '0' on success and advices 11113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel the use of getpriority() to get the new priority. 11123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel If we are of the nice family that returns the new priority, we 11143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel need to clear errno before the call, and check if errno is filled 111542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel before calling edk2_error() on a returnvalue of -1, because the 11163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel -1 may be the actual new priority! */ 11173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel errno = 0; 11193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel value = nice(increment); 11203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_BROKEN_NICE) && defined(HAVE_GETPRIORITY) 11213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (value == 0) 11223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel value = getpriority(PRIO_PROCESS, 0); 11233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 11243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (value == -1 && errno != 0) 11253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* either nice() or getpriority() returned an error */ 112642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 11273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyInt_FromLong((long) value); 11283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 11293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_NICE */ 11303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 113142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_rename__doc__, 11323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"rename(old, new)\n\n\ 11333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielRename a file or directory."); 11343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 113642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_rename(PyObject *self, PyObject *args) 11373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 113842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_2str(args, "etet:rename", rename); 11393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 11403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 114242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_rmdir__doc__, 11433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"rmdir(path)\n\n\ 11443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielRemove a directory."); 11453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 114742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_rmdir(PyObject *self, PyObject *args) 11483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 114942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_1str(args, "et:rmdir", rmdir); 11503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 11513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 115342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_stat__doc__, 11543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"stat(path) -> stat result\n\n\ 11553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielPerform a stat system call on the given path."); 11563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 115842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_stat(PyObject *self, PyObject *args) 11593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 116042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_do_stat(self, args, "et:stat", STAT, NULL, NULL); 11613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 11623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYSTEM 116542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_system__doc__, 11663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"system(command) -> exit_status\n\n\ 11673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielExecute the command (a string) in a subshell."); 11683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 117042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_system(PyObject *self, PyObject *args) 11713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 11723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *command; 11733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel long sts; 11743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "s:system", &command)) 11753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 11763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 11773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel sts = system(command); 11783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 11793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyInt_FromLong(sts); 11803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 11813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 11823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 118442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_umask__doc__, 11853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"umask(new_mask) -> old_mask\n\n\ 11863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielSet the current numeric umask and return the previous umask."); 11873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 11883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 118942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_umask(PyObject *self, PyObject *args) 11903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 11913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int i; 11923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "i:umask", &i)) 11933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 11943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel i = (int)umask(i); 11953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (i < 0) 119642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 11973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyInt_FromLong((long)i); 11983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 11993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 12003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 120142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_unlink__doc__, 12023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"unlink(path)\n\n\ 12033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielRemove a file (same as remove(path))."); 12043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 120542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_remove__doc__, 12063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"remove(path)\n\n\ 12073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielRemove a file (same as unlink(path))."); 12083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 12093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 121042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_unlink(PyObject *self, PyObject *args) 12113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 121242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_1str(args, "et:remove", unlink); 12133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 12143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 12153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 12163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic int 12173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielextract_time(PyObject *t, time_t* sec, long* usec) 12183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 12193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel time_t intval; 12203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (PyFloat_Check(t)) { 12213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel double tval = PyFloat_AsDouble(t); 12223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *intobj = PyNumber_Long(t); 12233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!intobj) 12243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return -1; 12253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if SIZEOF_TIME_T > SIZEOF_LONG 12263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel intval = PyInt_AsUnsignedLongLongMask(intobj); 12273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 12283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel intval = PyInt_AsLong(intobj); 12293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 12303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(intobj); 12313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (intval == -1 && PyErr_Occurred()) 12323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return -1; 12333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel *sec = intval; 12343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel *usec = (long)((tval - intval) * 1e6); /* can't exceed 1000000 */ 12353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (*usec < 0) 12363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* If rounding gave us a negative number, 12373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel truncate. */ 12383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel *usec = 0; 12393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return 0; 12403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 12413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if SIZEOF_TIME_T > SIZEOF_LONG 12423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel intval = PyInt_AsUnsignedLongLongMask(t); 12433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 12443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel intval = PyInt_AsLong(t); 12453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 12463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (intval == -1 && PyErr_Occurred()) 12473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return -1; 12483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel *sec = intval; 12493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel *usec = 0; 12503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return 0; 12513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 12523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 125342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_utime__doc__, 12543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"utime(path, (atime, mtime))\n\ 12553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielutime(path, None)\n\n\ 12563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielSet the access and modified time of the file to the given values. If the\n\ 12573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielsecond form is used, set the access and modified times to the current time."); 12583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 12593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 126042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_utime(PyObject *self, PyObject *args) 12613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 12623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path = NULL; 12633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel time_t atime, mtime; 12643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel long ausec, musec; 12653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int res; 12663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject* arg; 12673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 12683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_UTIMES) 12693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel struct timeval buf[2]; 12703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ATIME buf[0].tv_sec 12713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define MTIME buf[1].tv_sec 12723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#elif defined(HAVE_UTIME_H) 12733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* XXX should define struct utimbuf instead, above */ 12743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel struct utimbuf buf; 12753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ATIME buf.actime 12763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define MTIME buf.modtime 12773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define UTIME_ARG &buf 12783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else /* HAVE_UTIMES */ 12793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel time_t buf[2]; 12803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define ATIME buf[0] 12813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define MTIME buf[1] 12823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define UTIME_ARG buf 12833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_UTIMES */ 12843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 12853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 12863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "etO:utime", 12873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, &path, &arg)) 12883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 12893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (arg == Py_None) { 12903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* optional time values not given */ 12913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 12923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = utime(path, NULL); 12933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 12943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 12953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else if (!PyTuple_Check(arg) || PyTuple_Size(arg) != 2) { 12963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_TypeError, 12973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "utime() arg 2 must be a tuple (atime, mtime)"); 12983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 12993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 13003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 13013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else { 13023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (extract_time(PyTuple_GET_ITEM(arg, 0), 13033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &atime, &ausec) == -1) { 13043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 13053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 13063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 13073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (extract_time(PyTuple_GET_ITEM(arg, 1), 13083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &mtime, &musec) == -1) { 13093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 13103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 13113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 13123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel ATIME = atime; 13133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel MTIME = mtime; 13143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_UTIMES 13153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel buf[0].tv_usec = ausec; 13163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel buf[1].tv_usec = musec; 13173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 13183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = utimes(path, buf); 13193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 13203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 13213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 13223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = utime(path, UTIME_ARG); 13233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 13243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_UTIMES */ 13253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 13263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (res < 0) { 132742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error_with_allocated_filename(path); 13283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 13293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 13303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 13313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 13323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#undef UTIME_ARG 13333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#undef ATIME 13343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#undef MTIME 13353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 13363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 13373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 13383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* Process operations */ 13393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 134042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2__exit__doc__, 13413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"_exit(status)\n\n\ 13423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielExit to the system with specified status, without normal exit processing."); 13433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 13443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 134542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2__exit(PyObject *self, PyObject *args) 13463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 13473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int sts; 13483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "i:_exit", &sts)) 13493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 13503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel _Exit(sts); 13513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; /* Make gcc -Wall happy */ 13523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 13533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 13543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_EXECV) || defined(HAVE_SPAWNV) 13553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic void 13563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielfree_string_array(char **array, Py_ssize_t count) 13573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 13583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_ssize_t i; 13593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for (i = 0; i < count; i++) 13603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(array[i]); 13613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_DEL(array); 13623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 13633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 13643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 13653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 13663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_EXECV 136742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_execv__doc__, 13683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"execv(path, args)\n\n\ 13693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielExecute an executable path with arguments, replacing current process.\n\ 13703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel\n\ 13713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel path: path of executable file\n\ 13723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel args: tuple or list of strings"); 13733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 13743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 137542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_execv(PyObject *self, PyObject *args) 13763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 13773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path; 13783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *argv; 13793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char **argvlist; 13803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_ssize_t i, argc; 13813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *(*getitem)(PyObject *, Py_ssize_t); 13823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 13833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* execv has two arguments: (path, argv), where 13843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argv is a list or tuple of strings. */ 13853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 13863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "etO:execv", 13873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, 13883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &path, &argv)) 13893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 13903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (PyList_Check(argv)) { 13913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argc = PyList_Size(argv); 13923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel getitem = PyList_GetItem; 13933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 13943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else if (PyTuple_Check(argv)) { 13953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argc = PyTuple_Size(argv); 13963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel getitem = PyTuple_GetItem; 13973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 13983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else { 13993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_TypeError, "execv() arg 2 must be a tuple or list"); 14003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 14013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 14023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 14033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (argc < 1) { 14043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_ValueError, "execv() arg 2 must not be empty"); 14053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 14063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 14073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 14083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 14093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argvlist = PyMem_NEW(char *, argc+1); 14103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (argvlist == NULL) { 14113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 14123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyErr_NoMemory(); 14133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 14143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for (i = 0; i < argc; i++) { 14153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_Parse((*getitem)(argv, i), "et", 14163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, 14173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &argvlist[i])) { 14183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel free_string_array(argvlist, i); 14193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_TypeError, 14203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "execv() arg 2 must contain only strings"); 14213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 14223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 14233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 14243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 14253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 14263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argvlist[argc] = NULL; 14273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 14283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel execv(path, argvlist); 14293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 14303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* If we get here it's definitely an error */ 14313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 14323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel free_string_array(argvlist, argc); 14333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 143442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 14353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 14363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 14373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 143842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_execve__doc__, 14393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"execve(path, args, env)\n\n\ 14403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielExecute a path with arguments and environment, replacing current process.\n\ 14413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel\n\ 14423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel path: path of executable file\n\ 14433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel args: tuple or list of arguments\n\ 14443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel env: dictionary of strings mapping to strings"); 14453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 14463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 144742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_execve(PyObject *self, PyObject *args) 14483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 14493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path; 14503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *argv, *env; 14513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char **argvlist; 14523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char **envlist; 14533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *key, *val, *keys=NULL, *vals=NULL; 14543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_ssize_t i, pos, argc, envc; 14553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *(*getitem)(PyObject *, Py_ssize_t); 14563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_ssize_t lastarg = 0; 14573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 14583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* execve has three arguments: (path, argv, env), where 14593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argv is a list or tuple of strings and env is a dictionary 14603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel like posix.environ. */ 14613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 14623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "etOO:execve", 14633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, 14643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &path, &argv, &env)) 14653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 14663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (PyList_Check(argv)) { 14673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argc = PyList_Size(argv); 14683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel getitem = PyList_GetItem; 14693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 14703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else if (PyTuple_Check(argv)) { 14713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argc = PyTuple_Size(argv); 14723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel getitem = PyTuple_GetItem; 14733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 14743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else { 14753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_TypeError, 14763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "execve() arg 2 must be a tuple or list"); 14773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_0; 14783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 14793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyMapping_Check(env)) { 14803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_TypeError, 14813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "execve() arg 3 must be a mapping object"); 14823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_0; 14833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 14843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 14853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argvlist = PyMem_NEW(char *, argc+1); 14863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (argvlist == NULL) { 14873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_NoMemory(); 14883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_0; 14893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 14903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for (i = 0; i < argc; i++) { 14913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_Parse((*getitem)(argv, i), 14923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "et;execve() arg 2 must contain only strings", 14933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, 14943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &argvlist[i])) 14953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel { 14963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel lastarg = i; 14973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_1; 14983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 14993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 15003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel lastarg = argc; 15013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argvlist[argc] = NULL; 15023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 15033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel i = PyMapping_Size(env); 15043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (i < 0) 15053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_1; 15063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel envlist = PyMem_NEW(char *, i + 1); 15073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (envlist == NULL) { 15083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_NoMemory(); 15093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_1; 15103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 15113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel envc = 0; 15123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel keys = PyMapping_Keys(env); 15133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel vals = PyMapping_Values(env); 15143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!keys || !vals) 15153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 15163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyList_Check(keys) || !PyList_Check(vals)) { 15173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_TypeError, 15183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "execve(): env.keys() or env.values() is not a list"); 15193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 15203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 15213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 15223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for (pos = 0; pos < i; pos++) { 15233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *p, *k, *v; 15243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel size_t len; 15253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 15263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel key = PyList_GetItem(keys, pos); 15273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel val = PyList_GetItem(vals, pos); 15283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!key || !val) 15293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 15303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 15313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_Parse( 15323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel key, 15333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "s;execve() arg 3 contains a non-string key", 15343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &k) || 15353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel !PyArg_Parse( 15363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel val, 15373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "s;execve() arg 3 contains a non-string value", 15383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &v)) 15393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel { 15403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 15413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 15423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 15433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(PYOS_OS2) 15443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Omit Pseudo-Env Vars that Would Confuse Programs if Passed On */ 15453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (stricmp(k, "BEGINLIBPATH") != 0 && stricmp(k, "ENDLIBPATH") != 0) { 15463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 15473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel len = PyString_Size(key) + PyString_Size(val) + 2; 15483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel p = PyMem_NEW(char, len); 15493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (p == NULL) { 15503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_NoMemory(); 15513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 15523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 15533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyOS_snprintf(p, len, "%s=%s", k, v); 15543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel envlist[envc++] = p; 15553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(PYOS_OS2) 15563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 15573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 15583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 15593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel envlist[envc] = 0; 15603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 15613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel execve(path, argvlist, envlist); 15623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 15633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* If we get here it's definitely an error */ 15643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 156542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel (void) edk2_error(); 15663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 15673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fail_2: 15683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel while (--envc >= 0) 15693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_DEL(envlist[envc]); 15703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_DEL(envlist); 15713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fail_1: 15723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel free_string_array(argvlist, lastarg); 15733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_XDECREF(vals); 15743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_XDECREF(keys); 15753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fail_0: 15763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 15773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 15783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 15793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_EXECV */ 15803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 15813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 15823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SPAWNV 158342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_spawnv__doc__, 15843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"spawnv(mode, path, args)\n\n\ 15853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielExecute the program 'path' in a new process.\n\ 15863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel\n\ 15873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel mode: mode of process creation\n\ 15883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel path: path of executable file\n\ 15893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel args: tuple or list of strings"); 15903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 15913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 159242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_spawnv(PyObject *self, PyObject *args) 15933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 15943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path; 15953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *argv; 15963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char **argvlist; 15973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int mode, i; 15983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_ssize_t argc; 15993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_intptr_t spawnval; 16003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *(*getitem)(PyObject *, Py_ssize_t); 16013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 16023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* spawnv has three arguments: (mode, path, argv), where 16033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argv is a list or tuple of strings. */ 16043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 16053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "ietO:spawnv", &mode, 16063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, 16073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &path, &argv)) 16083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 16093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (PyList_Check(argv)) { 16103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argc = PyList_Size(argv); 16113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel getitem = PyList_GetItem; 16123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 16133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else if (PyTuple_Check(argv)) { 16143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argc = PyTuple_Size(argv); 16153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel getitem = PyTuple_GetItem; 16163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 16173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else { 16183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_TypeError, 16193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "spawnv() arg 2 must be a tuple or list"); 16203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 16213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 16223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 16233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 16243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argvlist = PyMem_NEW(char *, argc+1); 16253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (argvlist == NULL) { 16263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 16273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyErr_NoMemory(); 16283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 16293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for (i = 0; i < argc; i++) { 16303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_Parse((*getitem)(argv, i), "et", 16313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, 16323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &argvlist[i])) { 16333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel free_string_array(argvlist, i); 16343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString( 16353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyExc_TypeError, 16363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "spawnv() arg 2 must contain only strings"); 16373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 16383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 16393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 16403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 16413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argvlist[argc] = NULL; 16423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 16433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(PYOS_OS2) && defined(PYCC_GCC) 16443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 16453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel spawnval = spawnv(mode, path, argvlist); 16463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 16473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 16483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (mode == _OLD_P_OVERLAY) 16493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel mode = _P_OVERLAY; 16503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 16513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 16523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel spawnval = _spawnv(mode, path, argvlist); 16533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 16543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 16553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 16563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel free_string_array(argvlist, argc); 16573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 16583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 16593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (spawnval == -1) 166042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 16613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else 16623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if SIZEOF_LONG == SIZEOF_VOID_P 16633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_BuildValue("l", (long) spawnval); 16643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 16653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_BuildValue("L", (PY_LONG_LONG) spawnval); 16663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 16673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 16683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 16693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 167042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_spawnve__doc__, 16713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"spawnve(mode, path, args, env)\n\n\ 16723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielExecute the program 'path' in a new process.\n\ 16733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel\n\ 16743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel mode: mode of process creation\n\ 16753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel path: path of executable file\n\ 16763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel args: tuple or list of arguments\n\ 16773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel env: dictionary of strings mapping to strings"); 16783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 16793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 168042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_spawnve(PyObject *self, PyObject *args) 16813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 16823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path; 16833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *argv, *env; 16843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char **argvlist; 16853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char **envlist; 16863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL; 16873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int mode, pos, envc; 16883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_ssize_t argc, i; 16893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_intptr_t spawnval; 16903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *(*getitem)(PyObject *, Py_ssize_t); 16913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_ssize_t lastarg = 0; 16923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 16933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* spawnve has four arguments: (mode, path, argv, env), where 16943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argv is a list or tuple of strings and env is a dictionary 16953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel like posix.environ. */ 16963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 16973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "ietOO:spawnve", &mode, 16983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, 16993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &path, &argv, &env)) 17003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 17013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (PyList_Check(argv)) { 17023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argc = PyList_Size(argv); 17033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel getitem = PyList_GetItem; 17043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 17053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else if (PyTuple_Check(argv)) { 17063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argc = PyTuple_Size(argv); 17073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel getitem = PyTuple_GetItem; 17083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 17093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else { 17103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_TypeError, 17113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "spawnve() arg 2 must be a tuple or list"); 17123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_0; 17133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 17143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyMapping_Check(env)) { 17153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_TypeError, 17163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "spawnve() arg 3 must be a mapping object"); 17173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_0; 17183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 17193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 17203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argvlist = PyMem_NEW(char *, argc+1); 17213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (argvlist == NULL) { 17223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_NoMemory(); 17233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_0; 17243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 17253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for (i = 0; i < argc; i++) { 17263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_Parse((*getitem)(argv, i), 17273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "et;spawnve() arg 2 must contain only strings", 17283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, 17293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &argvlist[i])) 17303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel { 17313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel lastarg = i; 17323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_1; 17333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 17343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 17353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel lastarg = argc; 17363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argvlist[argc] = NULL; 17373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 17383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel i = PyMapping_Size(env); 17393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (i < 0) 17403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_1; 17413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel envlist = PyMem_NEW(char *, i + 1); 17423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (envlist == NULL) { 17433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_NoMemory(); 17443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_1; 17453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 17463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel envc = 0; 17473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel keys = PyMapping_Keys(env); 17483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel vals = PyMapping_Values(env); 17493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!keys || !vals) 17503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 17513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyList_Check(keys) || !PyList_Check(vals)) { 17523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_TypeError, 17533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "spawnve(): env.keys() or env.values() is not a list"); 17543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 17553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 17563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 17573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for (pos = 0; pos < i; pos++) { 17583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *p, *k, *v; 17593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel size_t len; 17603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 17613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel key = PyList_GetItem(keys, pos); 17623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel val = PyList_GetItem(vals, pos); 17633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!key || !val) 17643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 17653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 17663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_Parse( 17673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel key, 17683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "s;spawnve() arg 3 contains a non-string key", 17693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &k) || 17703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel !PyArg_Parse( 17713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel val, 17723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "s;spawnve() arg 3 contains a non-string value", 17733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &v)) 17743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel { 17753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 17763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 17773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel len = PyString_Size(key) + PyString_Size(val) + 2; 17783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel p = PyMem_NEW(char, len); 17793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (p == NULL) { 17803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_NoMemory(); 17813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 17823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 17833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyOS_snprintf(p, len, "%s=%s", k, v); 17843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel envlist[envc++] = p; 17853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 17863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel envlist[envc] = 0; 17873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 17883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(PYOS_OS2) && defined(PYCC_GCC) 17893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 17903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel spawnval = spawnve(mode, path, argvlist, envlist); 17913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 17923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 17933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (mode == _OLD_P_OVERLAY) 17943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel mode = _P_OVERLAY; 17953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 17963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 17973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel spawnval = _spawnve(mode, path, argvlist, envlist); 17983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 17993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 18003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 18013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (spawnval == -1) 180242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel (void) edk2_error(); 18033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else 18043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if SIZEOF_LONG == SIZEOF_VOID_P 18053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = Py_BuildValue("l", (long) spawnval); 18063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 18073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = Py_BuildValue("L", (PY_LONG_LONG) spawnval); 18083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 18093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 18103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fail_2: 18113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel while (--envc >= 0) 18123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_DEL(envlist[envc]); 18133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_DEL(envlist); 18143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fail_1: 18153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel free_string_array(argvlist, lastarg); 18163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_XDECREF(vals); 18173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_XDECREF(keys); 18183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fail_0: 18193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 18203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return res; 18213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 18223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 18233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* OS/2 supports spawnvp & spawnvpe natively */ 18243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(PYOS_OS2) 182542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_spawnvp__doc__, 18263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"spawnvp(mode, file, args)\n\n\ 18273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielExecute the program 'file' in a new process, using the environment\n\ 18283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielsearch path to find the file.\n\ 18293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel\n\ 18303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel mode: mode of process creation\n\ 18313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel file: executable file name\n\ 18323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel args: tuple or list of strings"); 18333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 18343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 183542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_spawnvp(PyObject *self, PyObject *args) 18363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 18373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path; 18383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *argv; 18393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char **argvlist; 18403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int mode, i, argc; 18413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_intptr_t spawnval; 18423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *(*getitem)(PyObject *, Py_ssize_t); 18433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 18443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* spawnvp has three arguments: (mode, path, argv), where 18453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argv is a list or tuple of strings. */ 18463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 18473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "ietO:spawnvp", &mode, 18483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, 18493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &path, &argv)) 18503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 18513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (PyList_Check(argv)) { 18523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argc = PyList_Size(argv); 18533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel getitem = PyList_GetItem; 18543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 18553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else if (PyTuple_Check(argv)) { 18563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argc = PyTuple_Size(argv); 18573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel getitem = PyTuple_GetItem; 18583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 18593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else { 18603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_TypeError, 18613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "spawnvp() arg 2 must be a tuple or list"); 18623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 18633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 18643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 18653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 18663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argvlist = PyMem_NEW(char *, argc+1); 18673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (argvlist == NULL) { 18683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 18693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyErr_NoMemory(); 18703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 18713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for (i = 0; i < argc; i++) { 18723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_Parse((*getitem)(argv, i), "et", 18733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, 18743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &argvlist[i])) { 18753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel free_string_array(argvlist, i); 18763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString( 18773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyExc_TypeError, 18783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "spawnvp() arg 2 must contain only strings"); 18793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 18803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 18813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 18823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 18833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argvlist[argc] = NULL; 18843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 18853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 18863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(PYCC_GCC) 18873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel spawnval = spawnvp(mode, path, argvlist); 18883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 18893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel spawnval = _spawnvp(mode, path, argvlist); 18903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 18913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 18923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 18933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel free_string_array(argvlist, argc); 18943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 18953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 18963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (spawnval == -1) 189742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 18983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else 18993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_BuildValue("l", (long) spawnval); 19003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 19013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 19023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 190342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_spawnvpe__doc__, 19043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"spawnvpe(mode, file, args, env)\n\n\ 19053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielExecute the program 'file' in a new process, using the environment\n\ 19063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielsearch path to find the file.\n\ 19073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel\n\ 19083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel mode: mode of process creation\n\ 19093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel file: executable file name\n\ 19103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel args: tuple or list of arguments\n\ 19113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel env: dictionary of strings mapping to strings"); 19123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 19133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 191442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_spawnvpe(PyObject *self, PyObject *args) 19153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 19163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *path; 19173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *argv, *env; 19183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char **argvlist; 19193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char **envlist; 19203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL; 19213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int mode, i, pos, argc, envc; 19223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_intptr_t spawnval; 19233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *(*getitem)(PyObject *, Py_ssize_t); 19243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int lastarg = 0; 19253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 19263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* spawnvpe has four arguments: (mode, path, argv, env), where 19273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argv is a list or tuple of strings and env is a dictionary 19283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel like posix.environ. */ 19293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 19303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "ietOO:spawnvpe", &mode, 19313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, 19323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &path, &argv, &env)) 19333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 19343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (PyList_Check(argv)) { 19353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argc = PyList_Size(argv); 19363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel getitem = PyList_GetItem; 19373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 19383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else if (PyTuple_Check(argv)) { 19393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argc = PyTuple_Size(argv); 19403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel getitem = PyTuple_GetItem; 19413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 19423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else { 19433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_TypeError, 19443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "spawnvpe() arg 2 must be a tuple or list"); 19453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_0; 19463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 19473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyMapping_Check(env)) { 19483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_TypeError, 19493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "spawnvpe() arg 3 must be a mapping object"); 19503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_0; 19513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 19523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 19533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argvlist = PyMem_NEW(char *, argc+1); 19543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (argvlist == NULL) { 19553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_NoMemory(); 19563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_0; 19573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 19583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for (i = 0; i < argc; i++) { 19593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_Parse((*getitem)(argv, i), 19603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "et;spawnvpe() arg 2 must contain only strings", 19613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_FileSystemDefaultEncoding, 19623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &argvlist[i])) 19633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel { 19643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel lastarg = i; 19653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_1; 19663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 19673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 19683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel lastarg = argc; 19693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel argvlist[argc] = NULL; 19703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 19713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel i = PyMapping_Size(env); 19723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (i < 0) 19733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_1; 19743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel envlist = PyMem_NEW(char *, i + 1); 19753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (envlist == NULL) { 19763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_NoMemory(); 19773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_1; 19783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 19793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel envc = 0; 19803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel keys = PyMapping_Keys(env); 19813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel vals = PyMapping_Values(env); 19823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!keys || !vals) 19833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 19843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyList_Check(keys) || !PyList_Check(vals)) { 19853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_TypeError, 19863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "spawnvpe(): env.keys() or env.values() is not a list"); 19873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 19883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 19893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 19903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel for (pos = 0; pos < i; pos++) { 19913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *p, *k, *v; 19923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel size_t len; 19933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 19943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel key = PyList_GetItem(keys, pos); 19953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel val = PyList_GetItem(vals, pos); 19963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!key || !val) 19973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 19983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 19993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_Parse( 20003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel key, 20013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "s;spawnvpe() arg 3 contains a non-string key", 20023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &k) || 20033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel !PyArg_Parse( 20043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel val, 20053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "s;spawnvpe() arg 3 contains a non-string value", 20063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel &v)) 20073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel { 20083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 20093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 20103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel len = PyString_Size(key) + PyString_Size(val) + 2; 20113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel p = PyMem_NEW(char, len); 20123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (p == NULL) { 20133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_NoMemory(); 20143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel goto fail_2; 20153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 20163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyOS_snprintf(p, len, "%s=%s", k, v); 20173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel envlist[envc++] = p; 20183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 20193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel envlist[envc] = 0; 20203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 20213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 20223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(PYCC_GCC) 20233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel spawnval = spawnvpe(mode, path, argvlist, envlist); 20243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 20253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel spawnval = _spawnvpe(mode, path, argvlist, envlist); 20263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 20273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 20283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 20293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (spawnval == -1) 203042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel (void) edk2_error(); 20313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else 20323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel res = Py_BuildValue("l", (long) spawnval); 20333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 20343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fail_2: 20353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel while (--envc >= 0) 20363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_DEL(envlist[envc]); 20373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_DEL(envlist); 20383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fail_1: 20393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel free_string_array(argvlist, lastarg); 20403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_XDECREF(vals); 20413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_XDECREF(keys); 20423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fail_0: 20433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyMem_Free(path); 20443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return res; 20453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 20463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* PYOS_OS2 */ 20473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SPAWNV */ 20483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 20493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 20503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FORK1 205142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_fork1__doc__, 20523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"fork1() -> pid\n\n\ 20533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielFork a child process with a single multiplexed (i.e., not bound) thread.\n\ 20543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel\n\ 20553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielReturn 0 to child process and PID of child to parent process."); 20563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 20573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 205842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_fork1(PyObject *self, PyObject *noargs) 20593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 20603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel pid_t pid; 20613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int result = 0; 20623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel _PyImport_AcquireLock(); 20633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel pid = fork1(); 20643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (pid == 0) { 20653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* child: this clobbers and resets the import lock. */ 20663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyOS_AfterFork(); 20673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } else { 20683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* parent: release the import lock. */ 20693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel result = _PyImport_ReleaseLock(); 20703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 20713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (pid == -1) 207242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 20733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (result < 0) { 20743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Don't clobber the OSError if the fork failed. */ 20753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_RuntimeError, 20763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "not holding the import lock"); 20773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 20783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 20793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyLong_FromPid(pid); 20803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 20813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 20823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 20833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 20843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FORK 208542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_fork__doc__, 20863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"fork() -> pid\n\n\ 20873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielFork a child process.\n\ 20883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielReturn 0 to child process and PID of child to parent process."); 20893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 20903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 209142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_fork(PyObject *self, PyObject *noargs) 20923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 20933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel pid_t pid; 20943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int result = 0; 20953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel _PyImport_AcquireLock(); 20963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel pid = fork(); 20973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (pid == 0) { 20983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* child: this clobbers and resets the import lock. */ 20993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyOS_AfterFork(); 21003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } else { 21013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* parent: release the import lock. */ 21023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel result = _PyImport_ReleaseLock(); 21033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 21043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (pid == -1) 210542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 21063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (result < 0) { 21073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Don't clobber the OSError if the fork failed. */ 21083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_RuntimeError, 21093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "not holding the import lock"); 21103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 21113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 21123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyLong_FromPid(pid); 21133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 21143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 21153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 21163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* AIX uses /dev/ptc but is otherwise the same as /dev/ptmx */ 21173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* IRIX has both /dev/ptc and /dev/ptmx, use ptmx */ 21183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_DEV_PTC) && !defined(HAVE_DEV_PTMX) 21193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define DEV_PTY_FILE "/dev/ptc" 21203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define HAVE_DEV_PTMX 21213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 21223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define DEV_PTY_FILE "/dev/ptmx" 21233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 21243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 21253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX) 21263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_PTY_H 21273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#include <pty.h> 21283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 21293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_LIBUTIL_H 21303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#include <libutil.h> 21313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 21323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_UTIL_H 21333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#include <util.h> 21343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_UTIL_H */ 21353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_LIBUTIL_H */ 21363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_PTY_H */ 21373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_STROPTS_H 21383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#include <stropts.h> 21393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 21403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX */ 21413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 21423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) 214342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_openpty__doc__, 21443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"openpty() -> (master_fd, slave_fd)\n\n\ 21453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielOpen a pseudo-terminal, returning open fd's for both master and slave end.\n"); 21463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 21473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 214842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_openpty(PyObject *self, PyObject *noargs) 21493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 21503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int master_fd, slave_fd; 21513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifndef HAVE_OPENPTY 21523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char * slave_name; 21533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 21543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_DEV_PTMX) && !defined(HAVE_OPENPTY) && !defined(HAVE__GETPTY) 21553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyOS_sighandler_t sig_saved; 21563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef sun 21573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel extern char *ptsname(int fildes); 21583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 21593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 21603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 21613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_OPENPTY 21623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) != 0) 216342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 21643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#elif defined(HAVE__GETPTY) 21653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel slave_name = _getpty(&master_fd, O_RDWR, 0666, 0); 21663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (slave_name == NULL) 216742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 21683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 21693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel slave_fd = open(slave_name, O_RDWR); 21703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (slave_fd < 0) 217142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 21723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 21733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel master_fd = open(DEV_PTY_FILE, O_RDWR | O_NOCTTY); /* open master */ 21743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (master_fd < 0) 217542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 21763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel sig_saved = PyOS_setsig(SIGCHLD, SIG_DFL); 21773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* change permission of slave */ 21783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (grantpt(master_fd) < 0) { 21793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyOS_setsig(SIGCHLD, sig_saved); 218042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 21813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 21823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* unlock slave */ 21833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (unlockpt(master_fd) < 0) { 21843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyOS_setsig(SIGCHLD, sig_saved); 218542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 21863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 21873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyOS_setsig(SIGCHLD, sig_saved); 21883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel slave_name = ptsname(master_fd); /* get name of slave */ 21893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (slave_name == NULL) 219042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 21913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel slave_fd = open(slave_name, O_RDWR | O_NOCTTY); /* open slave */ 21923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (slave_fd < 0) 219342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 21943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if !defined(__CYGWIN__) && !defined(HAVE_DEV_PTC) 21953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel ioctl(slave_fd, I_PUSH, "ptem"); /* push ptem */ 21963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel ioctl(slave_fd, I_PUSH, "ldterm"); /* push ldterm */ 21973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifndef __hpux 21983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel ioctl(slave_fd, I_PUSH, "ttcompat"); /* push ttcompat */ 21993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* __hpux */ 22003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_CYGWIN */ 22013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_OPENPTY */ 22023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 22033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_BuildValue("(ii)", master_fd, slave_fd); 22043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 22053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 22063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) */ 22073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 22083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FORKPTY 220942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_forkpty__doc__, 22103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"forkpty() -> (pid, master_fd)\n\n\ 22113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielFork a new process with a new pseudo-terminal as controlling tty.\n\n\ 22123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielLike fork(), return 0 as pid to child process, and PID of child to parent.\n\ 22133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielTo both, return fd of newly opened pseudo-terminal.\n"); 22143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 22153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 221642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_forkpty(PyObject *self, PyObject *noargs) 22173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 22183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int master_fd = -1, result = 0; 22193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel pid_t pid; 22203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 22213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel _PyImport_AcquireLock(); 22223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel pid = forkpty(&master_fd, NULL, NULL, NULL); 22233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (pid == 0) { 22243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* child: this clobbers and resets the import lock. */ 22253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyOS_AfterFork(); 22263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } else { 22273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* parent: release the import lock. */ 22283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel result = _PyImport_ReleaseLock(); 22293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 22303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (pid == -1) 223142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 22323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (result < 0) { 22333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Don't clobber the OSError if the fork failed. */ 22343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_RuntimeError, 22353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "not holding the import lock"); 22363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 22373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 22383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_BuildValue("(Ni)", PyLong_FromPid(pid), master_fd); 22393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 22403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 22413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 224242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_getpid__doc__, 22433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"getpid() -> pid\n\n\ 22443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielReturn the current process id"); 22453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 22463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 224742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_getpid(PyObject *self, PyObject *noargs) 22483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 22493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyLong_FromPid(getpid()); 22503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 22513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 22525285ac3eba73d3f6ad8cf356a0a8815fe97b3cf3Daryl McDaniel 22533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_GETLOGIN 225442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_getlogin__doc__, 22553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"getlogin() -> string\n\n\ 22563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielReturn the actual login name."); 22573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 22583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 225942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_getlogin(PyObject *self, PyObject *noargs) 22603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 22613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *result = NULL; 22623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *name; 22633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int old_errno = errno; 22643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 22653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel errno = 0; 22663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel name = getlogin(); 22673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (name == NULL) { 22683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (errno) 226942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel edk2_error(); 22703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else 22713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyErr_SetString(PyExc_OSError, 22723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel "unable to determine login name"); 22733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 22743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel else 22753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel result = PyString_FromString(name); 22763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel errno = old_errno; 22773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 22783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return result; 22793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 22803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 22813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 22823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_KILL 228342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_kill__doc__, 22843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"kill(pid, sig)\n\n\ 22853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielKill a process with a signal."); 22863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 22873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 228842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_kill(PyObject *self, PyObject *args) 22893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 22903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel pid_t pid; 22913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int sig; 22923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, PARSE_PID "i:kill", &pid, &sig)) 22933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 22943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(PYOS_OS2) && !defined(PYCC_GCC) 22953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) { 22963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel APIRET rc; 22973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR) 22983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return os2_error(rc); 22993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 23003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } else if (sig == XCPT_SIGNAL_KILLPROC) { 23013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel APIRET rc; 23023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR) 23033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return os2_error(rc); 23043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 23053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } else 23063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; /* Unrecognized Signal Requested */ 23073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#else 23083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (kill(pid, sig) == -1) 230942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 23103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 23113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 23123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 23133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 23143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 23153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 23163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_PLOCK 23173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 23183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYS_LOCK_H 23193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#include <sys/lock.h> 23203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 23213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 232242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_plock__doc__, 23233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"plock(op)\n\n\ 23243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielLock program segments into memory."); 23253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 23263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 232742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_plock(PyObject *self, PyObject *args) 23283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 23293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int op; 23303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "i:plock", &op)) 23313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 23323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (plock(op) == -1) 233342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 23343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 23353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 23363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 23373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 23383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 23393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 23403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_POPEN 234142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_popen__doc__, 23423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel"popen(command [, mode='r' [, bufsize]]) -> pipe\n\n\ 23433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielOpen a pipe to/from a command returning a file object."); 23443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 23453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 234642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_popen(PyObject *self, PyObject *args) 23473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 23483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *name; 23493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel char *mode = "r"; 23503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel int bufsize = -1; 23513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel FILE *fp; 23523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *f; 23533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize)) 23543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 2355173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel /* Strip mode of binary or text modifiers */ 2356173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (strcmp(mode, "rb") == 0 || strcmp(mode, "rt") == 0) 2357173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel mode = "r"; 2358173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel else if (strcmp(mode, "wb") == 0 || strcmp(mode, "wt") == 0) 2359173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel mode = "w"; 23603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 23613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel fp = popen(name, mode); 23623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 23633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (fp == NULL) 236442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 23653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel f = PyFile_FromFile(fp, name, mode, pclose); 23663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (f != NULL) 23673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyFile_SetBufSize(f, bufsize); 23683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return f; 23693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 23703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2371173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_POPEN */ 23723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 23735285ac3eba73d3f6ad8cf356a0a8815fe97b3cf3Daryl McDaniel 2374173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) 23753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 2376173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielwait_helper(pid_t pid, int status, struct rusage *ru) 23773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2378173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyObject *result; 2379173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel static PyObject *struct_rusage; 23803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2381173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (pid == -1) 238242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2383173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 2384173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (struct_rusage == NULL) { 2385173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyObject *m = PyImport_ImportModuleNoBlock("resource"); 2386173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (m == NULL) 2387173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 2388173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel struct_rusage = PyObject_GetAttrString(m, "struct_rusage"); 2389173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_DECREF(m); 2390173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (struct_rusage == NULL) 2391173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 2392173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 23933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2394173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel /* XXX(nnorwitz): Copied (w/mods) from resource.c, there should be only one. */ 2395173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel result = PyStructSequence_New((PyTypeObject*) struct_rusage); 2396173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!result) 23973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 23983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2399173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifndef doubletime 2400173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#define doubletime(TV) ((double)(TV).tv_sec + (TV).tv_usec * 0.000001) 2401173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif 24023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2403173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(result, 0, 2404173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyFloat_FromDouble(doubletime(ru->ru_utime))); 2405173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(result, 1, 2406173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyFloat_FromDouble(doubletime(ru->ru_stime))); 2407173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#define SET_INT(result, index, value)\ 2408173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(result, index, PyInt_FromLong(value)) 2409173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel SET_INT(result, 2, ru->ru_maxrss); 2410173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel SET_INT(result, 3, ru->ru_ixrss); 2411173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel SET_INT(result, 4, ru->ru_idrss); 2412173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel SET_INT(result, 5, ru->ru_isrss); 2413173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel SET_INT(result, 6, ru->ru_minflt); 2414173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel SET_INT(result, 7, ru->ru_majflt); 2415173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel SET_INT(result, 8, ru->ru_nswap); 2416173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel SET_INT(result, 9, ru->ru_inblock); 2417173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel SET_INT(result, 10, ru->ru_oublock); 2418173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel SET_INT(result, 11, ru->ru_msgsnd); 2419173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel SET_INT(result, 12, ru->ru_msgrcv); 2420173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel SET_INT(result, 13, ru->ru_nsignals); 2421173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel SET_INT(result, 14, ru->ru_nvcsw); 2422173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel SET_INT(result, 15, ru->ru_nivcsw); 2423173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#undef SET_INT 2424173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 2425173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (PyErr_Occurred()) { 2426173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_DECREF(result); 2427173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 2428173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 2429173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 2430173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_BuildValue("NiN", PyLong_FromPid(pid), status, result); 24313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 2432173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_WAIT3 || HAVE_WAIT4 */ 24333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2434173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_WAIT3 243542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_wait3__doc__, 2436173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"wait3(options) -> (pid, status, rusage)\n\n\ 2437173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielWait for completion of a child process."); 24383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 24393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 244042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_wait3(PyObject *self, PyObject *args) 24413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2442173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pid_t pid; 2443173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int options; 2444173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel struct rusage ru; 2445173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_TYPE status; 2446173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_STATUS_INT(status) = 0; 24473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2448173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:wait3", &options)) 24493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 24503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2451173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 2452173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pid = wait3(&status, options, &ru); 2453173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 24543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2455173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return wait_helper(pid, WAIT_STATUS_INT(status), &ru); 24563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 2457173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_WAIT3 */ 24583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2459173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_WAIT4 246042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_wait4__doc__, 2461173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"wait4(pid, options) -> (pid, status, rusage)\n\n\ 2462173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielWait for completion of a given child process."); 24633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 24643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 246542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_wait4(PyObject *self, PyObject *args) 24663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2467173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pid_t pid; 2468173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int options; 2469173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel struct rusage ru; 2470173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_TYPE status; 2471173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_STATUS_INT(status) = 0; 24723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2473173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, PARSE_PID "i:wait4", &pid, &options)) 24743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 24753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2476173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 2477173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pid = wait4(pid, &status, options, &ru); 2478173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 24793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2480173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return wait_helper(pid, WAIT_STATUS_INT(status), &ru); 24813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 2482173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_WAIT4 */ 24833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2484173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_WAITPID 248542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_waitpid__doc__, 2486173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"waitpid(pid, options) -> (pid, status)\n\n\ 2487173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielWait for completion of a given child process."); 24883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 24893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 249042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_waitpid(PyObject *self, PyObject *args) 24913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2492173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pid_t pid; 2493173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int options; 2494173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_TYPE status; 2495173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_STATUS_INT(status) = 0; 24963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2497173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, PARSE_PID "i:waitpid", &pid, &options)) 2498173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 2499173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 2500173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pid = waitpid(pid, &status, options); 2501173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 2502173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (pid == -1) 250342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 25043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2505173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status)); 2506173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel} 25073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2508173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#elif defined(HAVE_CWAIT) 25093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2510173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel/* MS C has a variant of waitpid() that's usable for most purposes. */ 251142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_waitpid__doc__, 2512173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"waitpid(pid, options) -> (pid, status << 8)\n\n" 2513173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"Wait for completion of a given process. options is ignored on Windows."); 25143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2515173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic PyObject * 251642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_waitpid(PyObject *self, PyObject *args) 2517173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel{ 2518173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_intptr_t pid; 2519173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int status, options; 25203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2521173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, PARSE_PID "i:waitpid", &pid, &options)) 2522173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 2523173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 2524173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pid = _cwait(&status, pid, options); 2525173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 2526173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (pid == -1) 252742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 25283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2529173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel /* shift the status left a byte so this is more like the POSIX waitpid */ 2530173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_BuildValue("Ni", PyLong_FromPid(pid), status << 8); 2531173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel} 2532173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_WAITPID || HAVE_CWAIT */ 25333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2534173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_WAIT 253542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_wait__doc__, 2536173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"wait() -> (pid, status)\n\n\ 2537173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielWait for completion of a child process."); 25383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2539173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic PyObject * 254042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_wait(PyObject *self, PyObject *noargs) 2541173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel{ 2542173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pid_t pid; 2543173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_TYPE status; 2544173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_STATUS_INT(status) = 0; 25453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2546173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 2547173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pid = wait(&status); 2548173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 2549173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (pid == -1) 255042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 25513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2552173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status)); 2553173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel} 2554173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif 25553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 25563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 255742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_lstat__doc__, 2558173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"lstat(path) -> stat result\n\n\ 2559173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielLike stat(path), but do not follow symbolic links."); 25603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2561173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic PyObject * 256242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_lstat(PyObject *self, PyObject *args) 2563173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel{ 2564173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_LSTAT 256542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_do_stat(self, args, "et:lstat", lstat, NULL, NULL); 2566173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#else /* !HAVE_LSTAT */ 256742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_do_stat(self, args, "et:lstat", STAT, NULL, NULL); 2568173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* !HAVE_LSTAT */ 2569173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel} 25703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 25713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2572173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_READLINK 257342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_readlink__doc__, 2574173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"readlink(path) -> path\n\n\ 2575173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn a string representing the path to which the symbolic link points."); 25763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2577173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic PyObject * 257842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_readlink(PyObject *self, PyObject *args) 25793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2580173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyObject* v; 2581173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char buf[MAXPATHLEN]; 2582173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *path; 2583173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int n; 2584173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef Py_USING_UNICODE 2585173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int arg_is_unicode = 0; 25863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 25873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2588173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "et:readlink", 2589173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_FileSystemDefaultEncoding, &path)) 2590173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 2591173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef Py_USING_UNICODE 2592173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel v = PySequence_GetItem(args, 0); 2593173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (v == NULL) { 2594173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyMem_Free(path); 2595173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 2596173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 25973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2598173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (PyUnicode_Check(v)) { 2599173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel arg_is_unicode = 1; 2600173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 2601173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_DECREF(v); 26023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 26033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2604173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 2605173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel n = readlink(path, buf, (int) sizeof buf); 2606173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 2607173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (n < 0) 260842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error_with_allocated_filename(path); 26093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2610173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyMem_Free(path); 2611173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel v = PyString_FromStringAndSize(buf, n); 2612173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef Py_USING_UNICODE 2613173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (arg_is_unicode) { 2614173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyObject *w; 26153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2616173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel w = PyUnicode_FromEncodedObject(v, 2617173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_FileSystemDefaultEncoding, 2618173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel "strict"); 2619173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (w != NULL) { 2620173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_DECREF(v); 2621173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel v = w; 2622173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 2623173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel else { 2624173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel /* fall back to the original byte string, as 2625173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel discussed in patch #683592 */ 2626173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyErr_Clear(); 2627173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 2628173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 26293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 2630173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return v; 26313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 2632173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_READLINK */ 26333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 26343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2635173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_SYMLINK 263642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_symlink__doc__, 2637173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"symlink(src, dst)\n\n\ 2638173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielCreate a symbolic link pointing to src named dst."); 26393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 26403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 264142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_symlink(PyObject *self, PyObject *args) 26423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 264342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_2str(args, "etet:symlink", symlink); 2644173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel} 2645173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_SYMLINK */ 26463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 26473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2648173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_TIMES 2649173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#define NEED_TICKS_PER_SECOND 2650173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic long ticks_per_second = -1; 26513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 265242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_times(PyObject *self, PyObject *noargs) 26533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2654173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel struct tms t; 2655173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel clock_t c; 2656173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel errno = 0; 2657173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel c = times(&t); 2658173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (c == (clock_t) -1) 265942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2660173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_BuildValue("ddddd", 2661173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel (double)t.tms_utime / ticks_per_second, 2662173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel (double)t.tms_stime / ticks_per_second, 2663173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel (double)t.tms_cutime / ticks_per_second, 2664173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel (double)t.tms_cstime / ticks_per_second, 2665173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel (double)c / ticks_per_second); 2666173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel} 2667173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_TIMES */ 26683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 26693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2670173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_TIMES 267142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_times__doc__, 2672173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\n\ 2673173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn a tuple of floating point numbers indicating process times."); 2674173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif 26753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 26763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2677173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_GETSID 267842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_getsid__doc__, 2679173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"getsid(pid) -> sid\n\n\ 2680173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielCall the system call getsid()."); 26813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 26823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 268342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_getsid(PyObject *self, PyObject *args) 26843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2685173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pid_t pid; 2686173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int sid; 2687173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, PARSE_PID ":getsid", &pid)) 26883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 2689173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel sid = getsid(pid); 2690173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (sid < 0) 269142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2692173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyInt_FromLong((long)sid); 2693173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel} 2694173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_GETSID */ 26953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 26963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2697173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_SETSID 269842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_setsid__doc__, 2699173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"setsid()\n\n\ 2700173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielCall the system call setsid()."); 27013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2702173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic PyObject * 270342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_setsid(PyObject *self, PyObject *noargs) 2704173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel{ 2705173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (setsid() < 0) 270642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2707173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_INCREF(Py_None); 2708173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_None; 27093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 2710173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_SETSID */ 27113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2712173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_SETPGID 271342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_setpgid__doc__, 2714173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"setpgid(pid, pgrp)\n\n\ 2715173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielCall the system call setpgid()."); 27163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 27173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 271842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_setpgid(PyObject *self, PyObject *args) 27193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2720173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pid_t pid; 2721173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int pgrp; 2722173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, PARSE_PID "i:setpgid", &pid, &pgrp)) 27233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 2724173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (setpgid(pid, pgrp) < 0) 272542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2726173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_INCREF(Py_None); 2727173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_None; 27283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 2729173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_SETPGID */ 27303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 27313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2732173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_TCGETPGRP 273342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_tcgetpgrp__doc__, 2734173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"tcgetpgrp(fd) -> pgid\n\n\ 2735173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn the process group associated with the terminal given by a fd."); 27363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 27373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 273842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_tcgetpgrp(PyObject *self, PyObject *args) 27393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2740173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd; 2741173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pid_t pgid; 2742173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:tcgetpgrp", &fd)) 2743173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 2744173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pgid = tcgetpgrp(fd); 2745173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (pgid < 0) 274642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2747173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyLong_FromPid(pgid); 27483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 2749173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_TCGETPGRP */ 27503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 27513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2752173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_TCSETPGRP 275342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_tcsetpgrp__doc__, 2754173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"tcsetpgrp(fd, pgid)\n\n\ 2755173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielSet the process group associated with the terminal given by a fd."); 27563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2757173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic PyObject * 275842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_tcsetpgrp(PyObject *self, PyObject *args) 2759173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel{ 2760173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd; 2761173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pid_t pgid; 2762173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i" PARSE_PID ":tcsetpgrp", &fd, &pgid)) 2763173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 2764173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (tcsetpgrp(fd, pgid) < 0) 276542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2766173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_INCREF(Py_None); 2767173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_None; 2768173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel} 2769173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_TCSETPGRP */ 27703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2771173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel/* Functions acting on file descriptors */ 27723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 277342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_open__doc__, 2774173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"open(filename, flag [, mode=0777]) -> fd\n\n\ 2775173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielOpen a file (for low level IO)."); 27763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 27773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 277842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_open(PyObject *self, PyObject *args) 27793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2780173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *file = NULL; 2781173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int flag; 2782173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int mode = 0777; 2783173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd; 2784173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 2785173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "eti|i", 2786173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_FileSystemDefaultEncoding, &file, 2787173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel &flag, &mode)) 27883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 2789173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 27903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 2791173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel fd = open(file, flag, mode); 27923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 2793173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (fd < 0) 279442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error_with_allocated_filename(file); 2795173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyMem_Free(file); 2796173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyInt_FromLong((long)fd); 27973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 27983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 27993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 280042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_close__doc__, 2801173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"close(fd)\n\n\ 2802173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielClose a file descriptor (for low level IO)."); 28033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 28043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 280542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_close(PyObject *self, PyObject *args) 28063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2807173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd, res; 2808173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:close", &fd)) 28093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 2810173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!_PyVerify_fd(fd)) 281142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2812173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 2813173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel res = close(fd); 2814173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 2815173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (res < 0) 281642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 28173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 28183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 28193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 28203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 28213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 282242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_closerange__doc__, 2823173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"closerange(fd_low, fd_high)\n\n\ 2824173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielCloses all file descriptors in [fd_low, fd_high), ignoring errors."); 28253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 28263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 282742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_closerange(PyObject *self, PyObject *args) 28283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2829173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd_from, fd_to, i; 2830173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "ii:closerange", &fd_from, &fd_to)) 28313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 2832173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 2833173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel for (i = fd_from; i < fd_to; i++) 2834173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (_PyVerify_fd(i)) 2835173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel close(i); 2836173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 2837173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_RETURN_NONE; 28383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 28393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2840173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 284142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_dup__doc__, 2842173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"dup(fd) -> fd2\n\n\ 2843173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn a duplicate of a file descriptor."); 28443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 28453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 284642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_dup(PyObject *self, PyObject *args) 28473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2848173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd; 2849173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:dup", &fd)) 28503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 2851173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!_PyVerify_fd(fd)) 285242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2853173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 2854173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel fd = dup(fd); 2855173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 2856173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (fd < 0) 285742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2858173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyInt_FromLong((long)fd); 28593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 28603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2861173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 286242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_dup2__doc__, 2863173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"dup2(old_fd, new_fd)\n\n\ 2864173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielDuplicate file descriptor."); 28653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 28663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 286742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_dup2(PyObject *self, PyObject *args) 28683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2869173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd, fd2, res; 2870173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "ii:dup2", &fd, &fd2)) 28713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 2872173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!_PyVerify_fd_dup2(fd, fd2)) 287342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2874173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 2875173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel res = dup2(fd, fd2); 2876173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 2877173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (res < 0) 287842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 28793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 28803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 28813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 28823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2883173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 288442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_lseek__doc__, 2885173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"lseek(fd, pos, how) -> newpos\n\n\ 2886173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielSet the current position of a file descriptor."); 28873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 28883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 288942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_lseek(PyObject *self, PyObject *args) 28903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2891173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd, how; 2892173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel off_t pos, res; 2893173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyObject *posobj; 2894173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "iOi:lseek", &fd, &posobj, &how)) 28953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 2896173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef SEEK_SET 2897173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */ 2898173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel switch (how) { 2899173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel case 0: how = SEEK_SET; break; 2900173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel case 1: how = SEEK_CUR; break; 2901173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel case 2: how = SEEK_END; break; 29023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 2903173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* SEEK_END */ 2904173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 2905173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#if !defined(HAVE_LARGEFILE_SUPPORT) 2906173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pos = PyInt_AsLong(posobj); 2907173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#else 2908173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel pos = PyLong_Check(posobj) ? 2909173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj); 2910173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif 2911173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (PyErr_Occurred()) 29123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 29133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2914173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!_PyVerify_fd(fd)) 291542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2916173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 2917173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel res = lseek(fd, pos, how); 2918173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 2919173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (res < 0) 292042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 29213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2922173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#if !defined(HAVE_LARGEFILE_SUPPORT) 2923173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyInt_FromLong(res); 2924173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#else 2925173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyLong_FromLongLong(res); 29263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 29273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 29283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2929173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 293042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_read__doc__, 2931173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"read(fd, buffersize) -> string\n\n\ 2932173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielRead a file descriptor."); 29333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 29343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 293542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_read(PyObject *self, PyObject *args) 29363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2937173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd, size, n; 2938173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyObject *buffer; 2939173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "ii:read", &fd, &size)) 29403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 2941173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (size < 0) { 2942173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel errno = EINVAL; 294342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2944173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 2945173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel buffer = PyString_FromStringAndSize((char *)NULL, size); 2946173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (buffer == NULL) 2947173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 2948173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!_PyVerify_fd(fd)) { 2949173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_DECREF(buffer); 295042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2951173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 29523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 2953173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel n = read(fd, PyString_AsString(buffer), size); 29543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 2955173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (n < 0) { 2956173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_DECREF(buffer); 295742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2958173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 2959173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (n != size) 2960173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel _PyString_Resize(&buffer, n); 2961173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return buffer; 29623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 29633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2964173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 296542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_write__doc__, 2966173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"write(fd, string) -> byteswritten\n\n\ 2967173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielWrite a string to a file descriptor."); 29683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 29693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 297042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_write(PyObject *self, PyObject *args) 29713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2972173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_buffer pbuf; 2973173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd; 2974173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_ssize_t size; 29753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2976173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "is*:write", &fd, &pbuf)) 29773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 2978173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!_PyVerify_fd(fd)) { 2979173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyBuffer_Release(&pbuf); 298042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2981173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 29823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 2983173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel size = write(fd, pbuf.buf, (size_t)pbuf.len); 29843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 2985173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyBuffer_Release(&pbuf); 2986173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (size < 0) 298742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 2988173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyInt_FromSsize_t(size); 29893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 29903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 2991173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 299242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_fstat__doc__, 2993173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"fstat(fd) -> stat result\n\n\ 2994173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielLike stat(), but for an open file descriptor."); 29953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 29963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 299742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_fstat(PyObject *self, PyObject *args) 29983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 2999173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd; 3000173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel STRUCT_STAT st; 3001173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int res; 3002173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:fstat", &fd)) 30033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 3004173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!_PyVerify_fd(fd)) 300542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 30063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 3007173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel res = FSTAT(fd, &st); 30083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 3009173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (res != 0) { 301042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 3011173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 30123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3013173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return _pystat_fromstructstat(&st); 30143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 30153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 30163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 301742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_fdopen__doc__, 3018173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"fdopen(fd [, mode='r' [, bufsize]]) -> file_object\n\n\ 3019173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn an open file object connected to a file descriptor."); 30203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 30213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 302242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_fdopen(PyObject *self, PyObject *args) 30233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3024173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd; 3025173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *orgmode = "r"; 3026173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int bufsize = -1; 3027173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel FILE *fp; 3028173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyObject *f; 3029173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *mode; 3030173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i|si", &fd, &orgmode, &bufsize)) 3031173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 30323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3033173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel /* Sanitize mode. See fileobject.c */ 3034173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel mode = PyMem_MALLOC(strlen(orgmode)+3); 3035173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!mode) { 3036173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyErr_NoMemory(); 3037173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3038173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 3039173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel strcpy(mode, orgmode); 3040173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (_PyFile_SanitizeMode(mode)) { 3041173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyMem_FREE(mode); 30423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 3043173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 3044173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!_PyVerify_fd(fd)) 304542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 30463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 304742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel#if defined(HAVE_FCNTL_H) 3048173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (mode[0] == 'a') { 3049173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel /* try to make sure the O_APPEND flag is set */ 3050173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int flags; 3051173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel flags = fcntl(fd, F_GETFL); 3052173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (flags != -1) 3053173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel fcntl(fd, F_SETFL, flags | O_APPEND); 3054173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel fp = fdopen(fd, mode); 3055173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (fp == NULL && flags != -1) 3056173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel /* restore old mode if fdopen failed */ 3057173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel fcntl(fd, F_SETFL, flags); 3058173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } else { 3059173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel fp = fdopen(fd, mode); 3060173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 3061173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#else 3062173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel fp = fdopen(fd, mode); 3063173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif 30643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 3065173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyMem_FREE(mode); 3066173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (fp == NULL) 306742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 3068173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel f = PyFile_FromFile(fp, "<fdopen>", orgmode, fclose); 3069173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (f != NULL) 3070173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyFile_SetBufSize(f, bufsize); 3071173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return f; 30723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 30733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 307442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_isatty__doc__, 3075173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"isatty(fd) -> bool\n\n\ 3076173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn True if the file descriptor 'fd' is an open file descriptor\n\ 3077173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielconnected to the slave end of a terminal."); 30783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 30793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 308042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_isatty(PyObject *self, PyObject *args) 30813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3082173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd; 3083173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:isatty", &fd)) 3084173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3085173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!_PyVerify_fd(fd)) 3086173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyBool_FromLong(0); 3087173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyBool_FromLong(isatty(fd)); 3088173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel} 3089173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3090173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_PIPE 309142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_pipe__doc__, 3092173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"pipe() -> (read_end, write_end)\n\n\ 3093173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielCreate a pipe."); 30943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3095173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic PyObject * 309642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_pipe(PyObject *self, PyObject *noargs) 3097173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel{ 3098173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fds[2]; 3099173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int res; 31003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 3101173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel res = pipe(fds); 31023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 3103173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (res != 0) 310442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 3105173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_BuildValue("(ii)", fds[0], fds[1]); 31063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3107173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_PIPE */ 31083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 31093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3110173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_MKFIFO 311142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_mkfifo__doc__, 3112173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"mkfifo(filename [, mode=0666])\n\n\ 3113173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielCreate a FIFO (a POSIX named pipe)."); 31143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 31153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 311642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_mkfifo(PyObject *self, PyObject *args) 31173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3118173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *filename; 3119173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int mode = 0666; 3120173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int res; 3121173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "s|i:mkfifo", &filename, &mode)) 3122173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3123173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 3124173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel res = mkfifo(filename, mode); 3125173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 3126173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (res < 0) 312742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 3128173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_INCREF(Py_None); 3129173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_None; 31303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3131173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif 31323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 31333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3134173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV) 313542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_mknod__doc__, 3136173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"mknod(filename [, mode=0600, device])\n\n\ 3137173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielCreate a filesystem node (file, device special file or named pipe)\n\ 3138173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielnamed filename. mode specifies both the permissions to use and the\n\ 3139173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanieltype of node to be created, being combined (bitwise OR) with one of\n\ 3140173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielS_IFREG, S_IFCHR, S_IFBLK, and S_IFIFO. For S_IFCHR and S_IFBLK,\n\ 3141173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanieldevice defines the newly created device special file (probably using\n\ 3142173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielos.makedev()), otherwise it is ignored."); 3143173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 31443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 31453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 314642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_mknod(PyObject *self, PyObject *args) 31473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3148173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *filename; 3149173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int mode = 0600; 3150173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int device = 0; 3151173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int res; 3152173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "s|ii:mknod", &filename, &mode, &device)) 31533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 31543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_BEGIN_ALLOW_THREADS 3155173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel res = mknod(filename, mode, device); 31563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_END_ALLOW_THREADS 3157173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (res < 0) 315842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 3159173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_INCREF(Py_None); 3160173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_None; 31613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3162173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif 31633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3164173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_DEVICE_MACROS 316542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_major__doc__, 3166173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"major(device) -> major number\n\ 3167173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielExtracts a device major number from a raw device number."); 31683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 31693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 317042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_major(PyObject *self, PyObject *args) 31713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3172173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int device; 3173173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:major", &device)) 3174173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3175173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyInt_FromLong((long)major(device)); 31763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 31773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 317842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_minor__doc__, 3179173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"minor(device) -> minor number\n\ 3180173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielExtracts a device minor number from a raw device number."); 31813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 31823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 318342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_minor(PyObject *self, PyObject *args) 31843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3185173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int device; 3186173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:minor", &device)) 3187173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3188173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyInt_FromLong((long)minor(device)); 31893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3190173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 319142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_makedev__doc__, 3192173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"makedev(major, minor) -> device number\n\ 3193173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielComposes a raw device number from the major and minor device numbers."); 3194173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 31953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 319642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_makedev(PyObject *self, PyObject *args) 31973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3198173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int major, minor; 3199173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "ii:makedev", &major, &minor)) 3200173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3201173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyInt_FromLong((long)makedev(major, minor)); 32023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3203173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* device macros */ 32043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 32053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3206173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_FTRUNCATE 320742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_ftruncate__doc__, 3208173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"ftruncate(fd, length)\n\n\ 3209173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielTruncate a file to a specified length."); 32103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 32113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 321242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_ftruncate(PyObject *self, PyObject *args) 32133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3214173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd; 3215173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel off_t length; 3216173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int res; 3217173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyObject *lenobj; 3218173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3219173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "iO:ftruncate", &fd, &lenobj)) 32203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 3221173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3222173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#if !defined(HAVE_LARGEFILE_SUPPORT) 3223173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel length = PyInt_AsLong(lenobj); 3224173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#else 3225173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel length = PyLong_Check(lenobj) ? 3226173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj); 3227173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif 3228173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (PyErr_Occurred()) 3229173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3230173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3231173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 3232173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel res = ftruncate(fd, length); 3233173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 3234173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (res < 0) 323542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 3236173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_INCREF(Py_None); 3237173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_None; 32383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3239173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif 32403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3241173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_PUTENV 324242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_putenv__doc__, 3243173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"putenv(key, value)\n\n\ 3244173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielChange or add an environment variable."); 32453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3246173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel/* Save putenv() parameters as values here, so we can collect them when they 3247173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel * get re-set with another call for the same key. */ 324842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielstatic PyObject *edk2_putenv_garbage; 32493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 32503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 325142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_putenv(PyObject *self, PyObject *args) 32523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3253173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *s1, *s2; 3254173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *newenv; 3255173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyObject *newstr; 3256173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel size_t len; 3257173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3258173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "ss:putenv", &s1, &s2)) 3259173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3260173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3261173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel /* XXX This can leak memory -- not easy to fix :-( */ 3262173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel len = strlen(s1) + strlen(s2) + 2; 3263173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel /* len includes space for a trailing \0; the size arg to 3264173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyString_FromStringAndSize does not count that */ 3265173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel newstr = PyString_FromStringAndSize(NULL, (int)len - 1); 3266173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (newstr == NULL) 3267173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyErr_NoMemory(); 3268173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel newenv = PyString_AS_STRING(newstr); 3269173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyOS_snprintf(newenv, len, "%s=%s", s1, s2); 3270173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (putenv(newenv)) { 3271173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_DECREF(newstr); 327242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel edk2_error(); 3273173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3274173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 327542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel /* Install the first arg and newstr in edk2_putenv_garbage; 3276173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel * this will cause previous value to be collected. This has to 3277173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel * happen after the real putenv() call because the old value 3278173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel * was still accessible until then. */ 327942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel if (PyDict_SetItem(edk2_putenv_garbage, 3280173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyTuple_GET_ITEM(args, 0), newstr)) { 3281173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel /* really not much we can do; just leak */ 3282173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyErr_Clear(); 3283173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 3284173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel else { 3285173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_DECREF(newstr); 3286173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 3287173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 32883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 32893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 32903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3291173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* putenv */ 32923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3293173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_UNSETENV 329442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_unsetenv__doc__, 3295173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"unsetenv(key)\n\n\ 3296173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielDelete an environment variable."); 32973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 32983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 329942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_unsetenv(PyObject *self, PyObject *args) 33003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3301173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *s1; 3302173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3303173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "s:unsetenv", &s1)) 33043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 3305173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3306173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel unsetenv(s1); 3307173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 330842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel /* Remove the key from edk2_putenv_garbage; 3309173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel * this will cause it to be collected. This has to 3310173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel * happen after the real unsetenv() call because the 3311173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel * old value was still accessible until then. 3312173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel */ 331342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel if (PyDict_DelItem(edk2_putenv_garbage, 3314173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyTuple_GET_ITEM(args, 0))) { 3315173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel /* really not much we can do; just leak */ 3316173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyErr_Clear(); 3317173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 3318173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 33193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(Py_None); 33203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return Py_None; 33213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3322173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* unsetenv */ 33233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 332442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_strerror__doc__, 3325173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"strerror(code) -> string\n\n\ 3326173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielTranslate an error code to a message string."); 33273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 33283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 332942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_strerror(PyObject *self, PyObject *args) 33303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3331173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int code; 3332173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *message; 3333173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:strerror", &code)) 33343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 3335173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel message = strerror(code); 3336173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (message == NULL) { 3337173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyErr_SetString(PyExc_ValueError, 3338173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel "strerror() argument out of range"); 3339173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3340173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 3341173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyString_FromString(message); 33423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 33433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 33443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3345173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_SYS_WAIT_H 3346173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3347173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef WCOREDUMP 334842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_WCOREDUMP__doc__, 3349173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"WCOREDUMP(status) -> bool\n\n\ 3350173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn True if the process returning 'status' was dumped to a core file."); 33513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 33523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 335342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_WCOREDUMP(PyObject *self, PyObject *args) 33543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3355173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_TYPE status; 3356173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_STATUS_INT(status) = 0; 3357173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3358173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:WCOREDUMP", &WAIT_STATUS_INT(status))) 33593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 33603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3361173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyBool_FromLong(WCOREDUMP(status)); 3362173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel} 3363173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* WCOREDUMP */ 33643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3365173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef WIFCONTINUED 336642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_WIFCONTINUED__doc__, 3367173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"WIFCONTINUED(status) -> bool\n\n\ 3368173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn True if the process returning 'status' was continued from a\n\ 3369173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanieljob control stop."); 33703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 33713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 337242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_WIFCONTINUED(PyObject *self, PyObject *args) 33733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3374173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_TYPE status; 3375173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_STATUS_INT(status) = 0; 33763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3377173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:WCONTINUED", &WAIT_STATUS_INT(status))) 33783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 33793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3380173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyBool_FromLong(WIFCONTINUED(status)); 33813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3382173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* WIFCONTINUED */ 33833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3384173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef WIFSTOPPED 338542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_WIFSTOPPED__doc__, 3386173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"WIFSTOPPED(status) -> bool\n\n\ 3387173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn True if the process returning 'status' was stopped."); 33883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 33893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 339042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_WIFSTOPPED(PyObject *self, PyObject *args) 33913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3392173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_TYPE status; 3393173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_STATUS_INT(status) = 0; 3394173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3395173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &WAIT_STATUS_INT(status))) 33963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 33973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3398173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyBool_FromLong(WIFSTOPPED(status)); 3399173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel} 3400173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* WIFSTOPPED */ 34013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3402173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef WIFSIGNALED 340342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_WIFSIGNALED__doc__, 3404173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"WIFSIGNALED(status) -> bool\n\n\ 3405173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn True if the process returning 'status' was terminated by a signal."); 34063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 34073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 340842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_WIFSIGNALED(PyObject *self, PyObject *args) 34093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3410173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_TYPE status; 3411173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_STATUS_INT(status) = 0; 34123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3413173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &WAIT_STATUS_INT(status))) 34143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 34153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3416173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyBool_FromLong(WIFSIGNALED(status)); 34173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3418173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* WIFSIGNALED */ 34193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3420173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef WIFEXITED 342142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_WIFEXITED__doc__, 3422173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"WIFEXITED(status) -> bool\n\n\ 3423173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn true if the process returning 'status' exited using the exit()\n\ 3424173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielsystem call."); 34253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 34263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 342742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_WIFEXITED(PyObject *self, PyObject *args) 34283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3429173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_TYPE status; 3430173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_STATUS_INT(status) = 0; 34313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3432173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:WIFEXITED", &WAIT_STATUS_INT(status))) 34333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 34343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3435173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyBool_FromLong(WIFEXITED(status)); 34363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3437173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* WIFEXITED */ 34383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3439173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef WEXITSTATUS 344042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_WEXITSTATUS__doc__, 3441173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"WEXITSTATUS(status) -> integer\n\n\ 3442173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn the process return code from 'status'."); 34433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 34443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 344542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_WEXITSTATUS(PyObject *self, PyObject *args) 34463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3447173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_TYPE status; 3448173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_STATUS_INT(status) = 0; 34493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3450173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &WAIT_STATUS_INT(status))) 34513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 34523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3453173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_BuildValue("i", WEXITSTATUS(status)); 3454173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel} 3455173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* WEXITSTATUS */ 34563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3457173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef WTERMSIG 345842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_WTERMSIG__doc__, 3459173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"WTERMSIG(status) -> integer\n\n\ 3460173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn the signal that terminated the process that provided the 'status'\n\ 3461173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielvalue."); 3462173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3463173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic PyObject * 346442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_WTERMSIG(PyObject *self, PyObject *args) 34653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3466173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_TYPE status; 3467173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_STATUS_INT(status) = 0; 3468173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3469173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:WTERMSIG", &WAIT_STATUS_INT(status))) 3470173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3471173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3472173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_BuildValue("i", WTERMSIG(status)); 34733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3474173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* WTERMSIG */ 34753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3476173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef WSTOPSIG 347742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_WSTOPSIG__doc__, 3478173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"WSTOPSIG(status) -> integer\n\n\ 3479173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn the signal that stopped the process that provided\n\ 3480173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielthe 'status' value."); 34813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 34823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 348342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_WSTOPSIG(PyObject *self, PyObject *args) 34843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3485173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_TYPE status; 3486173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel WAIT_STATUS_INT(status) = 0; 34873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3488173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &WAIT_STATUS_INT(status))) 3489173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 34903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3491173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return Py_BuildValue("i", WSTOPSIG(status)); 34923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3493173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* WSTOPSIG */ 34943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3495173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_SYS_WAIT_H */ 34963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 34973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3498173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#if defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H) 3499173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#include <sys/statvfs.h> 3500173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3501173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic PyObject* 3502173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel_pystatvfs_fromstructstatvfs(struct statvfs st) { 3503173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyObject *v = PyStructSequence_New(&StatVFSResultType); 3504173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (v == NULL) 3505173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3506173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3507173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#if !defined(HAVE_LARGEFILE_SUPPORT) 3508173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 0, PyInt_FromLong((long) st.f_bsize)); 3509173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long) st.f_frsize)); 3510173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 2, PyInt_FromLong((long) st.f_blocks)); 3511173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 3, PyInt_FromLong((long) st.f_bfree)); 3512173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 4, PyInt_FromLong((long) st.f_bavail)); 3513173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 5, PyInt_FromLong((long) st.f_files)); 3514173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 6, PyInt_FromLong((long) st.f_ffree)); 3515173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 7, PyInt_FromLong((long) st.f_favail)); 3516173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 8, PyInt_FromLong((long) st.f_flag)); 3517173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 9, PyInt_FromLong((long) st.f_namemax)); 3518173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#else 3519173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 0, PyInt_FromLong((long) st.f_bsize)); 3520173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long) st.f_frsize)); 3521173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 2, 3522173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyLong_FromLongLong((PY_LONG_LONG) st.f_blocks)); 3523173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 3, 3524173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyLong_FromLongLong((PY_LONG_LONG) st.f_bfree)); 3525173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 4, 3526173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyLong_FromLongLong((PY_LONG_LONG) st.f_bavail)); 3527173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 5, 3528173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyLong_FromLongLong((PY_LONG_LONG) st.f_files)); 3529173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 6, 3530173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyLong_FromLongLong((PY_LONG_LONG) st.f_ffree)); 3531173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 7, 3532173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyLong_FromLongLong((PY_LONG_LONG) st.f_favail)); 3533173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 8, PyInt_FromLong((long) st.f_flag)); 3534173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyStructSequence_SET_ITEM(v, 9, PyInt_FromLong((long) st.f_namemax)); 3535173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif 35363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3537173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return v; 35383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 35393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 354042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_fstatvfs__doc__, 3541173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"fstatvfs(fd) -> statvfs result\n\n\ 3542173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielPerform an fstatvfs system call on the given fd."); 3543173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3544173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic PyObject * 354542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_fstatvfs(PyObject *self, PyObject *args) 35463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3547173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int fd, res; 3548173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel struct statvfs st; 35493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3550173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "i:fstatvfs", &fd)) 3551173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3552173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 3553173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel res = fstatvfs(fd, &st); 3554173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 3555173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (res != 0) 355642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 35573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3558173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return _pystatvfs_fromstructstatvfs(st); 35593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3560173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_FSTATVFS && HAVE_SYS_STATVFS_H */ 35613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3562173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3563173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H) 3564173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#include <sys/statvfs.h> 3565173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 356642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_statvfs__doc__, 3567173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"statvfs(path) -> statvfs result\n\n\ 3568173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielPerform a statvfs system call on the given path."); 3569173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3570173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic PyObject * 357142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_statvfs(PyObject *self, PyObject *args) 35723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3573173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *path; 3574173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel int res; 3575173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel struct statvfs st; 3576173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "s:statvfs", &path)) 3577173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3578173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_BEGIN_ALLOW_THREADS 3579173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel res = statvfs(path, &st); 3580173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_END_ALLOW_THREADS 3581173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (res != 0) 358242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error_with_filename(path); 3583173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3584173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return _pystatvfs_fromstructstatvfs(st); 35853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 3586173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif /* HAVE_STATVFS */ 35873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 35883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3589173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_TEMPNAM 359042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_tempnam__doc__, 3591173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"tempnam([dir[, prefix]]) -> string\n\n\ 3592173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn a unique name for a temporary file.\n\ 3593173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielThe directory and a prefix may be specified as strings; they may be omitted\n\ 3594173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielor None if not needed."); 35953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 35963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic PyObject * 359742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_tempnam(PyObject *self, PyObject *args) 35983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3599173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyObject *result = NULL; 3600173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *dir = NULL; 3601173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *pfx = NULL; 3602173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *name; 3603173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3604173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (!PyArg_ParseTuple(args, "|zz:tempnam", &dir, &pfx)) 36053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 36063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3607173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (PyErr_Warn(PyExc_RuntimeWarning, 3608173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel "tempnam is a potential security risk to your program") < 0) 3609173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 36103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3611173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (PyErr_WarnPy3k("tempnam has been removed in 3.x; " 3612173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel "use the tempfile module", 1) < 0) 36133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 3614173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3615173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel name = tempnam(dir, pfx); 3616173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (name == NULL) 3617173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyErr_NoMemory(); 3618173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel result = PyString_FromString(name); 3619173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel free(name); 3620173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return result; 36213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 36223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 36233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 36243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3625173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_TMPFILE 362642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_tmpfile__doc__, 3627173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"tmpfile() -> file object\n\n\ 3628173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielCreate a temporary file with no directory entries."); 3629173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3630173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic PyObject * 363142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_tmpfile(PyObject *self, PyObject *noargs) 36323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3633173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel FILE *fp; 3634173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3635173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (PyErr_WarnPy3k("tmpfile has been removed in 3.x; " 3636173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel "use the tempfile module", 1) < 0) 36373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return NULL; 3638173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3639173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel fp = tmpfile(); 3640173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (fp == NULL) 364142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel return edk2_error(); 3642173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyFile_FromFile(fp, "<tmpfile>", "w+b", fclose); 36433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 36443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 36453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 36463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3647173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef HAVE_TMPNAM 364842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_tmpnam__doc__, 3649173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"tmpnam() -> string\n\n\ 3650173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielReturn a unique name for a temporary file."); 3651173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3652173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic PyObject * 365342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_tmpnam(PyObject *self, PyObject *noargs) 36543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3655173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char buffer[L_tmpnam]; 3656173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel char *name; 3657173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3658173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (PyErr_Warn(PyExc_RuntimeWarning, 3659173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel "tmpnam is a potential security risk to your program") < 0) 3660173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3661173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3662173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (PyErr_WarnPy3k("tmpnam has been removed in 3.x; " 3663173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel "use the tempfile module", 1) < 0) 3664173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3665173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel 3666173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef USE_TMPNAM_R 3667173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel name = tmpnam_r(buffer); 3668173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#else 3669173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel name = tmpnam(buffer); 3670173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif 3671173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel if (name == NULL) { 3672173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyObject *err = Py_BuildValue("is", 0, 3673173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#ifdef USE_TMPNAM_R 3674173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel "unexpected NULL from tmpnam_r" 3675173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#else 3676173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel "unexpected NULL from tmpnam" 3677173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel#endif 3678173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel ); 3679173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel PyErr_SetObject(PyExc_OSError, err); 3680173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_XDECREF(err); 3681173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 3682173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel } 3683173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return PyString_FromString(buffer); 36843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 36853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 36863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 368742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielPyDoc_STRVAR(edk2_abort__doc__, 3688173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel"abort() -> does not return!\n\n\ 3689173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielAbort the interpreter immediately. This 'dumps core' or otherwise fails\n\ 3690173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielin the hardest way possible on the hosting operating system."); 36913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 3692173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDanielstatic PyObject * 369342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanieledk2_abort(PyObject *self, PyObject *noargs) 36943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 3695173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel abort(); 3696173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel /*NOTREACHED*/ 3697173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel Py_FatalError("abort() called from Python code didn't abort!"); 3698173523c20de4f882250c5aaf072cf94e327dfb4eDaryl McDaniel return NULL; 36993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 37003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 370142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDanielstatic PyMethodDef edk2_methods[] = { 370242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"access", edk2_access, METH_VARARGS, edk2_access__doc__}, 37033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_TTYNAME 370442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"ttyname", edk2_ttyname, METH_VARARGS, edk2_ttyname__doc__}, 37053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 370642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"chdir", edk2_chdir, METH_VARARGS, edk2_chdir__doc__}, 37073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_CHFLAGS 370842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"chflags", edk2_chflags, METH_VARARGS, edk2_chflags__doc__}, 37093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_CHFLAGS */ 371042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"chmod", edk2_chmod, METH_VARARGS, edk2_chmod__doc__}, 37113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FCHMOD 371242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"fchmod", edk2_fchmod, METH_VARARGS, edk2_fchmod__doc__}, 37133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_FCHMOD */ 37143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_CHOWN 371542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"chown", edk2_chown, METH_VARARGS, edk2_chown__doc__}, 37163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_CHOWN */ 37173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_LCHMOD 371842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"lchmod", edk2_lchmod, METH_VARARGS, edk2_lchmod__doc__}, 37193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_LCHMOD */ 37203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FCHOWN 372142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"fchown", edk2_fchown, METH_VARARGS, edk2_fchown__doc__}, 37223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_FCHOWN */ 37233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_LCHFLAGS 372442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"lchflags", edk2_lchflags, METH_VARARGS, edk2_lchflags__doc__}, 37253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_LCHFLAGS */ 37263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_LCHOWN 372742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"lchown", edk2_lchown, METH_VARARGS, edk2_lchown__doc__}, 37283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_LCHOWN */ 37293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_CHROOT 373042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"chroot", edk2_chroot, METH_VARARGS, edk2_chroot__doc__}, 37313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 37323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_CTERMID 373342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"ctermid", edk2_ctermid, METH_NOARGS, edk2_ctermid__doc__}, 37343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 37353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_GETCWD 373642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"getcwd", edk2_getcwd, METH_NOARGS, edk2_getcwd__doc__}, 37373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef Py_USING_UNICODE 373842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"getcwdu", edk2_getcwdu, METH_NOARGS, edk2_getcwdu__doc__}, 37393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 37403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 37413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_LINK 374242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"link", edk2_link, METH_VARARGS, edk2_link__doc__}, 37433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_LINK */ 374442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"listdir", edk2_listdir, METH_VARARGS, edk2_listdir__doc__}, 374542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"lstat", edk2_lstat, METH_VARARGS, edk2_lstat__doc__}, 374642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"mkdir", edk2_mkdir, METH_VARARGS, edk2_mkdir__doc__}, 37473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_NICE 374842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"nice", edk2_nice, METH_VARARGS, edk2_nice__doc__}, 37493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_NICE */ 37503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_READLINK 375142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"readlink", edk2_readlink, METH_VARARGS, edk2_readlink__doc__}, 37523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_READLINK */ 375342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"rename", edk2_rename, METH_VARARGS, edk2_rename__doc__}, 375442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"rmdir", edk2_rmdir, METH_VARARGS, edk2_rmdir__doc__}, 375542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"stat", edk2_stat, METH_VARARGS, edk2_stat__doc__}, 37563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel //{"stat_float_times", stat_float_times, METH_VARARGS, stat_float_times__doc__}, 37573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYMLINK 375842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"symlink", edk2_symlink, METH_VARARGS, edk2_symlink__doc__}, 37593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SYMLINK */ 37603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYSTEM 376142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"system", edk2_system, METH_VARARGS, edk2_system__doc__}, 37623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 376342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"umask", edk2_umask, METH_VARARGS, edk2_umask__doc__}, 37643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_UNAME 376542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"uname", edk2_uname, METH_NOARGS, edk2_uname__doc__}, 37663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_UNAME */ 376742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"unlink", edk2_unlink, METH_VARARGS, edk2_unlink__doc__}, 376842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"remove", edk2_unlink, METH_VARARGS, edk2_remove__doc__}, 376942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"utime", edk2_utime, METH_VARARGS, edk2_utime__doc__}, 37703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_TIMES 377142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"times", edk2_times, METH_NOARGS, edk2_times__doc__}, 37723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_TIMES */ 377342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"_exit", edk2__exit, METH_VARARGS, edk2__exit__doc__}, 37743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_EXECV 377542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"execv", edk2_execv, METH_VARARGS, edk2_execv__doc__}, 377642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"execve", edk2_execve, METH_VARARGS, edk2_execve__doc__}, 37773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_EXECV */ 37783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SPAWNV 377942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"spawnv", edk2_spawnv, METH_VARARGS, edk2_spawnv__doc__}, 378042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"spawnve", edk2_spawnve, METH_VARARGS, edk2_spawnve__doc__}, 37813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(PYOS_OS2) 378242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"spawnvp", edk2_spawnvp, METH_VARARGS, edk2_spawnvp__doc__}, 378342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"spawnvpe", edk2_spawnvpe, METH_VARARGS, edk2_spawnvpe__doc__}, 37843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* PYOS_OS2 */ 37853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SPAWNV */ 37863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FORK1 378742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"fork1", edk2_fork1, METH_NOARGS, edk2_fork1__doc__}, 37883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_FORK1 */ 37893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FORK 379042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"fork", edk2_fork, METH_NOARGS, edk2_fork__doc__}, 37913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_FORK */ 37923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) 379342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"openpty", edk2_openpty, METH_NOARGS, edk2_openpty__doc__}, 37943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_OPENPTY || HAVE__GETPTY || HAVE_DEV_PTMX */ 37953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FORKPTY 379642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"forkpty", edk2_forkpty, METH_NOARGS, edk2_forkpty__doc__}, 37973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_FORKPTY */ 379842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"getpid", edk2_getpid, METH_NOARGS, edk2_getpid__doc__}, 37993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_GETPGRP 380042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"getpgrp", edk2_getpgrp, METH_NOARGS, edk2_getpgrp__doc__}, 38013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_GETPGRP */ 38023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_GETPPID 380342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"getppid", edk2_getppid, METH_NOARGS, edk2_getppid__doc__}, 38043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_GETPPID */ 38053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_GETLOGIN 380642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"getlogin", edk2_getlogin, METH_NOARGS, edk2_getlogin__doc__}, 38073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 38083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_KILL 380942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"kill", edk2_kill, METH_VARARGS, edk2_kill__doc__}, 38103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_KILL */ 38113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_KILLPG 381242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"killpg", edk2_killpg, METH_VARARGS, edk2_killpg__doc__}, 38133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_KILLPG */ 38143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_PLOCK 381542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"plock", edk2_plock, METH_VARARGS, edk2_plock__doc__}, 38163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_PLOCK */ 38173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_POPEN 381842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"popen", edk2_popen, METH_VARARGS, edk2_popen__doc__}, 38193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_POPEN */ 38203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SETGROUPS 382142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"setgroups", edk2_setgroups, METH_O, edk2_setgroups__doc__}, 38223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SETGROUPS */ 38233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_INITGROUPS 382442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"initgroups", edk2_initgroups, METH_VARARGS, edk2_initgroups__doc__}, 38253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_INITGROUPS */ 38263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_GETPGID 382742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"getpgid", edk2_getpgid, METH_VARARGS, edk2_getpgid__doc__}, 38283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_GETPGID */ 38293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SETPGRP 383042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"setpgrp", edk2_setpgrp, METH_NOARGS, edk2_setpgrp__doc__}, 38313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SETPGRP */ 38323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_WAIT 383342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"wait", edk2_wait, METH_NOARGS, edk2_wait__doc__}, 38343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_WAIT */ 38353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_WAIT3 383642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"wait3", edk2_wait3, METH_VARARGS, edk2_wait3__doc__}, 38373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_WAIT3 */ 38383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_WAIT4 383942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"wait4", edk2_wait4, METH_VARARGS, edk2_wait4__doc__}, 38403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_WAIT4 */ 38413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_WAITPID) || defined(HAVE_CWAIT) 384242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"waitpid", edk2_waitpid, METH_VARARGS, edk2_waitpid__doc__}, 38433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_WAITPID */ 38443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_GETSID 384542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"getsid", edk2_getsid, METH_VARARGS, edk2_getsid__doc__}, 38463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_GETSID */ 38473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SETSID 384842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"setsid", edk2_setsid, METH_NOARGS, edk2_setsid__doc__}, 38493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SETSID */ 38503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SETPGID 385142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"setpgid", edk2_setpgid, METH_VARARGS, edk2_setpgid__doc__}, 38523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SETPGID */ 38533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_TCGETPGRP 385442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"tcgetpgrp", edk2_tcgetpgrp, METH_VARARGS, edk2_tcgetpgrp__doc__}, 38553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_TCGETPGRP */ 38563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_TCSETPGRP 385742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"tcsetpgrp", edk2_tcsetpgrp, METH_VARARGS, edk2_tcsetpgrp__doc__}, 38583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_TCSETPGRP */ 385942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"open", edk2_open, METH_VARARGS, edk2_open__doc__}, 386042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"close", edk2_close, METH_VARARGS, edk2_close__doc__}, 386142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"closerange", edk2_closerange, METH_VARARGS, edk2_closerange__doc__}, 386242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"dup", edk2_dup, METH_VARARGS, edk2_dup__doc__}, 386342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"dup2", edk2_dup2, METH_VARARGS, edk2_dup2__doc__}, 386442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"lseek", edk2_lseek, METH_VARARGS, edk2_lseek__doc__}, 386542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"read", edk2_read, METH_VARARGS, edk2_read__doc__}, 386642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"write", edk2_write, METH_VARARGS, edk2_write__doc__}, 386742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"fstat", edk2_fstat, METH_VARARGS, edk2_fstat__doc__}, 386842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"fdopen", edk2_fdopen, METH_VARARGS, edk2_fdopen__doc__}, 386942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"isatty", edk2_isatty, METH_VARARGS, edk2_isatty__doc__}, 38703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_PIPE 387142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"pipe", edk2_pipe, METH_NOARGS, edk2_pipe__doc__}, 38723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 38733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_MKFIFO 387442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"mkfifo", edk2_mkfifo, METH_VARARGS, edk2_mkfifo__doc__}, 38753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 38763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV) 387742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"mknod", edk2_mknod, METH_VARARGS, edk2_mknod__doc__}, 38783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 38793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_DEVICE_MACROS 388042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"major", edk2_major, METH_VARARGS, edk2_major__doc__}, 388142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"minor", edk2_minor, METH_VARARGS, edk2_minor__doc__}, 388242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"makedev", edk2_makedev, METH_VARARGS, edk2_makedev__doc__}, 38833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 38843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FTRUNCATE 388542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"ftruncate", edk2_ftruncate, METH_VARARGS, edk2_ftruncate__doc__}, 38863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 38873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_PUTENV 388842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"putenv", edk2_putenv, METH_VARARGS, edk2_putenv__doc__}, 38893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 38903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_UNSETENV 389142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"unsetenv", edk2_unsetenv, METH_VARARGS, edk2_unsetenv__doc__}, 38923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 389342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"strerror", edk2_strerror, METH_VARARGS, edk2_strerror__doc__}, 38943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FCHDIR 389542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"fchdir", edk2_fchdir, METH_O, edk2_fchdir__doc__}, 38963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 38973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FSYNC 389842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"fsync", edk2_fsync, METH_O, edk2_fsync__doc__}, 38993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FDATASYNC 390142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"fdatasync", edk2_fdatasync, METH_O, edk2_fdatasync__doc__}, 39023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYS_WAIT_H 39043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef WCOREDUMP 390542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"WCOREDUMP", edk2_WCOREDUMP, METH_VARARGS, edk2_WCOREDUMP__doc__}, 39063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* WCOREDUMP */ 39073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef WIFCONTINUED 390842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"WIFCONTINUED",edk2_WIFCONTINUED, METH_VARARGS, edk2_WIFCONTINUED__doc__}, 39093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* WIFCONTINUED */ 39103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef WIFSTOPPED 391142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"WIFSTOPPED", edk2_WIFSTOPPED, METH_VARARGS, edk2_WIFSTOPPED__doc__}, 39123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* WIFSTOPPED */ 39133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef WIFSIGNALED 391442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"WIFSIGNALED", edk2_WIFSIGNALED, METH_VARARGS, edk2_WIFSIGNALED__doc__}, 39153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* WIFSIGNALED */ 39163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef WIFEXITED 391742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"WIFEXITED", edk2_WIFEXITED, METH_VARARGS, edk2_WIFEXITED__doc__}, 39183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* WIFEXITED */ 39193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef WEXITSTATUS 392042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"WEXITSTATUS", edk2_WEXITSTATUS, METH_VARARGS, edk2_WEXITSTATUS__doc__}, 39213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* WEXITSTATUS */ 39223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef WTERMSIG 392342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"WTERMSIG", edk2_WTERMSIG, METH_VARARGS, edk2_WTERMSIG__doc__}, 39243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* WTERMSIG */ 39253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef WSTOPSIG 392642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"WSTOPSIG", edk2_WSTOPSIG, METH_VARARGS, edk2_WSTOPSIG__doc__}, 39273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* WSTOPSIG */ 39283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* HAVE_SYS_WAIT_H */ 39293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H) 393042fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"fstatvfs", edk2_fstatvfs, METH_VARARGS, edk2_fstatvfs__doc__}, 39313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H) 393342fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"statvfs", edk2_statvfs, METH_VARARGS, edk2_statvfs__doc__}, 39343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_TMPFILE 393642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"tmpfile", edk2_tmpfile, METH_NOARGS, edk2_tmpfile__doc__}, 39373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_TEMPNAM 393942fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"tempnam", edk2_tempnam, METH_VARARGS, edk2_tempnam__doc__}, 39403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_TMPNAM 394242fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"tmpnam", edk2_tmpnam, METH_NOARGS, edk2_tmpnam__doc__}, 39433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_CONFSTR 394542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"confstr", edk2_confstr, METH_VARARGS, edk2_confstr__doc__}, 39463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SYSCONF 394842fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"sysconf", edk2_sysconf, METH_VARARGS, edk2_sysconf__doc__}, 39493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_FPATHCONF 395142fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"fpathconf", edk2_fpathconf, METH_VARARGS, edk2_fpathconf__doc__}, 39523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_PATHCONF 395442fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"pathconf", edk2_pathconf, METH_VARARGS, edk2_pathconf__doc__}, 39553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 395642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel {"abort", edk2_abort, METH_NOARGS, edk2_abort__doc__}, 39573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 39583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel {NULL, NULL} /* Sentinel */ 39593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel}; 39603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 39613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 39623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic int 39633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielins(PyObject *module, char *symbol, long value) 39643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 39653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return PyModule_AddIntConstant(module, symbol, value); 39663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 39673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 39683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielstatic int 39693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielall_ins(PyObject *d) 39703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 39713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef F_OK 39723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "F_OK", (long)F_OK)) return -1; 39733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef R_OK 39753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "R_OK", (long)R_OK)) return -1; 39763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef W_OK 39783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "W_OK", (long)W_OK)) return -1; 39793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef X_OK 39813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "X_OK", (long)X_OK)) return -1; 39823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef NGROUPS_MAX 39843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1; 39853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef TMP_MAX 39873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1; 39883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef WCONTINUED 39903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "WCONTINUED", (long)WCONTINUED)) return -1; 39913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef WNOHANG 39933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "WNOHANG", (long)WNOHANG)) return -1; 39943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef WUNTRACED 39963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "WUNTRACED", (long)WUNTRACED)) return -1; 39973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 39983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_RDONLY 39993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1; 40003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_WRONLY 40023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1; 40033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_RDWR 40053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_RDWR", (long)O_RDWR)) return -1; 40063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_NDELAY 40083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1; 40093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_NONBLOCK 40113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1; 40123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_APPEND 40143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_APPEND", (long)O_APPEND)) return -1; 40153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_DSYNC 40173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1; 40183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_RSYNC 40203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1; 40213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_SYNC 40233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_SYNC", (long)O_SYNC)) return -1; 40243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_NOCTTY 40263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1; 40273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_CREAT 40293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_CREAT", (long)O_CREAT)) return -1; 40303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_EXCL 40323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_EXCL", (long)O_EXCL)) return -1; 40333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_TRUNC 40353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1; 40363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_BINARY 40383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_BINARY", (long)O_BINARY)) return -1; 40393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_TEXT 40413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_TEXT", (long)O_TEXT)) return -1; 40423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_LARGEFILE 40443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_LARGEFILE", (long)O_LARGEFILE)) return -1; 40453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_SHLOCK 40473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_SHLOCK", (long)O_SHLOCK)) return -1; 40483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_EXLOCK 40503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_EXLOCK", (long)O_EXLOCK)) return -1; 40513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 40533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* MS Windows */ 40543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_NOINHERIT 40553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Don't inherit in child processes. */ 40563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_NOINHERIT", (long)O_NOINHERIT)) return -1; 40573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef _O_SHORT_LIVED 40593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Optimize for short life (keep in memory). */ 40603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* MS forgot to define this one with a non-underscore form too. */ 40613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_SHORT_LIVED", (long)_O_SHORT_LIVED)) return -1; 40623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_TEMPORARY 40643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Automatically delete when last handle is closed. */ 40653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_TEMPORARY", (long)O_TEMPORARY)) return -1; 40663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_RANDOM 40683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Optimize for random access. */ 40693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_RANDOM", (long)O_RANDOM)) return -1; 40703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_SEQUENTIAL 40723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Optimize for sequential access. */ 40733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_SEQUENTIAL", (long)O_SEQUENTIAL)) return -1; 40743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40753ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 40763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel/* GNU extensions. */ 40773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_ASYNC 40783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Send a SIGIO signal whenever input or output 40793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel becomes available on file descriptor */ 40803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_ASYNC", (long)O_ASYNC)) return -1; 40813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_DIRECT 40833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Direct disk access. */ 40843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_DIRECT", (long)O_DIRECT)) return -1; 40853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_DIRECTORY 40873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Must be a directory. */ 40883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_DIRECTORY", (long)O_DIRECTORY)) return -1; 40893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_NOFOLLOW 40913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Do not follow links. */ 40923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_NOFOLLOW", (long)O_NOFOLLOW)) return -1; 40933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef O_NOATIME 40953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Do not update the access time. */ 40963ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "O_NOATIME", (long)O_NOATIME)) return -1; 40973ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 40983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 40993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* These come from sysexits.h */ 41003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_OK 41013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_OK", (long)EX_OK)) return -1; 41023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_OK */ 41033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_USAGE 41043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_USAGE", (long)EX_USAGE)) return -1; 41053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_USAGE */ 41063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_DATAERR 41073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_DATAERR", (long)EX_DATAERR)) return -1; 41083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_DATAERR */ 41093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_NOINPUT 41103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_NOINPUT", (long)EX_NOINPUT)) return -1; 41113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_NOINPUT */ 41123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_NOUSER 41133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_NOUSER", (long)EX_NOUSER)) return -1; 41143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_NOUSER */ 41153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_NOHOST 41163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_NOHOST", (long)EX_NOHOST)) return -1; 41173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_NOHOST */ 41183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_UNAVAILABLE 41193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_UNAVAILABLE", (long)EX_UNAVAILABLE)) return -1; 41203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_UNAVAILABLE */ 41213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_SOFTWARE 41223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_SOFTWARE", (long)EX_SOFTWARE)) return -1; 41233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_SOFTWARE */ 41243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_OSERR 41253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_OSERR", (long)EX_OSERR)) return -1; 41263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_OSERR */ 41273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_OSFILE 41283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_OSFILE", (long)EX_OSFILE)) return -1; 41293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_OSFILE */ 41303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_CANTCREAT 41313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_CANTCREAT", (long)EX_CANTCREAT)) return -1; 41323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_CANTCREAT */ 41333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_IOERR 41343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_IOERR", (long)EX_IOERR)) return -1; 41353ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_IOERR */ 41363ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_TEMPFAIL 41373ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_TEMPFAIL", (long)EX_TEMPFAIL)) return -1; 41383ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_TEMPFAIL */ 41393ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_PROTOCOL 41403ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_PROTOCOL", (long)EX_PROTOCOL)) return -1; 41413ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_PROTOCOL */ 41423ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_NOPERM 41433ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_NOPERM", (long)EX_NOPERM)) return -1; 41443ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_NOPERM */ 41453ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_CONFIG 41463ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_CONFIG", (long)EX_CONFIG)) return -1; 41473ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_CONFIG */ 41483ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef EX_NOTFOUND 41493ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "EX_NOTFOUND", (long)EX_NOTFOUND)) return -1; 41503ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* EX_NOTFOUND */ 41513ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 41523ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_SPAWNV 41533ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1; 41543ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1; 41553ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1; 41563ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1; 41573ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1; 41583ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 41593ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return 0; 41603ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 41613ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 41623ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define INITFUNC initedk2 41633ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#define MODNAME "edk2" 41643ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 41653ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielPyMODINIT_FUNC 41663ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDanielINITFUNC(void) 41673ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel{ 41683ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *m; 41693ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 41703ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifndef UEFI_C_SOURCE 41713ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyObject *v; 41723ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 41733ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 41743ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel m = Py_InitModule3(MODNAME, 417542fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel edk2_methods, 41763ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel edk2__doc__); 41773ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (m == NULL) 41783ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return; 41793ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 41803ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifndef UEFI_C_SOURCE 41813ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel /* Initialize environ dictionary */ 41823ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel v = convertenviron(); 41833ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_XINCREF(v); 41843ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (v == NULL || PyModule_AddObject(m, "environ", v) != 0) 41853ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return; 41863ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_DECREF(v); 41873ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif /* UEFI_C_SOURCE */ 41883ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 41893ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (all_ins(m)) 41903ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel return; 41913ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 41923ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF(PyExc_OSError); 41933ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyModule_AddObject(m, "error", PyExc_OSError); 41943ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 41953ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef HAVE_PUTENV 419642fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel if (edk2_putenv_garbage == NULL) 419742fa19ca9a795cdea9cb33ae48647ca9cd9ff84fDaryl McDaniel edk2_putenv_garbage = PyDict_New(); 41983ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 41993ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 42003ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel if (!initialized) { 42013ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel stat_result_desc.name = MODNAME ".stat_result"; 42023ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel stat_result_desc.fields[2].name = PyStructSequence_UnnamedField; 42033ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel stat_result_desc.fields[3].name = PyStructSequence_UnnamedField; 42043ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel stat_result_desc.fields[4].name = PyStructSequence_UnnamedField; 42053ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyStructSequence_InitType(&StatResultType, &stat_result_desc); 42063ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel structseq_new = StatResultType.tp_new; 42073ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel StatResultType.tp_new = statresult_new; 42083ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 42093ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel //statvfs_result_desc.name = MODNAME ".statvfs_result"; 42103ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel //PyStructSequence_InitType(&StatVFSResultType, &statvfs_result_desc); 42113ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef NEED_TICKS_PER_SECOND 42123ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel# if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK) 42133ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel ticks_per_second = sysconf(_SC_CLK_TCK); 42143ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel# elif defined(HZ) 42153ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel ticks_per_second = HZ; 42163ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel# else 42173ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel ticks_per_second = 60; /* magic fallback value; may be bogus */ 42183ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel# endif 42193ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 42203ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel } 42213ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel Py_INCREF((PyObject*) &StatResultType); 42223ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel PyModule_AddObject(m, "stat_result", (PyObject*) &StatResultType); 42233ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel //Py_INCREF((PyObject*) &StatVFSResultType); 42243ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel //PyModule_AddObject(m, "statvfs_result", 42253ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel // (PyObject*) &StatVFSResultType); 42263ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel initialized = 1; 42273ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 42283ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 42293ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 42303ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#ifdef __cplusplus 42313ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel} 42323ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel#endif 42333ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 42343ec97ca490009ed5604ccd7f2653e5a9ecbf3474Daryl McDaniel 4235