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