Explorar el Código

try to fixup mesalib compile, it needs libxml2 python module

Waldemar Brodkorb hace 10 años
padre
commit
ae3d4616ed

+ 5 - 0
mk/host-bottom.mk

@@ -7,6 +7,11 @@ host-configure:
 ${_HOST_CONFIGURE_COOKIE}: ${_HOST_PATCH_COOKIE}
 	@mkdir -p ${WRKBUILD}
 	@$(CMD_TRACE) "host configuring... "
+ifneq (,$(filter autoreconf,${AUTOTOOL_STYLE}))
+	cd ${WRKSRC}; env ${AUTOTOOL_ENV} autoreconf -if $(MAKE_TRACE)
+	@rm -rf ${WRKSRC}/autom4te.cache
+	@touch ${WRKDIR}/.autoreconf_done
+endif
 	@cd ${WRKBUILD}; \
 	    for i in $$(find . -name config.sub);do \
 		if [ -f $$i ]; then \

+ 4 - 4
mk/host.mk

@@ -3,8 +3,8 @@
 
 HOST_CONFIGURE_ENV+=	AUTOM4TE=${STAGING_HOST_DIR}/usr/bin/autom4te \
 			CONFIG_SHELL='$(strip ${SHELL})' \
-			PATH='${TARGET_PATH}' \
-			PKG_CONFIG_LIBDIR='${STAGING_HOST_DIR}/usr/lib/pkgconfig'
+			PKG_CONFIG_LIBDIR='${STAGING_HOST_DIR}/usr/lib/pkgconfig' \
+			PATH='${HOST_PATH}' \
 			CFLAGS='$(strip ${CFLAGS_FOR_BUILD})' \
 			CXXFLAGS='$(strip ${CXXFLAGS_FOR_BUILD})' \
 			CPPFLAGS='$(strip ${CPPFLAGS_FOR_BUILD})' \
@@ -21,8 +21,8 @@ HOST_FAKE_FLAGS?=
 HOST_ALL_TARGET?=	all
 HOST_INSTALL_TARGET?=	install
 
-HOST_MAKE_ENV+=		PATH='${TARGET_PATH}' \
-			PKG_CONFIG_LIBDIR='${STAGING_HOST_DIR}/usr/lib/pkgconfig'
+HOST_MAKE_ENV+=		PATH='${HOST_PATH}' \
+			PKG_CONFIG_LIBDIR='${STAGING_HOST_DIR}/usr/lib/pkgconfig' \
 			CFLAGS='$(strip ${CFLAGS_FOR_BUILD})' \
 			CXXFLAGS='$(strip ${CXXFLAGS_FOR_BUILD})' \
 			CPPFLAGS='$(strip ${CPPFLAGS_FOR_BUILD})' \

+ 2 - 1
mk/vars.mk

@@ -43,7 +43,8 @@ BIN_DIR_PFX:=		$(BASE_DIR)/bin
 PACKAGE_DIR:=		$(BIN_DIR)/packages
 TARGET_DIR:=		$(BASE_DIR)/root_${ADK_TARGET_SYSTEM}_${CPU_ARCH}_${ADK_TARGET_LIBC}
 TARGET_DIR_PFX:=	$(BASE_DIR)/root_*
-TARGET_PATH=		${SCRIPT_DIR}:${TOOLS_DIR}:${STAGING_HOST_DIR}/bin:${STAGING_HOST_DIR}/usr/bin:${STAGING_TARGET_DIR}/scripts:${_PATH}
+TARGET_PATH=		${SCRIPT_DIR}:${TOOLS_DIR}:${STAGING_TARGET_DIR}/scripts:${STAGING_HOST_DIR}/bin:${STAGING_HOST_DIR}/usr/bin:${_PATH}
+HOST_PATH=		${SCRIPT_DIR}:${TOOLS_DIR}:${STAGING_HOST_DIR}/bin:${STAGING_HOST_DIR}/usr/bin:${_PATH}
 AUTOTOOL_PATH=		${TOOLS_DIR}:${STAGING_HOST_DIR}/bin:${STAGING_HOST_DIR}/usr/bin:${STAGING_TARGET_DIR}/scripts:${_PATH}
 REAL_GNU_TARGET_NAME=	$(CPU_ARCH)-$(ADK_VENDOR)-linux-$(ADK_TARGET_SUFFIX)
 GNU_TARGET_NAME=	$(CPU_ARCH)-$(ADK_VENDOR)-linux

+ 6 - 2
package/MesaLib/Makefile

@@ -10,7 +10,8 @@ PKG_MD5SUM:=		df801a975045150790e10e2ccf32193f
 PKG_DESCR:=		MESA 3D graphics library
 PKG_SECTION:=		libs
 PKG_DEPENDS:=		libxdamage libxfixes libdrm libxxf86vm libexpat
-PKG_BUILDDEP:=		libXdamage libXfixes libXxf86vm libdrm
+PKG_DEPENDS+=		libxml2 libxml2-python
+PKG_BUILDDEP:=		python2 libxml2 libXdamage libXfixes libXxf86vm libdrm
 PKG_BUILDDEP+=		dri2proto glproto expat libXext
 PKG_URL:=		http://www.mesa3d.org/
 PKG_SITES:=		ftp://ftp.freedesktop.org/pub/mesa/${PKG_VERSION}/
@@ -26,6 +27,8 @@ include $(TOPDIR)/mk/package.mk
 
 $(eval $(call PKG_template,MESALIB,mesalib,$(PKG_VERSION)-${PKG_RELEASE},${PKG_DEPENDS},${PKG_DESCR},${PKG_SECTION},${PKG_OPTS}))
 
+include $(TOPDIR)/mk/python.mk
+
 ifeq (${ADK_TARGET_SYSTEM_IBM_X40},y)
 DRI_DRIVERS:=i915
 endif
@@ -36,7 +39,8 @@ CONFIGURE_ARGS+=	--disable-static \
 			--disable-gles1 \
 			--disable-gles2 \
 			--with-dri-drivers=${DRI_DRIVERS},swrast
-CONFIGURE_ENV+=		PYTHON2=/usr/bin/python MISSING="echo"
+CONFIGURE_ENV+=		MISSING="echo" \
+			PYTHON2=$(PYTHON)
 
 XAKE_FLAGS+=		HOST_CC=${CC_FOR_BUILD}
 ifeq ($(ADK_NATIVE),y)

+ 1 - 1
package/fltk/Makefile

@@ -9,6 +9,7 @@ PKG_RELEASE:=		2
 PKG_MD5SUM:=		9f7e707d4fb7a5a76f0f9b73ff70623d
 PKG_DESCR:=		fast light toolkit
 PKG_SECTION:=		libs
+PKG_DEPENDS:=		mesalib libx11 libxi freeglut libfreetype
 PKG_BUILDDEP:=		libX11 libXi MesaLib freeglut freetype
 PKG_URL:=		http://www.fltk.org/
 PKG_SITES:=		http://openadk.org/distfiles/
@@ -18,7 +19,6 @@ PKG_LIBNAME:=		libfltk
 PKG_OPTS:=		dev
 
 PKG_ARCH_DEPENDS:=	x86 x86_64 mips arm
-PKG_HOST_DEPENDS:=	!darwin
 
 DISTFILES:=		${PKG_NAME}-$(PKG_VERSION)-source.tar.gz
 

+ 2 - 0
package/libdrm/Makefile

@@ -20,6 +20,8 @@ include $(TOPDIR)/mk/package.mk
 
 $(eval $(call PKG_template,LIBDRM,libdrm,$(PKG_VERSION)-${PKG_RELEASE},${PKG_DEPENDS},${PKG_DESCR},${PKG_SECTION},${PKG_OPTS}))
 
+CONFIGURE_ARGS+=	--disable-manpages
+
 libdrm-install:
 	$(INSTALL_DIR) $(IDIR_LIBDRM)/usr/lib
 	$(CP) $(WRKINST)/usr/lib/libdrm*.so* \

+ 3 - 2
package/libxml2/Makefile

@@ -10,7 +10,7 @@ PKG_MD5SUM:=		9c0cfef285d5c4a5c80d00904ddab380
 PKG_DESCR:=		XML C parser and toolkit
 PKG_SECTION:=		libs
 PKG_DEPENDS:=		zlib
-PKG_BUILDDEP:=		autotool libxml2-host zlib
+PKG_BUILDDEP:=		autotool gettext-tiny libxml2-host zlib
 PKG_URL:=		http://www.xmlsoft.org/
 PKG_SITES:=		http://xmlsoft.org/sources/
 PKG_OPTS:=		dev
@@ -19,6 +19,7 @@ PKG_SUBPKGS:=		LIBXML2 LIBXML2_PYTHON
 PKGSD_LIBXML2_PYTHON:=	XML python bindings
 PKGSC_LIBXML2_PYTHON:=	libs
 PKGSB_LIBXML2_PYTHON:=	python2
+PKGSS_LIBXML2_PYTHON:=	python2
 
 ifeq ($(ADK_STATIC),y)
 PKG_OPTS+=		libmix
@@ -34,7 +35,7 @@ $(eval $(call PKG_template,LIBXML2_PYTHON,libxml2-python,${PKG_VERSION}-${PKG_RE
 include $(TOPDIR)/mk/python.mk
 
 HOST_STYLE:=		auto
-HOST_CONFIGURE_ARGS+=	--without-python \
+HOST_CONFIGURE_ARGS+=	--with-python \
 			--without-iconv \
 			--without-lzma \
 			--without-zlib

+ 6 - 6
package/libxml2/patches/patch-configure_in

@@ -1,5 +1,5 @@
 --- libxml2-2.9.1.orig/configure.in	2013-04-19 09:25:20.000000000 +0200
-+++ libxml2-2.9.1/configure.in	2013-10-31 08:37:36.000000000 +0100
++++ libxml2-2.9.1/configure.in	2013-11-23 23:02:06.000000000 +0100
 @@ -748,80 +748,16 @@ PYTHON_SITE_PACKAGES=
  PYTHON_TESTS=
  pythondir=
@@ -77,11 +77,11 @@
 -	    fi
 -	fi
 -    fi
-+    PYTHON_INCLUDES=`$PYTHON$PYTHON_VERSION-config --includes`
-+    PYTHON_LIBS=`$PYTHON$PYTHON_VERSION-config --ldflags`
-+    PYTHON_SITE_PACKAGES=/usr/lib/python$PYTHON_VERSION/site-packages
-     pythondir='$(PYTHON_SITE_PACKAGES)'
--    PYTHON_LIBS=`python$PYTHON_VERSION-config --ldflags`
+-    pythondir='$(PYTHON_SITE_PACKAGES)'
++    PYTHON_INCLUDES=`python$PYTHON_VERSION-config --includes`
+     PYTHON_LIBS=`python$PYTHON_VERSION-config --ldflags`
++    PYTHON_SITE_PACKAGES=${prefix}/lib/python$PYTHON_VERSION/site-packages
++    pythondir='$(PYTHON_SITE_PACKAGES)'
  else
      PYTHON=
  fi

+ 17 - 0
package/libxml2/patches/patch-python_Makefile_am

@@ -0,0 +1,17 @@
+--- libxml2-2.9.1.orig/python/Makefile.am	2013-04-19 08:56:45.000000000 +0200
++++ libxml2-2.9.1/python/Makefile.am	2013-11-24 09:18:44.000000000 +0100
+@@ -19,12 +19,12 @@ if WITH_PYTHON
+ AM_CPPFLAGS = \
+ 	-I$(top_builddir)/include \
+ 	-I$(top_srcdir)/include	\
+-	-I$(PYTHON_INCLUDES)
++	$(PYTHON_INCLUDES)
+ 
+ python_LTLIBRARIES = libxml2mod.la
+ 
+ libxml2mod_la_SOURCES = libxml.c libxml_wrap.h libxml2-py.h libxml2-py.c types.c
+-libxml2mod_la_LDFLAGS = $(CYGWIN_EXTRA_LDFLAGS) $(WIN32_EXTRA_LDFLAGS) -module -avoid-version \
++libxml2mod_la_LDFLAGS = $(LDFLAGS) $(CYGWIN_EXTRA_LDFLAGS) $(WIN32_EXTRA_LDFLAGS) -module -avoid-version \
+         $(top_builddir)/libxml2.la $(CYGWIN_EXTRA_PYTHON_LIBADD) $(WIN32_EXTRA_PYTHON_LIBADD) $(PYTHON_LIBS)
+ 
+ BUILT_SOURCES = libxml2-export.c libxml2-py.h libxml2-py.c

+ 11 - 0
package/libxml2/patches/patch-python_setup_py

@@ -0,0 +1,11 @@
+--- libxml2-2.9.1.orig/python/setup.py	2013-04-19 09:36:20.000000000 +0200
++++ libxml2-2.9.1/python/setup.py	2013-11-21 18:47:16.000000000 +0100
+@@ -8,7 +8,7 @@ from distutils.core import setup, Extens
+ # Below ROOT, we expect to find include, include/libxml2, lib and bin.
+ # On *nix, it is not needed (but should not harm), 
+ # on Windows, it is set by configure.js.
+-ROOT = r'/usr' 
++ROOT = r'/Volumes/adk/openadk/host_i686_gnu_eglibc/usr' 
+ 
+ # Thread-enabled libxml2
+ with_threads = 1

+ 2 - 1
package/libxslt/Makefile

@@ -10,7 +10,7 @@ PKG_MD5SUM:=		9667bf6f9310b957254fdcf6596600b7
 PKG_DESCR:=		XSLT Library
 PKG_SECTION:=		libs
 PKG_DEPENDS:=		libxml2
-PKG_BUILDDEP:=		python2-host libxml2-host libxslt-host libxml2
+PKG_BUILDDEP:=		autotool python2-host libxml2-host libxslt-host libxml2
 PKG_URL:=		http://xmlsoft.org/XSLT
 PKG_SITES:=		http://xmlsoft.org/sources/
 PKG_NEED_CXX:=		1
@@ -37,6 +37,7 @@ HOST_CONFIGURE_ARGS+=	--without-python \
 			--with-libxml-prefix="${STAGING_HOST_DIR}/usr" \
 			--with-libxml-include-prefix="${STAGING_HOST_DIR}/usr/include/libxml2" \
 			--with-libxml-libs-prefix="${STAGING_HOST_DIR}/usr/lib"
+AUTOTOOL_STYLE:=	autoreconf
 CONFIGURE_ARGS+=	--with-libxml-prefix="${STAGING_TARGET_DIR}/usr" \
 			--with-libxml-include-prefix="${STAGING_TARGET_DIR}/usr/include/libxml2" \
 			--with-libxml-libs-prefix="${STAGING_TARGET_DIR}/usr/lib" \

+ 10 - 2
package/python2/Makefile

@@ -5,11 +5,11 @@ include ${TOPDIR}/rules.mk
 
 PKG_NAME:=		python2
 PKG_VERSION:=		2.7.5
-PKG_RELEASE:=		5
+PKG_RELEASE:=		6
 PKG_MD5SUM:=		b4f01a1d0ba0b46b05c73b2ac909b1df
 PKG_DESCR:=		Python scripting language (Version 2)
 PKG_SECTION:=		lang
-PKG_BUILDDEP:=		libffi python2-host autotool
+PKG_BUILDDEP:=		autotool libffi python2-host
 PKG_DEPENDS:=		libpthread libffi libgcc
 PKG_URL:=		http://www.python.org/
 PKG_SITES:=		http://www.python.org/ftp/python/${PKG_VERSION}/
@@ -104,6 +104,14 @@ hostpost-install:
 	$(INSTALL_BIN) ${WRKBUILD}/Parser/pgen \
 		$(STAGING_HOST_DIR)/usr/bin/pgen
 
+pre-configure:
+	(cd $(WRKBUILD) && patch -p1 < \
+		$(TOPDIR)/package/python2/files/patch-Lib_distutils_sysconfig_py )
+	(cd $(WRKBUILD) && patch -p1 < \
+		$(TOPDIR)/package/python2/files/patch-Misc_python-config_in )
+	$(SED) "s#@EXENAME@#$(STAGING_HOST_DIR)/usr/bin/python#" \
+		$(WRKBUILD)/Misc/python-config.in
+
 python2-install: ${INSTALL_MODS_y} ${INSTALL_MODS_m}
 	${INSTALL_DIR} ${IDIR_PYTHON2}/usr/bin ${IDIR_PYTHON2}/usr/lib
 	${INSTALL_DIR} ${IDIR_PYTHON2}/usr/lib/python2.7

+ 0 - 99
package/python2/files/build_scripts.py

@@ -1,99 +0,0 @@
-"""distutils.command.build_scripts
-
-Implements the Distutils 'build_scripts' command."""
-
-__revision__ = "$Id: build_scripts.py 77704 2010-01-23 09:23:15Z tarek.ziade $"
-
-import os, re
-from stat import ST_MODE
-from distutils.core import Command
-from distutils.dep_util import newer
-from distutils.util import convert_path
-from distutils import log
-
-# check if Python is called on the first line with this expression
-first_line_re = re.compile('^#!.*python[0-9.]*([ \t].*)?$')
-
-class build_scripts (Command):
-
-    description = "\"build\" scripts (copy and fixup #! line)"
-
-    user_options = [
-        ('build-dir=', 'd', "directory to \"build\" (copy) to"),
-        ('force', 'f', "forcibly build everything (ignore file timestamps"),
-        ('executable=', 'e', "specify final destination interpreter path"),
-        ]
-
-    boolean_options = ['force']
-
-
-    def initialize_options (self):
-        self.build_dir = None
-        self.scripts = None
-        self.force = None
-        self.executable = None
-        self.outfiles = None
-
-    def finalize_options (self):
-        self.set_undefined_options('build',
-                                   ('build_scripts', 'build_dir'),
-                                   ('force', 'force'),
-                                   ('executable', 'executable'))
-        self.scripts = self.distribution.scripts
-
-    def get_source_files(self):
-        return self.scripts
-
-    def run (self):
-        if not self.scripts:
-            return
-        self.copy_scripts()
-
-
-    def copy_scripts (self):
-        """Copy each script listed in 'self.scripts'; if it's marked as a
-        Python script in the Unix way (first line matches 'first_line_re',
-        ie. starts with "\#!" and contains "python"), then adjust the first
-        line to refer to the current Python interpreter as we copy.
-        """
-        _sysconfig = __import__('sysconfig')
-        self.mkpath(self.build_dir)
-        outfiles = []
-        for script in self.scripts:
-            adjust = 0
-            script = convert_path(script)
-            outfile = os.path.join(self.build_dir, os.path.basename(script))
-            outfiles.append(outfile)
-
-            if not self.force and not newer(script, outfile):
-                log.debug("not copying %s (up-to-date)", script)
-                continue
-
-            # Always open the file, but ignore failures in dry-run mode --
-            # that way, we'll get accurate feedback if we can read the
-            # script.
-            try:
-                f = open(script, "r")
-            except IOError:
-                if not self.dry_run:
-                    raise
-                f = None
-            if f:
-                f.close()
-            self.copy_file(script, outfile)
-
-        if os.name == 'posix':
-            for file in outfiles:
-                if self.dry_run:
-                    log.info("changing mode of %s", file)
-                else:
-                    oldmode = os.stat(file)[ST_MODE] & 07777
-                    newmode = (oldmode | 0555) & 07777
-                    if newmode != oldmode:
-                        log.info("changing mode of %s from %o to %o",
-                                 file, oldmode, newmode)
-                        os.chmod(file, newmode)
-
-    # copy_scripts ()
-
-# class build_scripts

+ 0 - 0
package/python2/patches/patch-Lib_distutils_sysconfig_py → package/python2/files/patch-Lib_distutils_sysconfig_py


+ 0 - 0
package/python2/patches/patch-Misc_python-config_in → package/python2/files/patch-Misc_python-config_in


+ 0 - 9365
package/python2/files/posixmodule.c

@@ -1,9365 +0,0 @@
-
-/* POSIX module implementation */
-
-/* This file is also used for Windows NT/MS-Win and OS/2.  In that case the
-   module actually calls itself 'nt' or 'os2', not 'posix', and a few
-   functions are either unimplemented or implemented differently.  The source
-   assumes that for Windows NT, the macro 'MS_WINDOWS' is defined independent
-   of the compiler used.  Different compilers define their own feature
-   test macro, e.g. '__BORLANDC__' or '_MSC_VER'.  For OS/2, the compiler
-   independent macro PYOS_OS2 should be defined.  On OS/2 the default
-   compiler is assumed to be IBM's VisualAge C++ (VACPP).  PYCC_GCC is used
-   as the compiler specific macro for the EMX port of gcc to OS/2. */
-
-/* See also ../Dos/dosmodule.c */
-
-#ifdef __APPLE__
-   /*
-    * Step 1 of support for weak-linking a number of symbols existing on
-    * OSX 10.4 and later, see the comment in the #ifdef __APPLE__ block
-    * at the end of this file for more information.
-    */
-#  pragma weak lchown
-#  pragma weak statvfs
-#  pragma weak fstatvfs
-
-#endif /* __APPLE__ */
-
-#define PY_SSIZE_T_CLEAN
-
-#include "Python.h"
-#include "structseq.h"
-
-#if defined(__VMS)
-#    include <unixio.h>
-#endif /* defined(__VMS) */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-PyDoc_STRVAR(posix__doc__,
-"This module provides access to operating system functionality that is\n\
-standardized by the C Standard and the POSIX standard (a thinly\n\
-disguised Unix interface).  Refer to the library manual and\n\
-corresponding Unix manual entries for more information on calls.");
-
-#ifndef Py_USING_UNICODE
-/* This is used in signatures of functions. */
-#define Py_UNICODE void
-#endif
-
-#if defined(PYOS_OS2)
-#define  INCL_DOS
-#define  INCL_DOSERRORS
-#define  INCL_DOSPROCESS
-#define  INCL_NOPMAPI
-#include <os2.h>
-#if defined(PYCC_GCC)
-#include <ctype.h>
-#include <io.h>
-#include <stdio.h>
-#include <process.h>
-#endif
-#include "osdefs.h"
-#endif
-
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif /* HAVE_SYS_TYPES_H */
-
-#ifdef HAVE_SYS_STAT_H
-#include <sys/stat.h>
-#endif /* HAVE_SYS_STAT_H */
-
-#ifdef HAVE_SYS_WAIT_H
-#include <sys/wait.h>           /* For WNOHANG */
-#endif
-
-#ifdef HAVE_SIGNAL_H
-#include <signal.h>
-#endif
-
-#ifdef HAVE_FCNTL_H
-#include <fcntl.h>
-#endif /* HAVE_FCNTL_H */
-
-#ifdef HAVE_GRP_H
-#include <grp.h>
-#endif
-
-#ifdef HAVE_SYSEXITS_H
-#include <sysexits.h>
-#endif /* HAVE_SYSEXITS_H */
-
-#ifdef HAVE_SYS_LOADAVG_H
-#include <sys/loadavg.h>
-#endif
-
-/* Various compilers have only certain posix functions */
-/* XXX Gosh I wish these were all moved into pyconfig.h */
-#if defined(PYCC_VACPP) && defined(PYOS_OS2)
-#include <process.h>
-#else
-#if defined(__WATCOMC__) && !defined(__QNX__)           /* Watcom compiler */
-#define HAVE_GETCWD     1
-#define HAVE_OPENDIR    1
-#define HAVE_SYSTEM     1
-#if defined(__OS2__)
-#define HAVE_EXECV      1
-#define HAVE_WAIT       1
-#endif
-#include <process.h>
-#else
-#ifdef __BORLANDC__             /* Borland compiler */
-#define HAVE_EXECV      1
-#define HAVE_GETCWD     1
-#define HAVE_OPENDIR    1
-#define HAVE_PIPE       1
-#define HAVE_POPEN      1
-#define HAVE_SYSTEM     1
-#define HAVE_WAIT       1
-#else
-#ifdef _MSC_VER         /* Microsoft compiler */
-#define HAVE_GETCWD     1
-#define HAVE_SPAWNV     1
-#define HAVE_EXECV      1
-#define HAVE_PIPE       1
-#define HAVE_POPEN      1
-#define HAVE_SYSTEM     1
-#define HAVE_CWAIT      1
-#define HAVE_FSYNC      1
-#define fsync _commit
-#else
-#if defined(PYOS_OS2) && defined(PYCC_GCC) || defined(__VMS)
-/* Everything needed is defined in PC/os2emx/pyconfig.h or vms/pyconfig.h */
-#else                   /* all other compilers */
-/* Unix functions that the configure script doesn't check for */
-#define HAVE_EXECV      1
-#define HAVE_FORK       1
-#if defined(__USLC__) && defined(__SCO_VERSION__)       /* SCO UDK Compiler */
-#define HAVE_FORK1      1
-#endif
-#define HAVE_GETCWD     1
-#define HAVE_GETEGID    1
-#define HAVE_GETEUID    1
-#define HAVE_GETGID     1
-#define HAVE_GETPPID    1
-#define HAVE_GETUID     1
-#define HAVE_KILL       1
-#define HAVE_OPENDIR    1
-#define HAVE_PIPE       1
-#ifndef __rtems__
-#define HAVE_POPEN      1
-#endif
-#define HAVE_SYSTEM     1
-#define HAVE_WAIT       1
-#define HAVE_TTYNAME    1
-#endif  /* PYOS_OS2 && PYCC_GCC && __VMS */
-#endif  /* _MSC_VER */
-#endif  /* __BORLANDC__ */
-#endif  /* ! __WATCOMC__ || __QNX__ */
-#endif /* ! __IBMC__ */
-
-#ifndef _MSC_VER
-
-#if defined(__sgi)&&_COMPILER_VERSION>=700
-/* declare ctermid_r if compiling with MIPSPro 7.x in ANSI C mode
-   (default) */
-extern char        *ctermid_r(char *);
-#endif
-
-#ifndef HAVE_UNISTD_H
-#if defined(PYCC_VACPP)
-extern int mkdir(char *);
-#else
-#if ( defined(__WATCOMC__) || defined(_MSC_VER) ) && !defined(__QNX__)
-extern int mkdir(const char *);
-#else
-extern int mkdir(const char *, mode_t);
-#endif
-#endif
-#if defined(__IBMC__) || defined(__IBMCPP__)
-extern int chdir(char *);
-extern int rmdir(char *);
-#else
-extern int chdir(const char *);
-extern int rmdir(const char *);
-#endif
-#ifdef __BORLANDC__
-extern int chmod(const char *, int);
-#else
-extern int chmod(const char *, mode_t);
-#endif
-/*#ifdef HAVE_FCHMOD
-extern int fchmod(int, mode_t);
-#endif*/
-/*#ifdef HAVE_LCHMOD
-extern int lchmod(const char *, mode_t);
-#endif*/
-extern int chown(const char *, uid_t, gid_t);
-extern char *getcwd(char *, int);
-extern char *strerror(int);
-extern int link(const char *, const char *);
-extern int rename(const char *, const char *);
-extern int stat(const char *, struct stat *);
-extern int unlink(const char *);
-extern int pclose(FILE *);
-#ifdef HAVE_SYMLINK
-extern int symlink(const char *, const char *);
-#endif /* HAVE_SYMLINK */
-#ifdef HAVE_LSTAT
-extern int lstat(const char *, struct stat *);
-#endif /* HAVE_LSTAT */
-#endif /* !HAVE_UNISTD_H */
-
-#endif /* !_MSC_VER */
-
-#ifdef HAVE_UTIME_H
-#include <utime.h>
-#endif /* HAVE_UTIME_H */
-
-#ifdef HAVE_SYS_UTIME_H
-#include <sys/utime.h>
-#define HAVE_UTIME_H /* pretend we do for the rest of this file */
-#endif /* HAVE_SYS_UTIME_H */
-
-#ifdef HAVE_SYS_TIMES_H
-#include <sys/times.h>
-#endif /* HAVE_SYS_TIMES_H */
-
-#ifdef HAVE_SYS_PARAM_H
-#include <sys/param.h>
-#endif /* HAVE_SYS_PARAM_H */
-
-#ifdef HAVE_SYS_UTSNAME_H
-#include <sys/utsname.h>
-#endif /* HAVE_SYS_UTSNAME_H */
-
-#ifdef HAVE_DIRENT_H
-#include <dirent.h>
-#define NAMLEN(dirent) strlen((dirent)->d_name)
-#else
-#if defined(__WATCOMC__) && !defined(__QNX__)
-#include <direct.h>
-#define NAMLEN(dirent) strlen((dirent)->d_name)
-#else
-#define dirent direct
-#define NAMLEN(dirent) (dirent)->d_namlen
-#endif
-#ifdef HAVE_SYS_NDIR_H
-#include <sys/ndir.h>
-#endif
-#ifdef HAVE_SYS_DIR_H
-#include <sys/dir.h>
-#endif
-#ifdef HAVE_NDIR_H
-#include <ndir.h>
-#endif
-#endif
-
-#ifdef _MSC_VER
-#ifdef HAVE_DIRECT_H
-#include <direct.h>
-#endif
-#ifdef HAVE_IO_H
-#include <io.h>
-#endif
-#ifdef HAVE_PROCESS_H
-#include <process.h>
-#endif
-#include "osdefs.h"
-#include <malloc.h>
-#include <windows.h>
-#include <shellapi.h>   /* for ShellExecute() */
-#define popen   _popen
-#define pclose  _pclose
-#endif /* _MSC_VER */
-
-#if defined(PYCC_VACPP) && defined(PYOS_OS2)
-#include <io.h>
-#endif /* OS2 */
-
-#ifndef MAXPATHLEN
-#if defined(PATH_MAX) && PATH_MAX > 1024
-#define MAXPATHLEN PATH_MAX
-#else
-#define MAXPATHLEN 1024
-#endif
-#endif /* MAXPATHLEN */
-
-#ifdef UNION_WAIT
-/* Emulate some macros on systems that have a union instead of macros */
-
-#ifndef WIFEXITED
-#define WIFEXITED(u_wait) (!(u_wait).w_termsig && !(u_wait).w_coredump)
-#endif
-
-#ifndef WEXITSTATUS
-#define WEXITSTATUS(u_wait) (WIFEXITED(u_wait)?((u_wait).w_retcode):-1)
-#endif
-
-#ifndef WTERMSIG
-#define WTERMSIG(u_wait) ((u_wait).w_termsig)
-#endif
-
-#define WAIT_TYPE union wait
-#define WAIT_STATUS_INT(s) (s.w_status)
-
-#else /* !UNION_WAIT */
-#define WAIT_TYPE int
-#define WAIT_STATUS_INT(s) (s)
-#endif /* UNION_WAIT */
-
-/* Issue #1983: pid_t can be longer than a C long on some systems */
-#if !defined(SIZEOF_PID_T) || SIZEOF_PID_T == SIZEOF_INT
-#define PARSE_PID "i"
-#define PyLong_FromPid PyInt_FromLong
-#define PyLong_AsPid PyInt_AsLong
-#elif SIZEOF_PID_T == SIZEOF_LONG
-#define PARSE_PID "l"
-#define PyLong_FromPid PyInt_FromLong
-#define PyLong_AsPid PyInt_AsLong
-#elif defined(SIZEOF_LONG_LONG) && SIZEOF_PID_T == SIZEOF_LONG_LONG
-#define PARSE_PID "L"
-#define PyLong_FromPid PyLong_FromLongLong
-#define PyLong_AsPid PyInt_AsLongLong
-#else
-#error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)"
-#endif /* SIZEOF_PID_T */
-
-/* Don't use the "_r" form if we don't need it (also, won't have a
-   prototype for it, at least on Solaris -- maybe others as well?). */
-#if defined(HAVE_CTERMID_R) && defined(WITH_THREAD)
-#define USE_CTERMID_R
-#endif
-
-#if defined(HAVE_TMPNAM_R) && defined(WITH_THREAD)
-#define USE_TMPNAM_R
-#endif
-
-/* choose the appropriate stat and fstat functions and return structs */
-#undef STAT
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
-#       define STAT win32_stat
-#       define FSTAT win32_fstat
-#       define STRUCT_STAT struct win32_stat
-#else
-#       define STAT stat
-#       define FSTAT fstat
-#       define STRUCT_STAT struct stat
-#endif
-
-#if defined(MAJOR_IN_MKDEV)
-#include <sys/mkdev.h>
-#else
-#if defined(MAJOR_IN_SYSMACROS)
-#include <sys/sysmacros.h>
-#endif
-#if defined(HAVE_MKNOD) && defined(HAVE_SYS_MKDEV_H)
-#include <sys/mkdev.h>
-#endif
-#endif
-
-#if defined _MSC_VER && _MSC_VER >= 1400
-/* Microsoft CRT in VS2005 and higher will verify that a filehandle is
- * valid and throw an assertion if it isn't.
- * Normally, an invalid fd is likely to be a C program error and therefore
- * an assertion can be useful, but it does contradict the POSIX standard
- * which for write(2) states:
- *    "Otherwise, -1 shall be returned and errno set to indicate the error."
- *    "[EBADF] The fildes argument is not a valid file descriptor open for
- *     writing."
- * Furthermore, python allows the user to enter any old integer
- * as a fd and should merely raise a python exception on error.
- * The Microsoft CRT doesn't provide an official way to check for the
- * validity of a file descriptor, but we can emulate its internal behaviour
- * by using the exported __pinfo data member and knowledge of the
- * internal structures involved.
- * The structures below must be updated for each version of visual studio
- * according to the file internal.h in the CRT source, until MS comes
- * up with a less hacky way to do this.
- * (all of this is to avoid globally modifying the CRT behaviour using
- * _set_invalid_parameter_handler() and _CrtSetReportMode())
- */
-/* The actual size of the structure is determined at runtime.
- * Only the first items must be present.
- */
-typedef struct {
-    intptr_t osfhnd;
-    char osfile;
-} my_ioinfo;
-
-extern __declspec(dllimport) char * __pioinfo[];
-#define IOINFO_L2E 5
-#define IOINFO_ARRAY_ELTS   (1 << IOINFO_L2E)
-#define IOINFO_ARRAYS 64
-#define _NHANDLE_           (IOINFO_ARRAYS * IOINFO_ARRAY_ELTS)
-#define FOPEN 0x01
-#define _NO_CONSOLE_FILENO (intptr_t)-2
-
-/* This function emulates what the windows CRT does to validate file handles */
-int
-_PyVerify_fd(int fd)
-{
-    const int i1 = fd >> IOINFO_L2E;
-    const int i2 = fd & ((1 << IOINFO_L2E) - 1);
-
-    static int sizeof_ioinfo = 0;
-
-    /* Determine the actual size of the ioinfo structure,
-     * as used by the CRT loaded in memory
-     */
-    if (sizeof_ioinfo == 0 && __pioinfo[0] != NULL) {
-        sizeof_ioinfo = _msize(__pioinfo[0]) / IOINFO_ARRAY_ELTS;
-    }
-    if (sizeof_ioinfo == 0) {
-        /* This should not happen... */
-        goto fail;
-    }
-
-    /* See that it isn't a special CLEAR fileno */
-    if (fd != _NO_CONSOLE_FILENO) {
-        /* Microsoft CRT would check that 0<=fd<_nhandle but we can't do that.  Instead
-         * we check pointer validity and other info
-         */
-        if (0 <= i1 && i1 < IOINFO_ARRAYS && __pioinfo[i1] != NULL) {
-            /* finally, check that the file is open */
-            my_ioinfo* info = (my_ioinfo*)(__pioinfo[i1] + i2 * sizeof_ioinfo);
-            if (info->osfile & FOPEN) {
-                return 1;
-            }
-        }
-    }
-  fail:
-    errno = EBADF;
-    return 0;
-}
-
-/* the special case of checking dup2.  The target fd must be in a sensible range */
-static int
-_PyVerify_fd_dup2(int fd1, int fd2)
-{
-    if (!_PyVerify_fd(fd1))
-        return 0;
-    if (fd2 == _NO_CONSOLE_FILENO)
-        return 0;
-    if ((unsigned)fd2 < _NHANDLE_)
-        return 1;
-    else
-        return 0;
-}
-#else
-/* dummy version. _PyVerify_fd() is already defined in fileobject.h */
-#define _PyVerify_fd_dup2(A, B) (1)
-#endif
-
-/* Return a dictionary corresponding to the POSIX environment table */
-#ifdef WITH_NEXT_FRAMEWORK
-/* On Darwin/MacOSX a shared library or framework has no access to
-** environ directly, we must obtain it with _NSGetEnviron().
-*/
-#include <crt_externs.h>
-static char **environ;
-#elif !defined(_MSC_VER) && ( !defined(__WATCOMC__) || defined(__QNX__) )
-extern char **environ;
-#endif /* !_MSC_VER */
-
-static PyObject *
-convertenviron(void)
-{
-    PyObject *d;
-    char **e;
-#if defined(PYOS_OS2)
-    APIRET rc;
-    char   buffer[1024]; /* OS/2 Provides a Documented Max of 1024 Chars */
-#endif
-    d = PyDict_New();
-    if (d == NULL)
-        return NULL;
-#ifdef WITH_NEXT_FRAMEWORK
-    if (environ == NULL)
-        environ = *_NSGetEnviron();
-#endif
-    if (environ == NULL)
-        return d;
-    /* This part ignores errors */
-    for (e = environ; *e != NULL; e++) {
-        PyObject *k;
-        PyObject *v;
-        char *p = strchr(*e, '=');
-        if (p == NULL)
-            continue;
-        k = PyString_FromStringAndSize(*e, (int)(p-*e));
-        if (k == NULL) {
-            PyErr_Clear();
-            continue;
-        }
-        v = PyString_FromString(p+1);
-        if (v == NULL) {
-            PyErr_Clear();
-            Py_DECREF(k);
-            continue;
-        }
-        if (PyDict_GetItem(d, k) == NULL) {
-            if (PyDict_SetItem(d, k, v) != 0)
-                PyErr_Clear();
-        }
-        Py_DECREF(k);
-        Py_DECREF(v);
-    }
-#if defined(PYOS_OS2)
-    rc = DosQueryExtLIBPATH(buffer, BEGIN_LIBPATH);
-    if (rc == NO_ERROR) { /* (not a type, envname is NOT 'BEGIN_LIBPATH') */
-        PyObject *v = PyString_FromString(buffer);
-            PyDict_SetItemString(d, "BEGINLIBPATH", v);
-        Py_DECREF(v);
-    }
-    rc = DosQueryExtLIBPATH(buffer, END_LIBPATH);
-    if (rc == NO_ERROR) { /* (not a typo, envname is NOT 'END_LIBPATH') */
-        PyObject *v = PyString_FromString(buffer);
-            PyDict_SetItemString(d, "ENDLIBPATH", v);
-        Py_DECREF(v);
-    }
-#endif
-    return d;
-}
-
-
-/* Set a POSIX-specific error from errno, and return NULL */
-
-static PyObject *
-posix_error(void)
-{
-    return PyErr_SetFromErrno(PyExc_OSError);
-}
-static PyObject *
-posix_error_with_filename(char* name)
-{
-    return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);
-}
-
-#ifdef MS_WINDOWS
-static PyObject *
-posix_error_with_unicode_filename(Py_UNICODE* name)
-{
-    return PyErr_SetFromErrnoWithUnicodeFilename(PyExc_OSError, name);
-}
-#endif /* MS_WINDOWS */
-
-
-static PyObject *
-posix_error_with_allocated_filename(char* name)
-{
-    PyObject *rc = PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);
-    PyMem_Free(name);
-    return rc;
-}
-
-#ifdef MS_WINDOWS
-static PyObject *
-win32_error(char* function, char* filename)
-{
-    /* XXX We should pass the function name along in the future.
-       (_winreg.c also wants to pass the function name.)
-       This would however require an additional param to the
-       Windows error object, which is non-trivial.
-    */
-    errno = GetLastError();
-    if (filename)
-        return PyErr_SetFromWindowsErrWithFilename(errno, filename);
-    else
-        return PyErr_SetFromWindowsErr(errno);
-}
-
-static PyObject *
-win32_error_unicode(char* function, Py_UNICODE* filename)
-{
-    /* XXX - see win32_error for comments on 'function' */
-    errno = GetLastError();
-    if (filename)
-        return PyErr_SetFromWindowsErrWithUnicodeFilename(errno, filename);
-    else
-        return PyErr_SetFromWindowsErr(errno);
-}
-
-static int
-convert_to_unicode(PyObject **param)
-{
-    if (PyUnicode_CheckExact(*param))
-        Py_INCREF(*param);
-    else if (PyUnicode_Check(*param))
-        /* For a Unicode subtype that's not a Unicode object,
-           return a true Unicode object with the same data. */
-        *param = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(*param),
-                                       PyUnicode_GET_SIZE(*param));
-    else
-        *param = PyUnicode_FromEncodedObject(*param,
-                                             Py_FileSystemDefaultEncoding,
-                                             "strict");
-    return (*param) != NULL;
-}
-
-#endif /* MS_WINDOWS */
-
-#if defined(PYOS_OS2)
-/**********************************************************************
- *         Helper Function to Trim and Format OS/2 Messages
- **********************************************************************/
-static void
-os2_formatmsg(char *msgbuf, int msglen, char *reason)
-{
-    msgbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
-
-    if (strlen(msgbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
-        char *lastc = &msgbuf[ strlen(msgbuf)-1 ];
-
-        while (lastc > msgbuf && isspace(Py_CHARMASK(*lastc)))
-            *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
-    }
-
-    /* Add Optional Reason Text */
-    if (reason) {
-        strcat(msgbuf, " : ");
-        strcat(msgbuf, reason);
-    }
-}
-
-/**********************************************************************
- *             Decode an OS/2 Operating System Error Code
- *
- * A convenience function to lookup an OS/2 error code and return a
- * text message we can use to raise a Python exception.
- *
- * Notes:
- *   The messages for errors returned from the OS/2 kernel reside in
- *   the file OSO001.MSG in the \OS2 directory hierarchy.
- *
- **********************************************************************/
-static char *
-os2_strerror(char *msgbuf, int msgbuflen, int errorcode, char *reason)
-{
-    APIRET rc;
-    ULONG  msglen;
-
-    /* Retrieve Kernel-Related Error Message from OSO001.MSG File */
-    Py_BEGIN_ALLOW_THREADS
-    rc = DosGetMessage(NULL, 0, msgbuf, msgbuflen,
-                       errorcode, "oso001.msg", &msglen);
-    Py_END_ALLOW_THREADS
-
-    if (rc == NO_ERROR)
-        os2_formatmsg(msgbuf, msglen, reason);
-    else
-        PyOS_snprintf(msgbuf, msgbuflen,
-                      "unknown OS error #%d", errorcode);
-
-    return msgbuf;
-}
-
-/* Set an OS/2-specific error and return NULL.  OS/2 kernel
-   errors are not in a global variable e.g. 'errno' nor are
-   they congruent with posix error numbers. */
-
-static PyObject *
-os2_error(int code)
-{
-    char text[1024];
-    PyObject *v;
-
-    os2_strerror(text, sizeof(text), code, "");
-
-    v = Py_BuildValue("(is)", code, text);
-    if (v != NULL) {
-        PyErr_SetObject(PyExc_OSError, v);
-        Py_DECREF(v);
-    }
-    return NULL; /* Signal to Python that an Exception is Pending */
-}
-
-#endif /* OS2 */
-
-/* POSIX generic methods */
-
-static PyObject *
-posix_fildes(PyObject *fdobj, int (*func)(int))
-{
-    int fd;
-    int res;
-    fd = PyObject_AsFileDescriptor(fdobj);
-    if (fd < 0)
-        return NULL;
-    if (!_PyVerify_fd(fd))
-        return posix_error();
-    Py_BEGIN_ALLOW_THREADS
-    res = (*func)(fd);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static PyObject *
-posix_1str(PyObject *args, char *format, int (*func)(const char*))
-{
-    char *path1 = NULL;
-    int res;
-    if (!PyArg_ParseTuple(args, format,
-                          Py_FileSystemDefaultEncoding, &path1))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = (*func)(path1);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error_with_allocated_filename(path1);
-    PyMem_Free(path1);
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static PyObject *
-posix_2str(PyObject *args,
-           char *format,
-           int (*func)(const char *, const char *))
-{
-    char *path1 = NULL, *path2 = NULL;
-    int res;
-    if (!PyArg_ParseTuple(args, format,
-                          Py_FileSystemDefaultEncoding, &path1,
-                          Py_FileSystemDefaultEncoding, &path2))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = (*func)(path1, path2);
-    Py_END_ALLOW_THREADS
-    PyMem_Free(path1);
-    PyMem_Free(path2);
-    if (res != 0)
-        /* XXX how to report both path1 and path2??? */
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-#ifdef MS_WINDOWS
-static PyObject*
-win32_1str(PyObject* args, char* func,
-           char* format, BOOL (__stdcall *funcA)(LPCSTR),
-           char* wformat, BOOL (__stdcall *funcW)(LPWSTR))
-{
-    PyObject *uni;
-    char *ansi;
-    BOOL result;
-
-    if (!PyArg_ParseTuple(args, wformat, &uni))
-        PyErr_Clear();
-    else {
-        Py_BEGIN_ALLOW_THREADS
-        result = funcW(PyUnicode_AsUnicode(uni));
-        Py_END_ALLOW_THREADS
-        if (!result)
-            return win32_error_unicode(func, PyUnicode_AsUnicode(uni));
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-    if (!PyArg_ParseTuple(args, format, &ansi))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    result = funcA(ansi);
-    Py_END_ALLOW_THREADS
-    if (!result)
-        return win32_error(func, ansi);
-    Py_INCREF(Py_None);
-    return Py_None;
-
-}
-
-/* This is a reimplementation of the C library's chdir function,
-   but one that produces Win32 errors instead of DOS error codes.
-   chdir is essentially a wrapper around SetCurrentDirectory; however,
-   it also needs to set "magic" environment variables indicating
-   the per-drive current directory, which are of the form =<drive>: */
-static BOOL __stdcall
-win32_chdir(LPCSTR path)
-{
-    char new_path[MAX_PATH+1];
-    int result;
-    char env[4] = "=x:";
-
-    if(!SetCurrentDirectoryA(path))
-        return FALSE;
-    result = GetCurrentDirectoryA(MAX_PATH+1, new_path);
-    if (!result)
-        return FALSE;
-    /* In the ANSI API, there should not be any paths longer
-       than MAX_PATH. */
-    assert(result <= MAX_PATH+1);
-    if (strncmp(new_path, "\\\\", 2) == 0 ||
-        strncmp(new_path, "//", 2) == 0)
-        /* UNC path, nothing to do. */
-        return TRUE;
-    env[1] = new_path[0];
-    return SetEnvironmentVariableA(env, new_path);
-}
-
-/* The Unicode version differs from the ANSI version
-   since the current directory might exceed MAX_PATH characters */
-static BOOL __stdcall
-win32_wchdir(LPCWSTR path)
-{
-    wchar_t _new_path[MAX_PATH+1], *new_path = _new_path;
-    int result;
-    wchar_t env[4] = L"=x:";
-
-    if(!SetCurrentDirectoryW(path))
-        return FALSE;
-    result = GetCurrentDirectoryW(MAX_PATH+1, new_path);
-    if (!result)
-        return FALSE;
-    if (result > MAX_PATH+1) {
-        new_path = malloc(result * sizeof(wchar_t));
-        if (!new_path) {
-            SetLastError(ERROR_OUTOFMEMORY);
-            return FALSE;
-        }
-        result = GetCurrentDirectoryW(result, new_path);
-        if (!result) {
-            free(new_path);
-            return FALSE;
-        }
-    }
-    if (wcsncmp(new_path, L"\\\\", 2) == 0 ||
-        wcsncmp(new_path, L"//", 2) == 0)
-        /* UNC path, nothing to do. */
-        return TRUE;
-    env[1] = new_path[0];
-    result = SetEnvironmentVariableW(env, new_path);
-    if (new_path != _new_path)
-        free(new_path);
-    return result;
-}
-#endif
-
-#ifdef MS_WINDOWS
-/* The CRT of Windows has a number of flaws wrt. its stat() implementation:
-   - time stamps are restricted to second resolution
-   - file modification times suffer from forth-and-back conversions between
-     UTC and local time
-   Therefore, we implement our own stat, based on the Win32 API directly.
-*/
-#define HAVE_STAT_NSEC 1
-
-struct win32_stat{
-    int st_dev;
-    __int64 st_ino;
-    unsigned short st_mode;
-    int st_nlink;
-    int st_uid;
-    int st_gid;
-    int st_rdev;
-    __int64 st_size;
-    int st_atime;
-    int st_atime_nsec;
-    int st_mtime;
-    int st_mtime_nsec;
-    int st_ctime;
-    int st_ctime_nsec;
-};
-
-static __int64 secs_between_epochs = 11644473600; /* Seconds between 1.1.1601 and 1.1.1970 */
-
-static void
-FILE_TIME_to_time_t_nsec(FILETIME *in_ptr, int *time_out, int* nsec_out)
-{
-    /* XXX endianness. Shouldn't matter, as all Windows implementations are little-endian */
-    /* Cannot simply cast and dereference in_ptr,
-       since it might not be aligned properly */
-    __int64 in;
-    memcpy(&in, in_ptr, sizeof(in));
-    *nsec_out = (int)(in % 10000000) * 100; /* FILETIME is in units of 100 nsec. */
-    /* XXX Win32 supports time stamps past 2038; we currently don't */
-    *time_out = Py_SAFE_DOWNCAST((in / 10000000) - secs_between_epochs, __int64, int);
-}
-
-static void
-time_t_to_FILE_TIME(int time_in, int nsec_in, FILETIME *out_ptr)
-{
-    /* XXX endianness */
-    __int64 out;
-    out = time_in + secs_between_epochs;
-    out = out * 10000000 + nsec_in / 100;
-    memcpy(out_ptr, &out, sizeof(out));
-}
-
-/* Below, we *know* that ugo+r is 0444 */
-#if _S_IREAD != 0400
-#error Unsupported C library
-#endif
-static int
-attributes_to_mode(DWORD attr)
-{
-    int m = 0;
-    if (attr & FILE_ATTRIBUTE_DIRECTORY)
-        m |= _S_IFDIR | 0111; /* IFEXEC for user,group,other */
-    else
-        m |= _S_IFREG;
-    if (attr & FILE_ATTRIBUTE_READONLY)
-        m |= 0444;
-    else
-        m |= 0666;
-    return m;
-}
-
-static int
-attribute_data_to_stat(WIN32_FILE_ATTRIBUTE_DATA *info, struct win32_stat *result)
-{
-    memset(result, 0, sizeof(*result));
-    result->st_mode = attributes_to_mode(info->dwFileAttributes);
-    result->st_size = (((__int64)info->nFileSizeHigh)<<32) + info->nFileSizeLow;
-    FILE_TIME_to_time_t_nsec(&info->ftCreationTime, &result->st_ctime, &result->st_ctime_nsec);
-    FILE_TIME_to_time_t_nsec(&info->ftLastWriteTime, &result->st_mtime, &result->st_mtime_nsec);
-    FILE_TIME_to_time_t_nsec(&info->ftLastAccessTime, &result->st_atime, &result->st_atime_nsec);
-
-    return 0;
-}
-
-static BOOL
-attributes_from_dir(LPCSTR pszFile, LPWIN32_FILE_ATTRIBUTE_DATA pfad)
-{
-    HANDLE hFindFile;
-    WIN32_FIND_DATAA FileData;
-    hFindFile = FindFirstFileA(pszFile, &FileData);
-    if (hFindFile == INVALID_HANDLE_VALUE)
-        return FALSE;
-    FindClose(hFindFile);
-    pfad->dwFileAttributes = FileData.dwFileAttributes;
-    pfad->ftCreationTime   = FileData.ftCreationTime;
-    pfad->ftLastAccessTime = FileData.ftLastAccessTime;
-    pfad->ftLastWriteTime  = FileData.ftLastWriteTime;
-    pfad->nFileSizeHigh    = FileData.nFileSizeHigh;
-    pfad->nFileSizeLow     = FileData.nFileSizeLow;
-    return TRUE;
-}
-
-static BOOL
-attributes_from_dir_w(LPCWSTR pszFile, LPWIN32_FILE_ATTRIBUTE_DATA pfad)
-{
-    HANDLE hFindFile;
-    WIN32_FIND_DATAW FileData;
-    hFindFile = FindFirstFileW(pszFile, &FileData);
-    if (hFindFile == INVALID_HANDLE_VALUE)
-        return FALSE;
-    FindClose(hFindFile);
-    pfad->dwFileAttributes = FileData.dwFileAttributes;
-    pfad->ftCreationTime   = FileData.ftCreationTime;
-    pfad->ftLastAccessTime = FileData.ftLastAccessTime;
-    pfad->ftLastWriteTime  = FileData.ftLastWriteTime;
-    pfad->nFileSizeHigh    = FileData.nFileSizeHigh;
-    pfad->nFileSizeLow     = FileData.nFileSizeLow;
-    return TRUE;
-}
-
-static int
-win32_stat(const char* path, struct win32_stat *result)
-{
-    WIN32_FILE_ATTRIBUTE_DATA info;
-    int code;
-    char *dot;
-    if (!GetFileAttributesExA(path, GetFileExInfoStandard, &info)) {
-        if (GetLastError() != ERROR_SHARING_VIOLATION) {
-            /* Protocol violation: we explicitly clear errno, instead of
-               setting it to a POSIX error. Callers should use GetLastError. */
-            errno = 0;
-            return -1;
-        } else {
-            /* Could not get attributes on open file. Fall back to
-               reading the directory. */
-            if (!attributes_from_dir(path, &info)) {
-                /* Very strange. This should not fail now */
-                errno = 0;
-                return -1;
-            }
-        }
-    }
-    code = attribute_data_to_stat(&info, result);
-    if (code != 0)
-        return code;
-    /* Set S_IFEXEC if it is an .exe, .bat, ... */
-    dot = strrchr(path, '.');
-    if (dot) {
-        if (stricmp(dot, ".bat") == 0 ||
-        stricmp(dot, ".cmd") == 0 ||
-        stricmp(dot, ".exe") == 0 ||
-        stricmp(dot, ".com") == 0)
-            result->st_mode |= 0111;
-    }
-    return code;
-}
-
-static int
-win32_wstat(const wchar_t* path, struct win32_stat *result)
-{
-    int code;
-    const wchar_t *dot;
-    WIN32_FILE_ATTRIBUTE_DATA info;
-    if (!GetFileAttributesExW(path, GetFileExInfoStandard, &info)) {
-        if (GetLastError() != ERROR_SHARING_VIOLATION) {
-            /* Protocol violation: we explicitly clear errno, instead of
-               setting it to a POSIX error. Callers should use GetLastError. */
-            errno = 0;
-            return -1;
-        } else {
-            /* Could not get attributes on open file. Fall back to
-               reading the directory. */
-            if (!attributes_from_dir_w(path, &info)) {
-                /* Very strange. This should not fail now */
-                errno = 0;
-                return -1;
-            }
-        }
-    }
-    code = attribute_data_to_stat(&info, result);
-    if (code < 0)
-        return code;
-    /* Set IFEXEC if it is an .exe, .bat, ... */
-    dot = wcsrchr(path, '.');
-    if (dot) {
-        if (_wcsicmp(dot, L".bat") == 0 ||
-            _wcsicmp(dot, L".cmd") == 0 ||
-            _wcsicmp(dot, L".exe") == 0 ||
-            _wcsicmp(dot, L".com") == 0)
-            result->st_mode |= 0111;
-    }
-    return code;
-}
-
-static int
-win32_fstat(int file_number, struct win32_stat *result)
-{
-    BY_HANDLE_FILE_INFORMATION info;
-    HANDLE h;
-    int type;
-
-    h = (HANDLE)_get_osfhandle(file_number);
-
-    /* Protocol violation: we explicitly clear errno, instead of
-       setting it to a POSIX error. Callers should use GetLastError. */
-    errno = 0;
-
-    if (h == INVALID_HANDLE_VALUE) {
-        /* This is really a C library error (invalid file handle).
-           We set the Win32 error to the closes one matching. */
-        SetLastError(ERROR_INVALID_HANDLE);
-        return -1;
-    }
-    memset(result, 0, sizeof(*result));
-
-    type = GetFileType(h);
-    if (type == FILE_TYPE_UNKNOWN) {
-        DWORD error = GetLastError();
-        if (error != 0) {
-        return -1;
-        }
-        /* else: valid but unknown file */
-    }
-
-    if (type != FILE_TYPE_DISK) {
-        if (type == FILE_TYPE_CHAR)
-            result->st_mode = _S_IFCHR;
-        else if (type == FILE_TYPE_PIPE)
-            result->st_mode = _S_IFIFO;
-        return 0;
-    }
-
-    if (!GetFileInformationByHandle(h, &info)) {
-        return -1;
-    }
-
-    /* similar to stat() */
-    result->st_mode = attributes_to_mode(info.dwFileAttributes);
-    result->st_size = (((__int64)info.nFileSizeHigh)<<32) + info.nFileSizeLow;
-    FILE_TIME_to_time_t_nsec(&info.ftCreationTime, &result->st_ctime, &result->st_ctime_nsec);
-    FILE_TIME_to_time_t_nsec(&info.ftLastWriteTime, &result->st_mtime, &result->st_mtime_nsec);
-    FILE_TIME_to_time_t_nsec(&info.ftLastAccessTime, &result->st_atime, &result->st_atime_nsec);
-    /* specific to fstat() */
-    result->st_nlink = info.nNumberOfLinks;
-    result->st_ino = (((__int64)info.nFileIndexHigh)<<32) + info.nFileIndexLow;
-    return 0;
-}
-
-#endif /* MS_WINDOWS */
-
-PyDoc_STRVAR(stat_result__doc__,
-"stat_result: Result from stat or lstat.\n\n\
-This object may be accessed either as a tuple of\n\
-  (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\
-or via the attributes st_mode, st_ino, st_dev, st_nlink, st_uid, and so on.\n\
-\n\
-Posix/windows: If your platform supports st_blksize, st_blocks, st_rdev,\n\
-or st_flags, they are available as attributes only.\n\
-\n\
-See os.stat for more information.");
-
-static PyStructSequence_Field stat_result_fields[] = {
-    {"st_mode",    "protection bits"},
-    {"st_ino",     "inode"},
-    {"st_dev",     "device"},
-    {"st_nlink",   "number of hard links"},
-    {"st_uid",     "user ID of owner"},
-    {"st_gid",     "group ID of owner"},
-    {"st_size",    "total size, in bytes"},
-    /* The NULL is replaced with PyStructSequence_UnnamedField later. */
-    {NULL,   "integer time of last access"},
-    {NULL,   "integer time of last modification"},
-    {NULL,   "integer time of last change"},
-    {"st_atime",   "time of last access"},
-    {"st_mtime",   "time of last modification"},
-    {"st_ctime",   "time of last change"},
-#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
-    {"st_blksize", "blocksize for filesystem I/O"},
-#endif
-#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
-    {"st_blocks",  "number of blocks allocated"},
-#endif
-#ifdef HAVE_STRUCT_STAT_ST_RDEV
-    {"st_rdev",    "device type (if inode device)"},
-#endif
-#ifdef HAVE_STRUCT_STAT_ST_FLAGS
-    {"st_flags",   "user defined flags for file"},
-#endif
-#ifdef HAVE_STRUCT_STAT_ST_GEN
-    {"st_gen",    "generation number"},
-#endif
-#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME
-    {"st_birthtime",   "time of creation"},
-#endif
-    {0}
-};
-
-#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
-#define ST_BLKSIZE_IDX 13
-#else
-#define ST_BLKSIZE_IDX 12
-#endif
-
-#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
-#define ST_BLOCKS_IDX (ST_BLKSIZE_IDX+1)
-#else
-#define ST_BLOCKS_IDX ST_BLKSIZE_IDX
-#endif
-
-#ifdef HAVE_STRUCT_STAT_ST_RDEV
-#define ST_RDEV_IDX (ST_BLOCKS_IDX+1)
-#else
-#define ST_RDEV_IDX ST_BLOCKS_IDX
-#endif
-
-#ifdef HAVE_STRUCT_STAT_ST_FLAGS
-#define ST_FLAGS_IDX (ST_RDEV_IDX+1)
-#else
-#define ST_FLAGS_IDX ST_RDEV_IDX
-#endif
-
-#ifdef HAVE_STRUCT_STAT_ST_GEN
-#define ST_GEN_IDX (ST_FLAGS_IDX+1)
-#else
-#define ST_GEN_IDX ST_FLAGS_IDX
-#endif
-
-#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME
-#define ST_BIRTHTIME_IDX (ST_GEN_IDX+1)
-#else
-#define ST_BIRTHTIME_IDX ST_GEN_IDX
-#endif
-
-static PyStructSequence_Desc stat_result_desc = {
-    "stat_result", /* name */
-    stat_result__doc__, /* doc */
-    stat_result_fields,
-    10
-};
-
-PyDoc_STRVAR(statvfs_result__doc__,
-"statvfs_result: Result from statvfs or fstatvfs.\n\n\
-This object may be accessed either as a tuple of\n\
-  (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax),\n\
-or via the attributes f_bsize, f_frsize, f_blocks, f_bfree, and so on.\n\
-\n\
-See os.statvfs for more information.");
-
-static PyStructSequence_Field statvfs_result_fields[] = {
-    {"f_bsize",  },
-    {"f_frsize", },
-    {"f_blocks", },
-    {"f_bfree",  },
-    {"f_bavail", },
-    {"f_files",  },
-    {"f_ffree",  },
-    {"f_favail", },
-    {"f_flag",   },
-    {"f_namemax",},
-    {0}
-};
-
-static PyStructSequence_Desc statvfs_result_desc = {
-    "statvfs_result", /* name */
-    statvfs_result__doc__, /* doc */
-    statvfs_result_fields,
-    10
-};
-
-static int initialized;
-static PyTypeObject StatResultType;
-static PyTypeObject StatVFSResultType;
-static newfunc structseq_new;
-
-static PyObject *
-statresult_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
-{
-    PyStructSequence *result;
-    int i;
-
-    result = (PyStructSequence*)structseq_new(type, args, kwds);
-    if (!result)
-        return NULL;
-    /* If we have been initialized from a tuple,
-       st_?time might be set to None. Initialize it
-       from the int slots.  */
-    for (i = 7; i <= 9; i++) {
-        if (result->ob_item[i+3] == Py_None) {
-            Py_DECREF(Py_None);
-            Py_INCREF(result->ob_item[i]);
-            result->ob_item[i+3] = result->ob_item[i];
-        }
-    }
-    return (PyObject*)result;
-}
-
-
-
-/* If true, st_?time is float. */
-static int _stat_float_times = 1;
-
-PyDoc_STRVAR(stat_float_times__doc__,
-"stat_float_times([newval]) -> oldval\n\n\
-Determine whether os.[lf]stat represents time stamps as float objects.\n\
-If newval is True, future calls to stat() return floats, if it is False,\n\
-future calls return ints. \n\
-If newval is omitted, return the current setting.\n");
-
-static PyObject*
-stat_float_times(PyObject* self, PyObject *args)
-{
-    int newval = -1;
-    if (!PyArg_ParseTuple(args, "|i:stat_float_times", &newval))
-        return NULL;
-    if (newval == -1)
-        /* Return old value */
-        return PyBool_FromLong(_stat_float_times);
-    _stat_float_times = newval;
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-static void
-fill_time(PyObject *v, int index, time_t sec, unsigned long nsec)
-{
-    PyObject *fval,*ival;
-#if SIZEOF_TIME_T > SIZEOF_LONG
-    ival = PyLong_FromLongLong((PY_LONG_LONG)sec);
-#else
-    ival = PyInt_FromLong((long)sec);
-#endif
-    if (!ival)
-        return;
-    if (_stat_float_times) {
-        fval = PyFloat_FromDouble(sec + 1e-9*nsec);
-    } else {
-        fval = ival;
-        Py_INCREF(fval);
-    }
-    PyStructSequence_SET_ITEM(v, index, ival);
-    PyStructSequence_SET_ITEM(v, index+3, fval);
-}
-
-/* pack a system stat C structure into the Python stat tuple
-   (used by posix_stat() and posix_fstat()) */
-static PyObject*
-_pystat_fromstructstat(STRUCT_STAT *st)
-{
-    unsigned long ansec, mnsec, cnsec;
-    PyObject *v = PyStructSequence_New(&StatResultType);
-    if (v == NULL)
-        return NULL;
-
-    PyStructSequence_SET_ITEM(v, 0, PyInt_FromLong((long)st->st_mode));
-#ifdef HAVE_LARGEFILE_SUPPORT
-    PyStructSequence_SET_ITEM(v, 1,
-                              PyLong_FromLongLong((PY_LONG_LONG)st->st_ino));
-#else
-    PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long)st->st_ino));
-#endif
-#if defined(HAVE_LONG_LONG) && !defined(MS_WINDOWS)
-    PyStructSequence_SET_ITEM(v, 2,
-                              PyLong_FromLongLong((PY_LONG_LONG)st->st_dev));
-#else
-    PyStructSequence_SET_ITEM(v, 2, PyInt_FromLong((long)st->st_dev));
-#endif
-    PyStructSequence_SET_ITEM(v, 3, PyInt_FromLong((long)st->st_nlink));
-    PyStructSequence_SET_ITEM(v, 4, PyInt_FromLong((long)st->st_uid));
-    PyStructSequence_SET_ITEM(v, 5, PyInt_FromLong((long)st->st_gid));
-#ifdef HAVE_LARGEFILE_SUPPORT
-    PyStructSequence_SET_ITEM(v, 6,
-                              PyLong_FromLongLong((PY_LONG_LONG)st->st_size));
-#else
-    PyStructSequence_SET_ITEM(v, 6, PyInt_FromLong(st->st_size));
-#endif
-
-#if defined(HAVE_STAT_TV_NSEC)
-    ansec = st->st_atim.tv_nsec;
-    mnsec = st->st_mtim.tv_nsec;
-    cnsec = st->st_ctim.tv_nsec;
-#elif defined(HAVE_STAT_TV_NSEC2)
-    ansec = st->st_atimespec.tv_nsec;
-    mnsec = st->st_mtimespec.tv_nsec;
-    cnsec = st->st_ctimespec.tv_nsec;
-#elif defined(HAVE_STAT_NSEC)
-    ansec = st->st_atime_nsec;
-    mnsec = st->st_mtime_nsec;
-    cnsec = st->st_ctime_nsec;
-#else
-    ansec = mnsec = cnsec = 0;
-#endif
-    fill_time(v, 7, st->st_atime, ansec);
-    fill_time(v, 8, st->st_mtime, mnsec);
-    fill_time(v, 9, st->st_ctime, cnsec);
-
-#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
-    PyStructSequence_SET_ITEM(v, ST_BLKSIZE_IDX,
-                              PyInt_FromLong((long)st->st_blksize));
-#endif
-#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
-    PyStructSequence_SET_ITEM(v, ST_BLOCKS_IDX,
-                              PyInt_FromLong((long)st->st_blocks));
-#endif
-#ifdef HAVE_STRUCT_STAT_ST_RDEV
-    PyStructSequence_SET_ITEM(v, ST_RDEV_IDX,
-                              PyInt_FromLong((long)st->st_rdev));
-#endif
-#ifdef HAVE_STRUCT_STAT_ST_GEN
-    PyStructSequence_SET_ITEM(v, ST_GEN_IDX,
-                              PyInt_FromLong((long)st->st_gen));
-#endif
-#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME
-    {
-      PyObject *val;
-      unsigned long bsec,bnsec;
-      bsec = (long)st->st_birthtime;
-#ifdef HAVE_STAT_TV_NSEC2
-      bnsec = st->st_birthtimespec.tv_nsec;
-#else
-      bnsec = 0;
-#endif
-      if (_stat_float_times) {
-        val = PyFloat_FromDouble(bsec + 1e-9*bnsec);
-      } else {
-        val = PyInt_FromLong((long)bsec);
-      }
-      PyStructSequence_SET_ITEM(v, ST_BIRTHTIME_IDX,
-                                val);
-    }
-#endif
-#ifdef HAVE_STRUCT_STAT_ST_FLAGS
-    PyStructSequence_SET_ITEM(v, ST_FLAGS_IDX,
-                              PyInt_FromLong((long)st->st_flags));
-#endif
-
-    if (PyErr_Occurred()) {
-        Py_DECREF(v);
-        return NULL;
-    }
-
-    return v;
-}
-
-#ifdef MS_WINDOWS
-
-/* IsUNCRoot -- test whether the supplied path is of the form \\SERVER\SHARE\,
-   where / can be used in place of \ and the trailing slash is optional.
-   Both SERVER and SHARE must have at least one character.
-*/
-
-#define ISSLASHA(c) ((c) == '\\' || (c) == '/')
-#define ISSLASHW(c) ((c) == L'\\' || (c) == L'/')
-#ifndef ARRAYSIZE
-#define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0]))
-#endif
-
-static BOOL
-IsUNCRootA(char *path, int pathlen)
-{
-    #define ISSLASH ISSLASHA
-
-    int i, share;
-
-    if (pathlen < 5 || !ISSLASH(path[0]) || !ISSLASH(path[1]))
-        /* minimum UNCRoot is \\x\y */
-        return FALSE;
-    for (i = 2; i < pathlen ; i++)
-        if (ISSLASH(path[i])) break;
-    if (i == 2 || i == pathlen)
-        /* do not allow \\\SHARE or \\SERVER */
-        return FALSE;
-    share = i+1;
-    for (i = share; i < pathlen; i++)
-        if (ISSLASH(path[i])) break;
-    return (i != share && (i == pathlen || i == pathlen-1));
-
-    #undef ISSLASH
-}
-
-static BOOL
-IsUNCRootW(Py_UNICODE *path, int pathlen)
-{
-    #define ISSLASH ISSLASHW
-
-    int i, share;
-
-    if (pathlen < 5 || !ISSLASH(path[0]) || !ISSLASH(path[1]))
-        /* minimum UNCRoot is \\x\y */
-        return FALSE;
-    for (i = 2; i < pathlen ; i++)
-        if (ISSLASH(path[i])) break;
-    if (i == 2 || i == pathlen)
-        /* do not allow \\\SHARE or \\SERVER */
-        return FALSE;
-    share = i+1;
-    for (i = share; i < pathlen; i++)
-        if (ISSLASH(path[i])) break;
-    return (i != share && (i == pathlen || i == pathlen-1));
-
-    #undef ISSLASH
-}
-#endif /* MS_WINDOWS */
-
-static PyObject *
-posix_do_stat(PyObject *self, PyObject *args,
-              char *format,
-#ifdef __VMS
-              int (*statfunc)(const char *, STRUCT_STAT *, ...),
-#else
-              int (*statfunc)(const char *, STRUCT_STAT *),
-#endif
-              char *wformat,
-              int (*wstatfunc)(const Py_UNICODE *, STRUCT_STAT *))
-{
-    STRUCT_STAT st;
-    char *path = NULL;          /* pass this to stat; do not free() it */
-    char *pathfree = NULL;  /* this memory must be free'd */
-    int res;
-    PyObject *result;
-
-#ifdef MS_WINDOWS
-    PyUnicodeObject *po;
-    if (PyArg_ParseTuple(args, wformat, &po)) {
-        Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po);
-
-        Py_BEGIN_ALLOW_THREADS
-            /* PyUnicode_AS_UNICODE result OK without
-               thread lock as it is a simple dereference. */
-        res = wstatfunc(wpath, &st);
-        Py_END_ALLOW_THREADS
-
-        if (res != 0)
-            return win32_error_unicode("stat", wpath);
-        return _pystat_fromstructstat(&st);
-    }
-    /* Drop the argument parsing error as narrow strings
-       are also valid. */
-    PyErr_Clear();
-#endif
-
-    if (!PyArg_ParseTuple(args, format,
-                          Py_FileSystemDefaultEncoding, &path))
-        return NULL;
-    pathfree = path;
-
-    Py_BEGIN_ALLOW_THREADS
-    res = (*statfunc)(path, &st);
-    Py_END_ALLOW_THREADS
-
-    if (res != 0) {
-#ifdef MS_WINDOWS
-        result = win32_error("stat", pathfree);
-#else
-        result = posix_error_with_filename(pathfree);
-#endif
-    }
-    else
-        result = _pystat_fromstructstat(&st);
-
-    PyMem_Free(pathfree);
-    return result;
-}
-
-/* POSIX methods */
-
-PyDoc_STRVAR(posix_access__doc__,
-"access(path, mode) -> True if granted, False otherwise\n\n\
-Use the real uid/gid to test for access to a path.  Note that most\n\
-operations will use the effective uid/gid, therefore this routine can\n\
-be used in a suid/sgid environment to test if the invoking user has the\n\
-specified access to the path.  The mode argument can be F_OK to test\n\
-existence, or the inclusive-OR of R_OK, W_OK, and X_OK.");
-
-static PyObject *
-posix_access(PyObject *self, PyObject *args)
-{
-    char *path;
-    int mode;
-
-#ifdef MS_WINDOWS
-    DWORD attr;
-    PyUnicodeObject *po;
-    if (PyArg_ParseTuple(args, "Ui:access", &po, &mode)) {
-        Py_BEGIN_ALLOW_THREADS
-        /* PyUnicode_AS_UNICODE OK without thread lock as
-           it is a simple dereference. */
-        attr = GetFileAttributesW(PyUnicode_AS_UNICODE(po));
-        Py_END_ALLOW_THREADS
-        goto finish;
-    }
-    /* Drop the argument parsing error as narrow strings
-       are also valid. */
-    PyErr_Clear();
-    if (!PyArg_ParseTuple(args, "eti:access",
-                          Py_FileSystemDefaultEncoding, &path, &mode))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    attr = GetFileAttributesA(path);
-    Py_END_ALLOW_THREADS
-    PyMem_Free(path);
-finish:
-    if (attr == 0xFFFFFFFF)
-        /* File does not exist, or cannot read attributes */
-        return PyBool_FromLong(0);
-    /* Access is possible if either write access wasn't requested, or
-       the file isn't read-only, or if it's a directory, as there are
-       no read-only directories on Windows. */
-    return PyBool_FromLong(!(mode & 2)
-                           || !(attr & FILE_ATTRIBUTE_READONLY)
-                           || (attr & FILE_ATTRIBUTE_DIRECTORY));
-#else /* MS_WINDOWS */
-    int res;
-    if (!PyArg_ParseTuple(args, "eti:access",
-                          Py_FileSystemDefaultEncoding, &path, &mode))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = access(path, mode);
-    Py_END_ALLOW_THREADS
-    PyMem_Free(path);
-    return PyBool_FromLong(res == 0);
-#endif /* MS_WINDOWS */
-}
-
-#ifndef F_OK
-#define F_OK 0
-#endif
-#ifndef R_OK
-#define R_OK 4
-#endif
-#ifndef W_OK
-#define W_OK 2
-#endif
-#ifndef X_OK
-#define X_OK 1
-#endif
-
-#ifdef HAVE_TTYNAME
-PyDoc_STRVAR(posix_ttyname__doc__,
-"ttyname(fd) -> string\n\n\
-Return the name of the terminal device connected to 'fd'.");
-
-static PyObject *
-posix_ttyname(PyObject *self, PyObject *args)
-{
-    int id;
-    char *ret;
-
-    if (!PyArg_ParseTuple(args, "i:ttyname", &id))
-        return NULL;
-
-#if defined(__VMS)
-    /* file descriptor 0 only, the default input device (stdin) */
-    if (id == 0) {
-        ret = ttyname();
-    }
-    else {
-        ret = NULL;
-    }
-#else
-    ret = ttyname(id);
-#endif
-    if (ret == NULL)
-        return posix_error();
-    return PyString_FromString(ret);
-}
-#endif
-
-#ifdef HAVE_CTERMID
-PyDoc_STRVAR(posix_ctermid__doc__,
-"ctermid() -> string\n\n\
-Return the name of the controlling terminal for this process.");
-
-static PyObject *
-posix_ctermid(PyObject *self, PyObject *noargs)
-{
-    char *ret;
-    char buffer[L_ctermid];
-
-#ifdef USE_CTERMID_R
-    ret = ctermid_r(buffer);
-#else
-    ret = ctermid(buffer);
-#endif
-    if (ret == NULL)
-        return posix_error();
-    return PyString_FromString(buffer);
-}
-#endif
-
-PyDoc_STRVAR(posix_chdir__doc__,
-"chdir(path)\n\n\
-Change the current working directory to the specified path.");
-
-static PyObject *
-posix_chdir(PyObject *self, PyObject *args)
-{
-#ifdef MS_WINDOWS
-    return win32_1str(args, "chdir", "s:chdir", win32_chdir, "U:chdir", win32_wchdir);
-#elif defined(PYOS_OS2) && defined(PYCC_GCC)
-    return posix_1str(args, "et:chdir", _chdir2);
-#elif defined(__VMS)
-    return posix_1str(args, "et:chdir", (int (*)(const char *))chdir);
-#else
-    return posix_1str(args, "et:chdir", chdir);
-#endif
-}
-
-#ifdef HAVE_FCHDIR
-PyDoc_STRVAR(posix_fchdir__doc__,
-"fchdir(fildes)\n\n\
-Change to the directory of the given file descriptor.  fildes must be\n\
-opened on a directory, not a file.");
-
-static PyObject *
-posix_fchdir(PyObject *self, PyObject *fdobj)
-{
-    return posix_fildes(fdobj, fchdir);
-}
-#endif /* HAVE_FCHDIR */
-
-
-PyDoc_STRVAR(posix_chmod__doc__,
-"chmod(path, mode)\n\n\
-Change the access permissions of a file.");
-
-static PyObject *
-posix_chmod(PyObject *self, PyObject *args)
-{
-    char *path = NULL;
-    int i;
-    int res;
-#ifdef MS_WINDOWS
-    DWORD attr;
-    PyUnicodeObject *po;
-    if (PyArg_ParseTuple(args, "Ui|:chmod", &po, &i)) {
-        Py_BEGIN_ALLOW_THREADS
-        attr = GetFileAttributesW(PyUnicode_AS_UNICODE(po));
-        if (attr != 0xFFFFFFFF) {
-            if (i & _S_IWRITE)
-                attr &= ~FILE_ATTRIBUTE_READONLY;
-            else
-                attr |= FILE_ATTRIBUTE_READONLY;
-            res = SetFileAttributesW(PyUnicode_AS_UNICODE(po), attr);
-        }
-        else
-            res = 0;
-        Py_END_ALLOW_THREADS
-        if (!res)
-            return win32_error_unicode("chmod",
-                                       PyUnicode_AS_UNICODE(po));
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-    /* Drop the argument parsing error as narrow strings
-       are also valid. */
-    PyErr_Clear();
-
-    if (!PyArg_ParseTuple(args, "eti:chmod", Py_FileSystemDefaultEncoding,
-                          &path, &i))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    attr = GetFileAttributesA(path);
-    if (attr != 0xFFFFFFFF) {
-        if (i & _S_IWRITE)
-            attr &= ~FILE_ATTRIBUTE_READONLY;
-        else
-            attr |= FILE_ATTRIBUTE_READONLY;
-        res = SetFileAttributesA(path, attr);
-    }
-    else
-        res = 0;
-    Py_END_ALLOW_THREADS
-    if (!res) {
-        win32_error("chmod", path);
-        PyMem_Free(path);
-        return NULL;
-    }
-    PyMem_Free(path);
-    Py_INCREF(Py_None);
-    return Py_None;
-#else /* MS_WINDOWS */
-    if (!PyArg_ParseTuple(args, "eti:chmod", Py_FileSystemDefaultEncoding,
-                          &path, &i))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = chmod(path, i);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error_with_allocated_filename(path);
-    PyMem_Free(path);
-    Py_INCREF(Py_None);
-    return Py_None;
-#endif
-}
-
-#ifdef HAVE_FCHMOD
-PyDoc_STRVAR(posix_fchmod__doc__,
-"fchmod(fd, mode)\n\n\
-Change the access permissions of the file given by file\n\
-descriptor fd.");
-
-static PyObject *
-posix_fchmod(PyObject *self, PyObject *args)
-{
-    int fd, mode, res;
-    if (!PyArg_ParseTuple(args, "ii:fchmod", &fd, &mode))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = fchmod(fd, mode);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error();
-    Py_RETURN_NONE;
-}
-#endif /* HAVE_FCHMOD */
-
-#ifdef HAVE_LCHMOD
-PyDoc_STRVAR(posix_lchmod__doc__,
-"lchmod(path, mode)\n\n\
-Change the access permissions of a file. If path is a symlink, this\n\
-affects the link itself rather than the target.");
-
-static PyObject *
-posix_lchmod(PyObject *self, PyObject *args)
-{
-    char *path = NULL;
-    int i;
-    int res;
-    if (!PyArg_ParseTuple(args, "eti:lchmod", Py_FileSystemDefaultEncoding,
-                          &path, &i))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = lchmod(path, i);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error_with_allocated_filename(path);
-    PyMem_Free(path);
-    Py_RETURN_NONE;
-}
-#endif /* HAVE_LCHMOD */
-
-
-#ifdef HAVE_CHFLAGS
-PyDoc_STRVAR(posix_chflags__doc__,
-"chflags(path, flags)\n\n\
-Set file flags.");
-
-static PyObject *
-posix_chflags(PyObject *self, PyObject *args)
-{
-    char *path;
-    unsigned long flags;
-    int res;
-    if (!PyArg_ParseTuple(args, "etk:chflags",
-                          Py_FileSystemDefaultEncoding, &path, &flags))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = chflags(path, flags);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error_with_allocated_filename(path);
-    PyMem_Free(path);
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif /* HAVE_CHFLAGS */
-
-#ifdef HAVE_LCHFLAGS
-PyDoc_STRVAR(posix_lchflags__doc__,
-"lchflags(path, flags)\n\n\
-Set file flags.\n\
-This function will not follow symbolic links.");
-
-static PyObject *
-posix_lchflags(PyObject *self, PyObject *args)
-{
-    char *path;
-    unsigned long flags;
-    int res;
-    if (!PyArg_ParseTuple(args, "etk:lchflags",
-                          Py_FileSystemDefaultEncoding, &path, &flags))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = lchflags(path, flags);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error_with_allocated_filename(path);
-    PyMem_Free(path);
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif /* HAVE_LCHFLAGS */
-
-#ifdef HAVE_CHROOT
-PyDoc_STRVAR(posix_chroot__doc__,
-"chroot(path)\n\n\
-Change root directory to path.");
-
-static PyObject *
-posix_chroot(PyObject *self, PyObject *args)
-{
-    return posix_1str(args, "et:chroot", chroot);
-}
-#endif
-
-#ifdef HAVE_FSYNC
-PyDoc_STRVAR(posix_fsync__doc__,
-"fsync(fildes)\n\n\
-force write of file with filedescriptor to disk.");
-
-static PyObject *
-posix_fsync(PyObject *self, PyObject *fdobj)
-{
-    return posix_fildes(fdobj, fsync);
-}
-#endif /* HAVE_FSYNC */
-
-#ifdef HAVE_FDATASYNC
-
-#ifdef __hpux
-extern int fdatasync(int); /* On HP-UX, in libc but not in unistd.h */
-#endif
-
-PyDoc_STRVAR(posix_fdatasync__doc__,
-"fdatasync(fildes)\n\n\
-force write of file with filedescriptor to disk.\n\
- does not force update of metadata.");
-
-static PyObject *
-posix_fdatasync(PyObject *self, PyObject *fdobj)
-{
-    return posix_fildes(fdobj, fdatasync);
-}
-#endif /* HAVE_FDATASYNC */
-
-
-#ifdef HAVE_CHOWN
-PyDoc_STRVAR(posix_chown__doc__,
-"chown(path, uid, gid)\n\n\
-Change the owner and group id of path to the numeric uid and gid.");
-
-static PyObject *
-posix_chown(PyObject *self, PyObject *args)
-{
-    char *path = NULL;
-    long uid, gid;
-    int res;
-    if (!PyArg_ParseTuple(args, "etll:chown",
-                          Py_FileSystemDefaultEncoding, &path,
-                          &uid, &gid))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = chown(path, (uid_t) uid, (gid_t) gid);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error_with_allocated_filename(path);
-    PyMem_Free(path);
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif /* HAVE_CHOWN */
-
-#ifdef HAVE_FCHOWN
-PyDoc_STRVAR(posix_fchown__doc__,
-"fchown(fd, uid, gid)\n\n\
-Change the owner and group id of the file given by file descriptor\n\
-fd to the numeric uid and gid.");
-
-static PyObject *
-posix_fchown(PyObject *self, PyObject *args)
-{
-    int fd;
-    long uid, gid;
-    int res;
-    if (!PyArg_ParseTuple(args, "ill:chown", &fd, &uid, &gid))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = fchown(fd, (uid_t) uid, (gid_t) gid);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error();
-    Py_RETURN_NONE;
-}
-#endif /* HAVE_FCHOWN */
-
-#ifdef HAVE_LCHOWN
-PyDoc_STRVAR(posix_lchown__doc__,
-"lchown(path, uid, gid)\n\n\
-Change the owner and group id of path to the numeric uid and gid.\n\
-This function will not follow symbolic links.");
-
-static PyObject *
-posix_lchown(PyObject *self, PyObject *args)
-{
-    char *path = NULL;
-    long uid, gid;
-    int res;
-    if (!PyArg_ParseTuple(args, "etll:lchown",
-                          Py_FileSystemDefaultEncoding, &path,
-                          &uid, &gid))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = lchown(path, (uid_t) uid, (gid_t) gid);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error_with_allocated_filename(path);
-    PyMem_Free(path);
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif /* HAVE_LCHOWN */
-
-
-#ifdef HAVE_GETCWD
-PyDoc_STRVAR(posix_getcwd__doc__,
-"getcwd() -> path\n\n\
-Return a string representing the current working directory.");
-
-#if (defined(__sun) && defined(__SVR4)) || defined(__OpenBSD__)
-/* Issue 9185: getcwd() returns NULL/ERANGE indefinitely. */
-static PyObject *
-posix_getcwd(PyObject *self, PyObject *noargs)
-{
-    char buf[PATH_MAX+2];
-    char *res;
-
-    Py_BEGIN_ALLOW_THREADS
-    res = getcwd(buf, sizeof buf);
-    Py_END_ALLOW_THREADS
-
-    if (res == NULL)
-        return posix_error();
-
-    return PyString_FromString(buf);
-}
-#else
-static PyObject *
-posix_getcwd(PyObject *self, PyObject *noargs)
-{
-    int bufsize_incr = 1024;
-    int bufsize = 0;
-    char *tmpbuf = NULL;
-    char *res = NULL;
-    PyObject *dynamic_return;
-
-    Py_BEGIN_ALLOW_THREADS
-    do {
-        bufsize = bufsize + bufsize_incr;
-        tmpbuf = malloc(bufsize);
-        if (tmpbuf == NULL) {
-            break;
-        }
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
-        res = _getcwd2(tmpbuf, bufsize);
-#else
-        res = getcwd(tmpbuf, bufsize);
-#endif
-
-        if (res == NULL) {
-            free(tmpbuf);
-        }
-    } while ((res == NULL) && (errno == ERANGE));
-    Py_END_ALLOW_THREADS
-
-    if (res == NULL)
-        return posix_error();
-
-    dynamic_return = PyString_FromString(tmpbuf);
-    free(tmpbuf);
-
-    return dynamic_return;
-}
-#endif /* getcwd() NULL/ERANGE workaround. */
-
-#ifdef Py_USING_UNICODE
-PyDoc_STRVAR(posix_getcwdu__doc__,
-"getcwdu() -> path\n\n\
-Return a unicode string representing the current working directory.");
-
-static PyObject *
-posix_getcwdu(PyObject *self, PyObject *noargs)
-{
-    char buf[1026];
-    char *res;
-
-#ifdef MS_WINDOWS
-    DWORD len;
-    wchar_t wbuf[1026];
-    wchar_t *wbuf2 = wbuf;
-    PyObject *resobj;
-    Py_BEGIN_ALLOW_THREADS
-    len = GetCurrentDirectoryW(sizeof wbuf/ sizeof wbuf[0], wbuf);
-    /* If the buffer is large enough, len does not include the
-       terminating \0. If the buffer is too small, len includes
-       the space needed for the terminator. */
-    if (len >= sizeof wbuf/ sizeof wbuf[0]) {
-        wbuf2 = malloc(len * sizeof(wchar_t));
-        if (wbuf2)
-            len = GetCurrentDirectoryW(len, wbuf2);
-    }
-    Py_END_ALLOW_THREADS
-    if (!wbuf2) {
-        PyErr_NoMemory();
-        return NULL;
-    }
-    if (!len) {
-        if (wbuf2 != wbuf) free(wbuf2);
-        return win32_error("getcwdu", NULL);
-    }
-    resobj = PyUnicode_FromWideChar(wbuf2, len);
-    if (wbuf2 != wbuf) free(wbuf2);
-    return resobj;
-#endif /* MS_WINDOWS */
-
-    Py_BEGIN_ALLOW_THREADS
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
-    res = _getcwd2(buf, sizeof buf);
-#else
-    res = getcwd(buf, sizeof buf);
-#endif
-    Py_END_ALLOW_THREADS
-    if (res == NULL)
-        return posix_error();
-    return PyUnicode_Decode(buf, strlen(buf), Py_FileSystemDefaultEncoding,"strict");
-}
-#endif /* Py_USING_UNICODE */
-#endif /* HAVE_GETCWD */
-
-
-#ifdef HAVE_LINK
-PyDoc_STRVAR(posix_link__doc__,
-"link(src, dst)\n\n\
-Create a hard link to a file.");
-
-static PyObject *
-posix_link(PyObject *self, PyObject *args)
-{
-    return posix_2str(args, "etet:link", link);
-}
-#endif /* HAVE_LINK */
-
-
-PyDoc_STRVAR(posix_listdir__doc__,
-"listdir(path) -> list_of_strings\n\n\
-Return a list containing the names of the entries in the directory.\n\
-\n\
-    path: path of directory to list\n\
-\n\
-The list is in arbitrary order.  It does not include the special\n\
-entries '.' and '..' even if they are present in the directory.");
-
-static PyObject *
-posix_listdir(PyObject *self, PyObject *args)
-{
-    /* XXX Should redo this putting the (now four) versions of opendir
-       in separate files instead of having them all here... */
-#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)
-
-    PyObject *d, *v;
-    HANDLE hFindFile;
-    BOOL result;
-    WIN32_FIND_DATA FileData;
-    char namebuf[MAX_PATH+5]; /* Overallocate for \\*.*\0 */
-    char *bufptr = namebuf;
-    Py_ssize_t len = sizeof(namebuf)-5; /* only claim to have space for MAX_PATH */
-
-    PyObject *po;
-    if (PyArg_ParseTuple(args, "U:listdir", &po)) {
-        WIN32_FIND_DATAW wFileData;
-        Py_UNICODE *wnamebuf;
-        /* Overallocate for \\*.*\0 */
-        len = PyUnicode_GET_SIZE(po);
-        wnamebuf = malloc((len + 5) * sizeof(wchar_t));
-        if (!wnamebuf) {
-            PyErr_NoMemory();
-            return NULL;
-        }
-        wcscpy(wnamebuf, PyUnicode_AS_UNICODE(po));
-        if (len > 0) {
-            Py_UNICODE wch = wnamebuf[len-1];
-            if (wch != L'/' && wch != L'\\' && wch != L':')
-                wnamebuf[len++] = L'\\';
-            wcscpy(wnamebuf + len, L"*.*");
-        }
-        if ((d = PyList_New(0)) == NULL) {
-            free(wnamebuf);
-            return NULL;
-        }
-        Py_BEGIN_ALLOW_THREADS
-        hFindFile = FindFirstFileW(wnamebuf, &wFileData);
-        Py_END_ALLOW_THREADS
-        if (hFindFile == INVALID_HANDLE_VALUE) {
-            int error = GetLastError();
-            if (error == ERROR_FILE_NOT_FOUND) {
-                free(wnamebuf);
-                return d;
-            }
-            Py_DECREF(d);
-            win32_error_unicode("FindFirstFileW", wnamebuf);
-            free(wnamebuf);
-            return NULL;
-        }
-        do {
-            /* Skip over . and .. */
-            if (wcscmp(wFileData.cFileName, L".") != 0 &&
-                wcscmp(wFileData.cFileName, L"..") != 0) {
-                v = PyUnicode_FromUnicode(wFileData.cFileName, wcslen(wFileData.cFileName));
-                if (v == NULL) {
-                    Py_DECREF(d);
-                    d = NULL;
-                    break;
-                }
-                if (PyList_Append(d, v) != 0) {
-                    Py_DECREF(v);
-                    Py_DECREF(d);
-                    d = NULL;
-                    break;
-                }
-                Py_DECREF(v);
-            }
-            Py_BEGIN_ALLOW_THREADS
-            result = FindNextFileW(hFindFile, &wFileData);
-            Py_END_ALLOW_THREADS
-            /* FindNextFile sets error to ERROR_NO_MORE_FILES if
-               it got to the end of the directory. */
-            if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
-                Py_DECREF(d);
-                win32_error_unicode("FindNextFileW", wnamebuf);
-                FindClose(hFindFile);
-                free(wnamebuf);
-                return NULL;
-            }
-        } while (result == TRUE);
-
-        if (FindClose(hFindFile) == FALSE) {
-            Py_DECREF(d);
-            win32_error_unicode("FindClose", wnamebuf);
-            free(wnamebuf);
-            return NULL;
-        }
-        free(wnamebuf);
-        return d;
-    }
-    /* Drop the argument parsing error as narrow strings
-       are also valid. */
-    PyErr_Clear();
-
-    if (!PyArg_ParseTuple(args, "et#:listdir",
-                          Py_FileSystemDefaultEncoding, &bufptr, &len))
-        return NULL;
-    if (len > 0) {
-        char ch = namebuf[len-1];
-        if (ch != SEP && ch != ALTSEP && ch != ':')
-            namebuf[len++] = '/';
-        strcpy(namebuf + len, "*.*");
-    }
-
-    if ((d = PyList_New(0)) == NULL)
-        return NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    hFindFile = FindFirstFile(namebuf, &FileData);
-    Py_END_ALLOW_THREADS
-    if (hFindFile == INVALID_HANDLE_VALUE) {
-        int error = GetLastError();
-        if (error == ERROR_FILE_NOT_FOUND)
-            return d;
-        Py_DECREF(d);
-        return win32_error("FindFirstFile", namebuf);
-    }
-    do {
-        /* Skip over . and .. */
-        if (strcmp(FileData.cFileName, ".") != 0 &&
-            strcmp(FileData.cFileName, "..") != 0) {
-            v = PyString_FromString(FileData.cFileName);
-            if (v == NULL) {
-                Py_DECREF(d);
-                d = NULL;
-                break;
-            }
-            if (PyList_Append(d, v) != 0) {
-                Py_DECREF(v);
-                Py_DECREF(d);
-                d = NULL;
-                break;
-            }
-            Py_DECREF(v);
-        }
-        Py_BEGIN_ALLOW_THREADS
-        result = FindNextFile(hFindFile, &FileData);
-        Py_END_ALLOW_THREADS
-        /* FindNextFile sets error to ERROR_NO_MORE_FILES if
-           it got to the end of the directory. */
-        if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
-            Py_DECREF(d);
-            win32_error("FindNextFile", namebuf);
-            FindClose(hFindFile);
-            return NULL;
-        }
-    } while (result == TRUE);
-
-    if (FindClose(hFindFile) == FALSE) {
-        Py_DECREF(d);
-        return win32_error("FindClose", namebuf);
-    }
-
-    return d;
-
-#elif defined(PYOS_OS2)
-
-#ifndef MAX_PATH
-#define MAX_PATH    CCHMAXPATH
-#endif
-    char *name, *pt;
-    Py_ssize_t len;
-    PyObject *d, *v;
-    char namebuf[MAX_PATH+5];
-    HDIR  hdir = 1;
-    ULONG srchcnt = 1;
-    FILEFINDBUF3   ep;
-    APIRET rc;
-
-    if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
-        return NULL;
-    if (len >= MAX_PATH) {
-        PyErr_SetString(PyExc_ValueError, "path too long");
-        return NULL;
-    }
-    strcpy(namebuf, name);
-    for (pt = namebuf; *pt; pt++)
-        if (*pt == ALTSEP)
-            *pt = SEP;
-    if (namebuf[len-1] != SEP)
-        namebuf[len++] = SEP;
-    strcpy(namebuf + len, "*.*");
-
-    if ((d = PyList_New(0)) == NULL)
-        return NULL;
-
-    rc = DosFindFirst(namebuf,         /* Wildcard Pattern to Match */
-                      &hdir,           /* Handle to Use While Search Directory */
-                      FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
-                      &ep, sizeof(ep), /* Structure to Receive Directory Entry */
-                      &srchcnt,        /* Max and Actual Count of Entries Per Iteration */
-                      FIL_STANDARD);   /* Format of Entry (EAs or Not) */
-
-    if (rc != NO_ERROR) {
-        errno = ENOENT;
-        return posix_error_with_filename(name);
-    }
-
-    if (srchcnt > 0) { /* If Directory is NOT Totally Empty, */
-        do {
-            if (ep.achName[0] == '.'
-            && (ep.achName[1] == '\0' || (ep.achName[1] == '.' && ep.achName[2] == '\0')))
-                continue; /* Skip Over "." and ".." Names */
-
-            strcpy(namebuf, ep.achName);
-
-            /* Leave Case of Name Alone -- In Native Form */
-            /* (Removed Forced Lowercasing Code) */
-
-            v = PyString_FromString(namebuf);
-            if (v == NULL) {
-                Py_DECREF(d);
-                d = NULL;
-                break;
-            }
-            if (PyList_Append(d, v) != 0) {
-                Py_DECREF(v);
-                Py_DECREF(d);
-                d = NULL;
-                break;
-            }
-            Py_DECREF(v);
-        } while (DosFindNext(hdir, &ep, sizeof(ep), &srchcnt) == NO_ERROR && srchcnt > 0);
-    }
-
-    return d;
-#else
-
-    char *name = NULL;
-    PyObject *d, *v;
-    DIR *dirp;
-    struct dirent *ep;
-    int arg_is_unicode = 1;
-
-    errno = 0;
-    if (!PyArg_ParseTuple(args, "U:listdir", &v)) {
-        arg_is_unicode = 0;
-        PyErr_Clear();
-    }
-    if (!PyArg_ParseTuple(args, "et:listdir", Py_FileSystemDefaultEncoding, &name))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    dirp = opendir(name);
-    Py_END_ALLOW_THREADS
-    if (dirp == NULL) {
-        return posix_error_with_allocated_filename(name);
-    }
-    if ((d = PyList_New(0)) == NULL) {
-        Py_BEGIN_ALLOW_THREADS
-        closedir(dirp);
-        Py_END_ALLOW_THREADS
-        PyMem_Free(name);
-        return NULL;
-    }
-    for (;;) {
-        errno = 0;
-        Py_BEGIN_ALLOW_THREADS
-        ep = readdir(dirp);
-        Py_END_ALLOW_THREADS
-        if (ep == NULL) {
-            if (errno == 0) {
-                break;
-            } else {
-                Py_BEGIN_ALLOW_THREADS
-                closedir(dirp);
-                Py_END_ALLOW_THREADS
-                Py_DECREF(d);
-                return posix_error_with_allocated_filename(name);
-            }
-        }
-        if (ep->d_name[0] == '.' &&
-            (NAMLEN(ep) == 1 ||
-             (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
-            continue;
-        v = PyString_FromStringAndSize(ep->d_name, NAMLEN(ep));
-        if (v == NULL) {
-            Py_DECREF(d);
-            d = NULL;
-            break;
-        }
-#ifdef Py_USING_UNICODE
-        if (arg_is_unicode) {
-            PyObject *w;
-
-            w = PyUnicode_FromEncodedObject(v,
-                                            Py_FileSystemDefaultEncoding,
-                                            "strict");
-            if (w != NULL) {
-                Py_DECREF(v);
-                v = w;
-            }
-            else {
-                /* fall back to the original byte string, as
-                   discussed in patch #683592 */
-                PyErr_Clear();
-            }
-        }
-#endif
-        if (PyList_Append(d, v) != 0) {
-            Py_DECREF(v);
-            Py_DECREF(d);
-            d = NULL;
-            break;
-        }
-        Py_DECREF(v);
-    }
-    Py_BEGIN_ALLOW_THREADS
-    closedir(dirp);
-    Py_END_ALLOW_THREADS
-    PyMem_Free(name);
-
-    return d;
-
-#endif /* which OS */
-}  /* end of posix_listdir */
-
-#ifdef MS_WINDOWS
-/* A helper function for abspath on win32 */
-static PyObject *
-posix__getfullpathname(PyObject *self, PyObject *args)
-{
-    /* assume encoded strings won't more than double no of chars */
-    char inbuf[MAX_PATH*2];
-    char *inbufp = inbuf;
-    Py_ssize_t insize = sizeof(inbuf);
-    char outbuf[MAX_PATH*2];
-    char *temp;
-
-    PyUnicodeObject *po;
-    if (PyArg_ParseTuple(args, "U|:_getfullpathname", &po)) {
-        Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po);
-        Py_UNICODE woutbuf[MAX_PATH*2], *woutbufp = woutbuf;
-        Py_UNICODE *wtemp;
-        DWORD result;
-        PyObject *v;
-        result = GetFullPathNameW(wpath,
-                                  sizeof(woutbuf)/sizeof(woutbuf[0]),
-                                  woutbuf, &wtemp);
-        if (result > sizeof(woutbuf)/sizeof(woutbuf[0])) {
-            woutbufp = malloc(result * sizeof(Py_UNICODE));
-            if (!woutbufp)
-                return PyErr_NoMemory();
-            result = GetFullPathNameW(wpath, result, woutbufp, &wtemp);
-        }
-        if (result)
-            v = PyUnicode_FromUnicode(woutbufp, wcslen(woutbufp));
-        else
-            v = win32_error_unicode("GetFullPathNameW", wpath);
-        if (woutbufp != woutbuf)
-            free(woutbufp);
-        return v;
-    }
-    /* Drop the argument parsing error as narrow strings
-       are also valid. */
-    PyErr_Clear();
-
-    if (!PyArg_ParseTuple (args, "et#:_getfullpathname",
-                           Py_FileSystemDefaultEncoding, &inbufp,
-                           &insize))
-        return NULL;
-    if (!GetFullPathName(inbuf, sizeof(outbuf)/sizeof(outbuf[0]),
-                         outbuf, &temp))
-        return win32_error("GetFullPathName", inbuf);
-    if (PyUnicode_Check(PyTuple_GetItem(args, 0))) {
-        return PyUnicode_Decode(outbuf, strlen(outbuf),
-                                Py_FileSystemDefaultEncoding, NULL);
-    }
-    return PyString_FromString(outbuf);
-} /* end of posix__getfullpathname */
-#endif /* MS_WINDOWS */
-
-PyDoc_STRVAR(posix_mkdir__doc__,
-"mkdir(path [, mode=0777])\n\n\
-Create a directory.");
-
-static PyObject *
-posix_mkdir(PyObject *self, PyObject *args)
-{
-    int res;
-    char *path = NULL;
-    int mode = 0777;
-
-#ifdef MS_WINDOWS
-    PyUnicodeObject *po;
-    if (PyArg_ParseTuple(args, "U|i:mkdir", &po, &mode)) {
-        Py_BEGIN_ALLOW_THREADS
-        /* PyUnicode_AS_UNICODE OK without thread lock as
-           it is a simple dereference. */
-        res = CreateDirectoryW(PyUnicode_AS_UNICODE(po), NULL);
-        Py_END_ALLOW_THREADS
-        if (!res)
-            return win32_error_unicode("mkdir", PyUnicode_AS_UNICODE(po));
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-    /* Drop the argument parsing error as narrow strings
-       are also valid. */
-    PyErr_Clear();
-    if (!PyArg_ParseTuple(args, "et|i:mkdir",
-                          Py_FileSystemDefaultEncoding, &path, &mode))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    /* PyUnicode_AS_UNICODE OK without thread lock as
-       it is a simple dereference. */
-    res = CreateDirectoryA(path, NULL);
-    Py_END_ALLOW_THREADS
-    if (!res) {
-        win32_error("mkdir", path);
-        PyMem_Free(path);
-        return NULL;
-    }
-    PyMem_Free(path);
-    Py_INCREF(Py_None);
-    return Py_None;
-#else /* MS_WINDOWS */
-
-    if (!PyArg_ParseTuple(args, "et|i:mkdir",
-                          Py_FileSystemDefaultEncoding, &path, &mode))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-#if ( defined(__WATCOMC__) || defined(PYCC_VACPP) ) && !defined(__QNX__)
-    res = mkdir(path);
-#else
-    res = mkdir(path, mode);
-#endif
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error_with_allocated_filename(path);
-    PyMem_Free(path);
-    Py_INCREF(Py_None);
-    return Py_None;
-#endif /* MS_WINDOWS */
-}
-
-
-/* sys/resource.h is needed for at least: wait3(), wait4(), broken nice. */
-#if defined(HAVE_SYS_RESOURCE_H)
-#include <sys/resource.h>
-#endif
-
-
-#ifdef HAVE_NICE
-PyDoc_STRVAR(posix_nice__doc__,
-"nice(inc) -> new_priority\n\n\
-Decrease the priority of process by inc and return the new priority.");
-
-static PyObject *
-posix_nice(PyObject *self, PyObject *args)
-{
-    int increment, value;
-
-    if (!PyArg_ParseTuple(args, "i:nice", &increment))
-        return NULL;
-
-    /* There are two flavours of 'nice': one that returns the new
-       priority (as required by almost all standards out there) and the
-       Linux/FreeBSD/BSDI one, which returns '0' on success and advices
-       the use of getpriority() to get the new priority.
-
-       If we are of the nice family that returns the new priority, we
-       need to clear errno before the call, and check if errno is filled
-       before calling posix_error() on a returnvalue of -1, because the
-       -1 may be the actual new priority! */
-
-    errno = 0;
-    value = nice(increment);
-#if defined(HAVE_BROKEN_NICE) && defined(HAVE_GETPRIORITY)
-    if (value == 0)
-        value = getpriority(PRIO_PROCESS, 0);
-#endif
-    if (value == -1 && errno != 0)
-        /* either nice() or getpriority() returned an error */
-        return posix_error();
-    return PyInt_FromLong((long) value);
-}
-#endif /* HAVE_NICE */
-
-PyDoc_STRVAR(posix_rename__doc__,
-"rename(old, new)\n\n\
-Rename a file or directory.");
-
-static PyObject *
-posix_rename(PyObject *self, PyObject *args)
-{
-#ifdef MS_WINDOWS
-    PyObject *o1, *o2;
-    char *p1, *p2;
-    BOOL result;
-    if (!PyArg_ParseTuple(args, "OO:rename", &o1, &o2))
-        goto error;
-    if (!convert_to_unicode(&o1))
-        goto error;
-    if (!convert_to_unicode(&o2)) {
-        Py_DECREF(o1);
-        goto error;
-    }
-    Py_BEGIN_ALLOW_THREADS
-    result = MoveFileW(PyUnicode_AsUnicode(o1),
-                       PyUnicode_AsUnicode(o2));
-    Py_END_ALLOW_THREADS
-    Py_DECREF(o1);
-    Py_DECREF(o2);
-    if (!result)
-        return win32_error("rename", NULL);
-    Py_INCREF(Py_None);
-    return Py_None;
-error:
-    PyErr_Clear();
-    if (!PyArg_ParseTuple(args, "ss:rename", &p1, &p2))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    result = MoveFileA(p1, p2);
-    Py_END_ALLOW_THREADS
-    if (!result)
-        return win32_error("rename", NULL);
-    Py_INCREF(Py_None);
-    return Py_None;
-#else
-    return posix_2str(args, "etet:rename", rename);
-#endif
-}
-
-
-PyDoc_STRVAR(posix_rmdir__doc__,
-"rmdir(path)\n\n\
-Remove a directory.");
-
-static PyObject *
-posix_rmdir(PyObject *self, PyObject *args)
-{
-#ifdef MS_WINDOWS
-    return win32_1str(args, "rmdir", "s:rmdir", RemoveDirectoryA, "U:rmdir", RemoveDirectoryW);
-#else
-    return posix_1str(args, "et:rmdir", rmdir);
-#endif
-}
-
-
-PyDoc_STRVAR(posix_stat__doc__,
-"stat(path) -> stat result\n\n\
-Perform a stat system call on the given path.");
-
-static PyObject *
-posix_stat(PyObject *self, PyObject *args)
-{
-#ifdef MS_WINDOWS
-    return posix_do_stat(self, args, "et:stat", STAT, "U:stat", win32_wstat);
-#else
-    return posix_do_stat(self, args, "et:stat", STAT, NULL, NULL);
-#endif
-}
-
-
-#ifdef HAVE_SYSTEM
-PyDoc_STRVAR(posix_system__doc__,
-"system(command) -> exit_status\n\n\
-Execute the command (a string) in a subshell.");
-
-static PyObject *
-posix_system(PyObject *self, PyObject *args)
-{
-    char *command;
-    long sts;
-    if (!PyArg_ParseTuple(args, "s:system", &command))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    sts = system(command);
-    Py_END_ALLOW_THREADS
-    return PyInt_FromLong(sts);
-}
-#endif
-
-
-PyDoc_STRVAR(posix_umask__doc__,
-"umask(new_mask) -> old_mask\n\n\
-Set the current numeric umask and return the previous umask.");
-
-static PyObject *
-posix_umask(PyObject *self, PyObject *args)
-{
-    int i;
-    if (!PyArg_ParseTuple(args, "i:umask", &i))
-        return NULL;
-    i = (int)umask(i);
-    if (i < 0)
-        return posix_error();
-    return PyInt_FromLong((long)i);
-}
-
-
-PyDoc_STRVAR(posix_unlink__doc__,
-"unlink(path)\n\n\
-Remove a file (same as remove(path)).");
-
-PyDoc_STRVAR(posix_remove__doc__,
-"remove(path)\n\n\
-Remove a file (same as unlink(path)).");
-
-static PyObject *
-posix_unlink(PyObject *self, PyObject *args)
-{
-#ifdef MS_WINDOWS
-    return win32_1str(args, "remove", "s:remove", DeleteFileA, "U:remove", DeleteFileW);
-#else
-    return posix_1str(args, "et:remove", unlink);
-#endif
-}
-
-
-#ifdef HAVE_UNAME
-PyDoc_STRVAR(posix_uname__doc__,
-"uname() -> (sysname, nodename, release, version, machine)\n\n\
-Return a tuple identifying the current operating system.");
-
-static PyObject *
-posix_uname(PyObject *self, PyObject *noargs)
-{
-    struct utsname u;
-    int res;
-
-    Py_BEGIN_ALLOW_THREADS
-    res = uname(&u);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error();
-    return Py_BuildValue("(sssss)",
-                         u.sysname,
-                         u.nodename,
-                         u.release,
-                         u.version,
-                         u.machine);
-}
-#endif /* HAVE_UNAME */
-
-static int
-extract_time(PyObject *t, long* sec, long* usec)
-{
-    long intval;
-    if (PyFloat_Check(t)) {
-        double tval = PyFloat_AsDouble(t);
-        PyObject *intobj = Py_TYPE(t)->tp_as_number->nb_int(t);
-        if (!intobj)
-            return -1;
-        intval = PyInt_AsLong(intobj);
-        Py_DECREF(intobj);
-        if (intval == -1 && PyErr_Occurred())
-            return -1;
-        *sec = intval;
-        *usec = (long)((tval - intval) * 1e6); /* can't exceed 1000000 */
-        if (*usec < 0)
-            /* If rounding gave us a negative number,
-               truncate.  */
-            *usec = 0;
-        return 0;
-    }
-    intval = PyInt_AsLong(t);
-    if (intval == -1 && PyErr_Occurred())
-        return -1;
-    *sec = intval;
-    *usec = 0;
-    return 0;
-}
-
-PyDoc_STRVAR(posix_utime__doc__,
-"utime(path, (atime, mtime))\n\
-utime(path, None)\n\n\
-Set the access and modified time of the file to the given values.  If the\n\
-second form is used, set the access and modified times to the current time.");
-
-static PyObject *
-posix_utime(PyObject *self, PyObject *args)
-{
-#ifdef MS_WINDOWS
-    PyObject *arg;
-    PyUnicodeObject *obwpath;
-    wchar_t *wpath = NULL;
-    char *apath = NULL;
-    HANDLE hFile;
-    long atimesec, mtimesec, ausec, musec;
-    FILETIME atime, mtime;
-    PyObject *result = NULL;
-
-    if (PyArg_ParseTuple(args, "UO|:utime", &obwpath, &arg)) {
-        wpath = PyUnicode_AS_UNICODE(obwpath);
-        Py_BEGIN_ALLOW_THREADS
-        hFile = CreateFileW(wpath, FILE_WRITE_ATTRIBUTES, 0,
-                            NULL, OPEN_EXISTING,
-                            FILE_FLAG_BACKUP_SEMANTICS, NULL);
-        Py_END_ALLOW_THREADS
-        if (hFile == INVALID_HANDLE_VALUE)
-            return win32_error_unicode("utime", wpath);
-    } else
-        /* Drop the argument parsing error as narrow strings
-           are also valid. */
-        PyErr_Clear();
-
-    if (!wpath) {
-        if (!PyArg_ParseTuple(args, "etO:utime",
-                              Py_FileSystemDefaultEncoding, &apath, &arg))
-            return NULL;
-        Py_BEGIN_ALLOW_THREADS
-        hFile = CreateFileA(apath, FILE_WRITE_ATTRIBUTES, 0,
-                            NULL, OPEN_EXISTING,
-                            FILE_FLAG_BACKUP_SEMANTICS, NULL);
-        Py_END_ALLOW_THREADS
-        if (hFile == INVALID_HANDLE_VALUE) {
-            win32_error("utime", apath);
-            PyMem_Free(apath);
-            return NULL;
-        }
-        PyMem_Free(apath);
-    }
-
-    if (arg == Py_None) {
-        SYSTEMTIME now;
-        GetSystemTime(&now);
-        if (!SystemTimeToFileTime(&now, &mtime) ||
-            !SystemTimeToFileTime(&now, &atime)) {
-            win32_error("utime", NULL);
-            goto done;
-        }
-    }
-    else if (!PyTuple_Check(arg) || PyTuple_Size(arg) != 2) {
-        PyErr_SetString(PyExc_TypeError,
-                        "utime() arg 2 must be a tuple (atime, mtime)");
-        goto done;
-    }
-    else {
-        if (extract_time(PyTuple_GET_ITEM(arg, 0),
-                         &atimesec, &ausec) == -1)
-            goto done;
-        time_t_to_FILE_TIME(atimesec, 1000*ausec, &atime);
-        if (extract_time(PyTuple_GET_ITEM(arg, 1),
-                         &mtimesec, &musec) == -1)
-            goto done;
-        time_t_to_FILE_TIME(mtimesec, 1000*musec, &mtime);
-    }
-    if (!SetFileTime(hFile, NULL, &atime, &mtime)) {
-        /* Avoid putting the file name into the error here,
-           as that may confuse the user into believing that
-           something is wrong with the file, when it also
-           could be the time stamp that gives a problem. */
-        win32_error("utime", NULL);
-    }
-    Py_INCREF(Py_None);
-    result = Py_None;
-done:
-    CloseHandle(hFile);
-    return result;
-#else /* MS_WINDOWS */
-
-    char *path = NULL;
-    long atime, mtime, ausec, musec;
-    int res;
-    PyObject* arg;
-
-#if defined(HAVE_UTIMES)
-    struct timeval buf[2];
-#define ATIME buf[0].tv_sec
-#define MTIME buf[1].tv_sec
-#elif defined(HAVE_UTIME_H)
-/* XXX should define struct utimbuf instead, above */
-    struct utimbuf buf;
-#define ATIME buf.actime
-#define MTIME buf.modtime
-#define UTIME_ARG &buf
-#else /* HAVE_UTIMES */
-    time_t buf[2];
-#define ATIME buf[0]
-#define MTIME buf[1]
-#define UTIME_ARG buf
-#endif /* HAVE_UTIMES */
-
-
-    if (!PyArg_ParseTuple(args, "etO:utime",
-                          Py_FileSystemDefaultEncoding, &path, &arg))
-        return NULL;
-    if (arg == Py_None) {
-        /* optional time values not given */
-        Py_BEGIN_ALLOW_THREADS
-        res = utime(path, NULL);
-        Py_END_ALLOW_THREADS
-    }
-    else if (!PyTuple_Check(arg) || PyTuple_Size(arg) != 2) {
-        PyErr_SetString(PyExc_TypeError,
-                        "utime() arg 2 must be a tuple (atime, mtime)");
-        PyMem_Free(path);
-        return NULL;
-    }
-    else {
-        if (extract_time(PyTuple_GET_ITEM(arg, 0),
-                         &atime, &ausec) == -1) {
-            PyMem_Free(path);
-            return NULL;
-        }
-        if (extract_time(PyTuple_GET_ITEM(arg, 1),
-                         &mtime, &musec) == -1) {
-            PyMem_Free(path);
-            return NULL;
-        }
-        ATIME = atime;
-        MTIME = mtime;
-#ifdef HAVE_UTIMES
-        buf[0].tv_usec = ausec;
-        buf[1].tv_usec = musec;
-        Py_BEGIN_ALLOW_THREADS
-        res = utimes(path, buf);
-        Py_END_ALLOW_THREADS
-#else
-        Py_BEGIN_ALLOW_THREADS
-        res = utime(path, UTIME_ARG);
-        Py_END_ALLOW_THREADS
-#endif /* HAVE_UTIMES */
-    }
-    if (res < 0) {
-        return posix_error_with_allocated_filename(path);
-    }
-    PyMem_Free(path);
-    Py_INCREF(Py_None);
-    return Py_None;
-#undef UTIME_ARG
-#undef ATIME
-#undef MTIME
-#endif /* MS_WINDOWS */
-}
-
-
-/* Process operations */
-
-PyDoc_STRVAR(posix__exit__doc__,
-"_exit(status)\n\n\
-Exit to the system with specified status, without normal exit processing.");
-
-static PyObject *
-posix__exit(PyObject *self, PyObject *args)
-{
-    int sts;
-    if (!PyArg_ParseTuple(args, "i:_exit", &sts))
-        return NULL;
-    _exit(sts);
-    return NULL; /* Make gcc -Wall happy */
-}
-
-#if defined(HAVE_EXECV) || defined(HAVE_SPAWNV)
-static void
-free_string_array(char **array, Py_ssize_t count)
-{
-    Py_ssize_t i;
-    for (i = 0; i < count; i++)
-        PyMem_Free(array[i]);
-    PyMem_DEL(array);
-}
-#endif
-
-
-#ifdef HAVE_EXECV
-PyDoc_STRVAR(posix_execv__doc__,
-"execv(path, args)\n\n\
-Execute an executable path with arguments, replacing current process.\n\
-\n\
-    path: path of executable file\n\
-    args: tuple or list of strings");
-
-static PyObject *
-posix_execv(PyObject *self, PyObject *args)
-{
-    char *path;
-    PyObject *argv;
-    char **argvlist;
-    Py_ssize_t i, argc;
-    PyObject *(*getitem)(PyObject *, Py_ssize_t);
-
-    /* execv has two arguments: (path, argv), where
-       argv is a list or tuple of strings. */
-
-    if (!PyArg_ParseTuple(args, "etO:execv",
-                          Py_FileSystemDefaultEncoding,
-                          &path, &argv))
-        return NULL;
-    if (PyList_Check(argv)) {
-        argc = PyList_Size(argv);
-        getitem = PyList_GetItem;
-    }
-    else if (PyTuple_Check(argv)) {
-        argc = PyTuple_Size(argv);
-        getitem = PyTuple_GetItem;
-    }
-    else {
-        PyErr_SetString(PyExc_TypeError, "execv() arg 2 must be a tuple or list");
-        PyMem_Free(path);
-        return NULL;
-    }
-    if (argc < 1) {
-        PyErr_SetString(PyExc_ValueError, "execv() arg 2 must not be empty");
-        PyMem_Free(path);
-        return NULL;
-    }
-
-    argvlist = PyMem_NEW(char *, argc+1);
-    if (argvlist == NULL) {
-        PyMem_Free(path);
-        return PyErr_NoMemory();
-    }
-    for (i = 0; i < argc; i++) {
-        if (!PyArg_Parse((*getitem)(argv, i), "et",
-                         Py_FileSystemDefaultEncoding,
-                         &argvlist[i])) {
-            free_string_array(argvlist, i);
-            PyErr_SetString(PyExc_TypeError,
-                            "execv() arg 2 must contain only strings");
-            PyMem_Free(path);
-            return NULL;
-
-        }
-    }
-    argvlist[argc] = NULL;
-
-    execv(path, argvlist);
-
-    /* If we get here it's definitely an error */
-
-    free_string_array(argvlist, argc);
-    PyMem_Free(path);
-    return posix_error();
-}
-
-
-PyDoc_STRVAR(posix_execve__doc__,
-"execve(path, args, env)\n\n\
-Execute a path with arguments and environment, replacing current process.\n\
-\n\
-    path: path of executable file\n\
-    args: tuple or list of arguments\n\
-    env: dictionary of strings mapping to strings");
-
-static PyObject *
-posix_execve(PyObject *self, PyObject *args)
-{
-    char *path;
-    PyObject *argv, *env;
-    char **argvlist;
-    char **envlist;
-    PyObject *key, *val, *keys=NULL, *vals=NULL;
-    Py_ssize_t i, pos, argc, envc;
-    PyObject *(*getitem)(PyObject *, Py_ssize_t);
-    Py_ssize_t lastarg = 0;
-
-    /* execve has three arguments: (path, argv, env), where
-       argv is a list or tuple of strings and env is a dictionary
-       like posix.environ. */
-
-    if (!PyArg_ParseTuple(args, "etOO:execve",
-                          Py_FileSystemDefaultEncoding,
-                          &path, &argv, &env))
-        return NULL;
-    if (PyList_Check(argv)) {
-        argc = PyList_Size(argv);
-        getitem = PyList_GetItem;
-    }
-    else if (PyTuple_Check(argv)) {
-        argc = PyTuple_Size(argv);
-        getitem = PyTuple_GetItem;
-    }
-    else {
-        PyErr_SetString(PyExc_TypeError,
-                        "execve() arg 2 must be a tuple or list");
-        goto fail_0;
-    }
-    if (!PyMapping_Check(env)) {
-        PyErr_SetString(PyExc_TypeError,
-                        "execve() arg 3 must be a mapping object");
-        goto fail_0;
-    }
-
-    argvlist = PyMem_NEW(char *, argc+1);
-    if (argvlist == NULL) {
-        PyErr_NoMemory();
-        goto fail_0;
-    }
-    for (i = 0; i < argc; i++) {
-        if (!PyArg_Parse((*getitem)(argv, i),
-                         "et;execve() arg 2 must contain only strings",
-                         Py_FileSystemDefaultEncoding,
-                         &argvlist[i]))
-        {
-            lastarg = i;
-            goto fail_1;
-        }
-    }
-    lastarg = argc;
-    argvlist[argc] = NULL;
-
-    i = PyMapping_Size(env);
-    if (i < 0)
-        goto fail_1;
-    envlist = PyMem_NEW(char *, i + 1);
-    if (envlist == NULL) {
-        PyErr_NoMemory();
-        goto fail_1;
-    }
-    envc = 0;
-    keys = PyMapping_Keys(env);
-    vals = PyMapping_Values(env);
-    if (!keys || !vals)
-        goto fail_2;
-    if (!PyList_Check(keys) || !PyList_Check(vals)) {
-        PyErr_SetString(PyExc_TypeError,
-                        "execve(): env.keys() or env.values() is not a list");
-        goto fail_2;
-    }
-
-    for (pos = 0; pos < i; pos++) {
-        char *p, *k, *v;
-        size_t len;
-
-        key = PyList_GetItem(keys, pos);
-        val = PyList_GetItem(vals, pos);
-        if (!key || !val)
-            goto fail_2;
-
-        if (!PyArg_Parse(
-                    key,
-                    "s;execve() arg 3 contains a non-string key",
-                    &k) ||
-            !PyArg_Parse(
-                val,
-                "s;execve() arg 3 contains a non-string value",
-                &v))
-        {
-            goto fail_2;
-        }
-
-#if defined(PYOS_OS2)
-        /* Omit Pseudo-Env Vars that Would Confuse Programs if Passed On */
-        if (stricmp(k, "BEGINLIBPATH") != 0 && stricmp(k, "ENDLIBPATH") != 0) {
-#endif
-        len = PyString_Size(key) + PyString_Size(val) + 2;
-        p = PyMem_NEW(char, len);
-        if (p == NULL) {
-            PyErr_NoMemory();
-            goto fail_2;
-        }
-        PyOS_snprintf(p, len, "%s=%s", k, v);
-        envlist[envc++] = p;
-#if defined(PYOS_OS2)
-        }
-#endif
-    }
-    envlist[envc] = 0;
-
-    execve(path, argvlist, envlist);
-
-    /* If we get here it's definitely an error */
-
-    (void) posix_error();
-
-  fail_2:
-    while (--envc >= 0)
-        PyMem_DEL(envlist[envc]);
-    PyMem_DEL(envlist);
-  fail_1:
-    free_string_array(argvlist, lastarg);
-    Py_XDECREF(vals);
-    Py_XDECREF(keys);
-  fail_0:
-    PyMem_Free(path);
-    return NULL;
-}
-#endif /* HAVE_EXECV */
-
-
-#ifdef HAVE_SPAWNV
-PyDoc_STRVAR(posix_spawnv__doc__,
-"spawnv(mode, path, args)\n\n\
-Execute the program 'path' in a new process.\n\
-\n\
-    mode: mode of process creation\n\
-    path: path of executable file\n\
-    args: tuple or list of strings");
-
-static PyObject *
-posix_spawnv(PyObject *self, PyObject *args)
-{
-    char *path;
-    PyObject *argv;
-    char **argvlist;
-    int mode, i;
-    Py_ssize_t argc;
-    Py_intptr_t spawnval;
-    PyObject *(*getitem)(PyObject *, Py_ssize_t);
-
-    /* spawnv has three arguments: (mode, path, argv), where
-       argv is a list or tuple of strings. */
-
-    if (!PyArg_ParseTuple(args, "ietO:spawnv", &mode,
-                          Py_FileSystemDefaultEncoding,
-                          &path, &argv))
-        return NULL;
-    if (PyList_Check(argv)) {
-        argc = PyList_Size(argv);
-        getitem = PyList_GetItem;
-    }
-    else if (PyTuple_Check(argv)) {
-        argc = PyTuple_Size(argv);
-        getitem = PyTuple_GetItem;
-    }
-    else {
-        PyErr_SetString(PyExc_TypeError,
-                        "spawnv() arg 2 must be a tuple or list");
-        PyMem_Free(path);
-        return NULL;
-    }
-
-    argvlist = PyMem_NEW(char *, argc+1);
-    if (argvlist == NULL) {
-        PyMem_Free(path);
-        return PyErr_NoMemory();
-    }
-    for (i = 0; i < argc; i++) {
-        if (!PyArg_Parse((*getitem)(argv, i), "et",
-                         Py_FileSystemDefaultEncoding,
-                         &argvlist[i])) {
-            free_string_array(argvlist, i);
-            PyErr_SetString(
-                PyExc_TypeError,
-                "spawnv() arg 2 must contain only strings");
-            PyMem_Free(path);
-            return NULL;
-        }
-    }
-    argvlist[argc] = NULL;
-
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
-    Py_BEGIN_ALLOW_THREADS
-    spawnval = spawnv(mode, path, argvlist);
-    Py_END_ALLOW_THREADS
-#else
-    if (mode == _OLD_P_OVERLAY)
-        mode = _P_OVERLAY;
-
-    Py_BEGIN_ALLOW_THREADS
-    spawnval = _spawnv(mode, path, argvlist);
-    Py_END_ALLOW_THREADS
-#endif
-
-    free_string_array(argvlist, argc);
-    PyMem_Free(path);
-
-    if (spawnval == -1)
-        return posix_error();
-    else
-#if SIZEOF_LONG == SIZEOF_VOID_P
-        return Py_BuildValue("l", (long) spawnval);
-#else
-        return Py_BuildValue("L", (PY_LONG_LONG) spawnval);
-#endif
-}
-
-
-PyDoc_STRVAR(posix_spawnve__doc__,
-"spawnve(mode, path, args, env)\n\n\
-Execute the program 'path' in a new process.\n\
-\n\
-    mode: mode of process creation\n\
-    path: path of executable file\n\
-    args: tuple or list of arguments\n\
-    env: dictionary of strings mapping to strings");
-
-static PyObject *
-posix_spawnve(PyObject *self, PyObject *args)
-{
-    char *path;
-    PyObject *argv, *env;
-    char **argvlist;
-    char **envlist;
-    PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL;
-    int mode, pos, envc;
-    Py_ssize_t argc, i;
-    Py_intptr_t spawnval;
-    PyObject *(*getitem)(PyObject *, Py_ssize_t);
-    Py_ssize_t lastarg = 0;
-
-    /* spawnve has four arguments: (mode, path, argv, env), where
-       argv is a list or tuple of strings and env is a dictionary
-       like posix.environ. */
-
-    if (!PyArg_ParseTuple(args, "ietOO:spawnve", &mode,
-                          Py_FileSystemDefaultEncoding,
-                          &path, &argv, &env))
-        return NULL;
-    if (PyList_Check(argv)) {
-        argc = PyList_Size(argv);
-        getitem = PyList_GetItem;
-    }
-    else if (PyTuple_Check(argv)) {
-        argc = PyTuple_Size(argv);
-        getitem = PyTuple_GetItem;
-    }
-    else {
-        PyErr_SetString(PyExc_TypeError,
-                        "spawnve() arg 2 must be a tuple or list");
-        goto fail_0;
-    }
-    if (!PyMapping_Check(env)) {
-        PyErr_SetString(PyExc_TypeError,
-                        "spawnve() arg 3 must be a mapping object");
-        goto fail_0;
-    }
-
-    argvlist = PyMem_NEW(char *, argc+1);
-    if (argvlist == NULL) {
-        PyErr_NoMemory();
-        goto fail_0;
-    }
-    for (i = 0; i < argc; i++) {
-        if (!PyArg_Parse((*getitem)(argv, i),
-                     "et;spawnve() arg 2 must contain only strings",
-                         Py_FileSystemDefaultEncoding,
-                         &argvlist[i]))
-        {
-            lastarg = i;
-            goto fail_1;
-        }
-    }
-    lastarg = argc;
-    argvlist[argc] = NULL;
-
-    i = PyMapping_Size(env);
-    if (i < 0)
-        goto fail_1;
-    envlist = PyMem_NEW(char *, i + 1);
-    if (envlist == NULL) {
-        PyErr_NoMemory();
-        goto fail_1;
-    }
-    envc = 0;
-    keys = PyMapping_Keys(env);
-    vals = PyMapping_Values(env);
-    if (!keys || !vals)
-        goto fail_2;
-    if (!PyList_Check(keys) || !PyList_Check(vals)) {
-        PyErr_SetString(PyExc_TypeError,
-                        "spawnve(): env.keys() or env.values() is not a list");
-        goto fail_2;
-    }
-
-    for (pos = 0; pos < i; pos++) {
-        char *p, *k, *v;
-        size_t len;
-
-        key = PyList_GetItem(keys, pos);
-        val = PyList_GetItem(vals, pos);
-        if (!key || !val)
-            goto fail_2;
-
-        if (!PyArg_Parse(
-                    key,
-                    "s;spawnve() arg 3 contains a non-string key",
-                    &k) ||
-            !PyArg_Parse(
-                val,
-                "s;spawnve() arg 3 contains a non-string value",
-                &v))
-        {
-            goto fail_2;
-        }
-        len = PyString_Size(key) + PyString_Size(val) + 2;
-        p = PyMem_NEW(char, len);
-        if (p == NULL) {
-            PyErr_NoMemory();
-            goto fail_2;
-        }
-        PyOS_snprintf(p, len, "%s=%s", k, v);
-        envlist[envc++] = p;
-    }
-    envlist[envc] = 0;
-
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
-    Py_BEGIN_ALLOW_THREADS
-    spawnval = spawnve(mode, path, argvlist, envlist);
-    Py_END_ALLOW_THREADS
-#else
-    if (mode == _OLD_P_OVERLAY)
-        mode = _P_OVERLAY;
-
-    Py_BEGIN_ALLOW_THREADS
-    spawnval = _spawnve(mode, path, argvlist, envlist);
-    Py_END_ALLOW_THREADS
-#endif
-
-    if (spawnval == -1)
-        (void) posix_error();
-    else
-#if SIZEOF_LONG == SIZEOF_VOID_P
-        res = Py_BuildValue("l", (long) spawnval);
-#else
-        res = Py_BuildValue("L", (PY_LONG_LONG) spawnval);
-#endif
-
-  fail_2:
-    while (--envc >= 0)
-        PyMem_DEL(envlist[envc]);
-    PyMem_DEL(envlist);
-  fail_1:
-    free_string_array(argvlist, lastarg);
-    Py_XDECREF(vals);
-    Py_XDECREF(keys);
-  fail_0:
-    PyMem_Free(path);
-    return res;
-}
-
-/* OS/2 supports spawnvp & spawnvpe natively */
-#if defined(PYOS_OS2)
-PyDoc_STRVAR(posix_spawnvp__doc__,
-"spawnvp(mode, file, args)\n\n\
-Execute the program 'file' in a new process, using the environment\n\
-search path to find the file.\n\
-\n\
-    mode: mode of process creation\n\
-    file: executable file name\n\
-    args: tuple or list of strings");
-
-static PyObject *
-posix_spawnvp(PyObject *self, PyObject *args)
-{
-    char *path;
-    PyObject *argv;
-    char **argvlist;
-    int mode, i, argc;
-    Py_intptr_t spawnval;
-    PyObject *(*getitem)(PyObject *, Py_ssize_t);
-
-    /* spawnvp has three arguments: (mode, path, argv), where
-       argv is a list or tuple of strings. */
-
-    if (!PyArg_ParseTuple(args, "ietO:spawnvp", &mode,
-                          Py_FileSystemDefaultEncoding,
-                          &path, &argv))
-        return NULL;
-    if (PyList_Check(argv)) {
-        argc = PyList_Size(argv);
-        getitem = PyList_GetItem;
-    }
-    else if (PyTuple_Check(argv)) {
-        argc = PyTuple_Size(argv);
-        getitem = PyTuple_GetItem;
-    }
-    else {
-        PyErr_SetString(PyExc_TypeError,
-                        "spawnvp() arg 2 must be a tuple or list");
-        PyMem_Free(path);
-        return NULL;
-    }
-
-    argvlist = PyMem_NEW(char *, argc+1);
-    if (argvlist == NULL) {
-        PyMem_Free(path);
-        return PyErr_NoMemory();
-    }
-    for (i = 0; i < argc; i++) {
-        if (!PyArg_Parse((*getitem)(argv, i), "et",
-                         Py_FileSystemDefaultEncoding,
-                         &argvlist[i])) {
-            free_string_array(argvlist, i);
-            PyErr_SetString(
-                PyExc_TypeError,
-                "spawnvp() arg 2 must contain only strings");
-            PyMem_Free(path);
-            return NULL;
-        }
-    }
-    argvlist[argc] = NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-#if defined(PYCC_GCC)
-    spawnval = spawnvp(mode, path, argvlist);
-#else
-    spawnval = _spawnvp(mode, path, argvlist);
-#endif
-    Py_END_ALLOW_THREADS
-
-    free_string_array(argvlist, argc);
-    PyMem_Free(path);
-
-    if (spawnval == -1)
-        return posix_error();
-    else
-        return Py_BuildValue("l", (long) spawnval);
-}
-
-
-PyDoc_STRVAR(posix_spawnvpe__doc__,
-"spawnvpe(mode, file, args, env)\n\n\
-Execute the program 'file' in a new process, using the environment\n\
-search path to find the file.\n\
-\n\
-    mode: mode of process creation\n\
-    file: executable file name\n\
-    args: tuple or list of arguments\n\
-    env: dictionary of strings mapping to strings");
-
-static PyObject *
-posix_spawnvpe(PyObject *self, PyObject *args)
-{
-    char *path;
-    PyObject *argv, *env;
-    char **argvlist;
-    char **envlist;
-    PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL;
-    int mode, i, pos, argc, envc;
-    Py_intptr_t spawnval;
-    PyObject *(*getitem)(PyObject *, Py_ssize_t);
-    int lastarg = 0;
-
-    /* spawnvpe has four arguments: (mode, path, argv, env), where
-       argv is a list or tuple of strings and env is a dictionary
-       like posix.environ. */
-
-    if (!PyArg_ParseTuple(args, "ietOO:spawnvpe", &mode,
-                          Py_FileSystemDefaultEncoding,
-                          &path, &argv, &env))
-        return NULL;
-    if (PyList_Check(argv)) {
-        argc = PyList_Size(argv);
-        getitem = PyList_GetItem;
-    }
-    else if (PyTuple_Check(argv)) {
-        argc = PyTuple_Size(argv);
-        getitem = PyTuple_GetItem;
-    }
-    else {
-        PyErr_SetString(PyExc_TypeError,
-                        "spawnvpe() arg 2 must be a tuple or list");
-        goto fail_0;
-    }
-    if (!PyMapping_Check(env)) {
-        PyErr_SetString(PyExc_TypeError,
-                        "spawnvpe() arg 3 must be a mapping object");
-        goto fail_0;
-    }
-
-    argvlist = PyMem_NEW(char *, argc+1);
-    if (argvlist == NULL) {
-        PyErr_NoMemory();
-        goto fail_0;
-    }
-    for (i = 0; i < argc; i++) {
-        if (!PyArg_Parse((*getitem)(argv, i),
-                     "et;spawnvpe() arg 2 must contain only strings",
-                         Py_FileSystemDefaultEncoding,
-                         &argvlist[i]))
-        {
-            lastarg = i;
-            goto fail_1;
-        }
-    }
-    lastarg = argc;
-    argvlist[argc] = NULL;
-
-    i = PyMapping_Size(env);
-    if (i < 0)
-        goto fail_1;
-    envlist = PyMem_NEW(char *, i + 1);
-    if (envlist == NULL) {
-        PyErr_NoMemory();
-        goto fail_1;
-    }
-    envc = 0;
-    keys = PyMapping_Keys(env);
-    vals = PyMapping_Values(env);
-    if (!keys || !vals)
-        goto fail_2;
-    if (!PyList_Check(keys) || !PyList_Check(vals)) {
-        PyErr_SetString(PyExc_TypeError,
-                        "spawnvpe(): env.keys() or env.values() is not a list");
-        goto fail_2;
-    }
-
-    for (pos = 0; pos < i; pos++) {
-        char *p, *k, *v;
-        size_t len;
-
-        key = PyList_GetItem(keys, pos);
-        val = PyList_GetItem(vals, pos);
-        if (!key || !val)
-            goto fail_2;
-
-        if (!PyArg_Parse(
-                    key,
-                    "s;spawnvpe() arg 3 contains a non-string key",
-                    &k) ||
-            !PyArg_Parse(
-                val,
-                "s;spawnvpe() arg 3 contains a non-string value",
-                &v))
-        {
-            goto fail_2;
-        }
-        len = PyString_Size(key) + PyString_Size(val) + 2;
-        p = PyMem_NEW(char, len);
-        if (p == NULL) {
-            PyErr_NoMemory();
-            goto fail_2;
-        }
-        PyOS_snprintf(p, len, "%s=%s", k, v);
-        envlist[envc++] = p;
-    }
-    envlist[envc] = 0;
-
-    Py_BEGIN_ALLOW_THREADS
-#if defined(PYCC_GCC)
-    spawnval = spawnvpe(mode, path, argvlist, envlist);
-#else
-    spawnval = _spawnvpe(mode, path, argvlist, envlist);
-#endif
-    Py_END_ALLOW_THREADS
-
-    if (spawnval == -1)
-        (void) posix_error();
-    else
-        res = Py_BuildValue("l", (long) spawnval);
-
-  fail_2:
-    while (--envc >= 0)
-        PyMem_DEL(envlist[envc]);
-    PyMem_DEL(envlist);
-  fail_1:
-    free_string_array(argvlist, lastarg);
-    Py_XDECREF(vals);
-    Py_XDECREF(keys);
-  fail_0:
-    PyMem_Free(path);
-    return res;
-}
-#endif /* PYOS_OS2 */
-#endif /* HAVE_SPAWNV */
-
-
-#ifdef HAVE_FORK1
-PyDoc_STRVAR(posix_fork1__doc__,
-"fork1() -> pid\n\n\
-Fork a child process with a single multiplexed (i.e., not bound) thread.\n\
-\n\
-Return 0 to child process and PID of child to parent process.");
-
-static PyObject *
-posix_fork1(PyObject *self, PyObject *noargs)
-{
-    pid_t pid;
-    int result = 0;
-    _PyImport_AcquireLock();
-    pid = fork1();
-    if (pid == 0) {
-        /* child: this clobbers and resets the import lock. */
-        PyOS_AfterFork();
-    } else {
-        /* parent: release the import lock. */
-        result = _PyImport_ReleaseLock();
-    }
-    if (pid == -1)
-        return posix_error();
-    if (result < 0) {
-        /* Don't clobber the OSError if the fork failed. */
-        PyErr_SetString(PyExc_RuntimeError,
-                        "not holding the import lock");
-        return NULL;
-    }
-    return PyLong_FromPid(pid);
-}
-#endif
-
-
-#ifdef HAVE_FORK
-PyDoc_STRVAR(posix_fork__doc__,
-"fork() -> pid\n\n\
-Fork a child process.\n\
-Return 0 to child process and PID of child to parent process.");
-
-static PyObject *
-posix_fork(PyObject *self, PyObject *noargs)
-{
-    pid_t pid;
-    int result = 0;
-    _PyImport_AcquireLock();
-    pid = fork();
-    if (pid == 0) {
-        /* child: this clobbers and resets the import lock. */
-        PyOS_AfterFork();
-    } else {
-        /* parent: release the import lock. */
-        result = _PyImport_ReleaseLock();
-    }
-    if (pid == -1)
-        return posix_error();
-    if (result < 0) {
-        /* Don't clobber the OSError if the fork failed. */
-        PyErr_SetString(PyExc_RuntimeError,
-                        "not holding the import lock");
-        return NULL;
-    }
-    return PyLong_FromPid(pid);
-}
-#endif
-
-/* AIX uses /dev/ptc but is otherwise the same as /dev/ptmx */
-/* IRIX has both /dev/ptc and /dev/ptmx, use ptmx */
-#if defined(HAVE_DEV_PTC) && !defined(HAVE_DEV_PTMX)
-#define DEV_PTY_FILE "/dev/ptc"
-#define HAVE_DEV_PTMX
-#else
-#define DEV_PTY_FILE "/dev/ptmx"
-#endif
-
-#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX)
-#ifdef HAVE_PTY_H
-#include <pty.h>
-#else
-#ifdef HAVE_LIBUTIL_H
-#include <libutil.h>
-#else
-#ifdef HAVE_UTIL_H
-#include <util.h>
-#endif /* HAVE_UTIL_H */
-#endif /* HAVE_LIBUTIL_H */
-#endif /* HAVE_PTY_H */
-#ifdef HAVE_STROPTS_H
-#include <stropts.h>
-#endif
-#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX */
-
-#if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX)
-PyDoc_STRVAR(posix_openpty__doc__,
-"openpty() -> (master_fd, slave_fd)\n\n\
-Open a pseudo-terminal, returning open fd's for both master and slave end.\n");
-
-static PyObject *
-posix_openpty(PyObject *self, PyObject *noargs)
-{
-    int master_fd, slave_fd;
-#ifndef HAVE_OPENPTY
-    char * slave_name;
-#endif
-#if defined(HAVE_DEV_PTMX) && !defined(HAVE_OPENPTY) && !defined(HAVE__GETPTY)
-    PyOS_sighandler_t sig_saved;
-#ifdef sun
-    extern char *ptsname(int fildes);
-#endif
-#endif
-
-#ifdef HAVE_OPENPTY
-    if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) != 0)
-        return posix_error();
-#elif defined(HAVE__GETPTY)
-    slave_name = _getpty(&master_fd, O_RDWR, 0666, 0);
-    if (slave_name == NULL)
-        return posix_error();
-
-    slave_fd = open(slave_name, O_RDWR);
-    if (slave_fd < 0)
-        return posix_error();
-#else
-    master_fd = open(DEV_PTY_FILE, O_RDWR | O_NOCTTY); /* open master */
-    if (master_fd < 0)
-        return posix_error();
-    sig_saved = PyOS_setsig(SIGCHLD, SIG_DFL);
-    /* change permission of slave */
-    if (grantpt(master_fd) < 0) {
-        PyOS_setsig(SIGCHLD, sig_saved);
-        return posix_error();
-    }
-    /* unlock slave */
-    if (unlockpt(master_fd) < 0) {
-        PyOS_setsig(SIGCHLD, sig_saved);
-        return posix_error();
-    }
-    PyOS_setsig(SIGCHLD, sig_saved);
-    slave_name = ptsname(master_fd); /* get name of slave */
-    if (slave_name == NULL)
-        return posix_error();
-    slave_fd = open(slave_name, O_RDWR | O_NOCTTY); /* open slave */
-    if (slave_fd < 0)
-        return posix_error();
-#endif /* HAVE_OPENPTY */
-
-    return Py_BuildValue("(ii)", master_fd, slave_fd);
-
-}
-#endif /* defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) */
-
-#ifdef HAVE_FORKPTY
-PyDoc_STRVAR(posix_forkpty__doc__,
-"forkpty() -> (pid, master_fd)\n\n\
-Fork a new process with a new pseudo-terminal as controlling tty.\n\n\
-Like fork(), return 0 as pid to child process, and PID of child to parent.\n\
-To both, return fd of newly opened pseudo-terminal.\n");
-
-static PyObject *
-posix_forkpty(PyObject *self, PyObject *noargs)
-{
-    int master_fd = -1, result = 0;
-    pid_t pid;
-
-    _PyImport_AcquireLock();
-    pid = forkpty(&master_fd, NULL, NULL, NULL);
-    if (pid == 0) {
-        /* child: this clobbers and resets the import lock. */
-        PyOS_AfterFork();
-    } else {
-        /* parent: release the import lock. */
-        result = _PyImport_ReleaseLock();
-    }
-    if (pid == -1)
-        return posix_error();
-    if (result < 0) {
-        /* Don't clobber the OSError if the fork failed. */
-        PyErr_SetString(PyExc_RuntimeError,
-                        "not holding the import lock");
-        return NULL;
-    }
-    return Py_BuildValue("(Ni)", PyLong_FromPid(pid), master_fd);
-}
-#endif
-
-#ifdef HAVE_GETEGID
-PyDoc_STRVAR(posix_getegid__doc__,
-"getegid() -> egid\n\n\
-Return the current process's effective group id.");
-
-static PyObject *
-posix_getegid(PyObject *self, PyObject *noargs)
-{
-    return PyInt_FromLong((long)getegid());
-}
-#endif
-
-
-#ifdef HAVE_GETEUID
-PyDoc_STRVAR(posix_geteuid__doc__,
-"geteuid() -> euid\n\n\
-Return the current process's effective user id.");
-
-static PyObject *
-posix_geteuid(PyObject *self, PyObject *noargs)
-{
-    return PyInt_FromLong((long)geteuid());
-}
-#endif
-
-
-#ifdef HAVE_GETGID
-PyDoc_STRVAR(posix_getgid__doc__,
-"getgid() -> gid\n\n\
-Return the current process's group id.");
-
-static PyObject *
-posix_getgid(PyObject *self, PyObject *noargs)
-{
-    return PyInt_FromLong((long)getgid());
-}
-#endif
-
-
-PyDoc_STRVAR(posix_getpid__doc__,
-"getpid() -> pid\n\n\
-Return the current process id");
-
-static PyObject *
-posix_getpid(PyObject *self, PyObject *noargs)
-{
-    return PyLong_FromPid(getpid());
-}
-
-
-#ifdef HAVE_GETGROUPS
-PyDoc_STRVAR(posix_getgroups__doc__,
-"getgroups() -> list of group IDs\n\n\
-Return list of supplemental group IDs for the process.");
-
-static PyObject *
-posix_getgroups(PyObject *self, PyObject *noargs)
-{
-    PyObject *result = NULL;
-
-#ifdef NGROUPS_MAX
-#define MAX_GROUPS NGROUPS_MAX
-#else
-    /* defined to be 16 on Solaris7, so this should be a small number */
-#define MAX_GROUPS 64
-#endif
-    gid_t grouplist[MAX_GROUPS];
-
-    /* On MacOSX getgroups(2) can return more than MAX_GROUPS results 
-     * This is a helper variable to store the intermediate result when
-     * that happens.
-     *
-     * To keep the code readable the OSX behaviour is unconditional,
-     * according to the POSIX spec this should be safe on all unix-y
-     * systems.
-     */
-    gid_t* alt_grouplist = grouplist;
-    int n;
-
-    n = getgroups(MAX_GROUPS, grouplist);
-    if (n < 0) {
-        if (errno == EINVAL) {
-            n = getgroups(0, NULL);
-            if (n == -1) {
-                return posix_error();
-            }
-            if (n == 0) {
-                /* Avoid malloc(0) */
-                alt_grouplist = grouplist;
-            } else {
-                alt_grouplist = PyMem_Malloc(n * sizeof(gid_t));
-                if (alt_grouplist == NULL) {
-                    errno = EINVAL;
-                    return posix_error();
-                }
-                n = getgroups(n, alt_grouplist);
-                if (n == -1) {
-                    PyMem_Free(alt_grouplist);
-                    return posix_error();
-                }
-            }
-        } else {
-            return posix_error();
-        }
-    }
-    result = PyList_New(n);
-    if (result != NULL) {
-        int i;
-        for (i = 0; i < n; ++i) {
-            PyObject *o = PyInt_FromLong((long)alt_grouplist[i]);
-            if (o == NULL) {
-                Py_DECREF(result);
-                result = NULL;
-                break;
-            }
-            PyList_SET_ITEM(result, i, o);
-        }
-    }
-
-    if (alt_grouplist != grouplist) {
-        PyMem_Free(alt_grouplist);
-    }
-
-    return result;
-}
-#endif
-
-#ifdef HAVE_INITGROUPS
-PyDoc_STRVAR(posix_initgroups__doc__,
-"initgroups(username, gid) -> None\n\n\
-Call the system initgroups() to initialize the group access list with all of\n\
-the groups of which the specified username is a member, plus the specified\n\
-group id.");
-
-static PyObject *
-posix_initgroups(PyObject *self, PyObject *args)
-{
-    char *username;
-    long gid;
-
-    if (!PyArg_ParseTuple(args, "sl:initgroups", &username, &gid))
-        return NULL;
-
-    if (initgroups(username, (gid_t) gid) == -1)
-        return PyErr_SetFromErrno(PyExc_OSError);
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif
-
-#ifdef HAVE_GETPGID
-PyDoc_STRVAR(posix_getpgid__doc__,
-"getpgid(pid) -> pgid\n\n\
-Call the system call getpgid().");
-
-static PyObject *
-posix_getpgid(PyObject *self, PyObject *args)
-{
-    pid_t pid, pgid;
-    if (!PyArg_ParseTuple(args, PARSE_PID ":getpgid", &pid))
-        return NULL;
-    pgid = getpgid(pid);
-    if (pgid < 0)
-        return posix_error();
-    return PyLong_FromPid(pgid);
-}
-#endif /* HAVE_GETPGID */
-
-
-#ifdef HAVE_GETPGRP
-PyDoc_STRVAR(posix_getpgrp__doc__,
-"getpgrp() -> pgrp\n\n\
-Return the current process group id.");
-
-static PyObject *
-posix_getpgrp(PyObject *self, PyObject *noargs)
-{
-#ifdef GETPGRP_HAVE_ARG
-    return PyLong_FromPid(getpgrp(0));
-#else /* GETPGRP_HAVE_ARG */
-    return PyLong_FromPid(getpgrp());
-#endif /* GETPGRP_HAVE_ARG */
-}
-#endif /* HAVE_GETPGRP */
-
-
-#ifdef HAVE_SETPGRP
-PyDoc_STRVAR(posix_setpgrp__doc__,
-"setpgrp()\n\n\
-Make this process the process group leader.");
-
-static PyObject *
-posix_setpgrp(PyObject *self, PyObject *noargs)
-{
-#ifdef SETPGRP_HAVE_ARG
-    if (setpgrp(0, 0) < 0)
-#else /* SETPGRP_HAVE_ARG */
-    if (setpgrp() < 0)
-#endif /* SETPGRP_HAVE_ARG */
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-#endif /* HAVE_SETPGRP */
-
-#ifdef HAVE_GETPPID
-PyDoc_STRVAR(posix_getppid__doc__,
-"getppid() -> ppid\n\n\
-Return the parent's process id.");
-
-static PyObject *
-posix_getppid(PyObject *self, PyObject *noargs)
-{
-    return PyLong_FromPid(getppid());
-}
-#endif
-
-
-#ifdef HAVE_GETLOGIN
-PyDoc_STRVAR(posix_getlogin__doc__,
-"getlogin() -> string\n\n\
-Return the actual login name.");
-
-static PyObject *
-posix_getlogin(PyObject *self, PyObject *noargs)
-{
-    PyObject *result = NULL;
-    char *name;
-    int old_errno = errno;
-
-    errno = 0;
-    name = getlogin();
-    if (name == NULL) {
-        if (errno)
-        posix_error();
-        else
-        PyErr_SetString(PyExc_OSError,
-                        "unable to determine login name");
-    }
-    else
-        result = PyString_FromString(name);
-    errno = old_errno;
-
-    return result;
-}
-#endif
-
-#ifdef HAVE_GETUID
-PyDoc_STRVAR(posix_getuid__doc__,
-"getuid() -> uid\n\n\
-Return the current process's user id.");
-
-static PyObject *
-posix_getuid(PyObject *self, PyObject *noargs)
-{
-    return PyInt_FromLong((long)getuid());
-}
-#endif
-
-
-#ifdef HAVE_KILL
-PyDoc_STRVAR(posix_kill__doc__,
-"kill(pid, sig)\n\n\
-Kill a process with a signal.");
-
-static PyObject *
-posix_kill(PyObject *self, PyObject *args)
-{
-    pid_t pid;
-    int sig;
-    if (!PyArg_ParseTuple(args, PARSE_PID "i:kill", &pid, &sig))
-        return NULL;
-#if defined(PYOS_OS2) && !defined(PYCC_GCC)
-    if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
-        APIRET rc;
-        if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR)
-            return os2_error(rc);
-
-    } else if (sig == XCPT_SIGNAL_KILLPROC) {
-        APIRET rc;
-        if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR)
-            return os2_error(rc);
-
-    } else
-        return NULL; /* Unrecognized Signal Requested */
-#else
-    if (kill(pid, sig) == -1)
-        return posix_error();
-#endif
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif
-
-#ifdef HAVE_KILLPG
-PyDoc_STRVAR(posix_killpg__doc__,
-"killpg(pgid, sig)\n\n\
-Kill a process group with a signal.");
-
-static PyObject *
-posix_killpg(PyObject *self, PyObject *args)
-{
-    int sig;
-    pid_t pgid;
-    /* XXX some man pages make the `pgid` parameter an int, others
-       a pid_t. Since getpgrp() returns a pid_t, we assume killpg should
-       take the same type. Moreover, pid_t is always at least as wide as
-       int (else compilation of this module fails), which is safe. */
-    if (!PyArg_ParseTuple(args, PARSE_PID "i:killpg", &pgid, &sig))
-        return NULL;
-    if (killpg(pgid, sig) == -1)
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif
-
-#ifdef MS_WINDOWS
-PyDoc_STRVAR(win32_kill__doc__,
-"kill(pid, sig)\n\n\
-Kill a process with a signal.");
-
-static PyObject *
-win32_kill(PyObject *self, PyObject *args)
-{
-    PyObject *result;
-    DWORD pid, sig, err;
-    HANDLE handle;
-
-    if (!PyArg_ParseTuple(args, "kk:kill", &pid, &sig))
-        return NULL;
-
-    /* Console processes which share a common console can be sent CTRL+C or
-       CTRL+BREAK events, provided they handle said events. */
-    if (sig == CTRL_C_EVENT || sig == CTRL_BREAK_EVENT) {
-        if (GenerateConsoleCtrlEvent(sig, pid) == 0) {
-            err = GetLastError();
-            return PyErr_SetFromWindowsErr(err);
-        }
-        else
-            Py_RETURN_NONE;
-    }
-
-    /* If the signal is outside of what GenerateConsoleCtrlEvent can use,
-       attempt to open and terminate the process. */
-    handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
-    if (handle == NULL) {
-        err = GetLastError();
-        return PyErr_SetFromWindowsErr(err);
-    }
-
-    if (TerminateProcess(handle, sig) == 0) {
-        err = GetLastError();
-        result = PyErr_SetFromWindowsErr(err);
-    } else {
-        Py_INCREF(Py_None);
-        result = Py_None;
-    }
-
-    CloseHandle(handle);
-    return result;
-}
-#endif /* MS_WINDOWS */
-
-#ifdef HAVE_PLOCK
-
-#ifdef HAVE_SYS_LOCK_H
-#include <sys/lock.h>
-#endif
-
-PyDoc_STRVAR(posix_plock__doc__,
-"plock(op)\n\n\
-Lock program segments into memory.");
-
-static PyObject *
-posix_plock(PyObject *self, PyObject *args)
-{
-    int op;
-    if (!PyArg_ParseTuple(args, "i:plock", &op))
-        return NULL;
-    if (plock(op) == -1)
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif
-
-
-#ifdef HAVE_POPEN
-PyDoc_STRVAR(posix_popen__doc__,
-"popen(command [, mode='r' [, bufsize]]) -> pipe\n\n\
-Open a pipe to/from a command returning a file object.");
-
-#if defined(PYOS_OS2)
-#if defined(PYCC_VACPP)
-static int
-async_system(const char *command)
-{
-    char errormsg[256], args[1024];
-    RESULTCODES rcodes;
-    APIRET rc;
-
-    char *shell = getenv("COMSPEC");
-    if (!shell)
-        shell = "cmd";
-
-    /* avoid overflowing the argument buffer */
-    if (strlen(shell) + 3 + strlen(command) >= 1024)
-        return ERROR_NOT_ENOUGH_MEMORY
-
-    args[0] = '\0';
-    strcat(args, shell);
-    strcat(args, "/c ");
-    strcat(args, command);
-
-    /* execute asynchronously, inheriting the environment */
-    rc = DosExecPgm(errormsg,
-                    sizeof(errormsg),
-                    EXEC_ASYNC,
-                    args,
-                    NULL,
-                    &rcodes,
-                    shell);
-    return rc;
-}
-
-static FILE *
-popen(const char *command, const char *mode, int pipesize, int *err)
-{
-    int oldfd, tgtfd;
-    HFILE pipeh[2];
-    APIRET rc;
-
-    /* mode determines which of stdin or stdout is reconnected to
-     * the pipe to the child
-     */
-    if (strchr(mode, 'r') != NULL) {
-        tgt_fd = 1;             /* stdout */
-    } else if (strchr(mode, 'w')) {
-        tgt_fd = 0;             /* stdin */
-    } else {
-        *err = ERROR_INVALID_ACCESS;
-        return NULL;
-    }
-
-    /* setup the pipe */
-    if ((rc = DosCreatePipe(&pipeh[0], &pipeh[1], pipesize)) != NO_ERROR) {
-        *err = rc;
-        return NULL;
-    }
-
-    /* prevent other threads accessing stdio */
-    DosEnterCritSec();
-
-    /* reconnect stdio and execute child */
-    oldfd = dup(tgtfd);
-    close(tgtfd);
-    if (dup2(pipeh[tgtfd], tgtfd) == 0) {
-        DosClose(pipeh[tgtfd]);
-        rc = async_system(command);
-    }
-
-    /* restore stdio */
-    dup2(oldfd, tgtfd);
-    close(oldfd);
-
-    /* allow other threads access to stdio */
-    DosExitCritSec();
-
-    /* if execution of child was successful return file stream */
-    if (rc == NO_ERROR)
-        return fdopen(pipeh[1 - tgtfd], mode);
-    else {
-        DosClose(pipeh[1 - tgtfd]);
-        *err = rc;
-        return NULL;
-    }
-}
-
-static PyObject *
-posix_popen(PyObject *self, PyObject *args)
-{
-    char *name;
-    char *mode = "r";
-    int   err, bufsize = -1;
-    FILE *fp;
-    PyObject *f;
-    if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    fp = popen(name, mode, (bufsize > 0) ? bufsize : 4096, &err);
-    Py_END_ALLOW_THREADS
-    if (fp == NULL)
-        return os2_error(err);
-
-    f = PyFile_FromFile(fp, name, mode, fclose);
-    if (f != NULL)
-        PyFile_SetBufSize(f, bufsize);
-    return f;
-}
-
-#elif defined(PYCC_GCC)
-
-/* standard posix version of popen() support */
-static PyObject *
-posix_popen(PyObject *self, PyObject *args)
-{
-    char *name;
-    char *mode = "r";
-    int bufsize = -1;
-    FILE *fp;
-    PyObject *f;
-    if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    fp = popen(name, mode);
-    Py_END_ALLOW_THREADS
-    if (fp == NULL)
-        return posix_error();
-    f = PyFile_FromFile(fp, name, mode, pclose);
-    if (f != NULL)
-        PyFile_SetBufSize(f, bufsize);
-    return f;
-}
-
-/* fork() under OS/2 has lots'o'warts
- * EMX supports pipe() and spawn*() so we can synthesize popen[234]()
- * most of this code is a ripoff of the win32 code, but using the
- * capabilities of EMX's C library routines
- */
-
-/* These tell _PyPopen() whether to return 1, 2, or 3 file objects. */
-#define POPEN_1 1
-#define POPEN_2 2
-#define POPEN_3 3
-#define POPEN_4 4
-
-static PyObject *_PyPopen(char *, int, int, int);
-static int _PyPclose(FILE *file);
-
-/*
- * Internal dictionary mapping popen* file pointers to process handles,
- * for use when retrieving the process exit code.  See _PyPclose() below
- * for more information on this dictionary's use.
- */
-static PyObject *_PyPopenProcs = NULL;
-
-/* os2emx version of popen2()
- *
- * The result of this function is a pipe (file) connected to the
- * process's stdin, and a pipe connected to the process's stdout.
- */
-
-static PyObject *
-os2emx_popen2(PyObject *self, PyObject  *args)
-{
-    PyObject *f;
-    int tm=0;
-
-    char *cmdstring;
-    char *mode = "t";
-    int bufsize = -1;
-    if (!PyArg_ParseTuple(args, "s|si:popen2", &cmdstring, &mode, &bufsize))
-        return NULL;
-
-    if (*mode == 't')
-        tm = O_TEXT;
-    else if (*mode != 'b') {
-        PyErr_SetString(PyExc_ValueError, "mode must be 't' or 'b'");
-        return NULL;
-    } else
-        tm = O_BINARY;
-
-    f = _PyPopen(cmdstring, tm, POPEN_2, bufsize);
-
-    return f;
-}
-
-/*
- * Variation on os2emx.popen2
- *
- * The result of this function is 3 pipes - the process's stdin,
- * stdout and stderr
- */
-
-static PyObject *
-os2emx_popen3(PyObject *self, PyObject *args)
-{
-    PyObject *f;
-    int tm = 0;
-
-    char *cmdstring;
-    char *mode = "t";
-    int bufsize = -1;
-    if (!PyArg_ParseTuple(args, "s|si:popen3", &cmdstring, &mode, &bufsize))
-        return NULL;
-
-    if (*mode == 't')
-        tm = O_TEXT;
-    else if (*mode != 'b') {
-        PyErr_SetString(PyExc_ValueError, "mode must be 't' or 'b'");
-        return NULL;
-    } else
-        tm = O_BINARY;
-
-    f = _PyPopen(cmdstring, tm, POPEN_3, bufsize);
-
-    return f;
-}
-
-/*
- * Variation on os2emx.popen2
- *
- * The result of this function is 2 pipes - the processes stdin,
- * and stdout+stderr combined as a single pipe.
- */
-
-static PyObject *
-os2emx_popen4(PyObject *self, PyObject  *args)
-{
-    PyObject *f;
-    int tm = 0;
-
-    char *cmdstring;
-    char *mode = "t";
-    int bufsize = -1;
-    if (!PyArg_ParseTuple(args, "s|si:popen4", &cmdstring, &mode, &bufsize))
-        return NULL;
-
-    if (*mode == 't')
-        tm = O_TEXT;
-    else if (*mode != 'b') {
-        PyErr_SetString(PyExc_ValueError, "mode must be 't' or 'b'");
-        return NULL;
-    } else
-        tm = O_BINARY;
-
-    f = _PyPopen(cmdstring, tm, POPEN_4, bufsize);
-
-    return f;
-}
-
-/* a couple of structures for convenient handling of multiple
- * file handles and pipes
- */
-struct file_ref
-{
-    int handle;
-    int flags;
-};
-
-struct pipe_ref
-{
-    int rd;
-    int wr;
-};
-
-/* The following code is derived from the win32 code */
-
-static PyObject *
-_PyPopen(char *cmdstring, int mode, int n, int bufsize)
-{
-    struct file_ref stdio[3];
-    struct pipe_ref p_fd[3];
-    FILE *p_s[3];
-    int file_count, i, pipe_err;
-    pid_t pipe_pid;
-    char *shell, *sh_name, *opt, *rd_mode, *wr_mode;
-    PyObject *f, *p_f[3];
-
-    /* file modes for subsequent fdopen's on pipe handles */
-    if (mode == O_TEXT)
-    {
-        rd_mode = "rt";
-        wr_mode = "wt";
-    }
-    else
-    {
-        rd_mode = "rb";
-        wr_mode = "wb";
-    }
-
-    /* prepare shell references */
-    if ((shell = getenv("EMXSHELL")) == NULL)
-        if ((shell = getenv("COMSPEC")) == NULL)
-        {
-            errno = ENOENT;
-            return posix_error();
-        }
-
-    sh_name = _getname(shell);
-    if (stricmp(sh_name, "cmd.exe") == 0 || stricmp(sh_name, "4os2.exe") == 0)
-        opt = "/c";
-    else
-        opt = "-c";
-
-    /* save current stdio fds + their flags, and set not inheritable */
-    i = pipe_err = 0;
-    while (pipe_err >= 0 && i < 3)
-    {
-        pipe_err = stdio[i].handle = dup(i);
-        stdio[i].flags = fcntl(i, F_GETFD, 0);
-        fcntl(stdio[i].handle, F_SETFD, stdio[i].flags | FD_CLOEXEC);
-        i++;
-    }
-    if (pipe_err < 0)
-    {
-        /* didn't get them all saved - clean up and bail out */
-        int saved_err = errno;
-        while (i-- > 0)
-        {
-            close(stdio[i].handle);
-        }
-        errno = saved_err;
-        return posix_error();
-    }
-
-    /* create pipe ends */
-    file_count = 2;
-    if (n == POPEN_3)
-        file_count = 3;
-    i = pipe_err = 0;
-    while ((pipe_err == 0) && (i < file_count))
-        pipe_err = pipe((int *)&p_fd[i++]);
-    if (pipe_err < 0)
-    {
-        /* didn't get them all made - clean up and bail out */
-        while (i-- > 0)
-        {
-            close(p_fd[i].wr);
-            close(p_fd[i].rd);
-        }
-        errno = EPIPE;
-        return posix_error();
-    }
-
-    /* change the actual standard IO streams over temporarily,
-     * making the retained pipe ends non-inheritable
-     */
-    pipe_err = 0;
-
-    /* - stdin */
-    if (dup2(p_fd[0].rd, 0) == 0)
-    {
-        close(p_fd[0].rd);
-        i = fcntl(p_fd[0].wr, F_GETFD, 0);
-        fcntl(p_fd[0].wr, F_SETFD, i | FD_CLOEXEC);
-        if ((p_s[0] = fdopen(p_fd[0].wr, wr_mode)) == NULL)
-        {
-            close(p_fd[0].wr);
-            pipe_err = -1;
-        }
-    }
-    else
-    {
-        pipe_err = -1;
-    }
-
-    /* - stdout */
-    if (pipe_err == 0)
-    {
-        if (dup2(p_fd[1].wr, 1) == 1)
-        {
-            close(p_fd[1].wr);
-            i = fcntl(p_fd[1].rd, F_GETFD, 0);
-            fcntl(p_fd[1].rd, F_SETFD, i | FD_CLOEXEC);
-            if ((p_s[1] = fdopen(p_fd[1].rd, rd_mode)) == NULL)
-            {
-                close(p_fd[1].rd);
-                pipe_err = -1;
-            }
-        }
-        else
-        {
-            pipe_err = -1;
-        }
-    }
-
-    /* - stderr, as required */
-    if (pipe_err == 0)
-        switch (n)
-        {
-            case POPEN_3:
-            {
-                if (dup2(p_fd[2].wr, 2) == 2)
-                {
-                    close(p_fd[2].wr);
-                    i = fcntl(p_fd[2].rd, F_GETFD, 0);
-                    fcntl(p_fd[2].rd, F_SETFD, i | FD_CLOEXEC);
-                    if ((p_s[2] = fdopen(p_fd[2].rd, rd_mode)) == NULL)
-                    {
-                        close(p_fd[2].rd);
-                        pipe_err = -1;
-                    }
-                }
-                else
-                {
-                    pipe_err = -1;
-                }
-                break;
-            }
-
-            case POPEN_4:
-            {
-                if (dup2(1, 2) != 2)
-                {
-                    pipe_err = -1;
-                }
-                break;
-            }
-        }
-
-    /* spawn the child process */
-    if (pipe_err == 0)
-    {
-        pipe_pid = spawnlp(P_NOWAIT, shell, shell, opt, cmdstring, (char *)0);
-        if (pipe_pid == -1)
-        {
-            pipe_err = -1;
-        }
-        else
-        {
-            /* save the PID into the FILE structure
-             * NOTE: this implementation doesn't actually
-             * take advantage of this, but do it for
-             * completeness - AIM Apr01
-             */
-            for (i = 0; i < file_count; i++)
-                p_s[i]->_pid = pipe_pid;
-        }
-    }
-
-    /* reset standard IO to normal */
-    for (i = 0; i < 3; i++)
-    {
-        dup2(stdio[i].handle, i);
-        fcntl(i, F_SETFD, stdio[i].flags);
-        close(stdio[i].handle);
-    }
-
-    /* if any remnant problems, clean up and bail out */
-    if (pipe_err < 0)
-    {
-        for (i = 0; i < 3; i++)
-        {
-            close(p_fd[i].rd);
-            close(p_fd[i].wr);
-        }
-        errno = EPIPE;
-        return posix_error_with_filename(cmdstring);
-    }
-
-    /* build tuple of file objects to return */
-    if ((p_f[0] = PyFile_FromFile(p_s[0], cmdstring, wr_mode, _PyPclose)) != NULL)
-        PyFile_SetBufSize(p_f[0], bufsize);
-    if ((p_f[1] = PyFile_FromFile(p_s[1], cmdstring, rd_mode, _PyPclose)) != NULL)
-        PyFile_SetBufSize(p_f[1], bufsize);
-    if (n == POPEN_3)
-    {
-        if ((p_f[2] = PyFile_FromFile(p_s[2], cmdstring, rd_mode, _PyPclose)) != NULL)
-            PyFile_SetBufSize(p_f[0], bufsize);
-        f = PyTuple_Pack(3, p_f[0], p_f[1], p_f[2]);
-    }
-    else
-        f = PyTuple_Pack(2, p_f[0], p_f[1]);
-
-    /*
-     * Insert the files we've created into the process dictionary
-     * all referencing the list with the process handle and the
-     * initial number of files (see description below in _PyPclose).
-     * Since if _PyPclose later tried to wait on a process when all
-     * handles weren't closed, it could create a deadlock with the
-     * child, we spend some energy here to try to ensure that we
-     * either insert all file handles into the dictionary or none
-     * at all.  It's a little clumsy with the various popen modes
-     * and variable number of files involved.
-     */
-    if (!_PyPopenProcs)
-    {
-        _PyPopenProcs = PyDict_New();
-    }
-
-    if (_PyPopenProcs)
-    {
-        PyObject *procObj, *pidObj, *intObj, *fileObj[3];
-        int ins_rc[3];
-
-        fileObj[0] = fileObj[1] = fileObj[2] = NULL;
-        ins_rc[0]  = ins_rc[1]  = ins_rc[2]  = 0;
-
-        procObj = PyList_New(2);
-        pidObj = PyLong_FromPid(pipe_pid);
-        intObj = PyInt_FromLong((long) file_count);
-
-        if (procObj && pidObj && intObj)
-        {
-            PyList_SetItem(procObj, 0, pidObj);
-            PyList_SetItem(procObj, 1, intObj);
-
-            fileObj[0] = PyLong_FromVoidPtr(p_s[0]);
-            if (fileObj[0])
-            {
-                ins_rc[0] = PyDict_SetItem(_PyPopenProcs,
-                                           fileObj[0],
-                                           procObj);
-            }
-            fileObj[1] = PyLong_FromVoidPtr(p_s[1]);
-            if (fileObj[1])
-            {
-                ins_rc[1] = PyDict_SetItem(_PyPopenProcs,
-                                           fileObj[1],
-                                           procObj);
-            }
-            if (file_count >= 3)
-            {
-                fileObj[2] = PyLong_FromVoidPtr(p_s[2]);
-                if (fileObj[2])
-                {
-                    ins_rc[2] = PyDict_SetItem(_PyPopenProcs,
-                                               fileObj[2],
-                                               procObj);
-                }
-            }
-
-            if (ins_rc[0] < 0 || !fileObj[0] ||
-                ins_rc[1] < 0 || (file_count > 1 && !fileObj[1]) ||
-                ins_rc[2] < 0 || (file_count > 2 && !fileObj[2]))
-            {
-                /* Something failed - remove any dictionary
-                 * entries that did make it.
-                 */
-                if (!ins_rc[0] && fileObj[0])
-                {
-                    PyDict_DelItem(_PyPopenProcs,
-                                   fileObj[0]);
-                }
-                if (!ins_rc[1] && fileObj[1])
-                {
-                    PyDict_DelItem(_PyPopenProcs,
-                                   fileObj[1]);
-                }
-                if (!ins_rc[2] && fileObj[2])
-                {
-                    PyDict_DelItem(_PyPopenProcs,
-                                   fileObj[2]);
-                }
-            }
-        }
-
-        /*
-         * Clean up our localized references for the dictionary keys
-         * and value since PyDict_SetItem will Py_INCREF any copies
-         * that got placed in the dictionary.
-         */
-        Py_XDECREF(procObj);
-        Py_XDECREF(fileObj[0]);
-        Py_XDECREF(fileObj[1]);
-        Py_XDECREF(fileObj[2]);
-    }
-
-    /* Child is launched. */
-    return f;
-}
-
-/*
- * Wrapper for fclose() to use for popen* files, so we can retrieve the
- * exit code for the child process and return as a result of the close.
- *
- * This function uses the _PyPopenProcs dictionary in order to map the
- * input file pointer to information about the process that was
- * originally created by the popen* call that created the file pointer.
- * The dictionary uses the file pointer as a key (with one entry
- * inserted for each file returned by the original popen* call) and a
- * single list object as the value for all files from a single call.
- * The list object contains the Win32 process handle at [0], and a file
- * count at [1], which is initialized to the total number of file
- * handles using that list.
- *
- * This function closes whichever handle it is passed, and decrements
- * the file count in the dictionary for the process handle pointed to
- * by this file.  On the last close (when the file count reaches zero),
- * this function will wait for the child process and then return its
- * exit code as the result of the close() operation.  This permits the
- * files to be closed in any order - it is always the close() of the
- * final handle that will return the exit code.
- *
- * NOTE: This function is currently called with the GIL released.
- * hence we use the GILState API to manage our state.
- */
-
-static int _PyPclose(FILE *file)
-{
-    int result;
-    int exit_code;
-    pid_t pipe_pid;
-    PyObject *procObj, *pidObj, *intObj, *fileObj;
-    int file_count;
-#ifdef WITH_THREAD
-    PyGILState_STATE state;
-#endif
-
-    /* Close the file handle first, to ensure it can't block the
-     * child from exiting if it's the last handle.
-     */
-    result = fclose(file);
-
-#ifdef WITH_THREAD
-    state = PyGILState_Ensure();
-#endif
-    if (_PyPopenProcs)
-    {
-        if ((fileObj = PyLong_FromVoidPtr(file)) != NULL &&
-            (procObj = PyDict_GetItem(_PyPopenProcs,
-                                      fileObj)) != NULL &&
-            (pidObj = PyList_GetItem(procObj,0)) != NULL &&
-            (intObj = PyList_GetItem(procObj,1)) != NULL)
-        {
-            pipe_pid = (pid_t) PyLong_AsPid(pidObj);
-            file_count = (int) PyInt_AsLong(intObj);
-
-            if (file_count > 1)
-            {
-                /* Still other files referencing process */
-                file_count--;
-                PyList_SetItem(procObj,1,
-                               PyInt_FromLong((long) file_count));
-            }
-            else
-            {
-                /* Last file for this process */
-                if (result != EOF &&
-                    waitpid(pipe_pid, &exit_code, 0) == pipe_pid)
-                {
-                    /* extract exit status */
-                    if (WIFEXITED(exit_code))
-                    {
-                        result = WEXITSTATUS(exit_code);
-                    }
-                    else
-                    {
-                        errno = EPIPE;
-                        result = -1;
-                    }
-                }
-                else
-                {
-                    /* Indicate failure - this will cause the file object
-                     * to raise an I/O error and translate the last
-                     * error code from errno.  We do have a problem with
-                     * last errors that overlap the normal errno table,
-                     * but that's a consistent problem with the file object.
-                     */
-                    result = -1;
-                }
-            }
-
-            /* Remove this file pointer from dictionary */
-            PyDict_DelItem(_PyPopenProcs, fileObj);
-
-            if (PyDict_Size(_PyPopenProcs) == 0)
-            {
-                Py_DECREF(_PyPopenProcs);
-                _PyPopenProcs = NULL;
-            }
-
-        } /* if object retrieval ok */
-
-        Py_XDECREF(fileObj);
-    } /* if _PyPopenProcs */
-
-#ifdef WITH_THREAD
-    PyGILState_Release(state);
-#endif
-    return result;
-}
-
-#endif /* PYCC_??? */
-
-#elif defined(MS_WINDOWS)
-
-/*
- * Portable 'popen' replacement for Win32.
- *
- * Written by Bill Tutt <billtut@microsoft.com>.  Minor tweaks
- * and 2.0 integration by Fredrik Lundh <fredrik@pythonware.com>
- * Return code handling by David Bolen <db3l@fitlinxx.com>.
- */
-
-#include <malloc.h>
-#include <io.h>
-#include <fcntl.h>
-
-/* These tell _PyPopen() wether to return 1, 2, or 3 file objects. */
-#define POPEN_1 1
-#define POPEN_2 2
-#define POPEN_3 3
-#define POPEN_4 4
-
-static PyObject *_PyPopen(char *, int, int);
-static int _PyPclose(FILE *file);
-
-/*
- * Internal dictionary mapping popen* file pointers to process handles,
- * for use when retrieving the process exit code.  See _PyPclose() below
- * for more information on this dictionary's use.
- */
-static PyObject *_PyPopenProcs = NULL;
-
-
-/* popen that works from a GUI.
- *
- * The result of this function is a pipe (file) connected to the
- * processes stdin or stdout, depending on the requested mode.
- */
-
-static PyObject *
-posix_popen(PyObject *self, PyObject *args)
-{
-    PyObject *f;
-    int tm = 0;
-
-    char *cmdstring;
-    char *mode = "r";
-    int bufsize = -1;
-    if (!PyArg_ParseTuple(args, "s|si:popen", &cmdstring, &mode, &bufsize))
-        return NULL;
-
-    if (*mode == 'r')
-        tm = _O_RDONLY;
-    else if (*mode != 'w') {
-        PyErr_SetString(PyExc_ValueError, "popen() arg 2 must be 'r' or 'w'");
-        return NULL;
-    } else
-        tm = _O_WRONLY;
-
-    if (bufsize != -1) {
-        PyErr_SetString(PyExc_ValueError, "popen() arg 3 must be -1");
-        return NULL;
-    }
-
-    if (*(mode+1) == 't')
-        f = _PyPopen(cmdstring, tm | _O_TEXT, POPEN_1);
-    else if (*(mode+1) == 'b')
-        f = _PyPopen(cmdstring, tm | _O_BINARY, POPEN_1);
-    else
-        f = _PyPopen(cmdstring, tm | _O_TEXT, POPEN_1);
-
-    return f;
-}
-
-/* Variation on win32pipe.popen
- *
- * The result of this function is a pipe (file) connected to the
- * process's stdin, and a pipe connected to the process's stdout.
- */
-
-static PyObject *
-win32_popen2(PyObject *self, PyObject  *args)
-{
-    PyObject *f;
-    int tm=0;
-
-    char *cmdstring;
-    char *mode = "t";
-    int bufsize = -1;
-    if (!PyArg_ParseTuple(args, "s|si:popen2", &cmdstring, &mode, &bufsize))
-        return NULL;
-
-    if (*mode == 't')
-        tm = _O_TEXT;
-    else if (*mode != 'b') {
-        PyErr_SetString(PyExc_ValueError, "popen2() arg 2 must be 't' or 'b'");
-        return NULL;
-    } else
-        tm = _O_BINARY;
-
-    if (bufsize != -1) {
-        PyErr_SetString(PyExc_ValueError, "popen2() arg 3 must be -1");
-        return NULL;
-    }
-
-    f = _PyPopen(cmdstring, tm, POPEN_2);
-
-    return f;
-}
-
-/*
- * Variation on <om win32pipe.popen>
- *
- * The result of this function is 3 pipes - the process's stdin,
- * stdout and stderr
- */
-
-static PyObject *
-win32_popen3(PyObject *self, PyObject *args)
-{
-    PyObject *f;
-    int tm = 0;
-
-    char *cmdstring;
-    char *mode = "t";
-    int bufsize = -1;
-    if (!PyArg_ParseTuple(args, "s|si:popen3", &cmdstring, &mode, &bufsize))
-        return NULL;
-
-    if (*mode == 't')
-        tm = _O_TEXT;
-    else if (*mode != 'b') {
-        PyErr_SetString(PyExc_ValueError, "popen3() arg 2 must be 't' or 'b'");
-        return NULL;
-    } else
-        tm = _O_BINARY;
-
-    if (bufsize != -1) {
-        PyErr_SetString(PyExc_ValueError, "popen3() arg 3 must be -1");
-        return NULL;
-    }
-
-    f = _PyPopen(cmdstring, tm, POPEN_3);
-
-    return f;
-}
-
-/*
- * Variation on win32pipe.popen
- *
- * The result of this function is 2 pipes - the processes stdin,
- * and stdout+stderr combined as a single pipe.
- */
-
-static PyObject *
-win32_popen4(PyObject *self, PyObject  *args)
-{
-    PyObject *f;
-    int tm = 0;
-
-    char *cmdstring;
-    char *mode = "t";
-    int bufsize = -1;
-    if (!PyArg_ParseTuple(args, "s|si:popen4", &cmdstring, &mode, &bufsize))
-        return NULL;
-
-    if (*mode == 't')
-        tm = _O_TEXT;
-    else if (*mode != 'b') {
-        PyErr_SetString(PyExc_ValueError, "popen4() arg 2 must be 't' or 'b'");
-        return NULL;
-    } else
-        tm = _O_BINARY;
-
-    if (bufsize != -1) {
-        PyErr_SetString(PyExc_ValueError, "popen4() arg 3 must be -1");
-        return NULL;
-    }
-
-    f = _PyPopen(cmdstring, tm, POPEN_4);
-
-    return f;
-}
-
-static BOOL
-_PyPopenCreateProcess(char *cmdstring,
-                      HANDLE hStdin,
-                      HANDLE hStdout,
-                      HANDLE hStderr,
-                      HANDLE *hProcess)
-{
-    PROCESS_INFORMATION piProcInfo;
-    STARTUPINFO siStartInfo;
-    DWORD dwProcessFlags = 0;  /* no NEW_CONSOLE by default for Ctrl+C handling */
-    char *s1,*s2, *s3 = " /c ";
-    const char *szConsoleSpawn = "w9xpopen.exe";
-    int i;
-    Py_ssize_t x;
-
-    if (i = GetEnvironmentVariable("COMSPEC",NULL,0)) {
-        char *comshell;
-
-        s1 = (char *)alloca(i);
-        if (!(x = GetEnvironmentVariable("COMSPEC", s1, i)))
-            /* x < i, so x fits into an integer */
-            return (int)x;
-
-        /* Explicitly check if we are using COMMAND.COM.  If we are
-         * then use the w9xpopen hack.
-         */
-        comshell = s1 + x;
-        while (comshell >= s1 && *comshell != '\\')
-            --comshell;
-        ++comshell;
-
-        if (GetVersion() < 0x80000000 &&
-            _stricmp(comshell, "command.com") != 0) {
-            /* NT/2000 and not using command.com. */
-            x = i + strlen(s3) + strlen(cmdstring) + 1;
-            s2 = (char *)alloca(x);
-            ZeroMemory(s2, x);
-            PyOS_snprintf(s2, x, "%s%s%s", s1, s3, cmdstring);
-        }
-        else {
-            /*
-             * Oh gag, we're on Win9x or using COMMAND.COM. Use
-             * the workaround listed in KB: Q150956
-             */
-            char modulepath[_MAX_PATH];
-            struct stat statinfo;
-            GetModuleFileName(NULL, modulepath, sizeof(modulepath));
-            for (x = i = 0; modulepath[i]; i++)
-                if (modulepath[i] == SEP)
-                    x = i+1;
-            modulepath[x] = '\0';
-            /* Create the full-name to w9xpopen, so we can test it exists */
-            strncat(modulepath,
-                    szConsoleSpawn,
-                    (sizeof(modulepath)/sizeof(modulepath[0]))
-                        -strlen(modulepath));
-            if (stat(modulepath, &statinfo) != 0) {
-                size_t mplen = sizeof(modulepath)/sizeof(modulepath[0]);
-                /* Eeek - file-not-found - possibly an embedding
-                   situation - see if we can locate it in sys.prefix
-                */
-                strncpy(modulepath,
-                        Py_GetExecPrefix(),
-                        mplen);
-                modulepath[mplen-1] = '\0';
-                if (modulepath[strlen(modulepath)-1] != '\\')
-                    strcat(modulepath, "\\");
-                strncat(modulepath,
-                        szConsoleSpawn,
-                        mplen-strlen(modulepath));
-                /* No where else to look - raise an easily identifiable
-                   error, rather than leaving Windows to report
-                   "file not found" - as the user is probably blissfully
-                   unaware this shim EXE is used, and it will confuse them.
-                   (well, it confused me for a while ;-)
-                */
-                if (stat(modulepath, &statinfo) != 0) {
-                    PyErr_Format(PyExc_RuntimeError,
-                                 "Can not locate '%s' which is needed "
-                                 "for popen to work with your shell "
-                                 "or platform.",
-                                 szConsoleSpawn);
-                    return FALSE;
-                }
-            }
-            x = i + strlen(s3) + strlen(cmdstring) + 1 +
-                strlen(modulepath) +
-                strlen(szConsoleSpawn) + 1;
-
-            s2 = (char *)alloca(x);
-            ZeroMemory(s2, x);
-            /* To maintain correct argument passing semantics,
-               we pass the command-line as it stands, and allow
-               quoting to be applied.  w9xpopen.exe will then
-               use its argv vector, and re-quote the necessary
-               args for the ultimate child process.
-            */
-            PyOS_snprintf(
-                s2, x,
-                "\"%s\" %s%s%s",
-                modulepath,
-                s1,
-                s3,
-                cmdstring);
-            /* Not passing CREATE_NEW_CONSOLE has been known to
-               cause random failures on win9x.  Specifically a
-               dialog:
-               "Your program accessed mem currently in use at xxx"
-               and a hopeful warning about the stability of your
-               system.
-               Cost is Ctrl+C won't kill children, but anyone
-               who cares can have a go!
-            */
-            dwProcessFlags |= CREATE_NEW_CONSOLE;
-        }
-    }
-
-    /* Could be an else here to try cmd.exe / command.com in the path
-       Now we'll just error out.. */
-    else {
-        PyErr_SetString(PyExc_RuntimeError,
-                        "Cannot locate a COMSPEC environment variable to "
-                        "use as the shell");
-        return FALSE;
-    }
-
-    ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
-    siStartInfo.cb = sizeof(STARTUPINFO);
-    siStartInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
-    siStartInfo.hStdInput = hStdin;
-    siStartInfo.hStdOutput = hStdout;
-    siStartInfo.hStdError = hStderr;
-    siStartInfo.wShowWindow = SW_HIDE;
-
-    if (CreateProcess(NULL,
-                      s2,
-                      NULL,
-                      NULL,
-                      TRUE,
-                      dwProcessFlags,
-                      NULL,
-                      NULL,
-                      &siStartInfo,
-                      &piProcInfo) ) {
-        /* Close the handles now so anyone waiting is woken. */
-        CloseHandle(piProcInfo.hThread);
-
-        /* Return process handle */
-        *hProcess = piProcInfo.hProcess;
-        return TRUE;
-    }
-    win32_error("CreateProcess", s2);
-    return FALSE;
-}
-
-/* The following code is based off of KB: Q190351 */
-
-static PyObject *
-_PyPopen(char *cmdstring, int mode, int n)
-{
-    HANDLE hChildStdinRd, hChildStdinWr, hChildStdoutRd, hChildStdoutWr,
-        hChildStderrRd, hChildStderrWr, hChildStdinWrDup, hChildStdoutRdDup,
-        hChildStderrRdDup, hProcess; /* hChildStdoutWrDup; */
-
-    SECURITY_ATTRIBUTES saAttr;
-    BOOL fSuccess;
-    int fd1, fd2, fd3;
-    FILE *f1, *f2, *f3;
-    long file_count;
-    PyObject *f;
-
-    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
-    saAttr.bInheritHandle = TRUE;
-    saAttr.lpSecurityDescriptor = NULL;
-
-    if (!CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0))
-        return win32_error("CreatePipe", NULL);
-
-    /* Create new output read handle and the input write handle. Set
-     * the inheritance properties to FALSE. Otherwise, the child inherits
-     * these handles; resulting in non-closeable handles to the pipes
-     * being created. */
-     fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdinWr,
-                                GetCurrentProcess(), &hChildStdinWrDup, 0,
-                                FALSE,
-                                DUPLICATE_SAME_ACCESS);
-     if (!fSuccess)
-         return win32_error("DuplicateHandle", NULL);
-
-     /* Close the inheritable version of ChildStdin
-    that we're using. */
-     CloseHandle(hChildStdinWr);
-
-     if (!CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0))
-         return win32_error("CreatePipe", NULL);
-
-     fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdoutRd,
-                                GetCurrentProcess(), &hChildStdoutRdDup, 0,
-                                FALSE, DUPLICATE_SAME_ACCESS);
-     if (!fSuccess)
-         return win32_error("DuplicateHandle", NULL);
-
-     /* Close the inheritable version of ChildStdout
-        that we're using. */
-     CloseHandle(hChildStdoutRd);
-
-     if (n != POPEN_4) {
-         if (!CreatePipe(&hChildStderrRd, &hChildStderrWr, &saAttr, 0))
-             return win32_error("CreatePipe", NULL);
-         fSuccess = DuplicateHandle(GetCurrentProcess(),
-                                    hChildStderrRd,
-                                    GetCurrentProcess(),
-                                    &hChildStderrRdDup, 0,
-                                    FALSE, DUPLICATE_SAME_ACCESS);
-         if (!fSuccess)
-             return win32_error("DuplicateHandle", NULL);
-         /* Close the inheritable version of ChildStdErr that we're using. */
-         CloseHandle(hChildStderrRd);
-     }
-
-     switch (n) {
-     case POPEN_1:
-         switch (mode & (_O_RDONLY | _O_TEXT | _O_BINARY | _O_WRONLY)) {
-         case _O_WRONLY | _O_TEXT:
-             /* Case for writing to child Stdin in text mode. */
-             fd1 = _open_osfhandle((Py_intptr_t)hChildStdinWrDup, mode);
-             f1 = _fdopen(fd1, "w");
-             f = PyFile_FromFile(f1, cmdstring, "w", _PyPclose);
-             PyFile_SetBufSize(f, 0);
-             /* We don't care about these pipes anymore, so close them. */
-             CloseHandle(hChildStdoutRdDup);
-             CloseHandle(hChildStderrRdDup);
-             break;
-
-         case _O_RDONLY | _O_TEXT:
-             /* Case for reading from child Stdout in text mode. */
-             fd1 = _open_osfhandle((Py_intptr_t)hChildStdoutRdDup, mode);
-             f1 = _fdopen(fd1, "r");
-             f = PyFile_FromFile(f1, cmdstring, "r", _PyPclose);
-             PyFile_SetBufSize(f, 0);
-             /* We don't care about these pipes anymore, so close them. */
-             CloseHandle(hChildStdinWrDup);
-             CloseHandle(hChildStderrRdDup);
-             break;
-
-         case _O_RDONLY | _O_BINARY:
-             /* Case for readinig from child Stdout in binary mode. */
-             fd1 = _open_osfhandle((Py_intptr_t)hChildStdoutRdDup, mode);
-             f1 = _fdopen(fd1, "rb");
-             f = PyFile_FromFile(f1, cmdstring, "rb", _PyPclose);
-             PyFile_SetBufSize(f, 0);
-             /* We don't care about these pipes anymore, so close them. */
-             CloseHandle(hChildStdinWrDup);
-             CloseHandle(hChildStderrRdDup);
-             break;
-
-         case _O_WRONLY | _O_BINARY:
-             /* Case for writing to child Stdin in binary mode. */
-             fd1 = _open_osfhandle((Py_intptr_t)hChildStdinWrDup, mode);
-             f1 = _fdopen(fd1, "wb");
-             f = PyFile_FromFile(f1, cmdstring, "wb", _PyPclose);
-             PyFile_SetBufSize(f, 0);
-             /* We don't care about these pipes anymore, so close them. */
-             CloseHandle(hChildStdoutRdDup);
-             CloseHandle(hChildStderrRdDup);
-             break;
-         }
-         file_count = 1;
-         break;
-
-     case POPEN_2:
-     case POPEN_4:
-     {
-         char *m1, *m2;
-         PyObject *p1, *p2;
-
-         if (mode & _O_TEXT) {
-             m1 = "r";
-             m2 = "w";
-         } else {
-             m1 = "rb";
-             m2 = "wb";
-         }
-
-         fd1 = _open_osfhandle((Py_intptr_t)hChildStdinWrDup, mode);
-         f1 = _fdopen(fd1, m2);
-         fd2 = _open_osfhandle((Py_intptr_t)hChildStdoutRdDup, mode);
-         f2 = _fdopen(fd2, m1);
-         p1 = PyFile_FromFile(f1, cmdstring, m2, _PyPclose);
-         PyFile_SetBufSize(p1, 0);
-         p2 = PyFile_FromFile(f2, cmdstring, m1, _PyPclose);
-         PyFile_SetBufSize(p2, 0);
-
-         if (n != 4)
-             CloseHandle(hChildStderrRdDup);
-
-         f = PyTuple_Pack(2,p1,p2);
-         Py_XDECREF(p1);
-         Py_XDECREF(p2);
-         file_count = 2;
-         break;
-     }
-
-     case POPEN_3:
-     {
-         char *m1, *m2;
-         PyObject *p1, *p2, *p3;
-
-         if (mode & _O_TEXT) {
-             m1 = "r";
-             m2 = "w";
-         } else {
-             m1 = "rb";
-             m2 = "wb";
-         }
-
-         fd1 = _open_osfhandle((Py_intptr_t)hChildStdinWrDup, mode);
-         f1 = _fdopen(fd1, m2);
-         fd2 = _open_osfhandle((Py_intptr_t)hChildStdoutRdDup, mode);
-         f2 = _fdopen(fd2, m1);
-         fd3 = _open_osfhandle((Py_intptr_t)hChildStderrRdDup, mode);
-         f3 = _fdopen(fd3, m1);
-         p1 = PyFile_FromFile(f1, cmdstring, m2, _PyPclose);
-         p2 = PyFile_FromFile(f2, cmdstring, m1, _PyPclose);
-         p3 = PyFile_FromFile(f3, cmdstring, m1, _PyPclose);
-         PyFile_SetBufSize(p1, 0);
-         PyFile_SetBufSize(p2, 0);
-         PyFile_SetBufSize(p3, 0);
-         f = PyTuple_Pack(3,p1,p2,p3);
-         Py_XDECREF(p1);
-         Py_XDECREF(p2);
-         Py_XDECREF(p3);
-         file_count = 3;
-         break;
-     }
-     }
-
-     if (n == POPEN_4) {
-         if (!_PyPopenCreateProcess(cmdstring,
-                                    hChildStdinRd,
-                                    hChildStdoutWr,
-                                    hChildStdoutWr,
-                                    &hProcess))
-             return NULL;
-     }
-     else {
-         if (!_PyPopenCreateProcess(cmdstring,
-                                    hChildStdinRd,
-                                    hChildStdoutWr,
-                                    hChildStderrWr,
-                                    &hProcess))
-             return NULL;
-     }
-
-     /*
-      * Insert the files we've created into the process dictionary
-      * all referencing the list with the process handle and the
-      * initial number of files (see description below in _PyPclose).
-      * Since if _PyPclose later tried to wait on a process when all
-      * handles weren't closed, it could create a deadlock with the
-      * child, we spend some energy here to try to ensure that we
-      * either insert all file handles into the dictionary or none
-      * at all.  It's a little clumsy with the various popen modes
-      * and variable number of files involved.
-      */
-     if (!_PyPopenProcs) {
-         _PyPopenProcs = PyDict_New();
-     }
-
-     if (_PyPopenProcs) {
-         PyObject *procObj, *hProcessObj, *intObj, *fileObj[3];
-         int ins_rc[3];
-
-         fileObj[0] = fileObj[1] = fileObj[2] = NULL;
-         ins_rc[0]  = ins_rc[1]  = ins_rc[2]  = 0;
-
-         procObj = PyList_New(2);
-         hProcessObj = PyLong_FromVoidPtr(hProcess);
-         intObj = PyInt_FromLong(file_count);
-
-         if (procObj && hProcessObj && intObj) {
-             PyList_SetItem(procObj,0,hProcessObj);
-             PyList_SetItem(procObj,1,intObj);
-
-             fileObj[0] = PyLong_FromVoidPtr(f1);
-             if (fileObj[0]) {
-                ins_rc[0] = PyDict_SetItem(_PyPopenProcs,
-                                           fileObj[0],
-                                           procObj);
-             }
-             if (file_count >= 2) {
-                 fileObj[1] = PyLong_FromVoidPtr(f2);
-                 if (fileObj[1]) {
-                    ins_rc[1] = PyDict_SetItem(_PyPopenProcs,
-                                               fileObj[1],
-                                               procObj);
-                 }
-             }
-             if (file_count >= 3) {
-                 fileObj[2] = PyLong_FromVoidPtr(f3);
-                 if (fileObj[2]) {
-                    ins_rc[2] = PyDict_SetItem(_PyPopenProcs,
-                                               fileObj[2],
-                                               procObj);
-                 }
-             }
-
-             if (ins_rc[0] < 0 || !fileObj[0] ||
-                 ins_rc[1] < 0 || (file_count > 1 && !fileObj[1]) ||
-                 ins_rc[2] < 0 || (file_count > 2 && !fileObj[2])) {
-                 /* Something failed - remove any dictionary
-                  * entries that did make it.
-                  */
-                 if (!ins_rc[0] && fileObj[0]) {
-                     PyDict_DelItem(_PyPopenProcs,
-                                    fileObj[0]);
-                 }
-                 if (!ins_rc[1] && fileObj[1]) {
-                     PyDict_DelItem(_PyPopenProcs,
-                                    fileObj[1]);
-                 }
-                 if (!ins_rc[2] && fileObj[2]) {
-                     PyDict_DelItem(_PyPopenProcs,
-                                    fileObj[2]);
-                 }
-             }
-         }
-
-         /*
-          * Clean up our localized references for the dictionary keys
-          * and value since PyDict_SetItem will Py_INCREF any copies
-          * that got placed in the dictionary.
-          */
-         Py_XDECREF(procObj);
-         Py_XDECREF(fileObj[0]);
-         Py_XDECREF(fileObj[1]);
-         Py_XDECREF(fileObj[2]);
-     }
-
-     /* Child is launched. Close the parents copy of those pipe
-      * handles that only the child should have open.  You need to
-      * make sure that no handles to the write end of the output pipe
-      * are maintained in this process or else the pipe will not close
-      * when the child process exits and the ReadFile will hang. */
-
-     if (!CloseHandle(hChildStdinRd))
-         return win32_error("CloseHandle", NULL);
-
-     if (!CloseHandle(hChildStdoutWr))
-         return win32_error("CloseHandle", NULL);
-
-     if ((n != 4) && (!CloseHandle(hChildStderrWr)))
-         return win32_error("CloseHandle", NULL);
-
-     return f;
-}
-
-/*
- * Wrapper for fclose() to use for popen* files, so we can retrieve the
- * exit code for the child process and return as a result of the close.
- *
- * This function uses the _PyPopenProcs dictionary in order to map the
- * input file pointer to information about the process that was
- * originally created by the popen* call that created the file pointer.
- * The dictionary uses the file pointer as a key (with one entry
- * inserted for each file returned by the original popen* call) and a
- * single list object as the value for all files from a single call.
- * The list object contains the Win32 process handle at [0], and a file
- * count at [1], which is initialized to the total number of file
- * handles using that list.
- *
- * This function closes whichever handle it is passed, and decrements
- * the file count in the dictionary for the process handle pointed to
- * by this file.  On the last close (when the file count reaches zero),
- * this function will wait for the child process and then return its
- * exit code as the result of the close() operation.  This permits the
- * files to be closed in any order - it is always the close() of the
- * final handle that will return the exit code.
- *
- * NOTE: This function is currently called with the GIL released.
- * hence we use the GILState API to manage our state.
- */
-
-static int _PyPclose(FILE *file)
-{
-    int result;
-    DWORD exit_code;
-    HANDLE hProcess;
-    PyObject *procObj, *hProcessObj, *intObj, *fileObj;
-    long file_count;
-#ifdef WITH_THREAD
-    PyGILState_STATE state;
-#endif
-
-    /* Close the file handle first, to ensure it can't block the
-     * child from exiting if it's the last handle.
-     */
-    result = fclose(file);
-#ifdef WITH_THREAD
-    state = PyGILState_Ensure();
-#endif
-    if (_PyPopenProcs) {
-        if ((fileObj = PyLong_FromVoidPtr(file)) != NULL &&
-            (procObj = PyDict_GetItem(_PyPopenProcs,
-                                      fileObj)) != NULL &&
-            (hProcessObj = PyList_GetItem(procObj,0)) != NULL &&
-            (intObj = PyList_GetItem(procObj,1)) != NULL) {
-
-            hProcess = PyLong_AsVoidPtr(hProcessObj);
-            file_count = PyInt_AsLong(intObj);
-
-            if (file_count > 1) {
-                /* Still other files referencing process */
-                file_count--;
-                PyList_SetItem(procObj,1,
-                               PyInt_FromLong(file_count));
-            } else {
-                /* Last file for this process */
-                if (result != EOF &&
-                    WaitForSingleObject(hProcess, INFINITE) != WAIT_FAILED &&
-                    GetExitCodeProcess(hProcess, &exit_code)) {
-                    /* Possible truncation here in 16-bit environments, but
-                     * real exit codes are just the lower byte in any event.
-                     */
-                    result = exit_code;
-                } else {
-                    /* Indicate failure - this will cause the file object
-                     * to raise an I/O error and translate the last Win32
-                     * error code from errno.  We do have a problem with
-                     * last errors that overlap the normal errno table,
-                     * but that's a consistent problem with the file object.
-                     */
-                    if (result != EOF) {
-                        /* If the error wasn't from the fclose(), then
-                         * set errno for the file object error handling.
-                         */
-                        errno = GetLastError();
-                    }
-                    result = -1;
-                }
-
-                /* Free up the native handle at this point */
-                CloseHandle(hProcess);
-            }
-
-            /* Remove this file pointer from dictionary */
-            PyDict_DelItem(_PyPopenProcs, fileObj);
-
-            if (PyDict_Size(_PyPopenProcs) == 0) {
-                Py_DECREF(_PyPopenProcs);
-                _PyPopenProcs = NULL;
-            }
-
-        } /* if object retrieval ok */
-
-        Py_XDECREF(fileObj);
-    } /* if _PyPopenProcs */
-
-#ifdef WITH_THREAD
-    PyGILState_Release(state);
-#endif
-    return result;
-}
-
-#else /* which OS? */
-static PyObject *
-posix_popen(PyObject *self, PyObject *args)
-{
-    char *name;
-    char *mode = "r";
-    int bufsize = -1;
-    FILE *fp;
-    PyObject *f;
-    if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
-        return NULL;
-    /* Strip mode of binary or text modifiers */
-    if (strcmp(mode, "rb") == 0 || strcmp(mode, "rt") == 0)
-        mode = "r";
-    else if (strcmp(mode, "wb") == 0 || strcmp(mode, "wt") == 0)
-        mode = "w";
-    Py_BEGIN_ALLOW_THREADS
-    fp = popen(name, mode);
-    Py_END_ALLOW_THREADS
-    if (fp == NULL)
-        return posix_error();
-    f = PyFile_FromFile(fp, name, mode, pclose);
-    if (f != NULL)
-        PyFile_SetBufSize(f, bufsize);
-    return f;
-}
-
-#endif /* PYOS_??? */
-#endif /* HAVE_POPEN */
-
-
-#ifdef HAVE_SETUID
-PyDoc_STRVAR(posix_setuid__doc__,
-"setuid(uid)\n\n\
-Set the current process's user id.");
-
-static PyObject *
-posix_setuid(PyObject *self, PyObject *args)
-{
-    long uid_arg;
-    uid_t uid;
-    if (!PyArg_ParseTuple(args, "l:setuid", &uid_arg))
-        return NULL;
-    uid = uid_arg;
-    if (uid != uid_arg) {
-        PyErr_SetString(PyExc_OverflowError, "user id too big");
-        return NULL;
-    }
-    if (setuid(uid) < 0)
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif /* HAVE_SETUID */
-
-
-#ifdef HAVE_SETEUID
-PyDoc_STRVAR(posix_seteuid__doc__,
-"seteuid(uid)\n\n\
-Set the current process's effective user id.");
-
-static PyObject *
-posix_seteuid (PyObject *self, PyObject *args)
-{
-    long euid_arg;
-    uid_t euid;
-    if (!PyArg_ParseTuple(args, "l", &euid_arg))
-        return NULL;
-    euid = euid_arg;
-    if (euid != euid_arg) {
-        PyErr_SetString(PyExc_OverflowError, "user id too big");
-        return NULL;
-    }
-    if (seteuid(euid) < 0) {
-        return posix_error();
-    } else {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-#endif /* HAVE_SETEUID */
-
-#ifdef HAVE_SETEGID
-PyDoc_STRVAR(posix_setegid__doc__,
-"setegid(gid)\n\n\
-Set the current process's effective group id.");
-
-static PyObject *
-posix_setegid (PyObject *self, PyObject *args)
-{
-    long egid_arg;
-    gid_t egid;
-    if (!PyArg_ParseTuple(args, "l", &egid_arg))
-        return NULL;
-    egid = egid_arg;
-    if (egid != egid_arg) {
-        PyErr_SetString(PyExc_OverflowError, "group id too big");
-        return NULL;
-    }
-    if (setegid(egid) < 0) {
-        return posix_error();
-    } else {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-#endif /* HAVE_SETEGID */
-
-#ifdef HAVE_SETREUID
-PyDoc_STRVAR(posix_setreuid__doc__,
-"setreuid(ruid, euid)\n\n\
-Set the current process's real and effective user ids.");
-
-static PyObject *
-posix_setreuid (PyObject *self, PyObject *args)
-{
-    long ruid_arg, euid_arg;
-    uid_t ruid, euid;
-    if (!PyArg_ParseTuple(args, "ll", &ruid_arg, &euid_arg))
-        return NULL;
-    if (ruid_arg == -1)
-        ruid = (uid_t)-1;  /* let the compiler choose how -1 fits */
-    else
-        ruid = ruid_arg;  /* otherwise, assign from our long */
-    if (euid_arg == -1)
-        euid = (uid_t)-1;
-    else
-        euid = euid_arg;
-    if ((euid_arg != -1 && euid != euid_arg) ||
-        (ruid_arg != -1 && ruid != ruid_arg)) {
-        PyErr_SetString(PyExc_OverflowError, "user id too big");
-        return NULL;
-    }
-    if (setreuid(ruid, euid) < 0) {
-        return posix_error();
-    } else {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-#endif /* HAVE_SETREUID */
-
-#ifdef HAVE_SETREGID
-PyDoc_STRVAR(posix_setregid__doc__,
-"setregid(rgid, egid)\n\n\
-Set the current process's real and effective group ids.");
-
-static PyObject *
-posix_setregid (PyObject *self, PyObject *args)
-{
-    long rgid_arg, egid_arg;
-    gid_t rgid, egid;
-    if (!PyArg_ParseTuple(args, "ll", &rgid_arg, &egid_arg))
-        return NULL;
-    if (rgid_arg == -1)
-        rgid = (gid_t)-1;  /* let the compiler choose how -1 fits */
-    else
-        rgid = rgid_arg;  /* otherwise, assign from our long */
-    if (egid_arg == -1)
-        egid = (gid_t)-1;
-    else
-        egid = egid_arg;
-    if ((egid_arg != -1 && egid != egid_arg) ||
-        (rgid_arg != -1 && rgid != rgid_arg)) {
-        PyErr_SetString(PyExc_OverflowError, "group id too big");
-        return NULL;
-    }
-    if (setregid(rgid, egid) < 0) {
-        return posix_error();
-    } else {
-        Py_INCREF(Py_None);
-        return Py_None;
-    }
-}
-#endif /* HAVE_SETREGID */
-
-#ifdef HAVE_SETGID
-PyDoc_STRVAR(posix_setgid__doc__,
-"setgid(gid)\n\n\
-Set the current process's group id.");
-
-static PyObject *
-posix_setgid(PyObject *self, PyObject *args)
-{
-    long gid_arg;
-    gid_t gid;
-    if (!PyArg_ParseTuple(args, "l:setgid", &gid_arg))
-        return NULL;
-    gid = gid_arg;
-    if (gid != gid_arg) {
-        PyErr_SetString(PyExc_OverflowError, "group id too big");
-        return NULL;
-    }
-    if (setgid(gid) < 0)
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif /* HAVE_SETGID */
-
-#ifdef HAVE_SETGROUPS
-PyDoc_STRVAR(posix_setgroups__doc__,
-"setgroups(list)\n\n\
-Set the groups of the current process to list.");
-
-static PyObject *
-posix_setgroups(PyObject *self, PyObject *groups)
-{
-    int i, len;
-    gid_t grouplist[MAX_GROUPS];
-
-    if (!PySequence_Check(groups)) {
-        PyErr_SetString(PyExc_TypeError, "setgroups argument must be a sequence");
-        return NULL;
-    }
-    len = PySequence_Size(groups);
-    if (len > MAX_GROUPS) {
-        PyErr_SetString(PyExc_ValueError, "too many groups");
-        return NULL;
-    }
-    for(i = 0; i < len; i++) {
-        PyObject *elem;
-        elem = PySequence_GetItem(groups, i);
-        if (!elem)
-            return NULL;
-        if (!PyInt_Check(elem)) {
-            if (!PyLong_Check(elem)) {
-                PyErr_SetString(PyExc_TypeError,
-                                "groups must be integers");
-                Py_DECREF(elem);
-                return NULL;
-            } else {
-                unsigned long x = PyLong_AsUnsignedLong(elem);
-                if (PyErr_Occurred()) {
-                    PyErr_SetString(PyExc_TypeError,
-                                    "group id too big");
-                    Py_DECREF(elem);
-                    return NULL;
-                }
-                grouplist[i] = x;
-                /* read back to see if it fits in gid_t */
-                if (grouplist[i] != x) {
-                    PyErr_SetString(PyExc_TypeError,
-                                    "group id too big");
-                    Py_DECREF(elem);
-                    return NULL;
-                }
-            }
-        } else {
-            long x  = PyInt_AsLong(elem);
-            grouplist[i] = x;
-            if (grouplist[i] != x) {
-                PyErr_SetString(PyExc_TypeError,
-                                "group id too big");
-                Py_DECREF(elem);
-                return NULL;
-            }
-        }
-        Py_DECREF(elem);
-    }
-
-    if (setgroups(len, grouplist) < 0)
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif /* HAVE_SETGROUPS */
-
-#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4)
-static PyObject *
-wait_helper(pid_t pid, int status, struct rusage *ru)
-{
-    PyObject *result;
-    static PyObject *struct_rusage;
-
-    if (pid == -1)
-        return posix_error();
-
-    if (struct_rusage == NULL) {
-        PyObject *m = PyImport_ImportModuleNoBlock("resource");
-        if (m == NULL)
-            return NULL;
-        struct_rusage = PyObject_GetAttrString(m, "struct_rusage");
-        Py_DECREF(m);
-        if (struct_rusage == NULL)
-            return NULL;
-    }
-
-    /* XXX(nnorwitz): Copied (w/mods) from resource.c, there should be only one. */
-    result = PyStructSequence_New((PyTypeObject*) struct_rusage);
-    if (!result)
-        return NULL;
-
-#ifndef doubletime
-#define doubletime(TV) ((double)(TV).tv_sec + (TV).tv_usec * 0.000001)
-#endif
-
-    PyStructSequence_SET_ITEM(result, 0,
-                              PyFloat_FromDouble(doubletime(ru->ru_utime)));
-    PyStructSequence_SET_ITEM(result, 1,
-                              PyFloat_FromDouble(doubletime(ru->ru_stime)));
-#define SET_INT(result, index, value)\
-        PyStructSequence_SET_ITEM(result, index, PyInt_FromLong(value))
-    SET_INT(result, 2, ru->ru_maxrss);
-    SET_INT(result, 3, ru->ru_ixrss);
-    SET_INT(result, 4, ru->ru_idrss);
-    SET_INT(result, 5, ru->ru_isrss);
-    SET_INT(result, 6, ru->ru_minflt);
-    SET_INT(result, 7, ru->ru_majflt);
-    SET_INT(result, 8, ru->ru_nswap);
-    SET_INT(result, 9, ru->ru_inblock);
-    SET_INT(result, 10, ru->ru_oublock);
-    SET_INT(result, 11, ru->ru_msgsnd);
-    SET_INT(result, 12, ru->ru_msgrcv);
-    SET_INT(result, 13, ru->ru_nsignals);
-    SET_INT(result, 14, ru->ru_nvcsw);
-    SET_INT(result, 15, ru->ru_nivcsw);
-#undef SET_INT
-
-    if (PyErr_Occurred()) {
-        Py_DECREF(result);
-        return NULL;
-    }
-
-    return Py_BuildValue("NiN", PyLong_FromPid(pid), status, result);
-}
-#endif /* HAVE_WAIT3 || HAVE_WAIT4 */
-
-#ifdef HAVE_WAIT3
-PyDoc_STRVAR(posix_wait3__doc__,
-"wait3(options) -> (pid, status, rusage)\n\n\
-Wait for completion of a child process.");
-
-static PyObject *
-posix_wait3(PyObject *self, PyObject *args)
-{
-    pid_t pid;
-    int options;
-    struct rusage ru;
-    WAIT_TYPE status;
-    WAIT_STATUS_INT(status) = 0;
-
-    if (!PyArg_ParseTuple(args, "i:wait3", &options))
-        return NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    pid = wait3(&status, options, &ru);
-    Py_END_ALLOW_THREADS
-
-    return wait_helper(pid, WAIT_STATUS_INT(status), &ru);
-}
-#endif /* HAVE_WAIT3 */
-
-#ifdef HAVE_WAIT4
-PyDoc_STRVAR(posix_wait4__doc__,
-"wait4(pid, options) -> (pid, status, rusage)\n\n\
-Wait for completion of a given child process.");
-
-static PyObject *
-posix_wait4(PyObject *self, PyObject *args)
-{
-    pid_t pid;
-    int options;
-    struct rusage ru;
-    WAIT_TYPE status;
-    WAIT_STATUS_INT(status) = 0;
-
-    if (!PyArg_ParseTuple(args, PARSE_PID "i:wait4", &pid, &options))
-        return NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    pid = wait4(pid, &status, options, &ru);
-    Py_END_ALLOW_THREADS
-
-    return wait_helper(pid, WAIT_STATUS_INT(status), &ru);
-}
-#endif /* HAVE_WAIT4 */
-
-#ifdef HAVE_WAITPID
-PyDoc_STRVAR(posix_waitpid__doc__,
-"waitpid(pid, options) -> (pid, status)\n\n\
-Wait for completion of a given child process.");
-
-static PyObject *
-posix_waitpid(PyObject *self, PyObject *args)
-{
-    pid_t pid;
-    int options;
-    WAIT_TYPE status;
-    WAIT_STATUS_INT(status) = 0;
-
-    if (!PyArg_ParseTuple(args, PARSE_PID "i:waitpid", &pid, &options))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    pid = waitpid(pid, &status, options);
-    Py_END_ALLOW_THREADS
-    if (pid == -1)
-        return posix_error();
-
-    return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status));
-}
-
-#elif defined(HAVE_CWAIT)
-
-/* MS C has a variant of waitpid() that's usable for most purposes. */
-PyDoc_STRVAR(posix_waitpid__doc__,
-"waitpid(pid, options) -> (pid, status << 8)\n\n"
-"Wait for completion of a given process.  options is ignored on Windows.");
-
-static PyObject *
-posix_waitpid(PyObject *self, PyObject *args)
-{
-    Py_intptr_t pid;
-    int status, options;
-
-    if (!PyArg_ParseTuple(args, PARSE_PID "i:waitpid", &pid, &options))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    pid = _cwait(&status, pid, options);
-    Py_END_ALLOW_THREADS
-    if (pid == -1)
-        return posix_error();
-
-    /* shift the status left a byte so this is more like the POSIX waitpid */
-    return Py_BuildValue("Ni", PyLong_FromPid(pid), status << 8);
-}
-#endif /* HAVE_WAITPID || HAVE_CWAIT */
-
-#ifdef HAVE_WAIT
-PyDoc_STRVAR(posix_wait__doc__,
-"wait() -> (pid, status)\n\n\
-Wait for completion of a child process.");
-
-static PyObject *
-posix_wait(PyObject *self, PyObject *noargs)
-{
-    pid_t pid;
-    WAIT_TYPE status;
-    WAIT_STATUS_INT(status) = 0;
-
-    Py_BEGIN_ALLOW_THREADS
-    pid = wait(&status);
-    Py_END_ALLOW_THREADS
-    if (pid == -1)
-        return posix_error();
-
-    return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status));
-}
-#endif
-
-
-PyDoc_STRVAR(posix_lstat__doc__,
-"lstat(path) -> stat result\n\n\
-Like stat(path), but do not follow symbolic links.");
-
-static PyObject *
-posix_lstat(PyObject *self, PyObject *args)
-{
-#ifdef HAVE_LSTAT
-    return posix_do_stat(self, args, "et:lstat", lstat, NULL, NULL);
-#else /* !HAVE_LSTAT */
-#ifdef MS_WINDOWS
-    return posix_do_stat(self, args, "et:lstat", STAT, "U:lstat", win32_wstat);
-#else
-    return posix_do_stat(self, args, "et:lstat", STAT, NULL, NULL);
-#endif
-#endif /* !HAVE_LSTAT */
-}
-
-
-#ifdef HAVE_READLINK
-PyDoc_STRVAR(posix_readlink__doc__,
-"readlink(path) -> path\n\n\
-Return a string representing the path to which the symbolic link points.");
-
-static PyObject *
-posix_readlink(PyObject *self, PyObject *args)
-{
-    PyObject* v;
-    char buf[MAXPATHLEN];
-    char *path;
-    int n;
-#ifdef Py_USING_UNICODE
-    int arg_is_unicode = 0;
-#endif
-
-    if (!PyArg_ParseTuple(args, "et:readlink",
-                          Py_FileSystemDefaultEncoding, &path))
-        return NULL;
-#ifdef Py_USING_UNICODE
-    v = PySequence_GetItem(args, 0);
-    if (v == NULL) {
-        PyMem_Free(path);
-        return NULL;
-    }
-
-    if (PyUnicode_Check(v)) {
-        arg_is_unicode = 1;
-    }
-    Py_DECREF(v);
-#endif
-
-    Py_BEGIN_ALLOW_THREADS
-    n = readlink(path, buf, (int) sizeof buf);
-    Py_END_ALLOW_THREADS
-    if (n < 0)
-        return posix_error_with_allocated_filename(path);
-
-    PyMem_Free(path);
-    v = PyString_FromStringAndSize(buf, n);
-#ifdef Py_USING_UNICODE
-    if (arg_is_unicode) {
-        PyObject *w;
-
-        w = PyUnicode_FromEncodedObject(v,
-                                        Py_FileSystemDefaultEncoding,
-                                        "strict");
-        if (w != NULL) {
-            Py_DECREF(v);
-            v = w;
-        }
-        else {
-            /* fall back to the original byte string, as
-               discussed in patch #683592 */
-            PyErr_Clear();
-        }
-    }
-#endif
-    return v;
-}
-#endif /* HAVE_READLINK */
-
-
-#ifdef HAVE_SYMLINK
-PyDoc_STRVAR(posix_symlink__doc__,
-"symlink(src, dst)\n\n\
-Create a symbolic link pointing to src named dst.");
-
-static PyObject *
-posix_symlink(PyObject *self, PyObject *args)
-{
-    return posix_2str(args, "etet:symlink", symlink);
-}
-#endif /* HAVE_SYMLINK */
-
-
-#ifdef HAVE_TIMES
-#if defined(PYCC_VACPP) && defined(PYOS_OS2)
-static long
-system_uptime(void)
-{
-    ULONG     value = 0;
-
-    Py_BEGIN_ALLOW_THREADS
-    DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &value, sizeof(value));
-    Py_END_ALLOW_THREADS
-
-    return value;
-}
-
-static PyObject *
-posix_times(PyObject *self, PyObject *noargs)
-{
-    /* Currently Only Uptime is Provided -- Others Later */
-    return Py_BuildValue("ddddd",
-                         (double)0 /* t.tms_utime / HZ */,
-                         (double)0 /* t.tms_stime / HZ */,
-                         (double)0 /* t.tms_cutime / HZ */,
-                         (double)0 /* t.tms_cstime / HZ */,
-                         (double)system_uptime() / 1000);
-}
-#else /* not OS2 */
-#define NEED_TICKS_PER_SECOND
-static long ticks_per_second = -1;
-static PyObject *
-posix_times(PyObject *self, PyObject *noargs)
-{
-    struct tms t;
-    clock_t c;
-    errno = 0;
-    c = times(&t);
-    if (c == (clock_t) -1)
-        return posix_error();
-    return Py_BuildValue("ddddd",
-                         (double)t.tms_utime / ticks_per_second,
-                         (double)t.tms_stime / ticks_per_second,
-                         (double)t.tms_cutime / ticks_per_second,
-                         (double)t.tms_cstime / ticks_per_second,
-                         (double)c / ticks_per_second);
-}
-#endif /* not OS2 */
-#endif /* HAVE_TIMES */
-
-
-#ifdef MS_WINDOWS
-#define HAVE_TIMES      /* so the method table will pick it up */
-static PyObject *
-posix_times(PyObject *self, PyObject *noargs)
-{
-    FILETIME create, exit, kernel, user;
-    HANDLE hProc;
-    hProc = GetCurrentProcess();
-    GetProcessTimes(hProc, &create, &exit, &kernel, &user);
-    /* The fields of a FILETIME structure are the hi and lo part
-       of a 64-bit value expressed in 100 nanosecond units.
-       1e7 is one second in such units; 1e-7 the inverse.
-       429.4967296 is 2**32 / 1e7 or 2**32 * 1e-7.
-    */
-    return Py_BuildValue(
-        "ddddd",
-        (double)(user.dwHighDateTime*429.4967296 +
-                 user.dwLowDateTime*1e-7),
-        (double)(kernel.dwHighDateTime*429.4967296 +
-                 kernel.dwLowDateTime*1e-7),
-        (double)0,
-        (double)0,
-        (double)0);
-}
-#endif /* MS_WINDOWS */
-
-#ifdef HAVE_TIMES
-PyDoc_STRVAR(posix_times__doc__,
-"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\n\
-Return a tuple of floating point numbers indicating process times.");
-#endif
-
-
-#ifdef HAVE_GETSID
-PyDoc_STRVAR(posix_getsid__doc__,
-"getsid(pid) -> sid\n\n\
-Call the system call getsid().");
-
-static PyObject *
-posix_getsid(PyObject *self, PyObject *args)
-{
-    pid_t pid;
-    int sid;
-    if (!PyArg_ParseTuple(args, PARSE_PID ":getsid", &pid))
-        return NULL;
-    sid = getsid(pid);
-    if (sid < 0)
-        return posix_error();
-    return PyInt_FromLong((long)sid);
-}
-#endif /* HAVE_GETSID */
-
-
-#ifdef HAVE_SETSID
-PyDoc_STRVAR(posix_setsid__doc__,
-"setsid()\n\n\
-Call the system call setsid().");
-
-static PyObject *
-posix_setsid(PyObject *self, PyObject *noargs)
-{
-    if (setsid() < 0)
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif /* HAVE_SETSID */
-
-#ifdef HAVE_SETPGID
-PyDoc_STRVAR(posix_setpgid__doc__,
-"setpgid(pid, pgrp)\n\n\
-Call the system call setpgid().");
-
-static PyObject *
-posix_setpgid(PyObject *self, PyObject *args)
-{
-    pid_t pid;
-    int pgrp;
-    if (!PyArg_ParseTuple(args, PARSE_PID "i:setpgid", &pid, &pgrp))
-        return NULL;
-    if (setpgid(pid, pgrp) < 0)
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif /* HAVE_SETPGID */
-
-
-#ifdef HAVE_TCGETPGRP
-PyDoc_STRVAR(posix_tcgetpgrp__doc__,
-"tcgetpgrp(fd) -> pgid\n\n\
-Return the process group associated with the terminal given by a fd.");
-
-static PyObject *
-posix_tcgetpgrp(PyObject *self, PyObject *args)
-{
-    int fd;
-    pid_t pgid;
-    if (!PyArg_ParseTuple(args, "i:tcgetpgrp", &fd))
-        return NULL;
-    pgid = tcgetpgrp(fd);
-    if (pgid < 0)
-        return posix_error();
-    return PyLong_FromPid(pgid);
-}
-#endif /* HAVE_TCGETPGRP */
-
-
-#ifdef HAVE_TCSETPGRP
-PyDoc_STRVAR(posix_tcsetpgrp__doc__,
-"tcsetpgrp(fd, pgid)\n\n\
-Set the process group associated with the terminal given by a fd.");
-
-static PyObject *
-posix_tcsetpgrp(PyObject *self, PyObject *args)
-{
-    int fd;
-    pid_t pgid;
-    if (!PyArg_ParseTuple(args, "i" PARSE_PID ":tcsetpgrp", &fd, &pgid))
-        return NULL;
-    if (tcsetpgrp(fd, pgid) < 0)
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif /* HAVE_TCSETPGRP */
-
-/* Functions acting on file descriptors */
-
-PyDoc_STRVAR(posix_open__doc__,
-"open(filename, flag [, mode=0777]) -> fd\n\n\
-Open a file (for low level IO).");
-
-static PyObject *
-posix_open(PyObject *self, PyObject *args)
-{
-    char *file = NULL;
-    int flag;
-    int mode = 0777;
-    int fd;
-
-#ifdef MS_WINDOWS
-    PyUnicodeObject *po;
-    if (PyArg_ParseTuple(args, "Ui|i:mkdir", &po, &flag, &mode)) {
-        Py_BEGIN_ALLOW_THREADS
-        /* PyUnicode_AS_UNICODE OK without thread
-           lock as it is a simple dereference. */
-        fd = _wopen(PyUnicode_AS_UNICODE(po), flag, mode);
-        Py_END_ALLOW_THREADS
-        if (fd < 0)
-            return posix_error();
-        return PyInt_FromLong((long)fd);
-    }
-    /* Drop the argument parsing error as narrow strings
-       are also valid. */
-    PyErr_Clear();
-#endif
-
-    if (!PyArg_ParseTuple(args, "eti|i",
-                          Py_FileSystemDefaultEncoding, &file,
-                          &flag, &mode))
-        return NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    fd = open(file, flag, mode);
-    Py_END_ALLOW_THREADS
-    if (fd < 0)
-        return posix_error_with_allocated_filename(file);
-    PyMem_Free(file);
-    return PyInt_FromLong((long)fd);
-}
-
-
-PyDoc_STRVAR(posix_close__doc__,
-"close(fd)\n\n\
-Close a file descriptor (for low level IO).");
-
-static PyObject *
-posix_close(PyObject *self, PyObject *args)
-{
-    int fd, res;
-    if (!PyArg_ParseTuple(args, "i:close", &fd))
-        return NULL;
-    if (!_PyVerify_fd(fd))
-        return posix_error();
-    Py_BEGIN_ALLOW_THREADS
-    res = close(fd);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-PyDoc_STRVAR(posix_closerange__doc__,
-"closerange(fd_low, fd_high)\n\n\
-Closes all file descriptors in [fd_low, fd_high), ignoring errors.");
-
-static PyObject *
-posix_closerange(PyObject *self, PyObject *args)
-{
-    int fd_from, fd_to, i;
-    if (!PyArg_ParseTuple(args, "ii:closerange", &fd_from, &fd_to))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    for (i = fd_from; i < fd_to; i++)
-        if (_PyVerify_fd(i))
-            close(i);
-    Py_END_ALLOW_THREADS
-    Py_RETURN_NONE;
-}
-
-
-PyDoc_STRVAR(posix_dup__doc__,
-"dup(fd) -> fd2\n\n\
-Return a duplicate of a file descriptor.");
-
-static PyObject *
-posix_dup(PyObject *self, PyObject *args)
-{
-    int fd;
-    if (!PyArg_ParseTuple(args, "i:dup", &fd))
-        return NULL;
-    if (!_PyVerify_fd(fd))
-        return posix_error();
-    Py_BEGIN_ALLOW_THREADS
-    fd = dup(fd);
-    Py_END_ALLOW_THREADS
-    if (fd < 0)
-        return posix_error();
-    return PyInt_FromLong((long)fd);
-}
-
-
-PyDoc_STRVAR(posix_dup2__doc__,
-"dup2(old_fd, new_fd)\n\n\
-Duplicate file descriptor.");
-
-static PyObject *
-posix_dup2(PyObject *self, PyObject *args)
-{
-    int fd, fd2, res;
-    if (!PyArg_ParseTuple(args, "ii:dup2", &fd, &fd2))
-        return NULL;
-    if (!_PyVerify_fd_dup2(fd, fd2))
-        return posix_error();
-    Py_BEGIN_ALLOW_THREADS
-    res = dup2(fd, fd2);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-
-
-PyDoc_STRVAR(posix_lseek__doc__,
-"lseek(fd, pos, how) -> newpos\n\n\
-Set the current position of a file descriptor.");
-
-static PyObject *
-posix_lseek(PyObject *self, PyObject *args)
-{
-    int fd, how;
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
-    PY_LONG_LONG pos, res;
-#else
-    off_t pos, res;
-#endif
-    PyObject *posobj;
-    if (!PyArg_ParseTuple(args, "iOi:lseek", &fd, &posobj, &how))
-        return NULL;
-#ifdef SEEK_SET
-    /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
-    switch (how) {
-    case 0: how = SEEK_SET; break;
-    case 1: how = SEEK_CUR; break;
-    case 2: how = SEEK_END; break;
-    }
-#endif /* SEEK_END */
-
-#if !defined(HAVE_LARGEFILE_SUPPORT)
-    pos = PyInt_AsLong(posobj);
-#else
-    pos = PyLong_Check(posobj) ?
-        PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj);
-#endif
-    if (PyErr_Occurred())
-        return NULL;
-
-    if (!_PyVerify_fd(fd))
-        return posix_error();
-    Py_BEGIN_ALLOW_THREADS
-#if defined(MS_WIN64) || defined(MS_WINDOWS)
-    res = _lseeki64(fd, pos, how);
-#else
-    res = lseek(fd, pos, how);
-#endif
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error();
-
-#if !defined(HAVE_LARGEFILE_SUPPORT)
-    return PyInt_FromLong(res);
-#else
-    return PyLong_FromLongLong(res);
-#endif
-}
-
-
-PyDoc_STRVAR(posix_read__doc__,
-"read(fd, buffersize) -> string\n\n\
-Read a file descriptor.");
-
-static PyObject *
-posix_read(PyObject *self, PyObject *args)
-{
-    int fd, size, n;
-    PyObject *buffer;
-    if (!PyArg_ParseTuple(args, "ii:read", &fd, &size))
-        return NULL;
-    if (size < 0) {
-        errno = EINVAL;
-        return posix_error();
-    }
-    buffer = PyString_FromStringAndSize((char *)NULL, size);
-    if (buffer == NULL)
-        return NULL;
-    if (!_PyVerify_fd(fd)) {
-        Py_DECREF(buffer);
-        return posix_error();
-    }
-    Py_BEGIN_ALLOW_THREADS
-    n = read(fd, PyString_AsString(buffer), size);
-    Py_END_ALLOW_THREADS
-    if (n < 0) {
-        Py_DECREF(buffer);
-        return posix_error();
-    }
-    if (n != size)
-        _PyString_Resize(&buffer, n);
-    return buffer;
-}
-
-
-PyDoc_STRVAR(posix_write__doc__,
-"write(fd, string) -> byteswritten\n\n\
-Write a string to a file descriptor.");
-
-static PyObject *
-posix_write(PyObject *self, PyObject *args)
-{
-    Py_buffer pbuf;
-    int fd;
-    Py_ssize_t size;
-
-    if (!PyArg_ParseTuple(args, "is*:write", &fd, &pbuf))
-        return NULL;
-    if (!_PyVerify_fd(fd)) {
-        PyBuffer_Release(&pbuf);
-        return posix_error();
-    }
-    Py_BEGIN_ALLOW_THREADS
-    size = write(fd, pbuf.buf, (size_t)pbuf.len);
-    Py_END_ALLOW_THREADS
-    PyBuffer_Release(&pbuf);
-    if (size < 0)
-        return posix_error();
-    return PyInt_FromSsize_t(size);
-}
-
-
-PyDoc_STRVAR(posix_fstat__doc__,
-"fstat(fd) -> stat result\n\n\
-Like stat(), but for an open file descriptor.");
-
-static PyObject *
-posix_fstat(PyObject *self, PyObject *args)
-{
-    int fd;
-    STRUCT_STAT st;
-    int res;
-    if (!PyArg_ParseTuple(args, "i:fstat", &fd))
-        return NULL;
-#ifdef __VMS
-    /* on OpenVMS we must ensure that all bytes are written to the file */
-    fsync(fd);
-#endif
-    if (!_PyVerify_fd(fd))
-        return posix_error();
-    Py_BEGIN_ALLOW_THREADS
-    res = FSTAT(fd, &st);
-    Py_END_ALLOW_THREADS
-    if (res != 0) {
-#ifdef MS_WINDOWS
-        return win32_error("fstat", NULL);
-#else
-        return posix_error();
-#endif
-    }
-
-    return _pystat_fromstructstat(&st);
-}
-
-
-PyDoc_STRVAR(posix_fdopen__doc__,
-"fdopen(fd [, mode='r' [, bufsize]]) -> file_object\n\n\
-Return an open file object connected to a file descriptor.");
-
-static PyObject *
-posix_fdopen(PyObject *self, PyObject *args)
-{
-    int fd;
-    char *orgmode = "r";
-    int bufsize = -1;
-    FILE *fp;
-    PyObject *f;
-    char *mode;
-    if (!PyArg_ParseTuple(args, "i|si", &fd, &orgmode, &bufsize))
-        return NULL;
-
-    /* Sanitize mode.  See fileobject.c */
-    mode = PyMem_MALLOC(strlen(orgmode)+3);
-    if (!mode) {
-        PyErr_NoMemory();
-        return NULL;
-    }
-    strcpy(mode, orgmode);
-    if (_PyFile_SanitizeMode(mode)) {
-        PyMem_FREE(mode);
-        return NULL;
-    }
-    if (!_PyVerify_fd(fd))
-        return posix_error();
-    Py_BEGIN_ALLOW_THREADS
-#if !defined(MS_WINDOWS) && defined(HAVE_FCNTL_H)
-    if (mode[0] == 'a') {
-        /* try to make sure the O_APPEND flag is set */
-        int flags;
-        flags = fcntl(fd, F_GETFL);
-        if (flags != -1)
-            fcntl(fd, F_SETFL, flags | O_APPEND);
-        fp = fdopen(fd, mode);
-        if (fp == NULL && flags != -1)
-            /* restore old mode if fdopen failed */
-            fcntl(fd, F_SETFL, flags);
-    } else {
-        fp = fdopen(fd, mode);
-    }
-#else
-    fp = fdopen(fd, mode);
-#endif
-    Py_END_ALLOW_THREADS
-    PyMem_FREE(mode);
-    if (fp == NULL)
-        return posix_error();
-    f = PyFile_FromFile(fp, "<fdopen>", orgmode, fclose);
-    if (f != NULL)
-        PyFile_SetBufSize(f, bufsize);
-    return f;
-}
-
-PyDoc_STRVAR(posix_isatty__doc__,
-"isatty(fd) -> bool\n\n\
-Return True if the file descriptor 'fd' is an open file descriptor\n\
-connected to the slave end of a terminal.");
-
-static PyObject *
-posix_isatty(PyObject *self, PyObject *args)
-{
-    int fd;
-    if (!PyArg_ParseTuple(args, "i:isatty", &fd))
-        return NULL;
-    if (!_PyVerify_fd(fd))
-        return PyBool_FromLong(0);
-    return PyBool_FromLong(isatty(fd));
-}
-
-#ifdef HAVE_PIPE
-PyDoc_STRVAR(posix_pipe__doc__,
-"pipe() -> (read_end, write_end)\n\n\
-Create a pipe.");
-
-static PyObject *
-posix_pipe(PyObject *self, PyObject *noargs)
-{
-#if defined(PYOS_OS2)
-    HFILE read, write;
-    APIRET rc;
-
-    Py_BEGIN_ALLOW_THREADS
-    rc = DosCreatePipe( &read, &write, 4096);
-    Py_END_ALLOW_THREADS
-    if (rc != NO_ERROR)
-        return os2_error(rc);
-
-    return Py_BuildValue("(ii)", read, write);
-#else
-#if !defined(MS_WINDOWS)
-    int fds[2];
-    int res;
-    Py_BEGIN_ALLOW_THREADS
-    res = pipe(fds);
-    Py_END_ALLOW_THREADS
-    if (res != 0)
-        return posix_error();
-    return Py_BuildValue("(ii)", fds[0], fds[1]);
-#else /* MS_WINDOWS */
-    HANDLE read, write;
-    int read_fd, write_fd;
-    BOOL ok;
-    Py_BEGIN_ALLOW_THREADS
-    ok = CreatePipe(&read, &write, NULL, 0);
-    Py_END_ALLOW_THREADS
-    if (!ok)
-        return win32_error("CreatePipe", NULL);
-    read_fd = _open_osfhandle((Py_intptr_t)read, 0);
-    write_fd = _open_osfhandle((Py_intptr_t)write, 1);
-    return Py_BuildValue("(ii)", read_fd, write_fd);
-#endif /* MS_WINDOWS */
-#endif
-}
-#endif  /* HAVE_PIPE */
-
-
-#ifdef HAVE_MKFIFO
-PyDoc_STRVAR(posix_mkfifo__doc__,
-"mkfifo(filename [, mode=0666])\n\n\
-Create a FIFO (a POSIX named pipe).");
-
-static PyObject *
-posix_mkfifo(PyObject *self, PyObject *args)
-{
-    char *filename;
-    int mode = 0666;
-    int res;
-    if (!PyArg_ParseTuple(args, "s|i:mkfifo", &filename, &mode))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = mkfifo(filename, mode);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif
-
-
-#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)
-PyDoc_STRVAR(posix_mknod__doc__,
-"mknod(filename [, mode=0600, device])\n\n\
-Create a filesystem node (file, device special file or named pipe)\n\
-named filename. mode specifies both the permissions to use and the\n\
-type of node to be created, being combined (bitwise OR) with one of\n\
-S_IFREG, S_IFCHR, S_IFBLK, and S_IFIFO. For S_IFCHR and S_IFBLK,\n\
-device defines the newly created device special file (probably using\n\
-os.makedev()), otherwise it is ignored.");
-
-
-static PyObject *
-posix_mknod(PyObject *self, PyObject *args)
-{
-    char *filename;
-    int mode = 0600;
-    int device = 0;
-    int res;
-    if (!PyArg_ParseTuple(args, "s|ii:mknod", &filename, &mode, &device))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = mknod(filename, mode, device);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif
-
-#ifdef HAVE_DEVICE_MACROS
-PyDoc_STRVAR(posix_major__doc__,
-"major(device) -> major number\n\
-Extracts a device major number from a raw device number.");
-
-static PyObject *
-posix_major(PyObject *self, PyObject *args)
-{
-    int device;
-    if (!PyArg_ParseTuple(args, "i:major", &device))
-        return NULL;
-    return PyInt_FromLong((long)major(device));
-}
-
-PyDoc_STRVAR(posix_minor__doc__,
-"minor(device) -> minor number\n\
-Extracts a device minor number from a raw device number.");
-
-static PyObject *
-posix_minor(PyObject *self, PyObject *args)
-{
-    int device;
-    if (!PyArg_ParseTuple(args, "i:minor", &device))
-        return NULL;
-    return PyInt_FromLong((long)minor(device));
-}
-
-PyDoc_STRVAR(posix_makedev__doc__,
-"makedev(major, minor) -> device number\n\
-Composes a raw device number from the major and minor device numbers.");
-
-static PyObject *
-posix_makedev(PyObject *self, PyObject *args)
-{
-    int major, minor;
-    if (!PyArg_ParseTuple(args, "ii:makedev", &major, &minor))
-        return NULL;
-    return PyInt_FromLong((long)makedev(major, minor));
-}
-#endif /* device macros */
-
-
-#ifdef HAVE_FTRUNCATE
-PyDoc_STRVAR(posix_ftruncate__doc__,
-"ftruncate(fd, length)\n\n\
-Truncate a file to a specified length.");
-
-static PyObject *
-posix_ftruncate(PyObject *self, PyObject *args)
-{
-    int fd;
-    off_t length;
-    int res;
-    PyObject *lenobj;
-
-    if (!PyArg_ParseTuple(args, "iO:ftruncate", &fd, &lenobj))
-        return NULL;
-
-#if !defined(HAVE_LARGEFILE_SUPPORT)
-    length = PyInt_AsLong(lenobj);
-#else
-    length = PyLong_Check(lenobj) ?
-        PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj);
-#endif
-    if (PyErr_Occurred())
-        return NULL;
-
-    Py_BEGIN_ALLOW_THREADS
-    res = ftruncate(fd, length);
-    Py_END_ALLOW_THREADS
-    if (res < 0)
-        return posix_error();
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif
-
-#ifdef HAVE_PUTENV
-PyDoc_STRVAR(posix_putenv__doc__,
-"putenv(key, value)\n\n\
-Change or add an environment variable.");
-
-/* Save putenv() parameters as values here, so we can collect them when they
- * get re-set with another call for the same key. */
-static PyObject *posix_putenv_garbage;
-
-static PyObject *
-posix_putenv(PyObject *self, PyObject *args)
-{
-    char *s1, *s2;
-    char *newenv;
-    PyObject *newstr;
-    size_t len;
-
-    if (!PyArg_ParseTuple(args, "ss:putenv", &s1, &s2))
-        return NULL;
-
-#if defined(PYOS_OS2)
-    if (stricmp(s1, "BEGINLIBPATH") == 0) {
-        APIRET rc;
-
-        rc = DosSetExtLIBPATH(s2, BEGIN_LIBPATH);
-        if (rc != NO_ERROR)
-            return os2_error(rc);
-
-    } else if (stricmp(s1, "ENDLIBPATH") == 0) {
-        APIRET rc;
-
-        rc = DosSetExtLIBPATH(s2, END_LIBPATH);
-        if (rc != NO_ERROR)
-            return os2_error(rc);
-    } else {
-#endif
-
-    /* XXX This can leak memory -- not easy to fix :-( */
-    len = strlen(s1) + strlen(s2) + 2;
-    /* len includes space for a trailing \0; the size arg to
-       PyString_FromStringAndSize does not count that */
-    newstr = PyString_FromStringAndSize(NULL, (int)len - 1);
-    if (newstr == NULL)
-        return PyErr_NoMemory();
-    newenv = PyString_AS_STRING(newstr);
-    PyOS_snprintf(newenv, len, "%s=%s", s1, s2);
-    if (putenv(newenv)) {
-        Py_DECREF(newstr);
-        posix_error();
-        return NULL;
-    }
-    /* Install the first arg and newstr in posix_putenv_garbage;
-     * this will cause previous value to be collected.  This has to
-     * happen after the real putenv() call because the old value
-     * was still accessible until then. */
-    if (PyDict_SetItem(posix_putenv_garbage,
-                       PyTuple_GET_ITEM(args, 0), newstr)) {
-        /* really not much we can do; just leak */
-        PyErr_Clear();
-    }
-    else {
-        Py_DECREF(newstr);
-    }
-
-#if defined(PYOS_OS2)
-    }
-#endif
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif /* putenv */
-
-#ifdef HAVE_UNSETENV
-PyDoc_STRVAR(posix_unsetenv__doc__,
-"unsetenv(key)\n\n\
-Delete an environment variable.");
-
-static PyObject *
-posix_unsetenv(PyObject *self, PyObject *args)
-{
-    char *s1;
-
-    if (!PyArg_ParseTuple(args, "s:unsetenv", &s1))
-        return NULL;
-
-    unsetenv(s1);
-
-    /* Remove the key from posix_putenv_garbage;
-     * this will cause it to be collected.  This has to
-     * happen after the real unsetenv() call because the
-     * old value was still accessible until then.
-     */
-    if (PyDict_DelItem(posix_putenv_garbage,
-                       PyTuple_GET_ITEM(args, 0))) {
-        /* really not much we can do; just leak */
-        PyErr_Clear();
-    }
-
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif /* unsetenv */
-
-PyDoc_STRVAR(posix_strerror__doc__,
-"strerror(code) -> string\n\n\
-Translate an error code to a message string.");
-
-static PyObject *
-posix_strerror(PyObject *self, PyObject *args)
-{
-    int code;
-    char *message;
-    if (!PyArg_ParseTuple(args, "i:strerror", &code))
-        return NULL;
-    message = strerror(code);
-    if (message == NULL) {
-        PyErr_SetString(PyExc_ValueError,
-                        "strerror() argument out of range");
-        return NULL;
-    }
-    return PyString_FromString(message);
-}
-
-
-#ifdef HAVE_SYS_WAIT_H
-
-#ifdef WCOREDUMP
-PyDoc_STRVAR(posix_WCOREDUMP__doc__,
-"WCOREDUMP(status) -> bool\n\n\
-Return True if the process returning 'status' was dumped to a core file.");
-
-static PyObject *
-posix_WCOREDUMP(PyObject *self, PyObject *args)
-{
-    WAIT_TYPE status;
-    WAIT_STATUS_INT(status) = 0;
-
-    if (!PyArg_ParseTuple(args, "i:WCOREDUMP", &WAIT_STATUS_INT(status)))
-        return NULL;
-
-    return PyBool_FromLong(WCOREDUMP(status));
-}
-#endif /* WCOREDUMP */
-
-#ifdef WIFCONTINUED
-PyDoc_STRVAR(posix_WIFCONTINUED__doc__,
-"WIFCONTINUED(status) -> bool\n\n\
-Return True if the process returning 'status' was continued from a\n\
-job control stop.");
-
-static PyObject *
-posix_WIFCONTINUED(PyObject *self, PyObject *args)
-{
-    WAIT_TYPE status;
-    WAIT_STATUS_INT(status) = 0;
-
-    if (!PyArg_ParseTuple(args, "i:WCONTINUED", &WAIT_STATUS_INT(status)))
-        return NULL;
-
-    return PyBool_FromLong(WIFCONTINUED(status));
-}
-#endif /* WIFCONTINUED */
-
-#ifdef WIFSTOPPED
-PyDoc_STRVAR(posix_WIFSTOPPED__doc__,
-"WIFSTOPPED(status) -> bool\n\n\
-Return True if the process returning 'status' was stopped.");
-
-static PyObject *
-posix_WIFSTOPPED(PyObject *self, PyObject *args)
-{
-    WAIT_TYPE status;
-    WAIT_STATUS_INT(status) = 0;
-
-    if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &WAIT_STATUS_INT(status)))
-        return NULL;
-
-    return PyBool_FromLong(WIFSTOPPED(status));
-}
-#endif /* WIFSTOPPED */
-
-#ifdef WIFSIGNALED
-PyDoc_STRVAR(posix_WIFSIGNALED__doc__,
-"WIFSIGNALED(status) -> bool\n\n\
-Return True if the process returning 'status' was terminated by a signal.");
-
-static PyObject *
-posix_WIFSIGNALED(PyObject *self, PyObject *args)
-{
-    WAIT_TYPE status;
-    WAIT_STATUS_INT(status) = 0;
-
-    if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &WAIT_STATUS_INT(status)))
-        return NULL;
-
-    return PyBool_FromLong(WIFSIGNALED(status));
-}
-#endif /* WIFSIGNALED */
-
-#ifdef WIFEXITED
-PyDoc_STRVAR(posix_WIFEXITED__doc__,
-"WIFEXITED(status) -> bool\n\n\
-Return true if the process returning 'status' exited using the exit()\n\
-system call.");
-
-static PyObject *
-posix_WIFEXITED(PyObject *self, PyObject *args)
-{
-    WAIT_TYPE status;
-    WAIT_STATUS_INT(status) = 0;
-
-    if (!PyArg_ParseTuple(args, "i:WIFEXITED", &WAIT_STATUS_INT(status)))
-        return NULL;
-
-    return PyBool_FromLong(WIFEXITED(status));
-}
-#endif /* WIFEXITED */
-
-#ifdef WEXITSTATUS
-PyDoc_STRVAR(posix_WEXITSTATUS__doc__,
-"WEXITSTATUS(status) -> integer\n\n\
-Return the process return code from 'status'.");
-
-static PyObject *
-posix_WEXITSTATUS(PyObject *self, PyObject *args)
-{
-    WAIT_TYPE status;
-    WAIT_STATUS_INT(status) = 0;
-
-    if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &WAIT_STATUS_INT(status)))
-        return NULL;
-
-    return Py_BuildValue("i", WEXITSTATUS(status));
-}
-#endif /* WEXITSTATUS */
-
-#ifdef WTERMSIG
-PyDoc_STRVAR(posix_WTERMSIG__doc__,
-"WTERMSIG(status) -> integer\n\n\
-Return the signal that terminated the process that provided the 'status'\n\
-value.");
-
-static PyObject *
-posix_WTERMSIG(PyObject *self, PyObject *args)
-{
-    WAIT_TYPE status;
-    WAIT_STATUS_INT(status) = 0;
-
-    if (!PyArg_ParseTuple(args, "i:WTERMSIG", &WAIT_STATUS_INT(status)))
-        return NULL;
-
-    return Py_BuildValue("i", WTERMSIG(status));
-}
-#endif /* WTERMSIG */
-
-#ifdef WSTOPSIG
-PyDoc_STRVAR(posix_WSTOPSIG__doc__,
-"WSTOPSIG(status) -> integer\n\n\
-Return the signal that stopped the process that provided\n\
-the 'status' value.");
-
-static PyObject *
-posix_WSTOPSIG(PyObject *self, PyObject *args)
-{
-    WAIT_TYPE status;
-    WAIT_STATUS_INT(status) = 0;
-
-    if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &WAIT_STATUS_INT(status)))
-        return NULL;
-
-    return Py_BuildValue("i", WSTOPSIG(status));
-}
-#endif /* WSTOPSIG */
-
-#endif /* HAVE_SYS_WAIT_H */
-
-
-#if defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H)
-#ifdef _SCO_DS
-/* SCO OpenServer 5.0 and later requires _SVID3 before it reveals the
-   needed definitions in sys/statvfs.h */
-#define _SVID3
-#endif
-#include <sys/statvfs.h>
-
-static PyObject*
-_pystatvfs_fromstructstatvfs(struct statvfs st) {
-    PyObject *v = PyStructSequence_New(&StatVFSResultType);
-    if (v == NULL)
-        return NULL;
-
-#if !defined(HAVE_LARGEFILE_SUPPORT)
-    PyStructSequence_SET_ITEM(v, 0, PyInt_FromLong((long) st.f_bsize));
-    PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long) st.f_frsize));
-    PyStructSequence_SET_ITEM(v, 2, PyInt_FromLong((long) st.f_blocks));
-    PyStructSequence_SET_ITEM(v, 3, PyInt_FromLong((long) st.f_bfree));
-    PyStructSequence_SET_ITEM(v, 4, PyInt_FromLong((long) st.f_bavail));
-    PyStructSequence_SET_ITEM(v, 5, PyInt_FromLong((long) st.f_files));
-    PyStructSequence_SET_ITEM(v, 6, PyInt_FromLong((long) st.f_ffree));
-    PyStructSequence_SET_ITEM(v, 7, PyInt_FromLong((long) st.f_favail));
-    PyStructSequence_SET_ITEM(v, 8, PyInt_FromLong((long) st.f_flag));
-    PyStructSequence_SET_ITEM(v, 9, PyInt_FromLong((long) st.f_namemax));
-#else
-    PyStructSequence_SET_ITEM(v, 0, PyInt_FromLong((long) st.f_bsize));
-    PyStructSequence_SET_ITEM(v, 1, PyInt_FromLong((long) st.f_frsize));
-    PyStructSequence_SET_ITEM(v, 2,
-                              PyLong_FromLongLong((PY_LONG_LONG) st.f_blocks));
-    PyStructSequence_SET_ITEM(v, 3,
-                              PyLong_FromLongLong((PY_LONG_LONG) st.f_bfree));
-    PyStructSequence_SET_ITEM(v, 4,
-                              PyLong_FromLongLong((PY_LONG_LONG) st.f_bavail));
-    PyStructSequence_SET_ITEM(v, 5,
-                              PyLong_FromLongLong((PY_LONG_LONG) st.f_files));
-    PyStructSequence_SET_ITEM(v, 6,
-                              PyLong_FromLongLong((PY_LONG_LONG) st.f_ffree));
-    PyStructSequence_SET_ITEM(v, 7,
-                              PyLong_FromLongLong((PY_LONG_LONG) st.f_favail));
-    PyStructSequence_SET_ITEM(v, 8, PyInt_FromLong((long) st.f_flag));
-    PyStructSequence_SET_ITEM(v, 9, PyInt_FromLong((long) st.f_namemax));
-#endif
-
-    return v;
-}
-
-PyDoc_STRVAR(posix_fstatvfs__doc__,
-"fstatvfs(fd) -> statvfs result\n\n\
-Perform an fstatvfs system call on the given fd.");
-
-static PyObject *
-posix_fstatvfs(PyObject *self, PyObject *args)
-{
-    int fd, res;
-    struct statvfs st;
-
-    if (!PyArg_ParseTuple(args, "i:fstatvfs", &fd))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = fstatvfs(fd, &st);
-    Py_END_ALLOW_THREADS
-    if (res != 0)
-        return posix_error();
-
-    return _pystatvfs_fromstructstatvfs(st);
-}
-#endif /* HAVE_FSTATVFS && HAVE_SYS_STATVFS_H */
-
-
-#if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H)
-#include <sys/statvfs.h>
-
-PyDoc_STRVAR(posix_statvfs__doc__,
-"statvfs(path) -> statvfs result\n\n\
-Perform a statvfs system call on the given path.");
-
-static PyObject *
-posix_statvfs(PyObject *self, PyObject *args)
-{
-    char *path;
-    int res;
-    struct statvfs st;
-    if (!PyArg_ParseTuple(args, "s:statvfs", &path))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    res = statvfs(path, &st);
-    Py_END_ALLOW_THREADS
-    if (res != 0)
-        return posix_error_with_filename(path);
-
-    return _pystatvfs_fromstructstatvfs(st);
-}
-#endif /* HAVE_STATVFS */
-
-
-#ifdef HAVE_TEMPNAM
-PyDoc_STRVAR(posix_tempnam__doc__,
-"tempnam([dir[, prefix]]) -> string\n\n\
-Return a unique name for a temporary file.\n\
-The directory and a prefix may be specified as strings; they may be omitted\n\
-or None if not needed.");
-
-static PyObject *
-posix_tempnam(PyObject *self, PyObject *args)
-{
-    PyObject *result = NULL;
-    char *dir = NULL;
-    char *pfx = NULL;
-    char *name;
-
-    if (!PyArg_ParseTuple(args, "|zz:tempnam", &dir, &pfx))
-    return NULL;
-
-    if (PyErr_Warn(PyExc_RuntimeWarning,
-                   "tempnam is a potential security risk to your program") < 0)
-        return NULL;
-
-#ifdef MS_WINDOWS
-    name = _tempnam(dir, pfx);
-#else
-    name = tempnam(dir, pfx);
-#endif
-    if (name == NULL)
-    return PyErr_NoMemory();
-    result = PyString_FromString(name);
-    free(name);
-    return result;
-}
-#endif
-
-
-#ifdef HAVE_TMPFILE
-PyDoc_STRVAR(posix_tmpfile__doc__,
-"tmpfile() -> file object\n\n\
-Create a temporary file with no directory entries.");
-
-static PyObject *
-posix_tmpfile(PyObject *self, PyObject *noargs)
-{
-    FILE *fp;
-
-    fp = tmpfile();
-    if (fp == NULL)
-    return posix_error();
-    return PyFile_FromFile(fp, "<tmpfile>", "w+b", fclose);
-}
-#endif
-
-
-#ifdef HAVE_TMPNAM
-PyDoc_STRVAR(posix_tmpnam__doc__,
-"tmpnam() -> string\n\n\
-Return a unique name for a temporary file.");
-
-static PyObject *
-posix_tmpnam(PyObject *self, PyObject *noargs)
-{
-    char buffer[L_tmpnam];
-    char *name;
-
-    if (PyErr_Warn(PyExc_RuntimeWarning,
-                   "tmpnam is a potential security risk to your program") < 0)
-        return NULL;
-
-#ifdef USE_TMPNAM_R
-    name = tmpnam_r(buffer);
-#else
-    name = tmpnam(buffer);
-#endif
-    if (name == NULL) {
-    PyObject *err = Py_BuildValue("is", 0,
-#ifdef USE_TMPNAM_R
-                                  "unexpected NULL from tmpnam_r"
-#else
-                                  "unexpected NULL from tmpnam"
-#endif
-                                  );
-    PyErr_SetObject(PyExc_OSError, err);
-    Py_XDECREF(err);
-    return NULL;
-    }
-    return PyString_FromString(buffer);
-}
-#endif
-
-
-/* This is used for fpathconf(), pathconf(), confstr() and sysconf().
- * It maps strings representing configuration variable names to
- * integer values, allowing those functions to be called with the
- * magic names instead of polluting the module's namespace with tons of
- * rarely-used constants.  There are three separate tables that use
- * these definitions.
- *
- * This code is always included, even if none of the interfaces that
- * need it are included.  The #if hackery needed to avoid it would be
- * sufficiently pervasive that it's not worth the loss of readability.
- */
-struct constdef {
-    char *name;
-    long value;
-};
-
-static int
-conv_confname(PyObject *arg, int *valuep, struct constdef *table,
-              size_t tablesize)
-{
-    if (PyInt_Check(arg)) {
-        *valuep = PyInt_AS_LONG(arg);
-        return 1;
-    }
-    if (PyString_Check(arg)) {
-        /* look up the value in the table using a binary search */
-        size_t lo = 0;
-        size_t mid;
-        size_t hi = tablesize;
-        int cmp;
-        char *confname = PyString_AS_STRING(arg);
-        while (lo < hi) {
-            mid = (lo + hi) / 2;
-            cmp = strcmp(confname, table[mid].name);
-            if (cmp < 0)
-                hi = mid;
-            else if (cmp > 0)
-                lo = mid + 1;
-            else {
-                *valuep = table[mid].value;
-                return 1;
-            }
-        }
-        PyErr_SetString(PyExc_ValueError, "unrecognized configuration name");
-    }
-    else
-        PyErr_SetString(PyExc_TypeError,
-                        "configuration names must be strings or integers");
-    return 0;
-}
-
-
-#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
-static struct constdef  posix_constants_pathconf[] = {
-#ifdef _PC_ABI_AIO_XFER_MAX
-    {"PC_ABI_AIO_XFER_MAX",     _PC_ABI_AIO_XFER_MAX},
-#endif
-#ifdef _PC_ABI_ASYNC_IO
-    {"PC_ABI_ASYNC_IO", _PC_ABI_ASYNC_IO},
-#endif
-#ifdef _PC_ASYNC_IO
-    {"PC_ASYNC_IO",     _PC_ASYNC_IO},
-#endif
-#ifdef _PC_CHOWN_RESTRICTED
-    {"PC_CHOWN_RESTRICTED",     _PC_CHOWN_RESTRICTED},
-#endif
-#ifdef _PC_FILESIZEBITS
-    {"PC_FILESIZEBITS", _PC_FILESIZEBITS},
-#endif
-#ifdef _PC_LAST
-    {"PC_LAST", _PC_LAST},
-#endif
-#ifdef _PC_LINK_MAX
-    {"PC_LINK_MAX",     _PC_LINK_MAX},
-#endif
-#ifdef _PC_MAX_CANON
-    {"PC_MAX_CANON",    _PC_MAX_CANON},
-#endif
-#ifdef _PC_MAX_INPUT
-    {"PC_MAX_INPUT",    _PC_MAX_INPUT},
-#endif
-#ifdef _PC_NAME_MAX
-    {"PC_NAME_MAX",     _PC_NAME_MAX},
-#endif
-#ifdef _PC_NO_TRUNC
-    {"PC_NO_TRUNC",     _PC_NO_TRUNC},
-#endif
-#ifdef _PC_PATH_MAX
-    {"PC_PATH_MAX",     _PC_PATH_MAX},
-#endif
-#ifdef _PC_PIPE_BUF
-    {"PC_PIPE_BUF",     _PC_PIPE_BUF},
-#endif
-#ifdef _PC_PRIO_IO
-    {"PC_PRIO_IO",      _PC_PRIO_IO},
-#endif
-#ifdef _PC_SOCK_MAXBUF
-    {"PC_SOCK_MAXBUF",  _PC_SOCK_MAXBUF},
-#endif
-#ifdef _PC_SYNC_IO
-    {"PC_SYNC_IO",      _PC_SYNC_IO},
-#endif
-#ifdef _PC_VDISABLE
-    {"PC_VDISABLE",     _PC_VDISABLE},
-#endif
-};
-
-static int
-conv_path_confname(PyObject *arg, int *valuep)
-{
-    return conv_confname(arg, valuep, posix_constants_pathconf,
-                         sizeof(posix_constants_pathconf)
-                           / sizeof(struct constdef));
-}
-#endif
-
-#ifdef HAVE_FPATHCONF
-PyDoc_STRVAR(posix_fpathconf__doc__,
-"fpathconf(fd, name) -> integer\n\n\
-Return the configuration limit name for the file descriptor fd.\n\
-If there is no limit, return -1.");
-
-static PyObject *
-posix_fpathconf(PyObject *self, PyObject *args)
-{
-    PyObject *result = NULL;
-    int name, fd;
-
-    if (PyArg_ParseTuple(args, "iO&:fpathconf", &fd,
-                         conv_path_confname, &name)) {
-        long limit;
-
-        errno = 0;
-        limit = fpathconf(fd, name);
-        if (limit == -1 && errno != 0)
-            posix_error();
-        else
-            result = PyInt_FromLong(limit);
-    }
-    return result;
-}
-#endif
-
-
-#ifdef HAVE_PATHCONF
-PyDoc_STRVAR(posix_pathconf__doc__,
-"pathconf(path, name) -> integer\n\n\
-Return the configuration limit name for the file or directory path.\n\
-If there is no limit, return -1.");
-
-static PyObject *
-posix_pathconf(PyObject *self, PyObject *args)
-{
-    PyObject *result = NULL;
-    int name;
-    char *path;
-
-    if (PyArg_ParseTuple(args, "sO&:pathconf", &path,
-                         conv_path_confname, &name)) {
-    long limit;
-
-    errno = 0;
-    limit = pathconf(path, name);
-    if (limit == -1 && errno != 0) {
-        if (errno == EINVAL)
-            /* could be a path or name problem */
-            posix_error();
-        else
-            posix_error_with_filename(path);
-    }
-    else
-        result = PyInt_FromLong(limit);
-    }
-    return result;
-}
-#endif
-
-#ifdef HAVE_CONFSTR
-static struct constdef posix_constants_confstr[] = {
-#ifdef _CS_ARCHITECTURE
-    {"CS_ARCHITECTURE", _CS_ARCHITECTURE},
-#endif
-#ifdef _CS_HOSTNAME
-    {"CS_HOSTNAME",     _CS_HOSTNAME},
-#endif
-#ifdef _CS_HW_PROVIDER
-    {"CS_HW_PROVIDER",  _CS_HW_PROVIDER},
-#endif
-#ifdef _CS_HW_SERIAL
-    {"CS_HW_SERIAL",    _CS_HW_SERIAL},
-#endif
-#ifdef _CS_INITTAB_NAME
-    {"CS_INITTAB_NAME", _CS_INITTAB_NAME},
-#endif
-#ifdef _CS_LFS64_CFLAGS
-    {"CS_LFS64_CFLAGS", _CS_LFS64_CFLAGS},
-#endif
-#ifdef _CS_LFS64_LDFLAGS
-    {"CS_LFS64_LDFLAGS",        _CS_LFS64_LDFLAGS},
-#endif
-#ifdef _CS_LFS64_LIBS
-    {"CS_LFS64_LIBS",   _CS_LFS64_LIBS},
-#endif
-#ifdef _CS_LFS64_LINTFLAGS
-    {"CS_LFS64_LINTFLAGS",      _CS_LFS64_LINTFLAGS},
-#endif
-#ifdef _CS_LFS_CFLAGS
-    {"CS_LFS_CFLAGS",   _CS_LFS_CFLAGS},
-#endif
-#ifdef _CS_LFS_LDFLAGS
-    {"CS_LFS_LDFLAGS",  _CS_LFS_LDFLAGS},
-#endif
-#ifdef _CS_LFS_LIBS
-    {"CS_LFS_LIBS",     _CS_LFS_LIBS},
-#endif
-#ifdef _CS_LFS_LINTFLAGS
-    {"CS_LFS_LINTFLAGS",        _CS_LFS_LINTFLAGS},
-#endif
-#ifdef _CS_MACHINE
-    {"CS_MACHINE",      _CS_MACHINE},
-#endif
-#ifdef _CS_PATH
-    {"CS_PATH", _CS_PATH},
-#endif
-#ifdef _CS_RELEASE
-    {"CS_RELEASE",      _CS_RELEASE},
-#endif
-#ifdef _CS_SRPC_DOMAIN
-    {"CS_SRPC_DOMAIN",  _CS_SRPC_DOMAIN},
-#endif
-#ifdef _CS_SYSNAME
-    {"CS_SYSNAME",      _CS_SYSNAME},
-#endif
-#ifdef _CS_VERSION
-    {"CS_VERSION",      _CS_VERSION},
-#endif
-#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS
-    {"CS_XBS5_ILP32_OFF32_CFLAGS",      _CS_XBS5_ILP32_OFF32_CFLAGS},
-#endif
-#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS
-    {"CS_XBS5_ILP32_OFF32_LDFLAGS",     _CS_XBS5_ILP32_OFF32_LDFLAGS},
-#endif
-#ifdef _CS_XBS5_ILP32_OFF32_LIBS
-    {"CS_XBS5_ILP32_OFF32_LIBS",        _CS_XBS5_ILP32_OFF32_LIBS},
-#endif
-#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS
-    {"CS_XBS5_ILP32_OFF32_LINTFLAGS",   _CS_XBS5_ILP32_OFF32_LINTFLAGS},
-#endif
-#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS
-    {"CS_XBS5_ILP32_OFFBIG_CFLAGS",     _CS_XBS5_ILP32_OFFBIG_CFLAGS},
-#endif
-#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS
-    {"CS_XBS5_ILP32_OFFBIG_LDFLAGS",    _CS_XBS5_ILP32_OFFBIG_LDFLAGS},
-#endif
-#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS
-    {"CS_XBS5_ILP32_OFFBIG_LIBS",       _CS_XBS5_ILP32_OFFBIG_LIBS},
-#endif
-#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
-    {"CS_XBS5_ILP32_OFFBIG_LINTFLAGS",  _CS_XBS5_ILP32_OFFBIG_LINTFLAGS},
-#endif
-#ifdef _CS_XBS5_LP64_OFF64_CFLAGS
-    {"CS_XBS5_LP64_OFF64_CFLAGS",       _CS_XBS5_LP64_OFF64_CFLAGS},
-#endif
-#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS
-    {"CS_XBS5_LP64_OFF64_LDFLAGS",      _CS_XBS5_LP64_OFF64_LDFLAGS},
-#endif
-#ifdef _CS_XBS5_LP64_OFF64_LIBS
-    {"CS_XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS},
-#endif
-#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS
-    {"CS_XBS5_LP64_OFF64_LINTFLAGS",    _CS_XBS5_LP64_OFF64_LINTFLAGS},
-#endif
-#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS
-    {"CS_XBS5_LPBIG_OFFBIG_CFLAGS",     _CS_XBS5_LPBIG_OFFBIG_CFLAGS},
-#endif
-#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
-    {"CS_XBS5_LPBIG_OFFBIG_LDFLAGS",    _CS_XBS5_LPBIG_OFFBIG_LDFLAGS},
-#endif
-#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS
-    {"CS_XBS5_LPBIG_OFFBIG_LIBS",       _CS_XBS5_LPBIG_OFFBIG_LIBS},
-#endif
-#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
-    {"CS_XBS5_LPBIG_OFFBIG_LINTFLAGS",  _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS},
-#endif
-#ifdef _MIPS_CS_AVAIL_PROCESSORS
-    {"MIPS_CS_AVAIL_PROCESSORS",        _MIPS_CS_AVAIL_PROCESSORS},
-#endif
-#ifdef _MIPS_CS_BASE
-    {"MIPS_CS_BASE",    _MIPS_CS_BASE},
-#endif
-#ifdef _MIPS_CS_HOSTID
-    {"MIPS_CS_HOSTID",  _MIPS_CS_HOSTID},
-#endif
-#ifdef _MIPS_CS_HW_NAME
-    {"MIPS_CS_HW_NAME", _MIPS_CS_HW_NAME},
-#endif
-#ifdef _MIPS_CS_NUM_PROCESSORS
-    {"MIPS_CS_NUM_PROCESSORS",  _MIPS_CS_NUM_PROCESSORS},
-#endif
-#ifdef _MIPS_CS_OSREL_MAJ
-    {"MIPS_CS_OSREL_MAJ",       _MIPS_CS_OSREL_MAJ},
-#endif
-#ifdef _MIPS_CS_OSREL_MIN
-    {"MIPS_CS_OSREL_MIN",       _MIPS_CS_OSREL_MIN},
-#endif
-#ifdef _MIPS_CS_OSREL_PATCH
-    {"MIPS_CS_OSREL_PATCH",     _MIPS_CS_OSREL_PATCH},
-#endif
-#ifdef _MIPS_CS_OS_NAME
-    {"MIPS_CS_OS_NAME", _MIPS_CS_OS_NAME},
-#endif
-#ifdef _MIPS_CS_OS_PROVIDER
-    {"MIPS_CS_OS_PROVIDER",     _MIPS_CS_OS_PROVIDER},
-#endif
-#ifdef _MIPS_CS_PROCESSORS
-    {"MIPS_CS_PROCESSORS",      _MIPS_CS_PROCESSORS},
-#endif
-#ifdef _MIPS_CS_SERIAL
-    {"MIPS_CS_SERIAL",  _MIPS_CS_SERIAL},
-#endif
-#ifdef _MIPS_CS_VENDOR
-    {"MIPS_CS_VENDOR",  _MIPS_CS_VENDOR},
-#endif
-};
-
-static int
-conv_confstr_confname(PyObject *arg, int *valuep)
-{
-    return conv_confname(arg, valuep, posix_constants_confstr,
-                         sizeof(posix_constants_confstr)
-                           / sizeof(struct constdef));
-}
-
-PyDoc_STRVAR(posix_confstr__doc__,
-"confstr(name) -> string\n\n\
-Return a string-valued system configuration variable.");
-
-static PyObject *
-posix_confstr(PyObject *self, PyObject *args)
-{
-    PyObject *result = NULL;
-    int name;
-    char buffer[256];
-
-    if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) {
-    int len;
-
-    errno = 0;
-    len = confstr(name, buffer, sizeof(buffer));
-    if (len == 0) {
-        if (errno) {
-        posix_error();
-        }
-        else {
-        result = Py_None;
-        Py_INCREF(Py_None);
-        }
-    }
-    else {
-        if ((unsigned int)len >= sizeof(buffer)) {
-        result = PyString_FromStringAndSize(NULL, len-1);
-        if (result != NULL)
-            confstr(name, PyString_AS_STRING(result), len);
-        }
-        else
-        result = PyString_FromStringAndSize(buffer, len-1);
-    }
-    }
-    return result;
-}
-#endif
-
-
-#ifdef HAVE_SYSCONF
-static struct constdef posix_constants_sysconf[] = {
-#ifdef _SC_2_CHAR_TERM
-    {"SC_2_CHAR_TERM",  _SC_2_CHAR_TERM},
-#endif
-#ifdef _SC_2_C_BIND
-    {"SC_2_C_BIND",     _SC_2_C_BIND},
-#endif
-#ifdef _SC_2_C_DEV
-    {"SC_2_C_DEV",      _SC_2_C_DEV},
-#endif
-#ifdef _SC_2_C_VERSION
-    {"SC_2_C_VERSION",  _SC_2_C_VERSION},
-#endif
-#ifdef _SC_2_FORT_DEV
-    {"SC_2_FORT_DEV",   _SC_2_FORT_DEV},
-#endif
-#ifdef _SC_2_FORT_RUN
-    {"SC_2_FORT_RUN",   _SC_2_FORT_RUN},
-#endif
-#ifdef _SC_2_LOCALEDEF
-    {"SC_2_LOCALEDEF",  _SC_2_LOCALEDEF},
-#endif
-#ifdef _SC_2_SW_DEV
-    {"SC_2_SW_DEV",     _SC_2_SW_DEV},
-#endif
-#ifdef _SC_2_UPE
-    {"SC_2_UPE",        _SC_2_UPE},
-#endif
-#ifdef _SC_2_VERSION
-    {"SC_2_VERSION",    _SC_2_VERSION},
-#endif
-#ifdef _SC_ABI_ASYNCHRONOUS_IO
-    {"SC_ABI_ASYNCHRONOUS_IO",  _SC_ABI_ASYNCHRONOUS_IO},
-#endif
-#ifdef _SC_ACL
-    {"SC_ACL",  _SC_ACL},
-#endif
-#ifdef _SC_AIO_LISTIO_MAX
-    {"SC_AIO_LISTIO_MAX",       _SC_AIO_LISTIO_MAX},
-#endif
-#ifdef _SC_AIO_MAX
-    {"SC_AIO_MAX",      _SC_AIO_MAX},
-#endif
-#ifdef _SC_AIO_PRIO_DELTA_MAX
-    {"SC_AIO_PRIO_DELTA_MAX",   _SC_AIO_PRIO_DELTA_MAX},
-#endif
-#ifdef _SC_ARG_MAX
-    {"SC_ARG_MAX",      _SC_ARG_MAX},
-#endif
-#ifdef _SC_ASYNCHRONOUS_IO
-    {"SC_ASYNCHRONOUS_IO",      _SC_ASYNCHRONOUS_IO},
-#endif
-#ifdef _SC_ATEXIT_MAX
-    {"SC_ATEXIT_MAX",   _SC_ATEXIT_MAX},
-#endif
-#ifdef _SC_AUDIT
-    {"SC_AUDIT",        _SC_AUDIT},
-#endif
-#ifdef _SC_AVPHYS_PAGES
-    {"SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES},
-#endif
-#ifdef _SC_BC_BASE_MAX
-    {"SC_BC_BASE_MAX",  _SC_BC_BASE_MAX},
-#endif
-#ifdef _SC_BC_DIM_MAX
-    {"SC_BC_DIM_MAX",   _SC_BC_DIM_MAX},
-#endif
-#ifdef _SC_BC_SCALE_MAX
-    {"SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX},
-#endif
-#ifdef _SC_BC_STRING_MAX
-    {"SC_BC_STRING_MAX",        _SC_BC_STRING_MAX},
-#endif
-#ifdef _SC_CAP
-    {"SC_CAP",  _SC_CAP},
-#endif
-#ifdef _SC_CHARCLASS_NAME_MAX
-    {"SC_CHARCLASS_NAME_MAX",   _SC_CHARCLASS_NAME_MAX},
-#endif
-#ifdef _SC_CHAR_BIT
-    {"SC_CHAR_BIT",     _SC_CHAR_BIT},
-#endif
-#ifdef _SC_CHAR_MAX
-    {"SC_CHAR_MAX",     _SC_CHAR_MAX},
-#endif
-#ifdef _SC_CHAR_MIN
-    {"SC_CHAR_MIN",     _SC_CHAR_MIN},
-#endif
-#ifdef _SC_CHILD_MAX
-    {"SC_CHILD_MAX",    _SC_CHILD_MAX},
-#endif
-#ifdef _SC_CLK_TCK
-    {"SC_CLK_TCK",      _SC_CLK_TCK},
-#endif
-#ifdef _SC_COHER_BLKSZ
-    {"SC_COHER_BLKSZ",  _SC_COHER_BLKSZ},
-#endif
-#ifdef _SC_COLL_WEIGHTS_MAX
-    {"SC_COLL_WEIGHTS_MAX",     _SC_COLL_WEIGHTS_MAX},
-#endif
-#ifdef _SC_DCACHE_ASSOC
-    {"SC_DCACHE_ASSOC", _SC_DCACHE_ASSOC},
-#endif
-#ifdef _SC_DCACHE_BLKSZ
-    {"SC_DCACHE_BLKSZ", _SC_DCACHE_BLKSZ},
-#endif
-#ifdef _SC_DCACHE_LINESZ
-    {"SC_DCACHE_LINESZ",        _SC_DCACHE_LINESZ},
-#endif
-#ifdef _SC_DCACHE_SZ
-    {"SC_DCACHE_SZ",    _SC_DCACHE_SZ},
-#endif
-#ifdef _SC_DCACHE_TBLKSZ
-    {"SC_DCACHE_TBLKSZ",        _SC_DCACHE_TBLKSZ},
-#endif
-#ifdef _SC_DELAYTIMER_MAX
-    {"SC_DELAYTIMER_MAX",       _SC_DELAYTIMER_MAX},
-#endif
-#ifdef _SC_EQUIV_CLASS_MAX
-    {"SC_EQUIV_CLASS_MAX",      _SC_EQUIV_CLASS_MAX},
-#endif
-#ifdef _SC_EXPR_NEST_MAX
-    {"SC_EXPR_NEST_MAX",        _SC_EXPR_NEST_MAX},
-#endif
-#ifdef _SC_FSYNC
-    {"SC_FSYNC",        _SC_FSYNC},
-#endif
-#ifdef _SC_GETGR_R_SIZE_MAX
-    {"SC_GETGR_R_SIZE_MAX",     _SC_GETGR_R_SIZE_MAX},
-#endif
-#ifdef _SC_GETPW_R_SIZE_MAX
-    {"SC_GETPW_R_SIZE_MAX",     _SC_GETPW_R_SIZE_MAX},
-#endif
-#ifdef _SC_ICACHE_ASSOC
-    {"SC_ICACHE_ASSOC", _SC_ICACHE_ASSOC},
-#endif
-#ifdef _SC_ICACHE_BLKSZ
-    {"SC_ICACHE_BLKSZ", _SC_ICACHE_BLKSZ},
-#endif
-#ifdef _SC_ICACHE_LINESZ
-    {"SC_ICACHE_LINESZ",        _SC_ICACHE_LINESZ},
-#endif
-#ifdef _SC_ICACHE_SZ
-    {"SC_ICACHE_SZ",    _SC_ICACHE_SZ},
-#endif
-#ifdef _SC_INF
-    {"SC_INF",  _SC_INF},
-#endif
-#ifdef _SC_INT_MAX
-    {"SC_INT_MAX",      _SC_INT_MAX},
-#endif
-#ifdef _SC_INT_MIN
-    {"SC_INT_MIN",      _SC_INT_MIN},
-#endif
-#ifdef _SC_IOV_MAX
-    {"SC_IOV_MAX",      _SC_IOV_MAX},
-#endif
-#ifdef _SC_IP_SECOPTS
-    {"SC_IP_SECOPTS",   _SC_IP_SECOPTS},
-#endif
-#ifdef _SC_JOB_CONTROL
-    {"SC_JOB_CONTROL",  _SC_JOB_CONTROL},
-#endif
-#ifdef _SC_KERN_POINTERS
-    {"SC_KERN_POINTERS",        _SC_KERN_POINTERS},
-#endif
-#ifdef _SC_KERN_SIM
-    {"SC_KERN_SIM",     _SC_KERN_SIM},
-#endif
-#ifdef _SC_LINE_MAX
-    {"SC_LINE_MAX",     _SC_LINE_MAX},
-#endif
-#ifdef _SC_LOGIN_NAME_MAX
-    {"SC_LOGIN_NAME_MAX",       _SC_LOGIN_NAME_MAX},
-#endif
-#ifdef _SC_LOGNAME_MAX
-    {"SC_LOGNAME_MAX",  _SC_LOGNAME_MAX},
-#endif
-#ifdef _SC_LONG_BIT
-    {"SC_LONG_BIT",     _SC_LONG_BIT},
-#endif
-#ifdef _SC_MAC
-    {"SC_MAC",  _SC_MAC},
-#endif
-#ifdef _SC_MAPPED_FILES
-    {"SC_MAPPED_FILES", _SC_MAPPED_FILES},
-#endif
-#ifdef _SC_MAXPID
-    {"SC_MAXPID",       _SC_MAXPID},
-#endif
-#ifdef _SC_MB_LEN_MAX
-    {"SC_MB_LEN_MAX",   _SC_MB_LEN_MAX},
-#endif
-#ifdef _SC_MEMLOCK
-    {"SC_MEMLOCK",      _SC_MEMLOCK},
-#endif
-#ifdef _SC_MEMLOCK_RANGE
-    {"SC_MEMLOCK_RANGE",        _SC_MEMLOCK_RANGE},
-#endif
-#ifdef _SC_MEMORY_PROTECTION
-    {"SC_MEMORY_PROTECTION",    _SC_MEMORY_PROTECTION},
-#endif
-#ifdef _SC_MESSAGE_PASSING
-    {"SC_MESSAGE_PASSING",      _SC_MESSAGE_PASSING},
-#endif
-#ifdef _SC_MMAP_FIXED_ALIGNMENT
-    {"SC_MMAP_FIXED_ALIGNMENT", _SC_MMAP_FIXED_ALIGNMENT},
-#endif
-#ifdef _SC_MQ_OPEN_MAX
-    {"SC_MQ_OPEN_MAX",  _SC_MQ_OPEN_MAX},
-#endif
-#ifdef _SC_MQ_PRIO_MAX
-    {"SC_MQ_PRIO_MAX",  _SC_MQ_PRIO_MAX},
-#endif
-#ifdef _SC_NACLS_MAX
-    {"SC_NACLS_MAX",    _SC_NACLS_MAX},
-#endif
-#ifdef _SC_NGROUPS_MAX
-    {"SC_NGROUPS_MAX",  _SC_NGROUPS_MAX},
-#endif
-#ifdef _SC_NL_ARGMAX
-    {"SC_NL_ARGMAX",    _SC_NL_ARGMAX},
-#endif
-#ifdef _SC_NL_LANGMAX
-    {"SC_NL_LANGMAX",   _SC_NL_LANGMAX},
-#endif
-#ifdef _SC_NL_MSGMAX
-    {"SC_NL_MSGMAX",    _SC_NL_MSGMAX},
-#endif
-#ifdef _SC_NL_NMAX
-    {"SC_NL_NMAX",      _SC_NL_NMAX},
-#endif
-#ifdef _SC_NL_SETMAX
-    {"SC_NL_SETMAX",    _SC_NL_SETMAX},
-#endif
-#ifdef _SC_NL_TEXTMAX
-    {"SC_NL_TEXTMAX",   _SC_NL_TEXTMAX},
-#endif
-#ifdef _SC_NPROCESSORS_CONF
-    {"SC_NPROCESSORS_CONF",     _SC_NPROCESSORS_CONF},
-#endif
-#ifdef _SC_NPROCESSORS_ONLN
-    {"SC_NPROCESSORS_ONLN",     _SC_NPROCESSORS_ONLN},
-#endif
-#ifdef _SC_NPROC_CONF
-    {"SC_NPROC_CONF",   _SC_NPROC_CONF},
-#endif
-#ifdef _SC_NPROC_ONLN
-    {"SC_NPROC_ONLN",   _SC_NPROC_ONLN},
-#endif
-#ifdef _SC_NZERO
-    {"SC_NZERO",        _SC_NZERO},
-#endif
-#ifdef _SC_OPEN_MAX
-    {"SC_OPEN_MAX",     _SC_OPEN_MAX},
-#endif
-#ifdef _SC_PAGESIZE
-    {"SC_PAGESIZE",     _SC_PAGESIZE},
-#endif
-#ifdef _SC_PAGE_SIZE
-    {"SC_PAGE_SIZE",    _SC_PAGE_SIZE},
-#endif
-#ifdef _SC_PASS_MAX
-    {"SC_PASS_MAX",     _SC_PASS_MAX},
-#endif
-#ifdef _SC_PHYS_PAGES
-    {"SC_PHYS_PAGES",   _SC_PHYS_PAGES},
-#endif
-#ifdef _SC_PII
-    {"SC_PII",  _SC_PII},
-#endif
-#ifdef _SC_PII_INTERNET
-    {"SC_PII_INTERNET", _SC_PII_INTERNET},
-#endif
-#ifdef _SC_PII_INTERNET_DGRAM
-    {"SC_PII_INTERNET_DGRAM",   _SC_PII_INTERNET_DGRAM},
-#endif
-#ifdef _SC_PII_INTERNET_STREAM
-    {"SC_PII_INTERNET_STREAM",  _SC_PII_INTERNET_STREAM},
-#endif
-#ifdef _SC_PII_OSI
-    {"SC_PII_OSI",      _SC_PII_OSI},
-#endif
-#ifdef _SC_PII_OSI_CLTS
-    {"SC_PII_OSI_CLTS", _SC_PII_OSI_CLTS},
-#endif
-#ifdef _SC_PII_OSI_COTS
-    {"SC_PII_OSI_COTS", _SC_PII_OSI_COTS},
-#endif
-#ifdef _SC_PII_OSI_M
-    {"SC_PII_OSI_M",    _SC_PII_OSI_M},
-#endif
-#ifdef _SC_PII_SOCKET
-    {"SC_PII_SOCKET",   _SC_PII_SOCKET},
-#endif
-#ifdef _SC_PII_XTI
-    {"SC_PII_XTI",      _SC_PII_XTI},
-#endif
-#ifdef _SC_POLL
-    {"SC_POLL", _SC_POLL},
-#endif
-#ifdef _SC_PRIORITIZED_IO
-    {"SC_PRIORITIZED_IO",       _SC_PRIORITIZED_IO},
-#endif
-#ifdef _SC_PRIORITY_SCHEDULING
-    {"SC_PRIORITY_SCHEDULING",  _SC_PRIORITY_SCHEDULING},
-#endif
-#ifdef _SC_REALTIME_SIGNALS
-    {"SC_REALTIME_SIGNALS",     _SC_REALTIME_SIGNALS},
-#endif
-#ifdef _SC_RE_DUP_MAX
-    {"SC_RE_DUP_MAX",   _SC_RE_DUP_MAX},
-#endif
-#ifdef _SC_RTSIG_MAX
-    {"SC_RTSIG_MAX",    _SC_RTSIG_MAX},
-#endif
-#ifdef _SC_SAVED_IDS
-    {"SC_SAVED_IDS",    _SC_SAVED_IDS},
-#endif
-#ifdef _SC_SCHAR_MAX
-    {"SC_SCHAR_MAX",    _SC_SCHAR_MAX},
-#endif
-#ifdef _SC_SCHAR_MIN
-    {"SC_SCHAR_MIN",    _SC_SCHAR_MIN},
-#endif
-#ifdef _SC_SELECT
-    {"SC_SELECT",       _SC_SELECT},
-#endif
-#ifdef _SC_SEMAPHORES
-    {"SC_SEMAPHORES",   _SC_SEMAPHORES},
-#endif
-#ifdef _SC_SEM_NSEMS_MAX
-    {"SC_SEM_NSEMS_MAX",        _SC_SEM_NSEMS_MAX},
-#endif
-#ifdef _SC_SEM_VALUE_MAX
-    {"SC_SEM_VALUE_MAX",        _SC_SEM_VALUE_MAX},
-#endif
-#ifdef _SC_SHARED_MEMORY_OBJECTS
-    {"SC_SHARED_MEMORY_OBJECTS",        _SC_SHARED_MEMORY_OBJECTS},
-#endif
-#ifdef _SC_SHRT_MAX
-    {"SC_SHRT_MAX",     _SC_SHRT_MAX},
-#endif
-#ifdef _SC_SHRT_MIN
-    {"SC_SHRT_MIN",     _SC_SHRT_MIN},
-#endif
-#ifdef _SC_SIGQUEUE_MAX
-    {"SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX},
-#endif
-#ifdef _SC_SIGRT_MAX
-    {"SC_SIGRT_MAX",    _SC_SIGRT_MAX},
-#endif
-#ifdef _SC_SIGRT_MIN
-    {"SC_SIGRT_MIN",    _SC_SIGRT_MIN},
-#endif
-#ifdef _SC_SOFTPOWER
-    {"SC_SOFTPOWER",    _SC_SOFTPOWER},
-#endif
-#ifdef _SC_SPLIT_CACHE
-    {"SC_SPLIT_CACHE",  _SC_SPLIT_CACHE},
-#endif
-#ifdef _SC_SSIZE_MAX
-    {"SC_SSIZE_MAX",    _SC_SSIZE_MAX},
-#endif
-#ifdef _SC_STACK_PROT
-    {"SC_STACK_PROT",   _SC_STACK_PROT},
-#endif
-#ifdef _SC_STREAM_MAX
-    {"SC_STREAM_MAX",   _SC_STREAM_MAX},
-#endif
-#ifdef _SC_SYNCHRONIZED_IO
-    {"SC_SYNCHRONIZED_IO",      _SC_SYNCHRONIZED_IO},
-#endif
-#ifdef _SC_THREADS
-    {"SC_THREADS",      _SC_THREADS},
-#endif
-#ifdef _SC_THREAD_ATTR_STACKADDR
-    {"SC_THREAD_ATTR_STACKADDR",        _SC_THREAD_ATTR_STACKADDR},
-#endif
-#ifdef _SC_THREAD_ATTR_STACKSIZE
-    {"SC_THREAD_ATTR_STACKSIZE",        _SC_THREAD_ATTR_STACKSIZE},
-#endif
-#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS
-    {"SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS},
-#endif
-#ifdef _SC_THREAD_KEYS_MAX
-    {"SC_THREAD_KEYS_MAX",      _SC_THREAD_KEYS_MAX},
-#endif
-#ifdef _SC_THREAD_PRIORITY_SCHEDULING
-    {"SC_THREAD_PRIORITY_SCHEDULING",   _SC_THREAD_PRIORITY_SCHEDULING},
-#endif
-#ifdef _SC_THREAD_PRIO_INHERIT
-    {"SC_THREAD_PRIO_INHERIT",  _SC_THREAD_PRIO_INHERIT},
-#endif
-#ifdef _SC_THREAD_PRIO_PROTECT
-    {"SC_THREAD_PRIO_PROTECT",  _SC_THREAD_PRIO_PROTECT},
-#endif
-#ifdef _SC_THREAD_PROCESS_SHARED
-    {"SC_THREAD_PROCESS_SHARED",        _SC_THREAD_PROCESS_SHARED},
-#endif
-#ifdef _SC_THREAD_SAFE_FUNCTIONS
-    {"SC_THREAD_SAFE_FUNCTIONS",        _SC_THREAD_SAFE_FUNCTIONS},
-#endif
-#ifdef _SC_THREAD_STACK_MIN
-    {"SC_THREAD_STACK_MIN",     _SC_THREAD_STACK_MIN},
-#endif
-#ifdef _SC_THREAD_THREADS_MAX
-    {"SC_THREAD_THREADS_MAX",   _SC_THREAD_THREADS_MAX},
-#endif
-#ifdef _SC_TIMERS
-    {"SC_TIMERS",       _SC_TIMERS},
-#endif
-#ifdef _SC_TIMER_MAX
-    {"SC_TIMER_MAX",    _SC_TIMER_MAX},
-#endif
-#ifdef _SC_TTY_NAME_MAX
-    {"SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX},
-#endif
-#ifdef _SC_TZNAME_MAX
-    {"SC_TZNAME_MAX",   _SC_TZNAME_MAX},
-#endif
-#ifdef _SC_T_IOV_MAX
-    {"SC_T_IOV_MAX",    _SC_T_IOV_MAX},
-#endif
-#ifdef _SC_UCHAR_MAX
-    {"SC_UCHAR_MAX",    _SC_UCHAR_MAX},
-#endif
-#ifdef _SC_UINT_MAX
-    {"SC_UINT_MAX",     _SC_UINT_MAX},
-#endif
-#ifdef _SC_UIO_MAXIOV
-    {"SC_UIO_MAXIOV",   _SC_UIO_MAXIOV},
-#endif
-#ifdef _SC_ULONG_MAX
-    {"SC_ULONG_MAX",    _SC_ULONG_MAX},
-#endif
-#ifdef _SC_USHRT_MAX
-    {"SC_USHRT_MAX",    _SC_USHRT_MAX},
-#endif
-#ifdef _SC_VERSION
-    {"SC_VERSION",      _SC_VERSION},
-#endif
-#ifdef _SC_WORD_BIT
-    {"SC_WORD_BIT",     _SC_WORD_BIT},
-#endif
-#ifdef _SC_XBS5_ILP32_OFF32
-    {"SC_XBS5_ILP32_OFF32",     _SC_XBS5_ILP32_OFF32},
-#endif
-#ifdef _SC_XBS5_ILP32_OFFBIG
-    {"SC_XBS5_ILP32_OFFBIG",    _SC_XBS5_ILP32_OFFBIG},
-#endif
-#ifdef _SC_XBS5_LP64_OFF64
-    {"SC_XBS5_LP64_OFF64",      _SC_XBS5_LP64_OFF64},
-#endif
-#ifdef _SC_XBS5_LPBIG_OFFBIG
-    {"SC_XBS5_LPBIG_OFFBIG",    _SC_XBS5_LPBIG_OFFBIG},
-#endif
-#ifdef _SC_XOPEN_CRYPT
-    {"SC_XOPEN_CRYPT",  _SC_XOPEN_CRYPT},
-#endif
-#ifdef _SC_XOPEN_ENH_I18N
-    {"SC_XOPEN_ENH_I18N",       _SC_XOPEN_ENH_I18N},
-#endif
-#ifdef _SC_XOPEN_LEGACY
-    {"SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY},
-#endif
-#ifdef _SC_XOPEN_REALTIME
-    {"SC_XOPEN_REALTIME",       _SC_XOPEN_REALTIME},
-#endif
-#ifdef _SC_XOPEN_REALTIME_THREADS
-    {"SC_XOPEN_REALTIME_THREADS",       _SC_XOPEN_REALTIME_THREADS},
-#endif
-#ifdef _SC_XOPEN_SHM
-    {"SC_XOPEN_SHM",    _SC_XOPEN_SHM},
-#endif
-#ifdef _SC_XOPEN_UNIX
-    {"SC_XOPEN_UNIX",   _SC_XOPEN_UNIX},
-#endif
-#ifdef _SC_XOPEN_VERSION
-    {"SC_XOPEN_VERSION",        _SC_XOPEN_VERSION},
-#endif
-#ifdef _SC_XOPEN_XCU_VERSION
-    {"SC_XOPEN_XCU_VERSION",    _SC_XOPEN_XCU_VERSION},
-#endif
-#ifdef _SC_XOPEN_XPG2
-    {"SC_XOPEN_XPG2",   _SC_XOPEN_XPG2},
-#endif
-#ifdef _SC_XOPEN_XPG3
-    {"SC_XOPEN_XPG3",   _SC_XOPEN_XPG3},
-#endif
-#ifdef _SC_XOPEN_XPG4
-    {"SC_XOPEN_XPG4",   _SC_XOPEN_XPG4},
-#endif
-};
-
-static int
-conv_sysconf_confname(PyObject *arg, int *valuep)
-{
-    return conv_confname(arg, valuep, posix_constants_sysconf,
-                         sizeof(posix_constants_sysconf)
-                           / sizeof(struct constdef));
-}
-
-PyDoc_STRVAR(posix_sysconf__doc__,
-"sysconf(name) -> integer\n\n\
-Return an integer-valued system configuration variable.");
-
-static PyObject *
-posix_sysconf(PyObject *self, PyObject *args)
-{
-    PyObject *result = NULL;
-    int name;
-
-    if (PyArg_ParseTuple(args, "O&:sysconf", conv_sysconf_confname, &name)) {
-        int value;
-
-        errno = 0;
-        value = sysconf(name);
-        if (value == -1 && errno != 0)
-            posix_error();
-        else
-            result = PyInt_FromLong(value);
-    }
-    return result;
-}
-#endif
-
-
-/* This code is used to ensure that the tables of configuration value names
- * are in sorted order as required by conv_confname(), and also to build the
- * the exported dictionaries that are used to publish information about the
- * names available on the host platform.
- *
- * Sorting the table at runtime ensures that the table is properly ordered
- * when used, even for platforms we're not able to test on.  It also makes
- * it easier to add additional entries to the tables.
- */
-
-static int
-cmp_constdefs(const void *v1,  const void *v2)
-{
-    const struct constdef *c1 =
-    (const struct constdef *) v1;
-    const struct constdef *c2 =
-    (const struct constdef *) v2;
-
-    return strcmp(c1->name, c2->name);
-}
-
-static int
-setup_confname_table(struct constdef *table, size_t tablesize,
-                     char *tablename, PyObject *module)
-{
-    PyObject *d = NULL;
-    size_t i;
-
-    qsort(table, tablesize, sizeof(struct constdef), cmp_constdefs);
-    d = PyDict_New();
-    if (d == NULL)
-        return -1;
-
-    for (i=0; i < tablesize; ++i) {
-        PyObject *o = PyInt_FromLong(table[i].value);
-        if (o == NULL || PyDict_SetItemString(d, table[i].name, o) == -1) {
-            Py_XDECREF(o);
-            Py_DECREF(d);
-            return -1;
-        }
-        Py_DECREF(o);
-    }
-    return PyModule_AddObject(module, tablename, d);
-}
-
-/* Return -1 on failure, 0 on success. */
-static int
-setup_confname_tables(PyObject *module)
-{
-#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
-    if (setup_confname_table(posix_constants_pathconf,
-                             sizeof(posix_constants_pathconf)
-                               / sizeof(struct constdef),
-                             "pathconf_names", module))
-        return -1;
-#endif
-#ifdef HAVE_CONFSTR
-    if (setup_confname_table(posix_constants_confstr,
-                             sizeof(posix_constants_confstr)
-                               / sizeof(struct constdef),
-                             "confstr_names", module))
-        return -1;
-#endif
-#ifdef HAVE_SYSCONF
-    if (setup_confname_table(posix_constants_sysconf,
-                             sizeof(posix_constants_sysconf)
-                               / sizeof(struct constdef),
-                             "sysconf_names", module))
-        return -1;
-#endif
-    return 0;
-}
-
-
-PyDoc_STRVAR(posix_abort__doc__,
-"abort() -> does not return!\n\n\
-Abort the interpreter immediately.  This 'dumps core' or otherwise fails\n\
-in the hardest way possible on the hosting operating system.");
-
-static PyObject *
-posix_abort(PyObject *self, PyObject *noargs)
-{
-    abort();
-    /*NOTREACHED*/
-    Py_FatalError("abort() called from Python code didn't abort!");
-    return NULL;
-}
-
-#ifdef MS_WINDOWS
-PyDoc_STRVAR(win32_startfile__doc__,
-"startfile(filepath [, operation]) - Start a file with its associated\n\
-application.\n\
-\n\
-When \"operation\" is not specified or \"open\", this acts like\n\
-double-clicking the file in Explorer, or giving the file name as an\n\
-argument to the DOS \"start\" command: the file is opened with whatever\n\
-application (if any) its extension is associated.\n\
-When another \"operation\" is given, it specifies what should be done with\n\
-the file.  A typical operation is \"print\".\n\
-\n\
-startfile returns as soon as the associated application is launched.\n\
-There is no option to wait for the application to close, and no way\n\
-to retrieve the application's exit status.\n\
-\n\
-The filepath is relative to the current directory.  If you want to use\n\
-an absolute path, make sure the first character is not a slash (\"/\");\n\
-the underlying Win32 ShellExecute function doesn't work if it is.");
-
-static PyObject *
-win32_startfile(PyObject *self, PyObject *args)
-{
-    char *filepath;
-    char *operation = NULL;
-    HINSTANCE rc;
-
-    PyObject *unipath, *woperation = NULL;
-    if (!PyArg_ParseTuple(args, "U|s:startfile",
-                          &unipath, &operation)) {
-        PyErr_Clear();
-        goto normal;
-    }
-
-    if (operation) {
-        woperation = PyUnicode_DecodeASCII(operation,
-                                           strlen(operation), NULL);
-        if (!woperation) {
-            PyErr_Clear();
-            operation = NULL;
-            goto normal;
-        }
-    }
-
-    Py_BEGIN_ALLOW_THREADS
-    rc = ShellExecuteW((HWND)0, woperation ? PyUnicode_AS_UNICODE(woperation) : 0,
-        PyUnicode_AS_UNICODE(unipath),
-        NULL, NULL, SW_SHOWNORMAL);
-    Py_END_ALLOW_THREADS
-
-    Py_XDECREF(woperation);
-    if (rc <= (HINSTANCE)32) {
-        PyObject *errval = win32_error_unicode("startfile",
-                                               PyUnicode_AS_UNICODE(unipath));
-        return errval;
-    }
-    Py_INCREF(Py_None);
-    return Py_None;
-
-normal:
-    if (!PyArg_ParseTuple(args, "et|s:startfile",
-                          Py_FileSystemDefaultEncoding, &filepath,
-                          &operation))
-        return NULL;
-    Py_BEGIN_ALLOW_THREADS
-    rc = ShellExecute((HWND)0, operation, filepath,
-                      NULL, NULL, SW_SHOWNORMAL);
-    Py_END_ALLOW_THREADS
-    if (rc <= (HINSTANCE)32) {
-        PyObject *errval = win32_error("startfile", filepath);
-        PyMem_Free(filepath);
-        return errval;
-    }
-    PyMem_Free(filepath);
-    Py_INCREF(Py_None);
-    return Py_None;
-}
-#endif /* MS_WINDOWS */
-
-#ifdef HAVE_GETLOADAVG
-PyDoc_STRVAR(posix_getloadavg__doc__,
-"getloadavg() -> (float, float, float)\n\n\
-Return the number of processes in the system run queue averaged over\n\
-the last 1, 5, and 15 minutes or raises OSError if the load average\n\
-was unobtainable");
-
-static PyObject *
-posix_getloadavg(PyObject *self, PyObject *noargs)
-{
-    double loadavg[3];
-    if (getloadavg(loadavg, 3)!=3) {
-        PyErr_SetString(PyExc_OSError, "Load averages are unobtainable");
-        return NULL;
-    } else
-        return Py_BuildValue("ddd", loadavg[0], loadavg[1], loadavg[2]);
-}
-#endif
-
-#ifdef MS_WINDOWS
-
-PyDoc_STRVAR(win32_urandom__doc__,
-"urandom(n) -> str\n\n\
-Return a string of n random bytes suitable for cryptographic use.");
-
-typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\
-              LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\
-              DWORD dwFlags );
-typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\
-              BYTE *pbBuffer );
-
-static CRYPTGENRANDOM pCryptGenRandom = NULL;
-/* This handle is never explicitly released. Instead, the operating
-   system will release it when the process terminates. */
-static HCRYPTPROV hCryptProv = 0;
-
-static PyObject*
-win32_urandom(PyObject *self, PyObject *args)
-{
-    int howMany;
-    PyObject* result;
-
-    /* Read arguments */
-    if (! PyArg_ParseTuple(args, "i:urandom", &howMany))
-        return NULL;
-    if (howMany < 0)
-        return PyErr_Format(PyExc_ValueError,
-                            "negative argument not allowed");
-
-    if (hCryptProv == 0) {
-        HINSTANCE hAdvAPI32 = NULL;
-        CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL;
-
-        /* Obtain handle to the DLL containing CryptoAPI
-           This should not fail         */
-        hAdvAPI32 = GetModuleHandle("advapi32.dll");
-        if(hAdvAPI32 == NULL)
-            return win32_error("GetModuleHandle", NULL);
-
-        /* Obtain pointers to the CryptoAPI functions
-           This will fail on some early versions of Win95 */
-        pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress(
-                                        hAdvAPI32,
-                                        "CryptAcquireContextA");
-        if (pCryptAcquireContext == NULL)
-            return PyErr_Format(PyExc_NotImplementedError,
-                                "CryptAcquireContextA not found");
-
-        pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress(
-                                        hAdvAPI32, "CryptGenRandom");
-        if (pCryptGenRandom == NULL)
-            return PyErr_Format(PyExc_NotImplementedError,
-                                "CryptGenRandom not found");
-
-        /* Acquire context */
-        if (! pCryptAcquireContext(&hCryptProv, NULL, NULL,
-                                   PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
-            return win32_error("CryptAcquireContext", NULL);
-    }
-
-    /* Allocate bytes */
-    result = PyString_FromStringAndSize(NULL, howMany);
-    if (result != NULL) {
-        /* Get random data */
-        memset(PyString_AS_STRING(result), 0, howMany); /* zero seed */
-        if (! pCryptGenRandom(hCryptProv, howMany, (unsigned char*)
-                              PyString_AS_STRING(result))) {
-            Py_DECREF(result);
-            return win32_error("CryptGenRandom", NULL);
-        }
-    }
-    return result;
-}
-#endif
-
-#ifdef __VMS
-/* Use openssl random routine */
-#include <openssl/rand.h>
-PyDoc_STRVAR(vms_urandom__doc__,
-"urandom(n) -> str\n\n\
-Return a string of n random bytes suitable for cryptographic use.");
-
-static PyObject*
-vms_urandom(PyObject *self, PyObject *args)
-{
-    int howMany;
-    PyObject* result;
-
-    /* Read arguments */
-    if (! PyArg_ParseTuple(args, "i:urandom", &howMany))
-        return NULL;
-    if (howMany < 0)
-        return PyErr_Format(PyExc_ValueError,
-                            "negative argument not allowed");
-
-    /* Allocate bytes */
-    result = PyString_FromStringAndSize(NULL, howMany);
-    if (result != NULL) {
-        /* Get random data */
-        if (RAND_pseudo_bytes((unsigned char*)
-                              PyString_AS_STRING(result),
-                              howMany) < 0) {
-            Py_DECREF(result);
-            return PyErr_Format(PyExc_ValueError,
-                                "RAND_pseudo_bytes");
-        }
-    }
-    return result;
-}
-#endif
-
-#ifdef HAVE_SETRESUID
-PyDoc_STRVAR(posix_setresuid__doc__,
-"setresuid(ruid, euid, suid)\n\n\
-Set the current process's real, effective, and saved user ids.");
-
-static PyObject*
-posix_setresuid (PyObject *self, PyObject *args)
-{
-    /* We assume uid_t is no larger than a long. */
-    long ruid, euid, suid;
-    if (!PyArg_ParseTuple(args, "lll", &ruid, &euid, &suid))
-        return NULL;
-    if (setresuid(ruid, euid, suid) < 0)
-        return posix_error();
-    Py_RETURN_NONE;
-}
-#endif
-
-#ifdef HAVE_SETRESGID
-PyDoc_STRVAR(posix_setresgid__doc__,
-"setresgid(rgid, egid, sgid)\n\n\
-Set the current process's real, effective, and saved group ids.");
-
-static PyObject*
-posix_setresgid (PyObject *self, PyObject *args)
-{
-    /* We assume uid_t is no larger than a long. */
-    long rgid, egid, sgid;
-    if (!PyArg_ParseTuple(args, "lll", &rgid, &egid, &sgid))
-        return NULL;
-    if (setresgid(rgid, egid, sgid) < 0)
-        return posix_error();
-    Py_RETURN_NONE;
-}
-#endif
-
-#ifdef HAVE_GETRESUID
-PyDoc_STRVAR(posix_getresuid__doc__,
-"getresuid() -> (ruid, euid, suid)\n\n\
-Get tuple of the current process's real, effective, and saved user ids.");
-
-static PyObject*
-posix_getresuid (PyObject *self, PyObject *noargs)
-{
-    uid_t ruid, euid, suid;
-    long l_ruid, l_euid, l_suid;
-    if (getresuid(&ruid, &euid, &suid) < 0)
-        return posix_error();
-    /* Force the values into long's as we don't know the size of uid_t. */
-    l_ruid = ruid;
-    l_euid = euid;
-    l_suid = suid;
-    return Py_BuildValue("(lll)", l_ruid, l_euid, l_suid);
-}
-#endif
-
-#ifdef HAVE_GETRESGID
-PyDoc_STRVAR(posix_getresgid__doc__,
-"getresgid() -> (rgid, egid, sgid)\n\n\
-Get tuple of the current process's real, effective, and saved group ids.");
-
-static PyObject*
-posix_getresgid (PyObject *self, PyObject *noargs)
-{
-    uid_t rgid, egid, sgid;
-    long l_rgid, l_egid, l_sgid;
-    if (getresgid(&rgid, &egid, &sgid) < 0)
-        return posix_error();
-    /* Force the values into long's as we don't know the size of uid_t. */
-    l_rgid = rgid;
-    l_egid = egid;
-    l_sgid = sgid;
-    return Py_BuildValue("(lll)", l_rgid, l_egid, l_sgid);
-}
-#endif
-
-static PyMethodDef posix_methods[] = {
-    {"access",          posix_access, METH_VARARGS, posix_access__doc__},
-#ifdef HAVE_TTYNAME
-    {"ttyname",         posix_ttyname, METH_VARARGS, posix_ttyname__doc__},
-#endif
-    {"chdir",           posix_chdir, METH_VARARGS, posix_chdir__doc__},
-#ifdef HAVE_CHFLAGS
-    {"chflags",         posix_chflags, METH_VARARGS, posix_chflags__doc__},
-#endif /* HAVE_CHFLAGS */
-    {"chmod",           posix_chmod, METH_VARARGS, posix_chmod__doc__},
-#ifdef HAVE_FCHMOD
-    {"fchmod",          posix_fchmod, METH_VARARGS, posix_fchmod__doc__},
-#endif /* HAVE_FCHMOD */
-#ifdef HAVE_CHOWN
-    {"chown",           posix_chown, METH_VARARGS, posix_chown__doc__},
-#endif /* HAVE_CHOWN */
-#ifdef HAVE_LCHMOD
-    {"lchmod",          posix_lchmod, METH_VARARGS, posix_lchmod__doc__},
-#endif /* HAVE_LCHMOD */
-#ifdef HAVE_FCHOWN
-    {"fchown",          posix_fchown, METH_VARARGS, posix_fchown__doc__},
-#endif /* HAVE_FCHOWN */
-#ifdef HAVE_LCHFLAGS
-    {"lchflags",        posix_lchflags, METH_VARARGS, posix_lchflags__doc__},
-#endif /* HAVE_LCHFLAGS */
-#ifdef HAVE_LCHOWN
-    {"lchown",          posix_lchown, METH_VARARGS, posix_lchown__doc__},
-#endif /* HAVE_LCHOWN */
-#ifdef HAVE_CHROOT
-    {"chroot",          posix_chroot, METH_VARARGS, posix_chroot__doc__},
-#endif
-#ifdef HAVE_CTERMID
-    {"ctermid",         posix_ctermid, METH_NOARGS, posix_ctermid__doc__},
-#endif
-#ifdef HAVE_GETCWD
-    {"getcwd",          posix_getcwd, METH_NOARGS, posix_getcwd__doc__},
-#ifdef Py_USING_UNICODE
-    {"getcwdu",         posix_getcwdu, METH_NOARGS, posix_getcwdu__doc__},
-#endif
-#endif
-#ifdef HAVE_LINK
-    {"link",            posix_link, METH_VARARGS, posix_link__doc__},
-#endif /* HAVE_LINK */
-    {"listdir",         posix_listdir, METH_VARARGS, posix_listdir__doc__},
-    {"lstat",           posix_lstat, METH_VARARGS, posix_lstat__doc__},
-    {"mkdir",           posix_mkdir, METH_VARARGS, posix_mkdir__doc__},
-#ifdef HAVE_NICE
-    {"nice",            posix_nice, METH_VARARGS, posix_nice__doc__},
-#endif /* HAVE_NICE */
-#ifdef HAVE_READLINK
-    {"readlink",        posix_readlink, METH_VARARGS, posix_readlink__doc__},
-#endif /* HAVE_READLINK */
-    {"rename",          posix_rename, METH_VARARGS, posix_rename__doc__},
-    {"rmdir",           posix_rmdir, METH_VARARGS, posix_rmdir__doc__},
-    {"stat",            posix_stat, METH_VARARGS, posix_stat__doc__},
-    {"stat_float_times", stat_float_times, METH_VARARGS, stat_float_times__doc__},
-#ifdef HAVE_SYMLINK
-    {"symlink",         posix_symlink, METH_VARARGS, posix_symlink__doc__},
-#endif /* HAVE_SYMLINK */
-#ifdef HAVE_SYSTEM
-    {"system",          posix_system, METH_VARARGS, posix_system__doc__},
-#endif
-    {"umask",           posix_umask, METH_VARARGS, posix_umask__doc__},
-#ifdef HAVE_UNAME
-    {"uname",           posix_uname, METH_NOARGS, posix_uname__doc__},
-#endif /* HAVE_UNAME */
-    {"unlink",          posix_unlink, METH_VARARGS, posix_unlink__doc__},
-    {"remove",          posix_unlink, METH_VARARGS, posix_remove__doc__},
-    {"utime",           posix_utime, METH_VARARGS, posix_utime__doc__},
-#ifdef HAVE_TIMES
-    {"times",           posix_times, METH_NOARGS, posix_times__doc__},
-#endif /* HAVE_TIMES */
-    {"_exit",           posix__exit, METH_VARARGS, posix__exit__doc__},
-#ifdef HAVE_EXECV
-    {"execv",           posix_execv, METH_VARARGS, posix_execv__doc__},
-    {"execve",          posix_execve, METH_VARARGS, posix_execve__doc__},
-#endif /* HAVE_EXECV */
-#ifdef HAVE_SPAWNV
-    {"spawnv",          posix_spawnv, METH_VARARGS, posix_spawnv__doc__},
-    {"spawnve",         posix_spawnve, METH_VARARGS, posix_spawnve__doc__},
-#if defined(PYOS_OS2)
-    {"spawnvp",         posix_spawnvp, METH_VARARGS, posix_spawnvp__doc__},
-    {"spawnvpe",        posix_spawnvpe, METH_VARARGS, posix_spawnvpe__doc__},
-#endif /* PYOS_OS2 */
-#endif /* HAVE_SPAWNV */
-#ifdef HAVE_FORK1
-    {"fork1",       posix_fork1, METH_NOARGS, posix_fork1__doc__},
-#endif /* HAVE_FORK1 */
-#ifdef HAVE_FORK
-    {"fork",            posix_fork, METH_NOARGS, posix_fork__doc__},
-#endif /* HAVE_FORK */
-#if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX)
-    {"openpty",         posix_openpty, METH_NOARGS, posix_openpty__doc__},
-#endif /* HAVE_OPENPTY || HAVE__GETPTY || HAVE_DEV_PTMX */
-#ifdef HAVE_FORKPTY
-    {"forkpty",         posix_forkpty, METH_NOARGS, posix_forkpty__doc__},
-#endif /* HAVE_FORKPTY */
-#ifdef HAVE_GETEGID
-    {"getegid",         posix_getegid, METH_NOARGS, posix_getegid__doc__},
-#endif /* HAVE_GETEGID */
-#ifdef HAVE_GETEUID
-    {"geteuid",         posix_geteuid, METH_NOARGS, posix_geteuid__doc__},
-#endif /* HAVE_GETEUID */
-#ifdef HAVE_GETGID
-    {"getgid",          posix_getgid, METH_NOARGS, posix_getgid__doc__},
-#endif /* HAVE_GETGID */
-#ifdef HAVE_GETGROUPS
-    {"getgroups",       posix_getgroups, METH_NOARGS, posix_getgroups__doc__},
-#endif
-    {"getpid",          posix_getpid, METH_NOARGS, posix_getpid__doc__},
-#ifdef HAVE_GETPGRP
-    {"getpgrp",         posix_getpgrp, METH_NOARGS, posix_getpgrp__doc__},
-#endif /* HAVE_GETPGRP */
-#ifdef HAVE_GETPPID
-    {"getppid",         posix_getppid, METH_NOARGS, posix_getppid__doc__},
-#endif /* HAVE_GETPPID */
-#ifdef HAVE_GETUID
-    {"getuid",          posix_getuid, METH_NOARGS, posix_getuid__doc__},
-#endif /* HAVE_GETUID */
-#ifdef HAVE_GETLOGIN
-    {"getlogin",        posix_getlogin, METH_NOARGS, posix_getlogin__doc__},
-#endif
-#ifdef HAVE_KILL
-    {"kill",            posix_kill, METH_VARARGS, posix_kill__doc__},
-#endif /* HAVE_KILL */
-#ifdef HAVE_KILLPG
-    {"killpg",          posix_killpg, METH_VARARGS, posix_killpg__doc__},
-#endif /* HAVE_KILLPG */
-#ifdef HAVE_PLOCK
-    {"plock",           posix_plock, METH_VARARGS, posix_plock__doc__},
-#endif /* HAVE_PLOCK */
-#ifdef HAVE_POPEN
-    {"popen",           posix_popen, METH_VARARGS, posix_popen__doc__},
-#ifdef MS_WINDOWS
-    {"popen2",          win32_popen2, METH_VARARGS},
-    {"popen3",          win32_popen3, METH_VARARGS},
-    {"popen4",          win32_popen4, METH_VARARGS},
-    {"startfile",       win32_startfile, METH_VARARGS, win32_startfile__doc__},
-    {"kill",    win32_kill, METH_VARARGS, win32_kill__doc__},
-#else
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
-    {"popen2",          os2emx_popen2, METH_VARARGS},
-    {"popen3",          os2emx_popen3, METH_VARARGS},
-    {"popen4",          os2emx_popen4, METH_VARARGS},
-#endif
-#endif
-#endif /* HAVE_POPEN */
-#ifdef HAVE_SETUID
-    {"setuid",          posix_setuid, METH_VARARGS, posix_setuid__doc__},
-#endif /* HAVE_SETUID */
-#ifdef HAVE_SETEUID
-    {"seteuid",         posix_seteuid, METH_VARARGS, posix_seteuid__doc__},
-#endif /* HAVE_SETEUID */
-#ifdef HAVE_SETEGID
-    {"setegid",         posix_setegid, METH_VARARGS, posix_setegid__doc__},
-#endif /* HAVE_SETEGID */
-#ifdef HAVE_SETREUID
-    {"setreuid",        posix_setreuid, METH_VARARGS, posix_setreuid__doc__},
-#endif /* HAVE_SETREUID */
-#ifdef HAVE_SETREGID
-    {"setregid",        posix_setregid, METH_VARARGS, posix_setregid__doc__},
-#endif /* HAVE_SETREGID */
-#ifdef HAVE_SETGID
-    {"setgid",          posix_setgid, METH_VARARGS, posix_setgid__doc__},
-#endif /* HAVE_SETGID */
-#ifdef HAVE_SETGROUPS
-    {"setgroups",       posix_setgroups, METH_O, posix_setgroups__doc__},
-#endif /* HAVE_SETGROUPS */
-#ifdef HAVE_INITGROUPS
-    {"initgroups",      posix_initgroups, METH_VARARGS, posix_initgroups__doc__},
-#endif /* HAVE_INITGROUPS */
-#ifdef HAVE_GETPGID
-    {"getpgid",         posix_getpgid, METH_VARARGS, posix_getpgid__doc__},
-#endif /* HAVE_GETPGID */
-#ifdef HAVE_SETPGRP
-    {"setpgrp",         posix_setpgrp, METH_NOARGS, posix_setpgrp__doc__},
-#endif /* HAVE_SETPGRP */
-#ifdef HAVE_WAIT
-    {"wait",            posix_wait, METH_NOARGS, posix_wait__doc__},
-#endif /* HAVE_WAIT */
-#ifdef HAVE_WAIT3
-    {"wait3",           posix_wait3, METH_VARARGS, posix_wait3__doc__},
-#endif /* HAVE_WAIT3 */
-#ifdef HAVE_WAIT4
-    {"wait4",           posix_wait4, METH_VARARGS, posix_wait4__doc__},
-#endif /* HAVE_WAIT4 */
-#if defined(HAVE_WAITPID) || defined(HAVE_CWAIT)
-    {"waitpid",         posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
-#endif /* HAVE_WAITPID */
-#ifdef HAVE_GETSID
-    {"getsid",          posix_getsid, METH_VARARGS, posix_getsid__doc__},
-#endif /* HAVE_GETSID */
-#ifdef HAVE_SETSID
-    {"setsid",          posix_setsid, METH_NOARGS, posix_setsid__doc__},
-#endif /* HAVE_SETSID */
-#ifdef HAVE_SETPGID
-    {"setpgid",         posix_setpgid, METH_VARARGS, posix_setpgid__doc__},
-#endif /* HAVE_SETPGID */
-#ifdef HAVE_TCGETPGRP
-    {"tcgetpgrp",       posix_tcgetpgrp, METH_VARARGS, posix_tcgetpgrp__doc__},
-#endif /* HAVE_TCGETPGRP */
-#ifdef HAVE_TCSETPGRP
-    {"tcsetpgrp",       posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__},
-#endif /* HAVE_TCSETPGRP */
-    {"open",            posix_open, METH_VARARGS, posix_open__doc__},
-    {"close",           posix_close, METH_VARARGS, posix_close__doc__},
-    {"closerange",      posix_closerange, METH_VARARGS, posix_closerange__doc__},
-    {"dup",             posix_dup, METH_VARARGS, posix_dup__doc__},
-    {"dup2",            posix_dup2, METH_VARARGS, posix_dup2__doc__},
-    {"lseek",           posix_lseek, METH_VARARGS, posix_lseek__doc__},
-    {"read",            posix_read, METH_VARARGS, posix_read__doc__},
-    {"write",           posix_write, METH_VARARGS, posix_write__doc__},
-    {"fstat",           posix_fstat, METH_VARARGS, posix_fstat__doc__},
-    {"fdopen",          posix_fdopen, METH_VARARGS, posix_fdopen__doc__},
-    {"isatty",          posix_isatty, METH_VARARGS, posix_isatty__doc__},
-#ifdef HAVE_PIPE
-    {"pipe",            posix_pipe, METH_NOARGS, posix_pipe__doc__},
-#endif
-#ifdef HAVE_MKFIFO
-    {"mkfifo",          posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__},
-#endif
-#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)
-    {"mknod",           posix_mknod, METH_VARARGS, posix_mknod__doc__},
-#endif
-#ifdef HAVE_DEVICE_MACROS
-    {"major",           posix_major, METH_VARARGS, posix_major__doc__},
-    {"minor",           posix_minor, METH_VARARGS, posix_minor__doc__},
-    {"makedev",         posix_makedev, METH_VARARGS, posix_makedev__doc__},
-#endif
-#ifdef HAVE_FTRUNCATE
-    {"ftruncate",       posix_ftruncate, METH_VARARGS, posix_ftruncate__doc__},
-#endif
-#ifdef HAVE_PUTENV
-    {"putenv",          posix_putenv, METH_VARARGS, posix_putenv__doc__},
-#endif
-#ifdef HAVE_UNSETENV
-    {"unsetenv",        posix_unsetenv, METH_VARARGS, posix_unsetenv__doc__},
-#endif
-    {"strerror",        posix_strerror, METH_VARARGS, posix_strerror__doc__},
-#ifdef HAVE_FCHDIR
-    {"fchdir",          posix_fchdir, METH_O, posix_fchdir__doc__},
-#endif
-#ifdef HAVE_FSYNC
-    {"fsync",       posix_fsync, METH_O, posix_fsync__doc__},
-#endif
-#ifdef HAVE_FDATASYNC
-    {"fdatasync",   posix_fdatasync,  METH_O, posix_fdatasync__doc__},
-#endif
-#ifdef HAVE_SYS_WAIT_H
-#ifdef WCOREDUMP
-    {"WCOREDUMP",       posix_WCOREDUMP, METH_VARARGS, posix_WCOREDUMP__doc__},
-#endif /* WCOREDUMP */
-#ifdef WIFCONTINUED
-    {"WIFCONTINUED",posix_WIFCONTINUED, METH_VARARGS, posix_WIFCONTINUED__doc__},
-#endif /* WIFCONTINUED */
-#ifdef WIFSTOPPED
-    {"WIFSTOPPED",      posix_WIFSTOPPED, METH_VARARGS, posix_WIFSTOPPED__doc__},
-#endif /* WIFSTOPPED */
-#ifdef WIFSIGNALED
-    {"WIFSIGNALED",     posix_WIFSIGNALED, METH_VARARGS, posix_WIFSIGNALED__doc__},
-#endif /* WIFSIGNALED */
-#ifdef WIFEXITED
-    {"WIFEXITED",       posix_WIFEXITED, METH_VARARGS, posix_WIFEXITED__doc__},
-#endif /* WIFEXITED */
-#ifdef WEXITSTATUS
-    {"WEXITSTATUS",     posix_WEXITSTATUS, METH_VARARGS, posix_WEXITSTATUS__doc__},
-#endif /* WEXITSTATUS */
-#ifdef WTERMSIG
-    {"WTERMSIG",        posix_WTERMSIG, METH_VARARGS, posix_WTERMSIG__doc__},
-#endif /* WTERMSIG */
-#ifdef WSTOPSIG
-    {"WSTOPSIG",        posix_WSTOPSIG, METH_VARARGS, posix_WSTOPSIG__doc__},
-#endif /* WSTOPSIG */
-#endif /* HAVE_SYS_WAIT_H */
-#if defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H)
-    {"fstatvfs",        posix_fstatvfs, METH_VARARGS, posix_fstatvfs__doc__},
-#endif
-#if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H)
-    {"statvfs",         posix_statvfs, METH_VARARGS, posix_statvfs__doc__},
-#endif
-#ifdef HAVE_TMPFILE
-    {"tmpfile",         posix_tmpfile, METH_NOARGS, posix_tmpfile__doc__},
-#endif
-#ifdef HAVE_TEMPNAM
-    {"tempnam",         posix_tempnam, METH_VARARGS, posix_tempnam__doc__},
-#endif
-#ifdef HAVE_TMPNAM
-    {"tmpnam",          posix_tmpnam, METH_NOARGS, posix_tmpnam__doc__},
-#endif
-#ifdef HAVE_CONFSTR
-    {"confstr",         posix_confstr, METH_VARARGS, posix_confstr__doc__},
-#endif
-#ifdef HAVE_SYSCONF
-    {"sysconf",         posix_sysconf, METH_VARARGS, posix_sysconf__doc__},
-#endif
-#ifdef HAVE_FPATHCONF
-    {"fpathconf",       posix_fpathconf, METH_VARARGS, posix_fpathconf__doc__},
-#endif
-#ifdef HAVE_PATHCONF
-    {"pathconf",        posix_pathconf, METH_VARARGS, posix_pathconf__doc__},
-#endif
-    {"abort",           posix_abort, METH_NOARGS, posix_abort__doc__},
-#ifdef MS_WINDOWS
-    {"_getfullpathname",        posix__getfullpathname, METH_VARARGS, NULL},
-#endif
-#ifdef HAVE_GETLOADAVG
-    {"getloadavg",      posix_getloadavg, METH_NOARGS, posix_getloadavg__doc__},
-#endif
- #ifdef MS_WINDOWS
-    {"urandom", win32_urandom, METH_VARARGS, win32_urandom__doc__},
- #endif
- #ifdef __VMS
-    {"urandom", vms_urandom, METH_VARARGS, vms_urandom__doc__},
- #endif
-#ifdef HAVE_SETRESUID
-    {"setresuid",       posix_setresuid, METH_VARARGS, posix_setresuid__doc__},
-#endif
-#ifdef HAVE_SETRESGID
-    {"setresgid",       posix_setresgid, METH_VARARGS, posix_setresgid__doc__},
-#endif
-#ifdef HAVE_GETRESUID
-    {"getresuid",       posix_getresuid, METH_NOARGS, posix_getresuid__doc__},
-#endif
-#ifdef HAVE_GETRESGID
-    {"getresgid",       posix_getresgid, METH_NOARGS, posix_getresgid__doc__},
-#endif
-
-    {NULL,              NULL}            /* Sentinel */
-};
-
-
-static int
-ins(PyObject *module, char *symbol, long value)
-{
-    return PyModule_AddIntConstant(module, symbol, value);
-}
-
-#if defined(PYOS_OS2)
-/* Insert Platform-Specific Constant Values (Strings & Numbers) of Common Use */
-static int insertvalues(PyObject *module)
-{
-    APIRET    rc;
-    ULONG     values[QSV_MAX+1];
-    PyObject *v;
-    char     *ver, tmp[50];
-
-    Py_BEGIN_ALLOW_THREADS
-    rc = DosQuerySysInfo(1L, QSV_MAX, &values[1], sizeof(ULONG) * QSV_MAX);
-    Py_END_ALLOW_THREADS
-
-    if (rc != NO_ERROR) {
-        os2_error(rc);
-        return -1;
-    }
-
-    if (ins(module, "meminstalled", values[QSV_TOTPHYSMEM])) return -1;
-    if (ins(module, "memkernel",    values[QSV_TOTRESMEM])) return -1;
-    if (ins(module, "memvirtual",   values[QSV_TOTAVAILMEM])) return -1;
-    if (ins(module, "maxpathlen",   values[QSV_MAX_PATH_LENGTH])) return -1;
-    if (ins(module, "maxnamelen",   values[QSV_MAX_COMP_LENGTH])) return -1;
-    if (ins(module, "revision",     values[QSV_VERSION_REVISION])) return -1;
-    if (ins(module, "timeslice",    values[QSV_MIN_SLICE])) return -1;
-
-    switch (values[QSV_VERSION_MINOR]) {
-    case 0:  ver = "2.00"; break;
-    case 10: ver = "2.10"; break;
-    case 11: ver = "2.11"; break;
-    case 30: ver = "3.00"; break;
-    case 40: ver = "4.00"; break;
-    case 50: ver = "5.00"; break;
-    default:
-        PyOS_snprintf(tmp, sizeof(tmp),
-                      "%d-%d", values[QSV_VERSION_MAJOR],
-                      values[QSV_VERSION_MINOR]);
-        ver = &tmp[0];
-    }
-
-    /* Add Indicator of the Version of the Operating System */
-    if (PyModule_AddStringConstant(module, "version", tmp) < 0)
-        return -1;
-
-    /* Add Indicator of Which Drive was Used to Boot the System */
-    tmp[0] = 'A' + values[QSV_BOOT_DRIVE] - 1;
-    tmp[1] = ':';
-    tmp[2] = '\0';
-
-    return PyModule_AddStringConstant(module, "bootdrive", tmp);
-}
-#endif
-
-static int
-all_ins(PyObject *d)
-{
-#ifdef F_OK
-    if (ins(d, "F_OK", (long)F_OK)) return -1;
-#endif
-#ifdef R_OK
-    if (ins(d, "R_OK", (long)R_OK)) return -1;
-#endif
-#ifdef W_OK
-    if (ins(d, "W_OK", (long)W_OK)) return -1;
-#endif
-#ifdef X_OK
-    if (ins(d, "X_OK", (long)X_OK)) return -1;
-#endif
-#ifdef NGROUPS_MAX
-    if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1;
-#endif
-#ifdef TMP_MAX
-    if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1;
-#endif
-#ifdef WCONTINUED
-    if (ins(d, "WCONTINUED", (long)WCONTINUED)) return -1;
-#endif
-#ifdef WNOHANG
-    if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
-#endif
-#ifdef WUNTRACED
-    if (ins(d, "WUNTRACED", (long)WUNTRACED)) return -1;
-#endif
-#ifdef O_RDONLY
-    if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
-#endif
-#ifdef O_WRONLY
-    if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
-#endif
-#ifdef O_RDWR
-    if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
-#endif
-#ifdef O_NDELAY
-    if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
-#endif
-#ifdef O_NONBLOCK
-    if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
-#endif
-#ifdef O_APPEND
-    if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
-#endif
-#ifdef O_DSYNC
-    if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
-#endif
-#ifdef O_RSYNC
-    if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
-#endif
-#ifdef O_SYNC
-    if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
-#endif
-#ifdef O_NOCTTY
-    if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
-#endif
-#ifdef O_CREAT
-    if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
-#endif
-#ifdef O_EXCL
-    if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
-#endif
-#ifdef O_TRUNC
-    if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
-#endif
-#ifdef O_BINARY
-    if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
-#endif
-#ifdef O_TEXT
-    if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
-#endif
-#ifdef O_LARGEFILE
-    if (ins(d, "O_LARGEFILE", (long)O_LARGEFILE)) return -1;
-#endif
-#ifdef O_SHLOCK
-    if (ins(d, "O_SHLOCK", (long)O_SHLOCK)) return -1;
-#endif
-#ifdef O_EXLOCK
-    if (ins(d, "O_EXLOCK", (long)O_EXLOCK)) return -1;
-#endif
-
-/* MS Windows */
-#ifdef O_NOINHERIT
-    /* Don't inherit in child processes. */
-    if (ins(d, "O_NOINHERIT", (long)O_NOINHERIT)) return -1;
-#endif
-#ifdef _O_SHORT_LIVED
-    /* Optimize for short life (keep in memory). */
-    /* MS forgot to define this one with a non-underscore form too. */
-    if (ins(d, "O_SHORT_LIVED", (long)_O_SHORT_LIVED)) return -1;
-#endif
-#ifdef O_TEMPORARY
-    /* Automatically delete when last handle is closed. */
-    if (ins(d, "O_TEMPORARY", (long)O_TEMPORARY)) return -1;
-#endif
-#ifdef O_RANDOM
-    /* Optimize for random access. */
-    if (ins(d, "O_RANDOM", (long)O_RANDOM)) return -1;
-#endif
-#ifdef O_SEQUENTIAL
-    /* Optimize for sequential access. */
-    if (ins(d, "O_SEQUENTIAL", (long)O_SEQUENTIAL)) return -1;
-#endif
-
-/* GNU extensions. */
-#ifdef O_ASYNC
-    /* Send a SIGIO signal whenever input or output
-       becomes available on file descriptor */
-    if (ins(d, "O_ASYNC", (long)O_ASYNC)) return -1;
-#endif
-#ifdef O_DIRECT
-    /* Direct disk access. */
-    if (ins(d, "O_DIRECT", (long)O_DIRECT)) return -1;
-#endif
-#ifdef O_DIRECTORY
-    /* Must be a directory.      */
-    if (ins(d, "O_DIRECTORY", (long)O_DIRECTORY)) return -1;
-#endif
-#ifdef O_NOFOLLOW
-    /* Do not follow links.      */
-    if (ins(d, "O_NOFOLLOW", (long)O_NOFOLLOW)) return -1;
-#endif
-#ifdef O_NOATIME
-    /* Do not update the access time. */
-    if (ins(d, "O_NOATIME", (long)O_NOATIME)) return -1;
-#endif
-
-    /* These come from sysexits.h */
-#ifdef EX_OK
-    if (ins(d, "EX_OK", (long)EX_OK)) return -1;
-#endif /* EX_OK */
-#ifdef EX_USAGE
-    if (ins(d, "EX_USAGE", (long)EX_USAGE)) return -1;
-#endif /* EX_USAGE */
-#ifdef EX_DATAERR
-    if (ins(d, "EX_DATAERR", (long)EX_DATAERR)) return -1;
-#endif /* EX_DATAERR */
-#ifdef EX_NOINPUT
-    if (ins(d, "EX_NOINPUT", (long)EX_NOINPUT)) return -1;
-#endif /* EX_NOINPUT */
-#ifdef EX_NOUSER
-    if (ins(d, "EX_NOUSER", (long)EX_NOUSER)) return -1;
-#endif /* EX_NOUSER */
-#ifdef EX_NOHOST
-    if (ins(d, "EX_NOHOST", (long)EX_NOHOST)) return -1;
-#endif /* EX_NOHOST */
-#ifdef EX_UNAVAILABLE
-    if (ins(d, "EX_UNAVAILABLE", (long)EX_UNAVAILABLE)) return -1;
-#endif /* EX_UNAVAILABLE */
-#ifdef EX_SOFTWARE
-    if (ins(d, "EX_SOFTWARE", (long)EX_SOFTWARE)) return -1;
-#endif /* EX_SOFTWARE */
-#ifdef EX_OSERR
-    if (ins(d, "EX_OSERR", (long)EX_OSERR)) return -1;
-#endif /* EX_OSERR */
-#ifdef EX_OSFILE
-    if (ins(d, "EX_OSFILE", (long)EX_OSFILE)) return -1;
-#endif /* EX_OSFILE */
-#ifdef EX_CANTCREAT
-    if (ins(d, "EX_CANTCREAT", (long)EX_CANTCREAT)) return -1;
-#endif /* EX_CANTCREAT */
-#ifdef EX_IOERR
-    if (ins(d, "EX_IOERR", (long)EX_IOERR)) return -1;
-#endif /* EX_IOERR */
-#ifdef EX_TEMPFAIL
-    if (ins(d, "EX_TEMPFAIL", (long)EX_TEMPFAIL)) return -1;
-#endif /* EX_TEMPFAIL */
-#ifdef EX_PROTOCOL
-    if (ins(d, "EX_PROTOCOL", (long)EX_PROTOCOL)) return -1;
-#endif /* EX_PROTOCOL */
-#ifdef EX_NOPERM
-    if (ins(d, "EX_NOPERM", (long)EX_NOPERM)) return -1;
-#endif /* EX_NOPERM */
-#ifdef EX_CONFIG
-    if (ins(d, "EX_CONFIG", (long)EX_CONFIG)) return -1;
-#endif /* EX_CONFIG */
-#ifdef EX_NOTFOUND
-    if (ins(d, "EX_NOTFOUND", (long)EX_NOTFOUND)) return -1;
-#endif /* EX_NOTFOUND */
-
-#ifdef HAVE_SPAWNV
-#if defined(PYOS_OS2) && defined(PYCC_GCC)
-    if (ins(d, "P_WAIT", (long)P_WAIT)) return -1;
-    if (ins(d, "P_NOWAIT", (long)P_NOWAIT)) return -1;
-    if (ins(d, "P_OVERLAY", (long)P_OVERLAY)) return -1;
-    if (ins(d, "P_DEBUG", (long)P_DEBUG)) return -1;
-    if (ins(d, "P_SESSION", (long)P_SESSION)) return -1;
-    if (ins(d, "P_DETACH", (long)P_DETACH)) return -1;
-    if (ins(d, "P_PM", (long)P_PM)) return -1;
-    if (ins(d, "P_DEFAULT", (long)P_DEFAULT)) return -1;
-    if (ins(d, "P_MINIMIZE", (long)P_MINIMIZE)) return -1;
-    if (ins(d, "P_MAXIMIZE", (long)P_MAXIMIZE)) return -1;
-    if (ins(d, "P_FULLSCREEN", (long)P_FULLSCREEN)) return -1;
-    if (ins(d, "P_WINDOWED", (long)P_WINDOWED)) return -1;
-    if (ins(d, "P_FOREGROUND", (long)P_FOREGROUND)) return -1;
-    if (ins(d, "P_BACKGROUND", (long)P_BACKGROUND)) return -1;
-    if (ins(d, "P_NOCLOSE", (long)P_NOCLOSE)) return -1;
-    if (ins(d, "P_NOSESSION", (long)P_NOSESSION)) return -1;
-    if (ins(d, "P_QUOTE", (long)P_QUOTE)) return -1;
-    if (ins(d, "P_TILDE", (long)P_TILDE)) return -1;
-    if (ins(d, "P_UNRELATED", (long)P_UNRELATED)) return -1;
-    if (ins(d, "P_DEBUGDESC", (long)P_DEBUGDESC)) return -1;
-#else
-    if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1;
-    if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1;
-    if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1;
-    if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1;
-    if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1;
-#endif
-#endif
-
-#if defined(PYOS_OS2)
-    if (insertvalues(d)) return -1;
-#endif
-    return 0;
-}
-
-
-#if (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__)) && !defined(__QNX__)
-#define INITFUNC initnt
-#define MODNAME "nt"
-
-#elif defined(PYOS_OS2)
-#define INITFUNC initos2
-#define MODNAME "os2"
-
-#else
-#define INITFUNC initposix
-#define MODNAME "posix"
-#endif
-
-PyMODINIT_FUNC
-INITFUNC(void)
-{
-    PyObject *m, *v;
-
-    m = Py_InitModule3(MODNAME,
-                       posix_methods,
-                       posix__doc__);
-    if (m == NULL)
-        return;
-
-    /* Initialize environ dictionary */
-    v = convertenviron();
-    Py_XINCREF(v);
-    if (v == NULL || PyModule_AddObject(m, "environ", v) != 0)
-        return;
-    Py_DECREF(v);
-
-    if (all_ins(m))
-        return;
-
-    if (setup_confname_tables(m))
-        return;
-
-    Py_INCREF(PyExc_OSError);
-    PyModule_AddObject(m, "error", PyExc_OSError);
-
-#ifdef HAVE_PUTENV
-    if (posix_putenv_garbage == NULL)
-        posix_putenv_garbage = PyDict_New();
-#endif
-
-    if (!initialized) {
-        stat_result_desc.name = MODNAME ".stat_result";
-        stat_result_desc.fields[7].name = PyStructSequence_UnnamedField;
-        stat_result_desc.fields[8].name = PyStructSequence_UnnamedField;
-        stat_result_desc.fields[9].name = PyStructSequence_UnnamedField;
-        PyStructSequence_InitType(&StatResultType, &stat_result_desc);
-        structseq_new = StatResultType.tp_new;
-        StatResultType.tp_new = statresult_new;
-
-        statvfs_result_desc.name = MODNAME ".statvfs_result";
-        PyStructSequence_InitType(&StatVFSResultType, &statvfs_result_desc);
-#ifdef NEED_TICKS_PER_SECOND
-#  if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
-        ticks_per_second = sysconf(_SC_CLK_TCK);
-#  elif defined(HZ)
-        ticks_per_second = HZ;
-#  else
-        ticks_per_second = 60; /* magic fallback value; may be bogus */
-#  endif
-#endif
-    }
-    Py_INCREF((PyObject*) &StatResultType);
-    PyModule_AddObject(m, "stat_result", (PyObject*) &StatResultType);
-    Py_INCREF((PyObject*) &StatVFSResultType);
-    PyModule_AddObject(m, "statvfs_result",
-                       (PyObject*) &StatVFSResultType);
-    initialized = 1;
-
-#ifdef __APPLE__
-    /*
-     * Step 2 of weak-linking support on Mac OS X.
-     *
-     * The code below removes functions that are not available on the
-     * currently active platform.
-     *
-     * This block allow one to use a python binary that was build on
-     * OSX 10.4 on OSX 10.3, without loosing access to new APIs on
-     * OSX 10.4.
-     */
-#ifdef HAVE_FSTATVFS
-    if (fstatvfs == NULL) {
-        if (PyObject_DelAttrString(m, "fstatvfs") == -1) {
-            return;
-        }
-    }
-#endif /* HAVE_FSTATVFS */
-
-#ifdef HAVE_STATVFS
-    if (statvfs == NULL) {
-        if (PyObject_DelAttrString(m, "statvfs") == -1) {
-            return;
-        }
-    }
-#endif /* HAVE_STATVFS */
-
-# ifdef HAVE_LCHOWN
-    if (lchown == NULL) {
-        if (PyObject_DelAttrString(m, "lchown") == -1) {
-            return;
-        }
-    }
-#endif /* HAVE_LCHOWN */
-
-
-#endif /* __APPLE__ */
-
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-

+ 0 - 57
package/python2/files/python-config.in

@@ -1,57 +0,0 @@
-#!@EXENAME@
-
-import sys
-import os
-import getopt
-import re
-from distutils import sysconfig
-
-valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags',
-              'ldflags', 'help']
-
-def exit_with_usage(code=1):
-    print >>sys.stderr, "Usage: %s [%s]" % (sys.argv[0],
-                                            '|'.join('--'+opt for opt in valid_opts))
-    sys.exit(code)
-
-try:
-    opts, args = getopt.getopt(sys.argv[1:], '', valid_opts)
-except getopt.error:
-    exit_with_usage()
-
-if not opts:
-    exit_with_usage()
-
-pyver = sysconfig.get_config_var('VERSION')
-getvar = sysconfig.get_config_var
-
-opt_flags = [flag for (flag, val) in opts]
-
-if '--help' in opt_flags:
-    exit_with_usage(code=0)
-
-for opt in opt_flags:
-    if opt == '--prefix':
-        print sysconfig.PREFIX
-
-    elif opt == '--exec-prefix':
-        print sysconfig.EXEC_PREFIX
-
-    elif opt in ('--includes', '--cflags'):
-        flags = ['-I' + re.sub('host_', 'target_', sysconfig.get_python_inc()),
-                 '-I' + re.sub('host_', 'target_', sysconfig.get_python_inc(plat_specific=True))]
-        if opt == '--cflags':
-            flags.extend(getvar('CFLAGS').split())
-        print ' '.join(flags)
-
-    elif opt in ('--libs', '--ldflags'):
-        libs = getvar('LIBS').split() + getvar('SYSLIBS').split()
-        libs.append('-lpython'+pyver)
-        # add the prefix/lib/pythonX.Y/config dir, but only if there is no
-        # shared library in prefix/lib/.
-        if opt == '--ldflags':
-            if not getvar('Py_ENABLE_SHARED'):
-                libs.insert(0, '-L' + getvar('LIBPL'))
-            libs.extend(getvar('LINKFORSHARED').split())
-        print ' '.join(libs)
-

+ 0 - 2076
package/python2/files/setup.py

@@ -1,2076 +0,0 @@
-# Autodetecting setup.py script for building the Python extensions
-#
-
-__version__ = "$Revision: 86041 $"
-
-import sys, os, imp, re, optparse
-from glob import glob
-from platform import machine as platform_machine
-import sysconfig
-
-from distutils import log
-from distutils import text_file
-from distutils.errors import *
-from distutils.core import Extension, setup
-from distutils.command.build_ext import build_ext
-from distutils.command.install import install
-from distutils.command.install_lib import install_lib
-from distutils.spawn import find_executable
-
-# Were we compiled --with-pydebug or with #define Py_DEBUG?
-COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount')
-
-# This global variable is used to hold the list of modules to be disabled.
-disabled_module_list = []
-
-def add_dir_to_list(dirlist, dir):
-    """Add the directory 'dir' to the list 'dirlist' (at the front) if
-    1) 'dir' is not already in 'dirlist'
-    2) 'dir' actually exists, and is a directory."""
-    if dir is not None and os.path.isdir(dir) and dir not in dirlist:
-        dirlist.insert(0, dir)
-
-def macosx_sdk_root():
-    """
-    Return the directory of the current OSX SDK,
-    or '/' if no SDK was specified.
-    """
-    cflags = sysconfig.get_config_var('CFLAGS')
-    m = re.search(r'-isysroot\s+(\S+)', cflags)
-    if m is None:
-        sysroot = '/'
-    else:
-        sysroot = m.group(1)
-    return sysroot
-
-def is_macosx_sdk_path(path):
-    """
-    Returns True if 'path' can be located in an OSX SDK
-    """
-    return (path.startswith('/usr/') and not path.startswith('/usr/local')) or path.startswith('/System/')
-
-def find_file(filename, std_dirs, paths):
-    """Searches for the directory where a given file is located,
-    and returns a possibly-empty list of additional directories, or None
-    if the file couldn't be found at all.
-
-    'filename' is the name of a file, such as readline.h or libcrypto.a.
-    'std_dirs' is the list of standard system directories; if the
-        file is found in one of them, no additional directives are needed.
-    'paths' is a list of additional locations to check; if the file is
-        found in one of them, the resulting list will contain the directory.
-    """
-    if sys.platform == 'darwin':
-        # Honor the MacOSX SDK setting when one was specified.
-        # An SDK is a directory with the same structure as a real
-        # system, but with only header files and libraries.
-        sysroot = macosx_sdk_root()
-
-    # Check the standard locations
-    for dir in std_dirs:
-        f = os.path.join(dir, filename)
-
-        if sys.platform == 'darwin' and is_macosx_sdk_path(dir):
-            f = os.path.join(sysroot, dir[1:], filename)
-
-        if os.path.exists(f): return []
-
-    # Check the additional directories
-    for dir in paths:
-        f = os.path.join(dir, filename)
-
-        if sys.platform == 'darwin' and is_macosx_sdk_path(dir):
-            f = os.path.join(sysroot, dir[1:], filename)
-
-        if os.path.exists(f):
-            return [dir]
-
-    # Not found anywhere
-    return None
-
-def find_library_file(compiler, libname, std_dirs, paths):
-    result = compiler.find_library_file(std_dirs + paths, libname)
-    if result is None:
-        return None
-
-    if sys.platform == 'darwin':
-        sysroot = macosx_sdk_root()
-
-    # Check whether the found file is in one of the standard directories
-    dirname = os.path.dirname(result)
-    for p in std_dirs:
-        # Ensure path doesn't end with path separator
-        p = p.rstrip(os.sep)
-
-        if sys.platform == 'darwin' and is_macosx_sdk_path(p):
-            if os.path.join(sysroot, p[1:]) == dirname:
-                return [ ]
-
-        if p == dirname:
-            return [ ]
-
-    # Otherwise, it must have been in one of the additional directories,
-    # so we have to figure out which one.
-    for p in paths:
-        # Ensure path doesn't end with path separator
-        p = p.rstrip(os.sep)
-
-        if sys.platform == 'darwin' and is_macosx_sdk_path(p):
-            if os.path.join(sysroot, p[1:]) == dirname:
-                return [ p ]
-
-        if p == dirname:
-            return [p]
-    else:
-        assert False, "Internal error: Path not found in std_dirs or paths"
-
-def module_enabled(extlist, modname):
-    """Returns whether the module 'modname' is present in the list
-    of extensions 'extlist'."""
-    extlist = [ext for ext in extlist if ext.name == modname]
-    return len(extlist)
-
-def find_module_file(module, dirlist):
-    """Find a module in a set of possible folders. If it is not found
-    return the unadorned filename"""
-    list = find_file(module, [], dirlist)
-    if not list:
-        return module
-    if len(list) > 1:
-        log.info("WARNING: multiple copies of %s found"%module)
-    return os.path.join(list[0], module)
-
-class PyBuildExt(build_ext):
-
-    def __init__(self, dist):
-        build_ext.__init__(self, dist)
-        self.failed = []
-
-    def build_extensions(self):
-
-        # Detect which modules should be compiled
-        missing = self.detect_modules()
-
-        # Remove modules that are present on the disabled list
-        extensions = [ext for ext in self.extensions
-                      if ext.name not in disabled_module_list]
-        # move ctypes to the end, it depends on other modules
-        ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
-        if "_ctypes" in ext_map:
-            ctypes = extensions.pop(ext_map["_ctypes"])
-            extensions.append(ctypes)
-        self.extensions = extensions
-
-        # Fix up the autodetected modules, prefixing all the source files
-        # with Modules/ and adding Python's include directory to the path.
-        (srcdir,) = sysconfig.get_config_vars('srcdir')
-        if not srcdir:
-            # Maybe running on Windows but not using CYGWIN?
-            raise ValueError("No source directory; cannot proceed.")
-        srcdir = os.path.abspath(srcdir)
-        moddirlist = [os.path.join(srcdir, 'Modules')]
-
-        # Platform-dependent module source and include directories
-        incdirlist = []
-        platform = self.get_platform()
-        if platform == 'darwin' and ("--disable-toolbox-glue" not in
-            sysconfig.get_config_var("CONFIG_ARGS")):
-            # Mac OS X also includes some mac-specific modules
-            macmoddir = os.path.join(srcdir, 'Mac/Modules')
-            moddirlist.append(macmoddir)
-            incdirlist.append(os.path.join(srcdir, 'Mac/Include'))
-
-        # Fix up the paths for scripts, too
-        self.distribution.scripts = [os.path.join(srcdir, filename)
-                                     for filename in self.distribution.scripts]
-
-        # Python header files
-        headers = [sysconfig.get_config_h_filename()]
-        headers += glob(os.path.join(sysconfig.get_path('platinclude'), "*.h"))
-        for ext in self.extensions[:]:
-            ext.sources = [ find_module_file(filename, moddirlist)
-                            for filename in ext.sources ]
-            if ext.depends is not None:
-                ext.depends = [find_module_file(filename, moddirlist)
-                               for filename in ext.depends]
-            else:
-                ext.depends = []
-            # re-compile extensions if a header file has been changed
-            ext.depends.extend(headers)
-
-            # platform specific include directories
-            ext.include_dirs.extend(incdirlist)
-
-            # If a module has already been built statically,
-            # don't build it here
-            if ext.name in sys.builtin_module_names:
-                self.extensions.remove(ext)
-
-        # Parse Modules/Setup and Modules/Setup.local to figure out which
-        # modules are turned on in the file.
-        remove_modules = []
-        for filename in ('Modules/Setup', 'Modules/Setup.local'):
-            input = text_file.TextFile(filename, join_lines=1)
-            while 1:
-                line = input.readline()
-                if not line: break
-                line = line.split()
-                remove_modules.append(line[0])
-            input.close()
-
-        for ext in self.extensions[:]:
-            if ext.name in remove_modules:
-                self.extensions.remove(ext)
-
-        # When you run "make CC=altcc" or something similar, you really want
-        # those environment variables passed into the setup.py phase.  Here's
-        # a small set of useful ones.
-        compiler = os.environ.get('CC')
-        args = {}
-        # unfortunately, distutils doesn't let us provide separate C and C++
-        # compilers
-        if compiler is not None:
-            (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
-            args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
-        self.compiler.set_executables(**args)
-
-        build_ext.build_extensions(self)
-
-        longest = max([len(e.name) for e in self.extensions])
-        if self.failed:
-            longest = max(longest, max([len(name) for name in self.failed]))
-
-        def print_three_column(lst):
-            lst.sort(key=str.lower)
-            # guarantee zip() doesn't drop anything
-            while len(lst) % 3:
-                lst.append("")
-            for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
-                print "%-*s   %-*s   %-*s" % (longest, e, longest, f,
-                                              longest, g)
-
-        if missing:
-            print
-            print ("Python build finished, but the necessary bits to build "
-                   "these modules were not found:")
-            print_three_column(missing)
-            print ("To find the necessary bits, look in setup.py in"
-                   " detect_modules() for the module's name.")
-            print
-
-        if self.failed:
-            failed = self.failed[:]
-            print
-            print "Failed to build these modules:"
-            print_three_column(failed)
-            print
-
-    def build_extension(self, ext):
-
-        if ext.name == '_ctypes':
-            if not self.configure_ctypes(ext):
-                return
-
-        try:
-            build_ext.build_extension(self, ext)
-        except (CCompilerError, DistutilsError), why:
-            self.announce('WARNING: building of extension "%s" failed: %s' %
-                          (ext.name, sys.exc_info()[1]))
-            self.failed.append(ext.name)
-            return
-        # Workaround for Mac OS X: The Carbon-based modules cannot be
-        # reliably imported into a command-line Python
-        if 'Carbon' in ext.extra_link_args:
-            self.announce(
-                'WARNING: skipping import check for Carbon-based "%s"' %
-                ext.name)
-            return
-
-        if self.get_platform() == 'darwin' and (
-                sys.maxint > 2**32 and '-arch' in ext.extra_link_args):
-            # Don't bother doing an import check when an extension was
-            # build with an explicit '-arch' flag on OSX. That's currently
-            # only used to build 32-bit only extensions in a 4-way
-            # universal build and loading 32-bit code into a 64-bit
-            # process will fail.
-            self.announce(
-                'WARNING: skipping import check for "%s"' %
-                ext.name)
-            return
-
-        # Workaround for Cygwin: Cygwin currently has fork issues when many
-        # modules have been imported
-        if self.get_platform() == 'cygwin':
-            self.announce('WARNING: skipping import check for Cygwin-based "%s"'
-                % ext.name)
-            return
-        ext_filename = os.path.join(
-            self.build_lib,
-            self.get_ext_filename(self.get_ext_fullname(ext.name)))
-        try:
-            imp.load_dynamic(ext.name, ext_filename)
-        except ImportError, why:
-            self.failed.append(ext.name)
-            self.announce('*** WARNING: renaming "%s" since importing it'
-                          ' failed: %s' % (ext.name, why), level=3)
-            assert not self.inplace
-            basename, tail = os.path.splitext(ext_filename)
-            newname = basename + "_failed" + tail
-            if os.path.exists(newname):
-                os.remove(newname)
-            os.rename(ext_filename, newname)
-
-            # XXX -- This relies on a Vile HACK in
-            # distutils.command.build_ext.build_extension().  The
-            # _built_objects attribute is stored there strictly for
-            # use here.
-            # If there is a failure, _built_objects may not be there,
-            # so catch the AttributeError and move on.
-            try:
-                for filename in self._built_objects:
-                    os.remove(filename)
-            except AttributeError:
-                self.announce('unable to remove files (ignored)')
-        except:
-            exc_type, why, tb = sys.exc_info()
-            self.announce('*** WARNING: importing extension "%s" '
-                          'failed with %s: %s' % (ext.name, exc_type, why),
-                          level=3)
-            self.failed.append(ext.name)
-
-    def get_platform(self):
-        # Get value of sys.platform
-        for platform in ['cygwin', 'beos', 'darwin', 'atheos', 'osf1']:
-            if sys.platform.startswith(platform):
-                return platform
-        return sys.platform
-
-    def add_multiarch_paths(self):
-        # Debian/Ubuntu multiarch support.
-        # https://wiki.ubuntu.com/MultiarchSpec
-        if not find_executable('dpkg-architecture'):
-            return
-        tmpfile = os.path.join(self.build_temp, 'multiarch')
-        if not os.path.exists(self.build_temp):
-            os.makedirs(self.build_temp)
-        ret = os.system(
-            'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
-            tmpfile)
-        try:
-            if ret >> 8 == 0:
-                with open(tmpfile) as fp:
-                    multiarch_path_component = fp.readline().strip()
-                add_dir_to_list(self.compiler.library_dirs,
-                                '/usr/lib/' + multiarch_path_component)
-                add_dir_to_list(self.compiler.include_dirs,
-                                '/usr/include/' + multiarch_path_component)
-        finally:
-            os.unlink(tmpfile)
-
-    def detect_modules(self):
-        # Ensure that /usr/local is always used
-        add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
-        add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
-	self.add_multiarch_paths()
-
-        # Add paths specified in the environment variables LDFLAGS and
-        # CPPFLAGS for header and library files.
-        # We must get the values from the Makefile and not the environment
-        # directly since an inconsistently reproducible issue comes up where
-        # the environment variable is not set even though the value were passed
-        # into configure and stored in the Makefile (issue found on OS X 10.3).
-        for env_var, arg_name, dir_list in (
-                ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
-                ('LDFLAGS', '-L', self.compiler.library_dirs),
-                ('CPPFLAGS', '-I', self.compiler.include_dirs)):
-            env_val = sysconfig.get_config_var(env_var)
-            if env_val:
-                # To prevent optparse from raising an exception about any
-                # options in env_val that it doesn't know about we strip out
-                # all double dashes and any dashes followed by a character
-                # that is not for the option we are dealing with.
-                #
-                # Please note that order of the regex is important!  We must
-                # strip out double-dashes first so that we don't end up with
-                # substituting "--Long" to "-Long" and thus lead to "ong" being
-                # used for a library directory.
-                env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
-                                 ' ', env_val)
-                parser = optparse.OptionParser()
-                # Make sure that allowing args interspersed with options is
-                # allowed
-                parser.allow_interspersed_args = True
-                parser.error = lambda msg: None
-                parser.add_option(arg_name, dest="dirs", action="append")
-                options = parser.parse_args(env_val.split())[0]
-                if options.dirs:
-                    for directory in reversed(options.dirs):
-                        add_dir_to_list(dir_list, directory)
-
-        if os.path.normpath(sys.prefix) != '/usr' \
-                and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
-            # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
-            # (PYTHONFRAMEWORK is set) to avoid # linking problems when
-            # building a framework with different architectures than
-            # the one that is currently installed (issue #7473)
-            add_dir_to_list(self.compiler.library_dirs,
-                            sysconfig.get_config_var("LIBDIR"))
-            add_dir_to_list(self.compiler.include_dirs,
-                            sysconfig.get_config_var("INCLUDEDIR"))
-
-        try:
-            have_unicode = unicode
-        except NameError:
-            have_unicode = 0
-
-        # lib_dirs and inc_dirs are used to search for files;
-        # if a file is found in one of those directories, it can
-        # be assumed that no additional -I,-L directives are needed.
-        lib_dirs = self.compiler.library_dirs + [
-            '/lib64', '/usr/lib64',
-            '/lib', '/usr/lib',
-            ]
-        inc_dirs = self.compiler.include_dirs + ['/usr/include']
-        exts = []
-        missing = []
-
-        config_h = sysconfig.get_config_h_filename()
-        config_h_vars = sysconfig.parse_config_h(open(config_h))
-
-        platform = self.get_platform()
-        srcdir = sysconfig.get_config_var('srcdir')
-
-        # Check for AtheOS which has libraries in non-standard locations
-        if platform == 'atheos':
-            lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
-            lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
-            inc_dirs += ['/system/include', '/atheos/autolnk/include']
-            inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
-
-        # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
-        if platform in ['osf1', 'unixware7', 'openunix8']:
-            lib_dirs += ['/usr/ccs/lib']
-
-        if platform == 'darwin':
-            # This should work on any unixy platform ;-)
-            # If the user has bothered specifying additional -I and -L flags
-            # in OPT and LDFLAGS we might as well use them here.
-            #   NOTE: using shlex.split would technically be more correct, but
-            # also gives a bootstrap problem. Let's hope nobody uses directories
-            # with whitespace in the name to store libraries.
-            cflags, ldflags = sysconfig.get_config_vars(
-                    'CFLAGS', 'LDFLAGS')
-            for item in cflags.split():
-                if item.startswith('-I'):
-                    inc_dirs.append(item[2:])
-
-            for item in ldflags.split():
-                if item.startswith('-L'):
-                    lib_dirs.append(item[2:])
-
-        # Check for MacOS X, which doesn't need libm.a at all
-        math_libs = ['m']
-        if platform in ['darwin', 'beos']:
-            math_libs = []
-
-        # XXX Omitted modules: gl, pure, dl, SGI-specific modules
-
-        #
-        # The following modules are all pretty straightforward, and compile
-        # on pretty much any POSIXish platform.
-        #
-
-        # Some modules that are normally always on:
-        #exts.append( Extension('_weakref', ['_weakref.c']) )
-
-        # array objects
-        exts.append( Extension('array', ['arraymodule.c']) )
-        # complex math library functions
-        exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
-                               depends=['_math.h'],
-                               libraries=math_libs) )
-        # math library functions, e.g. sin()
-        exts.append( Extension('math',  ['mathmodule.c', '_math.c'],
-                               depends=['_math.h'],
-                               libraries=math_libs) )
-        # fast string operations implemented in C
-        exts.append( Extension('strop', ['stropmodule.c']) )
-        # time operations and variables
-        exts.append( Extension('time', ['timemodule.c'],
-                               libraries=math_libs) )
-        exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
-                               libraries=math_libs) )
-        # fast iterator tools implemented in C
-        exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
-        # code that will be builtins in the future, but conflict with the
-        #  current builtins
-        exts.append( Extension('future_builtins', ['future_builtins.c']) )
-        # random number generator implemented in C
-        exts.append( Extension("_random", ["_randommodule.c"]) )
-        # high-performance collections
-        exts.append( Extension("_collections", ["_collectionsmodule.c"]) )
-        # bisect
-        exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
-        # heapq
-        exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
-        # operator.add() and similar goodies
-        exts.append( Extension('operator', ['operator.c']) )
-        # Python 3.1 _io library
-        exts.append( Extension("_io",
-            ["_io/bufferedio.c", "_io/bytesio.c", "_io/fileio.c",
-             "_io/iobase.c", "_io/_iomodule.c", "_io/stringio.c", "_io/textio.c"],
-             depends=["_io/_iomodule.h"], include_dirs=["Modules/_io"]))
-        # _functools
-        exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
-        # _json speedups
-        exts.append( Extension("_json", ["_json.c"]) )
-        # Python C API test module
-        exts.append( Extension('_testcapi', ['_testcapimodule.c'],
-                               depends=['testcapi_long.h']) )
-        # profilers (_lsprof is for cProfile.py)
-        exts.append( Extension('_hotshot', ['_hotshot.c']) )
-        exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
-        # static Unicode character database
-        if have_unicode:
-            exts.append( Extension('unicodedata', ['unicodedata.c']) )
-        else:
-            missing.append('unicodedata')
-        # access to ISO C locale support
-        data = open('pyconfig.h').read()
-        m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
-        if m is not None:
-            locale_libs = ['intl']
-        else:
-            locale_libs = []
-        if platform == 'darwin':
-            locale_extra_link_args = ['-framework', 'CoreFoundation']
-        else:
-            locale_extra_link_args = []
-
-
-        exts.append( Extension('_locale', ['_localemodule.c'],
-                               libraries=locale_libs,
-                               extra_link_args=locale_extra_link_args) )
-
-        # Modules with some UNIX dependencies -- on by default:
-        # (If you have a really backward UNIX, select and socket may not be
-        # supported...)
-
-        # fcntl(2) and ioctl(2)
-        libs = []
-        if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
-            # May be necessary on AIX for flock function
-            libs = ['bsd']
-        exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
-        # pwd(3)
-        exts.append( Extension('pwd', ['pwdmodule.c']) )
-        # grp(3)
-        exts.append( Extension('grp', ['grpmodule.c']) )
-        # spwd, shadow passwords
-        if (config_h_vars.get('HAVE_GETSPNAM', False) or
-                config_h_vars.get('HAVE_GETSPENT', False)):
-            exts.append( Extension('spwd', ['spwdmodule.c']) )
-        else:
-            missing.append('spwd')
-
-        # select(2); not on ancient System V
-        exts.append( Extension('select', ['selectmodule.c']) )
-
-        # Fred Drake's interface to the Python parser
-        exts.append( Extension('parser', ['parsermodule.c']) )
-
-        # cStringIO and cPickle
-        exts.append( Extension('cStringIO', ['cStringIO.c']) )
-        exts.append( Extension('cPickle', ['cPickle.c']) )
-
-        # Memory-mapped files (also works on Win32).
-        if platform not in ['atheos']:
-            exts.append( Extension('mmap', ['mmapmodule.c']) )
-        else:
-            missing.append('mmap')
-
-        # Lance Ellinghaus's syslog module
-        # syslog daemon interface
-        exts.append( Extension('syslog', ['syslogmodule.c']) )
-
-        # George Neville-Neil's timing module:
-        # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
-        # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
-        #exts.append( Extension('timing', ['timingmodule.c']) )
-
-        #
-        # Here ends the simple stuff.  From here on, modules need certain
-        # libraries, are platform-specific, or present other surprises.
-        #
-
-        # Multimedia modules
-        # These don't work for 64-bit platforms!!!
-        # These represent audio samples or images as strings:
-
-        # Operations on audio samples
-        # According to #993173, this one should actually work fine on
-        # 64-bit platforms.
-        exts.append( Extension('audioop', ['audioop.c']) )
-
-        # Disabled on 64-bit platforms
-        if sys.maxint != 9223372036854775807L:
-            # Operations on images
-            exts.append( Extension('imageop', ['imageop.c']) )
-        else:
-            missing.extend(['imageop'])
-
-        # readline
-        do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
-        readline_termcap_library = ""
-        curses_library = ""
-        # Determine if readline is already linked against curses or tinfo.
-        if do_readline and find_executable('ldd'):
-            fp = os.popen("ldd %s" % do_readline)
-            ldd_output = fp.readlines()
-            ret = fp.close()
-            if ret is None or ret >> 8 == 0:
-                for ln in ldd_output:
-                    if 'curses' in ln:
-                        readline_termcap_library = re.sub(
-                            r'.*lib(n?cursesw?)\.so.*', r'\1', ln
-                        ).rstrip()
-                        break
-                    if 'tinfo' in ln: # termcap interface split out from ncurses
-                        readline_termcap_library = 'tinfo'
-                        break
-        # Issue 7384: If readline is already linked against curses,
-        # use the same library for the readline and curses modules.
-        if 'curses' in readline_termcap_library:
-            curses_library = readline_termcap_library
-        elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
-            curses_library = 'ncursesw'
-        elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
-            curses_library = 'ncurses'
-        elif self.compiler.find_library_file(lib_dirs, 'curses'):
-            curses_library = 'curses'
-
-        if platform == 'darwin':
-            os_release = int(os.uname()[2].split('.')[0])
-            dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
-            if dep_target and dep_target.split('.') < ['10', '5']:
-                os_release = 8
-            if os_release < 9:
-                # MacOSX 10.4 has a broken readline. Don't try to build
-                # the readline module unless the user has installed a fixed
-                # readline package
-                if find_file('readline/rlconf.h', inc_dirs, []) is None:
-                    do_readline = False
-        if do_readline:
-            if platform == 'darwin' and os_release < 9:
-                # In every directory on the search path search for a dynamic
-                # library and then a static library, instead of first looking
-                # for dynamic libraries on the entiry path.
-                # This way a staticly linked custom readline gets picked up
-                # before the (possibly broken) dynamic library in /usr/lib.
-                readline_extra_link_args = ('-Wl,-search_paths_first',)
-            else:
-                readline_extra_link_args = ()
-
-            readline_libs = ['readline']
-            if readline_termcap_library:
-                pass # Issue 7384: Already linked against curses or tinfo.
-            elif curses_library:
-                readline_libs.append(curses_library)
-            elif self.compiler.find_library_file(lib_dirs +
-                                                     ['/usr/lib/termcap'],
-                                                     'termcap'):
-                readline_libs.append('termcap')
-            exts.append( Extension('readline', ['readline.c'],
-                                   library_dirs=['/usr/lib/termcap'],
-                                   extra_link_args=readline_extra_link_args,
-                                   libraries=readline_libs) )
-        else:
-            missing.append('readline')
-
-        # crypt module.
-
-        if self.compiler.find_library_file(lib_dirs, 'crypt'):
-            libs = ['crypt']
-        else:
-            libs = []
-        exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
-
-        # CSV files
-        exts.append( Extension('_csv', ['_csv.c']) )
-
-        # socket(2)
-        exts.append( Extension('_socket', ['socketmodule.c'],
-                               depends = ['socketmodule.h']) )
-        # Detect SSL support for the socket module (via _ssl)
-        search_for_ssl_incs_in = [
-                              '/usr/local/ssl/include',
-                              '/usr/contrib/ssl/include/'
-                             ]
-        ssl_incs = find_file('openssl/ssl.h', inc_dirs,
-                             search_for_ssl_incs_in
-                             )
-        if ssl_incs is not None:
-            krb5_h = find_file('krb5.h', inc_dirs,
-                               ['/usr/kerberos/include'])
-            if krb5_h:
-                ssl_incs += krb5_h
-        ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
-                                     ['/usr/local/ssl/lib',
-                                      '/usr/contrib/ssl/lib/'
-                                     ] )
-
-        if (ssl_incs is not None and
-            ssl_libs is not None):
-            exts.append( Extension('_ssl', ['_ssl.c'],
-                                   include_dirs = ssl_incs,
-                                   library_dirs = ssl_libs,
-                                   libraries = ['ssl', 'crypto'],
-                                   depends = ['socketmodule.h']), )
-        else:
-            missing.append('_ssl')
-
-        # find out which version of OpenSSL we have
-        openssl_ver = 0
-        openssl_ver_re = re.compile(
-            '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
-
-        # look for the openssl version header on the compiler search path.
-        opensslv_h = find_file('openssl/opensslv.h', [],
-                inc_dirs + search_for_ssl_incs_in)
-        if opensslv_h:
-            name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
-            if sys.platform == 'darwin' and is_macosx_sdk_path(name):
-                name = os.path.join(macosx_sdk_root(), name[1:])
-            try:
-                incfile = open(name, 'r')
-                for line in incfile:
-                    m = openssl_ver_re.match(line)
-                    if m:
-                        openssl_ver = eval(m.group(1))
-            except IOError, msg:
-                print "IOError while reading opensshv.h:", msg
-                pass
-
-        min_openssl_ver = 0x00907000
-        have_any_openssl = ssl_incs is not None and ssl_libs is not None
-        have_usable_openssl = (have_any_openssl and
-                               openssl_ver >= min_openssl_ver)
-
-        if have_any_openssl:
-            if have_usable_openssl:
-                # The _hashlib module wraps optimized implementations
-                # of hash functions from the OpenSSL library.
-                exts.append( Extension('_hashlib', ['_hashopenssl.c'],
-                                       include_dirs = ssl_incs,
-                                       library_dirs = ssl_libs,
-                                       libraries = ['ssl', 'crypto']) )
-            else:
-                print ("warning: openssl 0x%08x is too old for _hashlib" %
-                       openssl_ver)
-                missing.append('_hashlib')
-        if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
-            # The _sha module implements the SHA1 hash algorithm.
-            exts.append( Extension('_sha', ['shamodule.c']) )
-            # The _md5 module implements the RSA Data Security, Inc. MD5
-            # Message-Digest Algorithm, described in RFC 1321.  The
-            # necessary files md5.c and md5.h are included here.
-            exts.append( Extension('_md5',
-                            sources = ['md5module.c', 'md5.c'],
-                            depends = ['md5.h']) )
-
-        min_sha2_openssl_ver = 0x00908000
-        if COMPILED_WITH_PYDEBUG or openssl_ver < min_sha2_openssl_ver:
-            # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
-            exts.append( Extension('_sha256', ['sha256module.c']) )
-            exts.append( Extension('_sha512', ['sha512module.c']) )
-
-        # Modules that provide persistent dictionary-like semantics.  You will
-        # probably want to arrange for at least one of them to be available on
-        # your machine, though none are defined by default because of library
-        # dependencies.  The Python module anydbm.py provides an
-        # implementation independent wrapper for these; dumbdbm.py provides
-        # similar functionality (but slower of course) implemented in Python.
-
-        # Sleepycat^WOracle Berkeley DB interface.
-        #  http://www.oracle.com/database/berkeley-db/db/index.html
-        #
-        # This requires the Sleepycat^WOracle DB code. The supported versions
-        # are set below.  Visit the URL above to download
-        # a release.  Most open source OSes come with one or more
-        # versions of BerkeleyDB already installed.
-
-        max_db_ver = (4, 8)
-        min_db_ver = (4, 1)
-        db_setup_debug = False   # verbose debug prints from this script?
-
-        def allow_db_ver(db_ver):
-            """Returns a boolean if the given BerkeleyDB version is acceptable.
-
-            Args:
-              db_ver: A tuple of the version to verify.
-            """
-            if not (min_db_ver <= db_ver <= max_db_ver):
-                return False
-            # Use this function to filter out known bad configurations.
-            if (4, 6) == db_ver[:2]:
-                # BerkeleyDB 4.6.x is not stable on many architectures.
-                arch = platform_machine()
-                if arch not in ('i386', 'i486', 'i586', 'i686',
-                                'x86_64', 'ia64'):
-                    return False
-            return True
-
-        def gen_db_minor_ver_nums(major):
-            if major == 4:
-                for x in range(max_db_ver[1]+1):
-                    if allow_db_ver((4, x)):
-                        yield x
-            elif major == 3:
-                for x in (3,):
-                    if allow_db_ver((3, x)):
-                        yield x
-            else:
-                raise ValueError("unknown major BerkeleyDB version", major)
-
-        # construct a list of paths to look for the header file in on
-        # top of the normal inc_dirs.
-        db_inc_paths = [
-            '/usr/include/db4',
-            '/usr/local/include/db4',
-            '/opt/sfw/include/db4',
-            '/usr/include/db3',
-            '/usr/local/include/db3',
-            '/opt/sfw/include/db3',
-            # Fink defaults (http://fink.sourceforge.net/)
-            '/sw/include/db4',
-            '/sw/include/db3',
-        ]
-        # 4.x minor number specific paths
-        for x in gen_db_minor_ver_nums(4):
-            db_inc_paths.append('/usr/include/db4%d' % x)
-            db_inc_paths.append('/usr/include/db4.%d' % x)
-            db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
-            db_inc_paths.append('/usr/local/include/db4%d' % x)
-            db_inc_paths.append('/pkg/db-4.%d/include' % x)
-            db_inc_paths.append('/opt/db-4.%d/include' % x)
-            # MacPorts default (http://www.macports.org/)
-            db_inc_paths.append('/opt/local/include/db4%d' % x)
-        # 3.x minor number specific paths
-        for x in gen_db_minor_ver_nums(3):
-            db_inc_paths.append('/usr/include/db3%d' % x)
-            db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
-            db_inc_paths.append('/usr/local/include/db3%d' % x)
-            db_inc_paths.append('/pkg/db-3.%d/include' % x)
-            db_inc_paths.append('/opt/db-3.%d/include' % x)
-
-        # Add some common subdirectories for Sleepycat DB to the list,
-        # based on the standard include directories. This way DB3/4 gets
-        # picked up when it is installed in a non-standard prefix and
-        # the user has added that prefix into inc_dirs.
-        std_variants = []
-        for dn in inc_dirs:
-            std_variants.append(os.path.join(dn, 'db3'))
-            std_variants.append(os.path.join(dn, 'db4'))
-            for x in gen_db_minor_ver_nums(4):
-                std_variants.append(os.path.join(dn, "db4%d"%x))
-                std_variants.append(os.path.join(dn, "db4.%d"%x))
-            for x in gen_db_minor_ver_nums(3):
-                std_variants.append(os.path.join(dn, "db3%d"%x))
-                std_variants.append(os.path.join(dn, "db3.%d"%x))
-
-        db_inc_paths = std_variants + db_inc_paths
-        db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
-
-        db_ver_inc_map = {}
-
-        if sys.platform == 'darwin':
-            sysroot = macosx_sdk_root()
-
-        class db_found(Exception): pass
-        try:
-            # See whether there is a Sleepycat header in the standard
-            # search path.
-            for d in inc_dirs + db_inc_paths:
-                f = os.path.join(d, "db.h")
-
-                if sys.platform == 'darwin' and is_macosx_sdk_path(d):
-                    f = os.path.join(sysroot, d[1:], "db.h")
-
-                if db_setup_debug: print "db: looking for db.h in", f
-                if os.path.exists(f):
-                    f = open(f).read()
-                    m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
-                    if m:
-                        db_major = int(m.group(1))
-                        m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
-                        db_minor = int(m.group(1))
-                        db_ver = (db_major, db_minor)
-
-                        # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
-                        if db_ver == (4, 6):
-                            m = re.search(r"#define\WDB_VERSION_PATCH\W(\d+)", f)
-                            db_patch = int(m.group(1))
-                            if db_patch < 21:
-                                print "db.h:", db_ver, "patch", db_patch,
-                                print "being ignored (4.6.x must be >= 4.6.21)"
-                                continue
-
-                        if ( (db_ver not in db_ver_inc_map) and
-                            allow_db_ver(db_ver) ):
-                            # save the include directory with the db.h version
-                            # (first occurrence only)
-                            db_ver_inc_map[db_ver] = d
-                            if db_setup_debug:
-                                print "db.h: found", db_ver, "in", d
-                        else:
-                            # we already found a header for this library version
-                            if db_setup_debug: print "db.h: ignoring", d
-                    else:
-                        # ignore this header, it didn't contain a version number
-                        if db_setup_debug:
-                            print "db.h: no version number version in", d
-
-            db_found_vers = db_ver_inc_map.keys()
-            db_found_vers.sort()
-
-            while db_found_vers:
-                db_ver = db_found_vers.pop()
-                db_incdir = db_ver_inc_map[db_ver]
-
-                # check lib directories parallel to the location of the header
-                db_dirs_to_check = [
-                    db_incdir.replace("include", 'lib64'),
-                    db_incdir.replace("include", 'lib'),
-                ]
-
-                if sys.platform != 'darwin':
-                    db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
-
-                else:
-                    # Same as other branch, but takes OSX SDK into account
-                    tmp = []
-                    for dn in db_dirs_to_check:
-                        if is_macosx_sdk_path(dn):
-                            if os.path.isdir(os.path.join(sysroot, dn[1:])):
-                                tmp.append(dn)
-                        else:
-                            if os.path.isdir(dn):
-                                tmp.append(dn)
-                    db_dirs_to_check = tmp
-
-                # Look for a version specific db-X.Y before an ambiguoius dbX
-                # XXX should we -ever- look for a dbX name?  Do any
-                # systems really not name their library by version and
-                # symlink to more general names?
-                for dblib in (('db-%d.%d' % db_ver),
-                              ('db%d%d' % db_ver),
-                              ('db%d' % db_ver[0])):
-                    dblib_file = self.compiler.find_library_file(
-                                    db_dirs_to_check + lib_dirs, dblib )
-                    if dblib_file:
-                        dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
-                        raise db_found
-                    else:
-                        if db_setup_debug: print "db lib: ", dblib, "not found"
-
-        except db_found:
-            if db_setup_debug:
-                print "bsddb using BerkeleyDB lib:", db_ver, dblib
-                print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir
-            db_incs = [db_incdir]
-            dblibs = [dblib]
-            # We add the runtime_library_dirs argument because the
-            # BerkeleyDB lib we're linking against often isn't in the
-            # system dynamic library search path.  This is usually
-            # correct and most trouble free, but may cause problems in
-            # some unusual system configurations (e.g. the directory
-            # is on an NFS server that goes away).
-            exts.append(Extension('_bsddb', ['_bsddb.c'],
-                                  depends = ['bsddb.h'],
-                                  library_dirs=dblib_dir,
-                                  runtime_library_dirs=dblib_dir,
-                                  include_dirs=db_incs,
-                                  libraries=dblibs))
-        else:
-            if db_setup_debug: print "db: no appropriate library found"
-            db_incs = None
-            dblibs = []
-            dblib_dir = None
-            missing.append('_bsddb')
-
-        # The sqlite interface
-        sqlite_setup_debug = False   # verbose debug prints from this script?
-
-        # We hunt for #define SQLITE_VERSION "n.n.n"
-        # We need to find >= sqlite version 3.0.8
-        sqlite_incdir = sqlite_libdir = None
-        sqlite_inc_paths = [ '/usr/include',
-                             '/usr/include/sqlite',
-                             '/usr/include/sqlite3',
-                             '/usr/local/include',
-                             '/usr/local/include/sqlite',
-                             '/usr/local/include/sqlite3',
-                           ]
-        MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
-        MIN_SQLITE_VERSION = ".".join([str(x)
-                                    for x in MIN_SQLITE_VERSION_NUMBER])
-
-        # Scan the default include directories before the SQLite specific
-        # ones. This allows one to override the copy of sqlite on OSX,
-        # where /usr/include contains an old version of sqlite.
-        if sys.platform == 'darwin':
-            sysroot = macosx_sdk_root()
-
-        for d in inc_dirs + sqlite_inc_paths:
-            f = os.path.join(d, "sqlite3.h")
-
-            if sys.platform == 'darwin' and is_macosx_sdk_path(d):
-                f = os.path.join(sysroot, d[1:], "sqlite3.h")
-
-            if os.path.exists(f):
-                if sqlite_setup_debug: print "sqlite: found %s"%f
-                incf = open(f).read()
-                m = re.search(
-                    r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"(.*)"', incf)
-                if m:
-                    sqlite_version = m.group(1)
-                    sqlite_version_tuple = tuple([int(x)
-                                        for x in sqlite_version.split(".")])
-                    if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
-                        # we win!
-                        if sqlite_setup_debug:
-                            print "%s/sqlite3.h: version %s"%(d, sqlite_version)
-                        sqlite_incdir = d
-                        break
-                    else:
-                        if sqlite_setup_debug:
-                            print "%s: version %d is too old, need >= %s"%(d,
-                                        sqlite_version, MIN_SQLITE_VERSION)
-                elif sqlite_setup_debug:
-                    print "sqlite: %s had no SQLITE_VERSION"%(f,)
-
-        if sqlite_incdir:
-            sqlite_dirs_to_check = [
-                os.path.join(sqlite_incdir, '..', 'lib64'),
-                os.path.join(sqlite_incdir, '..', 'lib'),
-                os.path.join(sqlite_incdir, '..', '..', 'lib64'),
-                os.path.join(sqlite_incdir, '..', '..', 'lib'),
-            ]
-            sqlite_libfile = self.compiler.find_library_file(
-                                sqlite_dirs_to_check + lib_dirs, 'sqlite3')
-            if sqlite_libfile:
-                sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
-
-        if sqlite_incdir and sqlite_libdir:
-            sqlite_srcs = ['_sqlite/cache.c',
-                '_sqlite/connection.c',
-                '_sqlite/cursor.c',
-                '_sqlite/microprotocols.c',
-                '_sqlite/module.c',
-                '_sqlite/prepare_protocol.c',
-                '_sqlite/row.c',
-                '_sqlite/statement.c',
-                '_sqlite/util.c', ]
-
-            sqlite_defines = []
-            if sys.platform != "win32":
-                sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
-            else:
-                sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
-
-            # Comment this out if you want the sqlite3 module to be able to load extensions.
-            sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
-
-            if sys.platform == 'darwin':
-                # In every directory on the search path search for a dynamic
-                # library and then a static library, instead of first looking
-                # for dynamic libraries on the entiry path.
-                # This way a staticly linked custom sqlite gets picked up
-                # before the dynamic library in /usr/lib.
-                sqlite_extra_link_args = ('-Wl,-search_paths_first',)
-            else:
-                sqlite_extra_link_args = ()
-
-            exts.append(Extension('_sqlite3', sqlite_srcs,
-                                  define_macros=sqlite_defines,
-                                  include_dirs=["Modules/_sqlite",
-                                                sqlite_incdir],
-                                  library_dirs=sqlite_libdir,
-                                  runtime_library_dirs=sqlite_libdir,
-                                  extra_link_args=sqlite_extra_link_args,
-                                  libraries=["sqlite3",]))
-        else:
-            missing.append('_sqlite3')
-
-        # Look for Berkeley db 1.85.   Note that it is built as a different
-        # module name so it can be included even when later versions are
-        # available.  A very restrictive search is performed to avoid
-        # accidentally building this module with a later version of the
-        # underlying db library.  May BSD-ish Unixes incorporate db 1.85
-        # symbols into libc and place the include file in /usr/include.
-        #
-        # If the better bsddb library can be built (db_incs is defined)
-        # we do not build this one.  Otherwise this build will pick up
-        # the more recent berkeleydb's db.h file first in the include path
-        # when attempting to compile and it will fail.
-        f = "/usr/include/db.h"
-
-        if sys.platform == 'darwin':
-            if is_macosx_sdk_path(f):
-                sysroot = macosx_sdk_root()
-                f = os.path.join(sysroot, f[1:])
-
-        if os.path.exists(f) and not db_incs:
-            data = open(f).read()
-            m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
-            if m is not None:
-                # bingo - old version used hash file format version 2
-                ### XXX this should be fixed to not be platform-dependent
-                ### but I don't have direct access to an osf1 platform and
-                ### seemed to be muffing the search somehow
-                libraries = platform == "osf1" and ['db'] or None
-                if libraries is not None:
-                    exts.append(Extension('bsddb185', ['bsddbmodule.c'],
-                                          libraries=libraries))
-                else:
-                    exts.append(Extension('bsddb185', ['bsddbmodule.c']))
-            else:
-                missing.append('bsddb185')
-        else:
-            missing.append('bsddb185')
-
-        dbm_order = ['gdbm']
-        # The standard Unix dbm module:
-        if platform not in ['cygwin']:
-            config_args = [arg.strip("'")
-                           for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
-            dbm_args = [arg for arg in config_args
-                        if arg.startswith('--with-dbmliborder=')]
-            if dbm_args:
-                dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
-            else:
-                dbm_order = "ndbm:gdbm:bdb".split(":")
-            dbmext = None
-            for cand in dbm_order:
-                if cand == "ndbm":
-                    if find_file("ndbm.h", inc_dirs, []) is not None:
-                        # Some systems have -lndbm, others don't
-                        if self.compiler.find_library_file(lib_dirs,
-                                                               'ndbm'):
-                            ndbm_libs = ['ndbm']
-                        else:
-                            ndbm_libs = []
-                        print "building dbm using ndbm"
-                        dbmext = Extension('dbm', ['dbmmodule.c'],
-                                           define_macros=[
-                                               ('HAVE_NDBM_H',None),
-                                               ],
-                                           libraries=ndbm_libs)
-                        break
-
-                elif cand == "gdbm":
-                    if self.compiler.find_library_file(lib_dirs, 'gdbm'):
-                        gdbm_libs = ['gdbm']
-                        if self.compiler.find_library_file(lib_dirs,
-                                                               'gdbm_compat'):
-                            gdbm_libs.append('gdbm_compat')
-                        if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
-                            print "building dbm using gdbm"
-                            dbmext = Extension(
-                                'dbm', ['dbmmodule.c'],
-                                define_macros=[
-                                    ('HAVE_GDBM_NDBM_H', None),
-                                    ],
-                                libraries = gdbm_libs)
-                            break
-                        if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
-                            print "building dbm using gdbm"
-                            dbmext = Extension(
-                                'dbm', ['dbmmodule.c'],
-                                define_macros=[
-                                    ('HAVE_GDBM_DASH_NDBM_H', None),
-                                    ],
-                                libraries = gdbm_libs)
-                            break
-                elif cand == "bdb":
-                    if db_incs is not None:
-                        print "building dbm using bdb"
-                        dbmext = Extension('dbm', ['dbmmodule.c'],
-                                           library_dirs=dblib_dir,
-                                           runtime_library_dirs=dblib_dir,
-                                           include_dirs=db_incs,
-                                           define_macros=[
-                                               ('HAVE_BERKDB_H', None),
-                                               ('DB_DBM_HSEARCH', None),
-                                               ],
-                                           libraries=dblibs)
-                        break
-            if dbmext is not None:
-                exts.append(dbmext)
-            else:
-                missing.append('dbm')
-
-        # Anthony Baxter's gdbm module.  GNU dbm(3) will require -lgdbm:
-        if ('gdbm' in dbm_order and
-            self.compiler.find_library_file(lib_dirs, 'gdbm')):
-            exts.append( Extension('gdbm', ['gdbmmodule.c'],
-                                   libraries = ['gdbm'] ) )
-        else:
-            missing.append('gdbm')
-
-        # Unix-only modules
-        if platform not in ['win32']:
-            # Steen Lumholt's termios module
-            exts.append( Extension('termios', ['termios.c']) )
-            # Jeremy Hylton's rlimit interface
-            if platform not in ['atheos']:
-                exts.append( Extension('resource', ['resource.c']) )
-            else:
-                missing.append('resource')
-
-            # Sun yellow pages. Some systems have the functions in libc.
-            if (platform not in ['cygwin', 'atheos', 'qnx6'] and
-                find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
-                if (self.compiler.find_library_file(lib_dirs, 'nsl')):
-                    libs = ['nsl']
-                else:
-                    libs = []
-                exts.append( Extension('nis', ['nismodule.c'],
-                                       libraries = libs) )
-            else:
-                missing.append('nis')
-        else:
-            missing.extend(['nis', 'resource', 'termios'])
-
-        # Curses support, requiring the System V version of curses, often
-        # provided by the ncurses library.
-        panel_library = 'panel'
-        if curses_library.startswith('ncurses'):
-            if curses_library == 'ncursesw':
-                # Bug 1464056: If _curses.so links with ncursesw,
-                # _curses_panel.so must link with panelw.
-                panel_library = 'panelw'
-            curses_libs = [curses_library]
-            exts.append( Extension('_curses', ['_cursesmodule.c'],
-                                   libraries = curses_libs) )
-        elif curses_library == 'curses' and platform != 'darwin':
-                # OSX has an old Berkeley curses, not good enough for
-                # the _curses module.
-            if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
-                curses_libs = ['curses', 'terminfo']
-            elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
-                curses_libs = ['curses', 'termcap']
-            else:
-                curses_libs = ['curses']
-
-            exts.append( Extension('_curses', ['_cursesmodule.c'],
-                                   libraries = curses_libs) )
-        else:
-            missing.append('_curses')
-
-        # If the curses module is enabled, check for the panel module
-        if (module_enabled(exts, '_curses') and
-            self.compiler.find_library_file(lib_dirs, panel_library)):
-            exts.append( Extension('_curses_panel', ['_curses_panel.c'],
-                                   libraries = [panel_library] + curses_libs) )
-        else:
-            missing.append('_curses_panel')
-
-        # Andrew Kuchling's zlib module.  Note that some versions of zlib
-        # 1.1.3 have security problems.  See CERT Advisory CA-2002-07:
-        # http://www.cert.org/advisories/CA-2002-07.html
-        #
-        # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
-        # patch its zlib 1.1.3 package instead of upgrading to 1.1.4.  For
-        # now, we still accept 1.1.3, because we think it's difficult to
-        # exploit this in Python, and we'd rather make it RedHat's problem
-        # than our problem <wink>.
-        #
-        # You can upgrade zlib to version 1.1.4 yourself by going to
-        # http://www.gzip.org/zlib/
-        zlib_inc = find_file('zlib.h', [], inc_dirs)
-        have_zlib = False
-        if zlib_inc is not None:
-            zlib_h = zlib_inc[0] + '/zlib.h'
-            version = '"0.0.0"'
-            version_req = '"1.1.3"'
-            fp = open(zlib_h)
-            while 1:
-                line = fp.readline()
-                if not line:
-                    break
-                if line.startswith('#define ZLIB_VERSION'):
-                    version = line.split()[2]
-                    break
-            if version >= version_req:
-                if (self.compiler.find_library_file(lib_dirs, 'z')):
-                    if sys.platform == "darwin":
-                        zlib_extra_link_args = ('-Wl,-search_paths_first',)
-                    else:
-                        zlib_extra_link_args = ()
-                    exts.append( Extension('zlib', ['zlibmodule.c'],
-                                           libraries = ['z'],
-                                           extra_link_args = zlib_extra_link_args))
-                    have_zlib = True
-                else:
-                    missing.append('zlib')
-            else:
-                missing.append('zlib')
-        else:
-            missing.append('zlib')
-
-        # Helper module for various ascii-encoders.  Uses zlib for an optimized
-        # crc32 if we have it.  Otherwise binascii uses its own.
-        if have_zlib:
-            extra_compile_args = ['-DUSE_ZLIB_CRC32']
-            libraries = ['z']
-            extra_link_args = zlib_extra_link_args
-        else:
-            extra_compile_args = []
-            libraries = []
-            extra_link_args = []
-        exts.append( Extension('binascii', ['binascii.c'],
-                               extra_compile_args = extra_compile_args,
-                               libraries = libraries,
-                               extra_link_args = extra_link_args) )
-
-        # Gustavo Niemeyer's bz2 module.
-        if (self.compiler.find_library_file(lib_dirs, 'bz2')):
-            if sys.platform == "darwin":
-                bz2_extra_link_args = ('-Wl,-search_paths_first',)
-            else:
-                bz2_extra_link_args = ()
-            exts.append( Extension('bz2', ['bz2module.c'],
-                                   libraries = ['bz2'],
-                                   extra_link_args = bz2_extra_link_args) )
-        else:
-            missing.append('bz2')
-
-        # Interface to the Expat XML parser
-        #
-        # Expat was written by James Clark and is now maintained by a group of
-        # developers on SourceForge; see www.libexpat.org for more information.
-        # The pyexpat module was written by Paul Prescod after a prototype by
-        # Jack Jansen.  The Expat source is included in Modules/expat/.  Usage
-        # of a system shared libexpat.so is possible with --with-system-expat
-        # configure option.
-        #
-        # More information on Expat can be found at www.libexpat.org.
-        #
-        if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
-            expat_inc = []
-            define_macros = []
-            expat_lib = ['expat']
-            expat_sources = []
-        else:
-            expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
-            define_macros = [
-                ('HAVE_EXPAT_CONFIG_H', '1'),
-            ]
-            expat_lib = []
-            expat_sources = ['expat/xmlparse.c',
-                             'expat/xmlrole.c',
-                             'expat/xmltok.c']
-
-        exts.append(Extension('pyexpat',
-                              define_macros = define_macros,
-                              include_dirs = expat_inc,
-                              libraries = expat_lib,
-                              sources = ['pyexpat.c'] + expat_sources
-                              ))
-
-        # Fredrik Lundh's cElementTree module.  Note that this also
-        # uses expat (via the CAPI hook in pyexpat).
-
-        if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
-            define_macros.append(('USE_PYEXPAT_CAPI', None))
-            exts.append(Extension('_elementtree',
-                                  define_macros = define_macros,
-                                  include_dirs = expat_inc,
-                                  libraries = expat_lib,
-                                  sources = ['_elementtree.c'],
-                                  ))
-        else:
-            missing.append('_elementtree')
-
-        # Hye-Shik Chang's CJKCodecs modules.
-        if have_unicode:
-            exts.append(Extension('_multibytecodec',
-                                  ['cjkcodecs/multibytecodec.c']))
-            for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
-                exts.append(Extension('_codecs_%s' % loc,
-                                      ['cjkcodecs/_codecs_%s.c' % loc]))
-        else:
-            missing.append('_multibytecodec')
-            for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
-                missing.append('_codecs_%s' % loc)
-
-        # Dynamic loading module
-        if sys.maxint == 0x7fffffff:
-            # This requires sizeof(int) == sizeof(long) == sizeof(char*)
-            dl_inc = find_file('dlfcn.h', [], inc_dirs)
-            if (dl_inc is not None) and (platform not in ['atheos']):
-                exts.append( Extension('dl', ['dlmodule.c']) )
-            else:
-                missing.append('dl')
-        else:
-            missing.append('dl')
-
-        # Thomas Heller's _ctypes module
-        self.detect_ctypes(inc_dirs, lib_dirs)
-
-        # Richard Oudkerk's multiprocessing module
-        if platform == 'win32':             # Windows
-            macros = dict()
-            libraries = ['ws2_32']
-
-        elif platform == 'darwin':          # Mac OSX
-            macros = dict()
-            libraries = []
-
-        elif platform == 'cygwin':          # Cygwin
-            macros = dict()
-            libraries = []
-
-        elif platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
-            # FreeBSD's P1003.1b semaphore support is very experimental
-            # and has many known problems. (as of June 2008)
-            macros = dict()
-            libraries = []
-
-        elif platform.startswith('openbsd'):
-            macros = dict()
-            libraries = []
-
-        elif platform.startswith('netbsd'):
-            macros = dict()
-            libraries = []
-
-        else:                                   # Linux and other unices
-            macros = dict()
-            libraries = ['rt']
-
-        if platform == 'win32':
-            multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
-                                     '_multiprocessing/semaphore.c',
-                                     '_multiprocessing/pipe_connection.c',
-                                     '_multiprocessing/socket_connection.c',
-                                     '_multiprocessing/win32_functions.c'
-                                   ]
-
-        else:
-            multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
-                                     '_multiprocessing/socket_connection.c'
-                                   ]
-            if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
-                sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
-                multiprocessing_srcs.append('_multiprocessing/semaphore.c')
-
-        if sysconfig.get_config_var('WITH_THREAD'):
-            exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
-                                    define_macros=macros.items(),
-                                    include_dirs=["Modules/_multiprocessing"]))
-        else:
-            missing.append('_multiprocessing')
-
-        # End multiprocessing
-
-
-        # Platform-specific libraries
-        if platform == 'linux2':
-            # Linux-specific modules
-            exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
-        else:
-            missing.append('linuxaudiodev')
-
-        if (platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
-                        'freebsd7', 'freebsd8')
-            or platform.startswith("gnukfreebsd")):
-            exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
-        else:
-            missing.append('ossaudiodev')
-
-        if platform == 'sunos5':
-            # SunOS specific modules
-            exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
-        else:
-            missing.append('sunaudiodev')
-
-        if platform == 'darwin':
-            # _scproxy
-            exts.append(Extension("_scproxy", [os.path.join(srcdir, "Mac/Modules/_scproxy.c")],
-                extra_link_args= [
-                    '-framework', 'SystemConfiguration',
-                    '-framework', 'CoreFoundation'
-                ]))
-
-
-        if platform == 'darwin' and ("--disable-toolbox-glue" not in
-                sysconfig.get_config_var("CONFIG_ARGS")):
-
-            if int(os.uname()[2].split('.')[0]) >= 8:
-                # We're on Mac OS X 10.4 or later, the compiler should
-                # support '-Wno-deprecated-declarations'. This will
-                # surpress deprecation warnings for the Carbon extensions,
-                # these extensions wrap the Carbon APIs and even those
-                # parts that are deprecated.
-                carbon_extra_compile_args = ['-Wno-deprecated-declarations']
-            else:
-                carbon_extra_compile_args = []
-
-            # Mac OS X specific modules.
-            def macSrcExists(name1, name2=''):
-                if not name1:
-                    return None
-                names = (name1,)
-                if name2:
-                    names = (name1, name2)
-                path = os.path.join(srcdir, 'Mac', 'Modules', *names)
-                return os.path.exists(path)
-
-            def addMacExtension(name, kwds, extra_srcs=[]):
-                dirname = ''
-                if name[0] == '_':
-                    dirname = name[1:].lower()
-                cname = name + '.c'
-                cmodulename = name + 'module.c'
-                # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
-                if macSrcExists(cname):
-                    srcs = [cname]
-                elif macSrcExists(cmodulename):
-                    srcs = [cmodulename]
-                elif macSrcExists(dirname, cname):
-                    # XXX(nnorwitz): If all the names ended with module, we
-                    # wouldn't need this condition.  ibcarbon is the only one.
-                    srcs = [os.path.join(dirname, cname)]
-                elif macSrcExists(dirname, cmodulename):
-                    srcs = [os.path.join(dirname, cmodulename)]
-                else:
-                    raise RuntimeError("%s not found" % name)
-
-                # Here's the whole point:  add the extension with sources
-                exts.append(Extension(name, srcs + extra_srcs, **kwds))
-
-            # Core Foundation
-            core_kwds = {'extra_compile_args': carbon_extra_compile_args,
-                         'extra_link_args': ['-framework', 'CoreFoundation'],
-                        }
-            addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
-            addMacExtension('autoGIL', core_kwds)
-
-
-
-            # Carbon
-            carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
-                           'extra_link_args': ['-framework', 'Carbon'],
-                          }
-            CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
-                           'OSATerminology', 'icglue',
-                           # All these are in subdirs
-                           '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
-                           '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
-                           '_Help', '_Icn', '_IBCarbon', '_List',
-                           '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
-                           '_Scrap', '_Snd', '_TE',
-                          ]
-            for name in CARBON_EXTS:
-                addMacExtension(name, carbon_kwds)
-
-            # Workaround for a bug in the version of gcc shipped with Xcode 3.
-            # The _Win extension should build just like the other Carbon extensions, but
-            # this actually results in a hard crash of the linker.
-            #
-            if '-arch ppc64' in cflags and '-arch ppc' in cflags:
-                win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'],
-                               'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'],
-                           }
-                addMacExtension('_Win', win_kwds)
-            else:
-                addMacExtension('_Win', carbon_kwds)
-
-
-            # Application Services & QuickTime
-            app_kwds = {'extra_compile_args': carbon_extra_compile_args,
-                        'extra_link_args': ['-framework','ApplicationServices'],
-                       }
-            addMacExtension('_Launch', app_kwds)
-            addMacExtension('_CG', app_kwds)
-
-            exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
-                        extra_compile_args=carbon_extra_compile_args,
-                        extra_link_args=['-framework', 'QuickTime',
-                                     '-framework', 'Carbon']) )
-
-
-        self.extensions.extend(exts)
-
-        # Call the method for detecting whether _tkinter can be compiled
-        self.detect_tkinter(inc_dirs, lib_dirs)
-
-        if '_tkinter' not in [e.name for e in self.extensions]:
-            missing.append('_tkinter')
-
-        return missing
-
-    def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
-        # The _tkinter module, using frameworks. Since frameworks are quite
-        # different the UNIX search logic is not sharable.
-        from os.path import join, exists
-        framework_dirs = [
-            '/Library/Frameworks',
-            '/System/Library/Frameworks/',
-            join(os.getenv('HOME'), '/Library/Frameworks')
-        ]
-
-        sysroot = macosx_sdk_root()
-
-        # Find the directory that contains the Tcl.framework and Tk.framework
-        # bundles.
-        # XXX distutils should support -F!
-        for F in framework_dirs:
-            # both Tcl.framework and Tk.framework should be present
-
-
-            for fw in 'Tcl', 'Tk':
-                if is_macosx_sdk_path(F):
-                    if not exists(join(sysroot, F[1:], fw + '.framework')):
-                        break
-                else:
-                    if not exists(join(F, fw + '.framework')):
-                        break
-            else:
-                # ok, F is now directory with both frameworks. Continure
-                # building
-                break
-        else:
-            # Tk and Tcl frameworks not found. Normal "unix" tkinter search
-            # will now resume.
-            return 0
-
-        # For 8.4a2, we must add -I options that point inside the Tcl and Tk
-        # frameworks. In later release we should hopefully be able to pass
-        # the -F option to gcc, which specifies a framework lookup path.
-        #
-        include_dirs = [
-            join(F, fw + '.framework', H)
-            for fw in 'Tcl', 'Tk'
-            for H in 'Headers', 'Versions/Current/PrivateHeaders'
-        ]
-
-        # For 8.4a2, the X11 headers are not included. Rather than include a
-        # complicated search, this is a hard-coded path. It could bail out
-        # if X11 libs are not found...
-        include_dirs.append('/usr/X11R6/include')
-        frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
-
-        # All existing framework builds of Tcl/Tk don't support 64-bit
-        # architectures.
-        cflags = sysconfig.get_config_vars('CFLAGS')[0]
-        archs = re.findall('-arch\s+(\w+)', cflags)
-
-        if is_macosx_sdk_path(F):
-            fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),))
-        else:
-            fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,))
-
-        detected_archs = []
-        for ln in fp:
-            a = ln.split()[-1]
-            if a in archs:
-                detected_archs.append(ln.split()[-1])
-        fp.close()
-
-        for a in detected_archs:
-            frameworks.append('-arch')
-            frameworks.append(a)
-
-        ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
-                        define_macros=[('WITH_APPINIT', 1)],
-                        include_dirs = include_dirs,
-                        libraries = [],
-                        extra_compile_args = frameworks[2:],
-                        extra_link_args = frameworks,
-                        )
-        self.extensions.append(ext)
-        return 1
-
-
-    def detect_tkinter(self, inc_dirs, lib_dirs):
-        # The _tkinter module.
-
-        # Rather than complicate the code below, detecting and building
-        # AquaTk is a separate method. Only one Tkinter will be built on
-        # Darwin - either AquaTk, if it is found, or X11 based Tk.
-        platform = self.get_platform()
-        if (platform == 'darwin' and
-            self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
-            return
-
-        # Assume we haven't found any of the libraries or include files
-        # The versions with dots are used on Unix, and the versions without
-        # dots on Windows, for detection by cygwin.
-        tcllib = tklib = tcl_includes = tk_includes = None
-        for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
-                        '8.2', '82', '8.1', '81', '8.0', '80']:
-            tklib = self.compiler.find_library_file(lib_dirs,
-                                                        'tk' + version)
-            tcllib = self.compiler.find_library_file(lib_dirs,
-                                                         'tcl' + version)
-            if tklib and tcllib:
-                # Exit the loop when we've found the Tcl/Tk libraries
-                break
-
-        # Now check for the header files
-        if tklib and tcllib:
-            # Check for the include files on Debian and {Free,Open}BSD, where
-            # they're put in /usr/include/{tcl,tk}X.Y
-            dotversion = version
-            if '.' not in dotversion and "bsd" in sys.platform.lower():
-                # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
-                # but the include subdirs are named like .../include/tcl8.3.
-                dotversion = dotversion[:-1] + '.' + dotversion[-1]
-            tcl_include_sub = []
-            tk_include_sub = []
-            for dir in inc_dirs:
-                tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
-                tk_include_sub += [dir + os.sep + "tk" + dotversion]
-            tk_include_sub += tcl_include_sub
-            tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
-            tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
-
-        if (tcllib is None or tklib is None or
-            tcl_includes is None or tk_includes is None):
-            self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
-            return
-
-        # OK... everything seems to be present for Tcl/Tk.
-
-        include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
-        for dir in tcl_includes + tk_includes:
-            if dir not in include_dirs:
-                include_dirs.append(dir)
-
-        # Check for various platform-specific directories
-        if platform == 'sunos5':
-            include_dirs.append('/usr/openwin/include')
-            added_lib_dirs.append('/usr/openwin/lib')
-        elif os.path.exists('/usr/X11R6/include'):
-            include_dirs.append('/usr/X11R6/include')
-            added_lib_dirs.append('/usr/X11R6/lib64')
-            added_lib_dirs.append('/usr/X11R6/lib')
-        elif os.path.exists('/usr/X11R5/include'):
-            include_dirs.append('/usr/X11R5/include')
-            added_lib_dirs.append('/usr/X11R5/lib')
-        else:
-            # Assume default location for X11
-            include_dirs.append('/usr/X11/include')
-            added_lib_dirs.append('/usr/X11/lib')
-
-        # If Cygwin, then verify that X is installed before proceeding
-        if platform == 'cygwin':
-            x11_inc = find_file('X11/Xlib.h', [], include_dirs)
-            if x11_inc is None:
-                return
-
-        # Check for BLT extension
-        if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
-                                               'BLT8.0'):
-            defs.append( ('WITH_BLT', 1) )
-            libs.append('BLT8.0')
-        elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
-                                                'BLT'):
-            defs.append( ('WITH_BLT', 1) )
-            libs.append('BLT')
-
-        # Add the Tcl/Tk libraries
-        libs.append('tk'+ version)
-        libs.append('tcl'+ version)
-
-        if platform in ['aix3', 'aix4']:
-            libs.append('ld')
-
-        # Finally, link with the X11 libraries (not appropriate on cygwin)
-        if platform != "cygwin":
-            libs.append('X11')
-
-        ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
-                        define_macros=[('WITH_APPINIT', 1)] + defs,
-                        include_dirs = include_dirs,
-                        libraries = libs,
-                        library_dirs = added_lib_dirs,
-                        )
-        self.extensions.append(ext)
-
-##         # Uncomment these lines if you want to play with xxmodule.c
-##         ext = Extension('xx', ['xxmodule.c'])
-##         self.extensions.append(ext)
-
-        # XXX handle these, but how to detect?
-        # *** Uncomment and edit for PIL (TkImaging) extension only:
-        #       -DWITH_PIL -I../Extensions/Imaging/libImaging  tkImaging.c \
-        # *** Uncomment and edit for TOGL extension only:
-        #       -DWITH_TOGL togl.c \
-        # *** Uncomment these for TOGL extension only:
-        #       -lGL -lGLU -lXext -lXmu \
-
-    def configure_ctypes_darwin(self, ext):
-        # Darwin (OS X) uses preconfigured files, in
-        # the Modules/_ctypes/libffi_osx directory.
-        srcdir = sysconfig.get_config_var('srcdir')
-        ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
-                                                  '_ctypes', 'libffi_osx'))
-        sources = [os.path.join(ffi_srcdir, p)
-                   for p in ['ffi.c',
-                             'x86/darwin64.S',
-                             'x86/x86-darwin.S',
-                             'x86/x86-ffi_darwin.c',
-                             'x86/x86-ffi64.c',
-                             'powerpc/ppc-darwin.S',
-                             'powerpc/ppc-darwin_closure.S',
-                             'powerpc/ppc-ffi_darwin.c',
-                             'powerpc/ppc64-darwin_closure.S',
-                             ]]
-
-        # Add .S (preprocessed assembly) to C compiler source extensions.
-        self.compiler.src_extensions.append('.S')
-
-        include_dirs = [os.path.join(ffi_srcdir, 'include'),
-                        os.path.join(ffi_srcdir, 'powerpc')]
-        ext.include_dirs.extend(include_dirs)
-        ext.sources.extend(sources)
-        return True
-
-    def configure_ctypes(self, ext):
-        if not self.use_system_libffi:
-            if sys.platform == 'darwin':
-                return self.configure_ctypes_darwin(ext)
-
-            srcdir = sysconfig.get_config_var('srcdir')
-            ffi_builddir = os.path.join(self.build_temp, 'libffi')
-            ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
-                                         '_ctypes', 'libffi'))
-            ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
-
-            from distutils.dep_util import newer_group
-
-            config_sources = [os.path.join(ffi_srcdir, fname)
-                              for fname in os.listdir(ffi_srcdir)
-                              if os.path.isfile(os.path.join(ffi_srcdir, fname))]
-            if self.force or newer_group(config_sources,
-                                         ffi_configfile):
-                from distutils.dir_util import mkpath
-                mkpath(ffi_builddir)
-                config_args = []
-
-                # Pass empty CFLAGS because we'll just append the resulting
-                # CFLAGS to Python's; -g or -O2 is to be avoided.
-                cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
-                      % (ffi_builddir, ffi_srcdir, " ".join(config_args))
-
-                res = os.system(cmd)
-                if res or not os.path.exists(ffi_configfile):
-                    print "Failed to configure _ctypes module"
-                    return False
-
-            fficonfig = {}
-            with open(ffi_configfile) as f:
-                exec f in fficonfig
-
-            # Add .S (preprocessed assembly) to C compiler source extensions.
-            self.compiler.src_extensions.append('.S')
-
-            include_dirs = [os.path.join(ffi_builddir, 'include'),
-                            ffi_builddir,
-                            os.path.join(ffi_srcdir, 'src')]
-            extra_compile_args = fficonfig['ffi_cflags'].split()
-
-            ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
-                               fficonfig['ffi_sources'])
-            ext.include_dirs.extend(include_dirs)
-            ext.extra_compile_args.extend(extra_compile_args)
-        return True
-
-    def detect_ctypes(self, inc_dirs, lib_dirs):
-        self.use_system_libffi = False
-        include_dirs = []
-        extra_compile_args = []
-        extra_link_args = []
-        sources = ['_ctypes/_ctypes.c',
-                   '_ctypes/callbacks.c',
-                   '_ctypes/callproc.c',
-                   '_ctypes/stgdict.c',
-                   '_ctypes/cfield.c']
-        depends = ['_ctypes/ctypes.h']
-
-        if sys.platform == 'darwin':
-            sources.append('_ctypes/malloc_closure.c')
-            sources.append('_ctypes/darwin/dlfcn_simple.c')
-            extra_compile_args.append('-DMACOSX')
-            include_dirs.append('_ctypes/darwin')
-# XXX Is this still needed?
-##            extra_link_args.extend(['-read_only_relocs', 'warning'])
-
-        elif sys.platform == 'sunos5':
-            # XXX This shouldn't be necessary; it appears that some
-            # of the assembler code is non-PIC (i.e. it has relocations
-            # when it shouldn't. The proper fix would be to rewrite
-            # the assembler code to be PIC.
-            # This only works with GCC; the Sun compiler likely refuses
-            # this option. If you want to compile ctypes with the Sun
-            # compiler, please research a proper solution, instead of
-            # finding some -z option for the Sun compiler.
-            extra_link_args.append('-mimpure-text')
-
-        elif sys.platform.startswith('hp-ux'):
-            extra_link_args.append('-fPIC')
-
-        ext = Extension('_ctypes',
-                        include_dirs=include_dirs,
-                        extra_compile_args=extra_compile_args,
-                        extra_link_args=extra_link_args,
-                        libraries=[],
-                        sources=sources,
-                        depends=depends)
-        ext_test = Extension('_ctypes_test',
-                             sources=['_ctypes/_ctypes_test.c'])
-        self.extensions.extend([ext, ext_test])
-
-        if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
-            return
-
-        if sys.platform == 'darwin':
-            # OS X 10.5 comes with libffi.dylib; the include files are
-            # in /usr/include/ffi
-            inc_dirs.append('/usr/include/ffi')
-
-        ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
-        if not ffi_inc or ffi_inc[0] == '':
-            ffi_inc = find_file('ffi.h', [], inc_dirs)
-        if ffi_inc is not None:
-            ffi_h = ffi_inc[0] + '/ffi.h'
-            fp = open(ffi_h)
-            while 1:
-                line = fp.readline()
-                if not line:
-                    ffi_inc = None
-                    break
-                if line.startswith('#define LIBFFI_H'):
-                    break
-        ffi_lib = None
-        if ffi_inc is not None:
-            for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
-                if (self.compiler.find_library_file(lib_dirs, lib_name)):
-                    ffi_lib = lib_name
-                    break
-
-        if ffi_inc and ffi_lib:
-            ext.include_dirs.extend(ffi_inc)
-            ext.libraries.append(ffi_lib)
-            self.use_system_libffi = True
-
-
-class PyBuildInstall(install):
-    # Suppress the warning about installation into the lib_dynload
-    # directory, which is not in sys.path when running Python during
-    # installation:
-    def initialize_options (self):
-        install.initialize_options(self)
-        self.warn_dir=0
-
-class PyBuildInstallLib(install_lib):
-    # Do exactly what install_lib does but make sure correct access modes get
-    # set on installed directories and files. All installed files with get
-    # mode 644 unless they are a shared library in which case they will get
-    # mode 755. All installed directories will get mode 755.
-
-    so_ext = sysconfig.get_config_var("SO")
-
-    def install(self):
-        outfiles = install_lib.install(self)
-        self.set_file_modes(outfiles, 0644, 0755)
-        self.set_dir_modes(self.install_dir, 0755)
-        return outfiles
-
-    def set_file_modes(self, files, defaultMode, sharedLibMode):
-        if not self.is_chmod_supported(): return
-        if not files: return
-
-        for filename in files:
-            if os.path.islink(filename): continue
-            mode = defaultMode
-            if filename.endswith(self.so_ext): mode = sharedLibMode
-            log.info("changing mode of %s to %o", filename, mode)
-            if not self.dry_run: os.chmod(filename, mode)
-
-    def set_dir_modes(self, dirname, mode):
-        if not self.is_chmod_supported(): return
-        os.path.walk(dirname, self.set_dir_modes_visitor, mode)
-
-    def set_dir_modes_visitor(self, mode, dirname, names):
-        if os.path.islink(dirname): return
-        log.info("changing mode of %s to %o", dirname, mode)
-        if not self.dry_run: os.chmod(dirname, mode)
-
-    def is_chmod_supported(self):
-        return hasattr(os, 'chmod')
-
-SUMMARY = """
-Python is an interpreted, interactive, object-oriented programming
-language. It is often compared to Tcl, Perl, Scheme or Java.
-
-Python combines remarkable power with very clear syntax. It has
-modules, classes, exceptions, very high level dynamic data types, and
-dynamic typing. There are interfaces to many system calls and
-libraries, as well as to various windowing systems (X11, Motif, Tk,
-Mac, MFC). New built-in modules are easily written in C or C++. Python
-is also usable as an extension language for applications that need a
-programmable interface.
-
-The Python implementation is portable: it runs on many brands of UNIX,
-on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
-listed here, it may still be supported, if there's a C compiler for
-it. Ask around on comp.lang.python -- or just try compiling Python
-yourself.
-"""
-
-CLASSIFIERS = """
-Development Status :: 6 - Mature
-License :: OSI Approved :: Python Software Foundation License
-Natural Language :: English
-Programming Language :: C
-Programming Language :: Python
-Topic :: Software Development
-"""
-
-def main():
-    # turn off warnings when deprecated modules are imported
-    import warnings
-    warnings.filterwarnings("ignore",category=DeprecationWarning)
-    setup(# PyPI Metadata (PEP 301)
-          name = "Python",
-          version = sys.version.split()[0],
-          url = "http://www.python.org/%s" % sys.version[:3],
-          maintainer = "Guido van Rossum and the Python community",
-          maintainer_email = "python-dev@python.org",
-          description = "A high-level object-oriented programming language",
-          long_description = SUMMARY.strip(),
-          license = "PSF license",
-          classifiers = filter(None, CLASSIFIERS.split("\n")),
-          platforms = ["Many"],
-
-          # Build info
-          cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
-                      'install_lib':PyBuildInstallLib},
-          # The struct module is defined here, because build_ext won't be
-          # called unless there's at least one extension module defined.
-          ext_modules=[Extension('_struct', ['_struct.c'])],
-
-          # Scripts to install
-          scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
-                     'Tools/scripts/2to3',
-                     'Lib/smtpd.py']
-        )
-
-# --install-platlib
-if __name__ == '__main__':
-    main()

+ 0 - 572
package/python2/files/sysconfig.py

@@ -1,572 +0,0 @@
-"""Provide access to Python's configuration information.  The specific
-configuration variables available depend heavily on the platform and
-configuration.  The values may be retrieved using
-get_config_var(name), and the list of variables is available via
-get_config_vars().keys().  Additional convenience functions are also
-available.
-
-Written by:   Fred L. Drake, Jr.
-Email:        <fdrake@acm.org>
-"""
-
-__revision__ = "$Id: sysconfig.py 86264 2010-11-06 14:16:30Z eric.araujo $"
-
-import os
-import re
-import string
-import sys
-
-from distutils.errors import DistutilsPlatformError
-
-# These are needed in a couple of spots, so just compute them once.
-PREFIX = os.path.normpath(sys.prefix)
-EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
-
-# Path to the base directory of the project. On Windows the binary may
-# live in project/PCBuild9.  If we're dealing with an x64 Windows build,
-# it'll live in project/PCbuild/amd64.
-project_base = os.path.dirname(os.path.abspath(sys.executable))
-if os.name == "nt" and "pcbuild" in project_base[-8:].lower():
-    project_base = os.path.abspath(os.path.join(project_base, os.path.pardir))
-# PC/VS7.1
-if os.name == "nt" and "\\pc\\v" in project_base[-10:].lower():
-    project_base = os.path.abspath(os.path.join(project_base, os.path.pardir,
-                                                os.path.pardir))
-# PC/AMD64
-if os.name == "nt" and "\\pcbuild\\amd64" in project_base[-14:].lower():
-    project_base = os.path.abspath(os.path.join(project_base, os.path.pardir,
-                                                os.path.pardir))
-
-# python_build: (Boolean) if true, we're either building Python or
-# building an extension with an un-installed Python, so we use
-# different (hard-wired) directories.
-# Setup.local is available for Makefile builds including VPATH builds,
-# Setup.dist is available on Windows
-def _python_build():
-    for fn in ("Setup.dist", "Setup.local"):
-        if os.path.isfile(os.path.join(project_base, "Modules", fn)):
-            return True
-    return False
-python_build = _python_build()
-
-
-def get_python_version():
-    """Return a string containing the major and minor Python version,
-    leaving off the patchlevel.  Sample return values could be '1.5'
-    or '2.2'.
-    """
-    return sys.version[:3]
-
-
-def get_python_inc(plat_specific=0, prefix=None):
-    """Return the directory containing installed Python header files.
-
-    If 'plat_specific' is false (the default), this is the path to the
-    non-platform-specific header files, i.e. Python.h and so on;
-    otherwise, this is the path to platform-specific header files
-    (namely pyconfig.h).
-
-    If 'prefix' is supplied, use it instead of sys.prefix or
-    sys.exec_prefix -- i.e., ignore 'plat_specific'.
-    """
-    if prefix is None:
-        prefix = plat_specific and EXEC_PREFIX or PREFIX
-        prefix = re.sub('host_', 'target_', prefix)
-
-    if os.name == "posix":
-        if python_build:
-            buildir = re.sub('host_', 'target_', os.path.dirname(sys.executable))
-            if plat_specific:
-                # python.h is located in the buildir
-                inc_dir = buildir
-            else:
-                # the source dir is relative to the buildir
-                srcdir = os.path.abspath(os.path.join(buildir,
-                                         get_config_var('srcdir')))
-                # Include is located in the srcdir
-                inc_dir = os.path.join(srcdir, "Include")
-            return inc_dir
-        return os.path.join(prefix, "include", "python" + get_python_version())
-    elif os.name == "nt":
-        return os.path.join(prefix, "include")
-    elif os.name == "os2":
-        return os.path.join(prefix, "Include")
-    else:
-        raise DistutilsPlatformError(
-            "I don't know where Python installs its C header files "
-            "on platform '%s'" % os.name)
-
-
-def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
-    """Return the directory containing the Python library (standard or
-    site additions).
-
-    If 'plat_specific' is true, return the directory containing
-    platform-specific modules, i.e. any module from a non-pure-Python
-    module distribution; otherwise, return the platform-shared library
-    directory.  If 'standard_lib' is true, return the directory
-    containing standard Python library modules; otherwise, return the
-    directory for site-specific modules.
-
-    If 'prefix' is supplied, use it instead of sys.prefix or
-    sys.exec_prefix -- i.e., ignore 'plat_specific'.
-    """
-    if prefix is None:
-        prefix = plat_specific and EXEC_PREFIX or PREFIX
-
-    if os.name == "posix":
-        libpython = os.path.join(prefix,
-                                 "lib", "python" + get_python_version())
-        if standard_lib:
-            return libpython
-        else:
-            return os.path.join(libpython, "site-packages")
-
-    elif os.name == "nt":
-        if standard_lib:
-            return os.path.join(prefix, "Lib")
-        else:
-            if get_python_version() < "2.2":
-                return prefix
-            else:
-                return os.path.join(prefix, "Lib", "site-packages")
-
-    elif os.name == "os2":
-        if standard_lib:
-            return os.path.join(prefix, "Lib")
-        else:
-            return os.path.join(prefix, "Lib", "site-packages")
-
-    else:
-        raise DistutilsPlatformError(
-            "I don't know where Python installs its library "
-            "on platform '%s'" % os.name)
-
-
-def customize_compiler(compiler):
-    """Do any platform-specific customization of a CCompiler instance.
-
-    Mainly needed on Unix, so we can plug in the information that
-    varies across Unices and is stored in Python's Makefile.
-    """
-    if compiler.compiler_type == "unix":
-        (cc, cxx, opt, cflags, ccshared, ldshared, so_ext) = \
-            get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS',
-                            'CCSHARED', 'LDSHARED', 'SO')
-
-        if 'CC' in os.environ:
-            cc = os.environ['CC']
-        if 'CXX' in os.environ:
-            cxx = os.environ['CXX']
-        if 'LDSHARED' in os.environ:
-            ldshared = os.environ['LDSHARED']
-        if 'CPP' in os.environ:
-            cpp = os.environ['CPP']
-        else:
-            cpp = cc + " -E"           # not always
-        if 'LDFLAGS' in os.environ:
-            ldshared = ldshared + ' ' + os.environ['LDFLAGS']
-        if 'CFLAGS' in os.environ:
-            cflags = opt + ' ' + os.environ['CFLAGS']
-            ldshared = ldshared + ' ' + os.environ['CFLAGS']
-        if 'CPPFLAGS' in os.environ:
-            cpp = cpp + ' ' + os.environ['CPPFLAGS']
-            cflags = cflags + ' ' + os.environ['CPPFLAGS']
-            ldshared = ldshared + ' ' + os.environ['CPPFLAGS']
-
-        cc_cmd = cc + ' ' + cflags
-        compiler.set_executables(
-            preprocessor=cpp,
-            compiler=cc_cmd,
-            compiler_so=cc_cmd + ' ' + ccshared,
-            compiler_cxx=cxx,
-            linker_so=ldshared,
-            linker_exe=cc)
-
-        compiler.shared_lib_extension = so_ext
-
-
-def get_config_h_filename():
-    """Return full pathname of installed pyconfig.h file."""
-    if python_build:
-        if os.name == "nt":
-            inc_dir = os.path.join(project_base, "PC")
-        else:
-            inc_dir = project_base
-    else:
-        inc_dir = get_python_inc(plat_specific=1)
-    if get_python_version() < '2.2':
-        config_h = 'config.h'
-    else:
-        # The name of the config.h file changed in 2.2
-        config_h = 'pyconfig.h'
-    return os.path.join(inc_dir, config_h)
-
-
-def get_makefile_filename():
-    """Return full pathname of installed Makefile from the Python build."""
-    if python_build:
-        return os.path.join(os.path.dirname(sys.executable), "Makefile")
-    lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
-    return os.path.join(lib_dir, "config", "Makefile")
-
-
-def parse_config_h(fp, g=None):
-    """Parse a config.h-style file.
-
-    A dictionary containing name/value pairs is returned.  If an
-    optional dictionary is passed in as the second argument, it is
-    used instead of a new dictionary.
-    """
-    if g is None:
-        g = {}
-    define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n")
-    undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n")
-    #
-    while 1:
-        line = fp.readline()
-        if not line:
-            break
-        m = define_rx.match(line)
-        if m:
-            n, v = m.group(1, 2)
-            try: v = int(v)
-            except ValueError: pass
-            g[n] = v
-        else:
-            m = undef_rx.match(line)
-            if m:
-                g[m.group(1)] = 0
-    return g
-
-
-# Regexes needed for parsing Makefile (and similar syntaxes,
-# like old-style Setup files).
-_variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
-_findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
-_findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
-
-def parse_makefile(fn, g=None):
-    """Parse a Makefile-style file.
-
-    A dictionary containing name/value pairs is returned.  If an
-    optional dictionary is passed in as the second argument, it is
-    used instead of a new dictionary.
-    """
-    from distutils.text_file import TextFile
-    fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1)
-
-    if g is None:
-        g = {}
-    done = {}
-    notdone = {}
-
-    while 1:
-        line = fp.readline()
-        if line is None:  # eof
-            break
-        m = _variable_rx.match(line)
-        if m:
-            n, v = m.group(1, 2)
-            v = v.strip()
-            # `$$' is a literal `$' in make
-            tmpv = v.replace('$$', '')
-
-            if "$" in tmpv:
-                notdone[n] = v
-            else:
-                try:
-                    v = int(v)
-                except ValueError:
-                    # insert literal `$'
-                    done[n] = v.replace('$$', '$')
-                else:
-                    done[n] = v
-
-    # do variable interpolation here
-    while notdone:
-        for name in notdone.keys():
-            value = notdone[name]
-            m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
-            if m:
-                n = m.group(1)
-                found = True
-                if n in done:
-                    item = str(done[n])
-                elif n in notdone:
-                    # get it on a subsequent round
-                    found = False
-                elif n in os.environ:
-                    # do it like make: fall back to environment
-                    item = os.environ[n]
-                else:
-                    done[n] = item = ""
-                if found:
-                    after = value[m.end():]
-                    value = value[:m.start()] + item + after
-                    if "$" in after:
-                        notdone[name] = value
-                    else:
-                        try: value = int(value)
-                        except ValueError:
-                            done[name] = value.strip()
-                        else:
-                            done[name] = value
-                        del notdone[name]
-            else:
-                # bogus variable reference; just drop it since we can't deal
-                del notdone[name]
-
-    fp.close()
-
-    # strip spurious spaces
-    for k, v in done.items():
-        if isinstance(v, str):
-            done[k] = v.strip()
-
-    # save the results in the global dictionary
-    g.update(done)
-    return g
-
-
-def expand_makefile_vars(s, vars):
-    """Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in
-    'string' according to 'vars' (a dictionary mapping variable names to
-    values).  Variables not present in 'vars' are silently expanded to the
-    empty string.  The variable values in 'vars' should not contain further
-    variable expansions; if 'vars' is the output of 'parse_makefile()',
-    you're fine.  Returns a variable-expanded version of 's'.
-    """
-
-    # This algorithm does multiple expansion, so if vars['foo'] contains
-    # "${bar}", it will expand ${foo} to ${bar}, and then expand
-    # ${bar}... and so forth.  This is fine as long as 'vars' comes from
-    # 'parse_makefile()', which takes care of such expansions eagerly,
-    # according to make's variable expansion semantics.
-
-    while 1:
-        m = _findvar1_rx.search(s) or _findvar2_rx.search(s)
-        if m:
-            (beg, end) = m.span()
-            s = s[0:beg] + vars.get(m.group(1)) + s[end:]
-        else:
-            break
-    return s
-
-
-_config_vars = None
-
-def _init_posix():
-    """Initialize the module as appropriate for POSIX systems."""
-    g = {}
-    # load the installed Makefile:
-    try:
-        filename = get_makefile_filename()
-        parse_makefile(filename, g)
-    except IOError, msg:
-        my_msg = "invalid Python installation: unable to open %s" % filename
-        if hasattr(msg, "strerror"):
-            my_msg = my_msg + " (%s)" % msg.strerror
-
-        raise DistutilsPlatformError(my_msg)
-
-    # load the installed pyconfig.h:
-    try:
-        filename = get_config_h_filename()
-        parse_config_h(file(filename), g)
-    except IOError, msg:
-        my_msg = "invalid Python installation: unable to open %s" % filename
-        if hasattr(msg, "strerror"):
-            my_msg = my_msg + " (%s)" % msg.strerror
-
-        raise DistutilsPlatformError(my_msg)
-
-    # On MacOSX we need to check the setting of the environment variable
-    # MACOSX_DEPLOYMENT_TARGET: configure bases some choices on it so
-    # it needs to be compatible.
-    # If it isn't set we set it to the configure-time value
-    if sys.platform == 'darwin' and 'MACOSX_DEPLOYMENT_TARGET' in g:
-        cfg_target = g['MACOSX_DEPLOYMENT_TARGET']
-        cur_target = os.getenv('MACOSX_DEPLOYMENT_TARGET', '')
-        if cur_target == '':
-            cur_target = cfg_target
-            os.putenv('MACOSX_DEPLOYMENT_TARGET', cfg_target)
-        elif map(int, cfg_target.split('.')) > map(int, cur_target.split('.')):
-            my_msg = ('$MACOSX_DEPLOYMENT_TARGET mismatch: now "%s" but "%s" during configure'
-                % (cur_target, cfg_target))
-            raise DistutilsPlatformError(my_msg)
-
-    # On AIX, there are wrong paths to the linker scripts in the Makefile
-    # -- these paths are relative to the Python source, but when installed
-    # the scripts are in another directory.
-    if python_build:
-        g['LDSHARED'] = g['BLDSHARED']
-
-    elif get_python_version() < '2.1':
-        # The following two branches are for 1.5.2 compatibility.
-        if sys.platform == 'aix4':          # what about AIX 3.x ?
-            # Linker script is in the config directory, not in Modules as the
-            # Makefile says.
-            python_lib = get_python_lib(standard_lib=1)
-            ld_so_aix = os.path.join(python_lib, 'config', 'ld_so_aix')
-            python_exp = os.path.join(python_lib, 'config', 'python.exp')
-
-            g['LDSHARED'] = "%s %s -bI:%s" % (ld_so_aix, g['CC'], python_exp)
-
-        elif sys.platform == 'beos':
-            # Linker script is in the config directory.  In the Makefile it is
-            # relative to the srcdir, which after installation no longer makes
-            # sense.
-            python_lib = get_python_lib(standard_lib=1)
-            linkerscript_path = string.split(g['LDSHARED'])[0]
-            linkerscript_name = os.path.basename(linkerscript_path)
-            linkerscript = os.path.join(python_lib, 'config',
-                                        linkerscript_name)
-
-            # XXX this isn't the right place to do this: adding the Python
-            # library to the link, if needed, should be in the "build_ext"
-            # command.  (It's also needed for non-MS compilers on Windows, and
-            # it's taken care of for them by the 'build_ext.get_libraries()'
-            # method.)
-            g['LDSHARED'] = ("%s -L%s/lib -lpython%s" %
-                             (linkerscript, PREFIX, get_python_version()))
-
-    global _config_vars
-    _config_vars = g
-
-
-def _init_nt():
-    """Initialize the module as appropriate for NT"""
-    g = {}
-    # set basic install directories
-    g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
-    g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
-
-    # XXX hmmm.. a normal install puts include files here
-    g['INCLUDEPY'] = get_python_inc(plat_specific=0)
-
-    g['SO'] = '.pyd'
-    g['EXE'] = ".exe"
-    g['VERSION'] = get_python_version().replace(".", "")
-    g['BINDIR'] = os.path.dirname(os.path.abspath(sys.executable))
-
-    global _config_vars
-    _config_vars = g
-
-
-def _init_os2():
-    """Initialize the module as appropriate for OS/2"""
-    g = {}
-    # set basic install directories
-    g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
-    g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
-
-    # XXX hmmm.. a normal install puts include files here
-    g['INCLUDEPY'] = get_python_inc(plat_specific=0)
-
-    g['SO'] = '.pyd'
-    g['EXE'] = ".exe"
-
-    global _config_vars
-    _config_vars = g
-
-
-def get_config_vars(*args):
-    """With no arguments, return a dictionary of all configuration
-    variables relevant for the current platform.  Generally this includes
-    everything needed to build extensions and install both pure modules and
-    extensions.  On Unix, this means every variable defined in Python's
-    installed Makefile; on Windows and Mac OS it's a much smaller set.
-
-    With arguments, return a list of values that result from looking up
-    each argument in the configuration variable dictionary.
-    """
-    global _config_vars
-    if _config_vars is None:
-        func = globals().get("_init_" + os.name)
-        if func:
-            func()
-        else:
-            _config_vars = {}
-
-        # Normalized versions of prefix and exec_prefix are handy to have;
-        # in fact, these are the standard versions used most places in the
-        # Distutils.
-        _config_vars['prefix'] = PREFIX
-        _config_vars['exec_prefix'] = EXEC_PREFIX
-
-        if sys.platform == 'darwin':
-            kernel_version = os.uname()[2] # Kernel version (8.4.3)
-            major_version = int(kernel_version.split('.')[0])
-
-            if major_version < 8:
-                # On Mac OS X before 10.4, check if -arch and -isysroot
-                # are in CFLAGS or LDFLAGS and remove them if they are.
-                # This is needed when building extensions on a 10.3 system
-                # using a universal build of python.
-                for key in ('LDFLAGS', 'BASECFLAGS', 'LDSHARED',
-                        # a number of derived variables. These need to be
-                        # patched up as well.
-                        'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
-                    flags = _config_vars[key]
-                    flags = re.sub('-arch\s+\w+\s', ' ', flags)
-                    flags = re.sub('-isysroot [^ \t]*', ' ', flags)
-                    _config_vars[key] = flags
-
-            else:
-
-                # Allow the user to override the architecture flags using
-                # an environment variable.
-                # NOTE: This name was introduced by Apple in OSX 10.5 and
-                # is used by several scripting languages distributed with
-                # that OS release.
-
-                if 'ARCHFLAGS' in os.environ:
-                    arch = os.environ['ARCHFLAGS']
-                    for key in ('LDFLAGS', 'BASECFLAGS', 'LDSHARED',
-                        # a number of derived variables. These need to be
-                        # patched up as well.
-                        'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
-
-                        flags = _config_vars[key]
-                        flags = re.sub('-arch\s+\w+\s', ' ', flags)
-                        flags = flags + ' ' + arch
-                        _config_vars[key] = flags
-
-                # If we're on OSX 10.5 or later and the user tries to
-                # compiles an extension using an SDK that is not present
-                # on the current machine it is better to not use an SDK
-                # than to fail.
-                #
-                # The major usecase for this is users using a Python.org
-                # binary installer  on OSX 10.6: that installer uses
-                # the 10.4u SDK, but that SDK is not installed by default
-                # when you install Xcode.
-                #
-                m = re.search('-isysroot\s+(\S+)', _config_vars['CFLAGS'])
-                if m is not None:
-                    sdk = m.group(1)
-                    if not os.path.exists(sdk):
-                        for key in ('LDFLAGS', 'BASECFLAGS', 'LDSHARED',
-                             # a number of derived variables. These need to be
-                             # patched up as well.
-                            'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
-
-                            flags = _config_vars[key]
-                            flags = re.sub('-isysroot\s+\S+(\s|$)', ' ', flags)
-                            _config_vars[key] = flags
-
-    if args:
-        vals = []
-        for name in args:
-            vals.append(_config_vars.get(name))
-        return vals
-    else:
-        return _config_vars
-
-def get_config_var(name):
-    """Return the value of a single variable using the dictionary
-    returned by 'get_config_vars()'.  Equivalent to
-    get_config_vars().get(name)
-    """
-    return get_config_vars().get(name)

+ 5 - 11
package/python3/Makefile

@@ -93,20 +93,14 @@ CONFIGURE_ENV+=		ac_cv_have_long_long_format=yes \
 			ac_cv_file__dev_ptmx=yes \
 			ac_cv_file__dev_ptc=no
 
+HOST_STYLE:=		auto
 HOST_CONFIGURE_ARGS+=	--without-cxx-main \
-			--without-threads
-			
-python3-hostinstall:
-	$(INSTALL_BIN) ${HOST_WRKINST}/usr/bin/python3 \
-		$(STAGING_HOST_DIR)/usr/bin
+			--with-threads
+
+hostpost-install:
 	$(INSTALL_BIN) ${WRKBUILD}/Parser/pgen \
 		$(STAGING_HOST_DIR)/usr/bin/pgen3
-	$(CP) $(HOST_WRKINST)/usr/lib/python3.3 \
-		$(STAGING_HOST_DIR)/usr/lib
-	$(INSTALL_DIR) $(STAGING_HOST_DIR)/usr/include/python3.3m
-	${CP} ${HOST_WRKINST}/usr/include/python3.3m/pyconfig.h \
-		$(STAGING_HOST_DIR)/usr/include/python3.3m
-
+			
 python3-install: ${INSTALL_MODS_y} ${INSTALL_MODS_m}
 	${INSTALL_DIR} ${IDIR_PYTHON3}/usr/bin ${IDIR_PYTHON3}/usr/lib
 	${INSTALL_DIR} ${IDIR_PYTHON3}/usr/lib/python3.3