blob: 590a47b068a07aa7b327b55d902ee3047a98ef7d [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* POSIX module implementation */
3
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00004/* This file is also used for Windows NT/MS-Win and OS/2. In that case the
5 module actually calls itself 'nt' or 'os2', not 'posix', and a few
6 functions are either unimplemented or implemented differently. The source
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00007 assumes that for Windows NT, the macro 'MS_WINDOWS' is defined independent
Guido van Rossumad0ee831995-03-01 10:34:45 +00008 of the compiler used. Different compilers define their own feature
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00009 test macro, e.g. '__BORLANDC__' or '_MSC_VER'. For OS/2, the compiler
10 independent macro PYOS_OS2 should be defined. On OS/2 the default
11 compiler is assumed to be IBM's VisualAge C++ (VACPP). PYCC_GCC is used
12 as the compiler specific macro for the EMX port of gcc to OS/2. */
Guido van Rossumad0ee831995-03-01 10:34:45 +000013
Guido van Rossuma4916fa1996-05-23 22:58:55 +000014/* See also ../Dos/dosmodule.c */
Guido van Rossumad0ee831995-03-01 10:34:45 +000015
Thomas Wouters477c8d52006-05-27 19:21:47 +000016#ifdef __APPLE__
17 /*
Victor Stinner97b89882010-05-06 00:25:39 +000018 * Step 1 of support for weak-linking a number of symbols existing on
Thomas Wouters477c8d52006-05-27 19:21:47 +000019 * OSX 10.4 and later, see the comment in the #ifdef __APPLE__ block
20 * at the end of this file for more information.
21 */
22# pragma weak lchown
23# pragma weak statvfs
24# pragma weak fstatvfs
25
26#endif /* __APPLE__ */
27
Thomas Wouters68bc4f92006-03-01 01:05:10 +000028#define PY_SSIZE_T_CLEAN
29
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000030#include "Python.h"
31#include "structseq.h"
32
Martin v. Löwis79acb9e2002-12-06 12:48:53 +000033#if defined(__VMS)
Martin v. Löwis79acb9e2002-12-06 12:48:53 +000034# include <unixio.h>
Martin v. Löwis79acb9e2002-12-06 12:48:53 +000035#endif /* defined(__VMS) */
36
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000037#ifdef __cplusplus
38extern "C" {
39#endif
40
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000041PyDoc_STRVAR(posix__doc__,
Guido van Rossumec4f4ac1997-06-02 22:20:51 +000042"This module provides access to operating system functionality that is\n\
43standardized by the C Standard and the POSIX standard (a thinly\n\
44disguised Unix interface). Refer to the library manual and\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000045corresponding Unix manual entries for more information on calls.");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046
Martin v. Löwis0073f2e2002-11-21 23:52:35 +000047
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000048#if defined(PYOS_OS2)
49#define INCL_DOS
50#define INCL_DOSERRORS
51#define INCL_DOSPROCESS
52#define INCL_NOPMAPI
53#include <os2.h>
Andrew MacIntyre6c73af22002-03-03 03:07:07 +000054#if defined(PYCC_GCC)
55#include <ctype.h>
56#include <io.h>
57#include <stdio.h>
58#include <process.h>
Andrew MacIntyre6c73af22002-03-03 03:07:07 +000059#endif
Andrew MacIntyreda4d6cb2004-03-29 11:53:38 +000060#include "osdefs.h"
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000061#endif
62
Thomas Wouters0e3f5912006-08-11 14:57:12 +000063#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000064#include <sys/types.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +000065#endif /* HAVE_SYS_TYPES_H */
66
67#ifdef HAVE_SYS_STAT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000068#include <sys/stat.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +000069#endif /* HAVE_SYS_STAT_H */
Guido van Rossuma6535fd2001-10-18 19:44:10 +000070
Guido van Rossum36bc6801995-06-14 22:54:23 +000071#ifdef HAVE_SYS_WAIT_H
Victor Stinner97b89882010-05-06 00:25:39 +000072#include <sys/wait.h> /* For WNOHANG */
Guido van Rossum36bc6801995-06-14 22:54:23 +000073#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000074
Thomas Wouters0e3f5912006-08-11 14:57:12 +000075#ifdef HAVE_SIGNAL_H
Guido van Rossuma376cc51996-12-05 23:43:35 +000076#include <signal.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +000077#endif
Guido van Rossuma376cc51996-12-05 23:43:35 +000078
Guido van Rossumb6775db1994-08-01 11:34:53 +000079#ifdef HAVE_FCNTL_H
80#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000081#endif /* HAVE_FCNTL_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +000082
Guido van Rossuma6535fd2001-10-18 19:44:10 +000083#ifdef HAVE_GRP_H
84#include <grp.h>
85#endif
86
Barry Warsaw5676bd12003-01-07 20:57:09 +000087#ifdef HAVE_SYSEXITS_H
88#include <sysexits.h>
89#endif /* HAVE_SYSEXITS_H */
90
Anthony Baxter8a560de2004-10-13 15:30:56 +000091#ifdef HAVE_SYS_LOADAVG_H
92#include <sys/loadavg.h>
93#endif
94
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +000095#ifdef HAVE_LANGINFO_H
96#include <langinfo.h>
97#endif
98
Guido van Rossuma4916fa1996-05-23 22:58:55 +000099/* Various compilers have only certain posix functions */
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +0000100/* XXX Gosh I wish these were all moved into pyconfig.h */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000101#if defined(PYCC_VACPP) && defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000102#include <process.h>
103#else
Victor Stinner97b89882010-05-06 00:25:39 +0000104#if defined(__WATCOMC__) && !defined(__QNX__) /* Watcom compiler */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000105#define HAVE_GETCWD 1
106#define HAVE_OPENDIR 1
Victor Stinner97b89882010-05-06 00:25:39 +0000107#define HAVE_SYSTEM 1
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000108#if defined(__OS2__)
109#define HAVE_EXECV 1
110#define HAVE_WAIT 1
Guido van Rossumad0ee831995-03-01 10:34:45 +0000111#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000112#include <process.h>
113#else
Victor Stinner97b89882010-05-06 00:25:39 +0000114#ifdef __BORLANDC__ /* Borland compiler */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000115#define HAVE_EXECV 1
116#define HAVE_GETCWD 1
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000117#define HAVE_OPENDIR 1
118#define HAVE_PIPE 1
Victor Stinner97b89882010-05-06 00:25:39 +0000119#define HAVE_SYSTEM 1
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000120#define HAVE_WAIT 1
121#else
Victor Stinner97b89882010-05-06 00:25:39 +0000122#ifdef _MSC_VER /* Microsoft compiler */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000123#define HAVE_GETCWD 1
Victor Stinner97b89882010-05-06 00:25:39 +0000124#define HAVE_SPAWNV 1
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000125#define HAVE_EXECV 1
126#define HAVE_PIPE 1
Victor Stinner97b89882010-05-06 00:25:39 +0000127#define HAVE_SYSTEM 1
128#define HAVE_CWAIT 1
129#define HAVE_FSYNC 1
Tim Peters11b23062003-04-23 02:39:17 +0000130#define fsync _commit
Andrew MacIntyre6c73af22002-03-03 03:07:07 +0000131#else
Martin v. Löwis79acb9e2002-12-06 12:48:53 +0000132#if defined(PYOS_OS2) && defined(PYCC_GCC) || defined(__VMS)
133/* Everything needed is defined in PC/os2emx/pyconfig.h or vms/pyconfig.h */
Victor Stinner97b89882010-05-06 00:25:39 +0000134#else /* all other compilers */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000135/* Unix functions that the configure script doesn't check for */
136#define HAVE_EXECV 1
137#define HAVE_FORK 1
Victor Stinner97b89882010-05-06 00:25:39 +0000138#if defined(__USLC__) && defined(__SCO_VERSION__) /* SCO UDK Compiler */
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000139#define HAVE_FORK1 1
140#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000141#define HAVE_GETCWD 1
142#define HAVE_GETEGID 1
143#define HAVE_GETEUID 1
144#define HAVE_GETGID 1
145#define HAVE_GETPPID 1
146#define HAVE_GETUID 1
147#define HAVE_KILL 1
148#define HAVE_OPENDIR 1
149#define HAVE_PIPE 1
Victor Stinner97b89882010-05-06 00:25:39 +0000150#define HAVE_SYSTEM 1
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000151#define HAVE_WAIT 1
Victor Stinner97b89882010-05-06 00:25:39 +0000152#define HAVE_TTYNAME 1
Martin v. Löwis7a924e62003-03-05 14:15:21 +0000153#endif /* PYOS_OS2 && PYCC_GCC && __VMS */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000154#endif /* _MSC_VER */
155#endif /* __BORLANDC__ */
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000156#endif /* ! __WATCOMC__ || __QNX__ */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000157#endif /* ! __IBMC__ */
Guido van Rossumad0ee831995-03-01 10:34:45 +0000158
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000159#ifndef _MSC_VER
Guido van Rossum36bc6801995-06-14 22:54:23 +0000160
Martin v. Löwis8eb92a02002-09-19 08:03:21 +0000161#if defined(__sgi)&&_COMPILER_VERSION>=700
162/* declare ctermid_r if compiling with MIPSPro 7.x in ANSI C mode
163 (default) */
164extern char *ctermid_r(char *);
165#endif
166
Thomas Wouters1e0c2f42000-07-24 16:06:23 +0000167#ifndef HAVE_UNISTD_H
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000168#if defined(PYCC_VACPP)
Fredrik Lundhff7df9d2000-07-08 22:48:53 +0000169extern int mkdir(char *);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000170#else
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000171#if ( defined(__WATCOMC__) || defined(_MSC_VER) ) && !defined(__QNX__)
Fredrik Lundhff7df9d2000-07-08 22:48:53 +0000172extern int mkdir(const char *);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000173#else
Fredrik Lundhff7df9d2000-07-08 22:48:53 +0000174extern int mkdir(const char *, mode_t);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000175#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000176#endif
177#if defined(__IBMC__) || defined(__IBMCPP__)
Fredrik Lundhff7df9d2000-07-08 22:48:53 +0000178extern int chdir(char *);
179extern int rmdir(char *);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000180#else
Fredrik Lundhff7df9d2000-07-08 22:48:53 +0000181extern int chdir(const char *);
182extern int rmdir(const char *);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000183#endif
Tim Peters58e0a8c2001-05-14 22:32:33 +0000184#ifdef __BORLANDC__
185extern int chmod(const char *, int);
186#else
Fredrik Lundhff7df9d2000-07-08 22:48:53 +0000187extern int chmod(const char *, mode_t);
Tim Peters58e0a8c2001-05-14 22:32:33 +0000188#endif
Christian Heimes4e30a842007-11-30 22:12:06 +0000189/*#ifdef HAVE_FCHMOD
190extern int fchmod(int, mode_t);
191#endif*/
192/*#ifdef HAVE_LCHMOD
193extern int lchmod(const char *, mode_t);
194#endif*/
Fredrik Lundhff7df9d2000-07-08 22:48:53 +0000195extern int chown(const char *, uid_t, gid_t);
196extern char *getcwd(char *, int);
197extern char *strerror(int);
198extern int link(const char *, const char *);
199extern int rename(const char *, const char *);
200extern int stat(const char *, struct stat *);
201extern int unlink(const char *);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000202#ifdef HAVE_SYMLINK
Fredrik Lundhff7df9d2000-07-08 22:48:53 +0000203extern int symlink(const char *, const char *);
Guido van Rossuma38a5031995-02-17 15:11:36 +0000204#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000205#ifdef HAVE_LSTAT
Fredrik Lundhff7df9d2000-07-08 22:48:53 +0000206extern int lstat(const char *, struct stat *);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000207#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000208#endif /* !HAVE_UNISTD_H */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000209
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000210#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211
Guido van Rossumb6775db1994-08-01 11:34:53 +0000212#ifdef HAVE_UTIME_H
213#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000214#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000215
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000216#ifdef HAVE_SYS_UTIME_H
217#include <sys/utime.h>
218#define HAVE_UTIME_H /* pretend we do for the rest of this file */
219#endif /* HAVE_SYS_UTIME_H */
220
Guido van Rossumb6775db1994-08-01 11:34:53 +0000221#ifdef HAVE_SYS_TIMES_H
222#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000223#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000224
225#ifdef HAVE_SYS_PARAM_H
226#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000227#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000228
229#ifdef HAVE_SYS_UTSNAME_H
230#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000231#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000232
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000233#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000234#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000235#define NAMLEN(dirent) strlen((dirent)->d_name)
236#else
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000237#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000238#include <direct.h>
239#define NAMLEN(dirent) strlen((dirent)->d_name)
240#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000241#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000242#define NAMLEN(dirent) (dirent)->d_namlen
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000243#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000244#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000245#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000246#endif
247#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000248#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000249#endif
250#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000251#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000252#endif
253#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000254
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000255#ifdef _MSC_VER
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000256#ifdef HAVE_DIRECT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000257#include <direct.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000258#endif
259#ifdef HAVE_IO_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000260#include <io.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000261#endif
262#ifdef HAVE_PROCESS_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000263#include <process.h>
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000264#endif
Tim Petersbc2e10e2002-03-03 23:17:02 +0000265#include "osdefs.h"
Kristján Valur Jónssonf64e6512009-04-13 10:16:14 +0000266#include <malloc.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000267#include <windows.h>
Victor Stinner97b89882010-05-06 00:25:39 +0000268#include <shellapi.h> /* for ShellExecute() */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000269#endif /* _MSC_VER */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000270
Guido van Rossumd48f2521997-12-05 22:19:34 +0000271#if defined(PYCC_VACPP) && defined(PYOS_OS2)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000272#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000273#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274
Tim Petersbc2e10e2002-03-03 23:17:02 +0000275#ifndef MAXPATHLEN
Thomas Wouters477c8d52006-05-27 19:21:47 +0000276#if defined(PATH_MAX) && PATH_MAX > 1024
277#define MAXPATHLEN PATH_MAX
278#else
Tim Petersbc2e10e2002-03-03 23:17:02 +0000279#define MAXPATHLEN 1024
Thomas Wouters477c8d52006-05-27 19:21:47 +0000280#endif
Tim Petersbc2e10e2002-03-03 23:17:02 +0000281#endif /* MAXPATHLEN */
282
Guido van Rossum54ecc3d1999-01-27 17:53:11 +0000283#ifdef UNION_WAIT
284/* Emulate some macros on systems that have a union instead of macros */
285
286#ifndef WIFEXITED
287#define WIFEXITED(u_wait) (!(u_wait).w_termsig && !(u_wait).w_coredump)
288#endif
289
290#ifndef WEXITSTATUS
291#define WEXITSTATUS(u_wait) (WIFEXITED(u_wait)?((u_wait).w_retcode):-1)
292#endif
293
294#ifndef WTERMSIG
295#define WTERMSIG(u_wait) ((u_wait).w_termsig)
296#endif
297
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000298#define WAIT_TYPE union wait
299#define WAIT_STATUS_INT(s) (s.w_status)
300
301#else /* !UNION_WAIT */
302#define WAIT_TYPE int
303#define WAIT_STATUS_INT(s) (s)
Guido van Rossum54ecc3d1999-01-27 17:53:11 +0000304#endif /* UNION_WAIT */
305
Antoine Pitrouc3ee1662009-05-23 16:02:33 +0000306/* Issue #1983: pid_t can be longer than a C long on some systems */
Antoine Pitrou7852c422009-05-24 11:58:35 +0000307#if !defined(SIZEOF_PID_T) || SIZEOF_PID_T == SIZEOF_INT
Antoine Pitrouc3ee1662009-05-23 16:02:33 +0000308#define PARSE_PID "i"
309#define PyLong_FromPid PyLong_FromLong
310#define PyLong_AsPid PyLong_AsLong
311#elif SIZEOF_PID_T == SIZEOF_LONG
312#define PARSE_PID "l"
313#define PyLong_FromPid PyLong_FromLong
314#define PyLong_AsPid PyLong_AsLong
315#elif defined(SIZEOF_LONG_LONG) && SIZEOF_PID_T == SIZEOF_LONG_LONG
316#define PARSE_PID "L"
317#define PyLong_FromPid PyLong_FromLongLong
318#define PyLong_AsPid PyLong_AsLongLong
319#else
320#error "sizeof(pid_t) is neither sizeof(int), sizeof(long) or sizeof(long long)"
Antoine Pitrouc3ee1662009-05-23 16:02:33 +0000321#endif /* SIZEOF_PID_T */
322
Greg Wardb48bc172000-03-01 21:51:56 +0000323/* Don't use the "_r" form if we don't need it (also, won't have a
324 prototype for it, at least on Solaris -- maybe others as well?). */
325#if defined(HAVE_CTERMID_R) && defined(WITH_THREAD)
326#define USE_CTERMID_R
327#endif
328
Fred Drake699f3522000-06-29 21:12:41 +0000329/* choose the appropriate stat and fstat functions and return structs */
Guido van Rossum64529cd2000-06-30 22:45:12 +0000330#undef STAT
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000331#if defined(MS_WIN64) || defined(MS_WINDOWS)
Victor Stinner97b89882010-05-06 00:25:39 +0000332# define STAT win32_stat
333# define FSTAT win32_fstat
334# define STRUCT_STAT struct win32_stat
Fred Drake699f3522000-06-29 21:12:41 +0000335#else
Victor Stinner97b89882010-05-06 00:25:39 +0000336# define STAT stat
337# define FSTAT fstat
338# define STRUCT_STAT struct stat
Fred Drake699f3522000-06-29 21:12:41 +0000339#endif
340
Tim Peters11b23062003-04-23 02:39:17 +0000341#if defined(MAJOR_IN_MKDEV)
Martin v. Löwisdbe3f762002-10-10 14:27:30 +0000342#include <sys/mkdev.h>
343#else
344#if defined(MAJOR_IN_SYSMACROS)
345#include <sys/sysmacros.h>
346#endif
Neal Norwitz3d949422002-04-20 13:46:43 +0000347#if defined(HAVE_MKNOD) && defined(HAVE_SYS_MKDEV_H)
348#include <sys/mkdev.h>
349#endif
Martin v. Löwisdbe3f762002-10-10 14:27:30 +0000350#endif
Fred Drake699f3522000-06-29 21:12:41 +0000351
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000352#if defined _MSC_VER && _MSC_VER >= 1400
353/* Microsoft CRT in VS2005 and higher will verify that a filehandle is
354 * valid and throw an assertion if it isn't.
355 * Normally, an invalid fd is likely to be a C program error and therefore
356 * an assertion can be useful, but it does contradict the POSIX standard
357 * which for write(2) states:
358 * "Otherwise, -1 shall be returned and errno set to indicate the error."
359 * "[EBADF] The fildes argument is not a valid file descriptor open for
360 * writing."
361 * Furthermore, python allows the user to enter any old integer
362 * as a fd and should merely raise a python exception on error.
363 * The Microsoft CRT doesn't provide an official way to check for the
364 * validity of a file descriptor, but we can emulate its internal behaviour
Victor Stinner97b89882010-05-06 00:25:39 +0000365 * by using the exported __pinfo data member and knowledge of the
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000366 * internal structures involved.
367 * The structures below must be updated for each version of visual studio
368 * according to the file internal.h in the CRT source, until MS comes
369 * up with a less hacky way to do this.
370 * (all of this is to avoid globally modifying the CRT behaviour using
371 * _set_invalid_parameter_handler() and _CrtSetReportMode())
372 */
Kristján Valur Jónssonf64e6512009-04-13 10:16:14 +0000373/* The actual size of the structure is determined at runtime.
374 * Only the first items must be present.
375 */
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000376typedef struct {
Victor Stinner97b89882010-05-06 00:25:39 +0000377 intptr_t osfhnd;
378 char osfile;
Kristján Valur Jónssonf64e6512009-04-13 10:16:14 +0000379} my_ioinfo;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000380
Kristján Valur Jónssonf64e6512009-04-13 10:16:14 +0000381extern __declspec(dllimport) char * __pioinfo[];
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000382#define IOINFO_L2E 5
383#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
384#define IOINFO_ARRAYS 64
385#define _NHANDLE_ (IOINFO_ARRAYS * IOINFO_ARRAY_ELTS)
386#define FOPEN 0x01
387#define _NO_CONSOLE_FILENO (intptr_t)-2
388
389/* This function emulates what the windows CRT does to validate file handles */
390int
391_PyVerify_fd(int fd)
392{
Victor Stinner97b89882010-05-06 00:25:39 +0000393 const int i1 = fd >> IOINFO_L2E;
394 const int i2 = fd & ((1 << IOINFO_L2E) - 1);
Kristján Valur Jónssonf64e6512009-04-13 10:16:14 +0000395
Victor Stinner97b89882010-05-06 00:25:39 +0000396 static int sizeof_ioinfo = 0;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000397
Victor Stinner97b89882010-05-06 00:25:39 +0000398 /* Determine the actual size of the ioinfo structure,
399 * as used by the CRT loaded in memory
400 */
401 if (sizeof_ioinfo == 0 && __pioinfo[0] != NULL) {
402 sizeof_ioinfo = _msize(__pioinfo[0]) / IOINFO_ARRAY_ELTS;
403 }
404 if (sizeof_ioinfo == 0) {
405 /* This should not happen... */
406 goto fail;
407 }
408
409 /* See that it isn't a special CLEAR fileno */
410 if (fd != _NO_CONSOLE_FILENO) {
411 /* Microsoft CRT would check that 0<=fd<_nhandle but we can't do that. Instead
412 * we check pointer validity and other info
413 */
414 if (0 <= i1 && i1 < IOINFO_ARRAYS && __pioinfo[i1] != NULL) {
415 /* finally, check that the file is open */
416 my_ioinfo* info = (my_ioinfo*)(__pioinfo[i1] + i2 * sizeof_ioinfo);
417 if (info->osfile & FOPEN) {
418 return 1;
419 }
420 }
421 }
Kristján Valur Jónssonf64e6512009-04-13 10:16:14 +0000422 fail:
Victor Stinner97b89882010-05-06 00:25:39 +0000423 errno = EBADF;
424 return 0;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000425}
426
427/* the special case of checking dup2. The target fd must be in a sensible range */
428static int
429_PyVerify_fd_dup2(int fd1, int fd2)
430{
Victor Stinner97b89882010-05-06 00:25:39 +0000431 if (!_PyVerify_fd(fd1))
432 return 0;
433 if (fd2 == _NO_CONSOLE_FILENO)
434 return 0;
435 if ((unsigned)fd2 < _NHANDLE_)
436 return 1;
437 else
438 return 0;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000439}
440#else
441/* dummy version. _PyVerify_fd() is already defined in fileobject.h */
442#define _PyVerify_fd_dup2(A, B) (1)
443#endif
444
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445/* Return a dictionary corresponding to the POSIX environment table */
Jack Jansenea0c3822002-08-01 21:57:49 +0000446#ifdef WITH_NEXT_FRAMEWORK
447/* On Darwin/MacOSX a shared library or framework has no access to
448** environ directly, we must obtain it with _NSGetEnviron().
449*/
450#include <crt_externs.h>
451static char **environ;
452#elif !defined(_MSC_VER) && ( !defined(__WATCOMC__) || defined(__QNX__) )
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000454#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000455
Barry Warsaw53699e91996-12-10 23:23:01 +0000456static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000457convertenviron(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458{
Victor Stinner97b89882010-05-06 00:25:39 +0000459 PyObject *d;
Thomas Hellerf78f12a2007-11-08 19:33:05 +0000460#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +0000461 wchar_t **e;
Thomas Hellerf78f12a2007-11-08 19:33:05 +0000462#else
Victor Stinner97b89882010-05-06 00:25:39 +0000463 char **e;
Thomas Hellerf78f12a2007-11-08 19:33:05 +0000464#endif
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +0000465#if defined(PYOS_OS2)
Victor Stinner97b89882010-05-06 00:25:39 +0000466 APIRET rc;
467 char buffer[1024]; /* OS/2 Provides a Documented Max of 1024 Chars */
468#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +0000469
Victor Stinner97b89882010-05-06 00:25:39 +0000470 d = PyDict_New();
471 if (d == NULL)
472 return NULL;
473#ifdef WITH_NEXT_FRAMEWORK
474 if (environ == NULL)
475 environ = *_NSGetEnviron();
476#endif
477#ifdef MS_WINDOWS
478 /* _wenviron must be initialized in this way if the program is started
479 through main() instead of wmain(). */
480 _wgetenv(L"");
481 if (_wenviron == NULL)
482 return d;
483 /* This part ignores errors */
484 for (e = _wenviron; *e != NULL; e++) {
485 PyObject *k;
486 PyObject *v;
487 wchar_t *p = wcschr(*e, L'=');
488 if (p == NULL)
489 continue;
490 k = PyUnicode_FromWideChar(*e, (Py_ssize_t)(p-*e));
491 if (k == NULL) {
492 PyErr_Clear();
493 continue;
Guido van Rossumd48f2521997-12-05 22:19:34 +0000494 }
Victor Stinner97b89882010-05-06 00:25:39 +0000495 v = PyUnicode_FromWideChar(p+1, wcslen(p+1));
496 if (v == NULL) {
497 PyErr_Clear();
498 Py_DECREF(k);
499 continue;
Guido van Rossumd48f2521997-12-05 22:19:34 +0000500 }
Victor Stinner97b89882010-05-06 00:25:39 +0000501 if (PyDict_GetItem(d, k) == NULL) {
502 if (PyDict_SetItem(d, k, v) != 0)
503 PyErr_Clear();
504 }
505 Py_DECREF(k);
506 Py_DECREF(v);
507 }
508#else
509 if (environ == NULL)
510 return d;
511 /* This part ignores errors */
512 for (e = environ; *e != NULL; e++) {
513 PyObject *k;
514 PyObject *v;
515 char *p = strchr(*e, '=');
516 if (p == NULL)
517 continue;
518 k = PyUnicode_Decode(*e, (int)(p-*e),
519 Py_FileSystemDefaultEncoding, "surrogateescape");
520 if (k == NULL) {
521 PyErr_Clear();
522 continue;
523 }
524 v = PyUnicode_Decode(p+1, strlen(p+1),
525 Py_FileSystemDefaultEncoding, "surrogateescape");
526 if (v == NULL) {
527 PyErr_Clear();
528 Py_DECREF(k);
529 continue;
530 }
531 if (PyDict_GetItem(d, k) == NULL) {
532 if (PyDict_SetItem(d, k, v) != 0)
533 PyErr_Clear();
534 }
535 Py_DECREF(k);
536 Py_DECREF(v);
Guido van Rossumd48f2521997-12-05 22:19:34 +0000537 }
538#endif
Victor Stinner97b89882010-05-06 00:25:39 +0000539#if defined(PYOS_OS2)
540 rc = DosQueryExtLIBPATH(buffer, BEGIN_LIBPATH);
541 if (rc == NO_ERROR) { /* (not a type, envname is NOT 'BEGIN_LIBPATH') */
542 PyObject *v = PyBytes_FromString(buffer);
543 PyDict_SetItemString(d, "BEGINLIBPATH", v);
544 Py_DECREF(v);
545 }
546 rc = DosQueryExtLIBPATH(buffer, END_LIBPATH);
547 if (rc == NO_ERROR) { /* (not a typo, envname is NOT 'END_LIBPATH') */
548 PyObject *v = PyBytes_FromString(buffer);
549 PyDict_SetItemString(d, "ENDLIBPATH", v);
550 Py_DECREF(v);
551 }
552#endif
553 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000554}
555
Martin v. Löwis011e8422009-05-05 04:43:17 +0000556/* Convert a bytes object to a char*. Optionally lock the buffer if it is a
557 bytes array. */
558
559static char*
560bytes2str(PyObject* o, int lock)
561{
Victor Stinner97b89882010-05-06 00:25:39 +0000562 if(PyBytes_Check(o))
563 return PyBytes_AsString(o);
564 else if(PyByteArray_Check(o)) {
565 if (lock && PyObject_GetBuffer(o, NULL, 0) < 0)
566 /* On a bytearray, this should not fail. */
567 PyErr_BadInternalCall();
568 return PyByteArray_AsString(o);
569 } else {
570 /* The FS converter should have verified that this
571 is either bytes or bytearray. */
572 Py_FatalError("bad object passed to bytes2str");
573 /* not reached. */
574 return "";
575 }
Martin v. Löwis011e8422009-05-05 04:43:17 +0000576}
577
578/* Release the lock, decref the object. */
579static void
580release_bytes(PyObject* o)
581{
Victor Stinner97b89882010-05-06 00:25:39 +0000582 if (PyByteArray_Check(o))
583 o->ob_type->tp_as_buffer->bf_releasebuffer(o, 0);
584 Py_DECREF(o);
Martin v. Löwis011e8422009-05-05 04:43:17 +0000585}
586
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000587
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000588/* Set a POSIX-specific error from errno, and return NULL */
589
Barry Warsawd58d7641998-07-23 16:14:40 +0000590static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000591posix_error(void)
Guido van Rossumad0ee831995-03-01 10:34:45 +0000592{
Victor Stinner97b89882010-05-06 00:25:39 +0000593 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000594}
Barry Warsawd58d7641998-07-23 16:14:40 +0000595static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +0000596posix_error_with_filename(char* name)
Barry Warsawd58d7641998-07-23 16:14:40 +0000597{
Victor Stinner97b89882010-05-06 00:25:39 +0000598 return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);
Barry Warsawd58d7641998-07-23 16:14:40 +0000599}
600
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000601#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000602static PyObject *
603posix_error_with_unicode_filename(Py_UNICODE* name)
604{
Victor Stinner97b89882010-05-06 00:25:39 +0000605 return PyErr_SetFromErrnoWithUnicodeFilename(PyExc_OSError, name);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000606}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000607#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000608
609
Mark Hammondef8b6542001-05-13 08:04:26 +0000610static PyObject *
Martin v. Löwis011e8422009-05-05 04:43:17 +0000611posix_error_with_allocated_filename(PyObject* name)
Mark Hammondef8b6542001-05-13 08:04:26 +0000612{
Victor Stinner97b89882010-05-06 00:25:39 +0000613 PyObject *rc = PyErr_SetFromErrnoWithFilename(PyExc_OSError,
614 bytes2str(name, 0));
615 release_bytes(name);
616 return rc;
Mark Hammondef8b6542001-05-13 08:04:26 +0000617}
618
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000619#ifdef MS_WINDOWS
Fredrik Lundhffb9c772000-07-09 14:49:51 +0000620static PyObject *
621win32_error(char* function, char* filename)
622{
Victor Stinner97b89882010-05-06 00:25:39 +0000623 /* XXX We should pass the function name along in the future.
624 (winreg.c also wants to pass the function name.)
625 This would however require an additional param to the
626 Windows error object, which is non-trivial.
627 */
628 errno = GetLastError();
629 if (filename)
630 return PyErr_SetFromWindowsErrWithFilename(errno, filename);
631 else
632 return PyErr_SetFromWindowsErr(errno);
Fredrik Lundhffb9c772000-07-09 14:49:51 +0000633}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000634
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000635static PyObject *
636win32_error_unicode(char* function, Py_UNICODE* filename)
637{
Victor Stinner97b89882010-05-06 00:25:39 +0000638 /* XXX - see win32_error for comments on 'function' */
639 errno = GetLastError();
640 if (filename)
641 return PyErr_SetFromWindowsErrWithUnicodeFilename(errno, filename);
642 else
643 return PyErr_SetFromWindowsErr(errno);
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000644}
645
Thomas Wouters477c8d52006-05-27 19:21:47 +0000646static int
Hirokazu Yamamotod7e4c082008-08-17 09:30:15 +0000647convert_to_unicode(PyObject **param)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000648{
Victor Stinner97b89882010-05-06 00:25:39 +0000649 if (PyUnicode_CheckExact(*param))
650 Py_INCREF(*param);
651 else if (PyUnicode_Check(*param))
652 /* For a Unicode subtype that's not a Unicode object,
653 return a true Unicode object with the same data. */
654 *param = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(*param),
655 PyUnicode_GET_SIZE(*param));
656 else
657 *param = PyUnicode_FromEncodedObject(*param,
658 Py_FileSystemDefaultEncoding,
659 "strict");
660 return (*param) != NULL;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000661}
662
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000663#endif /* MS_WINDOWS */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000664
Guido van Rossumd48f2521997-12-05 22:19:34 +0000665#if defined(PYOS_OS2)
666/**********************************************************************
667 * Helper Function to Trim and Format OS/2 Messages
668 **********************************************************************/
Victor Stinner97b89882010-05-06 00:25:39 +0000669static void
Guido van Rossumd48f2521997-12-05 22:19:34 +0000670os2_formatmsg(char *msgbuf, int msglen, char *reason)
671{
672 msgbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
673
674 if (strlen(msgbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
675 char *lastc = &msgbuf[ strlen(msgbuf)-1 ];
676
Neal Norwitz30b5c5d2005-12-19 06:05:18 +0000677 while (lastc > msgbuf && isspace(Py_CHARMASK(*lastc)))
Guido van Rossumd48f2521997-12-05 22:19:34 +0000678 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
679 }
680
681 /* Add Optional Reason Text */
682 if (reason) {
683 strcat(msgbuf, " : ");
684 strcat(msgbuf, reason);
685 }
686}
687
688/**********************************************************************
689 * Decode an OS/2 Operating System Error Code
690 *
691 * A convenience function to lookup an OS/2 error code and return a
692 * text message we can use to raise a Python exception.
693 *
694 * Notes:
695 * The messages for errors returned from the OS/2 kernel reside in
696 * the file OSO001.MSG in the \OS2 directory hierarchy.
697 *
698 **********************************************************************/
Victor Stinner97b89882010-05-06 00:25:39 +0000699static char *
Guido van Rossumd48f2521997-12-05 22:19:34 +0000700os2_strerror(char *msgbuf, int msgbuflen, int errorcode, char *reason)
701{
702 APIRET rc;
703 ULONG msglen;
704
705 /* Retrieve Kernel-Related Error Message from OSO001.MSG File */
706 Py_BEGIN_ALLOW_THREADS
707 rc = DosGetMessage(NULL, 0, msgbuf, msgbuflen,
708 errorcode, "oso001.msg", &msglen);
709 Py_END_ALLOW_THREADS
710
711 if (rc == NO_ERROR)
712 os2_formatmsg(msgbuf, msglen, reason);
713 else
Tim Peters1ceb5fb2001-11-28 20:32:57 +0000714 PyOS_snprintf(msgbuf, msgbuflen,
Victor Stinner97b89882010-05-06 00:25:39 +0000715 "unknown OS error #%d", errorcode);
Guido van Rossumd48f2521997-12-05 22:19:34 +0000716
717 return msgbuf;
718}
719
720/* Set an OS/2-specific error and return NULL. OS/2 kernel
721 errors are not in a global variable e.g. 'errno' nor are
722 they congruent with posix error numbers. */
723
Victor Stinner97b89882010-05-06 00:25:39 +0000724static PyObject *
725os2_error(int code)
Guido van Rossumd48f2521997-12-05 22:19:34 +0000726{
727 char text[1024];
728 PyObject *v;
729
730 os2_strerror(text, sizeof(text), code, "");
731
732 v = Py_BuildValue("(is)", code, text);
733 if (v != NULL) {
Barry Warsawca74da41999-02-09 19:31:45 +0000734 PyErr_SetObject(PyExc_OSError, v);
Guido van Rossumd48f2521997-12-05 22:19:34 +0000735 Py_DECREF(v);
736 }
737 return NULL; /* Signal to Python that an Exception is Pending */
738}
739
740#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000741
742/* POSIX generic methods */
743
Barry Warsaw53699e91996-12-10 23:23:01 +0000744static PyObject *
Fred Drake4d1e64b2002-04-15 19:40:07 +0000745posix_fildes(PyObject *fdobj, int (*func)(int))
746{
Victor Stinner97b89882010-05-06 00:25:39 +0000747 int fd;
748 int res;
749 fd = PyObject_AsFileDescriptor(fdobj);
750 if (fd < 0)
751 return NULL;
752 if (!_PyVerify_fd(fd))
753 return posix_error();
754 Py_BEGIN_ALLOW_THREADS
755 res = (*func)(fd);
756 Py_END_ALLOW_THREADS
757 if (res < 0)
758 return posix_error();
759 Py_INCREF(Py_None);
760 return Py_None;
Fred Drake4d1e64b2002-04-15 19:40:07 +0000761}
Guido van Rossum21142a01999-01-08 21:05:37 +0000762
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000763#ifdef MS_WINDOWS
Tim Peters11b23062003-04-23 02:39:17 +0000764static int
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000765unicode_file_names(void)
766{
Victor Stinner97b89882010-05-06 00:25:39 +0000767 static int canusewide = -1;
768 if (canusewide == -1) {
769 /* As per doc for ::GetVersion(), this is the correct test for
770 the Windows NT family. */
771 canusewide = (GetVersion() < 0x80000000) ? 1 : 0;
772 }
773 return canusewide;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000774}
775#endif
Tim Peters11b23062003-04-23 02:39:17 +0000776
Guido van Rossum21142a01999-01-08 21:05:37 +0000777static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +0000778posix_1str(PyObject *args, char *format, int (*func)(const char*))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000779{
Victor Stinner97b89882010-05-06 00:25:39 +0000780 PyObject *opath1 = NULL;
781 char *path1;
782 int res;
783 if (!PyArg_ParseTuple(args, format,
784 PyUnicode_FSConverter, &opath1))
785 return NULL;
786 path1 = bytes2str(opath1, 1);
787 Py_BEGIN_ALLOW_THREADS
788 res = (*func)(path1);
789 Py_END_ALLOW_THREADS
790 if (res < 0)
791 return posix_error_with_allocated_filename(opath1);
792 release_bytes(opath1);
793 Py_INCREF(Py_None);
794 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000795}
796
Barry Warsaw53699e91996-12-10 23:23:01 +0000797static PyObject *
Tim Peters11b23062003-04-23 02:39:17 +0000798posix_2str(PyObject *args,
Victor Stinner97b89882010-05-06 00:25:39 +0000799 char *format,
800 int (*func)(const char *, const char *))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000801{
Victor Stinner97b89882010-05-06 00:25:39 +0000802 PyObject *opath1 = NULL, *opath2 = NULL;
803 char *path1, *path2;
804 int res;
805 if (!PyArg_ParseTuple(args, format,
806 PyUnicode_FSConverter, &opath1,
807 PyUnicode_FSConverter, &opath2)) {
808 return NULL;
809 }
810 path1 = bytes2str(opath1, 1);
811 path2 = bytes2str(opath2, 1);
812 Py_BEGIN_ALLOW_THREADS
813 res = (*func)(path1, path2);
814 Py_END_ALLOW_THREADS
815 release_bytes(opath1);
816 release_bytes(opath2);
817 if (res != 0)
818 /* XXX how to report both path1 and path2??? */
819 return posix_error();
820 Py_INCREF(Py_None);
821 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000822}
823
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000824#ifdef MS_WINDOWS
Thomas Wouters477c8d52006-05-27 19:21:47 +0000825static PyObject*
Victor Stinner97b89882010-05-06 00:25:39 +0000826win32_1str(PyObject* args, char* func,
827 char* format, BOOL (__stdcall *funcA)(LPCSTR),
828 char* wformat, BOOL (__stdcall *funcW)(LPWSTR))
Thomas Wouters477c8d52006-05-27 19:21:47 +0000829{
Victor Stinner97b89882010-05-06 00:25:39 +0000830 PyObject *uni;
831 char *ansi;
832 BOOL result;
833 if (unicode_file_names()) {
834 if (!PyArg_ParseTuple(args, wformat, &uni))
835 PyErr_Clear();
836 else {
837 Py_BEGIN_ALLOW_THREADS
838 result = funcW(PyUnicode_AsUnicode(uni));
839 Py_END_ALLOW_THREADS
840 if (!result)
841 return win32_error_unicode(func, PyUnicode_AsUnicode(uni));
842 Py_INCREF(Py_None);
843 return Py_None;
844 }
845 }
846 if (!PyArg_ParseTuple(args, format, &ansi))
847 return NULL;
848 Py_BEGIN_ALLOW_THREADS
849 result = funcA(ansi);
850 Py_END_ALLOW_THREADS
851 if (!result)
852 return win32_error(func, ansi);
853 Py_INCREF(Py_None);
854 return Py_None;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000855
856}
857
858/* This is a reimplementation of the C library's chdir function,
859 but one that produces Win32 errors instead of DOS error codes.
860 chdir is essentially a wrapper around SetCurrentDirectory; however,
861 it also needs to set "magic" environment variables indicating
862 the per-drive current directory, which are of the form =<drive>: */
Benjamin Peterson206e3072008-10-19 14:07:49 +0000863static BOOL __stdcall
Thomas Wouters477c8d52006-05-27 19:21:47 +0000864win32_chdir(LPCSTR path)
865{
Victor Stinner97b89882010-05-06 00:25:39 +0000866 char new_path[MAX_PATH+1];
867 int result;
868 char env[4] = "=x:";
Thomas Wouters477c8d52006-05-27 19:21:47 +0000869
Victor Stinner97b89882010-05-06 00:25:39 +0000870 if(!SetCurrentDirectoryA(path))
871 return FALSE;
872 result = GetCurrentDirectoryA(MAX_PATH+1, new_path);
873 if (!result)
874 return FALSE;
875 /* In the ANSI API, there should not be any paths longer
876 than MAX_PATH. */
877 assert(result <= MAX_PATH+1);
878 if (strncmp(new_path, "\\\\", 2) == 0 ||
879 strncmp(new_path, "//", 2) == 0)
880 /* UNC path, nothing to do. */
881 return TRUE;
882 env[1] = new_path[0];
883 return SetEnvironmentVariableA(env, new_path);
Thomas Wouters477c8d52006-05-27 19:21:47 +0000884}
885
886/* The Unicode version differs from the ANSI version
887 since the current directory might exceed MAX_PATH characters */
Benjamin Peterson206e3072008-10-19 14:07:49 +0000888static BOOL __stdcall
Thomas Wouters477c8d52006-05-27 19:21:47 +0000889win32_wchdir(LPCWSTR path)
890{
Victor Stinner97b89882010-05-06 00:25:39 +0000891 wchar_t _new_path[MAX_PATH+1], *new_path = _new_path;
892 int result;
893 wchar_t env[4] = L"=x:";
Thomas Wouters477c8d52006-05-27 19:21:47 +0000894
Victor Stinner97b89882010-05-06 00:25:39 +0000895 if(!SetCurrentDirectoryW(path))
896 return FALSE;
897 result = GetCurrentDirectoryW(MAX_PATH+1, new_path);
898 if (!result)
899 return FALSE;
900 if (result > MAX_PATH+1) {
901 new_path = malloc(result * sizeof(wchar_t));
902 if (!new_path) {
903 SetLastError(ERROR_OUTOFMEMORY);
904 return FALSE;
905 }
906 result = GetCurrentDirectoryW(result, new_path);
907 if (!result) {
908 free(new_path);
909 return FALSE;
910 }
911 }
912 if (wcsncmp(new_path, L"\\\\", 2) == 0 ||
913 wcsncmp(new_path, L"//", 2) == 0)
914 /* UNC path, nothing to do. */
915 return TRUE;
916 env[1] = new_path[0];
917 result = SetEnvironmentVariableW(env, new_path);
918 if (new_path != _new_path)
919 free(new_path);
920 return result;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000921}
922#endif
923
Martin v. Löwis14694662006-02-03 12:54:16 +0000924#ifdef MS_WINDOWS
925/* The CRT of Windows has a number of flaws wrt. its stat() implementation:
926 - time stamps are restricted to second resolution
927 - file modification times suffer from forth-and-back conversions between
928 UTC and local time
929 Therefore, we implement our own stat, based on the Win32 API directly.
930*/
Victor Stinner97b89882010-05-06 00:25:39 +0000931#define HAVE_STAT_NSEC 1
Martin v. Löwis14694662006-02-03 12:54:16 +0000932
933struct win32_stat{
934 int st_dev;
935 __int64 st_ino;
936 unsigned short st_mode;
937 int st_nlink;
938 int st_uid;
939 int st_gid;
940 int st_rdev;
941 __int64 st_size;
942 int st_atime;
943 int st_atime_nsec;
944 int st_mtime;
945 int st_mtime_nsec;
946 int st_ctime;
947 int st_ctime_nsec;
948};
949
950static __int64 secs_between_epochs = 11644473600; /* Seconds between 1.1.1601 and 1.1.1970 */
951
952static void
953FILE_TIME_to_time_t_nsec(FILETIME *in_ptr, int *time_out, int* nsec_out)
954{
Victor Stinner97b89882010-05-06 00:25:39 +0000955 /* XXX endianness. Shouldn't matter, as all Windows implementations are little-endian */
956 /* Cannot simply cast and dereference in_ptr,
957 since it might not be aligned properly */
958 __int64 in;
959 memcpy(&in, in_ptr, sizeof(in));
960 *nsec_out = (int)(in % 10000000) * 100; /* FILETIME is in units of 100 nsec. */
961 /* XXX Win32 supports time stamps past 2038; we currently don't */
962 *time_out = Py_SAFE_DOWNCAST((in / 10000000) - secs_between_epochs, __int64, int);
Martin v. Löwis14694662006-02-03 12:54:16 +0000963}
964
Thomas Wouters477c8d52006-05-27 19:21:47 +0000965static void
966time_t_to_FILE_TIME(int time_in, int nsec_in, FILETIME *out_ptr)
967{
Victor Stinner97b89882010-05-06 00:25:39 +0000968 /* XXX endianness */
969 __int64 out;
970 out = time_in + secs_between_epochs;
971 out = out * 10000000 + nsec_in / 100;
972 memcpy(out_ptr, &out, sizeof(out));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000973}
974
Martin v. Löwis14694662006-02-03 12:54:16 +0000975/* Below, we *know* that ugo+r is 0444 */
976#if _S_IREAD != 0400
977#error Unsupported C library
978#endif
979static int
980attributes_to_mode(DWORD attr)
981{
Victor Stinner97b89882010-05-06 00:25:39 +0000982 int m = 0;
983 if (attr & FILE_ATTRIBUTE_DIRECTORY)
984 m |= _S_IFDIR | 0111; /* IFEXEC for user,group,other */
985 else
986 m |= _S_IFREG;
987 if (attr & FILE_ATTRIBUTE_READONLY)
988 m |= 0444;
989 else
990 m |= 0666;
991 return m;
Martin v. Löwis14694662006-02-03 12:54:16 +0000992}
993
994static int
995attribute_data_to_stat(WIN32_FILE_ATTRIBUTE_DATA *info, struct win32_stat *result)
996{
Victor Stinner97b89882010-05-06 00:25:39 +0000997 memset(result, 0, sizeof(*result));
998 result->st_mode = attributes_to_mode(info->dwFileAttributes);
999 result->st_size = (((__int64)info->nFileSizeHigh)<<32) + info->nFileSizeLow;
1000 FILE_TIME_to_time_t_nsec(&info->ftCreationTime, &result->st_ctime, &result->st_ctime_nsec);
1001 FILE_TIME_to_time_t_nsec(&info->ftLastWriteTime, &result->st_mtime, &result->st_mtime_nsec);
1002 FILE_TIME_to_time_t_nsec(&info->ftLastAccessTime, &result->st_atime, &result->st_atime_nsec);
Martin v. Löwis14694662006-02-03 12:54:16 +00001003
Victor Stinner97b89882010-05-06 00:25:39 +00001004 return 0;
Martin v. Löwis14694662006-02-03 12:54:16 +00001005}
1006
Thomas Wouters89f507f2006-12-13 04:49:30 +00001007/* Emulate GetFileAttributesEx[AW] on Windows 95 */
1008static int checked = 0;
1009static BOOL (CALLBACK *gfaxa)(LPCSTR, GET_FILEEX_INFO_LEVELS, LPVOID);
1010static BOOL (CALLBACK *gfaxw)(LPCWSTR, GET_FILEEX_INFO_LEVELS, LPVOID);
1011static void
1012check_gfax()
1013{
Victor Stinner97b89882010-05-06 00:25:39 +00001014 HINSTANCE hKernel32;
1015 if (checked)
1016 return;
1017 checked = 1;
1018 hKernel32 = GetModuleHandle("KERNEL32");
1019 *(FARPROC*)&gfaxa = GetProcAddress(hKernel32, "GetFileAttributesExA");
1020 *(FARPROC*)&gfaxw = GetProcAddress(hKernel32, "GetFileAttributesExW");
Thomas Wouters89f507f2006-12-13 04:49:30 +00001021}
1022
Guido van Rossumd8faa362007-04-27 19:54:29 +00001023static BOOL
1024attributes_from_dir(LPCSTR pszFile, LPWIN32_FILE_ATTRIBUTE_DATA pfad)
1025{
Victor Stinner97b89882010-05-06 00:25:39 +00001026 HANDLE hFindFile;
1027 WIN32_FIND_DATAA FileData;
1028 hFindFile = FindFirstFileA(pszFile, &FileData);
1029 if (hFindFile == INVALID_HANDLE_VALUE)
1030 return FALSE;
1031 FindClose(hFindFile);
1032 pfad->dwFileAttributes = FileData.dwFileAttributes;
1033 pfad->ftCreationTime = FileData.ftCreationTime;
1034 pfad->ftLastAccessTime = FileData.ftLastAccessTime;
1035 pfad->ftLastWriteTime = FileData.ftLastWriteTime;
1036 pfad->nFileSizeHigh = FileData.nFileSizeHigh;
1037 pfad->nFileSizeLow = FileData.nFileSizeLow;
1038 return TRUE;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001039}
1040
1041static BOOL
1042attributes_from_dir_w(LPCWSTR pszFile, LPWIN32_FILE_ATTRIBUTE_DATA pfad)
1043{
Victor Stinner97b89882010-05-06 00:25:39 +00001044 HANDLE hFindFile;
1045 WIN32_FIND_DATAW FileData;
1046 hFindFile = FindFirstFileW(pszFile, &FileData);
1047 if (hFindFile == INVALID_HANDLE_VALUE)
1048 return FALSE;
1049 FindClose(hFindFile);
1050 pfad->dwFileAttributes = FileData.dwFileAttributes;
1051 pfad->ftCreationTime = FileData.ftCreationTime;
1052 pfad->ftLastAccessTime = FileData.ftLastAccessTime;
1053 pfad->ftLastWriteTime = FileData.ftLastWriteTime;
1054 pfad->nFileSizeHigh = FileData.nFileSizeHigh;
1055 pfad->nFileSizeLow = FileData.nFileSizeLow;
1056 return TRUE;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001057}
1058
Thomas Wouters89f507f2006-12-13 04:49:30 +00001059static BOOL WINAPI
Victor Stinner97b89882010-05-06 00:25:39 +00001060Py_GetFileAttributesExA(LPCSTR pszFile,
1061 GET_FILEEX_INFO_LEVELS level,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001062 LPVOID pv)
1063{
Victor Stinner97b89882010-05-06 00:25:39 +00001064 BOOL result;
1065 LPWIN32_FILE_ATTRIBUTE_DATA pfad = pv;
1066 /* First try to use the system's implementation, if that is
1067 available and either succeeds to gives an error other than
1068 that it isn't implemented. */
1069 check_gfax();
1070 if (gfaxa) {
1071 result = gfaxa(pszFile, level, pv);
1072 if (result || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
1073 return result;
1074 }
1075 /* It's either not present, or not implemented.
1076 Emulate using FindFirstFile. */
1077 if (level != GetFileExInfoStandard) {
1078 SetLastError(ERROR_INVALID_PARAMETER);
1079 return FALSE;
1080 }
1081 /* Use GetFileAttributes to validate that the file name
1082 does not contain wildcards (which FindFirstFile would
1083 accept). */
1084 if (GetFileAttributesA(pszFile) == 0xFFFFFFFF)
1085 return FALSE;
1086 return attributes_from_dir(pszFile, pfad);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001087}
1088
1089static BOOL WINAPI
Victor Stinner97b89882010-05-06 00:25:39 +00001090Py_GetFileAttributesExW(LPCWSTR pszFile,
1091 GET_FILEEX_INFO_LEVELS level,
Thomas Wouters89f507f2006-12-13 04:49:30 +00001092 LPVOID pv)
1093{
Victor Stinner97b89882010-05-06 00:25:39 +00001094 BOOL result;
1095 LPWIN32_FILE_ATTRIBUTE_DATA pfad = pv;
1096 /* First try to use the system's implementation, if that is
1097 available and either succeeds to gives an error other than
1098 that it isn't implemented. */
1099 check_gfax();
1100 if (gfaxa) {
1101 result = gfaxw(pszFile, level, pv);
1102 if (result || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
1103 return result;
1104 }
1105 /* It's either not present, or not implemented.
1106 Emulate using FindFirstFile. */
1107 if (level != GetFileExInfoStandard) {
1108 SetLastError(ERROR_INVALID_PARAMETER);
1109 return FALSE;
1110 }
1111 /* Use GetFileAttributes to validate that the file name
1112 does not contain wildcards (which FindFirstFile would
1113 accept). */
1114 if (GetFileAttributesW(pszFile) == 0xFFFFFFFF)
1115 return FALSE;
1116 return attributes_from_dir_w(pszFile, pfad);
Thomas Wouters89f507f2006-12-13 04:49:30 +00001117}
1118
Victor Stinner97b89882010-05-06 00:25:39 +00001119static int
Martin v. Löwis14694662006-02-03 12:54:16 +00001120win32_stat(const char* path, struct win32_stat *result)
1121{
Victor Stinner97b89882010-05-06 00:25:39 +00001122 WIN32_FILE_ATTRIBUTE_DATA info;
1123 int code;
1124 char *dot;
1125 /* XXX not supported on Win95 and NT 3.x */
1126 if (!Py_GetFileAttributesExA(path, GetFileExInfoStandard, &info)) {
1127 if (GetLastError() != ERROR_SHARING_VIOLATION) {
1128 /* Protocol violation: we explicitly clear errno, instead of
1129 setting it to a POSIX error. Callers should use GetLastError. */
1130 errno = 0;
1131 return -1;
1132 } else {
1133 /* Could not get attributes on open file. Fall back to
1134 reading the directory. */
1135 if (!attributes_from_dir(path, &info)) {
1136 /* Very strange. This should not fail now */
1137 errno = 0;
1138 return -1;
1139 }
1140 }
1141 }
1142 code = attribute_data_to_stat(&info, result);
1143 if (code != 0)
1144 return code;
1145 /* Set S_IFEXEC if it is an .exe, .bat, ... */
1146 dot = strrchr(path, '.');
1147 if (dot) {
1148 if (stricmp(dot, ".bat") == 0 ||
1149 stricmp(dot, ".cmd") == 0 ||
1150 stricmp(dot, ".exe") == 0 ||
1151 stricmp(dot, ".com") == 0)
1152 result->st_mode |= 0111;
1153 }
1154 return code;
Martin v. Löwis14694662006-02-03 12:54:16 +00001155}
1156
Victor Stinner97b89882010-05-06 00:25:39 +00001157static int
Martin v. Löwis14694662006-02-03 12:54:16 +00001158win32_wstat(const wchar_t* path, struct win32_stat *result)
1159{
Victor Stinner97b89882010-05-06 00:25:39 +00001160 int code;
1161 const wchar_t *dot;
1162 WIN32_FILE_ATTRIBUTE_DATA info;
1163 /* XXX not supported on Win95 and NT 3.x */
1164 if (!Py_GetFileAttributesExW(path, GetFileExInfoStandard, &info)) {
1165 if (GetLastError() != ERROR_SHARING_VIOLATION) {
1166 /* Protocol violation: we explicitly clear errno, instead of
1167 setting it to a POSIX error. Callers should use GetLastError. */
1168 errno = 0;
1169 return -1;
1170 } else {
1171 /* Could not get attributes on open file. Fall back to
1172 reading the directory. */
1173 if (!attributes_from_dir_w(path, &info)) {
1174 /* Very strange. This should not fail now */
1175 errno = 0;
1176 return -1;
1177 }
1178 }
1179 }
1180 code = attribute_data_to_stat(&info, result);
1181 if (code < 0)
1182 return code;
1183 /* Set IFEXEC if it is an .exe, .bat, ... */
1184 dot = wcsrchr(path, '.');
1185 if (dot) {
1186 if (_wcsicmp(dot, L".bat") == 0 ||
1187 _wcsicmp(dot, L".cmd") == 0 ||
1188 _wcsicmp(dot, L".exe") == 0 ||
1189 _wcsicmp(dot, L".com") == 0)
1190 result->st_mode |= 0111;
1191 }
1192 return code;
Martin v. Löwis14694662006-02-03 12:54:16 +00001193}
1194
1195static int
1196win32_fstat(int file_number, struct win32_stat *result)
1197{
Victor Stinner97b89882010-05-06 00:25:39 +00001198 BY_HANDLE_FILE_INFORMATION info;
1199 HANDLE h;
1200 int type;
Martin v. Löwis14694662006-02-03 12:54:16 +00001201
Victor Stinner97b89882010-05-06 00:25:39 +00001202 h = (HANDLE)_get_osfhandle(file_number);
Martin v. Löwis14694662006-02-03 12:54:16 +00001203
Victor Stinner97b89882010-05-06 00:25:39 +00001204 /* Protocol violation: we explicitly clear errno, instead of
1205 setting it to a POSIX error. Callers should use GetLastError. */
1206 errno = 0;
Martin v. Löwis14694662006-02-03 12:54:16 +00001207
Victor Stinner97b89882010-05-06 00:25:39 +00001208 if (h == INVALID_HANDLE_VALUE) {
1209 /* This is really a C library error (invalid file handle).
1210 We set the Win32 error to the closes one matching. */
1211 SetLastError(ERROR_INVALID_HANDLE);
1212 return -1;
1213 }
1214 memset(result, 0, sizeof(*result));
Martin v. Löwis14694662006-02-03 12:54:16 +00001215
Victor Stinner97b89882010-05-06 00:25:39 +00001216 type = GetFileType(h);
1217 if (type == FILE_TYPE_UNKNOWN) {
1218 DWORD error = GetLastError();
1219 if (error != 0) {
1220 return -1;
1221 }
1222 /* else: valid but unknown file */
1223 }
Martin v. Löwis14694662006-02-03 12:54:16 +00001224
Victor Stinner97b89882010-05-06 00:25:39 +00001225 if (type != FILE_TYPE_DISK) {
1226 if (type == FILE_TYPE_CHAR)
1227 result->st_mode = _S_IFCHR;
1228 else if (type == FILE_TYPE_PIPE)
1229 result->st_mode = _S_IFIFO;
1230 return 0;
1231 }
1232
1233 if (!GetFileInformationByHandle(h, &info)) {
1234 return -1;
1235 }
1236
1237 /* similar to stat() */
1238 result->st_mode = attributes_to_mode(info.dwFileAttributes);
1239 result->st_size = (((__int64)info.nFileSizeHigh)<<32) + info.nFileSizeLow;
1240 FILE_TIME_to_time_t_nsec(&info.ftCreationTime, &result->st_ctime, &result->st_ctime_nsec);
1241 FILE_TIME_to_time_t_nsec(&info.ftLastWriteTime, &result->st_mtime, &result->st_mtime_nsec);
1242 FILE_TIME_to_time_t_nsec(&info.ftLastAccessTime, &result->st_atime, &result->st_atime_nsec);
1243 /* specific to fstat() */
1244 result->st_nlink = info.nNumberOfLinks;
1245 result->st_ino = (((__int64)info.nFileIndexHigh)<<32) + info.nFileIndexLow;
1246 return 0;
Martin v. Löwis14694662006-02-03 12:54:16 +00001247}
1248
1249#endif /* MS_WINDOWS */
1250
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001251PyDoc_STRVAR(stat_result__doc__,
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001252"stat_result: Result from stat or lstat.\n\n\
1253This object may be accessed either as a tuple of\n\
Fred Drakef7ce04d2002-06-20 18:31:21 +00001254 (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001255or via the attributes st_mode, st_ino, st_dev, st_nlink, st_uid, and so on.\n\
1256\n\
Hye-Shik Chang5f937a72005-06-02 13:09:30 +00001257Posix/windows: If your platform supports st_blksize, st_blocks, st_rdev,\n\
1258or st_flags, they are available as attributes only.\n\
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001259\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001260See os.stat for more information.");
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001261
1262static PyStructSequence_Field stat_result_fields[] = {
Victor Stinner97b89882010-05-06 00:25:39 +00001263 {"st_mode", "protection bits"},
1264 {"st_ino", "inode"},
1265 {"st_dev", "device"},
1266 {"st_nlink", "number of hard links"},
1267 {"st_uid", "user ID of owner"},
1268 {"st_gid", "group ID of owner"},
1269 {"st_size", "total size, in bytes"},
1270 /* The NULL is replaced with PyStructSequence_UnnamedField later. */
1271 {NULL, "integer time of last access"},
1272 {NULL, "integer time of last modification"},
1273 {NULL, "integer time of last change"},
1274 {"st_atime", "time of last access"},
1275 {"st_mtime", "time of last modification"},
1276 {"st_ctime", "time of last change"},
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001277#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
Victor Stinner97b89882010-05-06 00:25:39 +00001278 {"st_blksize", "blocksize for filesystem I/O"},
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001279#endif
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001280#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
Victor Stinner97b89882010-05-06 00:25:39 +00001281 {"st_blocks", "number of blocks allocated"},
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001282#endif
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001283#ifdef HAVE_STRUCT_STAT_ST_RDEV
Victor Stinner97b89882010-05-06 00:25:39 +00001284 {"st_rdev", "device type (if inode device)"},
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001285#endif
Hye-Shik Chang5f937a72005-06-02 13:09:30 +00001286#ifdef HAVE_STRUCT_STAT_ST_FLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00001287 {"st_flags", "user defined flags for file"},
Hye-Shik Chang5f937a72005-06-02 13:09:30 +00001288#endif
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001289#ifdef HAVE_STRUCT_STAT_ST_GEN
Victor Stinner97b89882010-05-06 00:25:39 +00001290 {"st_gen", "generation number"},
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001291#endif
1292#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME
Victor Stinner97b89882010-05-06 00:25:39 +00001293 {"st_birthtime", "time of creation"},
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001294#endif
Victor Stinner97b89882010-05-06 00:25:39 +00001295 {0}
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001296};
1297
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001298#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001299#define ST_BLKSIZE_IDX 13
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001300#else
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001301#define ST_BLKSIZE_IDX 12
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001302#endif
1303
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001304#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001305#define ST_BLOCKS_IDX (ST_BLKSIZE_IDX+1)
1306#else
1307#define ST_BLOCKS_IDX ST_BLKSIZE_IDX
1308#endif
1309
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001310#ifdef HAVE_STRUCT_STAT_ST_RDEV
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001311#define ST_RDEV_IDX (ST_BLOCKS_IDX+1)
1312#else
1313#define ST_RDEV_IDX ST_BLOCKS_IDX
1314#endif
1315
Hye-Shik Chang5f937a72005-06-02 13:09:30 +00001316#ifdef HAVE_STRUCT_STAT_ST_FLAGS
1317#define ST_FLAGS_IDX (ST_RDEV_IDX+1)
1318#else
1319#define ST_FLAGS_IDX ST_RDEV_IDX
1320#endif
1321
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001322#ifdef HAVE_STRUCT_STAT_ST_GEN
Martin v. Löwisf09582e2005-08-14 21:42:34 +00001323#define ST_GEN_IDX (ST_FLAGS_IDX+1)
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001324#else
Martin v. Löwisf09582e2005-08-14 21:42:34 +00001325#define ST_GEN_IDX ST_FLAGS_IDX
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001326#endif
1327
1328#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME
1329#define ST_BIRTHTIME_IDX (ST_GEN_IDX+1)
1330#else
1331#define ST_BIRTHTIME_IDX ST_GEN_IDX
1332#endif
1333
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001334static PyStructSequence_Desc stat_result_desc = {
Victor Stinner97b89882010-05-06 00:25:39 +00001335 "stat_result", /* name */
1336 stat_result__doc__, /* doc */
1337 stat_result_fields,
1338 10
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001339};
1340
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001341PyDoc_STRVAR(statvfs_result__doc__,
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001342"statvfs_result: Result from statvfs or fstatvfs.\n\n\
1343This object may be accessed either as a tuple of\n\
Fred Drakef7ce04d2002-06-20 18:31:21 +00001344 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax),\n\
Guido van Rossuma4dc73e2001-10-18 20:53:15 +00001345or via the attributes f_bsize, f_frsize, f_blocks, f_bfree, and so on.\n\
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001346\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001347See os.statvfs for more information.");
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001348
1349static PyStructSequence_Field statvfs_result_fields[] = {
Victor Stinner97b89882010-05-06 00:25:39 +00001350 {"f_bsize", },
1351 {"f_frsize", },
1352 {"f_blocks", },
1353 {"f_bfree", },
1354 {"f_bavail", },
1355 {"f_files", },
1356 {"f_ffree", },
1357 {"f_favail", },
1358 {"f_flag", },
1359 {"f_namemax",},
1360 {0}
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001361};
1362
1363static PyStructSequence_Desc statvfs_result_desc = {
Victor Stinner97b89882010-05-06 00:25:39 +00001364 "statvfs_result", /* name */
1365 statvfs_result__doc__, /* doc */
1366 statvfs_result_fields,
1367 10
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001368};
1369
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001370static int initialized;
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001371static PyTypeObject StatResultType;
1372static PyTypeObject StatVFSResultType;
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001373static newfunc structseq_new;
1374
1375static PyObject *
1376statresult_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1377{
Victor Stinner97b89882010-05-06 00:25:39 +00001378 PyStructSequence *result;
1379 int i;
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001380
Victor Stinner97b89882010-05-06 00:25:39 +00001381 result = (PyStructSequence*)structseq_new(type, args, kwds);
1382 if (!result)
1383 return NULL;
1384 /* If we have been initialized from a tuple,
1385 st_?time might be set to None. Initialize it
1386 from the int slots. */
1387 for (i = 7; i <= 9; i++) {
1388 if (result->ob_item[i+3] == Py_None) {
1389 Py_DECREF(Py_None);
1390 Py_INCREF(result->ob_item[i]);
1391 result->ob_item[i+3] = result->ob_item[i];
1392 }
1393 }
1394 return (PyObject*)result;
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001395}
1396
1397
1398
1399/* If true, st_?time is float. */
Martin v. Löwisfe33d0b2005-01-16 08:57:39 +00001400static int _stat_float_times = 1;
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001401
1402PyDoc_STRVAR(stat_float_times__doc__,
1403"stat_float_times([newval]) -> oldval\n\n\
1404Determine whether os.[lf]stat represents time stamps as float objects.\n\
1405If newval is True, future calls to stat() return floats, if it is False,\n\
1406future calls return ints. \n\
1407If newval is omitted, return the current setting.\n");
1408
1409static PyObject*
1410stat_float_times(PyObject* self, PyObject *args)
1411{
Victor Stinner97b89882010-05-06 00:25:39 +00001412 int newval = -1;
1413 if (!PyArg_ParseTuple(args, "|i:stat_float_times", &newval))
1414 return NULL;
1415 if (newval == -1)
1416 /* Return old value */
1417 return PyBool_FromLong(_stat_float_times);
1418 _stat_float_times = newval;
1419 Py_INCREF(Py_None);
1420 return Py_None;
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001421}
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001422
Martin v. Löwis94717ed2002-09-09 14:24:16 +00001423static void
1424fill_time(PyObject *v, int index, time_t sec, unsigned long nsec)
1425{
Victor Stinner97b89882010-05-06 00:25:39 +00001426 PyObject *fval,*ival;
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001427#if SIZEOF_TIME_T > SIZEOF_LONG
Victor Stinner97b89882010-05-06 00:25:39 +00001428 ival = PyLong_FromLongLong((PY_LONG_LONG)sec);
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001429#else
Victor Stinner97b89882010-05-06 00:25:39 +00001430 ival = PyLong_FromLong((long)sec);
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001431#endif
Victor Stinner97b89882010-05-06 00:25:39 +00001432 if (!ival)
1433 return;
1434 if (_stat_float_times) {
1435 fval = PyFloat_FromDouble(sec + 1e-9*nsec);
1436 } else {
1437 fval = ival;
1438 Py_INCREF(fval);
1439 }
1440 PyStructSequence_SET_ITEM(v, index, ival);
1441 PyStructSequence_SET_ITEM(v, index+3, fval);
Martin v. Löwis94717ed2002-09-09 14:24:16 +00001442}
1443
Tim Peters5aa91602002-01-30 05:46:57 +00001444/* pack a system stat C structure into the Python stat tuple
Fred Drake699f3522000-06-29 21:12:41 +00001445 (used by posix_stat() and posix_fstat()) */
1446static PyObject*
Martin v. Löwis14694662006-02-03 12:54:16 +00001447_pystat_fromstructstat(STRUCT_STAT *st)
Fred Drake699f3522000-06-29 21:12:41 +00001448{
Victor Stinner97b89882010-05-06 00:25:39 +00001449 unsigned long ansec, mnsec, cnsec;
1450 PyObject *v = PyStructSequence_New(&StatResultType);
1451 if (v == NULL)
1452 return NULL;
Fred Drake699f3522000-06-29 21:12:41 +00001453
Victor Stinner97b89882010-05-06 00:25:39 +00001454 PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long)st->st_mode));
Fred Drake699f3522000-06-29 21:12:41 +00001455#ifdef HAVE_LARGEFILE_SUPPORT
Victor Stinner97b89882010-05-06 00:25:39 +00001456 PyStructSequence_SET_ITEM(v, 1,
1457 PyLong_FromLongLong((PY_LONG_LONG)st->st_ino));
Fred Drake699f3522000-06-29 21:12:41 +00001458#else
Victor Stinner97b89882010-05-06 00:25:39 +00001459 PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long)st->st_ino));
Fred Drake699f3522000-06-29 21:12:41 +00001460#endif
1461#if defined(HAVE_LONG_LONG) && !defined(MS_WINDOWS)
Victor Stinner97b89882010-05-06 00:25:39 +00001462 PyStructSequence_SET_ITEM(v, 2,
1463 PyLong_FromLongLong((PY_LONG_LONG)st->st_dev));
Fred Drake699f3522000-06-29 21:12:41 +00001464#else
Victor Stinner97b89882010-05-06 00:25:39 +00001465 PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long)st->st_dev));
Fred Drake699f3522000-06-29 21:12:41 +00001466#endif
Victor Stinner97b89882010-05-06 00:25:39 +00001467 PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long)st->st_nlink));
1468 PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong((long)st->st_uid));
1469 PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong((long)st->st_gid));
Fred Drake699f3522000-06-29 21:12:41 +00001470#ifdef HAVE_LARGEFILE_SUPPORT
Victor Stinner97b89882010-05-06 00:25:39 +00001471 PyStructSequence_SET_ITEM(v, 6,
1472 PyLong_FromLongLong((PY_LONG_LONG)st->st_size));
Fred Drake699f3522000-06-29 21:12:41 +00001473#else
Victor Stinner97b89882010-05-06 00:25:39 +00001474 PyStructSequence_SET_ITEM(v, 6, PyLong_FromLong(st->st_size));
Fred Drake699f3522000-06-29 21:12:41 +00001475#endif
Martin v. Löwis94717ed2002-09-09 14:24:16 +00001476
Martin v. Löwis14694662006-02-03 12:54:16 +00001477#if defined(HAVE_STAT_TV_NSEC)
Victor Stinner97b89882010-05-06 00:25:39 +00001478 ansec = st->st_atim.tv_nsec;
1479 mnsec = st->st_mtim.tv_nsec;
1480 cnsec = st->st_ctim.tv_nsec;
Martin v. Löwis14694662006-02-03 12:54:16 +00001481#elif defined(HAVE_STAT_TV_NSEC2)
Victor Stinner97b89882010-05-06 00:25:39 +00001482 ansec = st->st_atimespec.tv_nsec;
1483 mnsec = st->st_mtimespec.tv_nsec;
1484 cnsec = st->st_ctimespec.tv_nsec;
Martin v. Löwis14694662006-02-03 12:54:16 +00001485#elif defined(HAVE_STAT_NSEC)
Victor Stinner97b89882010-05-06 00:25:39 +00001486 ansec = st->st_atime_nsec;
1487 mnsec = st->st_mtime_nsec;
1488 cnsec = st->st_ctime_nsec;
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001489#else
Victor Stinner97b89882010-05-06 00:25:39 +00001490 ansec = mnsec = cnsec = 0;
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001491#endif
Victor Stinner97b89882010-05-06 00:25:39 +00001492 fill_time(v, 7, st->st_atime, ansec);
1493 fill_time(v, 8, st->st_mtime, mnsec);
1494 fill_time(v, 9, st->st_ctime, cnsec);
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001495
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001496#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
Victor Stinner97b89882010-05-06 00:25:39 +00001497 PyStructSequence_SET_ITEM(v, ST_BLKSIZE_IDX,
1498 PyLong_FromLong((long)st->st_blksize));
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001499#endif
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001500#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
Victor Stinner97b89882010-05-06 00:25:39 +00001501 PyStructSequence_SET_ITEM(v, ST_BLOCKS_IDX,
1502 PyLong_FromLong((long)st->st_blocks));
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001503#endif
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001504#ifdef HAVE_STRUCT_STAT_ST_RDEV
Victor Stinner97b89882010-05-06 00:25:39 +00001505 PyStructSequence_SET_ITEM(v, ST_RDEV_IDX,
1506 PyLong_FromLong((long)st->st_rdev));
Fred Drake699f3522000-06-29 21:12:41 +00001507#endif
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001508#ifdef HAVE_STRUCT_STAT_ST_GEN
Victor Stinner97b89882010-05-06 00:25:39 +00001509 PyStructSequence_SET_ITEM(v, ST_GEN_IDX,
1510 PyLong_FromLong((long)st->st_gen));
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001511#endif
1512#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME
Victor Stinner97b89882010-05-06 00:25:39 +00001513 {
1514 PyObject *val;
1515 unsigned long bsec,bnsec;
1516 bsec = (long)st->st_birthtime;
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001517#ifdef HAVE_STAT_TV_NSEC2
Victor Stinner97b89882010-05-06 00:25:39 +00001518 bnsec = st->st_birthtimespec.tv_nsec;
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001519#else
Victor Stinner97b89882010-05-06 00:25:39 +00001520 bnsec = 0;
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001521#endif
Victor Stinner97b89882010-05-06 00:25:39 +00001522 if (_stat_float_times) {
1523 val = PyFloat_FromDouble(bsec + 1e-9*bnsec);
1524 } else {
1525 val = PyLong_FromLong((long)bsec);
1526 }
1527 PyStructSequence_SET_ITEM(v, ST_BIRTHTIME_IDX,
1528 val);
1529 }
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001530#endif
Hye-Shik Chang5f937a72005-06-02 13:09:30 +00001531#ifdef HAVE_STRUCT_STAT_ST_FLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00001532 PyStructSequence_SET_ITEM(v, ST_FLAGS_IDX,
1533 PyLong_FromLong((long)st->st_flags));
Hye-Shik Chang5f937a72005-06-02 13:09:30 +00001534#endif
Fred Drake699f3522000-06-29 21:12:41 +00001535
Victor Stinner97b89882010-05-06 00:25:39 +00001536 if (PyErr_Occurred()) {
1537 Py_DECREF(v);
1538 return NULL;
1539 }
Fred Drake699f3522000-06-29 21:12:41 +00001540
Victor Stinner97b89882010-05-06 00:25:39 +00001541 return v;
Fred Drake699f3522000-06-29 21:12:41 +00001542}
1543
Martin v. Löwisd8948722004-06-02 09:57:56 +00001544#ifdef MS_WINDOWS
1545
1546/* IsUNCRoot -- test whether the supplied path is of the form \\SERVER\SHARE\,
1547 where / can be used in place of \ and the trailing slash is optional.
1548 Both SERVER and SHARE must have at least one character.
1549*/
1550
1551#define ISSLASHA(c) ((c) == '\\' || (c) == '/')
1552#define ISSLASHW(c) ((c) == L'\\' || (c) == L'/')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001553#ifndef ARRAYSIZE
Martin v. Löwisd8948722004-06-02 09:57:56 +00001554#define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0]))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001555#endif
Martin v. Löwisd8948722004-06-02 09:57:56 +00001556
Tim Peters4ad82172004-08-30 17:02:04 +00001557static BOOL
Martin v. Löwisd8948722004-06-02 09:57:56 +00001558IsUNCRootA(char *path, int pathlen)
1559{
Victor Stinner97b89882010-05-06 00:25:39 +00001560 #define ISSLASH ISSLASHA
Martin v. Löwisd8948722004-06-02 09:57:56 +00001561
Victor Stinner97b89882010-05-06 00:25:39 +00001562 int i, share;
Martin v. Löwisd8948722004-06-02 09:57:56 +00001563
Victor Stinner97b89882010-05-06 00:25:39 +00001564 if (pathlen < 5 || !ISSLASH(path[0]) || !ISSLASH(path[1]))
1565 /* minimum UNCRoot is \\x\y */
1566 return FALSE;
1567 for (i = 2; i < pathlen ; i++)
1568 if (ISSLASH(path[i])) break;
1569 if (i == 2 || i == pathlen)
1570 /* do not allow \\\SHARE or \\SERVER */
1571 return FALSE;
1572 share = i+1;
1573 for (i = share; i < pathlen; i++)
1574 if (ISSLASH(path[i])) break;
1575 return (i != share && (i == pathlen || i == pathlen-1));
Martin v. Löwisd8948722004-06-02 09:57:56 +00001576
Victor Stinner97b89882010-05-06 00:25:39 +00001577 #undef ISSLASH
Martin v. Löwisd8948722004-06-02 09:57:56 +00001578}
1579
Tim Peters4ad82172004-08-30 17:02:04 +00001580static BOOL
Martin v. Löwisd8948722004-06-02 09:57:56 +00001581IsUNCRootW(Py_UNICODE *path, int pathlen)
1582{
Victor Stinner97b89882010-05-06 00:25:39 +00001583 #define ISSLASH ISSLASHW
Martin v. Löwisd8948722004-06-02 09:57:56 +00001584
Victor Stinner97b89882010-05-06 00:25:39 +00001585 int i, share;
Martin v. Löwisd8948722004-06-02 09:57:56 +00001586
Victor Stinner97b89882010-05-06 00:25:39 +00001587 if (pathlen < 5 || !ISSLASH(path[0]) || !ISSLASH(path[1]))
1588 /* minimum UNCRoot is \\x\y */
1589 return FALSE;
1590 for (i = 2; i < pathlen ; i++)
1591 if (ISSLASH(path[i])) break;
1592 if (i == 2 || i == pathlen)
1593 /* do not allow \\\SHARE or \\SERVER */
1594 return FALSE;
1595 share = i+1;
1596 for (i = share; i < pathlen; i++)
1597 if (ISSLASH(path[i])) break;
1598 return (i != share && (i == pathlen || i == pathlen-1));
Martin v. Löwisd8948722004-06-02 09:57:56 +00001599
Victor Stinner97b89882010-05-06 00:25:39 +00001600 #undef ISSLASH
Martin v. Löwisd8948722004-06-02 09:57:56 +00001601}
Martin v. Löwisd8948722004-06-02 09:57:56 +00001602#endif /* MS_WINDOWS */
1603
Barry Warsaw53699e91996-12-10 23:23:01 +00001604static PyObject *
Tim Peters11b23062003-04-23 02:39:17 +00001605posix_do_stat(PyObject *self, PyObject *args,
Victor Stinner97b89882010-05-06 00:25:39 +00001606 char *format,
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001607#ifdef __VMS
Victor Stinner97b89882010-05-06 00:25:39 +00001608 int (*statfunc)(const char *, STRUCT_STAT *, ...),
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001609#else
Victor Stinner97b89882010-05-06 00:25:39 +00001610 int (*statfunc)(const char *, STRUCT_STAT *),
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001611#endif
Victor Stinner97b89882010-05-06 00:25:39 +00001612 char *wformat,
1613 int (*wstatfunc)(const Py_UNICODE *, STRUCT_STAT *))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001614{
Victor Stinner97b89882010-05-06 00:25:39 +00001615 STRUCT_STAT st;
1616 PyObject *opath;
1617 char *path;
1618 int res;
1619 PyObject *result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00001620
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00001621#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00001622 /* If on wide-character-capable OS see if argument
1623 is Unicode and if so use wide API. */
1624 if (unicode_file_names()) {
1625 PyUnicodeObject *po;
1626 if (PyArg_ParseTuple(args, wformat, &po)) {
1627 Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po);
Martin v. Löwis14694662006-02-03 12:54:16 +00001628
Victor Stinner97b89882010-05-06 00:25:39 +00001629 Py_BEGIN_ALLOW_THREADS
1630 /* PyUnicode_AS_UNICODE result OK without
1631 thread lock as it is a simple dereference. */
1632 res = wstatfunc(wpath, &st);
1633 Py_END_ALLOW_THREADS
Martin v. Löwis14694662006-02-03 12:54:16 +00001634
Victor Stinner97b89882010-05-06 00:25:39 +00001635 if (res != 0)
1636 return win32_error_unicode("stat", wpath);
1637 return _pystat_fromstructstat(&st);
1638 }
1639 /* Drop the argument parsing error as narrow strings
1640 are also valid. */
1641 PyErr_Clear();
1642 }
Mark Hammondc2e85bd2002-10-03 05:10:39 +00001643#endif
1644
Victor Stinner97b89882010-05-06 00:25:39 +00001645 if (!PyArg_ParseTuple(args, format,
1646 PyUnicode_FSConverter, &opath))
1647 return NULL;
1648 path = bytes2str(opath, 1);
1649 Py_BEGIN_ALLOW_THREADS
1650 res = (*statfunc)(path, &st);
1651 Py_END_ALLOW_THREADS
Martin v. Löwis14694662006-02-03 12:54:16 +00001652
Victor Stinner97b89882010-05-06 00:25:39 +00001653 if (res != 0) {
Martin v. Löwis14694662006-02-03 12:54:16 +00001654#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00001655 result = win32_error("stat", path);
Martin v. Löwis14694662006-02-03 12:54:16 +00001656#else
Victor Stinner97b89882010-05-06 00:25:39 +00001657 result = posix_error_with_filename(path);
Martin v. Löwis14694662006-02-03 12:54:16 +00001658#endif
Victor Stinner97b89882010-05-06 00:25:39 +00001659 }
1660 else
1661 result = _pystat_fromstructstat(&st);
Fred Drake699f3522000-06-29 21:12:41 +00001662
Victor Stinner97b89882010-05-06 00:25:39 +00001663 release_bytes(opath);
1664 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001665}
1666
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001667/* POSIX methods */
1668
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001669PyDoc_STRVAR(posix_access__doc__,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001670"access(path, mode) -> True if granted, False otherwise\n\n\
Guido van Rossuma0b90752002-06-18 16:22:43 +00001671Use the real uid/gid to test for access to a path. Note that most\n\
1672operations will use the effective uid/gid, therefore this routine can\n\
1673be used in a suid/sgid environment to test if the invoking user has the\n\
1674specified access to the path. The mode argument can be F_OK to test\n\
1675existence, or the inclusive-OR of R_OK, W_OK, and X_OK.");
Guido van Rossum94f6f721999-01-06 18:42:14 +00001676
1677static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00001678posix_access(PyObject *self, PyObject *args)
Guido van Rossum94f6f721999-01-06 18:42:14 +00001679{
Victor Stinner97b89882010-05-06 00:25:39 +00001680 PyObject *opath;
1681 char *path;
1682 int mode;
1683
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00001684#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00001685 DWORD attr;
1686 if (unicode_file_names()) {
1687 PyUnicodeObject *po;
1688 if (PyArg_ParseTuple(args, "Ui:access", &po, &mode)) {
1689 Py_BEGIN_ALLOW_THREADS
1690 /* PyUnicode_AS_UNICODE OK without thread lock as
1691 it is a simple dereference. */
1692 attr = GetFileAttributesW(PyUnicode_AS_UNICODE(po));
1693 Py_END_ALLOW_THREADS
1694 goto finish;
1695 }
1696 /* Drop the argument parsing error as narrow strings
1697 are also valid. */
1698 PyErr_Clear();
1699 }
1700 if (!PyArg_ParseTuple(args, "O&i:access",
1701 PyUnicode_FSConverter, &opath, &mode))
1702 return 0;
1703 path = bytes2str(opath, 1);
1704 Py_BEGIN_ALLOW_THREADS
1705 attr = GetFileAttributesA(path);
1706 Py_END_ALLOW_THREADS
1707 release_bytes(opath);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001708finish:
Victor Stinner97b89882010-05-06 00:25:39 +00001709 if (attr == 0xFFFFFFFF)
1710 /* File does not exist, or cannot read attributes */
1711 return PyBool_FromLong(0);
1712 /* Access is possible if either write access wasn't requested, or
1713 the file isn't read-only, or if it's a directory, as there are
1714 no read-only directories on Windows. */
1715 return PyBool_FromLong(!(mode & 2)
1716 || !(attr & FILE_ATTRIBUTE_READONLY)
1717 || (attr & FILE_ATTRIBUTE_DIRECTORY));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001718#else
Victor Stinner97b89882010-05-06 00:25:39 +00001719 int res;
1720 if (!PyArg_ParseTuple(args, "O&i:access",
1721 PyUnicode_FSConverter, &opath, &mode))
1722 return NULL;
1723 path = bytes2str(opath, 1);
1724 Py_BEGIN_ALLOW_THREADS
1725 res = access(path, mode);
1726 Py_END_ALLOW_THREADS
1727 release_bytes(opath);
1728 return PyBool_FromLong(res == 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001729#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00001730}
1731
Guido van Rossumd371ff11999-01-25 16:12:23 +00001732#ifndef F_OK
1733#define F_OK 0
1734#endif
1735#ifndef R_OK
1736#define R_OK 4
1737#endif
1738#ifndef W_OK
1739#define W_OK 2
1740#endif
1741#ifndef X_OK
1742#define X_OK 1
1743#endif
1744
1745#ifdef HAVE_TTYNAME
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001746PyDoc_STRVAR(posix_ttyname__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00001747"ttyname(fd) -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001748Return the name of the terminal device connected to 'fd'.");
Guido van Rossum94f6f721999-01-06 18:42:14 +00001749
1750static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00001751posix_ttyname(PyObject *self, PyObject *args)
Guido van Rossum94f6f721999-01-06 18:42:14 +00001752{
Victor Stinner97b89882010-05-06 00:25:39 +00001753 int id;
1754 char *ret;
Guido van Rossum94f6f721999-01-06 18:42:14 +00001755
Victor Stinner97b89882010-05-06 00:25:39 +00001756 if (!PyArg_ParseTuple(args, "i:ttyname", &id))
1757 return NULL;
Guido van Rossum94f6f721999-01-06 18:42:14 +00001758
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001759#if defined(__VMS)
Victor Stinner97b89882010-05-06 00:25:39 +00001760 /* file descriptor 0 only, the default input device (stdin) */
1761 if (id == 0) {
1762 ret = ttyname();
1763 }
1764 else {
1765 ret = NULL;
1766 }
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001767#else
Victor Stinner97b89882010-05-06 00:25:39 +00001768 ret = ttyname(id);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001769#endif
Victor Stinner97b89882010-05-06 00:25:39 +00001770 if (ret == NULL)
1771 return posix_error();
1772 return PyUnicode_FromString(ret);
Guido van Rossum94f6f721999-01-06 18:42:14 +00001773}
Guido van Rossumd371ff11999-01-25 16:12:23 +00001774#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00001775
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001776#ifdef HAVE_CTERMID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001777PyDoc_STRVAR(posix_ctermid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00001778"ctermid() -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001779Return the name of the controlling terminal for this process.");
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001780
1781static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00001782posix_ctermid(PyObject *self, PyObject *noargs)
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001783{
Victor Stinner97b89882010-05-06 00:25:39 +00001784 char *ret;
1785 char buffer[L_ctermid];
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001786
Greg Wardb48bc172000-03-01 21:51:56 +00001787#ifdef USE_CTERMID_R
Victor Stinner97b89882010-05-06 00:25:39 +00001788 ret = ctermid_r(buffer);
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001789#else
Victor Stinner97b89882010-05-06 00:25:39 +00001790 ret = ctermid(buffer);
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001791#endif
Victor Stinner97b89882010-05-06 00:25:39 +00001792 if (ret == NULL)
1793 return posix_error();
1794 return PyUnicode_FromString(buffer);
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001795}
1796#endif
1797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001798PyDoc_STRVAR(posix_chdir__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00001799"chdir(path)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001800Change the current working directory to the specified path.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001801
Barry Warsaw53699e91996-12-10 23:23:01 +00001802static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00001803posix_chdir(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001804{
Mark Hammondc2e85bd2002-10-03 05:10:39 +00001805#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00001806 return win32_1str(args, "chdir", "y:chdir", win32_chdir, "U:chdir", win32_wchdir);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00001807#elif defined(PYOS_OS2) && defined(PYCC_GCC)
Victor Stinner97b89882010-05-06 00:25:39 +00001808 return posix_1str(args, "O&:chdir", _chdir2);
Martin v. Löwis7a924e62003-03-05 14:15:21 +00001809#elif defined(__VMS)
Victor Stinner97b89882010-05-06 00:25:39 +00001810 return posix_1str(args, "O&:chdir", (int (*)(const char *))chdir);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001811#else
Victor Stinner97b89882010-05-06 00:25:39 +00001812 return posix_1str(args, "O&:chdir", chdir);
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00001813#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001814}
1815
Fred Drake4d1e64b2002-04-15 19:40:07 +00001816#ifdef HAVE_FCHDIR
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001817PyDoc_STRVAR(posix_fchdir__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00001818"fchdir(fildes)\n\n\
Fred Drake4d1e64b2002-04-15 19:40:07 +00001819Change to the directory of the given file descriptor. fildes must be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001820opened on a directory, not a file.");
Fred Drake4d1e64b2002-04-15 19:40:07 +00001821
1822static PyObject *
1823posix_fchdir(PyObject *self, PyObject *fdobj)
1824{
Victor Stinner97b89882010-05-06 00:25:39 +00001825 return posix_fildes(fdobj, fchdir);
Fred Drake4d1e64b2002-04-15 19:40:07 +00001826}
1827#endif /* HAVE_FCHDIR */
1828
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001829
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001830PyDoc_STRVAR(posix_chmod__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00001831"chmod(path, mode)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001832Change the access permissions of a file.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001833
Barry Warsaw53699e91996-12-10 23:23:01 +00001834static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00001835posix_chmod(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001836{
Victor Stinner97b89882010-05-06 00:25:39 +00001837 PyObject *opath = NULL;
1838 char *path = NULL;
1839 int i;
1840 int res;
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00001841#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00001842 DWORD attr;
1843 if (unicode_file_names()) {
1844 PyUnicodeObject *po;
1845 if (PyArg_ParseTuple(args, "Ui|:chmod", &po, &i)) {
1846 Py_BEGIN_ALLOW_THREADS
1847 attr = GetFileAttributesW(PyUnicode_AS_UNICODE(po));
1848 if (attr != 0xFFFFFFFF) {
1849 if (i & _S_IWRITE)
1850 attr &= ~FILE_ATTRIBUTE_READONLY;
1851 else
1852 attr |= FILE_ATTRIBUTE_READONLY;
1853 res = SetFileAttributesW(PyUnicode_AS_UNICODE(po), attr);
1854 }
1855 else
1856 res = 0;
1857 Py_END_ALLOW_THREADS
1858 if (!res)
1859 return win32_error_unicode("chmod",
1860 PyUnicode_AS_UNICODE(po));
1861 Py_INCREF(Py_None);
1862 return Py_None;
1863 }
1864 /* Drop the argument parsing error as narrow strings
1865 are also valid. */
1866 PyErr_Clear();
1867 }
1868 if (!PyArg_ParseTuple(args, "O&i:chmod", PyUnicode_FSConverter,
1869 &opath, &i))
1870 return NULL;
1871 path = bytes2str(opath, 1);
1872 Py_BEGIN_ALLOW_THREADS
1873 attr = GetFileAttributesA(path);
1874 if (attr != 0xFFFFFFFF) {
1875 if (i & _S_IWRITE)
1876 attr &= ~FILE_ATTRIBUTE_READONLY;
1877 else
1878 attr |= FILE_ATTRIBUTE_READONLY;
1879 res = SetFileAttributesA(path, attr);
1880 }
1881 else
1882 res = 0;
1883 Py_END_ALLOW_THREADS
1884 if (!res) {
1885 win32_error("chmod", path);
1886 release_bytes(opath);
1887 return NULL;
1888 }
1889 release_bytes(opath);
1890 Py_INCREF(Py_None);
1891 return Py_None;
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00001892#else /* MS_WINDOWS */
Victor Stinner97b89882010-05-06 00:25:39 +00001893 if (!PyArg_ParseTuple(args, "O&i:chmod", PyUnicode_FSConverter,
1894 &opath, &i))
1895 return NULL;
1896 path = bytes2str(opath, 1);
1897 Py_BEGIN_ALLOW_THREADS
1898 res = chmod(path, i);
1899 Py_END_ALLOW_THREADS
1900 if (res < 0)
1901 return posix_error_with_allocated_filename(opath);
1902 release_bytes(opath);
1903 Py_INCREF(Py_None);
1904 return Py_None;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001905#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001906}
1907
Christian Heimes4e30a842007-11-30 22:12:06 +00001908#ifdef HAVE_FCHMOD
1909PyDoc_STRVAR(posix_fchmod__doc__,
1910"fchmod(fd, mode)\n\n\
1911Change the access permissions of the file given by file\n\
1912descriptor fd.");
1913
1914static PyObject *
1915posix_fchmod(PyObject *self, PyObject *args)
1916{
Victor Stinner97b89882010-05-06 00:25:39 +00001917 int fd, mode, res;
1918 if (!PyArg_ParseTuple(args, "ii:fchmod", &fd, &mode))
1919 return NULL;
1920 Py_BEGIN_ALLOW_THREADS
1921 res = fchmod(fd, mode);
1922 Py_END_ALLOW_THREADS
1923 if (res < 0)
1924 return posix_error();
1925 Py_RETURN_NONE;
Christian Heimes4e30a842007-11-30 22:12:06 +00001926}
1927#endif /* HAVE_FCHMOD */
1928
1929#ifdef HAVE_LCHMOD
1930PyDoc_STRVAR(posix_lchmod__doc__,
1931"lchmod(path, mode)\n\n\
1932Change the access permissions of a file. If path is a symlink, this\n\
1933affects the link itself rather than the target.");
1934
1935static PyObject *
1936posix_lchmod(PyObject *self, PyObject *args)
1937{
Victor Stinner97b89882010-05-06 00:25:39 +00001938 PyObject *opath;
1939 char *path;
1940 int i;
1941 int res;
1942 if (!PyArg_ParseTuple(args, "O&i:lchmod", PyUnicode_FSConverter,
1943 &opath, &i))
1944 return NULL;
1945 path = bytes2str(opath, 1);
1946 Py_BEGIN_ALLOW_THREADS
1947 res = lchmod(path, i);
1948 Py_END_ALLOW_THREADS
1949 if (res < 0)
1950 return posix_error_with_allocated_filename(opath);
1951 release_bytes(opath);
1952 Py_RETURN_NONE;
Christian Heimes4e30a842007-11-30 22:12:06 +00001953}
1954#endif /* HAVE_LCHMOD */
1955
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001956
Thomas Wouterscf297e42007-02-23 15:07:44 +00001957#ifdef HAVE_CHFLAGS
1958PyDoc_STRVAR(posix_chflags__doc__,
1959"chflags(path, flags)\n\n\
1960Set file flags.");
1961
1962static PyObject *
1963posix_chflags(PyObject *self, PyObject *args)
1964{
Victor Stinner97b89882010-05-06 00:25:39 +00001965 PyObject *opath;
1966 char *path;
1967 unsigned long flags;
1968 int res;
1969 if (!PyArg_ParseTuple(args, "O&k:chflags",
1970 PyUnicode_FSConverter, &opath, &flags))
1971 return NULL;
1972 path = bytes2str(opath, 1);
1973 Py_BEGIN_ALLOW_THREADS
1974 res = chflags(path, flags);
1975 Py_END_ALLOW_THREADS
1976 if (res < 0)
1977 return posix_error_with_allocated_filename(opath);
1978 release_bytes(opath);
1979 Py_INCREF(Py_None);
1980 return Py_None;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001981}
1982#endif /* HAVE_CHFLAGS */
1983
1984#ifdef HAVE_LCHFLAGS
1985PyDoc_STRVAR(posix_lchflags__doc__,
1986"lchflags(path, flags)\n\n\
1987Set file flags.\n\
1988This function will not follow symbolic links.");
1989
1990static PyObject *
1991posix_lchflags(PyObject *self, PyObject *args)
1992{
Victor Stinner97b89882010-05-06 00:25:39 +00001993 PyObject *opath;
1994 char *path;
1995 unsigned long flags;
1996 int res;
1997 if (!PyArg_ParseTuple(args, "O&k:lchflags",
1998 PyUnicode_FSConverter, &opath, &flags))
1999 return NULL;
2000 path = bytes2str(opath, 1);
2001 Py_BEGIN_ALLOW_THREADS
2002 res = lchflags(path, flags);
2003 Py_END_ALLOW_THREADS
2004 if (res < 0)
2005 return posix_error_with_allocated_filename(opath);
2006 release_bytes(opath);
2007 Py_INCREF(Py_None);
2008 return Py_None;
Thomas Wouterscf297e42007-02-23 15:07:44 +00002009}
2010#endif /* HAVE_LCHFLAGS */
2011
Martin v. Löwis244edc82001-10-04 22:44:26 +00002012#ifdef HAVE_CHROOT
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002013PyDoc_STRVAR(posix_chroot__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002014"chroot(path)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002015Change root directory to path.");
Martin v. Löwis244edc82001-10-04 22:44:26 +00002016
2017static PyObject *
2018posix_chroot(PyObject *self, PyObject *args)
2019{
Victor Stinner97b89882010-05-06 00:25:39 +00002020 return posix_1str(args, "O&:chroot", chroot);
Martin v. Löwis244edc82001-10-04 22:44:26 +00002021}
2022#endif
2023
Guido van Rossum21142a01999-01-08 21:05:37 +00002024#ifdef HAVE_FSYNC
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002025PyDoc_STRVAR(posix_fsync__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002026"fsync(fildes)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002027force write of file with filedescriptor to disk.");
Guido van Rossum21142a01999-01-08 21:05:37 +00002028
2029static PyObject *
Fred Drake4d1e64b2002-04-15 19:40:07 +00002030posix_fsync(PyObject *self, PyObject *fdobj)
Guido van Rossum21142a01999-01-08 21:05:37 +00002031{
Fred Drake4d1e64b2002-04-15 19:40:07 +00002032 return posix_fildes(fdobj, fsync);
Guido van Rossum21142a01999-01-08 21:05:37 +00002033}
2034#endif /* HAVE_FSYNC */
2035
2036#ifdef HAVE_FDATASYNC
Guido van Rossumecc23b02000-09-22 16:01:05 +00002037
Guido van Rossum7f58e2e2000-09-22 17:26:14 +00002038#ifdef __hpux
Guido van Rossumecc23b02000-09-22 16:01:05 +00002039extern int fdatasync(int); /* On HP-UX, in libc but not in unistd.h */
2040#endif
2041
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002042PyDoc_STRVAR(posix_fdatasync__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002043"fdatasync(fildes)\n\n\
Guido van Rossum21142a01999-01-08 21:05:37 +00002044force write of file with filedescriptor to disk.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002045 does not force update of metadata.");
Guido van Rossum21142a01999-01-08 21:05:37 +00002046
2047static PyObject *
Fred Drake4d1e64b2002-04-15 19:40:07 +00002048posix_fdatasync(PyObject *self, PyObject *fdobj)
Guido van Rossum21142a01999-01-08 21:05:37 +00002049{
Fred Drake4d1e64b2002-04-15 19:40:07 +00002050 return posix_fildes(fdobj, fdatasync);
Guido van Rossum21142a01999-01-08 21:05:37 +00002051}
2052#endif /* HAVE_FDATASYNC */
2053
2054
Fredrik Lundh10723342000-07-10 16:38:09 +00002055#ifdef HAVE_CHOWN
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002056PyDoc_STRVAR(posix_chown__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002057"chown(path, uid, gid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002058Change the owner and group id of path to the numeric uid and gid.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002059
Barry Warsaw53699e91996-12-10 23:23:01 +00002060static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002061posix_chown(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +00002062{
Victor Stinner97b89882010-05-06 00:25:39 +00002063 PyObject *opath;
2064 char *path;
2065 long uid, gid;
2066 int res;
2067 if (!PyArg_ParseTuple(args, "O&ll:chown",
2068 PyUnicode_FSConverter, &opath,
2069 &uid, &gid))
2070 return NULL;
2071 path = bytes2str(opath, 1);
2072 Py_BEGIN_ALLOW_THREADS
2073 res = chown(path, (uid_t) uid, (gid_t) gid);
2074 Py_END_ALLOW_THREADS
2075 if (res < 0)
2076 return posix_error_with_allocated_filename(opath);
2077 release_bytes(opath);
2078 Py_INCREF(Py_None);
2079 return Py_None;
Guido van Rossumb6775db1994-08-01 11:34:53 +00002080}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002081#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002082
Christian Heimes4e30a842007-11-30 22:12:06 +00002083#ifdef HAVE_FCHOWN
2084PyDoc_STRVAR(posix_fchown__doc__,
2085"fchown(fd, uid, gid)\n\n\
2086Change the owner and group id of the file given by file descriptor\n\
2087fd to the numeric uid and gid.");
2088
2089static PyObject *
2090posix_fchown(PyObject *self, PyObject *args)
2091{
Victor Stinner97b89882010-05-06 00:25:39 +00002092 int fd;
2093 long uid, gid;
2094 int res;
2095 if (!PyArg_ParseTuple(args, "ill:chown", &fd, &uid, &gid))
2096 return NULL;
2097 Py_BEGIN_ALLOW_THREADS
2098 res = fchown(fd, (uid_t) uid, (gid_t) gid);
2099 Py_END_ALLOW_THREADS
2100 if (res < 0)
2101 return posix_error();
2102 Py_RETURN_NONE;
Christian Heimes4e30a842007-11-30 22:12:06 +00002103}
2104#endif /* HAVE_FCHOWN */
2105
Martin v. Löwis0cec0ff2002-07-28 16:33:45 +00002106#ifdef HAVE_LCHOWN
2107PyDoc_STRVAR(posix_lchown__doc__,
2108"lchown(path, uid, gid)\n\n\
2109Change the owner and group id of path to the numeric uid and gid.\n\
2110This function will not follow symbolic links.");
2111
2112static PyObject *
2113posix_lchown(PyObject *self, PyObject *args)
2114{
Victor Stinner97b89882010-05-06 00:25:39 +00002115 PyObject *opath;
2116 char *path;
2117 long uid, gid;
2118 int res;
2119 if (!PyArg_ParseTuple(args, "O&ll:lchown",
2120 PyUnicode_FSConverter, &opath,
2121 &uid, &gid))
2122 return NULL;
2123 path = bytes2str(opath, 1);
2124 Py_BEGIN_ALLOW_THREADS
2125 res = lchown(path, (uid_t) uid, (gid_t) gid);
2126 Py_END_ALLOW_THREADS
2127 if (res < 0)
2128 return posix_error_with_allocated_filename(opath);
2129 release_bytes(opath);
2130 Py_INCREF(Py_None);
2131 return Py_None;
Martin v. Löwis0cec0ff2002-07-28 16:33:45 +00002132}
2133#endif /* HAVE_LCHOWN */
2134
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002135
Guido van Rossum36bc6801995-06-14 22:54:23 +00002136#ifdef HAVE_GETCWD
Barry Warsaw53699e91996-12-10 23:23:01 +00002137static PyObject *
Guido van Rossumf0af3e32008-10-02 18:55:37 +00002138posix_getcwd(int use_bytes)
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002139{
Victor Stinner97b89882010-05-06 00:25:39 +00002140 char buf[1026];
2141 char *res;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002142
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00002143#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00002144 if (!use_bytes && unicode_file_names()) {
2145 wchar_t wbuf[1026];
2146 wchar_t *wbuf2 = wbuf;
2147 PyObject *resobj;
2148 DWORD len;
2149 Py_BEGIN_ALLOW_THREADS
2150 len = GetCurrentDirectoryW(sizeof wbuf/ sizeof wbuf[0], wbuf);
2151 /* If the buffer is large enough, len does not include the
2152 terminating \0. If the buffer is too small, len includes
2153 the space needed for the terminator. */
2154 if (len >= sizeof wbuf/ sizeof wbuf[0]) {
2155 wbuf2 = malloc(len * sizeof(wchar_t));
2156 if (wbuf2)
2157 len = GetCurrentDirectoryW(len, wbuf2);
2158 }
2159 Py_END_ALLOW_THREADS
2160 if (!wbuf2) {
2161 PyErr_NoMemory();
2162 return NULL;
2163 }
2164 if (!len) {
2165 if (wbuf2 != wbuf) free(wbuf2);
2166 return win32_error("getcwdu", NULL);
2167 }
2168 resobj = PyUnicode_FromWideChar(wbuf2, len);
2169 if (wbuf2 != wbuf) free(wbuf2);
2170 return resobj;
2171 }
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002172#endif
2173
Victor Stinner97b89882010-05-06 00:25:39 +00002174 Py_BEGIN_ALLOW_THREADS
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002175#if defined(PYOS_OS2) && defined(PYCC_GCC)
Victor Stinner97b89882010-05-06 00:25:39 +00002176 res = _getcwd2(buf, sizeof buf);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002177#else
Victor Stinner97b89882010-05-06 00:25:39 +00002178 res = getcwd(buf, sizeof buf);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002179#endif
Victor Stinner97b89882010-05-06 00:25:39 +00002180 Py_END_ALLOW_THREADS
2181 if (res == NULL)
2182 return posix_error();
2183 if (use_bytes)
2184 return PyBytes_FromStringAndSize(buf, strlen(buf));
2185 return PyUnicode_Decode(buf, strlen(buf), Py_FileSystemDefaultEncoding,"surrogateescape");
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002186}
Guido van Rossumf0af3e32008-10-02 18:55:37 +00002187
2188PyDoc_STRVAR(posix_getcwd__doc__,
2189"getcwd() -> path\n\n\
2190Return a unicode string representing the current working directory.");
2191
2192static PyObject *
2193posix_getcwd_unicode(PyObject *self)
2194{
2195 return posix_getcwd(0);
2196}
2197
2198PyDoc_STRVAR(posix_getcwdb__doc__,
2199"getcwdb() -> path\n\n\
2200Return a bytes string representing the current working directory.");
2201
2202static PyObject *
2203posix_getcwd_bytes(PyObject *self)
2204{
2205 return posix_getcwd(1);
2206}
Guido van Rossum36bc6801995-06-14 22:54:23 +00002207#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002208
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002209
Guido van Rossumb6775db1994-08-01 11:34:53 +00002210#ifdef HAVE_LINK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002211PyDoc_STRVAR(posix_link__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002212"link(src, dst)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002213Create a hard link to a file.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002214
Barry Warsaw53699e91996-12-10 23:23:01 +00002215static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002216posix_link(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002217{
Victor Stinner97b89882010-05-06 00:25:39 +00002218 return posix_2str(args, "O&O&:link", link);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002219}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002220#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002221
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002222
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002223PyDoc_STRVAR(posix_listdir__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002224"listdir(path) -> list_of_strings\n\n\
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002225Return a list containing the names of the entries in the directory.\n\
2226\n\
Victor Stinner97b89882010-05-06 00:25:39 +00002227 path: path of directory to list\n\
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002228\n\
2229The list is in arbitrary order. It does not include the special\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002230entries '.' and '..' even if they are present in the directory.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002231
Barry Warsaw53699e91996-12-10 23:23:01 +00002232static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002233posix_listdir(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +00002234{
Victor Stinner97b89882010-05-06 00:25:39 +00002235 /* XXX Should redo this putting the (now four) versions of opendir
2236 in separate files instead of having them all here... */
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00002237#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002238
Victor Stinner97b89882010-05-06 00:25:39 +00002239 PyObject *d, *v;
2240 HANDLE hFindFile;
2241 BOOL result;
2242 WIN32_FIND_DATA FileData;
2243 PyObject *opath;
2244 char namebuf[MAX_PATH+5]; /* Overallocate for \\*.*\0 */
2245 char *bufptr = namebuf;
2246 Py_ssize_t len = sizeof(namebuf)-5; /* only claim to have space for MAX_PATH */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002247
Victor Stinner97b89882010-05-06 00:25:39 +00002248 /* If on wide-character-capable OS see if argument
2249 is Unicode and if so use wide API. */
2250 if (unicode_file_names()) {
2251 PyObject *po;
2252 if (PyArg_ParseTuple(args, "U:listdir", &po)) {
2253 WIN32_FIND_DATAW wFileData;
2254 Py_UNICODE *wnamebuf;
2255 /* Overallocate for \\*.*\0 */
2256 len = PyUnicode_GET_SIZE(po);
2257 wnamebuf = malloc((len + 5) * sizeof(wchar_t));
2258 if (!wnamebuf) {
2259 PyErr_NoMemory();
2260 return NULL;
2261 }
2262 wcscpy(wnamebuf, PyUnicode_AS_UNICODE(po));
2263 if (len > 0) {
2264 Py_UNICODE wch = wnamebuf[len-1];
2265 if (wch != L'/' && wch != L'\\' && wch != L':')
2266 wnamebuf[len++] = L'\\';
2267 wcscpy(wnamebuf + len, L"*.*");
2268 }
2269 if ((d = PyList_New(0)) == NULL) {
2270 free(wnamebuf);
2271 return NULL;
2272 }
2273 hFindFile = FindFirstFileW(wnamebuf, &wFileData);
2274 if (hFindFile == INVALID_HANDLE_VALUE) {
2275 int error = GetLastError();
2276 if (error == ERROR_FILE_NOT_FOUND) {
2277 free(wnamebuf);
2278 return d;
2279 }
2280 Py_DECREF(d);
2281 win32_error_unicode("FindFirstFileW", wnamebuf);
2282 free(wnamebuf);
2283 return NULL;
2284 }
2285 do {
2286 /* Skip over . and .. */
2287 if (wcscmp(wFileData.cFileName, L".") != 0 &&
2288 wcscmp(wFileData.cFileName, L"..") != 0) {
2289 v = PyUnicode_FromUnicode(wFileData.cFileName, wcslen(wFileData.cFileName));
2290 if (v == NULL) {
2291 Py_DECREF(d);
2292 d = NULL;
2293 break;
2294 }
2295 if (PyList_Append(d, v) != 0) {
2296 Py_DECREF(v);
2297 Py_DECREF(d);
2298 d = NULL;
2299 break;
2300 }
2301 Py_DECREF(v);
2302 }
2303 Py_BEGIN_ALLOW_THREADS
2304 result = FindNextFileW(hFindFile, &wFileData);
2305 Py_END_ALLOW_THREADS
2306 /* FindNextFile sets error to ERROR_NO_MORE_FILES if
2307 it got to the end of the directory. */
2308 if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
2309 Py_DECREF(d);
2310 win32_error_unicode("FindNextFileW", wnamebuf);
2311 FindClose(hFindFile);
2312 free(wnamebuf);
2313 return NULL;
2314 }
2315 } while (result == TRUE);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002316
Victor Stinner97b89882010-05-06 00:25:39 +00002317 if (FindClose(hFindFile) == FALSE) {
2318 Py_DECREF(d);
2319 win32_error_unicode("FindClose", wnamebuf);
2320 free(wnamebuf);
2321 return NULL;
2322 }
2323 free(wnamebuf);
2324 return d;
2325 }
2326 /* Drop the argument parsing error as narrow strings
2327 are also valid. */
2328 PyErr_Clear();
2329 }
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002330
Victor Stinner97b89882010-05-06 00:25:39 +00002331 if (!PyArg_ParseTuple(args, "O&:listdir",
2332 PyUnicode_FSConverter, &opath))
2333 return NULL;
2334 if (PyObject_Size(opath)+1 > MAX_PATH) {
2335 PyErr_SetString(PyExc_ValueError, "path too long");
2336 Py_DECREF(opath);
2337 return NULL;
2338 }
2339 strcpy(namebuf, bytes2str(opath, 0));
2340 len = PyObject_Size(opath);
2341 if (len > 0) {
2342 char ch = namebuf[len-1];
2343 if (ch != SEP && ch != ALTSEP && ch != ':')
2344 namebuf[len++] = '/';
2345 strcpy(namebuf + len, "*.*");
2346 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002347
Victor Stinner97b89882010-05-06 00:25:39 +00002348 if ((d = PyList_New(0)) == NULL)
2349 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00002350
Victor Stinner97b89882010-05-06 00:25:39 +00002351 hFindFile = FindFirstFile(namebuf, &FileData);
2352 if (hFindFile == INVALID_HANDLE_VALUE) {
2353 int error = GetLastError();
2354 if (error == ERROR_FILE_NOT_FOUND)
2355 return d;
2356 Py_DECREF(d);
2357 return win32_error("FindFirstFile", namebuf);
2358 }
2359 do {
2360 /* Skip over . and .. */
2361 if (strcmp(FileData.cFileName, ".") != 0 &&
2362 strcmp(FileData.cFileName, "..") != 0) {
2363 v = PyBytes_FromString(FileData.cFileName);
2364 if (v == NULL) {
2365 Py_DECREF(d);
2366 d = NULL;
2367 break;
2368 }
2369 if (PyList_Append(d, v) != 0) {
2370 Py_DECREF(v);
2371 Py_DECREF(d);
2372 d = NULL;
2373 break;
2374 }
2375 Py_DECREF(v);
2376 }
2377 Py_BEGIN_ALLOW_THREADS
2378 result = FindNextFile(hFindFile, &FileData);
2379 Py_END_ALLOW_THREADS
2380 /* FindNextFile sets error to ERROR_NO_MORE_FILES if
2381 it got to the end of the directory. */
2382 if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
2383 Py_DECREF(d);
2384 win32_error("FindNextFile", namebuf);
2385 FindClose(hFindFile);
2386 return NULL;
2387 }
2388 } while (result == TRUE);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002389
Victor Stinner97b89882010-05-06 00:25:39 +00002390 if (FindClose(hFindFile) == FALSE) {
2391 Py_DECREF(d);
2392 return win32_error("FindClose", namebuf);
2393 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002394
Victor Stinner97b89882010-05-06 00:25:39 +00002395 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002396
Tim Peters0bb44a42000-09-15 07:44:49 +00002397#elif defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002398
2399#ifndef MAX_PATH
2400#define MAX_PATH CCHMAXPATH
2401#endif
Martin v. Löwis011e8422009-05-05 04:43:17 +00002402 PyObject *oname;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002403 char *name, *pt;
Thomas Wouters68bc4f92006-03-01 01:05:10 +00002404 Py_ssize_t len;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002405 PyObject *d, *v;
2406 char namebuf[MAX_PATH+5];
2407 HDIR hdir = 1;
2408 ULONG srchcnt = 1;
2409 FILEFINDBUF3 ep;
2410 APIRET rc;
2411
Victor Stinner97b89882010-05-06 00:25:39 +00002412 if (!PyArg_ParseTuple(args, "O&:listdir",
Martin v. Löwis011e8422009-05-05 04:43:17 +00002413 PyUnicode_FSConverter, &oname))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002414 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002415 name = bytes2str(oname);
2416 len = PyObject_Size(oname);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002417 if (len >= MAX_PATH) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00002418 release_bytes(oname);
Neal Norwitz6c913782007-10-14 03:23:09 +00002419 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002420 return NULL;
2421 }
2422 strcpy(namebuf, name);
2423 for (pt = namebuf; *pt; pt++)
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00002424 if (*pt == ALTSEP)
2425 *pt = SEP;
2426 if (namebuf[len-1] != SEP)
2427 namebuf[len++] = SEP;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002428 strcpy(namebuf + len, "*.*");
2429
Neal Norwitz6c913782007-10-14 03:23:09 +00002430 if ((d = PyList_New(0)) == NULL) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00002431 release_bytes(oname);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002432 return NULL;
Alexandre Vassalotti4167ebc2007-10-14 02:54:41 +00002433 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002434
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002435 rc = DosFindFirst(namebuf, /* Wildcard Pattern to Match */
2436 &hdir, /* Handle to Use While Search Directory */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002437 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002438 &ep, sizeof(ep), /* Structure to Receive Directory Entry */
2439 &srchcnt, /* Max and Actual Count of Entries Per Iteration */
2440 FIL_STANDARD); /* Format of Entry (EAs or Not) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002441
2442 if (rc != NO_ERROR) {
2443 errno = ENOENT;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002444 return posix_error_with_allocated_filename(oname);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002445 }
2446
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002447 if (srchcnt > 0) { /* If Directory is NOT Totally Empty, */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002448 do {
2449 if (ep.achName[0] == '.'
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00002450 && (ep.achName[1] == '\0' || (ep.achName[1] == '.' && ep.achName[2] == '\0')))
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002451 continue; /* Skip Over "." and ".." Names */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002452
2453 strcpy(namebuf, ep.achName);
2454
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002455 /* Leave Case of Name Alone -- In Native Form */
2456 /* (Removed Forced Lowercasing Code) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002457
Christian Heimes72b710a2008-05-26 13:28:38 +00002458 v = PyBytes_FromString(namebuf);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002459 if (v == NULL) {
2460 Py_DECREF(d);
2461 d = NULL;
2462 break;
2463 }
2464 if (PyList_Append(d, v) != 0) {
2465 Py_DECREF(v);
2466 Py_DECREF(d);
2467 d = NULL;
2468 break;
2469 }
2470 Py_DECREF(v);
2471 } while (DosFindNext(hdir, &ep, sizeof(ep), &srchcnt) == NO_ERROR && srchcnt > 0);
2472 }
2473
Martin v. Löwis011e8422009-05-05 04:43:17 +00002474 release_bytes(oname);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002475 return d;
2476#else
Victor Stinner97b89882010-05-06 00:25:39 +00002477 PyObject *oname;
2478 char *name;
2479 PyObject *d, *v;
2480 DIR *dirp;
2481 struct dirent *ep;
2482 int arg_is_unicode = 1;
Just van Rossum96b1c902003-03-03 17:32:15 +00002483
Victor Stinner97b89882010-05-06 00:25:39 +00002484 errno = 0;
2485 if (!PyArg_ParseTuple(args, "U:listdir", &v)) {
2486 arg_is_unicode = 0;
2487 PyErr_Clear();
2488 }
2489 if (!PyArg_ParseTuple(args, "O&:listdir", PyUnicode_FSConverter, &oname))
2490 return NULL;
2491 name = bytes2str(oname, 1);
2492 if ((dirp = opendir(name)) == NULL) {
2493 return posix_error_with_allocated_filename(oname);
2494 }
2495 if ((d = PyList_New(0)) == NULL) {
2496 closedir(dirp);
2497 release_bytes(oname);
2498 return NULL;
2499 }
2500 for (;;) {
2501 errno = 0;
2502 Py_BEGIN_ALLOW_THREADS
2503 ep = readdir(dirp);
2504 Py_END_ALLOW_THREADS
2505 if (ep == NULL) {
2506 if (errno == 0) {
2507 break;
2508 } else {
2509 closedir(dirp);
2510 Py_DECREF(d);
2511 return posix_error_with_allocated_filename(oname);
2512 }
2513 }
2514 if (ep->d_name[0] == '.' &&
2515 (NAMLEN(ep) == 1 ||
2516 (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
2517 continue;
2518 v = PyBytes_FromStringAndSize(ep->d_name, NAMLEN(ep));
2519 if (v == NULL) {
2520 Py_DECREF(d);
2521 d = NULL;
2522 break;
2523 }
2524 if (arg_is_unicode) {
2525 PyObject *w;
Just van Rossum46c97842003-02-25 21:42:15 +00002526
Victor Stinner97b89882010-05-06 00:25:39 +00002527 w = PyUnicode_FromEncodedObject(v,
2528 Py_FileSystemDefaultEncoding,
2529 "surrogateescape");
2530 Py_DECREF(v);
2531 if (w != NULL)
2532 v = w;
2533 else {
2534 /* Encoding failed to decode ASCII bytes.
2535 Raise exception. */
2536 Py_DECREF(d);
2537 d = NULL;
2538 break;
2539 }
2540 }
2541 if (PyList_Append(d, v) != 0) {
2542 Py_DECREF(v);
2543 Py_DECREF(d);
2544 d = NULL;
2545 break;
2546 }
2547 Py_DECREF(v);
2548 }
2549 closedir(dirp);
2550 release_bytes(oname);
Guido van Rossum0ee42cd1991-04-08 21:01:03 +00002551
Victor Stinner97b89882010-05-06 00:25:39 +00002552 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002553
Tim Peters0bb44a42000-09-15 07:44:49 +00002554#endif /* which OS */
2555} /* end of posix_listdir */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002556
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00002557#ifdef MS_WINDOWS
Mark Hammondef8b6542001-05-13 08:04:26 +00002558/* A helper function for abspath on win32 */
2559static PyObject *
2560posix__getfullpathname(PyObject *self, PyObject *args)
2561{
Victor Stinner97b89882010-05-06 00:25:39 +00002562 PyObject *opath;
2563 char *path;
2564 char outbuf[MAX_PATH*2];
2565 char *temp;
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00002566#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00002567 if (unicode_file_names()) {
2568 PyUnicodeObject *po;
2569 if (PyArg_ParseTuple(args, "U|:_getfullpathname", &po)) {
2570 Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po);
2571 Py_UNICODE woutbuf[MAX_PATH*2], *woutbufp = woutbuf;
2572 Py_UNICODE *wtemp;
2573 DWORD result;
2574 PyObject *v;
2575 result = GetFullPathNameW(wpath,
2576 sizeof(woutbuf)/sizeof(woutbuf[0]),
2577 woutbuf, &wtemp);
2578 if (result > sizeof(woutbuf)/sizeof(woutbuf[0])) {
2579 woutbufp = malloc(result * sizeof(Py_UNICODE));
2580 if (!woutbufp)
2581 return PyErr_NoMemory();
2582 result = GetFullPathNameW(wpath, result, woutbufp, &wtemp);
2583 }
2584 if (result)
2585 v = PyUnicode_FromUnicode(woutbufp, wcslen(woutbufp));
2586 else
2587 v = win32_error_unicode("GetFullPathNameW", wpath);
2588 if (woutbufp != woutbuf)
2589 free(woutbufp);
2590 return v;
2591 }
2592 /* Drop the argument parsing error as narrow strings
2593 are also valid. */
2594 PyErr_Clear();
2595 }
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002596#endif
Victor Stinner97b89882010-05-06 00:25:39 +00002597 if (!PyArg_ParseTuple (args, "O&:_getfullpathname",
2598 PyUnicode_FSConverter, &opath))
2599 return NULL;
2600 path = bytes2str(opath, 1);
2601 if (!GetFullPathName(path, sizeof(outbuf)/sizeof(outbuf[0]),
2602 outbuf, &temp)) {
2603 win32_error("GetFullPathName", path);
2604 release_bytes(opath);
2605 return NULL;
2606 }
2607 release_bytes(opath);
2608 if (PyUnicode_Check(PyTuple_GetItem(args, 0))) {
2609 return PyUnicode_Decode(outbuf, strlen(outbuf),
2610 Py_FileSystemDefaultEncoding, NULL);
2611 }
2612 return PyBytes_FromString(outbuf);
Mark Hammondef8b6542001-05-13 08:04:26 +00002613} /* end of posix__getfullpathname */
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00002614#endif /* MS_WINDOWS */
Mark Hammondef8b6542001-05-13 08:04:26 +00002615
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002616PyDoc_STRVAR(posix_mkdir__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002617"mkdir(path [, mode=0777])\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002618Create a directory.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002619
Barry Warsaw53699e91996-12-10 23:23:01 +00002620static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002621posix_mkdir(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002622{
Victor Stinner97b89882010-05-06 00:25:39 +00002623 int res;
2624 PyObject *opath;
2625 char *path;
2626 int mode = 0777;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002627
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00002628#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00002629 if (unicode_file_names()) {
2630 PyUnicodeObject *po;
2631 if (PyArg_ParseTuple(args, "U|i:mkdir", &po, &mode)) {
2632 Py_BEGIN_ALLOW_THREADS
2633 /* PyUnicode_AS_UNICODE OK without thread lock as
2634 it is a simple dereference. */
2635 res = CreateDirectoryW(PyUnicode_AS_UNICODE(po), NULL);
2636 Py_END_ALLOW_THREADS
2637 if (!res)
2638 return win32_error_unicode("mkdir", PyUnicode_AS_UNICODE(po));
2639 Py_INCREF(Py_None);
2640 return Py_None;
2641 }
2642 /* Drop the argument parsing error as narrow strings
2643 are also valid. */
2644 PyErr_Clear();
2645 }
2646 if (!PyArg_ParseTuple(args, "O&|i:mkdir",
2647 PyUnicode_FSConverter, &opath, &mode))
2648 return NULL;
2649 path = bytes2str(opath, 1);
2650 Py_BEGIN_ALLOW_THREADS
2651 /* PyUnicode_AS_UNICODE OK without thread lock as
2652 it is a simple dereference. */
2653 res = CreateDirectoryA(path, NULL);
2654 Py_END_ALLOW_THREADS
2655 if (!res) {
2656 win32_error("mkdir", path);
2657 release_bytes(opath);
2658 return NULL;
2659 }
2660 release_bytes(opath);
2661 Py_INCREF(Py_None);
2662 return Py_None;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002663#else
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002664
Victor Stinner97b89882010-05-06 00:25:39 +00002665 if (!PyArg_ParseTuple(args, "O&|i:mkdir",
2666 PyUnicode_FSConverter, &opath, &mode))
2667 return NULL;
2668 path = bytes2str(opath, 1);
2669 Py_BEGIN_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002670#if ( defined(__WATCOMC__) || defined(PYCC_VACPP) ) && !defined(__QNX__)
Victor Stinner97b89882010-05-06 00:25:39 +00002671 res = mkdir(path);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002672#else
Victor Stinner97b89882010-05-06 00:25:39 +00002673 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002674#endif
Victor Stinner97b89882010-05-06 00:25:39 +00002675 Py_END_ALLOW_THREADS
2676 if (res < 0)
2677 return posix_error_with_allocated_filename(opath);
2678 release_bytes(opath);
2679 Py_INCREF(Py_None);
2680 return Py_None;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002681#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002682}
2683
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002684
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002685/* sys/resource.h is needed for at least: wait3(), wait4(), broken nice. */
2686#if defined(HAVE_SYS_RESOURCE_H)
Thomas Wouterse38b2f12001-07-11 22:35:31 +00002687#include <sys/resource.h>
2688#endif
Thomas Wouterse38b2f12001-07-11 22:35:31 +00002689
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002690
2691#ifdef HAVE_NICE
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002692PyDoc_STRVAR(posix_nice__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002693"nice(inc) -> new_priority\n\n\
2694Decrease the priority of process by inc and return the new priority.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002695
Barry Warsaw53699e91996-12-10 23:23:01 +00002696static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002697posix_nice(PyObject *self, PyObject *args)
Guido van Rossum775f4da1993-01-09 17:18:52 +00002698{
Victor Stinner97b89882010-05-06 00:25:39 +00002699 int increment, value;
Guido van Rossum775f4da1993-01-09 17:18:52 +00002700
Victor Stinner97b89882010-05-06 00:25:39 +00002701 if (!PyArg_ParseTuple(args, "i:nice", &increment))
2702 return NULL;
Thomas Woutersc2c12dc2001-07-11 14:45:34 +00002703
Victor Stinner97b89882010-05-06 00:25:39 +00002704 /* There are two flavours of 'nice': one that returns the new
2705 priority (as required by almost all standards out there) and the
2706 Linux/FreeBSD/BSDI one, which returns '0' on success and advices
2707 the use of getpriority() to get the new priority.
Tim Peters5aa91602002-01-30 05:46:57 +00002708
Victor Stinner97b89882010-05-06 00:25:39 +00002709 If we are of the nice family that returns the new priority, we
2710 need to clear errno before the call, and check if errno is filled
2711 before calling posix_error() on a returnvalue of -1, because the
2712 -1 may be the actual new priority! */
Thomas Woutersc2c12dc2001-07-11 14:45:34 +00002713
Victor Stinner97b89882010-05-06 00:25:39 +00002714 errno = 0;
2715 value = nice(increment);
Thomas Wouterse38b2f12001-07-11 22:35:31 +00002716#if defined(HAVE_BROKEN_NICE) && defined(HAVE_GETPRIORITY)
Victor Stinner97b89882010-05-06 00:25:39 +00002717 if (value == 0)
2718 value = getpriority(PRIO_PROCESS, 0);
Thomas Woutersc2c12dc2001-07-11 14:45:34 +00002719#endif
Victor Stinner97b89882010-05-06 00:25:39 +00002720 if (value == -1 && errno != 0)
2721 /* either nice() or getpriority() returned an error */
2722 return posix_error();
2723 return PyLong_FromLong((long) value);
Guido van Rossum775f4da1993-01-09 17:18:52 +00002724}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002725#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00002726
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002727PyDoc_STRVAR(posix_rename__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002728"rename(old, new)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002729Rename a file or directory.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002730
Barry Warsaw53699e91996-12-10 23:23:01 +00002731static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002732posix_rename(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002733{
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002734#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00002735 PyObject *o1, *o2;
2736 char *p1, *p2;
2737 BOOL result;
2738 if (unicode_file_names()) {
2739 if (!PyArg_ParseTuple(args, "OO:rename", &o1, &o2))
2740 goto error;
2741 if (!convert_to_unicode(&o1))
2742 goto error;
2743 if (!convert_to_unicode(&o2)) {
2744 Py_DECREF(o1);
2745 goto error;
2746 }
2747 Py_BEGIN_ALLOW_THREADS
2748 result = MoveFileW(PyUnicode_AsUnicode(o1),
2749 PyUnicode_AsUnicode(o2));
2750 Py_END_ALLOW_THREADS
2751 Py_DECREF(o1);
2752 Py_DECREF(o2);
2753 if (!result)
2754 return win32_error("rename", NULL);
2755 Py_INCREF(Py_None);
2756 return Py_None;
Hirokazu Yamamotod7e4c082008-08-17 09:30:15 +00002757error:
Victor Stinner97b89882010-05-06 00:25:39 +00002758 PyErr_Clear();
2759 }
2760 if (!PyArg_ParseTuple(args, "ss:rename", &p1, &p2))
2761 return NULL;
2762 Py_BEGIN_ALLOW_THREADS
2763 result = MoveFileA(p1, p2);
2764 Py_END_ALLOW_THREADS
2765 if (!result)
2766 return win32_error("rename", NULL);
2767 Py_INCREF(Py_None);
2768 return Py_None;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002769#else
Victor Stinner97b89882010-05-06 00:25:39 +00002770 return posix_2str(args, "O&O&:rename", rename);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002771#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002772}
2773
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002774
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002775PyDoc_STRVAR(posix_rmdir__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002776"rmdir(path)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002777Remove a directory.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002778
Barry Warsaw53699e91996-12-10 23:23:01 +00002779static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002780posix_rmdir(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002781{
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002782#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00002783 return win32_1str(args, "rmdir", "y:rmdir", RemoveDirectoryA, "U:rmdir", RemoveDirectoryW);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002784#else
Victor Stinner97b89882010-05-06 00:25:39 +00002785 return posix_1str(args, "O&:rmdir", rmdir);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002786#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002787}
2788
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002789
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002790PyDoc_STRVAR(posix_stat__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002791"stat(path) -> stat result\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002792Perform a stat system call on the given path.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002793
Barry Warsaw53699e91996-12-10 23:23:01 +00002794static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002795posix_stat(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002796{
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002797#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00002798 return posix_do_stat(self, args, "O&:stat", STAT, "U:stat", win32_wstat);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002799#else
Victor Stinner97b89882010-05-06 00:25:39 +00002800 return posix_do_stat(self, args, "O&:stat", STAT, NULL, NULL);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002801#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002802}
2803
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002804
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002805#ifdef HAVE_SYSTEM
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002806PyDoc_STRVAR(posix_system__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002807"system(command) -> exit_status\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002808Execute the command (a string) in a subshell.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002809
Barry Warsaw53699e91996-12-10 23:23:01 +00002810static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002811posix_system(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002812{
Victor Stinner97b89882010-05-06 00:25:39 +00002813 long sts;
Amaury Forgeot d'Arc90ebd3e2007-11-20 01:52:14 +00002814#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00002815 wchar_t *command;
2816 if (!PyArg_ParseTuple(args, "u:system", &command))
2817 return NULL;
Victor Stinnera5ab4fc2010-04-16 12:47:52 +00002818
Victor Stinner97b89882010-05-06 00:25:39 +00002819 Py_BEGIN_ALLOW_THREADS
2820 sts = _wsystem(command);
2821 Py_END_ALLOW_THREADS
Victor Stinnera5ab4fc2010-04-16 12:47:52 +00002822#else
Victor Stinner97b89882010-05-06 00:25:39 +00002823 PyObject *command_obj;
2824 char *command;
2825 if (!PyArg_ParseTuple(args, "O&:system",
2826 PyUnicode_FSConverter, &command_obj))
2827 return NULL;
Victor Stinnera5ab4fc2010-04-16 12:47:52 +00002828
Victor Stinner97b89882010-05-06 00:25:39 +00002829 command = bytes2str(command_obj, 1);
2830 Py_BEGIN_ALLOW_THREADS
2831 sts = system(command);
2832 Py_END_ALLOW_THREADS
2833 release_bytes(command_obj);
Victor Stinnera5ab4fc2010-04-16 12:47:52 +00002834#endif
Victor Stinner97b89882010-05-06 00:25:39 +00002835 return PyLong_FromLong(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002836}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002837#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002838
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002839
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002840PyDoc_STRVAR(posix_umask__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002841"umask(new_mask) -> old_mask\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002842Set the current numeric umask and return the previous umask.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002843
Barry Warsaw53699e91996-12-10 23:23:01 +00002844static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002845posix_umask(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002846{
Victor Stinner97b89882010-05-06 00:25:39 +00002847 int i;
2848 if (!PyArg_ParseTuple(args, "i:umask", &i))
2849 return NULL;
2850 i = (int)umask(i);
2851 if (i < 0)
2852 return posix_error();
2853 return PyLong_FromLong((long)i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002854}
2855
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002856
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002857PyDoc_STRVAR(posix_unlink__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002858"unlink(path)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002859Remove a file (same as remove(path)).");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002860
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002861PyDoc_STRVAR(posix_remove__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002862"remove(path)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002863Remove a file (same as unlink(path)).");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002864
Barry Warsaw53699e91996-12-10 23:23:01 +00002865static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002866posix_unlink(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002867{
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002868#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00002869 return win32_1str(args, "remove", "y:remove", DeleteFileA, "U:remove", DeleteFileW);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002870#else
Victor Stinner97b89882010-05-06 00:25:39 +00002871 return posix_1str(args, "O&:remove", unlink);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002872#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002873}
2874
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002875
Guido van Rossumb6775db1994-08-01 11:34:53 +00002876#ifdef HAVE_UNAME
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002877PyDoc_STRVAR(posix_uname__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002878"uname() -> (sysname, nodename, release, version, machine)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002879Return a tuple identifying the current operating system.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002880
Barry Warsaw53699e91996-12-10 23:23:01 +00002881static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00002882posix_uname(PyObject *self, PyObject *noargs)
Guido van Rossumc39de5f1992-02-05 11:15:54 +00002883{
Victor Stinner97b89882010-05-06 00:25:39 +00002884 struct utsname u;
2885 int res;
Neal Norwitze241ce82003-02-17 18:17:05 +00002886
Victor Stinner97b89882010-05-06 00:25:39 +00002887 Py_BEGIN_ALLOW_THREADS
2888 res = uname(&u);
2889 Py_END_ALLOW_THREADS
2890 if (res < 0)
2891 return posix_error();
2892 return Py_BuildValue("(sssss)",
2893 u.sysname,
2894 u.nodename,
2895 u.release,
2896 u.version,
2897 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +00002898}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002899#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00002900
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002901static int
2902extract_time(PyObject *t, long* sec, long* usec)
2903{
Victor Stinner97b89882010-05-06 00:25:39 +00002904 long intval;
2905 if (PyFloat_Check(t)) {
2906 double tval = PyFloat_AsDouble(t);
2907 PyObject *intobj = Py_TYPE(t)->tp_as_number->nb_int(t);
2908 if (!intobj)
2909 return -1;
2910 intval = PyLong_AsLong(intobj);
2911 Py_DECREF(intobj);
2912 if (intval == -1 && PyErr_Occurred())
2913 return -1;
2914 *sec = intval;
2915 *usec = (long)((tval - intval) * 1e6); /* can't exceed 1000000 */
2916 if (*usec < 0)
2917 /* If rounding gave us a negative number,
2918 truncate. */
2919 *usec = 0;
Martin v. Löwis076b2092002-09-10 15:04:41 +00002920 return 0;
Victor Stinner97b89882010-05-06 00:25:39 +00002921 }
2922 intval = PyLong_AsLong(t);
2923 if (intval == -1 && PyErr_Occurred())
2924 return -1;
2925 *sec = intval;
2926 *usec = 0;
2927 return 0;
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002928}
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002930PyDoc_STRVAR(posix_utime__doc__,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002931"utime(path, (atime, mtime))\n\
Fred Drakef7ce04d2002-06-20 18:31:21 +00002932utime(path, None)\n\n\
Barry Warsaw3cef8562000-05-01 16:17:24 +00002933Set the access and modified time of the file to the given values. If the\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002934second form is used, set the access and modified times to the current time.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002935
Barry Warsaw53699e91996-12-10 23:23:01 +00002936static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002937posix_utime(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002938{
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00002939#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00002940 PyObject *arg;
2941 PyUnicodeObject *obwpath;
2942 wchar_t *wpath = NULL;
2943 PyObject *oapath;
2944 char *apath;
2945 HANDLE hFile;
2946 long atimesec, mtimesec, ausec, musec;
2947 FILETIME atime, mtime;
2948 PyObject *result = NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002949
Victor Stinner97b89882010-05-06 00:25:39 +00002950 if (unicode_file_names()) {
2951 if (PyArg_ParseTuple(args, "UO|:utime", &obwpath, &arg)) {
2952 wpath = PyUnicode_AS_UNICODE(obwpath);
2953 Py_BEGIN_ALLOW_THREADS
2954 hFile = CreateFileW(wpath, FILE_WRITE_ATTRIBUTES, 0,
2955 NULL, OPEN_EXISTING,
2956 FILE_FLAG_BACKUP_SEMANTICS, NULL);
2957 Py_END_ALLOW_THREADS
2958 if (hFile == INVALID_HANDLE_VALUE)
2959 return win32_error_unicode("utime", wpath);
2960 } else
2961 /* Drop the argument parsing error as narrow strings
2962 are also valid. */
2963 PyErr_Clear();
2964 }
2965 if (!wpath) {
2966 if (!PyArg_ParseTuple(args, "O&O:utime",
2967 PyUnicode_FSConverter, &oapath, &arg))
2968 return NULL;
2969 apath = bytes2str(oapath, 1);
2970 Py_BEGIN_ALLOW_THREADS
2971 hFile = CreateFileA(apath, FILE_WRITE_ATTRIBUTES, 0,
2972 NULL, OPEN_EXISTING,
2973 FILE_FLAG_BACKUP_SEMANTICS, NULL);
2974 Py_END_ALLOW_THREADS
2975 if (hFile == INVALID_HANDLE_VALUE) {
2976 win32_error("utime", apath);
2977 release_bytes(oapath);
2978 return NULL;
2979 }
2980 release_bytes(oapath);
2981 }
2982
2983 if (arg == Py_None) {
2984 SYSTEMTIME now;
2985 GetSystemTime(&now);
2986 if (!SystemTimeToFileTime(&now, &mtime) ||
2987 !SystemTimeToFileTime(&now, &atime)) {
2988 win32_error("utime", NULL);
2989 goto done;
2990 }
2991 }
2992 else if (!PyTuple_Check(arg) || PyTuple_Size(arg) != 2) {
2993 PyErr_SetString(PyExc_TypeError,
2994 "utime() arg 2 must be a tuple (atime, mtime)");
2995 goto done;
2996 }
2997 else {
2998 if (extract_time(PyTuple_GET_ITEM(arg, 0),
2999 &atimesec, &ausec) == -1)
3000 goto done;
3001 time_t_to_FILE_TIME(atimesec, 1000*ausec, &atime);
3002 if (extract_time(PyTuple_GET_ITEM(arg, 1),
3003 &mtimesec, &musec) == -1)
3004 goto done;
3005 time_t_to_FILE_TIME(mtimesec, 1000*musec, &mtime);
3006 }
3007 if (!SetFileTime(hFile, NULL, &atime, &mtime)) {
3008 /* Avoid putting the file name into the error here,
3009 as that may confuse the user into believing that
3010 something is wrong with the file, when it also
3011 could be the time stamp that gives a problem. */
3012 win32_error("utime", NULL);
3013 }
3014 Py_INCREF(Py_None);
3015 result = Py_None;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003016done:
Victor Stinner97b89882010-05-06 00:25:39 +00003017 CloseHandle(hFile);
3018 return result;
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00003019#else /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +00003020
Victor Stinner97b89882010-05-06 00:25:39 +00003021 PyObject *opath;
3022 char *path;
3023 long atime, mtime, ausec, musec;
3024 int res;
3025 PyObject* arg;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00003026
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00003027#if defined(HAVE_UTIMES)
Victor Stinner97b89882010-05-06 00:25:39 +00003028 struct timeval buf[2];
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00003029#define ATIME buf[0].tv_sec
3030#define MTIME buf[1].tv_sec
3031#elif defined(HAVE_UTIME_H)
Guido van Rossum6d8841c1997-08-14 19:57:39 +00003032/* XXX should define struct utimbuf instead, above */
Victor Stinner97b89882010-05-06 00:25:39 +00003033 struct utimbuf buf;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00003034#define ATIME buf.actime
3035#define MTIME buf.modtime
3036#define UTIME_ARG &buf
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00003037#else /* HAVE_UTIMES */
Victor Stinner97b89882010-05-06 00:25:39 +00003038 time_t buf[2];
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00003039#define ATIME buf[0]
3040#define MTIME buf[1]
3041#define UTIME_ARG buf
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00003042#endif /* HAVE_UTIMES */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00003043
Mark Hammond817c9292003-12-03 01:22:38 +00003044
Victor Stinner97b89882010-05-06 00:25:39 +00003045 if (!PyArg_ParseTuple(args, "O&O:utime",
3046 PyUnicode_FSConverter, &opath, &arg))
3047 return NULL;
3048 path = bytes2str(opath, 1);
3049 if (arg == Py_None) {
3050 /* optional time values not given */
3051 Py_BEGIN_ALLOW_THREADS
3052 res = utime(path, NULL);
3053 Py_END_ALLOW_THREADS
3054 }
3055 else if (!PyTuple_Check(arg) || PyTuple_Size(arg) != 2) {
3056 PyErr_SetString(PyExc_TypeError,
3057 "utime() arg 2 must be a tuple (atime, mtime)");
3058 release_bytes(opath);
3059 return NULL;
3060 }
3061 else {
3062 if (extract_time(PyTuple_GET_ITEM(arg, 0),
3063 &atime, &ausec) == -1) {
3064 release_bytes(opath);
3065 return NULL;
3066 }
3067 if (extract_time(PyTuple_GET_ITEM(arg, 1),
3068 &mtime, &musec) == -1) {
3069 release_bytes(opath);
3070 return NULL;
3071 }
3072 ATIME = atime;
3073 MTIME = mtime;
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00003074#ifdef HAVE_UTIMES
Victor Stinner97b89882010-05-06 00:25:39 +00003075 buf[0].tv_usec = ausec;
3076 buf[1].tv_usec = musec;
3077 Py_BEGIN_ALLOW_THREADS
3078 res = utimes(path, buf);
3079 Py_END_ALLOW_THREADS
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00003080#else
Victor Stinner97b89882010-05-06 00:25:39 +00003081 Py_BEGIN_ALLOW_THREADS
3082 res = utime(path, UTIME_ARG);
3083 Py_END_ALLOW_THREADS
Mark Hammond817c9292003-12-03 01:22:38 +00003084#endif /* HAVE_UTIMES */
Victor Stinner97b89882010-05-06 00:25:39 +00003085 }
3086 if (res < 0) {
3087 return posix_error_with_allocated_filename(opath);
3088 }
3089 release_bytes(opath);
3090 Py_INCREF(Py_None);
3091 return Py_None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00003092#undef UTIME_ARG
3093#undef ATIME
3094#undef MTIME
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00003095#endif /* MS_WINDOWS */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00003096}
3097
Guido van Rossum85e3b011991-06-03 12:42:10 +00003098
Guido van Rossum3b066191991-06-04 19:40:25 +00003099/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +00003100
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003101PyDoc_STRVAR(posix__exit__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003102"_exit(status)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003103Exit to the system with specified status, without normal exit processing.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003104
Barry Warsaw53699e91996-12-10 23:23:01 +00003105static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00003106posix__exit(PyObject *self, PyObject *args)
Guido van Rossum85e3b011991-06-03 12:42:10 +00003107{
Victor Stinner97b89882010-05-06 00:25:39 +00003108 int sts;
3109 if (!PyArg_ParseTuple(args, "i:_exit", &sts))
3110 return NULL;
3111 _exit(sts);
3112 return NULL; /* Make gcc -Wall happy */
Guido van Rossum85e3b011991-06-03 12:42:10 +00003113}
3114
Martin v. Löwis114619e2002-10-07 06:44:21 +00003115#if defined(HAVE_EXECV) || defined(HAVE_SPAWNV)
3116static void
Martin v. Löwis725507b2006-03-07 12:08:51 +00003117free_string_array(char **array, Py_ssize_t count)
Martin v. Löwis114619e2002-10-07 06:44:21 +00003118{
Victor Stinner97b89882010-05-06 00:25:39 +00003119 Py_ssize_t i;
3120 for (i = 0; i < count; i++)
3121 PyMem_Free(array[i]);
3122 PyMem_DEL(array);
Martin v. Löwis114619e2002-10-07 06:44:21 +00003123}
Martin v. Löwis011e8422009-05-05 04:43:17 +00003124
Antoine Pitrou69f71142009-05-24 21:25:49 +00003125static
Martin v. Löwis011e8422009-05-05 04:43:17 +00003126int fsconvert_strdup(PyObject *o, char**out)
3127{
Victor Stinner97b89882010-05-06 00:25:39 +00003128 PyObject *bytes;
3129 Py_ssize_t size;
3130 if (!PyUnicode_FSConverter(o, &bytes))
3131 return 0;
3132 size = PyObject_Size(bytes);
3133 *out = PyMem_Malloc(size+1);
3134 if (!*out)
3135 return 0;
3136 /* Don't lock bytes, as we hold the GIL */
3137 memcpy(*out, bytes2str(bytes, 0), size+1);
3138 Py_DECREF(bytes);
3139 return 1;
Martin v. Löwis011e8422009-05-05 04:43:17 +00003140}
Martin v. Löwis114619e2002-10-07 06:44:21 +00003141#endif
3142
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003143
Guido van Rossuma4916fa1996-05-23 22:58:55 +00003144#ifdef HAVE_EXECV
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003145PyDoc_STRVAR(posix_execv__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003146"execv(path, args)\n\n\
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003147Execute an executable path with arguments, replacing current process.\n\
3148\n\
Victor Stinner97b89882010-05-06 00:25:39 +00003149 path: path of executable file\n\
3150 args: tuple or list of strings");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003151
Barry Warsaw53699e91996-12-10 23:23:01 +00003152static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00003153posix_execv(PyObject *self, PyObject *args)
Guido van Rossum85e3b011991-06-03 12:42:10 +00003154{
Victor Stinner97b89882010-05-06 00:25:39 +00003155 PyObject *opath;
3156 char *path;
3157 PyObject *argv;
3158 char **argvlist;
3159 Py_ssize_t i, argc;
3160 PyObject *(*getitem)(PyObject *, Py_ssize_t);
Guido van Rossum85e3b011991-06-03 12:42:10 +00003161
Victor Stinner97b89882010-05-06 00:25:39 +00003162 /* execv has two arguments: (path, argv), where
3163 argv is a list or tuple of strings. */
Guido van Rossum85e3b011991-06-03 12:42:10 +00003164
Victor Stinner97b89882010-05-06 00:25:39 +00003165 if (!PyArg_ParseTuple(args, "O&O:execv",
3166 PyUnicode_FSConverter,
3167 &opath, &argv))
3168 return NULL;
3169 path = bytes2str(opath, 1);
3170 if (PyList_Check(argv)) {
3171 argc = PyList_Size(argv);
3172 getitem = PyList_GetItem;
3173 }
3174 else if (PyTuple_Check(argv)) {
3175 argc = PyTuple_Size(argv);
3176 getitem = PyTuple_GetItem;
3177 }
3178 else {
3179 PyErr_SetString(PyExc_TypeError, "execv() arg 2 must be a tuple or list");
3180 release_bytes(opath);
3181 return NULL;
3182 }
3183 if (argc < 1) {
3184 PyErr_SetString(PyExc_ValueError, "execv() arg 2 must not be empty");
3185 release_bytes(opath);
3186 return NULL;
3187 }
Guido van Rossum50422b42000-04-26 20:34:28 +00003188
Victor Stinner97b89882010-05-06 00:25:39 +00003189 argvlist = PyMem_NEW(char *, argc+1);
3190 if (argvlist == NULL) {
3191 release_bytes(opath);
3192 return PyErr_NoMemory();
3193 }
3194 for (i = 0; i < argc; i++) {
3195 if (!fsconvert_strdup((*getitem)(argv, i),
3196 &argvlist[i])) {
3197 free_string_array(argvlist, i);
3198 PyErr_SetString(PyExc_TypeError,
3199 "execv() arg 2 must contain only strings");
3200 release_bytes(opath);
3201 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00003202
Victor Stinner97b89882010-05-06 00:25:39 +00003203 }
3204 }
3205 argvlist[argc] = NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +00003206
Victor Stinner97b89882010-05-06 00:25:39 +00003207 execv(path, argvlist);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003208
Victor Stinner97b89882010-05-06 00:25:39 +00003209 /* If we get here it's definitely an error */
Guido van Rossum85e3b011991-06-03 12:42:10 +00003210
Victor Stinner97b89882010-05-06 00:25:39 +00003211 free_string_array(argvlist, argc);
3212 release_bytes(opath);
3213 return posix_error();
Guido van Rossum85e3b011991-06-03 12:42:10 +00003214}
3215
Victor Stinnera27dcb72010-04-25 22:39:07 +00003216static char**
3217parse_envlist(PyObject* env, Py_ssize_t *envc_ptr)
3218{
Victor Stinner97b89882010-05-06 00:25:39 +00003219 char **envlist;
3220 Py_ssize_t i, pos, envc;
3221 PyObject *keys=NULL, *vals=NULL;
3222 PyObject *key, *val, *key2, *val2;
3223 char *p, *k, *v;
3224 size_t len;
Victor Stinnera27dcb72010-04-25 22:39:07 +00003225
Victor Stinner97b89882010-05-06 00:25:39 +00003226 i = PyMapping_Size(env);
3227 if (i < 0)
3228 return NULL;
3229 envlist = PyMem_NEW(char *, i + 1);
3230 if (envlist == NULL) {
3231 PyErr_NoMemory();
3232 return NULL;
3233 }
3234 envc = 0;
3235 keys = PyMapping_Keys(env);
3236 vals = PyMapping_Values(env);
3237 if (!keys || !vals)
3238 goto error;
3239 if (!PyList_Check(keys) || !PyList_Check(vals)) {
3240 PyErr_Format(PyExc_TypeError,
3241 "env.keys() or env.values() is not a list");
3242 goto error;
3243 }
Victor Stinnera27dcb72010-04-25 22:39:07 +00003244
Victor Stinner97b89882010-05-06 00:25:39 +00003245 for (pos = 0; pos < i; pos++) {
3246 key = PyList_GetItem(keys, pos);
3247 val = PyList_GetItem(vals, pos);
3248 if (!key || !val)
3249 goto error;
Victor Stinnera27dcb72010-04-25 22:39:07 +00003250
Victor Stinner97b89882010-05-06 00:25:39 +00003251 if (PyUnicode_FSConverter(key, &key2) == 0)
3252 goto error;
3253 if (PyUnicode_FSConverter(val, &val2) == 0) {
3254 Py_DECREF(key2);
3255 goto error;
3256 }
Victor Stinnera27dcb72010-04-25 22:39:07 +00003257
3258#if defined(PYOS_OS2)
Victor Stinner97b89882010-05-06 00:25:39 +00003259 /* Omit Pseudo-Env Vars that Would Confuse Programs if Passed On */
3260 if (stricmp(k, "BEGINLIBPATH") != 0 && stricmp(k, "ENDLIBPATH") != 0) {
Victor Stinnera27dcb72010-04-25 22:39:07 +00003261#endif
Victor Stinner97b89882010-05-06 00:25:39 +00003262 k = PyBytes_AsString(key2);
3263 v = PyBytes_AsString(val2);
3264 len = PyBytes_GET_SIZE(key2) + PyBytes_GET_SIZE(val2) + 2;
Victor Stinnera27dcb72010-04-25 22:39:07 +00003265
Victor Stinner97b89882010-05-06 00:25:39 +00003266 p = PyMem_NEW(char, len);
3267 if (p == NULL) {
3268 PyErr_NoMemory();
3269 Py_DECREF(key2);
3270 Py_DECREF(val2);
3271 goto error;
3272 }
3273 PyOS_snprintf(p, len, "%s=%s", k, v);
3274 envlist[envc++] = p;
3275 Py_DECREF(key2);
3276 Py_DECREF(val2);
Victor Stinnera27dcb72010-04-25 22:39:07 +00003277#if defined(PYOS_OS2)
Victor Stinner97b89882010-05-06 00:25:39 +00003278 }
Victor Stinnera27dcb72010-04-25 22:39:07 +00003279#endif
Victor Stinner97b89882010-05-06 00:25:39 +00003280 }
3281 Py_DECREF(vals);
3282 Py_DECREF(keys);
Victor Stinnera27dcb72010-04-25 22:39:07 +00003283
Victor Stinner97b89882010-05-06 00:25:39 +00003284 envlist[envc] = 0;
3285 *envc_ptr = envc;
3286 return envlist;
Victor Stinnera27dcb72010-04-25 22:39:07 +00003287
3288error:
Victor Stinner97b89882010-05-06 00:25:39 +00003289 Py_XDECREF(keys);
3290 Py_XDECREF(vals);
3291 while (--envc >= 0)
3292 PyMem_DEL(envlist[envc]);
3293 PyMem_DEL(envlist);
3294 return NULL;
Victor Stinnera27dcb72010-04-25 22:39:07 +00003295}
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003296
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003297PyDoc_STRVAR(posix_execve__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003298"execve(path, args, env)\n\n\
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003299Execute a path with arguments and environment, replacing current process.\n\
3300\n\
Victor Stinner97b89882010-05-06 00:25:39 +00003301 path: path of executable file\n\
3302 args: tuple or list of arguments\n\
3303 env: dictionary of strings mapping to strings");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003304
Barry Warsaw53699e91996-12-10 23:23:01 +00003305static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00003306posix_execve(PyObject *self, PyObject *args)
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003307{
Victor Stinner97b89882010-05-06 00:25:39 +00003308 PyObject *opath;
3309 char *path;
3310 PyObject *argv, *env;
3311 char **argvlist;
3312 char **envlist;
3313 Py_ssize_t i, argc, envc;
3314 PyObject *(*getitem)(PyObject *, Py_ssize_t);
3315 Py_ssize_t lastarg = 0;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003316
Victor Stinner97b89882010-05-06 00:25:39 +00003317 /* execve has three arguments: (path, argv, env), where
3318 argv is a list or tuple of strings and env is a dictionary
3319 like posix.environ. */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003320
Victor Stinner97b89882010-05-06 00:25:39 +00003321 if (!PyArg_ParseTuple(args, "O&OO:execve",
3322 PyUnicode_FSConverter,
3323 &opath, &argv, &env))
3324 return NULL;
3325 path = bytes2str(opath, 1);
3326 if (PyList_Check(argv)) {
3327 argc = PyList_Size(argv);
3328 getitem = PyList_GetItem;
3329 }
3330 else if (PyTuple_Check(argv)) {
3331 argc = PyTuple_Size(argv);
3332 getitem = PyTuple_GetItem;
3333 }
3334 else {
3335 PyErr_SetString(PyExc_TypeError,
3336 "execve() arg 2 must be a tuple or list");
3337 goto fail_0;
3338 }
3339 if (!PyMapping_Check(env)) {
3340 PyErr_SetString(PyExc_TypeError,
3341 "execve() arg 3 must be a mapping object");
3342 goto fail_0;
3343 }
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003344
Victor Stinner97b89882010-05-06 00:25:39 +00003345 argvlist = PyMem_NEW(char *, argc+1);
3346 if (argvlist == NULL) {
3347 PyErr_NoMemory();
3348 goto fail_0;
3349 }
3350 for (i = 0; i < argc; i++) {
3351 if (!fsconvert_strdup((*getitem)(argv, i),
3352 &argvlist[i]))
3353 {
3354 lastarg = i;
3355 goto fail_1;
3356 }
3357 }
3358 lastarg = argc;
3359 argvlist[argc] = NULL;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003360
Victor Stinner97b89882010-05-06 00:25:39 +00003361 envlist = parse_envlist(env, &envc);
3362 if (envlist == NULL)
3363 goto fail_1;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003364
Victor Stinner97b89882010-05-06 00:25:39 +00003365 execve(path, argvlist, envlist);
Tim Peters5aa91602002-01-30 05:46:57 +00003366
Victor Stinner97b89882010-05-06 00:25:39 +00003367 /* If we get here it's definitely an error */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003368
Victor Stinner97b89882010-05-06 00:25:39 +00003369 (void) posix_error();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003370
Victor Stinner97b89882010-05-06 00:25:39 +00003371 while (--envc >= 0)
3372 PyMem_DEL(envlist[envc]);
3373 PyMem_DEL(envlist);
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003374 fail_1:
Victor Stinner97b89882010-05-06 00:25:39 +00003375 free_string_array(argvlist, lastarg);
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003376 fail_0:
Victor Stinner97b89882010-05-06 00:25:39 +00003377 release_bytes(opath);
3378 return NULL;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003379}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00003380#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003381
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003382
Guido van Rossuma1065681999-01-25 23:20:23 +00003383#ifdef HAVE_SPAWNV
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003384PyDoc_STRVAR(posix_spawnv__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003385"spawnv(mode, path, args)\n\n\
Tim Peters25059d32001-12-07 20:35:43 +00003386Execute the program 'path' in a new process.\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00003387\n\
Victor Stinner97b89882010-05-06 00:25:39 +00003388 mode: mode of process creation\n\
3389 path: path of executable file\n\
3390 args: tuple or list of strings");
Guido van Rossuma1065681999-01-25 23:20:23 +00003391
3392static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00003393posix_spawnv(PyObject *self, PyObject *args)
Guido van Rossuma1065681999-01-25 23:20:23 +00003394{
Victor Stinner97b89882010-05-06 00:25:39 +00003395 PyObject *opath;
3396 char *path;
3397 PyObject *argv;
3398 char **argvlist;
3399 int mode, i;
3400 Py_ssize_t argc;
3401 Py_intptr_t spawnval;
3402 PyObject *(*getitem)(PyObject *, Py_ssize_t);
Guido van Rossuma1065681999-01-25 23:20:23 +00003403
Victor Stinner97b89882010-05-06 00:25:39 +00003404 /* spawnv has three arguments: (mode, path, argv), where
3405 argv is a list or tuple of strings. */
Guido van Rossuma1065681999-01-25 23:20:23 +00003406
Victor Stinner97b89882010-05-06 00:25:39 +00003407 if (!PyArg_ParseTuple(args, "iO&O:spawnv", &mode,
3408 PyUnicode_FSConverter,
3409 &opath, &argv))
3410 return NULL;
3411 path = bytes2str(opath, 1);
3412 if (PyList_Check(argv)) {
3413 argc = PyList_Size(argv);
3414 getitem = PyList_GetItem;
3415 }
3416 else if (PyTuple_Check(argv)) {
3417 argc = PyTuple_Size(argv);
3418 getitem = PyTuple_GetItem;
3419 }
3420 else {
3421 PyErr_SetString(PyExc_TypeError,
3422 "spawnv() arg 2 must be a tuple or list");
3423 release_bytes(opath);
3424 return NULL;
3425 }
Guido van Rossuma1065681999-01-25 23:20:23 +00003426
Victor Stinner97b89882010-05-06 00:25:39 +00003427 argvlist = PyMem_NEW(char *, argc+1);
3428 if (argvlist == NULL) {
3429 release_bytes(opath);
3430 return PyErr_NoMemory();
3431 }
3432 for (i = 0; i < argc; i++) {
3433 if (!fsconvert_strdup((*getitem)(argv, i),
3434 &argvlist[i])) {
3435 free_string_array(argvlist, i);
3436 PyErr_SetString(
3437 PyExc_TypeError,
3438 "spawnv() arg 2 must contain only strings");
3439 release_bytes(opath);
3440 return NULL;
3441 }
3442 }
3443 argvlist[argc] = NULL;
Guido van Rossuma1065681999-01-25 23:20:23 +00003444
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00003445#if defined(PYOS_OS2) && defined(PYCC_GCC)
Victor Stinner97b89882010-05-06 00:25:39 +00003446 Py_BEGIN_ALLOW_THREADS
3447 spawnval = spawnv(mode, path, argvlist);
3448 Py_END_ALLOW_THREADS
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00003449#else
Victor Stinner97b89882010-05-06 00:25:39 +00003450 if (mode == _OLD_P_OVERLAY)
3451 mode = _P_OVERLAY;
Tim Peters5aa91602002-01-30 05:46:57 +00003452
Victor Stinner97b89882010-05-06 00:25:39 +00003453 Py_BEGIN_ALLOW_THREADS
3454 spawnval = _spawnv(mode, path, argvlist);
3455 Py_END_ALLOW_THREADS
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00003456#endif
Tim Peters5aa91602002-01-30 05:46:57 +00003457
Victor Stinner97b89882010-05-06 00:25:39 +00003458 free_string_array(argvlist, argc);
3459 release_bytes(opath);
Guido van Rossuma1065681999-01-25 23:20:23 +00003460
Victor Stinner97b89882010-05-06 00:25:39 +00003461 if (spawnval == -1)
3462 return posix_error();
3463 else
Fredrik Lundhe25cfd82000-07-09 13:10:40 +00003464#if SIZEOF_LONG == SIZEOF_VOID_P
Victor Stinner97b89882010-05-06 00:25:39 +00003465 return Py_BuildValue("l", (long) spawnval);
Fred Drake699f3522000-06-29 21:12:41 +00003466#else
Victor Stinner97b89882010-05-06 00:25:39 +00003467 return Py_BuildValue("L", (PY_LONG_LONG) spawnval);
Fred Drake699f3522000-06-29 21:12:41 +00003468#endif
Guido van Rossuma1065681999-01-25 23:20:23 +00003469}
3470
3471
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003472PyDoc_STRVAR(posix_spawnve__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003473"spawnve(mode, path, args, env)\n\n\
Tim Peters25059d32001-12-07 20:35:43 +00003474Execute the program 'path' in a new process.\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00003475\n\
Victor Stinner97b89882010-05-06 00:25:39 +00003476 mode: mode of process creation\n\
3477 path: path of executable file\n\
3478 args: tuple or list of arguments\n\
3479 env: dictionary of strings mapping to strings");
Guido van Rossuma1065681999-01-25 23:20:23 +00003480
3481static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00003482posix_spawnve(PyObject *self, PyObject *args)
Guido van Rossuma1065681999-01-25 23:20:23 +00003483{
Victor Stinner97b89882010-05-06 00:25:39 +00003484 PyObject *opath;
3485 char *path;
3486 PyObject *argv, *env;
3487 char **argvlist;
3488 char **envlist;
3489 PyObject *res = NULL;
3490 int mode, envc;
3491 Py_ssize_t argc, i;
3492 Py_intptr_t spawnval;
3493 PyObject *(*getitem)(PyObject *, Py_ssize_t);
3494 Py_ssize_t lastarg = 0;
Guido van Rossuma1065681999-01-25 23:20:23 +00003495
Victor Stinner97b89882010-05-06 00:25:39 +00003496 /* spawnve has four arguments: (mode, path, argv, env), where
3497 argv is a list or tuple of strings and env is a dictionary
3498 like posix.environ. */
Guido van Rossuma1065681999-01-25 23:20:23 +00003499
Victor Stinner97b89882010-05-06 00:25:39 +00003500 if (!PyArg_ParseTuple(args, "iO&OO:spawnve", &mode,
3501 PyUnicode_FSConverter,
3502 &opath, &argv, &env))
3503 return NULL;
3504 path = bytes2str(opath, 1);
3505 if (PyList_Check(argv)) {
3506 argc = PyList_Size(argv);
3507 getitem = PyList_GetItem;
3508 }
3509 else if (PyTuple_Check(argv)) {
3510 argc = PyTuple_Size(argv);
3511 getitem = PyTuple_GetItem;
3512 }
3513 else {
3514 PyErr_SetString(PyExc_TypeError,
3515 "spawnve() arg 2 must be a tuple or list");
3516 goto fail_0;
3517 }
3518 if (!PyMapping_Check(env)) {
3519 PyErr_SetString(PyExc_TypeError,
3520 "spawnve() arg 3 must be a mapping object");
3521 goto fail_0;
3522 }
Guido van Rossuma1065681999-01-25 23:20:23 +00003523
Victor Stinner97b89882010-05-06 00:25:39 +00003524 argvlist = PyMem_NEW(char *, argc+1);
3525 if (argvlist == NULL) {
3526 PyErr_NoMemory();
3527 goto fail_0;
3528 }
3529 for (i = 0; i < argc; i++) {
3530 if (!fsconvert_strdup((*getitem)(argv, i),
3531 &argvlist[i]))
3532 {
3533 lastarg = i;
3534 goto fail_1;
3535 }
3536 }
3537 lastarg = argc;
3538 argvlist[argc] = NULL;
Guido van Rossuma1065681999-01-25 23:20:23 +00003539
Victor Stinner97b89882010-05-06 00:25:39 +00003540 envlist = parse_envlist(env, &envc);
3541 if (envlist == NULL)
3542 goto fail_1;
Guido van Rossuma1065681999-01-25 23:20:23 +00003543
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00003544#if defined(PYOS_OS2) && defined(PYCC_GCC)
Victor Stinner97b89882010-05-06 00:25:39 +00003545 Py_BEGIN_ALLOW_THREADS
3546 spawnval = spawnve(mode, path, argvlist, envlist);
3547 Py_END_ALLOW_THREADS
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00003548#else
Victor Stinner97b89882010-05-06 00:25:39 +00003549 if (mode == _OLD_P_OVERLAY)
3550 mode = _P_OVERLAY;
Tim Peters25059d32001-12-07 20:35:43 +00003551
Victor Stinner97b89882010-05-06 00:25:39 +00003552 Py_BEGIN_ALLOW_THREADS
3553 spawnval = _spawnve(mode, path, argvlist, envlist);
3554 Py_END_ALLOW_THREADS
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00003555#endif
Tim Peters25059d32001-12-07 20:35:43 +00003556
Victor Stinner97b89882010-05-06 00:25:39 +00003557 if (spawnval == -1)
3558 (void) posix_error();
3559 else
Fredrik Lundhe25cfd82000-07-09 13:10:40 +00003560#if SIZEOF_LONG == SIZEOF_VOID_P
Victor Stinner97b89882010-05-06 00:25:39 +00003561 res = Py_BuildValue("l", (long) spawnval);
Fred Drake699f3522000-06-29 21:12:41 +00003562#else
Victor Stinner97b89882010-05-06 00:25:39 +00003563 res = Py_BuildValue("L", (PY_LONG_LONG) spawnval);
Fred Drake699f3522000-06-29 21:12:41 +00003564#endif
Guido van Rossuma1065681999-01-25 23:20:23 +00003565
Victor Stinner97b89882010-05-06 00:25:39 +00003566 while (--envc >= 0)
3567 PyMem_DEL(envlist[envc]);
3568 PyMem_DEL(envlist);
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003569 fail_1:
Victor Stinner97b89882010-05-06 00:25:39 +00003570 free_string_array(argvlist, lastarg);
Martin v. Löwis114619e2002-10-07 06:44:21 +00003571 fail_0:
Victor Stinner97b89882010-05-06 00:25:39 +00003572 release_bytes(opath);
3573 return res;
Guido van Rossuma1065681999-01-25 23:20:23 +00003574}
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003575
3576/* OS/2 supports spawnvp & spawnvpe natively */
3577#if defined(PYOS_OS2)
3578PyDoc_STRVAR(posix_spawnvp__doc__,
3579"spawnvp(mode, file, args)\n\n\
3580Execute the program 'file' in a new process, using the environment\n\
3581search path to find the file.\n\
3582\n\
Victor Stinner97b89882010-05-06 00:25:39 +00003583 mode: mode of process creation\n\
3584 file: executable file name\n\
3585 args: tuple or list of strings");
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003586
3587static PyObject *
3588posix_spawnvp(PyObject *self, PyObject *args)
3589{
Victor Stinner97b89882010-05-06 00:25:39 +00003590 PyObject *opath;
3591 char *path;
3592 PyObject *argv;
3593 char **argvlist;
3594 int mode, i, argc;
3595 Py_intptr_t spawnval;
3596 PyObject *(*getitem)(PyObject *, Py_ssize_t);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003597
Victor Stinner97b89882010-05-06 00:25:39 +00003598 /* spawnvp has three arguments: (mode, path, argv), where
3599 argv is a list or tuple of strings. */
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003600
Victor Stinner97b89882010-05-06 00:25:39 +00003601 if (!PyArg_ParseTuple(args, "iO&O:spawnvp", &mode,
3602 PyUnicode_FSConverter,
3603 &opath, &argv))
3604 return NULL;
3605 path = bytes2str(opath);
3606 if (PyList_Check(argv)) {
3607 argc = PyList_Size(argv);
3608 getitem = PyList_GetItem;
3609 }
3610 else if (PyTuple_Check(argv)) {
3611 argc = PyTuple_Size(argv);
3612 getitem = PyTuple_GetItem;
3613 }
3614 else {
3615 PyErr_SetString(PyExc_TypeError,
3616 "spawnvp() arg 2 must be a tuple or list");
3617 release_bytes(opath);
3618 return NULL;
3619 }
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003620
Victor Stinner97b89882010-05-06 00:25:39 +00003621 argvlist = PyMem_NEW(char *, argc+1);
3622 if (argvlist == NULL) {
3623 release_bytes(opath);
3624 return PyErr_NoMemory();
3625 }
3626 for (i = 0; i < argc; i++) {
3627 if (!fsconvert_strdup((*getitem)(argv, i),
3628 &argvlist[i])) {
3629 free_string_array(argvlist, i);
3630 PyErr_SetString(
3631 PyExc_TypeError,
3632 "spawnvp() arg 2 must contain only strings");
3633 release_bytes(opath);
3634 return NULL;
3635 }
3636 }
3637 argvlist[argc] = NULL;
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003638
Victor Stinner97b89882010-05-06 00:25:39 +00003639 Py_BEGIN_ALLOW_THREADS
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003640#if defined(PYCC_GCC)
Victor Stinner97b89882010-05-06 00:25:39 +00003641 spawnval = spawnvp(mode, path, argvlist);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003642#else
Victor Stinner97b89882010-05-06 00:25:39 +00003643 spawnval = _spawnvp(mode, path, argvlist);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003644#endif
Victor Stinner97b89882010-05-06 00:25:39 +00003645 Py_END_ALLOW_THREADS
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003646
Victor Stinner97b89882010-05-06 00:25:39 +00003647 free_string_array(argvlist, argc);
3648 release_bytes(opath);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003649
Victor Stinner97b89882010-05-06 00:25:39 +00003650 if (spawnval == -1)
3651 return posix_error();
3652 else
3653 return Py_BuildValue("l", (long) spawnval);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003654}
3655
3656
3657PyDoc_STRVAR(posix_spawnvpe__doc__,
3658"spawnvpe(mode, file, args, env)\n\n\
3659Execute the program 'file' in a new process, using the environment\n\
3660search path to find the file.\n\
3661\n\
Victor Stinner97b89882010-05-06 00:25:39 +00003662 mode: mode of process creation\n\
3663 file: executable file name\n\
3664 args: tuple or list of arguments\n\
3665 env: dictionary of strings mapping to strings");
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003666
3667static PyObject *
3668posix_spawnvpe(PyObject *self, PyObject *args)
3669{
Victor Stinner97b89882010-05-06 00:25:39 +00003670 PyObject *opath
3671 char *path;
3672 PyObject *argv, *env;
3673 char **argvlist;
3674 char **envlist;
3675 PyObject *res=NULL;
3676 int mode, i, argc, envc;
3677 Py_intptr_t spawnval;
3678 PyObject *(*getitem)(PyObject *, Py_ssize_t);
3679 int lastarg = 0;
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003680
Victor Stinner97b89882010-05-06 00:25:39 +00003681 /* spawnvpe has four arguments: (mode, path, argv, env), where
3682 argv is a list or tuple of strings and env is a dictionary
3683 like posix.environ. */
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003684
Victor Stinner97b89882010-05-06 00:25:39 +00003685 if (!PyArg_ParseTuple(args, "ietOO:spawnvpe", &mode,
3686 PyUnicode_FSConverter,
3687 &opath, &argv, &env))
3688 return NULL;
3689 path = bytes2str(opath);
3690 if (PyList_Check(argv)) {
3691 argc = PyList_Size(argv);
3692 getitem = PyList_GetItem;
3693 }
3694 else if (PyTuple_Check(argv)) {
3695 argc = PyTuple_Size(argv);
3696 getitem = PyTuple_GetItem;
3697 }
3698 else {
3699 PyErr_SetString(PyExc_TypeError,
3700 "spawnvpe() arg 2 must be a tuple or list");
3701 goto fail_0;
3702 }
3703 if (!PyMapping_Check(env)) {
3704 PyErr_SetString(PyExc_TypeError,
3705 "spawnvpe() arg 3 must be a mapping object");
3706 goto fail_0;
3707 }
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003708
Victor Stinner97b89882010-05-06 00:25:39 +00003709 argvlist = PyMem_NEW(char *, argc+1);
3710 if (argvlist == NULL) {
3711 PyErr_NoMemory();
3712 goto fail_0;
3713 }
3714 for (i = 0; i < argc; i++) {
3715 if (!fsconvert_strdup((*getitem)(argv, i),
3716 &argvlist[i]))
3717 {
3718 lastarg = i;
3719 goto fail_1;
3720 }
3721 }
3722 lastarg = argc;
3723 argvlist[argc] = NULL;
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003724
Victor Stinner97b89882010-05-06 00:25:39 +00003725 envlist = parse_envlist(env, &envc);
3726 if (envlist == NULL)
3727 goto fail_1;
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003728
Victor Stinner97b89882010-05-06 00:25:39 +00003729 Py_BEGIN_ALLOW_THREADS
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003730#if defined(PYCC_GCC)
Victor Stinner97b89882010-05-06 00:25:39 +00003731 spawnval = spawnvpe(mode, path, argvlist, envlist);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003732#else
Victor Stinner97b89882010-05-06 00:25:39 +00003733 spawnval = _spawnvpe(mode, path, argvlist, envlist);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003734#endif
Victor Stinner97b89882010-05-06 00:25:39 +00003735 Py_END_ALLOW_THREADS
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003736
Victor Stinner97b89882010-05-06 00:25:39 +00003737 if (spawnval == -1)
3738 (void) posix_error();
3739 else
3740 res = Py_BuildValue("l", (long) spawnval);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003741
Victor Stinner97b89882010-05-06 00:25:39 +00003742 while (--envc >= 0)
3743 PyMem_DEL(envlist[envc]);
3744 PyMem_DEL(envlist);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003745 fail_1:
Victor Stinner97b89882010-05-06 00:25:39 +00003746 free_string_array(argvlist, lastarg);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003747 fail_0:
Victor Stinner97b89882010-05-06 00:25:39 +00003748 release_bytes(opath);
3749 return res;
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003750}
3751#endif /* PYOS_OS2 */
Guido van Rossuma1065681999-01-25 23:20:23 +00003752#endif /* HAVE_SPAWNV */
3753
3754
Guido van Rossum2242f2f2001-04-11 20:58:20 +00003755#ifdef HAVE_FORK1
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003756PyDoc_STRVAR(posix_fork1__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003757"fork1() -> pid\n\n\
Guido van Rossum2242f2f2001-04-11 20:58:20 +00003758Fork a child process with a single multiplexed (i.e., not bound) thread.\n\
3759\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003760Return 0 to child process and PID of child to parent process.");
Guido van Rossum2242f2f2001-04-11 20:58:20 +00003761
3762static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003763posix_fork1(PyObject *self, PyObject *noargs)
Guido van Rossum2242f2f2001-04-11 20:58:20 +00003764{
Victor Stinner97b89882010-05-06 00:25:39 +00003765 pid_t pid;
3766 int result;
3767 _PyImport_AcquireLock();
3768 pid = fork1();
3769 result = _PyImport_ReleaseLock();
3770 if (pid == -1)
3771 return posix_error();
3772 if (pid == 0)
3773 PyOS_AfterFork();
3774 if (result < 0) {
3775 /* Don't clobber the OSError if the fork failed. */
3776 PyErr_SetString(PyExc_RuntimeError,
3777 "not holding the import lock");
3778 return NULL;
3779 }
3780 return PyLong_FromPid(pid);
Guido van Rossum2242f2f2001-04-11 20:58:20 +00003781}
3782#endif
3783
3784
Guido van Rossumad0ee831995-03-01 10:34:45 +00003785#ifdef HAVE_FORK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003786PyDoc_STRVAR(posix_fork__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003787"fork() -> pid\n\n\
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003788Fork a child process.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003789Return 0 to child process and PID of child to parent process.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003790
Barry Warsaw53699e91996-12-10 23:23:01 +00003791static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003792posix_fork(PyObject *self, PyObject *noargs)
Guido van Rossum85e3b011991-06-03 12:42:10 +00003793{
Victor Stinner97b89882010-05-06 00:25:39 +00003794 pid_t pid;
3795 int result;
3796 _PyImport_AcquireLock();
3797 pid = fork();
3798 result = _PyImport_ReleaseLock();
3799 if (pid == -1)
3800 return posix_error();
3801 if (pid == 0)
3802 PyOS_AfterFork();
3803 if (result < 0) {
3804 /* Don't clobber the OSError if the fork failed. */
3805 PyErr_SetString(PyExc_RuntimeError,
3806 "not holding the import lock");
3807 return NULL;
3808 }
3809 return PyLong_FromPid(pid);
Guido van Rossum85e3b011991-06-03 12:42:10 +00003810}
Guido van Rossumad0ee831995-03-01 10:34:45 +00003811#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00003812
Neal Norwitzb59798b2003-03-21 01:43:31 +00003813/* AIX uses /dev/ptc but is otherwise the same as /dev/ptmx */
Neal Norwitz2deaddb2003-03-21 03:08:31 +00003814/* IRIX has both /dev/ptc and /dev/ptmx, use ptmx */
3815#if defined(HAVE_DEV_PTC) && !defined(HAVE_DEV_PTMX)
Neal Norwitzb59798b2003-03-21 01:43:31 +00003816#define DEV_PTY_FILE "/dev/ptc"
3817#define HAVE_DEV_PTMX
3818#else
3819#define DEV_PTY_FILE "/dev/ptmx"
3820#endif
3821
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003822#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX)
Fred Drake8cef4cf2000-06-28 16:40:38 +00003823#ifdef HAVE_PTY_H
3824#include <pty.h>
3825#else
3826#ifdef HAVE_LIBUTIL_H
3827#include <libutil.h>
Fred Drake8cef4cf2000-06-28 16:40:38 +00003828#endif /* HAVE_LIBUTIL_H */
3829#endif /* HAVE_PTY_H */
Martin v. Löwis14e73b12003-01-01 09:51:12 +00003830#ifdef HAVE_STROPTS_H
3831#include <stropts.h>
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003832#endif
3833#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX */
Fred Drake8cef4cf2000-06-28 16:40:38 +00003834
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003835#if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX)
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003836PyDoc_STRVAR(posix_openpty__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003837"openpty() -> (master_fd, slave_fd)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003838Open a pseudo-terminal, returning open fd's for both master and slave end.\n");
Fred Drake8cef4cf2000-06-28 16:40:38 +00003839
3840static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003841posix_openpty(PyObject *self, PyObject *noargs)
Fred Drake8cef4cf2000-06-28 16:40:38 +00003842{
Victor Stinner97b89882010-05-06 00:25:39 +00003843 int master_fd, slave_fd;
Thomas Wouters70c21a12000-07-14 14:28:33 +00003844#ifndef HAVE_OPENPTY
Victor Stinner97b89882010-05-06 00:25:39 +00003845 char * slave_name;
Thomas Wouters70c21a12000-07-14 14:28:33 +00003846#endif
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003847#if defined(HAVE_DEV_PTMX) && !defined(HAVE_OPENPTY) && !defined(HAVE__GETPTY)
Victor Stinner97b89882010-05-06 00:25:39 +00003848 PyOS_sighandler_t sig_saved;
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003849#ifdef sun
Victor Stinner97b89882010-05-06 00:25:39 +00003850 extern char *ptsname(int fildes);
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003851#endif
3852#endif
Thomas Wouters70c21a12000-07-14 14:28:33 +00003853
Thomas Wouters70c21a12000-07-14 14:28:33 +00003854#ifdef HAVE_OPENPTY
Victor Stinner97b89882010-05-06 00:25:39 +00003855 if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) != 0)
3856 return posix_error();
Neal Norwitzb59798b2003-03-21 01:43:31 +00003857#elif defined(HAVE__GETPTY)
Victor Stinner97b89882010-05-06 00:25:39 +00003858 slave_name = _getpty(&master_fd, O_RDWR, 0666, 0);
3859 if (slave_name == NULL)
3860 return posix_error();
Thomas Wouters70c21a12000-07-14 14:28:33 +00003861
Victor Stinner97b89882010-05-06 00:25:39 +00003862 slave_fd = open(slave_name, O_RDWR);
3863 if (slave_fd < 0)
3864 return posix_error();
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003865#else
Victor Stinner97b89882010-05-06 00:25:39 +00003866 master_fd = open(DEV_PTY_FILE, O_RDWR | O_NOCTTY); /* open master */
3867 if (master_fd < 0)
3868 return posix_error();
3869 sig_saved = PyOS_setsig(SIGCHLD, SIG_DFL);
3870 /* change permission of slave */
3871 if (grantpt(master_fd) < 0) {
3872 PyOS_setsig(SIGCHLD, sig_saved);
3873 return posix_error();
3874 }
3875 /* unlock slave */
3876 if (unlockpt(master_fd) < 0) {
3877 PyOS_setsig(SIGCHLD, sig_saved);
3878 return posix_error();
3879 }
3880 PyOS_setsig(SIGCHLD, sig_saved);
3881 slave_name = ptsname(master_fd); /* get name of slave */
3882 if (slave_name == NULL)
3883 return posix_error();
3884 slave_fd = open(slave_name, O_RDWR | O_NOCTTY); /* open slave */
3885 if (slave_fd < 0)
3886 return posix_error();
Neal Norwitzb59798b2003-03-21 01:43:31 +00003887#if !defined(__CYGWIN__) && !defined(HAVE_DEV_PTC)
Victor Stinner97b89882010-05-06 00:25:39 +00003888 ioctl(slave_fd, I_PUSH, "ptem"); /* push ptem */
3889 ioctl(slave_fd, I_PUSH, "ldterm"); /* push ldterm */
Neal Norwitz6700e472002-12-31 16:16:07 +00003890#ifndef __hpux
Victor Stinner97b89882010-05-06 00:25:39 +00003891 ioctl(slave_fd, I_PUSH, "ttcompat"); /* push ttcompat */
Neal Norwitz6700e472002-12-31 16:16:07 +00003892#endif /* __hpux */
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003893#endif /* HAVE_CYGWIN */
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003894#endif /* HAVE_OPENPTY */
Thomas Wouters70c21a12000-07-14 14:28:33 +00003895
Victor Stinner97b89882010-05-06 00:25:39 +00003896 return Py_BuildValue("(ii)", master_fd, slave_fd);
Thomas Wouters70c21a12000-07-14 14:28:33 +00003897
Fred Drake8cef4cf2000-06-28 16:40:38 +00003898}
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003899#endif /* defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) */
Fred Drake8cef4cf2000-06-28 16:40:38 +00003900
3901#ifdef HAVE_FORKPTY
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003902PyDoc_STRVAR(posix_forkpty__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003903"forkpty() -> (pid, master_fd)\n\n\
Fred Drake8cef4cf2000-06-28 16:40:38 +00003904Fork a new process with a new pseudo-terminal as controlling tty.\n\n\
3905Like fork(), return 0 as pid to child process, and PID of child to parent.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003906To both, return fd of newly opened pseudo-terminal.\n");
Fred Drake8cef4cf2000-06-28 16:40:38 +00003907
3908static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003909posix_forkpty(PyObject *self, PyObject *noargs)
Fred Drake8cef4cf2000-06-28 16:40:38 +00003910{
Victor Stinner97b89882010-05-06 00:25:39 +00003911 int master_fd = -1, result;
3912 pid_t pid;
Tim Peters5aa91602002-01-30 05:46:57 +00003913
Victor Stinner97b89882010-05-06 00:25:39 +00003914 _PyImport_AcquireLock();
3915 pid = forkpty(&master_fd, NULL, NULL, NULL);
3916 result = _PyImport_ReleaseLock();
3917 if (pid == -1)
3918 return posix_error();
3919 if (pid == 0)
3920 PyOS_AfterFork();
3921 if (result < 0) {
3922 /* Don't clobber the OSError if the fork failed. */
3923 PyErr_SetString(PyExc_RuntimeError,
3924 "not holding the import lock");
3925 return NULL;
3926 }
3927 return Py_BuildValue("(Ni)", PyLong_FromPid(pid), master_fd);
Fred Drake8cef4cf2000-06-28 16:40:38 +00003928}
3929#endif
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003930
Guido van Rossumad0ee831995-03-01 10:34:45 +00003931#ifdef HAVE_GETEGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003932PyDoc_STRVAR(posix_getegid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003933"getegid() -> egid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003934Return the current process's effective group id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003935
Barry Warsaw53699e91996-12-10 23:23:01 +00003936static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003937posix_getegid(PyObject *self, PyObject *noargs)
Guido van Rossum46003ff1992-05-15 11:05:24 +00003938{
Victor Stinner97b89882010-05-06 00:25:39 +00003939 return PyLong_FromLong((long)getegid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00003940}
Guido van Rossumad0ee831995-03-01 10:34:45 +00003941#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00003942
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003943
Guido van Rossumad0ee831995-03-01 10:34:45 +00003944#ifdef HAVE_GETEUID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003945PyDoc_STRVAR(posix_geteuid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003946"geteuid() -> euid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003947Return the current process's effective user id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003948
Barry Warsaw53699e91996-12-10 23:23:01 +00003949static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003950posix_geteuid(PyObject *self, PyObject *noargs)
Guido van Rossum46003ff1992-05-15 11:05:24 +00003951{
Victor Stinner97b89882010-05-06 00:25:39 +00003952 return PyLong_FromLong((long)geteuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00003953}
Guido van Rossumad0ee831995-03-01 10:34:45 +00003954#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00003955
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003956
Guido van Rossumad0ee831995-03-01 10:34:45 +00003957#ifdef HAVE_GETGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003958PyDoc_STRVAR(posix_getgid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003959"getgid() -> gid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003960Return the current process's group id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003961
Barry Warsaw53699e91996-12-10 23:23:01 +00003962static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003963posix_getgid(PyObject *self, PyObject *noargs)
Guido van Rossum46003ff1992-05-15 11:05:24 +00003964{
Victor Stinner97b89882010-05-06 00:25:39 +00003965 return PyLong_FromLong((long)getgid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00003966}
Guido van Rossumad0ee831995-03-01 10:34:45 +00003967#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00003968
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003969
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003970PyDoc_STRVAR(posix_getpid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003971"getpid() -> pid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003972Return the current process id");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003973
Barry Warsaw53699e91996-12-10 23:23:01 +00003974static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003975posix_getpid(PyObject *self, PyObject *noargs)
Guido van Rossum85e3b011991-06-03 12:42:10 +00003976{
Victor Stinner97b89882010-05-06 00:25:39 +00003977 return PyLong_FromPid(getpid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00003978}
3979
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003980
Fred Drakec9680921999-12-13 16:37:25 +00003981#ifdef HAVE_GETGROUPS
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003982PyDoc_STRVAR(posix_getgroups__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003983"getgroups() -> list of group IDs\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003984Return list of supplemental group IDs for the process.");
Fred Drakec9680921999-12-13 16:37:25 +00003985
3986static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003987posix_getgroups(PyObject *self, PyObject *noargs)
Fred Drakec9680921999-12-13 16:37:25 +00003988{
3989 PyObject *result = NULL;
3990
Fred Drakec9680921999-12-13 16:37:25 +00003991#ifdef NGROUPS_MAX
3992#define MAX_GROUPS NGROUPS_MAX
3993#else
Victor Stinner97b89882010-05-06 00:25:39 +00003994 /* defined to be 16 on Solaris7, so this should be a small number */
Fred Drakec9680921999-12-13 16:37:25 +00003995#define MAX_GROUPS 64
3996#endif
Victor Stinner97b89882010-05-06 00:25:39 +00003997 gid_t grouplist[MAX_GROUPS];
3998 int n;
Fred Drakec9680921999-12-13 16:37:25 +00003999
Victor Stinner97b89882010-05-06 00:25:39 +00004000 n = getgroups(MAX_GROUPS, grouplist);
4001 if (n < 0)
4002 posix_error();
4003 else {
4004 result = PyList_New(n);
4005 if (result != NULL) {
4006 int i;
4007 for (i = 0; i < n; ++i) {
4008 PyObject *o = PyLong_FromLong((long)grouplist[i]);
4009 if (o == NULL) {
4010 Py_DECREF(result);
4011 result = NULL;
4012 break;
Fred Drakec9680921999-12-13 16:37:25 +00004013 }
Victor Stinner97b89882010-05-06 00:25:39 +00004014 PyList_SET_ITEM(result, i, o);
Fred Drakec9680921999-12-13 16:37:25 +00004015 }
Victor Stinner97b89882010-05-06 00:25:39 +00004016 }
4017 }
Neal Norwitze241ce82003-02-17 18:17:05 +00004018
Fred Drakec9680921999-12-13 16:37:25 +00004019 return result;
4020}
4021#endif
4022
Martin v. Löwis606edc12002-06-13 21:09:11 +00004023#ifdef HAVE_GETPGID
Neal Norwitz0c2c17c2002-06-13 21:22:11 +00004024PyDoc_STRVAR(posix_getpgid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004025"getpgid(pid) -> pgid\n\n\
Neal Norwitz0c2c17c2002-06-13 21:22:11 +00004026Call the system call getpgid().");
Martin v. Löwis606edc12002-06-13 21:09:11 +00004027
4028static PyObject *
4029posix_getpgid(PyObject *self, PyObject *args)
4030{
Victor Stinner97b89882010-05-06 00:25:39 +00004031 pid_t pid, pgid;
4032 if (!PyArg_ParseTuple(args, PARSE_PID ":getpgid", &pid))
4033 return NULL;
4034 pgid = getpgid(pid);
4035 if (pgid < 0)
4036 return posix_error();
4037 return PyLong_FromPid(pgid);
Martin v. Löwis606edc12002-06-13 21:09:11 +00004038}
4039#endif /* HAVE_GETPGID */
4040
4041
Guido van Rossumb6775db1994-08-01 11:34:53 +00004042#ifdef HAVE_GETPGRP
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004043PyDoc_STRVAR(posix_getpgrp__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004044"getpgrp() -> pgrp\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004045Return the current process group id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004046
Barry Warsaw53699e91996-12-10 23:23:01 +00004047static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004048posix_getpgrp(PyObject *self, PyObject *noargs)
Guido van Rossum04814471991-06-04 20:23:49 +00004049{
Guido van Rossumb6775db1994-08-01 11:34:53 +00004050#ifdef GETPGRP_HAVE_ARG
Victor Stinner97b89882010-05-06 00:25:39 +00004051 return PyLong_FromPid(getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004052#else /* GETPGRP_HAVE_ARG */
Victor Stinner97b89882010-05-06 00:25:39 +00004053 return PyLong_FromPid(getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004054#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00004055}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004056#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00004057
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004058
Guido van Rossumb6775db1994-08-01 11:34:53 +00004059#ifdef HAVE_SETPGRP
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004060PyDoc_STRVAR(posix_setpgrp__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004061"setpgrp()\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004062Make this process a session leader.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004063
Barry Warsaw53699e91996-12-10 23:23:01 +00004064static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004065posix_setpgrp(PyObject *self, PyObject *noargs)
Guido van Rossumc2670a01992-09-13 20:07:29 +00004066{
Guido van Rossum64933891994-10-20 21:56:42 +00004067#ifdef SETPGRP_HAVE_ARG
Victor Stinner97b89882010-05-06 00:25:39 +00004068 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00004069#else /* SETPGRP_HAVE_ARG */
Victor Stinner97b89882010-05-06 00:25:39 +00004070 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00004071#endif /* SETPGRP_HAVE_ARG */
Victor Stinner97b89882010-05-06 00:25:39 +00004072 return posix_error();
4073 Py_INCREF(Py_None);
4074 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00004075}
4076
Guido van Rossumb6775db1994-08-01 11:34:53 +00004077#endif /* HAVE_SETPGRP */
4078
Guido van Rossumad0ee831995-03-01 10:34:45 +00004079#ifdef HAVE_GETPPID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004080PyDoc_STRVAR(posix_getppid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004081"getppid() -> ppid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004082Return the parent's process id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004083
Barry Warsaw53699e91996-12-10 23:23:01 +00004084static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004085posix_getppid(PyObject *self, PyObject *noargs)
Guido van Rossum85e3b011991-06-03 12:42:10 +00004086{
Victor Stinner97b89882010-05-06 00:25:39 +00004087 return PyLong_FromPid(getppid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00004088}
Guido van Rossumad0ee831995-03-01 10:34:45 +00004089#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00004090
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004091
Fred Drake12c6e2d1999-12-14 21:25:03 +00004092#ifdef HAVE_GETLOGIN
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004093PyDoc_STRVAR(posix_getlogin__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004094"getlogin() -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004095Return the actual login name.");
Fred Drake12c6e2d1999-12-14 21:25:03 +00004096
4097static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004098posix_getlogin(PyObject *self, PyObject *noargs)
Fred Drake12c6e2d1999-12-14 21:25:03 +00004099{
Victor Stinner97b89882010-05-06 00:25:39 +00004100 PyObject *result = NULL;
4101 char *name;
4102 int old_errno = errno;
Fred Drake12c6e2d1999-12-14 21:25:03 +00004103
Victor Stinner97b89882010-05-06 00:25:39 +00004104 errno = 0;
4105 name = getlogin();
4106 if (name == NULL) {
4107 if (errno)
4108 posix_error();
Fred Drake12c6e2d1999-12-14 21:25:03 +00004109 else
Victor Stinner97b89882010-05-06 00:25:39 +00004110 PyErr_SetString(PyExc_OSError,
4111 "unable to determine login name");
4112 }
4113 else
4114 result = PyUnicode_FromString(name);
4115 errno = old_errno;
Neal Norwitze241ce82003-02-17 18:17:05 +00004116
Fred Drake12c6e2d1999-12-14 21:25:03 +00004117 return result;
4118}
4119#endif
4120
Guido van Rossumad0ee831995-03-01 10:34:45 +00004121#ifdef HAVE_GETUID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004122PyDoc_STRVAR(posix_getuid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004123"getuid() -> uid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004124Return the current process's user id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004125
Barry Warsaw53699e91996-12-10 23:23:01 +00004126static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004127posix_getuid(PyObject *self, PyObject *noargs)
Guido van Rossum46003ff1992-05-15 11:05:24 +00004128{
Victor Stinner97b89882010-05-06 00:25:39 +00004129 return PyLong_FromLong((long)getuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00004130}
Guido van Rossumad0ee831995-03-01 10:34:45 +00004131#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00004132
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004133
Guido van Rossumad0ee831995-03-01 10:34:45 +00004134#ifdef HAVE_KILL
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004135PyDoc_STRVAR(posix_kill__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004136"kill(pid, sig)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004137Kill a process with a signal.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004138
Barry Warsaw53699e91996-12-10 23:23:01 +00004139static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004140posix_kill(PyObject *self, PyObject *args)
Guido van Rossum85e3b011991-06-03 12:42:10 +00004141{
Victor Stinner97b89882010-05-06 00:25:39 +00004142 pid_t pid;
4143 int sig;
4144 if (!PyArg_ParseTuple(args, PARSE_PID "i:kill", &pid, &sig))
4145 return NULL;
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00004146#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004147 if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
4148 APIRET rc;
4149 if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00004150 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004151
4152 } else if (sig == XCPT_SIGNAL_KILLPROC) {
4153 APIRET rc;
4154 if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00004155 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004156
4157 } else
Guido van Rossumc5a0f531997-12-02 20:36:02 +00004158 return NULL; /* Unrecognized Signal Requested */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004159#else
Victor Stinner97b89882010-05-06 00:25:39 +00004160 if (kill(pid, sig) == -1)
4161 return posix_error();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004162#endif
Victor Stinner97b89882010-05-06 00:25:39 +00004163 Py_INCREF(Py_None);
4164 return Py_None;
Guido van Rossum85e3b011991-06-03 12:42:10 +00004165}
Guido van Rossumad0ee831995-03-01 10:34:45 +00004166#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00004167
Martin v. Löwisb2c92f42002-02-16 23:35:41 +00004168#ifdef HAVE_KILLPG
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004169PyDoc_STRVAR(posix_killpg__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004170"killpg(pgid, sig)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004171Kill a process group with a signal.");
Martin v. Löwisb2c92f42002-02-16 23:35:41 +00004172
4173static PyObject *
4174posix_killpg(PyObject *self, PyObject *args)
4175{
Victor Stinner97b89882010-05-06 00:25:39 +00004176 int sig;
4177 pid_t pgid;
4178 /* XXX some man pages make the `pgid` parameter an int, others
4179 a pid_t. Since getpgrp() returns a pid_t, we assume killpg should
4180 take the same type. Moreover, pid_t is always at least as wide as
4181 int (else compilation of this module fails), which is safe. */
4182 if (!PyArg_ParseTuple(args, PARSE_PID "i:killpg", &pgid, &sig))
4183 return NULL;
4184 if (killpg(pgid, sig) == -1)
4185 return posix_error();
4186 Py_INCREF(Py_None);
4187 return Py_None;
Martin v. Löwisb2c92f42002-02-16 23:35:41 +00004188}
4189#endif
4190
Guido van Rossumc0125471996-06-28 18:55:32 +00004191#ifdef HAVE_PLOCK
4192
4193#ifdef HAVE_SYS_LOCK_H
4194#include <sys/lock.h>
4195#endif
4196
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004197PyDoc_STRVAR(posix_plock__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004198"plock(op)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004199Lock program segments into memory.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004200
Barry Warsaw53699e91996-12-10 23:23:01 +00004201static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004202posix_plock(PyObject *self, PyObject *args)
Guido van Rossumc0125471996-06-28 18:55:32 +00004203{
Victor Stinner97b89882010-05-06 00:25:39 +00004204 int op;
4205 if (!PyArg_ParseTuple(args, "i:plock", &op))
4206 return NULL;
4207 if (plock(op) == -1)
4208 return posix_error();
4209 Py_INCREF(Py_None);
4210 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00004211}
4212#endif
4213
Guido van Rossumb6775db1994-08-01 11:34:53 +00004214#ifdef HAVE_SETUID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004215PyDoc_STRVAR(posix_setuid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004216"setuid(uid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004217Set the current process's user id.");
4218
Barry Warsaw53699e91996-12-10 23:23:01 +00004219static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004220posix_setuid(PyObject *self, PyObject *args)
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004221{
Victor Stinner97b89882010-05-06 00:25:39 +00004222 long uid_arg;
4223 uid_t uid;
4224 if (!PyArg_ParseTuple(args, "l:setuid", &uid_arg))
4225 return NULL;
4226 uid = uid_arg;
4227 if (uid != uid_arg) {
4228 PyErr_SetString(PyExc_OverflowError, "user id too big");
4229 return NULL;
4230 }
4231 if (setuid(uid) < 0)
4232 return posix_error();
4233 Py_INCREF(Py_None);
4234 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004235}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004236#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004237
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004238
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004239#ifdef HAVE_SETEUID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004240PyDoc_STRVAR(posix_seteuid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004241"seteuid(uid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004242Set the current process's effective user id.");
4243
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004244static PyObject *
4245posix_seteuid (PyObject *self, PyObject *args)
4246{
Victor Stinner97b89882010-05-06 00:25:39 +00004247 long euid_arg;
4248 uid_t euid;
4249 if (!PyArg_ParseTuple(args, "l", &euid_arg))
4250 return NULL;
4251 euid = euid_arg;
4252 if (euid != euid_arg) {
4253 PyErr_SetString(PyExc_OverflowError, "user id too big");
4254 return NULL;
4255 }
4256 if (seteuid(euid) < 0) {
4257 return posix_error();
4258 } else {
4259 Py_INCREF(Py_None);
4260 return Py_None;
4261 }
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004262}
4263#endif /* HAVE_SETEUID */
4264
4265#ifdef HAVE_SETEGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004266PyDoc_STRVAR(posix_setegid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004267"setegid(gid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004268Set the current process's effective group id.");
4269
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004270static PyObject *
4271posix_setegid (PyObject *self, PyObject *args)
4272{
Victor Stinner97b89882010-05-06 00:25:39 +00004273 long egid_arg;
4274 gid_t egid;
4275 if (!PyArg_ParseTuple(args, "l", &egid_arg))
4276 return NULL;
4277 egid = egid_arg;
4278 if (egid != egid_arg) {
4279 PyErr_SetString(PyExc_OverflowError, "group id too big");
4280 return NULL;
4281 }
4282 if (setegid(egid) < 0) {
4283 return posix_error();
4284 } else {
4285 Py_INCREF(Py_None);
4286 return Py_None;
4287 }
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004288}
4289#endif /* HAVE_SETEGID */
4290
4291#ifdef HAVE_SETREUID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004292PyDoc_STRVAR(posix_setreuid__doc__,
Neal Norwitz94f1d712004-02-16 01:26:34 +00004293"setreuid(ruid, euid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004294Set the current process's real and effective user ids.");
4295
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004296static PyObject *
4297posix_setreuid (PyObject *self, PyObject *args)
4298{
Victor Stinner97b89882010-05-06 00:25:39 +00004299 long ruid_arg, euid_arg;
4300 uid_t ruid, euid;
4301 if (!PyArg_ParseTuple(args, "ll", &ruid_arg, &euid_arg))
4302 return NULL;
4303 if (ruid_arg == -1)
4304 ruid = (uid_t)-1; /* let the compiler choose how -1 fits */
4305 else
4306 ruid = ruid_arg; /* otherwise, assign from our long */
4307 if (euid_arg == -1)
4308 euid = (uid_t)-1;
4309 else
4310 euid = euid_arg;
4311 if ((euid_arg != -1 && euid != euid_arg) ||
4312 (ruid_arg != -1 && ruid != ruid_arg)) {
4313 PyErr_SetString(PyExc_OverflowError, "user id too big");
4314 return NULL;
4315 }
4316 if (setreuid(ruid, euid) < 0) {
4317 return posix_error();
4318 } else {
4319 Py_INCREF(Py_None);
4320 return Py_None;
4321 }
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004322}
4323#endif /* HAVE_SETREUID */
4324
4325#ifdef HAVE_SETREGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004326PyDoc_STRVAR(posix_setregid__doc__,
Neal Norwitz94f1d712004-02-16 01:26:34 +00004327"setregid(rgid, egid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004328Set the current process's real and effective group ids.");
4329
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004330static PyObject *
4331posix_setregid (PyObject *self, PyObject *args)
4332{
Victor Stinner97b89882010-05-06 00:25:39 +00004333 long rgid_arg, egid_arg;
4334 gid_t rgid, egid;
4335 if (!PyArg_ParseTuple(args, "ll", &rgid_arg, &egid_arg))
4336 return NULL;
4337 if (rgid_arg == -1)
4338 rgid = (gid_t)-1; /* let the compiler choose how -1 fits */
4339 else
4340 rgid = rgid_arg; /* otherwise, assign from our long */
4341 if (egid_arg == -1)
4342 egid = (gid_t)-1;
4343 else
4344 egid = egid_arg;
4345 if ((egid_arg != -1 && egid != egid_arg) ||
4346 (rgid_arg != -1 && rgid != rgid_arg)) {
4347 PyErr_SetString(PyExc_OverflowError, "group id too big");
4348 return NULL;
4349 }
4350 if (setregid(rgid, egid) < 0) {
4351 return posix_error();
4352 } else {
4353 Py_INCREF(Py_None);
4354 return Py_None;
4355 }
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004356}
4357#endif /* HAVE_SETREGID */
4358
Guido van Rossumb6775db1994-08-01 11:34:53 +00004359#ifdef HAVE_SETGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004360PyDoc_STRVAR(posix_setgid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004361"setgid(gid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004362Set the current process's group id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004363
Barry Warsaw53699e91996-12-10 23:23:01 +00004364static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004365posix_setgid(PyObject *self, PyObject *args)
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004366{
Victor Stinner97b89882010-05-06 00:25:39 +00004367 long gid_arg;
4368 gid_t gid;
4369 if (!PyArg_ParseTuple(args, "l:setgid", &gid_arg))
4370 return NULL;
4371 gid = gid_arg;
4372 if (gid != gid_arg) {
4373 PyErr_SetString(PyExc_OverflowError, "group id too big");
4374 return NULL;
4375 }
4376 if (setgid(gid) < 0)
4377 return posix_error();
4378 Py_INCREF(Py_None);
4379 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004380}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004381#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004382
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004383#ifdef HAVE_SETGROUPS
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004384PyDoc_STRVAR(posix_setgroups__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004385"setgroups(list)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004386Set the groups of the current process to list.");
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004387
4388static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004389posix_setgroups(PyObject *self, PyObject *groups)
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004390{
Victor Stinner97b89882010-05-06 00:25:39 +00004391 int i, len;
4392 gid_t grouplist[MAX_GROUPS];
Tim Peters5aa91602002-01-30 05:46:57 +00004393
Victor Stinner97b89882010-05-06 00:25:39 +00004394 if (!PySequence_Check(groups)) {
4395 PyErr_SetString(PyExc_TypeError, "setgroups argument must be a sequence");
4396 return NULL;
4397 }
4398 len = PySequence_Size(groups);
4399 if (len > MAX_GROUPS) {
4400 PyErr_SetString(PyExc_ValueError, "too many groups");
4401 return NULL;
4402 }
4403 for(i = 0; i < len; i++) {
4404 PyObject *elem;
4405 elem = PySequence_GetItem(groups, i);
4406 if (!elem)
4407 return NULL;
4408 if (!PyLong_Check(elem)) {
4409 PyErr_SetString(PyExc_TypeError,
4410 "groups must be integers");
4411 Py_DECREF(elem);
4412 return NULL;
4413 } else {
4414 unsigned long x = PyLong_AsUnsignedLong(elem);
4415 if (PyErr_Occurred()) {
4416 PyErr_SetString(PyExc_TypeError,
4417 "group id too big");
4418 Py_DECREF(elem);
4419 return NULL;
4420 }
4421 grouplist[i] = x;
4422 /* read back the value to see if it fitted in gid_t */
4423 if (grouplist[i] != x) {
4424 PyErr_SetString(PyExc_TypeError,
4425 "group id too big");
4426 Py_DECREF(elem);
4427 return NULL;
4428 }
4429 }
4430 Py_DECREF(elem);
4431 }
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004432
Victor Stinner97b89882010-05-06 00:25:39 +00004433 if (setgroups(len, grouplist) < 0)
4434 return posix_error();
4435 Py_INCREF(Py_None);
4436 return Py_None;
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004437}
4438#endif /* HAVE_SETGROUPS */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004439
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004440#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4)
4441static PyObject *
Christian Heimes292d3512008-02-03 16:51:08 +00004442wait_helper(pid_t pid, int status, struct rusage *ru)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004443{
Victor Stinner97b89882010-05-06 00:25:39 +00004444 PyObject *result;
4445 static PyObject *struct_rusage;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004446
Victor Stinner97b89882010-05-06 00:25:39 +00004447 if (pid == -1)
4448 return posix_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004449
Victor Stinner97b89882010-05-06 00:25:39 +00004450 if (struct_rusage == NULL) {
4451 PyObject *m = PyImport_ImportModuleNoBlock("resource");
4452 if (m == NULL)
4453 return NULL;
4454 struct_rusage = PyObject_GetAttrString(m, "struct_rusage");
4455 Py_DECREF(m);
4456 if (struct_rusage == NULL)
4457 return NULL;
4458 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004459
Victor Stinner97b89882010-05-06 00:25:39 +00004460 /* XXX(nnorwitz): Copied (w/mods) from resource.c, there should be only one. */
4461 result = PyStructSequence_New((PyTypeObject*) struct_rusage);
4462 if (!result)
4463 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004464
4465#ifndef doubletime
4466#define doubletime(TV) ((double)(TV).tv_sec + (TV).tv_usec * 0.000001)
4467#endif
4468
Victor Stinner97b89882010-05-06 00:25:39 +00004469 PyStructSequence_SET_ITEM(result, 0,
4470 PyFloat_FromDouble(doubletime(ru->ru_utime)));
4471 PyStructSequence_SET_ITEM(result, 1,
4472 PyFloat_FromDouble(doubletime(ru->ru_stime)));
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004473#define SET_INT(result, index, value)\
Victor Stinner97b89882010-05-06 00:25:39 +00004474 PyStructSequence_SET_ITEM(result, index, PyLong_FromLong(value))
4475 SET_INT(result, 2, ru->ru_maxrss);
4476 SET_INT(result, 3, ru->ru_ixrss);
4477 SET_INT(result, 4, ru->ru_idrss);
4478 SET_INT(result, 5, ru->ru_isrss);
4479 SET_INT(result, 6, ru->ru_minflt);
4480 SET_INT(result, 7, ru->ru_majflt);
4481 SET_INT(result, 8, ru->ru_nswap);
4482 SET_INT(result, 9, ru->ru_inblock);
4483 SET_INT(result, 10, ru->ru_oublock);
4484 SET_INT(result, 11, ru->ru_msgsnd);
4485 SET_INT(result, 12, ru->ru_msgrcv);
4486 SET_INT(result, 13, ru->ru_nsignals);
4487 SET_INT(result, 14, ru->ru_nvcsw);
4488 SET_INT(result, 15, ru->ru_nivcsw);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004489#undef SET_INT
4490
Victor Stinner97b89882010-05-06 00:25:39 +00004491 if (PyErr_Occurred()) {
4492 Py_DECREF(result);
4493 return NULL;
4494 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004495
Victor Stinner97b89882010-05-06 00:25:39 +00004496 return Py_BuildValue("NiN", PyLong_FromPid(pid), status, result);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004497}
4498#endif /* HAVE_WAIT3 || HAVE_WAIT4 */
4499
4500#ifdef HAVE_WAIT3
4501PyDoc_STRVAR(posix_wait3__doc__,
4502"wait3(options) -> (pid, status, rusage)\n\n\
4503Wait for completion of a child process.");
4504
4505static PyObject *
4506posix_wait3(PyObject *self, PyObject *args)
4507{
Victor Stinner97b89882010-05-06 00:25:39 +00004508 pid_t pid;
4509 int options;
4510 struct rusage ru;
4511 WAIT_TYPE status;
4512 WAIT_STATUS_INT(status) = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004513
Victor Stinner97b89882010-05-06 00:25:39 +00004514 if (!PyArg_ParseTuple(args, "i:wait3", &options))
4515 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004516
Victor Stinner97b89882010-05-06 00:25:39 +00004517 Py_BEGIN_ALLOW_THREADS
4518 pid = wait3(&status, options, &ru);
4519 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004520
Victor Stinner97b89882010-05-06 00:25:39 +00004521 return wait_helper(pid, WAIT_STATUS_INT(status), &ru);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004522}
4523#endif /* HAVE_WAIT3 */
4524
4525#ifdef HAVE_WAIT4
4526PyDoc_STRVAR(posix_wait4__doc__,
4527"wait4(pid, options) -> (pid, status, rusage)\n\n\
4528Wait for completion of a given child process.");
4529
4530static PyObject *
4531posix_wait4(PyObject *self, PyObject *args)
4532{
Victor Stinner97b89882010-05-06 00:25:39 +00004533 pid_t pid;
4534 int options;
4535 struct rusage ru;
4536 WAIT_TYPE status;
4537 WAIT_STATUS_INT(status) = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004538
Victor Stinner97b89882010-05-06 00:25:39 +00004539 if (!PyArg_ParseTuple(args, PARSE_PID "i:wait4", &pid, &options))
4540 return NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004541
Victor Stinner97b89882010-05-06 00:25:39 +00004542 Py_BEGIN_ALLOW_THREADS
4543 pid = wait4(pid, &status, options, &ru);
4544 Py_END_ALLOW_THREADS
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004545
Victor Stinner97b89882010-05-06 00:25:39 +00004546 return wait_helper(pid, WAIT_STATUS_INT(status), &ru);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004547}
4548#endif /* HAVE_WAIT4 */
4549
Guido van Rossumb6775db1994-08-01 11:34:53 +00004550#ifdef HAVE_WAITPID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004551PyDoc_STRVAR(posix_waitpid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004552"waitpid(pid, options) -> (pid, status)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004553Wait for completion of a given child process.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004554
Barry Warsaw53699e91996-12-10 23:23:01 +00004555static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004556posix_waitpid(PyObject *self, PyObject *args)
Guido van Rossum85e3b011991-06-03 12:42:10 +00004557{
Victor Stinner97b89882010-05-06 00:25:39 +00004558 pid_t pid;
4559 int options;
4560 WAIT_TYPE status;
4561 WAIT_STATUS_INT(status) = 0;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00004562
Victor Stinner97b89882010-05-06 00:25:39 +00004563 if (!PyArg_ParseTuple(args, PARSE_PID "i:waitpid", &pid, &options))
4564 return NULL;
4565 Py_BEGIN_ALLOW_THREADS
4566 pid = waitpid(pid, &status, options);
4567 Py_END_ALLOW_THREADS
4568 if (pid == -1)
4569 return posix_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004570
Victor Stinner97b89882010-05-06 00:25:39 +00004571 return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status));
Guido van Rossum21803b81992-08-09 12:55:27 +00004572}
4573
Tim Petersab034fa2002-02-01 11:27:43 +00004574#elif defined(HAVE_CWAIT)
4575
4576/* MS C has a variant of waitpid() that's usable for most purposes. */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004577PyDoc_STRVAR(posix_waitpid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004578"waitpid(pid, options) -> (pid, status << 8)\n\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004579"Wait for completion of a given process. options is ignored on Windows.");
Tim Petersab034fa2002-02-01 11:27:43 +00004580
4581static PyObject *
4582posix_waitpid(PyObject *self, PyObject *args)
4583{
Victor Stinner97b89882010-05-06 00:25:39 +00004584 Py_intptr_t pid;
4585 int status, options;
Tim Petersab034fa2002-02-01 11:27:43 +00004586
Victor Stinner97b89882010-05-06 00:25:39 +00004587 if (!PyArg_ParseTuple(args, PARSE_PID "i:waitpid", &pid, &options))
4588 return NULL;
4589 Py_BEGIN_ALLOW_THREADS
4590 pid = _cwait(&status, pid, options);
4591 Py_END_ALLOW_THREADS
4592 if (pid == -1)
4593 return posix_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004594
Victor Stinner97b89882010-05-06 00:25:39 +00004595 /* shift the status left a byte so this is more like the POSIX waitpid */
4596 return Py_BuildValue("Ni", PyLong_FromPid(pid), status << 8);
Tim Petersab034fa2002-02-01 11:27:43 +00004597}
4598#endif /* HAVE_WAITPID || HAVE_CWAIT */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004599
Guido van Rossumad0ee831995-03-01 10:34:45 +00004600#ifdef HAVE_WAIT
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004601PyDoc_STRVAR(posix_wait__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004602"wait() -> (pid, status)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004603Wait for completion of a child process.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004604
Barry Warsaw53699e91996-12-10 23:23:01 +00004605static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004606posix_wait(PyObject *self, PyObject *noargs)
Guido van Rossum21803b81992-08-09 12:55:27 +00004607{
Victor Stinner97b89882010-05-06 00:25:39 +00004608 pid_t pid;
4609 WAIT_TYPE status;
4610 WAIT_STATUS_INT(status) = 0;
Neal Norwitze241ce82003-02-17 18:17:05 +00004611
Victor Stinner97b89882010-05-06 00:25:39 +00004612 Py_BEGIN_ALLOW_THREADS
4613 pid = wait(&status);
4614 Py_END_ALLOW_THREADS
4615 if (pid == -1)
4616 return posix_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004617
Victor Stinner97b89882010-05-06 00:25:39 +00004618 return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status));
Guido van Rossum85e3b011991-06-03 12:42:10 +00004619}
Guido van Rossumad0ee831995-03-01 10:34:45 +00004620#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00004621
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004622
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004623PyDoc_STRVAR(posix_lstat__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004624"lstat(path) -> stat result\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004625Like stat(path), but do not follow symbolic links.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004626
Barry Warsaw53699e91996-12-10 23:23:01 +00004627static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004628posix_lstat(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004629{
Guido van Rossumb6775db1994-08-01 11:34:53 +00004630#ifdef HAVE_LSTAT
Victor Stinner97b89882010-05-06 00:25:39 +00004631 return posix_do_stat(self, args, "O&:lstat", lstat, NULL, NULL);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004632#else /* !HAVE_LSTAT */
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004633#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00004634 return posix_do_stat(self, args, "O&:lstat", STAT, "U:lstat", win32_wstat);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004635#else
Victor Stinner97b89882010-05-06 00:25:39 +00004636 return posix_do_stat(self, args, "O&:lstat", STAT, NULL, NULL);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004637#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004638#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004639}
4640
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004641
Guido van Rossumb6775db1994-08-01 11:34:53 +00004642#ifdef HAVE_READLINK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004643PyDoc_STRVAR(posix_readlink__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004644"readlink(path) -> path\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004645Return a string representing the path to which the symbolic link points.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004646
Barry Warsaw53699e91996-12-10 23:23:01 +00004647static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004648posix_readlink(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004649{
Victor Stinner97b89882010-05-06 00:25:39 +00004650 PyObject* v;
4651 char buf[MAXPATHLEN];
4652 PyObject *opath;
4653 char *path;
4654 int n;
4655 int arg_is_unicode = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004656
Victor Stinner97b89882010-05-06 00:25:39 +00004657 if (!PyArg_ParseTuple(args, "O&:readlink",
4658 PyUnicode_FSConverter, &opath))
4659 return NULL;
4660 path = bytes2str(opath, 1);
4661 v = PySequence_GetItem(args, 0);
4662 if (v == NULL) {
4663 release_bytes(opath);
4664 return NULL;
4665 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004666
Victor Stinner97b89882010-05-06 00:25:39 +00004667 if (PyUnicode_Check(v)) {
4668 arg_is_unicode = 1;
4669 }
4670 Py_DECREF(v);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004671
Victor Stinner97b89882010-05-06 00:25:39 +00004672 Py_BEGIN_ALLOW_THREADS
4673 n = readlink(path, buf, (int) sizeof buf);
4674 Py_END_ALLOW_THREADS
4675 if (n < 0)
4676 return posix_error_with_allocated_filename(opath);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004677
Victor Stinner97b89882010-05-06 00:25:39 +00004678 release_bytes(opath);
4679 v = PyBytes_FromStringAndSize(buf, n);
4680 if (arg_is_unicode) {
4681 PyObject *w;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004682
Victor Stinner97b89882010-05-06 00:25:39 +00004683 w = PyUnicode_FromEncodedObject(v,
4684 Py_FileSystemDefaultEncoding,
4685 "surrogateescape");
4686 if (w != NULL) {
4687 Py_DECREF(v);
4688 v = w;
4689 }
4690 else {
4691 v = NULL;
4692 }
4693 }
4694 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004695}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004696#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004697
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004698
Guido van Rossumb6775db1994-08-01 11:34:53 +00004699#ifdef HAVE_SYMLINK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004700PyDoc_STRVAR(posix_symlink__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004701"symlink(src, dst)\n\n\
Brett Cannon807413d2003-06-11 00:18:09 +00004702Create a symbolic link pointing to src named dst.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004703
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004704static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004705posix_symlink(PyObject *self, PyObject *args)
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004706{
Victor Stinner97b89882010-05-06 00:25:39 +00004707 return posix_2str(args, "O&O&:symlink", symlink);
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004708}
4709#endif /* HAVE_SYMLINK */
4710
4711
4712#ifdef HAVE_TIMES
Guido van Rossumd48f2521997-12-05 22:19:34 +00004713#if defined(PYCC_VACPP) && defined(PYOS_OS2)
4714static long
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00004715system_uptime(void)
Guido van Rossumd48f2521997-12-05 22:19:34 +00004716{
4717 ULONG value = 0;
4718
4719 Py_BEGIN_ALLOW_THREADS
4720 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &value, sizeof(value));
4721 Py_END_ALLOW_THREADS
4722
4723 return value;
4724}
4725
4726static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004727posix_times(PyObject *self, PyObject *noargs)
Guido van Rossumd48f2521997-12-05 22:19:34 +00004728{
Guido van Rossumd48f2521997-12-05 22:19:34 +00004729 /* Currently Only Uptime is Provided -- Others Later */
Victor Stinner97b89882010-05-06 00:25:39 +00004730 return Py_BuildValue("ddddd",
4731 (double)0 /* t.tms_utime / HZ */,
4732 (double)0 /* t.tms_stime / HZ */,
4733 (double)0 /* t.tms_cutime / HZ */,
4734 (double)0 /* t.tms_cstime / HZ */,
4735 (double)system_uptime() / 1000);
Guido van Rossumd48f2521997-12-05 22:19:34 +00004736}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004737#else /* not OS2 */
Martin v. Löwis05bfe1f2008-12-29 18:21:47 +00004738#define NEED_TICKS_PER_SECOND
4739static long ticks_per_second = -1;
Barry Warsaw53699e91996-12-10 23:23:01 +00004740static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004741posix_times(PyObject *self, PyObject *noargs)
Guido van Rossum22db57e1992-04-05 14:25:30 +00004742{
Victor Stinner97b89882010-05-06 00:25:39 +00004743 struct tms t;
4744 clock_t c;
4745 errno = 0;
4746 c = times(&t);
4747 if (c == (clock_t) -1)
4748 return posix_error();
4749 return Py_BuildValue("ddddd",
4750 (double)t.tms_utime / ticks_per_second,
4751 (double)t.tms_stime / ticks_per_second,
4752 (double)t.tms_cutime / ticks_per_second,
4753 (double)t.tms_cstime / ticks_per_second,
4754 (double)c / ticks_per_second);
Guido van Rossum22db57e1992-04-05 14:25:30 +00004755}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004756#endif /* not OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004757#endif /* HAVE_TIMES */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004758
4759
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00004760#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00004761#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00004762static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004763posix_times(PyObject *self, PyObject *noargs)
Guido van Rossum14ed0b21994-09-29 09:50:09 +00004764{
Victor Stinner97b89882010-05-06 00:25:39 +00004765 FILETIME create, exit, kernel, user;
4766 HANDLE hProc;
4767 hProc = GetCurrentProcess();
4768 GetProcessTimes(hProc, &create, &exit, &kernel, &user);
4769 /* The fields of a FILETIME structure are the hi and lo part
4770 of a 64-bit value expressed in 100 nanosecond units.
4771 1e7 is one second in such units; 1e-7 the inverse.
4772 429.4967296 is 2**32 / 1e7 or 2**32 * 1e-7.
4773 */
4774 return Py_BuildValue(
4775 "ddddd",
4776 (double)(user.dwHighDateTime*429.4967296 +
4777 user.dwLowDateTime*1e-7),
4778 (double)(kernel.dwHighDateTime*429.4967296 +
4779 kernel.dwLowDateTime*1e-7),
4780 (double)0,
4781 (double)0,
4782 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00004783}
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00004784#endif /* MS_WINDOWS */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004785
4786#ifdef HAVE_TIMES
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004787PyDoc_STRVAR(posix_times__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004788"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004789Return a tuple of floating point numbers indicating process times.");
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004790#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00004791
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004792
Martin v. Löwis49ee14d2003-11-10 06:35:36 +00004793#ifdef HAVE_GETSID
4794PyDoc_STRVAR(posix_getsid__doc__,
4795"getsid(pid) -> sid\n\n\
4796Call the system call getsid().");
4797
4798static PyObject *
4799posix_getsid(PyObject *self, PyObject *args)
4800{
Victor Stinner97b89882010-05-06 00:25:39 +00004801 pid_t pid;
4802 int sid;
4803 if (!PyArg_ParseTuple(args, PARSE_PID ":getsid", &pid))
4804 return NULL;
4805 sid = getsid(pid);
4806 if (sid < 0)
4807 return posix_error();
4808 return PyLong_FromLong((long)sid);
Martin v. Löwis49ee14d2003-11-10 06:35:36 +00004809}
4810#endif /* HAVE_GETSID */
4811
4812
Guido van Rossumb6775db1994-08-01 11:34:53 +00004813#ifdef HAVE_SETSID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004814PyDoc_STRVAR(posix_setsid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004815"setsid()\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004816Call the system call setsid().");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004817
Barry Warsaw53699e91996-12-10 23:23:01 +00004818static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004819posix_setsid(PyObject *self, PyObject *noargs)
Guido van Rossumc2670a01992-09-13 20:07:29 +00004820{
Victor Stinner97b89882010-05-06 00:25:39 +00004821 if (setsid() < 0)
4822 return posix_error();
4823 Py_INCREF(Py_None);
4824 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00004825}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004826#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00004827
Guido van Rossumb6775db1994-08-01 11:34:53 +00004828#ifdef HAVE_SETPGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004829PyDoc_STRVAR(posix_setpgid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004830"setpgid(pid, pgrp)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004831Call the system call setpgid().");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004832
Barry Warsaw53699e91996-12-10 23:23:01 +00004833static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004834posix_setpgid(PyObject *self, PyObject *args)
Guido van Rossumc2670a01992-09-13 20:07:29 +00004835{
Victor Stinner97b89882010-05-06 00:25:39 +00004836 pid_t pid;
4837 int pgrp;
4838 if (!PyArg_ParseTuple(args, PARSE_PID "i:setpgid", &pid, &pgrp))
4839 return NULL;
4840 if (setpgid(pid, pgrp) < 0)
4841 return posix_error();
4842 Py_INCREF(Py_None);
4843 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00004844}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004845#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00004846
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004847
Guido van Rossumb6775db1994-08-01 11:34:53 +00004848#ifdef HAVE_TCGETPGRP
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004849PyDoc_STRVAR(posix_tcgetpgrp__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004850"tcgetpgrp(fd) -> pgid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004851Return the process group associated with the terminal given by a fd.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004852
Barry Warsaw53699e91996-12-10 23:23:01 +00004853static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004854posix_tcgetpgrp(PyObject *self, PyObject *args)
Guido van Rossum7066dd71992-09-17 17:54:56 +00004855{
Victor Stinner97b89882010-05-06 00:25:39 +00004856 int fd;
4857 pid_t pgid;
4858 if (!PyArg_ParseTuple(args, "i:tcgetpgrp", &fd))
4859 return NULL;
4860 pgid = tcgetpgrp(fd);
4861 if (pgid < 0)
4862 return posix_error();
4863 return PyLong_FromPid(pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00004864}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004865#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00004866
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004867
Guido van Rossumb6775db1994-08-01 11:34:53 +00004868#ifdef HAVE_TCSETPGRP
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004869PyDoc_STRVAR(posix_tcsetpgrp__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004870"tcsetpgrp(fd, pgid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004871Set the process group associated with the terminal given by a fd.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004872
Barry Warsaw53699e91996-12-10 23:23:01 +00004873static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004874posix_tcsetpgrp(PyObject *self, PyObject *args)
Guido van Rossum7066dd71992-09-17 17:54:56 +00004875{
Victor Stinner97b89882010-05-06 00:25:39 +00004876 int fd;
4877 pid_t pgid;
4878 if (!PyArg_ParseTuple(args, "i" PARSE_PID ":tcsetpgrp", &fd, &pgid))
4879 return NULL;
4880 if (tcsetpgrp(fd, pgid) < 0)
4881 return posix_error();
4882 Py_INCREF(Py_None);
4883 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00004884}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004885#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00004886
Guido van Rossum687dd131993-05-17 08:34:16 +00004887/* Functions acting on file descriptors */
4888
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004889PyDoc_STRVAR(posix_open__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004890"open(filename, flag [, mode=0777]) -> fd\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004891Open a file (for low level IO).");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004892
Barry Warsaw53699e91996-12-10 23:23:01 +00004893static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004894posix_open(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00004895{
Victor Stinner97b89882010-05-06 00:25:39 +00004896 PyObject *ofile;
4897 char *file;
4898 int flag;
4899 int mode = 0777;
4900 int fd;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004901
4902#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00004903 if (unicode_file_names()) {
4904 PyUnicodeObject *po;
4905 if (PyArg_ParseTuple(args, "Ui|i:mkdir", &po, &flag, &mode)) {
4906 Py_BEGIN_ALLOW_THREADS
4907 /* PyUnicode_AS_UNICODE OK without thread
4908 lock as it is a simple dereference. */
4909 fd = _wopen(PyUnicode_AS_UNICODE(po), flag, mode);
4910 Py_END_ALLOW_THREADS
4911 if (fd < 0)
4912 return posix_error();
4913 return PyLong_FromLong((long)fd);
4914 }
4915 /* Drop the argument parsing error as narrow strings
4916 are also valid. */
4917 PyErr_Clear();
4918 }
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004919#endif
4920
Victor Stinner97b89882010-05-06 00:25:39 +00004921 if (!PyArg_ParseTuple(args, "O&i|i",
4922 PyUnicode_FSConverter, &ofile,
4923 &flag, &mode))
4924 return NULL;
4925 file = bytes2str(ofile, 1);
4926 Py_BEGIN_ALLOW_THREADS
4927 fd = open(file, flag, mode);
4928 Py_END_ALLOW_THREADS
4929 if (fd < 0)
4930 return posix_error_with_allocated_filename(ofile);
4931 release_bytes(ofile);
4932 return PyLong_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00004933}
4934
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004935
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004936PyDoc_STRVAR(posix_close__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004937"close(fd)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004938Close a file descriptor (for low level IO).");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004939
Barry Warsaw53699e91996-12-10 23:23:01 +00004940static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004941posix_close(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00004942{
Victor Stinner97b89882010-05-06 00:25:39 +00004943 int fd, res;
4944 if (!PyArg_ParseTuple(args, "i:close", &fd))
4945 return NULL;
4946 if (!_PyVerify_fd(fd))
4947 return posix_error();
4948 Py_BEGIN_ALLOW_THREADS
4949 res = close(fd);
4950 Py_END_ALLOW_THREADS
4951 if (res < 0)
4952 return posix_error();
4953 Py_INCREF(Py_None);
4954 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00004955}
4956
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004957
Victor Stinner97b89882010-05-06 00:25:39 +00004958PyDoc_STRVAR(posix_closerange__doc__,
Christian Heimesfdab48e2008-01-20 09:06:41 +00004959"closerange(fd_low, fd_high)\n\n\
4960Closes all file descriptors in [fd_low, fd_high), ignoring errors.");
4961
4962static PyObject *
4963posix_closerange(PyObject *self, PyObject *args)
4964{
Victor Stinner97b89882010-05-06 00:25:39 +00004965 int fd_from, fd_to, i;
4966 if (!PyArg_ParseTuple(args, "ii:closerange", &fd_from, &fd_to))
4967 return NULL;
4968 Py_BEGIN_ALLOW_THREADS
4969 for (i = fd_from; i < fd_to; i++)
4970 if (_PyVerify_fd(i))
4971 close(i);
4972 Py_END_ALLOW_THREADS
4973 Py_RETURN_NONE;
Christian Heimesfdab48e2008-01-20 09:06:41 +00004974}
4975
4976
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004977PyDoc_STRVAR(posix_dup__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004978"dup(fd) -> fd2\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004979Return a duplicate of a file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004980
Barry Warsaw53699e91996-12-10 23:23:01 +00004981static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004982posix_dup(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00004983{
Victor Stinner97b89882010-05-06 00:25:39 +00004984 int fd;
4985 if (!PyArg_ParseTuple(args, "i:dup", &fd))
4986 return NULL;
4987 if (!_PyVerify_fd(fd))
4988 return posix_error();
4989 Py_BEGIN_ALLOW_THREADS
4990 fd = dup(fd);
4991 Py_END_ALLOW_THREADS
4992 if (fd < 0)
4993 return posix_error();
4994 return PyLong_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00004995}
4996
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004997
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004998PyDoc_STRVAR(posix_dup2__doc__,
Andrew M. Kuchling8135fd52004-01-16 13:18:42 +00004999"dup2(old_fd, new_fd)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005000Duplicate file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005001
Barry Warsaw53699e91996-12-10 23:23:01 +00005002static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005003posix_dup2(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005004{
Victor Stinner97b89882010-05-06 00:25:39 +00005005 int fd, fd2, res;
5006 if (!PyArg_ParseTuple(args, "ii:dup2", &fd, &fd2))
5007 return NULL;
5008 if (!_PyVerify_fd_dup2(fd, fd2))
5009 return posix_error();
5010 Py_BEGIN_ALLOW_THREADS
5011 res = dup2(fd, fd2);
5012 Py_END_ALLOW_THREADS
5013 if (res < 0)
5014 return posix_error();
5015 Py_INCREF(Py_None);
5016 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00005017}
5018
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005019
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005020PyDoc_STRVAR(posix_lseek__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005021"lseek(fd, pos, how) -> newpos\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005022Set the current position of a file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005023
Barry Warsaw53699e91996-12-10 23:23:01 +00005024static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005025posix_lseek(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005026{
Victor Stinner97b89882010-05-06 00:25:39 +00005027 int fd, how;
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005028#if defined(MS_WIN64) || defined(MS_WINDOWS)
Victor Stinner97b89882010-05-06 00:25:39 +00005029 PY_LONG_LONG pos, res;
Fred Drake699f3522000-06-29 21:12:41 +00005030#else
Victor Stinner97b89882010-05-06 00:25:39 +00005031 off_t pos, res;
Fred Drake699f3522000-06-29 21:12:41 +00005032#endif
Victor Stinner97b89882010-05-06 00:25:39 +00005033 PyObject *posobj;
5034 if (!PyArg_ParseTuple(args, "iOi:lseek", &fd, &posobj, &how))
5035 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00005036#ifdef SEEK_SET
Victor Stinner97b89882010-05-06 00:25:39 +00005037 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
5038 switch (how) {
5039 case 0: how = SEEK_SET; break;
5040 case 1: how = SEEK_CUR; break;
5041 case 2: how = SEEK_END; break;
5042 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00005043#endif /* SEEK_END */
Guido van Rossum94f6f721999-01-06 18:42:14 +00005044
5045#if !defined(HAVE_LARGEFILE_SUPPORT)
Victor Stinner97b89882010-05-06 00:25:39 +00005046 pos = PyLong_AsLong(posobj);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005047#else
Victor Stinner97b89882010-05-06 00:25:39 +00005048 pos = PyLong_Check(posobj) ?
5049 PyLong_AsLongLong(posobj) : PyLong_AsLong(posobj);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005050#endif
Victor Stinner97b89882010-05-06 00:25:39 +00005051 if (PyErr_Occurred())
5052 return NULL;
Guido van Rossum94f6f721999-01-06 18:42:14 +00005053
Victor Stinner97b89882010-05-06 00:25:39 +00005054 if (!_PyVerify_fd(fd))
5055 return posix_error();
5056 Py_BEGIN_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005057#if defined(MS_WIN64) || defined(MS_WINDOWS)
Victor Stinner97b89882010-05-06 00:25:39 +00005058 res = _lseeki64(fd, pos, how);
Fred Drake699f3522000-06-29 21:12:41 +00005059#else
Victor Stinner97b89882010-05-06 00:25:39 +00005060 res = lseek(fd, pos, how);
Fred Drake699f3522000-06-29 21:12:41 +00005061#endif
Victor Stinner97b89882010-05-06 00:25:39 +00005062 Py_END_ALLOW_THREADS
5063 if (res < 0)
5064 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00005065
5066#if !defined(HAVE_LARGEFILE_SUPPORT)
Victor Stinner97b89882010-05-06 00:25:39 +00005067 return PyLong_FromLong(res);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005068#else
Victor Stinner97b89882010-05-06 00:25:39 +00005069 return PyLong_FromLongLong(res);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005070#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00005071}
5072
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005073
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005074PyDoc_STRVAR(posix_read__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005075"read(fd, buffersize) -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005076Read a file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005077
Barry Warsaw53699e91996-12-10 23:23:01 +00005078static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005079posix_read(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005080{
Victor Stinner97b89882010-05-06 00:25:39 +00005081 int fd, size;
5082 Py_ssize_t n;
5083 PyObject *buffer;
5084 if (!PyArg_ParseTuple(args, "ii:read", &fd, &size))
5085 return NULL;
5086 if (size < 0) {
5087 errno = EINVAL;
5088 return posix_error();
5089 }
5090 buffer = PyBytes_FromStringAndSize((char *)NULL, size);
5091 if (buffer == NULL)
5092 return NULL;
5093 if (!_PyVerify_fd(fd))
5094 return posix_error();
5095 Py_BEGIN_ALLOW_THREADS
5096 n = read(fd, PyBytes_AS_STRING(buffer), size);
5097 Py_END_ALLOW_THREADS
5098 if (n < 0) {
5099 Py_DECREF(buffer);
5100 return posix_error();
5101 }
5102 if (n != size)
5103 _PyBytes_Resize(&buffer, n);
5104 return buffer;
Guido van Rossum687dd131993-05-17 08:34:16 +00005105}
5106
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005107
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005108PyDoc_STRVAR(posix_write__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005109"write(fd, string) -> byteswritten\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005110Write a string to a file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005111
Barry Warsaw53699e91996-12-10 23:23:01 +00005112static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005113posix_write(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005114{
Victor Stinner97b89882010-05-06 00:25:39 +00005115 Py_buffer pbuf;
5116 int fd;
5117 Py_ssize_t size;
Thomas Wouters68bc4f92006-03-01 01:05:10 +00005118
Victor Stinner97b89882010-05-06 00:25:39 +00005119 if (!PyArg_ParseTuple(args, "iy*:write", &fd, &pbuf))
5120 return NULL;
5121 if (!_PyVerify_fd(fd))
5122 return posix_error();
5123 Py_BEGIN_ALLOW_THREADS
5124 size = write(fd, pbuf.buf, (size_t)pbuf.len);
5125 Py_END_ALLOW_THREADS
5126 PyBuffer_Release(&pbuf);
5127 if (size < 0)
5128 return posix_error();
5129 return PyLong_FromSsize_t(size);
Guido van Rossum687dd131993-05-17 08:34:16 +00005130}
5131
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005132
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005133PyDoc_STRVAR(posix_fstat__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005134"fstat(fd) -> stat result\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005135Like stat(), but for an open file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005136
Barry Warsaw53699e91996-12-10 23:23:01 +00005137static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005138posix_fstat(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005139{
Victor Stinner97b89882010-05-06 00:25:39 +00005140 int fd;
5141 STRUCT_STAT st;
5142 int res;
5143 if (!PyArg_ParseTuple(args, "i:fstat", &fd))
5144 return NULL;
Martin v. Löwis7a924e62003-03-05 14:15:21 +00005145#ifdef __VMS
Victor Stinner97b89882010-05-06 00:25:39 +00005146 /* on OpenVMS we must ensure that all bytes are written to the file */
5147 fsync(fd);
Martin v. Löwis7a924e62003-03-05 14:15:21 +00005148#endif
Victor Stinner97b89882010-05-06 00:25:39 +00005149 if (!_PyVerify_fd(fd))
5150 return posix_error();
5151 Py_BEGIN_ALLOW_THREADS
5152 res = FSTAT(fd, &st);
5153 Py_END_ALLOW_THREADS
5154 if (res != 0) {
Martin v. Löwis14694662006-02-03 12:54:16 +00005155#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00005156 return win32_error("fstat", NULL);
Martin v. Löwis14694662006-02-03 12:54:16 +00005157#else
Victor Stinner97b89882010-05-06 00:25:39 +00005158 return posix_error();
Martin v. Löwis14694662006-02-03 12:54:16 +00005159#endif
Victor Stinner97b89882010-05-06 00:25:39 +00005160 }
Tim Peters5aa91602002-01-30 05:46:57 +00005161
Victor Stinner97b89882010-05-06 00:25:39 +00005162 return _pystat_fromstructstat(&st);
Guido van Rossum687dd131993-05-17 08:34:16 +00005163}
5164
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005165PyDoc_STRVAR(posix_isatty__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005166"isatty(fd) -> bool\n\n\
Fred Drake106c1a02002-04-23 15:58:02 +00005167Return True if the file descriptor 'fd' is an open file descriptor\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005168connected to the slave end of a terminal.");
Skip Montanaro1517d842000-07-19 14:34:14 +00005169
5170static PyObject *
Thomas Wouters616607a2000-07-19 14:45:40 +00005171posix_isatty(PyObject *self, PyObject *args)
Skip Montanaro1517d842000-07-19 14:34:14 +00005172{
Victor Stinner97b89882010-05-06 00:25:39 +00005173 int fd;
5174 if (!PyArg_ParseTuple(args, "i:isatty", &fd))
5175 return NULL;
5176 if (!_PyVerify_fd(fd))
5177 return PyBool_FromLong(0);
5178 return PyBool_FromLong(isatty(fd));
Skip Montanaro1517d842000-07-19 14:34:14 +00005179}
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005180
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005181#ifdef HAVE_PIPE
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005182PyDoc_STRVAR(posix_pipe__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005183"pipe() -> (read_end, write_end)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005184Create a pipe.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005185
Barry Warsaw53699e91996-12-10 23:23:01 +00005186static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00005187posix_pipe(PyObject *self, PyObject *noargs)
Guido van Rossum687dd131993-05-17 08:34:16 +00005188{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005189#if defined(PYOS_OS2)
5190 HFILE read, write;
5191 APIRET rc;
5192
Victor Stinner97b89882010-05-06 00:25:39 +00005193 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005194 rc = DosCreatePipe( &read, &write, 4096);
Victor Stinner97b89882010-05-06 00:25:39 +00005195 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005196 if (rc != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00005197 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005198
5199 return Py_BuildValue("(ii)", read, write);
5200#else
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005201#if !defined(MS_WINDOWS)
Victor Stinner97b89882010-05-06 00:25:39 +00005202 int fds[2];
5203 int res;
5204 Py_BEGIN_ALLOW_THREADS
5205 res = pipe(fds);
5206 Py_END_ALLOW_THREADS
5207 if (res != 0)
5208 return posix_error();
5209 return Py_BuildValue("(ii)", fds[0], fds[1]);
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005210#else /* MS_WINDOWS */
Victor Stinner97b89882010-05-06 00:25:39 +00005211 HANDLE read, write;
5212 int read_fd, write_fd;
5213 BOOL ok;
5214 Py_BEGIN_ALLOW_THREADS
5215 ok = CreatePipe(&read, &write, NULL, 0);
5216 Py_END_ALLOW_THREADS
5217 if (!ok)
5218 return win32_error("CreatePipe", NULL);
5219 read_fd = _open_osfhandle((Py_intptr_t)read, 0);
5220 write_fd = _open_osfhandle((Py_intptr_t)write, 1);
5221 return Py_BuildValue("(ii)", read_fd, write_fd);
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005222#endif /* MS_WINDOWS */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005223#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00005224}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005225#endif /* HAVE_PIPE */
5226
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005227
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005228#ifdef HAVE_MKFIFO
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005229PyDoc_STRVAR(posix_mkfifo__doc__,
Neal Norwitzc18b3082002-10-11 22:19:42 +00005230"mkfifo(filename [, mode=0666])\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005231Create a FIFO (a POSIX named pipe).");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005232
Barry Warsaw53699e91996-12-10 23:23:01 +00005233static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005234posix_mkfifo(PyObject *self, PyObject *args)
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005235{
Victor Stinner97b89882010-05-06 00:25:39 +00005236 char *filename;
5237 int mode = 0666;
5238 int res;
5239 if (!PyArg_ParseTuple(args, "s|i:mkfifo", &filename, &mode))
5240 return NULL;
5241 Py_BEGIN_ALLOW_THREADS
5242 res = mkfifo(filename, mode);
5243 Py_END_ALLOW_THREADS
5244 if (res < 0)
5245 return posix_error();
5246 Py_INCREF(Py_None);
5247 return Py_None;
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005248}
5249#endif
5250
5251
Neal Norwitz11690112002-07-30 01:08:28 +00005252#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005253PyDoc_STRVAR(posix_mknod__doc__,
Neal Norwitzc18b3082002-10-11 22:19:42 +00005254"mknod(filename [, mode=0600, device])\n\n\
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005255Create a filesystem node (file, device special file or named pipe)\n\
5256named filename. mode specifies both the permissions to use and the\n\
5257type of node to be created, being combined (bitwise OR) with one of\n\
5258S_IFREG, S_IFCHR, S_IFBLK, and S_IFIFO. For S_IFCHR and S_IFBLK,\n\
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005259device defines the newly created device special file (probably using\n\
5260os.makedev()), otherwise it is ignored.");
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005261
5262
5263static PyObject *
5264posix_mknod(PyObject *self, PyObject *args)
5265{
Victor Stinner97b89882010-05-06 00:25:39 +00005266 char *filename;
5267 int mode = 0600;
5268 int device = 0;
5269 int res;
5270 if (!PyArg_ParseTuple(args, "s|ii:mknod", &filename, &mode, &device))
5271 return NULL;
5272 Py_BEGIN_ALLOW_THREADS
5273 res = mknod(filename, mode, device);
5274 Py_END_ALLOW_THREADS
5275 if (res < 0)
5276 return posix_error();
5277 Py_INCREF(Py_None);
5278 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005279}
5280#endif
5281
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005282#ifdef HAVE_DEVICE_MACROS
5283PyDoc_STRVAR(posix_major__doc__,
5284"major(device) -> major number\n\
5285Extracts a device major number from a raw device number.");
5286
5287static PyObject *
5288posix_major(PyObject *self, PyObject *args)
5289{
Victor Stinner97b89882010-05-06 00:25:39 +00005290 int device;
5291 if (!PyArg_ParseTuple(args, "i:major", &device))
5292 return NULL;
5293 return PyLong_FromLong((long)major(device));
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005294}
5295
5296PyDoc_STRVAR(posix_minor__doc__,
5297"minor(device) -> minor number\n\
5298Extracts a device minor number from a raw device number.");
5299
5300static PyObject *
5301posix_minor(PyObject *self, PyObject *args)
5302{
Victor Stinner97b89882010-05-06 00:25:39 +00005303 int device;
5304 if (!PyArg_ParseTuple(args, "i:minor", &device))
5305 return NULL;
5306 return PyLong_FromLong((long)minor(device));
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005307}
5308
5309PyDoc_STRVAR(posix_makedev__doc__,
5310"makedev(major, minor) -> device number\n\
5311Composes a raw device number from the major and minor device numbers.");
5312
5313static PyObject *
5314posix_makedev(PyObject *self, PyObject *args)
5315{
Victor Stinner97b89882010-05-06 00:25:39 +00005316 int major, minor;
5317 if (!PyArg_ParseTuple(args, "ii:makedev", &major, &minor))
5318 return NULL;
5319 return PyLong_FromLong((long)makedev(major, minor));
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005320}
5321#endif /* device macros */
5322
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005323
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005324#ifdef HAVE_FTRUNCATE
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005325PyDoc_STRVAR(posix_ftruncate__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005326"ftruncate(fd, length)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005327Truncate a file to a specified length.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005328
Barry Warsaw53699e91996-12-10 23:23:01 +00005329static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005330posix_ftruncate(PyObject *self, PyObject *args)
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005331{
Victor Stinner97b89882010-05-06 00:25:39 +00005332 int fd;
5333 off_t length;
5334 int res;
5335 PyObject *lenobj;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005336
Victor Stinner97b89882010-05-06 00:25:39 +00005337 if (!PyArg_ParseTuple(args, "iO:ftruncate", &fd, &lenobj))
5338 return NULL;
Guido van Rossum94f6f721999-01-06 18:42:14 +00005339
5340#if !defined(HAVE_LARGEFILE_SUPPORT)
Victor Stinner97b89882010-05-06 00:25:39 +00005341 length = PyLong_AsLong(lenobj);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005342#else
Victor Stinner97b89882010-05-06 00:25:39 +00005343 length = PyLong_Check(lenobj) ?
5344 PyLong_AsLongLong(lenobj) : PyLong_AsLong(lenobj);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005345#endif
Victor Stinner97b89882010-05-06 00:25:39 +00005346 if (PyErr_Occurred())
5347 return NULL;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005348
Victor Stinner97b89882010-05-06 00:25:39 +00005349 Py_BEGIN_ALLOW_THREADS
5350 res = ftruncate(fd, length);
5351 Py_END_ALLOW_THREADS
5352 if (res < 0)
5353 return posix_error();
5354 Py_INCREF(Py_None);
5355 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005356}
5357#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00005358
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005359#ifdef HAVE_PUTENV
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005360PyDoc_STRVAR(posix_putenv__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005361"putenv(key, value)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005362Change or add an environment variable.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005363
Fred Drake762e2061999-08-26 17:23:54 +00005364/* Save putenv() parameters as values here, so we can collect them when they
5365 * get re-set with another call for the same key. */
5366static PyObject *posix_putenv_garbage;
5367
Tim Peters5aa91602002-01-30 05:46:57 +00005368static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005369posix_putenv(PyObject *self, PyObject *args)
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005370{
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005371#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00005372 wchar_t *s1, *s2;
5373 wchar_t *newenv;
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005374#else
Victor Stinner97b89882010-05-06 00:25:39 +00005375 PyObject *os1, *os2;
5376 char *s1, *s2;
5377 char *newenv;
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005378#endif
Victor Stinner97b89882010-05-06 00:25:39 +00005379 PyObject *newstr;
5380 size_t len;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005381
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005382#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00005383 if (!PyArg_ParseTuple(args,
5384 "uu:putenv",
5385 &s1, &s2))
5386 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00005387#else
Victor Stinner97b89882010-05-06 00:25:39 +00005388 if (!PyArg_ParseTuple(args,
5389 "O&O&:putenv",
5390 PyUnicode_FSConverter, &os1,
5391 PyUnicode_FSConverter, &os2))
5392 return NULL;
5393 s1 = bytes2str(os1, 1);
5394 s2 = bytes2str(os2, 1);
Martin v. Löwis011e8422009-05-05 04:43:17 +00005395#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +00005396
5397#if defined(PYOS_OS2)
5398 if (stricmp(s1, "BEGINLIBPATH") == 0) {
5399 APIRET rc;
5400
Guido van Rossumd48f2521997-12-05 22:19:34 +00005401 rc = DosSetExtLIBPATH(s2, BEGIN_LIBPATH);
5402 if (rc != NO_ERROR)
5403 return os2_error(rc);
5404
5405 } else if (stricmp(s1, "ENDLIBPATH") == 0) {
5406 APIRET rc;
5407
Guido van Rossumd48f2521997-12-05 22:19:34 +00005408 rc = DosSetExtLIBPATH(s2, END_LIBPATH);
5409 if (rc != NO_ERROR)
5410 return os2_error(rc);
5411 } else {
5412#endif
Victor Stinner97b89882010-05-06 00:25:39 +00005413 /* XXX This can leak memory -- not easy to fix :-( */
5414 /* len includes space for a trailing \0; the size arg to
5415 PyBytes_FromStringAndSize does not count that */
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005416#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00005417 len = wcslen(s1) + wcslen(s2) + 2;
5418 newstr = PyUnicode_FromUnicode(NULL, (int)len - 1);
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005419#else
Victor Stinner97b89882010-05-06 00:25:39 +00005420 len = strlen(s1) + strlen(s2) + 2;
5421 newstr = PyBytes_FromStringAndSize(NULL, (int)len - 1);
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005422#endif
Victor Stinner97b89882010-05-06 00:25:39 +00005423 if (newstr == NULL)
5424 return PyErr_NoMemory();
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005425#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00005426 newenv = PyUnicode_AsUnicode(newstr);
5427 _snwprintf(newenv, len, L"%s=%s", s1, s2);
5428 if (_wputenv(newenv)) {
5429 Py_DECREF(newstr);
5430 posix_error();
5431 return NULL;
5432 }
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005433#else
Victor Stinner97b89882010-05-06 00:25:39 +00005434 newenv = PyBytes_AS_STRING(newstr);
5435 PyOS_snprintf(newenv, len, "%s=%s", s1, s2);
5436 if (putenv(newenv)) {
5437 Py_DECREF(newstr);
5438 release_bytes(os1);
5439 release_bytes(os2);
5440 posix_error();
5441 return NULL;
5442 }
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005443#endif
Victor Stinner97b89882010-05-06 00:25:39 +00005444 /* Install the first arg and newstr in posix_putenv_garbage;
5445 * this will cause previous value to be collected. This has to
5446 * happen after the real putenv() call because the old value
5447 * was still accessible until then. */
5448 if (PyDict_SetItem(posix_putenv_garbage,
5449 PyTuple_GET_ITEM(args, 0), newstr)) {
5450 /* really not much we can do; just leak */
5451 PyErr_Clear();
5452 }
5453 else {
5454 Py_DECREF(newstr);
5455 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00005456
5457#if defined(PYOS_OS2)
5458 }
5459#endif
Martin v. Löwis011e8422009-05-05 04:43:17 +00005460#ifndef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00005461 release_bytes(os1);
5462 release_bytes(os2);
Martin v. Löwis011e8422009-05-05 04:43:17 +00005463#endif
Victor Stinner97b89882010-05-06 00:25:39 +00005464 Py_INCREF(Py_None);
5465 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005466}
Guido van Rossumb6a47161997-09-15 22:54:34 +00005467#endif /* putenv */
5468
Guido van Rossumc524d952001-10-19 01:31:59 +00005469#ifdef HAVE_UNSETENV
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005470PyDoc_STRVAR(posix_unsetenv__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005471"unsetenv(key)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005472Delete an environment variable.");
Guido van Rossumc524d952001-10-19 01:31:59 +00005473
5474static PyObject *
5475posix_unsetenv(PyObject *self, PyObject *args)
5476{
Victor Stinner97b89882010-05-06 00:25:39 +00005477 char *s1;
Guido van Rossumc524d952001-10-19 01:31:59 +00005478
Victor Stinner97b89882010-05-06 00:25:39 +00005479 if (!PyArg_ParseTuple(args, "s:unsetenv", &s1))
5480 return NULL;
Guido van Rossumc524d952001-10-19 01:31:59 +00005481
Victor Stinner97b89882010-05-06 00:25:39 +00005482 unsetenv(s1);
Guido van Rossumc524d952001-10-19 01:31:59 +00005483
Victor Stinner97b89882010-05-06 00:25:39 +00005484 /* Remove the key from posix_putenv_garbage;
5485 * this will cause it to be collected. This has to
5486 * happen after the real unsetenv() call because the
5487 * old value was still accessible until then.
5488 */
5489 if (PyDict_DelItem(posix_putenv_garbage,
5490 PyTuple_GET_ITEM(args, 0))) {
5491 /* really not much we can do; just leak */
5492 PyErr_Clear();
5493 }
Guido van Rossumc524d952001-10-19 01:31:59 +00005494
Victor Stinner97b89882010-05-06 00:25:39 +00005495 Py_INCREF(Py_None);
5496 return Py_None;
Guido van Rossumc524d952001-10-19 01:31:59 +00005497}
5498#endif /* unsetenv */
5499
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005500PyDoc_STRVAR(posix_strerror__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005501"strerror(code) -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005502Translate an error code to a message string.");
Guido van Rossumb6a47161997-09-15 22:54:34 +00005503
Guido van Rossumf68d8e52001-04-14 17:55:09 +00005504static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005505posix_strerror(PyObject *self, PyObject *args)
Guido van Rossumb6a47161997-09-15 22:54:34 +00005506{
Victor Stinner97b89882010-05-06 00:25:39 +00005507 int code;
5508 char *message;
5509 if (!PyArg_ParseTuple(args, "i:strerror", &code))
5510 return NULL;
5511 message = strerror(code);
5512 if (message == NULL) {
5513 PyErr_SetString(PyExc_ValueError,
5514 "strerror() argument out of range");
5515 return NULL;
5516 }
5517 return PyUnicode_FromString(message);
Guido van Rossumb6a47161997-09-15 22:54:34 +00005518}
Guido van Rossumb6a47161997-09-15 22:54:34 +00005519
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005520
Guido van Rossumc9641791998-08-04 15:26:23 +00005521#ifdef HAVE_SYS_WAIT_H
5522
Fred Drake106c1a02002-04-23 15:58:02 +00005523#ifdef WCOREDUMP
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005524PyDoc_STRVAR(posix_WCOREDUMP__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005525"WCOREDUMP(status) -> bool\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005526Return True if the process returning 'status' was dumped to a core file.");
Fred Drake106c1a02002-04-23 15:58:02 +00005527
5528static PyObject *
5529posix_WCOREDUMP(PyObject *self, PyObject *args)
5530{
Victor Stinner97b89882010-05-06 00:25:39 +00005531 WAIT_TYPE status;
5532 WAIT_STATUS_INT(status) = 0;
Fred Drake106c1a02002-04-23 15:58:02 +00005533
Victor Stinner97b89882010-05-06 00:25:39 +00005534 if (!PyArg_ParseTuple(args, "i:WCOREDUMP", &WAIT_STATUS_INT(status)))
5535 return NULL;
Fred Drake106c1a02002-04-23 15:58:02 +00005536
Victor Stinner97b89882010-05-06 00:25:39 +00005537 return PyBool_FromLong(WCOREDUMP(status));
Fred Drake106c1a02002-04-23 15:58:02 +00005538}
5539#endif /* WCOREDUMP */
5540
5541#ifdef WIFCONTINUED
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005542PyDoc_STRVAR(posix_WIFCONTINUED__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005543"WIFCONTINUED(status) -> bool\n\n\
Fred Drake106c1a02002-04-23 15:58:02 +00005544Return True if the process returning 'status' was continued from a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005545job control stop.");
Fred Drake106c1a02002-04-23 15:58:02 +00005546
5547static PyObject *
Martin v. Löwis2b41b0d2002-05-04 13:13:41 +00005548posix_WIFCONTINUED(PyObject *self, PyObject *args)
Fred Drake106c1a02002-04-23 15:58:02 +00005549{
Victor Stinner97b89882010-05-06 00:25:39 +00005550 WAIT_TYPE status;
5551 WAIT_STATUS_INT(status) = 0;
Fred Drake106c1a02002-04-23 15:58:02 +00005552
Victor Stinner97b89882010-05-06 00:25:39 +00005553 if (!PyArg_ParseTuple(args, "i:WCONTINUED", &WAIT_STATUS_INT(status)))
5554 return NULL;
Fred Drake106c1a02002-04-23 15:58:02 +00005555
Victor Stinner97b89882010-05-06 00:25:39 +00005556 return PyBool_FromLong(WIFCONTINUED(status));
Fred Drake106c1a02002-04-23 15:58:02 +00005557}
5558#endif /* WIFCONTINUED */
5559
Guido van Rossumc9641791998-08-04 15:26:23 +00005560#ifdef WIFSTOPPED
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005561PyDoc_STRVAR(posix_WIFSTOPPED__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005562"WIFSTOPPED(status) -> bool\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005563Return True if the process returning 'status' was stopped.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005564
5565static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005566posix_WIFSTOPPED(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005567{
Victor Stinner97b89882010-05-06 00:25:39 +00005568 WAIT_TYPE status;
5569 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005570
Victor Stinner97b89882010-05-06 00:25:39 +00005571 if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &WAIT_STATUS_INT(status)))
5572 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005573
Victor Stinner97b89882010-05-06 00:25:39 +00005574 return PyBool_FromLong(WIFSTOPPED(status));
Guido van Rossumc9641791998-08-04 15:26:23 +00005575}
5576#endif /* WIFSTOPPED */
5577
5578#ifdef WIFSIGNALED
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005579PyDoc_STRVAR(posix_WIFSIGNALED__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005580"WIFSIGNALED(status) -> bool\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005581Return True if the process returning 'status' was terminated by a signal.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005582
5583static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005584posix_WIFSIGNALED(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005585{
Victor Stinner97b89882010-05-06 00:25:39 +00005586 WAIT_TYPE status;
5587 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005588
Victor Stinner97b89882010-05-06 00:25:39 +00005589 if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &WAIT_STATUS_INT(status)))
5590 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005591
Victor Stinner97b89882010-05-06 00:25:39 +00005592 return PyBool_FromLong(WIFSIGNALED(status));
Guido van Rossumc9641791998-08-04 15:26:23 +00005593}
5594#endif /* WIFSIGNALED */
5595
5596#ifdef WIFEXITED
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005597PyDoc_STRVAR(posix_WIFEXITED__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005598"WIFEXITED(status) -> bool\n\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00005599Return true if the process returning 'status' exited using the exit()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005600system call.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005601
5602static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005603posix_WIFEXITED(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005604{
Victor Stinner97b89882010-05-06 00:25:39 +00005605 WAIT_TYPE status;
5606 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005607
Victor Stinner97b89882010-05-06 00:25:39 +00005608 if (!PyArg_ParseTuple(args, "i:WIFEXITED", &WAIT_STATUS_INT(status)))
5609 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005610
Victor Stinner97b89882010-05-06 00:25:39 +00005611 return PyBool_FromLong(WIFEXITED(status));
Guido van Rossumc9641791998-08-04 15:26:23 +00005612}
5613#endif /* WIFEXITED */
5614
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00005615#ifdef WEXITSTATUS
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005616PyDoc_STRVAR(posix_WEXITSTATUS__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005617"WEXITSTATUS(status) -> integer\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005618Return the process return code from 'status'.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005619
5620static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005621posix_WEXITSTATUS(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005622{
Victor Stinner97b89882010-05-06 00:25:39 +00005623 WAIT_TYPE status;
5624 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005625
Victor Stinner97b89882010-05-06 00:25:39 +00005626 if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &WAIT_STATUS_INT(status)))
5627 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005628
Victor Stinner97b89882010-05-06 00:25:39 +00005629 return Py_BuildValue("i", WEXITSTATUS(status));
Guido van Rossumc9641791998-08-04 15:26:23 +00005630}
5631#endif /* WEXITSTATUS */
5632
5633#ifdef WTERMSIG
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005634PyDoc_STRVAR(posix_WTERMSIG__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005635"WTERMSIG(status) -> integer\n\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00005636Return the signal that terminated the process that provided the 'status'\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005637value.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005638
5639static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005640posix_WTERMSIG(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005641{
Victor Stinner97b89882010-05-06 00:25:39 +00005642 WAIT_TYPE status;
5643 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005644
Victor Stinner97b89882010-05-06 00:25:39 +00005645 if (!PyArg_ParseTuple(args, "i:WTERMSIG", &WAIT_STATUS_INT(status)))
5646 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005647
Victor Stinner97b89882010-05-06 00:25:39 +00005648 return Py_BuildValue("i", WTERMSIG(status));
Guido van Rossumc9641791998-08-04 15:26:23 +00005649}
5650#endif /* WTERMSIG */
5651
5652#ifdef WSTOPSIG
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005653PyDoc_STRVAR(posix_WSTOPSIG__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005654"WSTOPSIG(status) -> integer\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005655Return the signal that stopped the process that provided\n\
5656the 'status' value.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005657
5658static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005659posix_WSTOPSIG(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005660{
Victor Stinner97b89882010-05-06 00:25:39 +00005661 WAIT_TYPE status;
5662 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005663
Victor Stinner97b89882010-05-06 00:25:39 +00005664 if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &WAIT_STATUS_INT(status)))
5665 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005666
Victor Stinner97b89882010-05-06 00:25:39 +00005667 return Py_BuildValue("i", WSTOPSIG(status));
Guido van Rossumc9641791998-08-04 15:26:23 +00005668}
5669#endif /* WSTOPSIG */
5670
5671#endif /* HAVE_SYS_WAIT_H */
5672
5673
Thomas Wouters477c8d52006-05-27 19:21:47 +00005674#if defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H)
Guido van Rossumd5753e11999-10-19 13:29:23 +00005675#ifdef _SCO_DS
5676/* SCO OpenServer 5.0 and later requires _SVID3 before it reveals the
5677 needed definitions in sys/statvfs.h */
5678#define _SVID3
5679#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00005680#include <sys/statvfs.h>
5681
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005682static PyObject*
5683_pystatvfs_fromstructstatvfs(struct statvfs st) {
Victor Stinner97b89882010-05-06 00:25:39 +00005684 PyObject *v = PyStructSequence_New(&StatVFSResultType);
5685 if (v == NULL)
5686 return NULL;
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005687
5688#if !defined(HAVE_LARGEFILE_SUPPORT)
Victor Stinner97b89882010-05-06 00:25:39 +00005689 PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize));
5690 PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize));
5691 PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long) st.f_blocks));
5692 PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long) st.f_bfree));
5693 PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong((long) st.f_bavail));
5694 PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong((long) st.f_files));
5695 PyStructSequence_SET_ITEM(v, 6, PyLong_FromLong((long) st.f_ffree));
5696 PyStructSequence_SET_ITEM(v, 7, PyLong_FromLong((long) st.f_favail));
5697 PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag));
5698 PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax));
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005699#else
Victor Stinner97b89882010-05-06 00:25:39 +00005700 PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize));
5701 PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize));
5702 PyStructSequence_SET_ITEM(v, 2,
5703 PyLong_FromLongLong((PY_LONG_LONG) st.f_blocks));
5704 PyStructSequence_SET_ITEM(v, 3,
5705 PyLong_FromLongLong((PY_LONG_LONG) st.f_bfree));
5706 PyStructSequence_SET_ITEM(v, 4,
5707 PyLong_FromLongLong((PY_LONG_LONG) st.f_bavail));
5708 PyStructSequence_SET_ITEM(v, 5,
5709 PyLong_FromLongLong((PY_LONG_LONG) st.f_files));
5710 PyStructSequence_SET_ITEM(v, 6,
5711 PyLong_FromLongLong((PY_LONG_LONG) st.f_ffree));
5712 PyStructSequence_SET_ITEM(v, 7,
5713 PyLong_FromLongLong((PY_LONG_LONG) st.f_favail));
5714 PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag));
5715 PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax));
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005716#endif
5717
Victor Stinner97b89882010-05-06 00:25:39 +00005718 return v;
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005719}
5720
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005721PyDoc_STRVAR(posix_fstatvfs__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005722"fstatvfs(fd) -> statvfs result\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005723Perform an fstatvfs system call on the given fd.");
Guido van Rossum94f6f721999-01-06 18:42:14 +00005724
5725static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005726posix_fstatvfs(PyObject *self, PyObject *args)
Guido van Rossum94f6f721999-01-06 18:42:14 +00005727{
Victor Stinner97b89882010-05-06 00:25:39 +00005728 int fd, res;
5729 struct statvfs st;
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005730
Victor Stinner97b89882010-05-06 00:25:39 +00005731 if (!PyArg_ParseTuple(args, "i:fstatvfs", &fd))
5732 return NULL;
5733 Py_BEGIN_ALLOW_THREADS
5734 res = fstatvfs(fd, &st);
5735 Py_END_ALLOW_THREADS
5736 if (res != 0)
5737 return posix_error();
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005738
Victor Stinner97b89882010-05-06 00:25:39 +00005739 return _pystatvfs_fromstructstatvfs(st);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005740}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005741#endif /* HAVE_FSTATVFS && HAVE_SYS_STATVFS_H */
Guido van Rossum94f6f721999-01-06 18:42:14 +00005742
5743
Thomas Wouters477c8d52006-05-27 19:21:47 +00005744#if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H)
Guido van Rossum94f6f721999-01-06 18:42:14 +00005745#include <sys/statvfs.h>
5746
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005747PyDoc_STRVAR(posix_statvfs__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005748"statvfs(path) -> statvfs result\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005749Perform a statvfs system call on the given path.");
Guido van Rossum94f6f721999-01-06 18:42:14 +00005750
5751static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005752posix_statvfs(PyObject *self, PyObject *args)
Guido van Rossum94f6f721999-01-06 18:42:14 +00005753{
Victor Stinner97b89882010-05-06 00:25:39 +00005754 char *path;
5755 int res;
5756 struct statvfs st;
5757 if (!PyArg_ParseTuple(args, "s:statvfs", &path))
5758 return NULL;
5759 Py_BEGIN_ALLOW_THREADS
5760 res = statvfs(path, &st);
5761 Py_END_ALLOW_THREADS
5762 if (res != 0)
5763 return posix_error_with_filename(path);
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005764
Victor Stinner97b89882010-05-06 00:25:39 +00005765 return _pystatvfs_fromstructstatvfs(st);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005766}
5767#endif /* HAVE_STATVFS */
5768
Fred Drakec9680921999-12-13 16:37:25 +00005769/* This is used for fpathconf(), pathconf(), confstr() and sysconf().
5770 * It maps strings representing configuration variable names to
5771 * integer values, allowing those functions to be called with the
Thomas Wouters7e474022000-07-16 12:04:32 +00005772 * magic names instead of polluting the module's namespace with tons of
Fred Drake12c6e2d1999-12-14 21:25:03 +00005773 * rarely-used constants. There are three separate tables that use
5774 * these definitions.
Fred Drakebec628d1999-12-15 18:31:10 +00005775 *
5776 * This code is always included, even if none of the interfaces that
5777 * need it are included. The #if hackery needed to avoid it would be
5778 * sufficiently pervasive that it's not worth the loss of readability.
Fred Drakec9680921999-12-13 16:37:25 +00005779 */
5780struct constdef {
5781 char *name;
5782 long value;
5783};
5784
Fred Drake12c6e2d1999-12-14 21:25:03 +00005785static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005786conv_confname(PyObject *arg, int *valuep, struct constdef *table,
Guido van Rossum7d5baac2007-08-27 23:24:46 +00005787 size_t tablesize)
Fred Drake12c6e2d1999-12-14 21:25:03 +00005788{
Christian Heimes217cfd12007-12-02 14:31:20 +00005789 if (PyLong_Check(arg)) {
Victor Stinner97b89882010-05-06 00:25:39 +00005790 *valuep = PyLong_AS_LONG(arg);
5791 return 1;
Fred Drake12c6e2d1999-12-14 21:25:03 +00005792 }
Guido van Rossumbce56a62007-05-10 18:04:33 +00005793 else {
Victor Stinner97b89882010-05-06 00:25:39 +00005794 /* look up the value in the table using a binary search */
5795 size_t lo = 0;
5796 size_t mid;
5797 size_t hi = tablesize;
5798 int cmp;
5799 const char *confname;
5800 if (!PyUnicode_Check(arg)) {
5801 PyErr_SetString(PyExc_TypeError,
5802 "configuration names must be strings or integers");
Guido van Rossumbce56a62007-05-10 18:04:33 +00005803 return 0;
Fred Drake12c6e2d1999-12-14 21:25:03 +00005804 }
Victor Stinner97b89882010-05-06 00:25:39 +00005805 confname = _PyUnicode_AsString(arg);
5806 if (confname == NULL)
5807 return 0;
5808 while (lo < hi) {
5809 mid = (lo + hi) / 2;
5810 cmp = strcmp(confname, table[mid].name);
5811 if (cmp < 0)
5812 hi = mid;
5813 else if (cmp > 0)
5814 lo = mid + 1;
5815 else {
5816 *valuep = table[mid].value;
5817 return 1;
5818 }
5819 }
5820 PyErr_SetString(PyExc_ValueError, "unrecognized configuration name");
5821 return 0;
5822 }
Fred Drake12c6e2d1999-12-14 21:25:03 +00005823}
5824
5825
5826#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
5827static struct constdef posix_constants_pathconf[] = {
Fred Draked86ed291999-12-15 15:34:33 +00005828#ifdef _PC_ABI_AIO_XFER_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00005829 {"PC_ABI_AIO_XFER_MAX", _PC_ABI_AIO_XFER_MAX},
Fred Draked86ed291999-12-15 15:34:33 +00005830#endif
5831#ifdef _PC_ABI_ASYNC_IO
Victor Stinner97b89882010-05-06 00:25:39 +00005832 {"PC_ABI_ASYNC_IO", _PC_ABI_ASYNC_IO},
Fred Draked86ed291999-12-15 15:34:33 +00005833#endif
Fred Drakec9680921999-12-13 16:37:25 +00005834#ifdef _PC_ASYNC_IO
Victor Stinner97b89882010-05-06 00:25:39 +00005835 {"PC_ASYNC_IO", _PC_ASYNC_IO},
Fred Drakec9680921999-12-13 16:37:25 +00005836#endif
5837#ifdef _PC_CHOWN_RESTRICTED
Victor Stinner97b89882010-05-06 00:25:39 +00005838 {"PC_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED},
Fred Drakec9680921999-12-13 16:37:25 +00005839#endif
5840#ifdef _PC_FILESIZEBITS
Victor Stinner97b89882010-05-06 00:25:39 +00005841 {"PC_FILESIZEBITS", _PC_FILESIZEBITS},
Fred Drakec9680921999-12-13 16:37:25 +00005842#endif
5843#ifdef _PC_LAST
Victor Stinner97b89882010-05-06 00:25:39 +00005844 {"PC_LAST", _PC_LAST},
Fred Drakec9680921999-12-13 16:37:25 +00005845#endif
5846#ifdef _PC_LINK_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00005847 {"PC_LINK_MAX", _PC_LINK_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00005848#endif
5849#ifdef _PC_MAX_CANON
Victor Stinner97b89882010-05-06 00:25:39 +00005850 {"PC_MAX_CANON", _PC_MAX_CANON},
Fred Drakec9680921999-12-13 16:37:25 +00005851#endif
5852#ifdef _PC_MAX_INPUT
Victor Stinner97b89882010-05-06 00:25:39 +00005853 {"PC_MAX_INPUT", _PC_MAX_INPUT},
Fred Drakec9680921999-12-13 16:37:25 +00005854#endif
5855#ifdef _PC_NAME_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00005856 {"PC_NAME_MAX", _PC_NAME_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00005857#endif
5858#ifdef _PC_NO_TRUNC
Victor Stinner97b89882010-05-06 00:25:39 +00005859 {"PC_NO_TRUNC", _PC_NO_TRUNC},
Fred Drakec9680921999-12-13 16:37:25 +00005860#endif
5861#ifdef _PC_PATH_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00005862 {"PC_PATH_MAX", _PC_PATH_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00005863#endif
5864#ifdef _PC_PIPE_BUF
Victor Stinner97b89882010-05-06 00:25:39 +00005865 {"PC_PIPE_BUF", _PC_PIPE_BUF},
Fred Drakec9680921999-12-13 16:37:25 +00005866#endif
5867#ifdef _PC_PRIO_IO
Victor Stinner97b89882010-05-06 00:25:39 +00005868 {"PC_PRIO_IO", _PC_PRIO_IO},
Fred Drakec9680921999-12-13 16:37:25 +00005869#endif
5870#ifdef _PC_SOCK_MAXBUF
Victor Stinner97b89882010-05-06 00:25:39 +00005871 {"PC_SOCK_MAXBUF", _PC_SOCK_MAXBUF},
Fred Drakec9680921999-12-13 16:37:25 +00005872#endif
5873#ifdef _PC_SYNC_IO
Victor Stinner97b89882010-05-06 00:25:39 +00005874 {"PC_SYNC_IO", _PC_SYNC_IO},
Fred Drakec9680921999-12-13 16:37:25 +00005875#endif
5876#ifdef _PC_VDISABLE
Victor Stinner97b89882010-05-06 00:25:39 +00005877 {"PC_VDISABLE", _PC_VDISABLE},
Fred Drakec9680921999-12-13 16:37:25 +00005878#endif
5879};
5880
Fred Drakec9680921999-12-13 16:37:25 +00005881static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005882conv_path_confname(PyObject *arg, int *valuep)
Fred Drakec9680921999-12-13 16:37:25 +00005883{
5884 return conv_confname(arg, valuep, posix_constants_pathconf,
5885 sizeof(posix_constants_pathconf)
5886 / sizeof(struct constdef));
5887}
5888#endif
5889
5890#ifdef HAVE_FPATHCONF
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005891PyDoc_STRVAR(posix_fpathconf__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005892"fpathconf(fd, name) -> integer\n\n\
Fred Drakec9680921999-12-13 16:37:25 +00005893Return the configuration limit name for the file descriptor fd.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005894If there is no limit, return -1.");
Fred Drakec9680921999-12-13 16:37:25 +00005895
5896static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005897posix_fpathconf(PyObject *self, PyObject *args)
Fred Drakec9680921999-12-13 16:37:25 +00005898{
5899 PyObject *result = NULL;
5900 int name, fd;
5901
Fred Drake12c6e2d1999-12-14 21:25:03 +00005902 if (PyArg_ParseTuple(args, "iO&:fpathconf", &fd,
5903 conv_path_confname, &name)) {
Victor Stinner97b89882010-05-06 00:25:39 +00005904 long limit;
Fred Drakec9680921999-12-13 16:37:25 +00005905
Victor Stinner97b89882010-05-06 00:25:39 +00005906 errno = 0;
5907 limit = fpathconf(fd, name);
5908 if (limit == -1 && errno != 0)
5909 posix_error();
5910 else
5911 result = PyLong_FromLong(limit);
Fred Drakec9680921999-12-13 16:37:25 +00005912 }
5913 return result;
5914}
5915#endif
5916
5917
5918#ifdef HAVE_PATHCONF
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005919PyDoc_STRVAR(posix_pathconf__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005920"pathconf(path, name) -> integer\n\n\
Fred Drakec9680921999-12-13 16:37:25 +00005921Return the configuration limit name for the file or directory path.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005922If there is no limit, return -1.");
Fred Drakec9680921999-12-13 16:37:25 +00005923
5924static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005925posix_pathconf(PyObject *self, PyObject *args)
Fred Drakec9680921999-12-13 16:37:25 +00005926{
5927 PyObject *result = NULL;
5928 int name;
5929 char *path;
5930
5931 if (PyArg_ParseTuple(args, "sO&:pathconf", &path,
5932 conv_path_confname, &name)) {
Victor Stinner97b89882010-05-06 00:25:39 +00005933 long limit;
Fred Drakec9680921999-12-13 16:37:25 +00005934
Victor Stinner97b89882010-05-06 00:25:39 +00005935 errno = 0;
5936 limit = pathconf(path, name);
5937 if (limit == -1 && errno != 0) {
5938 if (errno == EINVAL)
5939 /* could be a path or name problem */
5940 posix_error();
Fred Drakec9680921999-12-13 16:37:25 +00005941 else
Victor Stinner97b89882010-05-06 00:25:39 +00005942 posix_error_with_filename(path);
5943 }
5944 else
5945 result = PyLong_FromLong(limit);
Fred Drakec9680921999-12-13 16:37:25 +00005946 }
5947 return result;
5948}
5949#endif
5950
5951#ifdef HAVE_CONFSTR
5952static struct constdef posix_constants_confstr[] = {
Fred Draked86ed291999-12-15 15:34:33 +00005953#ifdef _CS_ARCHITECTURE
Victor Stinner97b89882010-05-06 00:25:39 +00005954 {"CS_ARCHITECTURE", _CS_ARCHITECTURE},
Fred Draked86ed291999-12-15 15:34:33 +00005955#endif
Mark Dickinson466e9262010-04-16 16:32:49 +00005956#ifdef _CS_GNU_LIBC_VERSION
Victor Stinner97b89882010-05-06 00:25:39 +00005957 {"CS_GNU_LIBC_VERSION", _CS_GNU_LIBC_VERSION},
Mark Dickinson466e9262010-04-16 16:32:49 +00005958#endif
5959#ifdef _CS_GNU_LIBPTHREAD_VERSION
Victor Stinner97b89882010-05-06 00:25:39 +00005960 {"CS_GNU_LIBPTHREAD_VERSION", _CS_GNU_LIBPTHREAD_VERSION},
Mark Dickinson466e9262010-04-16 16:32:49 +00005961#endif
Fred Draked86ed291999-12-15 15:34:33 +00005962#ifdef _CS_HOSTNAME
Victor Stinner97b89882010-05-06 00:25:39 +00005963 {"CS_HOSTNAME", _CS_HOSTNAME},
Fred Draked86ed291999-12-15 15:34:33 +00005964#endif
5965#ifdef _CS_HW_PROVIDER
Victor Stinner97b89882010-05-06 00:25:39 +00005966 {"CS_HW_PROVIDER", _CS_HW_PROVIDER},
Fred Draked86ed291999-12-15 15:34:33 +00005967#endif
5968#ifdef _CS_HW_SERIAL
Victor Stinner97b89882010-05-06 00:25:39 +00005969 {"CS_HW_SERIAL", _CS_HW_SERIAL},
Fred Draked86ed291999-12-15 15:34:33 +00005970#endif
5971#ifdef _CS_INITTAB_NAME
Victor Stinner97b89882010-05-06 00:25:39 +00005972 {"CS_INITTAB_NAME", _CS_INITTAB_NAME},
Fred Draked86ed291999-12-15 15:34:33 +00005973#endif
Fred Drakec9680921999-12-13 16:37:25 +00005974#ifdef _CS_LFS64_CFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00005975 {"CS_LFS64_CFLAGS", _CS_LFS64_CFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00005976#endif
5977#ifdef _CS_LFS64_LDFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00005978 {"CS_LFS64_LDFLAGS", _CS_LFS64_LDFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00005979#endif
5980#ifdef _CS_LFS64_LIBS
Victor Stinner97b89882010-05-06 00:25:39 +00005981 {"CS_LFS64_LIBS", _CS_LFS64_LIBS},
Fred Drakec9680921999-12-13 16:37:25 +00005982#endif
5983#ifdef _CS_LFS64_LINTFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00005984 {"CS_LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00005985#endif
5986#ifdef _CS_LFS_CFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00005987 {"CS_LFS_CFLAGS", _CS_LFS_CFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00005988#endif
5989#ifdef _CS_LFS_LDFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00005990 {"CS_LFS_LDFLAGS", _CS_LFS_LDFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00005991#endif
5992#ifdef _CS_LFS_LIBS
Victor Stinner97b89882010-05-06 00:25:39 +00005993 {"CS_LFS_LIBS", _CS_LFS_LIBS},
Fred Drakec9680921999-12-13 16:37:25 +00005994#endif
5995#ifdef _CS_LFS_LINTFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00005996 {"CS_LFS_LINTFLAGS", _CS_LFS_LINTFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00005997#endif
Fred Draked86ed291999-12-15 15:34:33 +00005998#ifdef _CS_MACHINE
Victor Stinner97b89882010-05-06 00:25:39 +00005999 {"CS_MACHINE", _CS_MACHINE},
Fred Draked86ed291999-12-15 15:34:33 +00006000#endif
Fred Drakec9680921999-12-13 16:37:25 +00006001#ifdef _CS_PATH
Victor Stinner97b89882010-05-06 00:25:39 +00006002 {"CS_PATH", _CS_PATH},
Fred Drakec9680921999-12-13 16:37:25 +00006003#endif
Fred Draked86ed291999-12-15 15:34:33 +00006004#ifdef _CS_RELEASE
Victor Stinner97b89882010-05-06 00:25:39 +00006005 {"CS_RELEASE", _CS_RELEASE},
Fred Draked86ed291999-12-15 15:34:33 +00006006#endif
6007#ifdef _CS_SRPC_DOMAIN
Victor Stinner97b89882010-05-06 00:25:39 +00006008 {"CS_SRPC_DOMAIN", _CS_SRPC_DOMAIN},
Fred Draked86ed291999-12-15 15:34:33 +00006009#endif
6010#ifdef _CS_SYSNAME
Victor Stinner97b89882010-05-06 00:25:39 +00006011 {"CS_SYSNAME", _CS_SYSNAME},
Fred Draked86ed291999-12-15 15:34:33 +00006012#endif
6013#ifdef _CS_VERSION
Victor Stinner97b89882010-05-06 00:25:39 +00006014 {"CS_VERSION", _CS_VERSION},
Fred Draked86ed291999-12-15 15:34:33 +00006015#endif
Fred Drakec9680921999-12-13 16:37:25 +00006016#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00006017 {"CS_XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00006018#endif
6019#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00006020 {"CS_XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00006021#endif
6022#ifdef _CS_XBS5_ILP32_OFF32_LIBS
Victor Stinner97b89882010-05-06 00:25:39 +00006023 {"CS_XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS},
Fred Drakec9680921999-12-13 16:37:25 +00006024#endif
6025#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00006026 {"CS_XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00006027#endif
6028#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00006029 {"CS_XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00006030#endif
6031#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00006032 {"CS_XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00006033#endif
6034#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS
Victor Stinner97b89882010-05-06 00:25:39 +00006035 {"CS_XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS},
Fred Drakec9680921999-12-13 16:37:25 +00006036#endif
6037#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00006038 {"CS_XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00006039#endif
6040#ifdef _CS_XBS5_LP64_OFF64_CFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00006041 {"CS_XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00006042#endif
6043#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00006044 {"CS_XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00006045#endif
6046#ifdef _CS_XBS5_LP64_OFF64_LIBS
Victor Stinner97b89882010-05-06 00:25:39 +00006047 {"CS_XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS},
Fred Drakec9680921999-12-13 16:37:25 +00006048#endif
6049#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00006050 {"CS_XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00006051#endif
6052#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00006053 {"CS_XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00006054#endif
6055#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00006056 {"CS_XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00006057#endif
6058#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS
Victor Stinner97b89882010-05-06 00:25:39 +00006059 {"CS_XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS},
Fred Drakec9680921999-12-13 16:37:25 +00006060#endif
6061#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00006062 {"CS_XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS},
Fred Drakec9680921999-12-13 16:37:25 +00006063#endif
Fred Draked86ed291999-12-15 15:34:33 +00006064#ifdef _MIPS_CS_AVAIL_PROCESSORS
Victor Stinner97b89882010-05-06 00:25:39 +00006065 {"MIPS_CS_AVAIL_PROCESSORS", _MIPS_CS_AVAIL_PROCESSORS},
Fred Draked86ed291999-12-15 15:34:33 +00006066#endif
6067#ifdef _MIPS_CS_BASE
Victor Stinner97b89882010-05-06 00:25:39 +00006068 {"MIPS_CS_BASE", _MIPS_CS_BASE},
Fred Draked86ed291999-12-15 15:34:33 +00006069#endif
6070#ifdef _MIPS_CS_HOSTID
Victor Stinner97b89882010-05-06 00:25:39 +00006071 {"MIPS_CS_HOSTID", _MIPS_CS_HOSTID},
Fred Draked86ed291999-12-15 15:34:33 +00006072#endif
6073#ifdef _MIPS_CS_HW_NAME
Victor Stinner97b89882010-05-06 00:25:39 +00006074 {"MIPS_CS_HW_NAME", _MIPS_CS_HW_NAME},
Fred Draked86ed291999-12-15 15:34:33 +00006075#endif
6076#ifdef _MIPS_CS_NUM_PROCESSORS
Victor Stinner97b89882010-05-06 00:25:39 +00006077 {"MIPS_CS_NUM_PROCESSORS", _MIPS_CS_NUM_PROCESSORS},
Fred Draked86ed291999-12-15 15:34:33 +00006078#endif
6079#ifdef _MIPS_CS_OSREL_MAJ
Victor Stinner97b89882010-05-06 00:25:39 +00006080 {"MIPS_CS_OSREL_MAJ", _MIPS_CS_OSREL_MAJ},
Fred Draked86ed291999-12-15 15:34:33 +00006081#endif
6082#ifdef _MIPS_CS_OSREL_MIN
Victor Stinner97b89882010-05-06 00:25:39 +00006083 {"MIPS_CS_OSREL_MIN", _MIPS_CS_OSREL_MIN},
Fred Draked86ed291999-12-15 15:34:33 +00006084#endif
6085#ifdef _MIPS_CS_OSREL_PATCH
Victor Stinner97b89882010-05-06 00:25:39 +00006086 {"MIPS_CS_OSREL_PATCH", _MIPS_CS_OSREL_PATCH},
Fred Draked86ed291999-12-15 15:34:33 +00006087#endif
6088#ifdef _MIPS_CS_OS_NAME
Victor Stinner97b89882010-05-06 00:25:39 +00006089 {"MIPS_CS_OS_NAME", _MIPS_CS_OS_NAME},
Fred Draked86ed291999-12-15 15:34:33 +00006090#endif
6091#ifdef _MIPS_CS_OS_PROVIDER
Victor Stinner97b89882010-05-06 00:25:39 +00006092 {"MIPS_CS_OS_PROVIDER", _MIPS_CS_OS_PROVIDER},
Fred Draked86ed291999-12-15 15:34:33 +00006093#endif
6094#ifdef _MIPS_CS_PROCESSORS
Victor Stinner97b89882010-05-06 00:25:39 +00006095 {"MIPS_CS_PROCESSORS", _MIPS_CS_PROCESSORS},
Fred Draked86ed291999-12-15 15:34:33 +00006096#endif
6097#ifdef _MIPS_CS_SERIAL
Victor Stinner97b89882010-05-06 00:25:39 +00006098 {"MIPS_CS_SERIAL", _MIPS_CS_SERIAL},
Fred Draked86ed291999-12-15 15:34:33 +00006099#endif
6100#ifdef _MIPS_CS_VENDOR
Victor Stinner97b89882010-05-06 00:25:39 +00006101 {"MIPS_CS_VENDOR", _MIPS_CS_VENDOR},
Fred Draked86ed291999-12-15 15:34:33 +00006102#endif
Fred Drakec9680921999-12-13 16:37:25 +00006103};
6104
6105static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006106conv_confstr_confname(PyObject *arg, int *valuep)
Fred Drakec9680921999-12-13 16:37:25 +00006107{
6108 return conv_confname(arg, valuep, posix_constants_confstr,
6109 sizeof(posix_constants_confstr)
6110 / sizeof(struct constdef));
6111}
6112
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006113PyDoc_STRVAR(posix_confstr__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00006114"confstr(name) -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006115Return a string-valued system configuration variable.");
Fred Drakec9680921999-12-13 16:37:25 +00006116
6117static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006118posix_confstr(PyObject *self, PyObject *args)
Fred Drakec9680921999-12-13 16:37:25 +00006119{
6120 PyObject *result = NULL;
6121 int name;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006122 char buffer[256];
Fred Drakec9680921999-12-13 16:37:25 +00006123
6124 if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) {
Victor Stinner97b89882010-05-06 00:25:39 +00006125 int len;
Fred Drakec9680921999-12-13 16:37:25 +00006126
Fred Drakec9680921999-12-13 16:37:25 +00006127 errno = 0;
Victor Stinner97b89882010-05-06 00:25:39 +00006128 len = confstr(name, buffer, sizeof(buffer));
6129 if (len == 0) {
6130 if (errno) {
6131 posix_error();
6132 }
6133 else {
6134 result = Py_None;
6135 Py_INCREF(Py_None);
6136 }
Fred Drakec9680921999-12-13 16:37:25 +00006137 }
6138 else {
Victor Stinner97b89882010-05-06 00:25:39 +00006139 if ((unsigned int)len >= sizeof(buffer)) {
Neal Norwitz93c56822007-08-26 07:10:06 +00006140 result = PyUnicode_FromStringAndSize(NULL, len-1);
Fred Drakec9680921999-12-13 16:37:25 +00006141 if (result != NULL)
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00006142 confstr(name, _PyUnicode_AsString(result), len);
Fred Drakec9680921999-12-13 16:37:25 +00006143 }
6144 else
Neal Norwitz93c56822007-08-26 07:10:06 +00006145 result = PyUnicode_FromStringAndSize(buffer, len-1);
Fred Drakec9680921999-12-13 16:37:25 +00006146 }
6147 }
6148 return result;
6149}
6150#endif
6151
6152
6153#ifdef HAVE_SYSCONF
6154static struct constdef posix_constants_sysconf[] = {
6155#ifdef _SC_2_CHAR_TERM
Victor Stinner97b89882010-05-06 00:25:39 +00006156 {"SC_2_CHAR_TERM", _SC_2_CHAR_TERM},
Fred Drakec9680921999-12-13 16:37:25 +00006157#endif
6158#ifdef _SC_2_C_BIND
Victor Stinner97b89882010-05-06 00:25:39 +00006159 {"SC_2_C_BIND", _SC_2_C_BIND},
Fred Drakec9680921999-12-13 16:37:25 +00006160#endif
6161#ifdef _SC_2_C_DEV
Victor Stinner97b89882010-05-06 00:25:39 +00006162 {"SC_2_C_DEV", _SC_2_C_DEV},
Fred Drakec9680921999-12-13 16:37:25 +00006163#endif
6164#ifdef _SC_2_C_VERSION
Victor Stinner97b89882010-05-06 00:25:39 +00006165 {"SC_2_C_VERSION", _SC_2_C_VERSION},
Fred Drakec9680921999-12-13 16:37:25 +00006166#endif
6167#ifdef _SC_2_FORT_DEV
Victor Stinner97b89882010-05-06 00:25:39 +00006168 {"SC_2_FORT_DEV", _SC_2_FORT_DEV},
Fred Drakec9680921999-12-13 16:37:25 +00006169#endif
6170#ifdef _SC_2_FORT_RUN
Victor Stinner97b89882010-05-06 00:25:39 +00006171 {"SC_2_FORT_RUN", _SC_2_FORT_RUN},
Fred Drakec9680921999-12-13 16:37:25 +00006172#endif
6173#ifdef _SC_2_LOCALEDEF
Victor Stinner97b89882010-05-06 00:25:39 +00006174 {"SC_2_LOCALEDEF", _SC_2_LOCALEDEF},
Fred Drakec9680921999-12-13 16:37:25 +00006175#endif
6176#ifdef _SC_2_SW_DEV
Victor Stinner97b89882010-05-06 00:25:39 +00006177 {"SC_2_SW_DEV", _SC_2_SW_DEV},
Fred Drakec9680921999-12-13 16:37:25 +00006178#endif
6179#ifdef _SC_2_UPE
Victor Stinner97b89882010-05-06 00:25:39 +00006180 {"SC_2_UPE", _SC_2_UPE},
Fred Drakec9680921999-12-13 16:37:25 +00006181#endif
6182#ifdef _SC_2_VERSION
Victor Stinner97b89882010-05-06 00:25:39 +00006183 {"SC_2_VERSION", _SC_2_VERSION},
Fred Drakec9680921999-12-13 16:37:25 +00006184#endif
Fred Draked86ed291999-12-15 15:34:33 +00006185#ifdef _SC_ABI_ASYNCHRONOUS_IO
Victor Stinner97b89882010-05-06 00:25:39 +00006186 {"SC_ABI_ASYNCHRONOUS_IO", _SC_ABI_ASYNCHRONOUS_IO},
Fred Draked86ed291999-12-15 15:34:33 +00006187#endif
6188#ifdef _SC_ACL
Victor Stinner97b89882010-05-06 00:25:39 +00006189 {"SC_ACL", _SC_ACL},
Fred Draked86ed291999-12-15 15:34:33 +00006190#endif
Fred Drakec9680921999-12-13 16:37:25 +00006191#ifdef _SC_AIO_LISTIO_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006192 {"SC_AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006193#endif
Fred Drakec9680921999-12-13 16:37:25 +00006194#ifdef _SC_AIO_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006195 {"SC_AIO_MAX", _SC_AIO_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006196#endif
6197#ifdef _SC_AIO_PRIO_DELTA_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006198 {"SC_AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006199#endif
6200#ifdef _SC_ARG_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006201 {"SC_ARG_MAX", _SC_ARG_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006202#endif
6203#ifdef _SC_ASYNCHRONOUS_IO
Victor Stinner97b89882010-05-06 00:25:39 +00006204 {"SC_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO},
Fred Drakec9680921999-12-13 16:37:25 +00006205#endif
6206#ifdef _SC_ATEXIT_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006207 {"SC_ATEXIT_MAX", _SC_ATEXIT_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006208#endif
Fred Draked86ed291999-12-15 15:34:33 +00006209#ifdef _SC_AUDIT
Victor Stinner97b89882010-05-06 00:25:39 +00006210 {"SC_AUDIT", _SC_AUDIT},
Fred Draked86ed291999-12-15 15:34:33 +00006211#endif
Fred Drakec9680921999-12-13 16:37:25 +00006212#ifdef _SC_AVPHYS_PAGES
Victor Stinner97b89882010-05-06 00:25:39 +00006213 {"SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES},
Fred Drakec9680921999-12-13 16:37:25 +00006214#endif
6215#ifdef _SC_BC_BASE_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006216 {"SC_BC_BASE_MAX", _SC_BC_BASE_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006217#endif
6218#ifdef _SC_BC_DIM_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006219 {"SC_BC_DIM_MAX", _SC_BC_DIM_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006220#endif
6221#ifdef _SC_BC_SCALE_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006222 {"SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006223#endif
6224#ifdef _SC_BC_STRING_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006225 {"SC_BC_STRING_MAX", _SC_BC_STRING_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006226#endif
Fred Draked86ed291999-12-15 15:34:33 +00006227#ifdef _SC_CAP
Victor Stinner97b89882010-05-06 00:25:39 +00006228 {"SC_CAP", _SC_CAP},
Fred Draked86ed291999-12-15 15:34:33 +00006229#endif
Fred Drakec9680921999-12-13 16:37:25 +00006230#ifdef _SC_CHARCLASS_NAME_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006231 {"SC_CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006232#endif
6233#ifdef _SC_CHAR_BIT
Victor Stinner97b89882010-05-06 00:25:39 +00006234 {"SC_CHAR_BIT", _SC_CHAR_BIT},
Fred Drakec9680921999-12-13 16:37:25 +00006235#endif
6236#ifdef _SC_CHAR_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006237 {"SC_CHAR_MAX", _SC_CHAR_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006238#endif
6239#ifdef _SC_CHAR_MIN
Victor Stinner97b89882010-05-06 00:25:39 +00006240 {"SC_CHAR_MIN", _SC_CHAR_MIN},
Fred Drakec9680921999-12-13 16:37:25 +00006241#endif
6242#ifdef _SC_CHILD_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006243 {"SC_CHILD_MAX", _SC_CHILD_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006244#endif
6245#ifdef _SC_CLK_TCK
Victor Stinner97b89882010-05-06 00:25:39 +00006246 {"SC_CLK_TCK", _SC_CLK_TCK},
Fred Drakec9680921999-12-13 16:37:25 +00006247#endif
6248#ifdef _SC_COHER_BLKSZ
Victor Stinner97b89882010-05-06 00:25:39 +00006249 {"SC_COHER_BLKSZ", _SC_COHER_BLKSZ},
Fred Drakec9680921999-12-13 16:37:25 +00006250#endif
6251#ifdef _SC_COLL_WEIGHTS_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006252 {"SC_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006253#endif
6254#ifdef _SC_DCACHE_ASSOC
Victor Stinner97b89882010-05-06 00:25:39 +00006255 {"SC_DCACHE_ASSOC", _SC_DCACHE_ASSOC},
Fred Drakec9680921999-12-13 16:37:25 +00006256#endif
6257#ifdef _SC_DCACHE_BLKSZ
Victor Stinner97b89882010-05-06 00:25:39 +00006258 {"SC_DCACHE_BLKSZ", _SC_DCACHE_BLKSZ},
Fred Drakec9680921999-12-13 16:37:25 +00006259#endif
6260#ifdef _SC_DCACHE_LINESZ
Victor Stinner97b89882010-05-06 00:25:39 +00006261 {"SC_DCACHE_LINESZ", _SC_DCACHE_LINESZ},
Fred Drakec9680921999-12-13 16:37:25 +00006262#endif
6263#ifdef _SC_DCACHE_SZ
Victor Stinner97b89882010-05-06 00:25:39 +00006264 {"SC_DCACHE_SZ", _SC_DCACHE_SZ},
Fred Drakec9680921999-12-13 16:37:25 +00006265#endif
6266#ifdef _SC_DCACHE_TBLKSZ
Victor Stinner97b89882010-05-06 00:25:39 +00006267 {"SC_DCACHE_TBLKSZ", _SC_DCACHE_TBLKSZ},
Fred Drakec9680921999-12-13 16:37:25 +00006268#endif
6269#ifdef _SC_DELAYTIMER_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006270 {"SC_DELAYTIMER_MAX", _SC_DELAYTIMER_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006271#endif
6272#ifdef _SC_EQUIV_CLASS_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006273 {"SC_EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006274#endif
6275#ifdef _SC_EXPR_NEST_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006276 {"SC_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006277#endif
6278#ifdef _SC_FSYNC
Victor Stinner97b89882010-05-06 00:25:39 +00006279 {"SC_FSYNC", _SC_FSYNC},
Fred Drakec9680921999-12-13 16:37:25 +00006280#endif
6281#ifdef _SC_GETGR_R_SIZE_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006282 {"SC_GETGR_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006283#endif
6284#ifdef _SC_GETPW_R_SIZE_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006285 {"SC_GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006286#endif
6287#ifdef _SC_ICACHE_ASSOC
Victor Stinner97b89882010-05-06 00:25:39 +00006288 {"SC_ICACHE_ASSOC", _SC_ICACHE_ASSOC},
Fred Drakec9680921999-12-13 16:37:25 +00006289#endif
6290#ifdef _SC_ICACHE_BLKSZ
Victor Stinner97b89882010-05-06 00:25:39 +00006291 {"SC_ICACHE_BLKSZ", _SC_ICACHE_BLKSZ},
Fred Drakec9680921999-12-13 16:37:25 +00006292#endif
6293#ifdef _SC_ICACHE_LINESZ
Victor Stinner97b89882010-05-06 00:25:39 +00006294 {"SC_ICACHE_LINESZ", _SC_ICACHE_LINESZ},
Fred Drakec9680921999-12-13 16:37:25 +00006295#endif
6296#ifdef _SC_ICACHE_SZ
Victor Stinner97b89882010-05-06 00:25:39 +00006297 {"SC_ICACHE_SZ", _SC_ICACHE_SZ},
Fred Drakec9680921999-12-13 16:37:25 +00006298#endif
Fred Draked86ed291999-12-15 15:34:33 +00006299#ifdef _SC_INF
Victor Stinner97b89882010-05-06 00:25:39 +00006300 {"SC_INF", _SC_INF},
Fred Draked86ed291999-12-15 15:34:33 +00006301#endif
Fred Drakec9680921999-12-13 16:37:25 +00006302#ifdef _SC_INT_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006303 {"SC_INT_MAX", _SC_INT_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006304#endif
6305#ifdef _SC_INT_MIN
Victor Stinner97b89882010-05-06 00:25:39 +00006306 {"SC_INT_MIN", _SC_INT_MIN},
Fred Drakec9680921999-12-13 16:37:25 +00006307#endif
6308#ifdef _SC_IOV_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006309 {"SC_IOV_MAX", _SC_IOV_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006310#endif
Fred Draked86ed291999-12-15 15:34:33 +00006311#ifdef _SC_IP_SECOPTS
Victor Stinner97b89882010-05-06 00:25:39 +00006312 {"SC_IP_SECOPTS", _SC_IP_SECOPTS},
Fred Draked86ed291999-12-15 15:34:33 +00006313#endif
Fred Drakec9680921999-12-13 16:37:25 +00006314#ifdef _SC_JOB_CONTROL
Victor Stinner97b89882010-05-06 00:25:39 +00006315 {"SC_JOB_CONTROL", _SC_JOB_CONTROL},
Fred Drakec9680921999-12-13 16:37:25 +00006316#endif
Fred Draked86ed291999-12-15 15:34:33 +00006317#ifdef _SC_KERN_POINTERS
Victor Stinner97b89882010-05-06 00:25:39 +00006318 {"SC_KERN_POINTERS", _SC_KERN_POINTERS},
Fred Draked86ed291999-12-15 15:34:33 +00006319#endif
6320#ifdef _SC_KERN_SIM
Victor Stinner97b89882010-05-06 00:25:39 +00006321 {"SC_KERN_SIM", _SC_KERN_SIM},
Fred Draked86ed291999-12-15 15:34:33 +00006322#endif
Fred Drakec9680921999-12-13 16:37:25 +00006323#ifdef _SC_LINE_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006324 {"SC_LINE_MAX", _SC_LINE_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006325#endif
6326#ifdef _SC_LOGIN_NAME_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006327 {"SC_LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006328#endif
6329#ifdef _SC_LOGNAME_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006330 {"SC_LOGNAME_MAX", _SC_LOGNAME_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006331#endif
6332#ifdef _SC_LONG_BIT
Victor Stinner97b89882010-05-06 00:25:39 +00006333 {"SC_LONG_BIT", _SC_LONG_BIT},
Fred Drakec9680921999-12-13 16:37:25 +00006334#endif
Fred Draked86ed291999-12-15 15:34:33 +00006335#ifdef _SC_MAC
Victor Stinner97b89882010-05-06 00:25:39 +00006336 {"SC_MAC", _SC_MAC},
Fred Draked86ed291999-12-15 15:34:33 +00006337#endif
Fred Drakec9680921999-12-13 16:37:25 +00006338#ifdef _SC_MAPPED_FILES
Victor Stinner97b89882010-05-06 00:25:39 +00006339 {"SC_MAPPED_FILES", _SC_MAPPED_FILES},
Fred Drakec9680921999-12-13 16:37:25 +00006340#endif
6341#ifdef _SC_MAXPID
Victor Stinner97b89882010-05-06 00:25:39 +00006342 {"SC_MAXPID", _SC_MAXPID},
Fred Drakec9680921999-12-13 16:37:25 +00006343#endif
6344#ifdef _SC_MB_LEN_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006345 {"SC_MB_LEN_MAX", _SC_MB_LEN_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006346#endif
6347#ifdef _SC_MEMLOCK
Victor Stinner97b89882010-05-06 00:25:39 +00006348 {"SC_MEMLOCK", _SC_MEMLOCK},
Fred Drakec9680921999-12-13 16:37:25 +00006349#endif
6350#ifdef _SC_MEMLOCK_RANGE
Victor Stinner97b89882010-05-06 00:25:39 +00006351 {"SC_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE},
Fred Drakec9680921999-12-13 16:37:25 +00006352#endif
6353#ifdef _SC_MEMORY_PROTECTION
Victor Stinner97b89882010-05-06 00:25:39 +00006354 {"SC_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION},
Fred Drakec9680921999-12-13 16:37:25 +00006355#endif
6356#ifdef _SC_MESSAGE_PASSING
Victor Stinner97b89882010-05-06 00:25:39 +00006357 {"SC_MESSAGE_PASSING", _SC_MESSAGE_PASSING},
Fred Drakec9680921999-12-13 16:37:25 +00006358#endif
Fred Draked86ed291999-12-15 15:34:33 +00006359#ifdef _SC_MMAP_FIXED_ALIGNMENT
Victor Stinner97b89882010-05-06 00:25:39 +00006360 {"SC_MMAP_FIXED_ALIGNMENT", _SC_MMAP_FIXED_ALIGNMENT},
Fred Draked86ed291999-12-15 15:34:33 +00006361#endif
Fred Drakec9680921999-12-13 16:37:25 +00006362#ifdef _SC_MQ_OPEN_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006363 {"SC_MQ_OPEN_MAX", _SC_MQ_OPEN_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006364#endif
6365#ifdef _SC_MQ_PRIO_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006366 {"SC_MQ_PRIO_MAX", _SC_MQ_PRIO_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006367#endif
Fred Draked86ed291999-12-15 15:34:33 +00006368#ifdef _SC_NACLS_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006369 {"SC_NACLS_MAX", _SC_NACLS_MAX},
Fred Draked86ed291999-12-15 15:34:33 +00006370#endif
Fred Drakec9680921999-12-13 16:37:25 +00006371#ifdef _SC_NGROUPS_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006372 {"SC_NGROUPS_MAX", _SC_NGROUPS_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006373#endif
6374#ifdef _SC_NL_ARGMAX
Victor Stinner97b89882010-05-06 00:25:39 +00006375 {"SC_NL_ARGMAX", _SC_NL_ARGMAX},
Fred Drakec9680921999-12-13 16:37:25 +00006376#endif
6377#ifdef _SC_NL_LANGMAX
Victor Stinner97b89882010-05-06 00:25:39 +00006378 {"SC_NL_LANGMAX", _SC_NL_LANGMAX},
Fred Drakec9680921999-12-13 16:37:25 +00006379#endif
6380#ifdef _SC_NL_MSGMAX
Victor Stinner97b89882010-05-06 00:25:39 +00006381 {"SC_NL_MSGMAX", _SC_NL_MSGMAX},
Fred Drakec9680921999-12-13 16:37:25 +00006382#endif
6383#ifdef _SC_NL_NMAX
Victor Stinner97b89882010-05-06 00:25:39 +00006384 {"SC_NL_NMAX", _SC_NL_NMAX},
Fred Drakec9680921999-12-13 16:37:25 +00006385#endif
6386#ifdef _SC_NL_SETMAX
Victor Stinner97b89882010-05-06 00:25:39 +00006387 {"SC_NL_SETMAX", _SC_NL_SETMAX},
Fred Drakec9680921999-12-13 16:37:25 +00006388#endif
6389#ifdef _SC_NL_TEXTMAX
Victor Stinner97b89882010-05-06 00:25:39 +00006390 {"SC_NL_TEXTMAX", _SC_NL_TEXTMAX},
Fred Drakec9680921999-12-13 16:37:25 +00006391#endif
6392#ifdef _SC_NPROCESSORS_CONF
Victor Stinner97b89882010-05-06 00:25:39 +00006393 {"SC_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF},
Fred Drakec9680921999-12-13 16:37:25 +00006394#endif
6395#ifdef _SC_NPROCESSORS_ONLN
Victor Stinner97b89882010-05-06 00:25:39 +00006396 {"SC_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN},
Fred Drakec9680921999-12-13 16:37:25 +00006397#endif
Fred Draked86ed291999-12-15 15:34:33 +00006398#ifdef _SC_NPROC_CONF
Victor Stinner97b89882010-05-06 00:25:39 +00006399 {"SC_NPROC_CONF", _SC_NPROC_CONF},
Fred Draked86ed291999-12-15 15:34:33 +00006400#endif
6401#ifdef _SC_NPROC_ONLN
Victor Stinner97b89882010-05-06 00:25:39 +00006402 {"SC_NPROC_ONLN", _SC_NPROC_ONLN},
Fred Draked86ed291999-12-15 15:34:33 +00006403#endif
Fred Drakec9680921999-12-13 16:37:25 +00006404#ifdef _SC_NZERO
Victor Stinner97b89882010-05-06 00:25:39 +00006405 {"SC_NZERO", _SC_NZERO},
Fred Drakec9680921999-12-13 16:37:25 +00006406#endif
6407#ifdef _SC_OPEN_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006408 {"SC_OPEN_MAX", _SC_OPEN_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006409#endif
6410#ifdef _SC_PAGESIZE
Victor Stinner97b89882010-05-06 00:25:39 +00006411 {"SC_PAGESIZE", _SC_PAGESIZE},
Fred Drakec9680921999-12-13 16:37:25 +00006412#endif
6413#ifdef _SC_PAGE_SIZE
Victor Stinner97b89882010-05-06 00:25:39 +00006414 {"SC_PAGE_SIZE", _SC_PAGE_SIZE},
Fred Drakec9680921999-12-13 16:37:25 +00006415#endif
6416#ifdef _SC_PASS_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006417 {"SC_PASS_MAX", _SC_PASS_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006418#endif
6419#ifdef _SC_PHYS_PAGES
Victor Stinner97b89882010-05-06 00:25:39 +00006420 {"SC_PHYS_PAGES", _SC_PHYS_PAGES},
Fred Drakec9680921999-12-13 16:37:25 +00006421#endif
6422#ifdef _SC_PII
Victor Stinner97b89882010-05-06 00:25:39 +00006423 {"SC_PII", _SC_PII},
Fred Drakec9680921999-12-13 16:37:25 +00006424#endif
6425#ifdef _SC_PII_INTERNET
Victor Stinner97b89882010-05-06 00:25:39 +00006426 {"SC_PII_INTERNET", _SC_PII_INTERNET},
Fred Drakec9680921999-12-13 16:37:25 +00006427#endif
6428#ifdef _SC_PII_INTERNET_DGRAM
Victor Stinner97b89882010-05-06 00:25:39 +00006429 {"SC_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM},
Fred Drakec9680921999-12-13 16:37:25 +00006430#endif
6431#ifdef _SC_PII_INTERNET_STREAM
Victor Stinner97b89882010-05-06 00:25:39 +00006432 {"SC_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM},
Fred Drakec9680921999-12-13 16:37:25 +00006433#endif
6434#ifdef _SC_PII_OSI
Victor Stinner97b89882010-05-06 00:25:39 +00006435 {"SC_PII_OSI", _SC_PII_OSI},
Fred Drakec9680921999-12-13 16:37:25 +00006436#endif
6437#ifdef _SC_PII_OSI_CLTS
Victor Stinner97b89882010-05-06 00:25:39 +00006438 {"SC_PII_OSI_CLTS", _SC_PII_OSI_CLTS},
Fred Drakec9680921999-12-13 16:37:25 +00006439#endif
6440#ifdef _SC_PII_OSI_COTS
Victor Stinner97b89882010-05-06 00:25:39 +00006441 {"SC_PII_OSI_COTS", _SC_PII_OSI_COTS},
Fred Drakec9680921999-12-13 16:37:25 +00006442#endif
6443#ifdef _SC_PII_OSI_M
Victor Stinner97b89882010-05-06 00:25:39 +00006444 {"SC_PII_OSI_M", _SC_PII_OSI_M},
Fred Drakec9680921999-12-13 16:37:25 +00006445#endif
6446#ifdef _SC_PII_SOCKET
Victor Stinner97b89882010-05-06 00:25:39 +00006447 {"SC_PII_SOCKET", _SC_PII_SOCKET},
Fred Drakec9680921999-12-13 16:37:25 +00006448#endif
6449#ifdef _SC_PII_XTI
Victor Stinner97b89882010-05-06 00:25:39 +00006450 {"SC_PII_XTI", _SC_PII_XTI},
Fred Drakec9680921999-12-13 16:37:25 +00006451#endif
6452#ifdef _SC_POLL
Victor Stinner97b89882010-05-06 00:25:39 +00006453 {"SC_POLL", _SC_POLL},
Fred Drakec9680921999-12-13 16:37:25 +00006454#endif
6455#ifdef _SC_PRIORITIZED_IO
Victor Stinner97b89882010-05-06 00:25:39 +00006456 {"SC_PRIORITIZED_IO", _SC_PRIORITIZED_IO},
Fred Drakec9680921999-12-13 16:37:25 +00006457#endif
6458#ifdef _SC_PRIORITY_SCHEDULING
Victor Stinner97b89882010-05-06 00:25:39 +00006459 {"SC_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING},
Fred Drakec9680921999-12-13 16:37:25 +00006460#endif
6461#ifdef _SC_REALTIME_SIGNALS
Victor Stinner97b89882010-05-06 00:25:39 +00006462 {"SC_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS},
Fred Drakec9680921999-12-13 16:37:25 +00006463#endif
6464#ifdef _SC_RE_DUP_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006465 {"SC_RE_DUP_MAX", _SC_RE_DUP_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006466#endif
6467#ifdef _SC_RTSIG_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006468 {"SC_RTSIG_MAX", _SC_RTSIG_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006469#endif
6470#ifdef _SC_SAVED_IDS
Victor Stinner97b89882010-05-06 00:25:39 +00006471 {"SC_SAVED_IDS", _SC_SAVED_IDS},
Fred Drakec9680921999-12-13 16:37:25 +00006472#endif
6473#ifdef _SC_SCHAR_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006474 {"SC_SCHAR_MAX", _SC_SCHAR_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006475#endif
6476#ifdef _SC_SCHAR_MIN
Victor Stinner97b89882010-05-06 00:25:39 +00006477 {"SC_SCHAR_MIN", _SC_SCHAR_MIN},
Fred Drakec9680921999-12-13 16:37:25 +00006478#endif
6479#ifdef _SC_SELECT
Victor Stinner97b89882010-05-06 00:25:39 +00006480 {"SC_SELECT", _SC_SELECT},
Fred Drakec9680921999-12-13 16:37:25 +00006481#endif
6482#ifdef _SC_SEMAPHORES
Victor Stinner97b89882010-05-06 00:25:39 +00006483 {"SC_SEMAPHORES", _SC_SEMAPHORES},
Fred Drakec9680921999-12-13 16:37:25 +00006484#endif
6485#ifdef _SC_SEM_NSEMS_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006486 {"SC_SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006487#endif
6488#ifdef _SC_SEM_VALUE_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006489 {"SC_SEM_VALUE_MAX", _SC_SEM_VALUE_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006490#endif
6491#ifdef _SC_SHARED_MEMORY_OBJECTS
Victor Stinner97b89882010-05-06 00:25:39 +00006492 {"SC_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS},
Fred Drakec9680921999-12-13 16:37:25 +00006493#endif
6494#ifdef _SC_SHRT_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006495 {"SC_SHRT_MAX", _SC_SHRT_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006496#endif
6497#ifdef _SC_SHRT_MIN
Victor Stinner97b89882010-05-06 00:25:39 +00006498 {"SC_SHRT_MIN", _SC_SHRT_MIN},
Fred Drakec9680921999-12-13 16:37:25 +00006499#endif
6500#ifdef _SC_SIGQUEUE_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006501 {"SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006502#endif
6503#ifdef _SC_SIGRT_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006504 {"SC_SIGRT_MAX", _SC_SIGRT_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006505#endif
6506#ifdef _SC_SIGRT_MIN
Victor Stinner97b89882010-05-06 00:25:39 +00006507 {"SC_SIGRT_MIN", _SC_SIGRT_MIN},
Fred Drakec9680921999-12-13 16:37:25 +00006508#endif
Fred Draked86ed291999-12-15 15:34:33 +00006509#ifdef _SC_SOFTPOWER
Victor Stinner97b89882010-05-06 00:25:39 +00006510 {"SC_SOFTPOWER", _SC_SOFTPOWER},
Fred Draked86ed291999-12-15 15:34:33 +00006511#endif
Fred Drakec9680921999-12-13 16:37:25 +00006512#ifdef _SC_SPLIT_CACHE
Victor Stinner97b89882010-05-06 00:25:39 +00006513 {"SC_SPLIT_CACHE", _SC_SPLIT_CACHE},
Fred Drakec9680921999-12-13 16:37:25 +00006514#endif
6515#ifdef _SC_SSIZE_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006516 {"SC_SSIZE_MAX", _SC_SSIZE_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006517#endif
6518#ifdef _SC_STACK_PROT
Victor Stinner97b89882010-05-06 00:25:39 +00006519 {"SC_STACK_PROT", _SC_STACK_PROT},
Fred Drakec9680921999-12-13 16:37:25 +00006520#endif
6521#ifdef _SC_STREAM_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006522 {"SC_STREAM_MAX", _SC_STREAM_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006523#endif
6524#ifdef _SC_SYNCHRONIZED_IO
Victor Stinner97b89882010-05-06 00:25:39 +00006525 {"SC_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO},
Fred Drakec9680921999-12-13 16:37:25 +00006526#endif
6527#ifdef _SC_THREADS
Victor Stinner97b89882010-05-06 00:25:39 +00006528 {"SC_THREADS", _SC_THREADS},
Fred Drakec9680921999-12-13 16:37:25 +00006529#endif
6530#ifdef _SC_THREAD_ATTR_STACKADDR
Victor Stinner97b89882010-05-06 00:25:39 +00006531 {"SC_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR},
Fred Drakec9680921999-12-13 16:37:25 +00006532#endif
6533#ifdef _SC_THREAD_ATTR_STACKSIZE
Victor Stinner97b89882010-05-06 00:25:39 +00006534 {"SC_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE},
Fred Drakec9680921999-12-13 16:37:25 +00006535#endif
6536#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS
Victor Stinner97b89882010-05-06 00:25:39 +00006537 {"SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS},
Fred Drakec9680921999-12-13 16:37:25 +00006538#endif
6539#ifdef _SC_THREAD_KEYS_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006540 {"SC_THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006541#endif
6542#ifdef _SC_THREAD_PRIORITY_SCHEDULING
Victor Stinner97b89882010-05-06 00:25:39 +00006543 {"SC_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING},
Fred Drakec9680921999-12-13 16:37:25 +00006544#endif
6545#ifdef _SC_THREAD_PRIO_INHERIT
Victor Stinner97b89882010-05-06 00:25:39 +00006546 {"SC_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT},
Fred Drakec9680921999-12-13 16:37:25 +00006547#endif
6548#ifdef _SC_THREAD_PRIO_PROTECT
Victor Stinner97b89882010-05-06 00:25:39 +00006549 {"SC_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT},
Fred Drakec9680921999-12-13 16:37:25 +00006550#endif
6551#ifdef _SC_THREAD_PROCESS_SHARED
Victor Stinner97b89882010-05-06 00:25:39 +00006552 {"SC_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED},
Fred Drakec9680921999-12-13 16:37:25 +00006553#endif
6554#ifdef _SC_THREAD_SAFE_FUNCTIONS
Victor Stinner97b89882010-05-06 00:25:39 +00006555 {"SC_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS},
Fred Drakec9680921999-12-13 16:37:25 +00006556#endif
6557#ifdef _SC_THREAD_STACK_MIN
Victor Stinner97b89882010-05-06 00:25:39 +00006558 {"SC_THREAD_STACK_MIN", _SC_THREAD_STACK_MIN},
Fred Drakec9680921999-12-13 16:37:25 +00006559#endif
6560#ifdef _SC_THREAD_THREADS_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006561 {"SC_THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006562#endif
6563#ifdef _SC_TIMERS
Victor Stinner97b89882010-05-06 00:25:39 +00006564 {"SC_TIMERS", _SC_TIMERS},
Fred Drakec9680921999-12-13 16:37:25 +00006565#endif
6566#ifdef _SC_TIMER_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006567 {"SC_TIMER_MAX", _SC_TIMER_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006568#endif
6569#ifdef _SC_TTY_NAME_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006570 {"SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006571#endif
6572#ifdef _SC_TZNAME_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006573 {"SC_TZNAME_MAX", _SC_TZNAME_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006574#endif
6575#ifdef _SC_T_IOV_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006576 {"SC_T_IOV_MAX", _SC_T_IOV_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006577#endif
6578#ifdef _SC_UCHAR_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006579 {"SC_UCHAR_MAX", _SC_UCHAR_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006580#endif
6581#ifdef _SC_UINT_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006582 {"SC_UINT_MAX", _SC_UINT_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006583#endif
6584#ifdef _SC_UIO_MAXIOV
Victor Stinner97b89882010-05-06 00:25:39 +00006585 {"SC_UIO_MAXIOV", _SC_UIO_MAXIOV},
Fred Drakec9680921999-12-13 16:37:25 +00006586#endif
6587#ifdef _SC_ULONG_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006588 {"SC_ULONG_MAX", _SC_ULONG_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006589#endif
6590#ifdef _SC_USHRT_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00006591 {"SC_USHRT_MAX", _SC_USHRT_MAX},
Fred Drakec9680921999-12-13 16:37:25 +00006592#endif
6593#ifdef _SC_VERSION
Victor Stinner97b89882010-05-06 00:25:39 +00006594 {"SC_VERSION", _SC_VERSION},
Fred Drakec9680921999-12-13 16:37:25 +00006595#endif
6596#ifdef _SC_WORD_BIT
Victor Stinner97b89882010-05-06 00:25:39 +00006597 {"SC_WORD_BIT", _SC_WORD_BIT},
Fred Drakec9680921999-12-13 16:37:25 +00006598#endif
6599#ifdef _SC_XBS5_ILP32_OFF32
Victor Stinner97b89882010-05-06 00:25:39 +00006600 {"SC_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32},
Fred Drakec9680921999-12-13 16:37:25 +00006601#endif
6602#ifdef _SC_XBS5_ILP32_OFFBIG
Victor Stinner97b89882010-05-06 00:25:39 +00006603 {"SC_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG},
Fred Drakec9680921999-12-13 16:37:25 +00006604#endif
6605#ifdef _SC_XBS5_LP64_OFF64
Victor Stinner97b89882010-05-06 00:25:39 +00006606 {"SC_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64},
Fred Drakec9680921999-12-13 16:37:25 +00006607#endif
6608#ifdef _SC_XBS5_LPBIG_OFFBIG
Victor Stinner97b89882010-05-06 00:25:39 +00006609 {"SC_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG},
Fred Drakec9680921999-12-13 16:37:25 +00006610#endif
6611#ifdef _SC_XOPEN_CRYPT
Victor Stinner97b89882010-05-06 00:25:39 +00006612 {"SC_XOPEN_CRYPT", _SC_XOPEN_CRYPT},
Fred Drakec9680921999-12-13 16:37:25 +00006613#endif
6614#ifdef _SC_XOPEN_ENH_I18N
Victor Stinner97b89882010-05-06 00:25:39 +00006615 {"SC_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N},
Fred Drakec9680921999-12-13 16:37:25 +00006616#endif
6617#ifdef _SC_XOPEN_LEGACY
Victor Stinner97b89882010-05-06 00:25:39 +00006618 {"SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY},
Fred Drakec9680921999-12-13 16:37:25 +00006619#endif
6620#ifdef _SC_XOPEN_REALTIME
Victor Stinner97b89882010-05-06 00:25:39 +00006621 {"SC_XOPEN_REALTIME", _SC_XOPEN_REALTIME},
Fred Drakec9680921999-12-13 16:37:25 +00006622#endif
6623#ifdef _SC_XOPEN_REALTIME_THREADS
Victor Stinner97b89882010-05-06 00:25:39 +00006624 {"SC_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS},
Fred Drakec9680921999-12-13 16:37:25 +00006625#endif
6626#ifdef _SC_XOPEN_SHM
Victor Stinner97b89882010-05-06 00:25:39 +00006627 {"SC_XOPEN_SHM", _SC_XOPEN_SHM},
Fred Drakec9680921999-12-13 16:37:25 +00006628#endif
6629#ifdef _SC_XOPEN_UNIX
Victor Stinner97b89882010-05-06 00:25:39 +00006630 {"SC_XOPEN_UNIX", _SC_XOPEN_UNIX},
Fred Drakec9680921999-12-13 16:37:25 +00006631#endif
6632#ifdef _SC_XOPEN_VERSION
Victor Stinner97b89882010-05-06 00:25:39 +00006633 {"SC_XOPEN_VERSION", _SC_XOPEN_VERSION},
Fred Drakec9680921999-12-13 16:37:25 +00006634#endif
6635#ifdef _SC_XOPEN_XCU_VERSION
Victor Stinner97b89882010-05-06 00:25:39 +00006636 {"SC_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION},
Fred Drakec9680921999-12-13 16:37:25 +00006637#endif
6638#ifdef _SC_XOPEN_XPG2
Victor Stinner97b89882010-05-06 00:25:39 +00006639 {"SC_XOPEN_XPG2", _SC_XOPEN_XPG2},
Fred Drakec9680921999-12-13 16:37:25 +00006640#endif
6641#ifdef _SC_XOPEN_XPG3
Victor Stinner97b89882010-05-06 00:25:39 +00006642 {"SC_XOPEN_XPG3", _SC_XOPEN_XPG3},
Fred Drakec9680921999-12-13 16:37:25 +00006643#endif
6644#ifdef _SC_XOPEN_XPG4
Victor Stinner97b89882010-05-06 00:25:39 +00006645 {"SC_XOPEN_XPG4", _SC_XOPEN_XPG4},
Fred Drakec9680921999-12-13 16:37:25 +00006646#endif
6647};
6648
6649static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006650conv_sysconf_confname(PyObject *arg, int *valuep)
Fred Drakec9680921999-12-13 16:37:25 +00006651{
6652 return conv_confname(arg, valuep, posix_constants_sysconf,
6653 sizeof(posix_constants_sysconf)
6654 / sizeof(struct constdef));
6655}
6656
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006657PyDoc_STRVAR(posix_sysconf__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00006658"sysconf(name) -> integer\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006659Return an integer-valued system configuration variable.");
Fred Drakec9680921999-12-13 16:37:25 +00006660
6661static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006662posix_sysconf(PyObject *self, PyObject *args)
Fred Drakec9680921999-12-13 16:37:25 +00006663{
6664 PyObject *result = NULL;
6665 int name;
6666
6667 if (PyArg_ParseTuple(args, "O&:sysconf", conv_sysconf_confname, &name)) {
6668 int value;
6669
6670 errno = 0;
6671 value = sysconf(name);
6672 if (value == -1 && errno != 0)
6673 posix_error();
6674 else
Christian Heimes217cfd12007-12-02 14:31:20 +00006675 result = PyLong_FromLong(value);
Fred Drakec9680921999-12-13 16:37:25 +00006676 }
6677 return result;
6678}
6679#endif
6680
6681
Fred Drakebec628d1999-12-15 18:31:10 +00006682/* This code is used to ensure that the tables of configuration value names
6683 * are in sorted order as required by conv_confname(), and also to build the
6684 * the exported dictionaries that are used to publish information about the
6685 * names available on the host platform.
6686 *
6687 * Sorting the table at runtime ensures that the table is properly ordered
6688 * when used, even for platforms we're not able to test on. It also makes
6689 * it easier to add additional entries to the tables.
Fred Draked86ed291999-12-15 15:34:33 +00006690 */
Fred Drakebec628d1999-12-15 18:31:10 +00006691
6692static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006693cmp_constdefs(const void *v1, const void *v2)
Fred Drakebec628d1999-12-15 18:31:10 +00006694{
6695 const struct constdef *c1 =
Victor Stinner97b89882010-05-06 00:25:39 +00006696 (const struct constdef *) v1;
Fred Drakebec628d1999-12-15 18:31:10 +00006697 const struct constdef *c2 =
Victor Stinner97b89882010-05-06 00:25:39 +00006698 (const struct constdef *) v2;
Fred Drakebec628d1999-12-15 18:31:10 +00006699
6700 return strcmp(c1->name, c2->name);
6701}
6702
6703static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006704setup_confname_table(struct constdef *table, size_t tablesize,
Victor Stinner97b89882010-05-06 00:25:39 +00006705 char *tablename, PyObject *module)
Fred Draked86ed291999-12-15 15:34:33 +00006706{
Fred Drakebec628d1999-12-15 18:31:10 +00006707 PyObject *d = NULL;
Barry Warsaw3155db32000-04-13 15:20:40 +00006708 size_t i;
Fred Drakebec628d1999-12-15 18:31:10 +00006709
6710 qsort(table, tablesize, sizeof(struct constdef), cmp_constdefs);
6711 d = PyDict_New();
Barry Warsaw3155db32000-04-13 15:20:40 +00006712 if (d == NULL)
Victor Stinner97b89882010-05-06 00:25:39 +00006713 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00006714
Barry Warsaw3155db32000-04-13 15:20:40 +00006715 for (i=0; i < tablesize; ++i) {
Victor Stinner97b89882010-05-06 00:25:39 +00006716 PyObject *o = PyLong_FromLong(table[i].value);
6717 if (o == NULL || PyDict_SetItemString(d, table[i].name, o) == -1) {
6718 Py_XDECREF(o);
6719 Py_DECREF(d);
6720 return -1;
6721 }
6722 Py_DECREF(o);
Fred Draked86ed291999-12-15 15:34:33 +00006723 }
Fred Drake4d1e64b2002-04-15 19:40:07 +00006724 return PyModule_AddObject(module, tablename, d);
Fred Draked86ed291999-12-15 15:34:33 +00006725}
6726
Fred Drakebec628d1999-12-15 18:31:10 +00006727/* Return -1 on failure, 0 on success. */
6728static int
Fred Drake4d1e64b2002-04-15 19:40:07 +00006729setup_confname_tables(PyObject *module)
Fred Draked86ed291999-12-15 15:34:33 +00006730{
6731#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
Fred Drakebec628d1999-12-15 18:31:10 +00006732 if (setup_confname_table(posix_constants_pathconf,
Fred Draked86ed291999-12-15 15:34:33 +00006733 sizeof(posix_constants_pathconf)
6734 / sizeof(struct constdef),
Fred Drake4d1e64b2002-04-15 19:40:07 +00006735 "pathconf_names", module))
Victor Stinner97b89882010-05-06 00:25:39 +00006736 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00006737#endif
6738#ifdef HAVE_CONFSTR
Fred Drakebec628d1999-12-15 18:31:10 +00006739 if (setup_confname_table(posix_constants_confstr,
Fred Draked86ed291999-12-15 15:34:33 +00006740 sizeof(posix_constants_confstr)
6741 / sizeof(struct constdef),
Fred Drake4d1e64b2002-04-15 19:40:07 +00006742 "confstr_names", module))
Victor Stinner97b89882010-05-06 00:25:39 +00006743 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00006744#endif
6745#ifdef HAVE_SYSCONF
Fred Drakebec628d1999-12-15 18:31:10 +00006746 if (setup_confname_table(posix_constants_sysconf,
Fred Draked86ed291999-12-15 15:34:33 +00006747 sizeof(posix_constants_sysconf)
6748 / sizeof(struct constdef),
Fred Drake4d1e64b2002-04-15 19:40:07 +00006749 "sysconf_names", module))
Victor Stinner97b89882010-05-06 00:25:39 +00006750 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00006751#endif
Fred Drakebec628d1999-12-15 18:31:10 +00006752 return 0;
Fred Draked86ed291999-12-15 15:34:33 +00006753}
Fred Draked86ed291999-12-15 15:34:33 +00006754
6755
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006756PyDoc_STRVAR(posix_abort__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00006757"abort() -> does not return!\n\n\
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006758Abort the interpreter immediately. This 'dumps core' or otherwise fails\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006759in the hardest way possible on the hosting operating system.");
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006760
6761static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00006762posix_abort(PyObject *self, PyObject *noargs)
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006763{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006764 abort();
6765 /*NOTREACHED*/
6766 Py_FatalError("abort() called from Python code didn't abort!");
6767 return NULL;
6768}
Fred Drakebec628d1999-12-15 18:31:10 +00006769
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00006770#ifdef MS_WINDOWS
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006771PyDoc_STRVAR(win32_startfile__doc__,
Georg Brandlf4f44152006-02-18 22:29:33 +00006772"startfile(filepath [, operation]) - Start a file with its associated\n\
6773application.\n\
Tim Petersf58a7aa2000-09-22 10:05:54 +00006774\n\
Georg Brandlf4f44152006-02-18 22:29:33 +00006775When \"operation\" is not specified or \"open\", this acts like\n\
6776double-clicking the file in Explorer, or giving the file name as an\n\
6777argument to the DOS \"start\" command: the file is opened with whatever\n\
6778application (if any) its extension is associated.\n\
6779When another \"operation\" is given, it specifies what should be done with\n\
6780the file. A typical operation is \"print\".\n\
Tim Petersf58a7aa2000-09-22 10:05:54 +00006781\n\
6782startfile returns as soon as the associated application is launched.\n\
6783There is no option to wait for the application to close, and no way\n\
6784to retrieve the application's exit status.\n\
6785\n\
6786The filepath is relative to the current directory. If you want to use\n\
6787an absolute path, make sure the first character is not a slash (\"/\");\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006788the underlying Win32 ShellExecute function doesn't work if it is.");
Tim Petersf58a7aa2000-09-22 10:05:54 +00006789
6790static PyObject *
6791win32_startfile(PyObject *self, PyObject *args)
6792{
Victor Stinner97b89882010-05-06 00:25:39 +00006793 PyObject *ofilepath;
6794 char *filepath;
6795 char *operation = NULL;
6796 HINSTANCE rc;
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00006797
Victor Stinner97b89882010-05-06 00:25:39 +00006798 if (unicode_file_names()) {
6799 PyObject *unipath, *woperation = NULL;
6800 if (!PyArg_ParseTuple(args, "U|s:startfile",
6801 &unipath, &operation)) {
6802 PyErr_Clear();
6803 goto normal;
6804 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006805
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006806
Victor Stinner97b89882010-05-06 00:25:39 +00006807 if (operation) {
6808 woperation = PyUnicode_DecodeASCII(operation,
6809 strlen(operation), NULL);
6810 if (!woperation) {
6811 PyErr_Clear();
6812 operation = NULL;
6813 goto normal;
6814 }
6815 }
6816
6817 Py_BEGIN_ALLOW_THREADS
6818 rc = ShellExecuteW((HWND)0, woperation ? PyUnicode_AS_UNICODE(woperation) : 0,
6819 PyUnicode_AS_UNICODE(unipath),
6820 NULL, NULL, SW_SHOWNORMAL);
6821 Py_END_ALLOW_THREADS
6822
6823 Py_XDECREF(woperation);
6824 if (rc <= (HINSTANCE)32) {
6825 PyObject *errval = win32_error_unicode("startfile",
6826 PyUnicode_AS_UNICODE(unipath));
6827 return errval;
6828 }
6829 Py_INCREF(Py_None);
6830 return Py_None;
6831 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006832
6833normal:
Victor Stinner97b89882010-05-06 00:25:39 +00006834 if (!PyArg_ParseTuple(args, "O&|s:startfile",
6835 PyUnicode_FSConverter, &ofilepath,
6836 &operation))
6837 return NULL;
6838 filepath = bytes2str(ofilepath, 1);
6839 Py_BEGIN_ALLOW_THREADS
6840 rc = ShellExecute((HWND)0, operation, filepath,
6841 NULL, NULL, SW_SHOWNORMAL);
6842 Py_END_ALLOW_THREADS
6843 if (rc <= (HINSTANCE)32) {
6844 PyObject *errval = win32_error("startfile", filepath);
6845 release_bytes(ofilepath);
6846 return errval;
6847 }
6848 release_bytes(ofilepath);
6849 Py_INCREF(Py_None);
6850 return Py_None;
Tim Petersf58a7aa2000-09-22 10:05:54 +00006851}
6852#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006853
Martin v. Löwis438b5342002-12-27 10:16:42 +00006854#ifdef HAVE_GETLOADAVG
6855PyDoc_STRVAR(posix_getloadavg__doc__,
6856"getloadavg() -> (float, float, float)\n\n\
6857Return the number of processes in the system run queue averaged over\n\
6858the last 1, 5, and 15 minutes or raises OSError if the load average\n\
6859was unobtainable");
6860
6861static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00006862posix_getloadavg(PyObject *self, PyObject *noargs)
Martin v. Löwis438b5342002-12-27 10:16:42 +00006863{
6864 double loadavg[3];
Martin v. Löwis438b5342002-12-27 10:16:42 +00006865 if (getloadavg(loadavg, 3)!=3) {
Victor Stinner97b89882010-05-06 00:25:39 +00006866 PyErr_SetString(PyExc_OSError, "Load averages are unobtainable");
6867 return NULL;
Martin v. Löwis438b5342002-12-27 10:16:42 +00006868 } else
Victor Stinner97b89882010-05-06 00:25:39 +00006869 return Py_BuildValue("ddd", loadavg[0], loadavg[1], loadavg[2]);
Martin v. Löwis438b5342002-12-27 10:16:42 +00006870}
6871#endif
6872
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006873#ifdef MS_WINDOWS
6874
6875PyDoc_STRVAR(win32_urandom__doc__,
6876"urandom(n) -> str\n\n\
Neal Norwitz93c56822007-08-26 07:10:06 +00006877Return n random bytes suitable for cryptographic use.");
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006878
6879typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\
6880 LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\
6881 DWORD dwFlags );
6882typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\
6883 BYTE *pbBuffer );
6884
6885static CRYPTGENRANDOM pCryptGenRandom = NULL;
Thomas Wouters89d996e2007-09-08 17:39:28 +00006886/* This handle is never explicitly released. Instead, the operating
6887 system will release it when the process terminates. */
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006888static HCRYPTPROV hCryptProv = 0;
6889
Tim Peters4ad82172004-08-30 17:02:04 +00006890static PyObject*
6891win32_urandom(PyObject *self, PyObject *args)
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006892{
Victor Stinner97b89882010-05-06 00:25:39 +00006893 int howMany;
6894 PyObject* result;
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006895
Victor Stinner97b89882010-05-06 00:25:39 +00006896 /* Read arguments */
6897 if (! PyArg_ParseTuple(args, "i:urandom", &howMany))
6898 return NULL;
6899 if (howMany < 0)
6900 return PyErr_Format(PyExc_ValueError,
6901 "negative argument not allowed");
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006902
Victor Stinner97b89882010-05-06 00:25:39 +00006903 if (hCryptProv == 0) {
6904 HINSTANCE hAdvAPI32 = NULL;
6905 CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL;
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006906
Victor Stinner97b89882010-05-06 00:25:39 +00006907 /* Obtain handle to the DLL containing CryptoAPI
6908 This should not fail */
6909 hAdvAPI32 = GetModuleHandle("advapi32.dll");
6910 if(hAdvAPI32 == NULL)
6911 return win32_error("GetModuleHandle", NULL);
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006912
Victor Stinner97b89882010-05-06 00:25:39 +00006913 /* Obtain pointers to the CryptoAPI functions
6914 This will fail on some early versions of Win95 */
6915 pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress(
6916 hAdvAPI32,
6917 "CryptAcquireContextA");
6918 if (pCryptAcquireContext == NULL)
6919 return PyErr_Format(PyExc_NotImplementedError,
6920 "CryptAcquireContextA not found");
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006921
Victor Stinner97b89882010-05-06 00:25:39 +00006922 pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress(
6923 hAdvAPI32, "CryptGenRandom");
6924 if (pCryptGenRandom == NULL)
6925 return PyErr_Format(PyExc_NotImplementedError,
6926 "CryptGenRandom not found");
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006927
Victor Stinner97b89882010-05-06 00:25:39 +00006928 /* Acquire context */
6929 if (! pCryptAcquireContext(&hCryptProv, NULL, NULL,
6930 PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
6931 return win32_error("CryptAcquireContext", NULL);
6932 }
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006933
Victor Stinner97b89882010-05-06 00:25:39 +00006934 /* Allocate bytes */
6935 result = PyBytes_FromStringAndSize(NULL, howMany);
6936 if (result != NULL) {
6937 /* Get random data */
6938 memset(PyBytes_AS_STRING(result), 0, howMany); /* zero seed */
6939 if (! pCryptGenRandom(hCryptProv, howMany, (unsigned char*)
6940 PyBytes_AS_STRING(result))) {
6941 Py_DECREF(result);
6942 return win32_error("CryptGenRandom", NULL);
6943 }
6944 }
6945 return result;
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006946}
6947#endif
Martin v. Löwis438b5342002-12-27 10:16:42 +00006948
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00006949PyDoc_STRVAR(device_encoding__doc__,
6950"device_encoding(fd) -> str\n\n\
6951Return a string describing the encoding of the device\n\
6952if the output is a terminal; else return None.");
6953
6954static PyObject *
6955device_encoding(PyObject *self, PyObject *args)
6956{
Victor Stinner97b89882010-05-06 00:25:39 +00006957 int fd;
6958 if (!PyArg_ParseTuple(args, "i:device_encoding", &fd))
6959 return NULL;
6960 if (!_PyVerify_fd(fd) || !isatty(fd)) {
6961 Py_INCREF(Py_None);
6962 return Py_None;
6963 }
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00006964#if defined(MS_WINDOWS) || defined(MS_WIN64)
Victor Stinner97b89882010-05-06 00:25:39 +00006965 if (fd == 0) {
6966 char buf[100];
6967 sprintf(buf, "cp%d", GetConsoleCP());
6968 return PyUnicode_FromString(buf);
6969 }
6970 if (fd == 1 || fd == 2) {
6971 char buf[100];
6972 sprintf(buf, "cp%d", GetConsoleOutputCP());
6973 return PyUnicode_FromString(buf);
6974 }
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00006975#elif defined(CODESET)
Victor Stinner97b89882010-05-06 00:25:39 +00006976 {
6977 char *codeset = nl_langinfo(CODESET);
6978 if (codeset != NULL && codeset[0] != 0)
6979 return PyUnicode_FromString(codeset);
6980 }
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00006981#endif
Victor Stinner97b89882010-05-06 00:25:39 +00006982 Py_INCREF(Py_None);
6983 return Py_None;
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00006984}
6985
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006986#ifdef __VMS
6987/* Use openssl random routine */
6988#include <openssl/rand.h>
6989PyDoc_STRVAR(vms_urandom__doc__,
6990"urandom(n) -> str\n\n\
Neal Norwitz93c56822007-08-26 07:10:06 +00006991Return n random bytes suitable for cryptographic use.");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006992
6993static PyObject*
6994vms_urandom(PyObject *self, PyObject *args)
6995{
Victor Stinner97b89882010-05-06 00:25:39 +00006996 int howMany;
6997 PyObject* result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006998
Victor Stinner97b89882010-05-06 00:25:39 +00006999 /* Read arguments */
7000 if (! PyArg_ParseTuple(args, "i:urandom", &howMany))
7001 return NULL;
7002 if (howMany < 0)
7003 return PyErr_Format(PyExc_ValueError,
7004 "negative argument not allowed");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00007005
Victor Stinner97b89882010-05-06 00:25:39 +00007006 /* Allocate bytes */
7007 result = PyBytes_FromStringAndSize(NULL, howMany);
7008 if (result != NULL) {
7009 /* Get random data */
7010 if (RAND_pseudo_bytes((unsigned char*)
7011 PyBytes_AS_STRING(result),
7012 howMany) < 0) {
7013 Py_DECREF(result);
7014 return PyErr_Format(PyExc_ValueError,
7015 "RAND_pseudo_bytes");
7016 }
7017 }
7018 return result;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00007019}
7020#endif
7021
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007022static PyMethodDef posix_methods[] = {
Victor Stinner97b89882010-05-06 00:25:39 +00007023 {"access", posix_access, METH_VARARGS, posix_access__doc__},
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007024#ifdef HAVE_TTYNAME
Victor Stinner97b89882010-05-06 00:25:39 +00007025 {"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__},
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007026#endif
Victor Stinner97b89882010-05-06 00:25:39 +00007027 {"chdir", posix_chdir, METH_VARARGS, posix_chdir__doc__},
Thomas Wouterscf297e42007-02-23 15:07:44 +00007028#ifdef HAVE_CHFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00007029 {"chflags", posix_chflags, METH_VARARGS, posix_chflags__doc__},
Thomas Wouterscf297e42007-02-23 15:07:44 +00007030#endif /* HAVE_CHFLAGS */
Victor Stinner97b89882010-05-06 00:25:39 +00007031 {"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__},
Christian Heimes4e30a842007-11-30 22:12:06 +00007032#ifdef HAVE_FCHMOD
Victor Stinner97b89882010-05-06 00:25:39 +00007033 {"fchmod", posix_fchmod, METH_VARARGS, posix_fchmod__doc__},
Christian Heimes4e30a842007-11-30 22:12:06 +00007034#endif /* HAVE_FCHMOD */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007035#ifdef HAVE_CHOWN
Victor Stinner97b89882010-05-06 00:25:39 +00007036 {"chown", posix_chown, METH_VARARGS, posix_chown__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007037#endif /* HAVE_CHOWN */
Christian Heimes4e30a842007-11-30 22:12:06 +00007038#ifdef HAVE_LCHMOD
Victor Stinner97b89882010-05-06 00:25:39 +00007039 {"lchmod", posix_lchmod, METH_VARARGS, posix_lchmod__doc__},
Christian Heimes4e30a842007-11-30 22:12:06 +00007040#endif /* HAVE_LCHMOD */
7041#ifdef HAVE_FCHOWN
Victor Stinner97b89882010-05-06 00:25:39 +00007042 {"fchown", posix_fchown, METH_VARARGS, posix_fchown__doc__},
Christian Heimes4e30a842007-11-30 22:12:06 +00007043#endif /* HAVE_FCHOWN */
Thomas Wouterscf297e42007-02-23 15:07:44 +00007044#ifdef HAVE_LCHFLAGS
Victor Stinner97b89882010-05-06 00:25:39 +00007045 {"lchflags", posix_lchflags, METH_VARARGS, posix_lchflags__doc__},
Thomas Wouterscf297e42007-02-23 15:07:44 +00007046#endif /* HAVE_LCHFLAGS */
Martin v. Löwis0cec0ff2002-07-28 16:33:45 +00007047#ifdef HAVE_LCHOWN
Victor Stinner97b89882010-05-06 00:25:39 +00007048 {"lchown", posix_lchown, METH_VARARGS, posix_lchown__doc__},
Martin v. Löwis0cec0ff2002-07-28 16:33:45 +00007049#endif /* HAVE_LCHOWN */
Martin v. Löwis244edc82001-10-04 22:44:26 +00007050#ifdef HAVE_CHROOT
Victor Stinner97b89882010-05-06 00:25:39 +00007051 {"chroot", posix_chroot, METH_VARARGS, posix_chroot__doc__},
Martin v. Löwis244edc82001-10-04 22:44:26 +00007052#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007053#ifdef HAVE_CTERMID
Victor Stinner97b89882010-05-06 00:25:39 +00007054 {"ctermid", posix_ctermid, METH_NOARGS, posix_ctermid__doc__},
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007055#endif
Guido van Rossum36bc6801995-06-14 22:54:23 +00007056#ifdef HAVE_GETCWD
Victor Stinner97b89882010-05-06 00:25:39 +00007057 {"getcwd", (PyCFunction)posix_getcwd_unicode,
7058 METH_NOARGS, posix_getcwd__doc__},
7059 {"getcwdb", (PyCFunction)posix_getcwd_bytes,
7060 METH_NOARGS, posix_getcwdb__doc__},
Guido van Rossum36bc6801995-06-14 22:54:23 +00007061#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00007062#ifdef HAVE_LINK
Victor Stinner97b89882010-05-06 00:25:39 +00007063 {"link", posix_link, METH_VARARGS, posix_link__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007064#endif /* HAVE_LINK */
Victor Stinner97b89882010-05-06 00:25:39 +00007065 {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__},
7066 {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__},
7067 {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007068#ifdef HAVE_NICE
Victor Stinner97b89882010-05-06 00:25:39 +00007069 {"nice", posix_nice, METH_VARARGS, posix_nice__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007070#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007071#ifdef HAVE_READLINK
Victor Stinner97b89882010-05-06 00:25:39 +00007072 {"readlink", posix_readlink, METH_VARARGS, posix_readlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007073#endif /* HAVE_READLINK */
Victor Stinner97b89882010-05-06 00:25:39 +00007074 {"rename", posix_rename, METH_VARARGS, posix_rename__doc__},
7075 {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__},
7076 {"stat", posix_stat, METH_VARARGS, posix_stat__doc__},
7077 {"stat_float_times", stat_float_times, METH_VARARGS, stat_float_times__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007078#ifdef HAVE_SYMLINK
Victor Stinner97b89882010-05-06 00:25:39 +00007079 {"symlink", posix_symlink, METH_VARARGS, posix_symlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007080#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007081#ifdef HAVE_SYSTEM
Victor Stinner97b89882010-05-06 00:25:39 +00007082 {"system", posix_system, METH_VARARGS, posix_system__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007083#endif
Victor Stinner97b89882010-05-06 00:25:39 +00007084 {"umask", posix_umask, METH_VARARGS, posix_umask__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007085#ifdef HAVE_UNAME
Victor Stinner97b89882010-05-06 00:25:39 +00007086 {"uname", posix_uname, METH_NOARGS, posix_uname__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007087#endif /* HAVE_UNAME */
Victor Stinner97b89882010-05-06 00:25:39 +00007088 {"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__},
7089 {"remove", posix_unlink, METH_VARARGS, posix_remove__doc__},
7090 {"utime", posix_utime, METH_VARARGS, posix_utime__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007091#ifdef HAVE_TIMES
Victor Stinner97b89882010-05-06 00:25:39 +00007092 {"times", posix_times, METH_NOARGS, posix_times__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007093#endif /* HAVE_TIMES */
Victor Stinner97b89882010-05-06 00:25:39 +00007094 {"_exit", posix__exit, METH_VARARGS, posix__exit__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007095#ifdef HAVE_EXECV
Victor Stinner97b89882010-05-06 00:25:39 +00007096 {"execv", posix_execv, METH_VARARGS, posix_execv__doc__},
7097 {"execve", posix_execve, METH_VARARGS, posix_execve__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007098#endif /* HAVE_EXECV */
Guido van Rossuma1065681999-01-25 23:20:23 +00007099#ifdef HAVE_SPAWNV
Victor Stinner97b89882010-05-06 00:25:39 +00007100 {"spawnv", posix_spawnv, METH_VARARGS, posix_spawnv__doc__},
7101 {"spawnve", posix_spawnve, METH_VARARGS, posix_spawnve__doc__},
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00007102#if defined(PYOS_OS2)
Victor Stinner97b89882010-05-06 00:25:39 +00007103 {"spawnvp", posix_spawnvp, METH_VARARGS, posix_spawnvp__doc__},
7104 {"spawnvpe", posix_spawnvpe, METH_VARARGS, posix_spawnvpe__doc__},
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00007105#endif /* PYOS_OS2 */
Guido van Rossuma1065681999-01-25 23:20:23 +00007106#endif /* HAVE_SPAWNV */
Guido van Rossum2242f2f2001-04-11 20:58:20 +00007107#ifdef HAVE_FORK1
Victor Stinner97b89882010-05-06 00:25:39 +00007108 {"fork1", posix_fork1, METH_NOARGS, posix_fork1__doc__},
Guido van Rossum2242f2f2001-04-11 20:58:20 +00007109#endif /* HAVE_FORK1 */
Guido van Rossumad0ee831995-03-01 10:34:45 +00007110#ifdef HAVE_FORK
Victor Stinner97b89882010-05-06 00:25:39 +00007111 {"fork", posix_fork, METH_NOARGS, posix_fork__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007112#endif /* HAVE_FORK */
Martin v. Löwis24a880b2002-12-31 12:55:15 +00007113#if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX)
Victor Stinner97b89882010-05-06 00:25:39 +00007114 {"openpty", posix_openpty, METH_NOARGS, posix_openpty__doc__},
Martin v. Löwis24a880b2002-12-31 12:55:15 +00007115#endif /* HAVE_OPENPTY || HAVE__GETPTY || HAVE_DEV_PTMX */
Fred Drake8cef4cf2000-06-28 16:40:38 +00007116#ifdef HAVE_FORKPTY
Victor Stinner97b89882010-05-06 00:25:39 +00007117 {"forkpty", posix_forkpty, METH_NOARGS, posix_forkpty__doc__},
Fred Drake8cef4cf2000-06-28 16:40:38 +00007118#endif /* HAVE_FORKPTY */
Guido van Rossumad0ee831995-03-01 10:34:45 +00007119#ifdef HAVE_GETEGID
Victor Stinner97b89882010-05-06 00:25:39 +00007120 {"getegid", posix_getegid, METH_NOARGS, posix_getegid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007121#endif /* HAVE_GETEGID */
7122#ifdef HAVE_GETEUID
Victor Stinner97b89882010-05-06 00:25:39 +00007123 {"geteuid", posix_geteuid, METH_NOARGS, posix_geteuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007124#endif /* HAVE_GETEUID */
7125#ifdef HAVE_GETGID
Victor Stinner97b89882010-05-06 00:25:39 +00007126 {"getgid", posix_getgid, METH_NOARGS, posix_getgid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007127#endif /* HAVE_GETGID */
Fred Drakec9680921999-12-13 16:37:25 +00007128#ifdef HAVE_GETGROUPS
Victor Stinner97b89882010-05-06 00:25:39 +00007129 {"getgroups", posix_getgroups, METH_NOARGS, posix_getgroups__doc__},
Fred Drakec9680921999-12-13 16:37:25 +00007130#endif
Victor Stinner97b89882010-05-06 00:25:39 +00007131 {"getpid", posix_getpid, METH_NOARGS, posix_getpid__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007132#ifdef HAVE_GETPGRP
Victor Stinner97b89882010-05-06 00:25:39 +00007133 {"getpgrp", posix_getpgrp, METH_NOARGS, posix_getpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007134#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00007135#ifdef HAVE_GETPPID
Victor Stinner97b89882010-05-06 00:25:39 +00007136 {"getppid", posix_getppid, METH_NOARGS, posix_getppid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007137#endif /* HAVE_GETPPID */
7138#ifdef HAVE_GETUID
Victor Stinner97b89882010-05-06 00:25:39 +00007139 {"getuid", posix_getuid, METH_NOARGS, posix_getuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007140#endif /* HAVE_GETUID */
Fred Drake12c6e2d1999-12-14 21:25:03 +00007141#ifdef HAVE_GETLOGIN
Victor Stinner97b89882010-05-06 00:25:39 +00007142 {"getlogin", posix_getlogin, METH_NOARGS, posix_getlogin__doc__},
Fred Drake12c6e2d1999-12-14 21:25:03 +00007143#endif
Guido van Rossumad0ee831995-03-01 10:34:45 +00007144#ifdef HAVE_KILL
Victor Stinner97b89882010-05-06 00:25:39 +00007145 {"kill", posix_kill, METH_VARARGS, posix_kill__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007146#endif /* HAVE_KILL */
Martin v. Löwisb2c92f42002-02-16 23:35:41 +00007147#ifdef HAVE_KILLPG
Victor Stinner97b89882010-05-06 00:25:39 +00007148 {"killpg", posix_killpg, METH_VARARGS, posix_killpg__doc__},
Martin v. Löwisb2c92f42002-02-16 23:35:41 +00007149#endif /* HAVE_KILLPG */
Guido van Rossumc0125471996-06-28 18:55:32 +00007150#ifdef HAVE_PLOCK
Victor Stinner97b89882010-05-06 00:25:39 +00007151 {"plock", posix_plock, METH_VARARGS, posix_plock__doc__},
Guido van Rossumc0125471996-06-28 18:55:32 +00007152#endif /* HAVE_PLOCK */
Thomas Heller8b7a9572007-08-31 06:44:36 +00007153#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00007154 {"startfile", win32_startfile, METH_VARARGS, win32_startfile__doc__},
Thomas Heller8b7a9572007-08-31 06:44:36 +00007155#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00007156#ifdef HAVE_SETUID
Victor Stinner97b89882010-05-06 00:25:39 +00007157 {"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007158#endif /* HAVE_SETUID */
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00007159#ifdef HAVE_SETEUID
Victor Stinner97b89882010-05-06 00:25:39 +00007160 {"seteuid", posix_seteuid, METH_VARARGS, posix_seteuid__doc__},
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00007161#endif /* HAVE_SETEUID */
7162#ifdef HAVE_SETEGID
Victor Stinner97b89882010-05-06 00:25:39 +00007163 {"setegid", posix_setegid, METH_VARARGS, posix_setegid__doc__},
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00007164#endif /* HAVE_SETEGID */
7165#ifdef HAVE_SETREUID
Victor Stinner97b89882010-05-06 00:25:39 +00007166 {"setreuid", posix_setreuid, METH_VARARGS, posix_setreuid__doc__},
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00007167#endif /* HAVE_SETREUID */
7168#ifdef HAVE_SETREGID
Victor Stinner97b89882010-05-06 00:25:39 +00007169 {"setregid", posix_setregid, METH_VARARGS, posix_setregid__doc__},
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00007170#endif /* HAVE_SETREGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007171#ifdef HAVE_SETGID
Victor Stinner97b89882010-05-06 00:25:39 +00007172 {"setgid", posix_setgid, METH_VARARGS, posix_setgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007173#endif /* HAVE_SETGID */
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00007174#ifdef HAVE_SETGROUPS
Victor Stinner97b89882010-05-06 00:25:39 +00007175 {"setgroups", posix_setgroups, METH_O, posix_setgroups__doc__},
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00007176#endif /* HAVE_SETGROUPS */
Martin v. Löwis606edc12002-06-13 21:09:11 +00007177#ifdef HAVE_GETPGID
Victor Stinner97b89882010-05-06 00:25:39 +00007178 {"getpgid", posix_getpgid, METH_VARARGS, posix_getpgid__doc__},
Martin v. Löwis606edc12002-06-13 21:09:11 +00007179#endif /* HAVE_GETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007180#ifdef HAVE_SETPGRP
Victor Stinner97b89882010-05-06 00:25:39 +00007181 {"setpgrp", posix_setpgrp, METH_NOARGS, posix_setpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007182#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00007183#ifdef HAVE_WAIT
Victor Stinner97b89882010-05-06 00:25:39 +00007184 {"wait", posix_wait, METH_NOARGS, posix_wait__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007185#endif /* HAVE_WAIT */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007186#ifdef HAVE_WAIT3
Victor Stinner97b89882010-05-06 00:25:39 +00007187 {"wait3", posix_wait3, METH_VARARGS, posix_wait3__doc__},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007188#endif /* HAVE_WAIT3 */
7189#ifdef HAVE_WAIT4
Victor Stinner97b89882010-05-06 00:25:39 +00007190 {"wait4", posix_wait4, METH_VARARGS, posix_wait4__doc__},
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007191#endif /* HAVE_WAIT4 */
Tim Petersab034fa2002-02-01 11:27:43 +00007192#if defined(HAVE_WAITPID) || defined(HAVE_CWAIT)
Victor Stinner97b89882010-05-06 00:25:39 +00007193 {"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007194#endif /* HAVE_WAITPID */
Martin v. Löwis49ee14d2003-11-10 06:35:36 +00007195#ifdef HAVE_GETSID
Victor Stinner97b89882010-05-06 00:25:39 +00007196 {"getsid", posix_getsid, METH_VARARGS, posix_getsid__doc__},
Martin v. Löwis49ee14d2003-11-10 06:35:36 +00007197#endif /* HAVE_GETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007198#ifdef HAVE_SETSID
Victor Stinner97b89882010-05-06 00:25:39 +00007199 {"setsid", posix_setsid, METH_NOARGS, posix_setsid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007200#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007201#ifdef HAVE_SETPGID
Victor Stinner97b89882010-05-06 00:25:39 +00007202 {"setpgid", posix_setpgid, METH_VARARGS, posix_setpgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007203#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007204#ifdef HAVE_TCGETPGRP
Victor Stinner97b89882010-05-06 00:25:39 +00007205 {"tcgetpgrp", posix_tcgetpgrp, METH_VARARGS, posix_tcgetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007206#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007207#ifdef HAVE_TCSETPGRP
Victor Stinner97b89882010-05-06 00:25:39 +00007208 {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007209#endif /* HAVE_TCSETPGRP */
Victor Stinner97b89882010-05-06 00:25:39 +00007210 {"open", posix_open, METH_VARARGS, posix_open__doc__},
7211 {"close", posix_close, METH_VARARGS, posix_close__doc__},
7212 {"closerange", posix_closerange, METH_VARARGS, posix_closerange__doc__},
7213 {"device_encoding", device_encoding, METH_VARARGS, device_encoding__doc__},
7214 {"dup", posix_dup, METH_VARARGS, posix_dup__doc__},
7215 {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__},
7216 {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},
7217 {"read", posix_read, METH_VARARGS, posix_read__doc__},
7218 {"write", posix_write, METH_VARARGS, posix_write__doc__},
7219 {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__},
7220 {"isatty", posix_isatty, METH_VARARGS, posix_isatty__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007221#ifdef HAVE_PIPE
Victor Stinner97b89882010-05-06 00:25:39 +00007222 {"pipe", posix_pipe, METH_NOARGS, posix_pipe__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007223#endif
7224#ifdef HAVE_MKFIFO
Victor Stinner97b89882010-05-06 00:25:39 +00007225 {"mkfifo", posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007226#endif
Neal Norwitz11690112002-07-30 01:08:28 +00007227#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)
Victor Stinner97b89882010-05-06 00:25:39 +00007228 {"mknod", posix_mknod, METH_VARARGS, posix_mknod__doc__},
Martin v. Löwis06a83e92002-04-14 10:19:44 +00007229#endif
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00007230#ifdef HAVE_DEVICE_MACROS
Victor Stinner97b89882010-05-06 00:25:39 +00007231 {"major", posix_major, METH_VARARGS, posix_major__doc__},
7232 {"minor", posix_minor, METH_VARARGS, posix_minor__doc__},
7233 {"makedev", posix_makedev, METH_VARARGS, posix_makedev__doc__},
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00007234#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007235#ifdef HAVE_FTRUNCATE
Victor Stinner97b89882010-05-06 00:25:39 +00007236 {"ftruncate", posix_ftruncate, METH_VARARGS, posix_ftruncate__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007237#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00007238#ifdef HAVE_PUTENV
Victor Stinner97b89882010-05-06 00:25:39 +00007239 {"putenv", posix_putenv, METH_VARARGS, posix_putenv__doc__},
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00007240#endif
Guido van Rossumc524d952001-10-19 01:31:59 +00007241#ifdef HAVE_UNSETENV
Victor Stinner97b89882010-05-06 00:25:39 +00007242 {"unsetenv", posix_unsetenv, METH_VARARGS, posix_unsetenv__doc__},
Guido van Rossumc524d952001-10-19 01:31:59 +00007243#endif
Victor Stinner97b89882010-05-06 00:25:39 +00007244 {"strerror", posix_strerror, METH_VARARGS, posix_strerror__doc__},
Fred Drake4d1e64b2002-04-15 19:40:07 +00007245#ifdef HAVE_FCHDIR
Victor Stinner97b89882010-05-06 00:25:39 +00007246 {"fchdir", posix_fchdir, METH_O, posix_fchdir__doc__},
Fred Drake4d1e64b2002-04-15 19:40:07 +00007247#endif
Guido van Rossum21142a01999-01-08 21:05:37 +00007248#ifdef HAVE_FSYNC
Victor Stinner97b89882010-05-06 00:25:39 +00007249 {"fsync", posix_fsync, METH_O, posix_fsync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00007250#endif
7251#ifdef HAVE_FDATASYNC
Victor Stinner97b89882010-05-06 00:25:39 +00007252 {"fdatasync", posix_fdatasync, METH_O, posix_fdatasync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00007253#endif
Guido van Rossumc9641791998-08-04 15:26:23 +00007254#ifdef HAVE_SYS_WAIT_H
Fred Drake106c1a02002-04-23 15:58:02 +00007255#ifdef WCOREDUMP
Victor Stinner97b89882010-05-06 00:25:39 +00007256 {"WCOREDUMP", posix_WCOREDUMP, METH_VARARGS, posix_WCOREDUMP__doc__},
Fred Drake106c1a02002-04-23 15:58:02 +00007257#endif /* WCOREDUMP */
Martin v. Löwis2b41b0d2002-05-04 13:13:41 +00007258#ifdef WIFCONTINUED
Victor Stinner97b89882010-05-06 00:25:39 +00007259 {"WIFCONTINUED",posix_WIFCONTINUED, METH_VARARGS, posix_WIFCONTINUED__doc__},
Martin v. Löwis2b41b0d2002-05-04 13:13:41 +00007260#endif /* WIFCONTINUED */
Guido van Rossumc9641791998-08-04 15:26:23 +00007261#ifdef WIFSTOPPED
Victor Stinner97b89882010-05-06 00:25:39 +00007262 {"WIFSTOPPED", posix_WIFSTOPPED, METH_VARARGS, posix_WIFSTOPPED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007263#endif /* WIFSTOPPED */
7264#ifdef WIFSIGNALED
Victor Stinner97b89882010-05-06 00:25:39 +00007265 {"WIFSIGNALED", posix_WIFSIGNALED, METH_VARARGS, posix_WIFSIGNALED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007266#endif /* WIFSIGNALED */
7267#ifdef WIFEXITED
Victor Stinner97b89882010-05-06 00:25:39 +00007268 {"WIFEXITED", posix_WIFEXITED, METH_VARARGS, posix_WIFEXITED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007269#endif /* WIFEXITED */
7270#ifdef WEXITSTATUS
Victor Stinner97b89882010-05-06 00:25:39 +00007271 {"WEXITSTATUS", posix_WEXITSTATUS, METH_VARARGS, posix_WEXITSTATUS__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007272#endif /* WEXITSTATUS */
7273#ifdef WTERMSIG
Victor Stinner97b89882010-05-06 00:25:39 +00007274 {"WTERMSIG", posix_WTERMSIG, METH_VARARGS, posix_WTERMSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007275#endif /* WTERMSIG */
7276#ifdef WSTOPSIG
Victor Stinner97b89882010-05-06 00:25:39 +00007277 {"WSTOPSIG", posix_WSTOPSIG, METH_VARARGS, posix_WSTOPSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007278#endif /* WSTOPSIG */
7279#endif /* HAVE_SYS_WAIT_H */
Thomas Wouters477c8d52006-05-27 19:21:47 +00007280#if defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H)
Victor Stinner97b89882010-05-06 00:25:39 +00007281 {"fstatvfs", posix_fstatvfs, METH_VARARGS, posix_fstatvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00007282#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00007283#if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H)
Victor Stinner97b89882010-05-06 00:25:39 +00007284 {"statvfs", posix_statvfs, METH_VARARGS, posix_statvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00007285#endif
Fred Drakec9680921999-12-13 16:37:25 +00007286#ifdef HAVE_CONFSTR
Victor Stinner97b89882010-05-06 00:25:39 +00007287 {"confstr", posix_confstr, METH_VARARGS, posix_confstr__doc__},
Fred Drakec9680921999-12-13 16:37:25 +00007288#endif
7289#ifdef HAVE_SYSCONF
Victor Stinner97b89882010-05-06 00:25:39 +00007290 {"sysconf", posix_sysconf, METH_VARARGS, posix_sysconf__doc__},
Fred Drakec9680921999-12-13 16:37:25 +00007291#endif
7292#ifdef HAVE_FPATHCONF
Victor Stinner97b89882010-05-06 00:25:39 +00007293 {"fpathconf", posix_fpathconf, METH_VARARGS, posix_fpathconf__doc__},
Fred Drakec9680921999-12-13 16:37:25 +00007294#endif
7295#ifdef HAVE_PATHCONF
Victor Stinner97b89882010-05-06 00:25:39 +00007296 {"pathconf", posix_pathconf, METH_VARARGS, posix_pathconf__doc__},
Fred Drakec9680921999-12-13 16:37:25 +00007297#endif
Victor Stinner97b89882010-05-06 00:25:39 +00007298 {"abort", posix_abort, METH_NOARGS, posix_abort__doc__},
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00007299#ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00007300 {"_getfullpathname", posix__getfullpathname, METH_VARARGS, NULL},
Mark Hammondef8b6542001-05-13 08:04:26 +00007301#endif
Martin v. Löwis438b5342002-12-27 10:16:42 +00007302#ifdef HAVE_GETLOADAVG
Victor Stinner97b89882010-05-06 00:25:39 +00007303 {"getloadavg", posix_getloadavg, METH_NOARGS, posix_getloadavg__doc__},
Martin v. Löwis438b5342002-12-27 10:16:42 +00007304#endif
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00007305 #ifdef MS_WINDOWS
Victor Stinner97b89882010-05-06 00:25:39 +00007306 {"urandom", win32_urandom, METH_VARARGS, win32_urandom__doc__},
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00007307 #endif
Thomas Wouters0e3f5912006-08-11 14:57:12 +00007308 #ifdef __VMS
Victor Stinner97b89882010-05-06 00:25:39 +00007309 {"urandom", vms_urandom, METH_VARARGS, vms_urandom__doc__},
Thomas Wouters0e3f5912006-08-11 14:57:12 +00007310 #endif
Victor Stinner97b89882010-05-06 00:25:39 +00007311 {NULL, NULL} /* Sentinel */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00007312};
7313
7314
Barry Warsaw4a342091996-12-19 23:50:02 +00007315static int
Fred Drake4d1e64b2002-04-15 19:40:07 +00007316ins(PyObject *module, char *symbol, long value)
Barry Warsaw4a342091996-12-19 23:50:02 +00007317{
Victor Stinner97b89882010-05-06 00:25:39 +00007318 return PyModule_AddIntConstant(module, symbol, value);
Barry Warsaw4a342091996-12-19 23:50:02 +00007319}
7320
Guido van Rossumd48f2521997-12-05 22:19:34 +00007321#if defined(PYOS_OS2)
7322/* Insert Platform-Specific Constant Values (Strings & Numbers) of Common Use */
Fred Drake4d1e64b2002-04-15 19:40:07 +00007323static int insertvalues(PyObject *module)
Guido van Rossumd48f2521997-12-05 22:19:34 +00007324{
7325 APIRET rc;
7326 ULONG values[QSV_MAX+1];
7327 PyObject *v;
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00007328 char *ver, tmp[50];
Guido van Rossumd48f2521997-12-05 22:19:34 +00007329
7330 Py_BEGIN_ALLOW_THREADS
Andrew MacIntyre75e01452003-04-21 14:19:51 +00007331 rc = DosQuerySysInfo(1L, QSV_MAX, &values[1], sizeof(ULONG) * QSV_MAX);
Guido van Rossumd48f2521997-12-05 22:19:34 +00007332 Py_END_ALLOW_THREADS
7333
7334 if (rc != NO_ERROR) {
7335 os2_error(rc);
7336 return -1;
7337 }
7338
Fred Drake4d1e64b2002-04-15 19:40:07 +00007339 if (ins(module, "meminstalled", values[QSV_TOTPHYSMEM])) return -1;
7340 if (ins(module, "memkernel", values[QSV_TOTRESMEM])) return -1;
7341 if (ins(module, "memvirtual", values[QSV_TOTAVAILMEM])) return -1;
7342 if (ins(module, "maxpathlen", values[QSV_MAX_PATH_LENGTH])) return -1;
7343 if (ins(module, "maxnamelen", values[QSV_MAX_COMP_LENGTH])) return -1;
7344 if (ins(module, "revision", values[QSV_VERSION_REVISION])) return -1;
7345 if (ins(module, "timeslice", values[QSV_MIN_SLICE])) return -1;
Guido van Rossumd48f2521997-12-05 22:19:34 +00007346
7347 switch (values[QSV_VERSION_MINOR]) {
7348 case 0: ver = "2.00"; break;
7349 case 10: ver = "2.10"; break;
7350 case 11: ver = "2.11"; break;
7351 case 30: ver = "3.00"; break;
7352 case 40: ver = "4.00"; break;
7353 case 50: ver = "5.00"; break;
7354 default:
Tim Peters885d4572001-11-28 20:27:42 +00007355 PyOS_snprintf(tmp, sizeof(tmp),
Victor Stinner97b89882010-05-06 00:25:39 +00007356 "%d-%d", values[QSV_VERSION_MAJOR],
Tim Peters885d4572001-11-28 20:27:42 +00007357 values[QSV_VERSION_MINOR]);
Guido van Rossumd48f2521997-12-05 22:19:34 +00007358 ver = &tmp[0];
7359 }
7360
7361 /* Add Indicator of the Version of the Operating System */
Fred Drake4d1e64b2002-04-15 19:40:07 +00007362 if (PyModule_AddStringConstant(module, "version", tmp) < 0)
Guido van Rossumd48f2521997-12-05 22:19:34 +00007363 return -1;
Guido van Rossumd48f2521997-12-05 22:19:34 +00007364
7365 /* Add Indicator of Which Drive was Used to Boot the System */
7366 tmp[0] = 'A' + values[QSV_BOOT_DRIVE] - 1;
7367 tmp[1] = ':';
7368 tmp[2] = '\0';
7369
Fred Drake4d1e64b2002-04-15 19:40:07 +00007370 return PyModule_AddStringConstant(module, "bootdrive", tmp);
Guido van Rossumd48f2521997-12-05 22:19:34 +00007371}
7372#endif
7373
Barry Warsaw4a342091996-12-19 23:50:02 +00007374static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00007375all_ins(PyObject *d)
Barry Warsaw4a342091996-12-19 23:50:02 +00007376{
Guido van Rossum94f6f721999-01-06 18:42:14 +00007377#ifdef F_OK
Victor Stinner97b89882010-05-06 00:25:39 +00007378 if (ins(d, "F_OK", (long)F_OK)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007379#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00007380#ifdef R_OK
Victor Stinner97b89882010-05-06 00:25:39 +00007381 if (ins(d, "R_OK", (long)R_OK)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007382#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00007383#ifdef W_OK
Victor Stinner97b89882010-05-06 00:25:39 +00007384 if (ins(d, "W_OK", (long)W_OK)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007385#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00007386#ifdef X_OK
Victor Stinner97b89882010-05-06 00:25:39 +00007387 if (ins(d, "X_OK", (long)X_OK)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007388#endif
Fred Drakec9680921999-12-13 16:37:25 +00007389#ifdef NGROUPS_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00007390 if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1;
Fred Drakec9680921999-12-13 16:37:25 +00007391#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007392#ifdef TMP_MAX
Victor Stinner97b89882010-05-06 00:25:39 +00007393 if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007394#endif
Fred Drake106c1a02002-04-23 15:58:02 +00007395#ifdef WCONTINUED
Victor Stinner97b89882010-05-06 00:25:39 +00007396 if (ins(d, "WCONTINUED", (long)WCONTINUED)) return -1;
Fred Drake106c1a02002-04-23 15:58:02 +00007397#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00007398#ifdef WNOHANG
Victor Stinner97b89882010-05-06 00:25:39 +00007399 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007400#endif
Fred Drake106c1a02002-04-23 15:58:02 +00007401#ifdef WUNTRACED
Victor Stinner97b89882010-05-06 00:25:39 +00007402 if (ins(d, "WUNTRACED", (long)WUNTRACED)) return -1;
Fred Drake106c1a02002-04-23 15:58:02 +00007403#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00007404#ifdef O_RDONLY
Victor Stinner97b89882010-05-06 00:25:39 +00007405 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
Barry Warsaw4a342091996-12-19 23:50:02 +00007406#endif
7407#ifdef O_WRONLY
Victor Stinner97b89882010-05-06 00:25:39 +00007408 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
Barry Warsaw4a342091996-12-19 23:50:02 +00007409#endif
7410#ifdef O_RDWR
Victor Stinner97b89882010-05-06 00:25:39 +00007411 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
Barry Warsaw4a342091996-12-19 23:50:02 +00007412#endif
7413#ifdef O_NDELAY
Victor Stinner97b89882010-05-06 00:25:39 +00007414 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
Barry Warsaw4a342091996-12-19 23:50:02 +00007415#endif
7416#ifdef O_NONBLOCK
Victor Stinner97b89882010-05-06 00:25:39 +00007417 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
Barry Warsaw4a342091996-12-19 23:50:02 +00007418#endif
7419#ifdef O_APPEND
Victor Stinner97b89882010-05-06 00:25:39 +00007420 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
Barry Warsaw4a342091996-12-19 23:50:02 +00007421#endif
7422#ifdef O_DSYNC
Victor Stinner97b89882010-05-06 00:25:39 +00007423 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
Barry Warsaw4a342091996-12-19 23:50:02 +00007424#endif
7425#ifdef O_RSYNC
Victor Stinner97b89882010-05-06 00:25:39 +00007426 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
Barry Warsaw4a342091996-12-19 23:50:02 +00007427#endif
7428#ifdef O_SYNC
Victor Stinner97b89882010-05-06 00:25:39 +00007429 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
Barry Warsaw4a342091996-12-19 23:50:02 +00007430#endif
7431#ifdef O_NOCTTY
Victor Stinner97b89882010-05-06 00:25:39 +00007432 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
Barry Warsaw4a342091996-12-19 23:50:02 +00007433#endif
7434#ifdef O_CREAT
Victor Stinner97b89882010-05-06 00:25:39 +00007435 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
Barry Warsaw4a342091996-12-19 23:50:02 +00007436#endif
7437#ifdef O_EXCL
Victor Stinner97b89882010-05-06 00:25:39 +00007438 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
Barry Warsaw4a342091996-12-19 23:50:02 +00007439#endif
7440#ifdef O_TRUNC
Victor Stinner97b89882010-05-06 00:25:39 +00007441 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
Barry Warsaw4a342091996-12-19 23:50:02 +00007442#endif
Guido van Rossum98d9d091997-08-08 21:48:51 +00007443#ifdef O_BINARY
Victor Stinner97b89882010-05-06 00:25:39 +00007444 if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
Guido van Rossum98d9d091997-08-08 21:48:51 +00007445#endif
7446#ifdef O_TEXT
Victor Stinner97b89882010-05-06 00:25:39 +00007447 if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
Guido van Rossum98d9d091997-08-08 21:48:51 +00007448#endif
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007449#ifdef O_LARGEFILE
Victor Stinner97b89882010-05-06 00:25:39 +00007450 if (ins(d, "O_LARGEFILE", (long)O_LARGEFILE)) return -1;
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007451#endif
Skip Montanaro5ff14922005-05-16 02:42:22 +00007452#ifdef O_SHLOCK
Victor Stinner97b89882010-05-06 00:25:39 +00007453 if (ins(d, "O_SHLOCK", (long)O_SHLOCK)) return -1;
Skip Montanaro5ff14922005-05-16 02:42:22 +00007454#endif
7455#ifdef O_EXLOCK
Victor Stinner97b89882010-05-06 00:25:39 +00007456 if (ins(d, "O_EXLOCK", (long)O_EXLOCK)) return -1;
Skip Montanaro5ff14922005-05-16 02:42:22 +00007457#endif
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007458
Tim Peters5aa91602002-01-30 05:46:57 +00007459/* MS Windows */
7460#ifdef O_NOINHERIT
Victor Stinner97b89882010-05-06 00:25:39 +00007461 /* Don't inherit in child processes. */
7462 if (ins(d, "O_NOINHERIT", (long)O_NOINHERIT)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007463#endif
7464#ifdef _O_SHORT_LIVED
Victor Stinner97b89882010-05-06 00:25:39 +00007465 /* Optimize for short life (keep in memory). */
7466 /* MS forgot to define this one with a non-underscore form too. */
7467 if (ins(d, "O_SHORT_LIVED", (long)_O_SHORT_LIVED)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007468#endif
7469#ifdef O_TEMPORARY
Victor Stinner97b89882010-05-06 00:25:39 +00007470 /* Automatically delete when last handle is closed. */
7471 if (ins(d, "O_TEMPORARY", (long)O_TEMPORARY)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007472#endif
7473#ifdef O_RANDOM
Victor Stinner97b89882010-05-06 00:25:39 +00007474 /* Optimize for random access. */
7475 if (ins(d, "O_RANDOM", (long)O_RANDOM)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007476#endif
7477#ifdef O_SEQUENTIAL
Victor Stinner97b89882010-05-06 00:25:39 +00007478 /* Optimize for sequential access. */
7479 if (ins(d, "O_SEQUENTIAL", (long)O_SEQUENTIAL)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007480#endif
7481
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007482/* GNU extensions. */
Alexandre Vassalottibee32532008-05-16 18:15:12 +00007483#ifdef O_ASYNC
Victor Stinner97b89882010-05-06 00:25:39 +00007484 /* Send a SIGIO signal whenever input or output
7485 becomes available on file descriptor */
7486 if (ins(d, "O_ASYNC", (long)O_ASYNC)) return -1;
Alexandre Vassalottibee32532008-05-16 18:15:12 +00007487#endif
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007488#ifdef O_DIRECT
Victor Stinner97b89882010-05-06 00:25:39 +00007489 /* Direct disk access. */
7490 if (ins(d, "O_DIRECT", (long)O_DIRECT)) return -1;
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007491#endif
7492#ifdef O_DIRECTORY
Victor Stinner97b89882010-05-06 00:25:39 +00007493 /* Must be a directory. */
7494 if (ins(d, "O_DIRECTORY", (long)O_DIRECTORY)) return -1;
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007495#endif
7496#ifdef O_NOFOLLOW
Victor Stinner97b89882010-05-06 00:25:39 +00007497 /* Do not follow links. */
7498 if (ins(d, "O_NOFOLLOW", (long)O_NOFOLLOW)) return -1;
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007499#endif
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00007500#ifdef O_NOATIME
Victor Stinner97b89882010-05-06 00:25:39 +00007501 /* Do not update the access time. */
7502 if (ins(d, "O_NOATIME", (long)O_NOATIME)) return -1;
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00007503#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +00007504
Victor Stinner97b89882010-05-06 00:25:39 +00007505 /* These come from sysexits.h */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007506#ifdef EX_OK
Victor Stinner97b89882010-05-06 00:25:39 +00007507 if (ins(d, "EX_OK", (long)EX_OK)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007508#endif /* EX_OK */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007509#ifdef EX_USAGE
Victor Stinner97b89882010-05-06 00:25:39 +00007510 if (ins(d, "EX_USAGE", (long)EX_USAGE)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007511#endif /* EX_USAGE */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007512#ifdef EX_DATAERR
Victor Stinner97b89882010-05-06 00:25:39 +00007513 if (ins(d, "EX_DATAERR", (long)EX_DATAERR)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007514#endif /* EX_DATAERR */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007515#ifdef EX_NOINPUT
Victor Stinner97b89882010-05-06 00:25:39 +00007516 if (ins(d, "EX_NOINPUT", (long)EX_NOINPUT)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007517#endif /* EX_NOINPUT */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007518#ifdef EX_NOUSER
Victor Stinner97b89882010-05-06 00:25:39 +00007519 if (ins(d, "EX_NOUSER", (long)EX_NOUSER)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007520#endif /* EX_NOUSER */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007521#ifdef EX_NOHOST
Victor Stinner97b89882010-05-06 00:25:39 +00007522 if (ins(d, "EX_NOHOST", (long)EX_NOHOST)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007523#endif /* EX_NOHOST */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007524#ifdef EX_UNAVAILABLE
Victor Stinner97b89882010-05-06 00:25:39 +00007525 if (ins(d, "EX_UNAVAILABLE", (long)EX_UNAVAILABLE)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007526#endif /* EX_UNAVAILABLE */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007527#ifdef EX_SOFTWARE
Victor Stinner97b89882010-05-06 00:25:39 +00007528 if (ins(d, "EX_SOFTWARE", (long)EX_SOFTWARE)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007529#endif /* EX_SOFTWARE */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007530#ifdef EX_OSERR
Victor Stinner97b89882010-05-06 00:25:39 +00007531 if (ins(d, "EX_OSERR", (long)EX_OSERR)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007532#endif /* EX_OSERR */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007533#ifdef EX_OSFILE
Victor Stinner97b89882010-05-06 00:25:39 +00007534 if (ins(d, "EX_OSFILE", (long)EX_OSFILE)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007535#endif /* EX_OSFILE */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007536#ifdef EX_CANTCREAT
Victor Stinner97b89882010-05-06 00:25:39 +00007537 if (ins(d, "EX_CANTCREAT", (long)EX_CANTCREAT)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007538#endif /* EX_CANTCREAT */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007539#ifdef EX_IOERR
Victor Stinner97b89882010-05-06 00:25:39 +00007540 if (ins(d, "EX_IOERR", (long)EX_IOERR)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007541#endif /* EX_IOERR */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007542#ifdef EX_TEMPFAIL
Victor Stinner97b89882010-05-06 00:25:39 +00007543 if (ins(d, "EX_TEMPFAIL", (long)EX_TEMPFAIL)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007544#endif /* EX_TEMPFAIL */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007545#ifdef EX_PROTOCOL
Victor Stinner97b89882010-05-06 00:25:39 +00007546 if (ins(d, "EX_PROTOCOL", (long)EX_PROTOCOL)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007547#endif /* EX_PROTOCOL */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007548#ifdef EX_NOPERM
Victor Stinner97b89882010-05-06 00:25:39 +00007549 if (ins(d, "EX_NOPERM", (long)EX_NOPERM)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007550#endif /* EX_NOPERM */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007551#ifdef EX_CONFIG
Victor Stinner97b89882010-05-06 00:25:39 +00007552 if (ins(d, "EX_CONFIG", (long)EX_CONFIG)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007553#endif /* EX_CONFIG */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007554#ifdef EX_NOTFOUND
Victor Stinner97b89882010-05-06 00:25:39 +00007555 if (ins(d, "EX_NOTFOUND", (long)EX_NOTFOUND)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007556#endif /* EX_NOTFOUND */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007557
Guido van Rossum246bc171999-02-01 23:54:31 +00007558#ifdef HAVE_SPAWNV
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00007559#if defined(PYOS_OS2) && defined(PYCC_GCC)
Victor Stinner97b89882010-05-06 00:25:39 +00007560 if (ins(d, "P_WAIT", (long)P_WAIT)) return -1;
7561 if (ins(d, "P_NOWAIT", (long)P_NOWAIT)) return -1;
7562 if (ins(d, "P_OVERLAY", (long)P_OVERLAY)) return -1;
7563 if (ins(d, "P_DEBUG", (long)P_DEBUG)) return -1;
7564 if (ins(d, "P_SESSION", (long)P_SESSION)) return -1;
7565 if (ins(d, "P_DETACH", (long)P_DETACH)) return -1;
7566 if (ins(d, "P_PM", (long)P_PM)) return -1;
7567 if (ins(d, "P_DEFAULT", (long)P_DEFAULT)) return -1;
7568 if (ins(d, "P_MINIMIZE", (long)P_MINIMIZE)) return -1;
7569 if (ins(d, "P_MAXIMIZE", (long)P_MAXIMIZE)) return -1;
7570 if (ins(d, "P_FULLSCREEN", (long)P_FULLSCREEN)) return -1;
7571 if (ins(d, "P_WINDOWED", (long)P_WINDOWED)) return -1;
7572 if (ins(d, "P_FOREGROUND", (long)P_FOREGROUND)) return -1;
7573 if (ins(d, "P_BACKGROUND", (long)P_BACKGROUND)) return -1;
7574 if (ins(d, "P_NOCLOSE", (long)P_NOCLOSE)) return -1;
7575 if (ins(d, "P_NOSESSION", (long)P_NOSESSION)) return -1;
7576 if (ins(d, "P_QUOTE", (long)P_QUOTE)) return -1;
7577 if (ins(d, "P_TILDE", (long)P_TILDE)) return -1;
7578 if (ins(d, "P_UNRELATED", (long)P_UNRELATED)) return -1;
7579 if (ins(d, "P_DEBUGDESC", (long)P_DEBUGDESC)) return -1;
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00007580#else
Victor Stinner97b89882010-05-06 00:25:39 +00007581 if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1;
7582 if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1;
7583 if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1;
7584 if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1;
7585 if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1;
Guido van Rossum246bc171999-02-01 23:54:31 +00007586#endif
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00007587#endif
Guido van Rossum246bc171999-02-01 23:54:31 +00007588
Guido van Rossumd48f2521997-12-05 22:19:34 +00007589#if defined(PYOS_OS2)
Victor Stinner97b89882010-05-06 00:25:39 +00007590 if (insertvalues(d)) return -1;
Guido van Rossumd48f2521997-12-05 22:19:34 +00007591#endif
Victor Stinner97b89882010-05-06 00:25:39 +00007592 return 0;
Barry Warsaw4a342091996-12-19 23:50:02 +00007593}
7594
7595
Tim Peters5aa91602002-01-30 05:46:57 +00007596#if (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__)) && !defined(__QNX__)
Martin v. Löwis1a214512008-06-11 05:26:20 +00007597#define INITFUNC PyInit_nt
Guido van Rossum0cb96de1997-10-01 04:29:29 +00007598#define MODNAME "nt"
Tim Peters58e0a8c2001-05-14 22:32:33 +00007599
7600#elif defined(PYOS_OS2)
Martin v. Löwis1a214512008-06-11 05:26:20 +00007601#define INITFUNC PyInit_os2
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007602#define MODNAME "os2"
Tim Peters58e0a8c2001-05-14 22:32:33 +00007603
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007604#else
Martin v. Löwis1a214512008-06-11 05:26:20 +00007605#define INITFUNC PyInit_posix
Guido van Rossum0cb96de1997-10-01 04:29:29 +00007606#define MODNAME "posix"
7607#endif
7608
Martin v. Löwis1a214512008-06-11 05:26:20 +00007609static struct PyModuleDef posixmodule = {
Victor Stinner97b89882010-05-06 00:25:39 +00007610 PyModuleDef_HEAD_INIT,
7611 MODNAME,
7612 posix__doc__,
7613 -1,
7614 posix_methods,
7615 NULL,
7616 NULL,
7617 NULL,
7618 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +00007619};
7620
7621
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007622PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00007623INITFUNC(void)
Guido van Rossumb6775db1994-08-01 11:34:53 +00007624{
Victor Stinner97b89882010-05-06 00:25:39 +00007625 PyObject *m, *v;
Tim Peters5aa91602002-01-30 05:46:57 +00007626
Victor Stinner97b89882010-05-06 00:25:39 +00007627 m = PyModule_Create(&posixmodule);
7628 if (m == NULL)
7629 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00007630
Victor Stinner97b89882010-05-06 00:25:39 +00007631 /* Initialize environ dictionary */
7632 v = convertenviron();
7633 Py_XINCREF(v);
7634 if (v == NULL || PyModule_AddObject(m, "environ", v) != 0)
7635 return NULL;
7636 Py_DECREF(v);
Fred Drakec9680921999-12-13 16:37:25 +00007637
Victor Stinner97b89882010-05-06 00:25:39 +00007638 if (all_ins(m))
7639 return NULL;
Barry Warsaw4a342091996-12-19 23:50:02 +00007640
Victor Stinner97b89882010-05-06 00:25:39 +00007641 if (setup_confname_tables(m))
7642 return NULL;
Fred Drakebec628d1999-12-15 18:31:10 +00007643
Victor Stinner97b89882010-05-06 00:25:39 +00007644 Py_INCREF(PyExc_OSError);
7645 PyModule_AddObject(m, "error", PyExc_OSError);
Fred Drake762e2061999-08-26 17:23:54 +00007646
Guido van Rossumb3d39562000-01-31 18:41:26 +00007647#ifdef HAVE_PUTENV
Victor Stinner97b89882010-05-06 00:25:39 +00007648 if (posix_putenv_garbage == NULL)
7649 posix_putenv_garbage = PyDict_New();
Guido van Rossumb3d39562000-01-31 18:41:26 +00007650#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +00007651
Victor Stinner97b89882010-05-06 00:25:39 +00007652 if (!initialized) {
7653 stat_result_desc.name = MODNAME ".stat_result";
7654 stat_result_desc.fields[7].name = PyStructSequence_UnnamedField;
7655 stat_result_desc.fields[8].name = PyStructSequence_UnnamedField;
7656 stat_result_desc.fields[9].name = PyStructSequence_UnnamedField;
7657 PyStructSequence_InitType(&StatResultType, &stat_result_desc);
7658 structseq_new = StatResultType.tp_new;
7659 StatResultType.tp_new = statresult_new;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007660
Victor Stinner97b89882010-05-06 00:25:39 +00007661 statvfs_result_desc.name = MODNAME ".statvfs_result";
7662 PyStructSequence_InitType(&StatVFSResultType, &statvfs_result_desc);
Martin v. Löwis05bfe1f2008-12-29 18:21:47 +00007663#ifdef NEED_TICKS_PER_SECOND
7664# if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
Victor Stinner97b89882010-05-06 00:25:39 +00007665 ticks_per_second = sysconf(_SC_CLK_TCK);
Martin v. Löwis05bfe1f2008-12-29 18:21:47 +00007666# elif defined(HZ)
Victor Stinner97b89882010-05-06 00:25:39 +00007667 ticks_per_second = HZ;
Martin v. Löwis05bfe1f2008-12-29 18:21:47 +00007668# else
Victor Stinner97b89882010-05-06 00:25:39 +00007669 ticks_per_second = 60; /* magic fallback value; may be bogus */
Martin v. Löwis05bfe1f2008-12-29 18:21:47 +00007670# endif
7671#endif
Victor Stinner97b89882010-05-06 00:25:39 +00007672 }
7673 Py_INCREF((PyObject*) &StatResultType);
7674 PyModule_AddObject(m, "stat_result", (PyObject*) &StatResultType);
7675 Py_INCREF((PyObject*) &StatVFSResultType);
7676 PyModule_AddObject(m, "statvfs_result",
7677 (PyObject*) &StatVFSResultType);
7678 initialized = 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00007679
7680#ifdef __APPLE__
Victor Stinner97b89882010-05-06 00:25:39 +00007681 /*
7682 * Step 2 of weak-linking support on Mac OS X.
7683 *
7684 * The code below removes functions that are not available on the
7685 * currently active platform.
7686 *
7687 * This block allow one to use a python binary that was build on
7688 * OSX 10.4 on OSX 10.3, without loosing access to new APIs on
7689 * OSX 10.4.
7690 */
Thomas Wouters477c8d52006-05-27 19:21:47 +00007691#ifdef HAVE_FSTATVFS
Victor Stinner97b89882010-05-06 00:25:39 +00007692 if (fstatvfs == NULL) {
7693 if (PyObject_DelAttrString(m, "fstatvfs") == -1) {
7694 return NULL;
7695 }
7696 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00007697#endif /* HAVE_FSTATVFS */
7698
7699#ifdef HAVE_STATVFS
Victor Stinner97b89882010-05-06 00:25:39 +00007700 if (statvfs == NULL) {
7701 if (PyObject_DelAttrString(m, "statvfs") == -1) {
7702 return NULL;
7703 }
7704 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00007705#endif /* HAVE_STATVFS */
7706
7707# ifdef HAVE_LCHOWN
Victor Stinner97b89882010-05-06 00:25:39 +00007708 if (lchown == NULL) {
7709 if (PyObject_DelAttrString(m, "lchown") == -1) {
7710 return NULL;
7711 }
7712 }
Thomas Wouters477c8d52006-05-27 19:21:47 +00007713#endif /* HAVE_LCHOWN */
7714
7715
7716#endif /* __APPLE__ */
Victor Stinner97b89882010-05-06 00:25:39 +00007717 return m;
Thomas Wouters477c8d52006-05-27 19:21:47 +00007718
Guido van Rossumb6775db1994-08-01 11:34:53 +00007719}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007720
7721#ifdef __cplusplus
7722}
7723#endif