blob: e6ef4107a121ac2d389dc06f104c7f4f68f06762 [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 /*
18 * Step 1 of support for weak-linking a number of symbols existing on
19 * 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
72#include <sys/wait.h> /* For WNOHANG */
73#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
Guido van Rossumc5a0f531997-12-02 20:36:02 +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
107#define HAVE_SYSTEM 1
108#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
114#ifdef __BORLANDC__ /* Borland compiler */
115#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
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000119#define HAVE_SYSTEM 1
120#define HAVE_WAIT 1
121#else
122#ifdef _MSC_VER /* Microsoft compiler */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000123#define HAVE_GETCWD 1
Guido van Rossuma1065681999-01-25 23:20:23 +0000124#define HAVE_SPAWNV 1
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000125#define HAVE_EXECV 1
126#define HAVE_PIPE 1
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000127#define HAVE_SYSTEM 1
Tim Petersab034fa2002-02-01 11:27:43 +0000128#define HAVE_CWAIT 1
Tim Peters11b23062003-04-23 02:39:17 +0000129#define HAVE_FSYNC 1
130#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 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000134#else /* all other compilers */
135/* Unix functions that the configure script doesn't check for */
136#define HAVE_EXECV 1
137#define HAVE_FORK 1
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000138#if defined(__USLC__) && defined(__SCO_VERSION__) /* SCO UDK Compiler */
139#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
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000150#define HAVE_SYSTEM 1
151#define HAVE_WAIT 1
Guido van Rossumd371ff11999-01-25 16:12:23 +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>
Tim Petersee66d0c2002-07-15 16:10:55 +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
Greg Wardb48bc172000-03-01 21:51:56 +0000306/* Don't use the "_r" form if we don't need it (also, won't have a
307 prototype for it, at least on Solaris -- maybe others as well?). */
308#if defined(HAVE_CTERMID_R) && defined(WITH_THREAD)
309#define USE_CTERMID_R
310#endif
311
Fred Drake699f3522000-06-29 21:12:41 +0000312/* choose the appropriate stat and fstat functions and return structs */
Guido van Rossum64529cd2000-06-30 22:45:12 +0000313#undef STAT
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000314#if defined(MS_WIN64) || defined(MS_WINDOWS)
Martin v. Löwis14694662006-02-03 12:54:16 +0000315# define STAT win32_stat
316# define FSTAT win32_fstat
317# define STRUCT_STAT struct win32_stat
Fred Drake699f3522000-06-29 21:12:41 +0000318#else
319# define STAT stat
320# define FSTAT fstat
321# define STRUCT_STAT struct stat
322#endif
323
Tim Peters11b23062003-04-23 02:39:17 +0000324#if defined(MAJOR_IN_MKDEV)
Martin v. Löwisdbe3f762002-10-10 14:27:30 +0000325#include <sys/mkdev.h>
326#else
327#if defined(MAJOR_IN_SYSMACROS)
328#include <sys/sysmacros.h>
329#endif
Neal Norwitz3d949422002-04-20 13:46:43 +0000330#if defined(HAVE_MKNOD) && defined(HAVE_SYS_MKDEV_H)
331#include <sys/mkdev.h>
332#endif
Martin v. Löwisdbe3f762002-10-10 14:27:30 +0000333#endif
Fred Drake699f3522000-06-29 21:12:41 +0000334
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000335#if defined _MSC_VER && _MSC_VER >= 1400
336/* Microsoft CRT in VS2005 and higher will verify that a filehandle is
337 * valid and throw an assertion if it isn't.
338 * Normally, an invalid fd is likely to be a C program error and therefore
339 * an assertion can be useful, but it does contradict the POSIX standard
340 * which for write(2) states:
341 * "Otherwise, -1 shall be returned and errno set to indicate the error."
342 * "[EBADF] The fildes argument is not a valid file descriptor open for
343 * writing."
344 * Furthermore, python allows the user to enter any old integer
345 * as a fd and should merely raise a python exception on error.
346 * The Microsoft CRT doesn't provide an official way to check for the
347 * validity of a file descriptor, but we can emulate its internal behaviour
348 * by using the exported __pinfo data member and knowledge of the
349 * internal structures involved.
350 * The structures below must be updated for each version of visual studio
351 * according to the file internal.h in the CRT source, until MS comes
352 * up with a less hacky way to do this.
353 * (all of this is to avoid globally modifying the CRT behaviour using
354 * _set_invalid_parameter_handler() and _CrtSetReportMode())
355 */
Kristján Valur Jónssonf64e6512009-04-13 10:16:14 +0000356/* The actual size of the structure is determined at runtime.
357 * Only the first items must be present.
358 */
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000359typedef struct {
360 intptr_t osfhnd;
361 char osfile;
Kristján Valur Jónssonf64e6512009-04-13 10:16:14 +0000362} my_ioinfo;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000363
Kristján Valur Jónssonf64e6512009-04-13 10:16:14 +0000364extern __declspec(dllimport) char * __pioinfo[];
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000365#define IOINFO_L2E 5
366#define IOINFO_ARRAY_ELTS (1 << IOINFO_L2E)
367#define IOINFO_ARRAYS 64
368#define _NHANDLE_ (IOINFO_ARRAYS * IOINFO_ARRAY_ELTS)
369#define FOPEN 0x01
370#define _NO_CONSOLE_FILENO (intptr_t)-2
371
372/* This function emulates what the windows CRT does to validate file handles */
373int
374_PyVerify_fd(int fd)
375{
376 const int i1 = fd >> IOINFO_L2E;
377 const int i2 = fd & ((1 << IOINFO_L2E) - 1);
Kristján Valur Jónssonf64e6512009-04-13 10:16:14 +0000378
379 static int sizeof_ioinfo = 0;
380
381 /* Determine the actual size of the ioinfo structure,
382 * as used by the CRT loaded in memory
383 */
384 if (sizeof_ioinfo == 0 && __pioinfo[0] != NULL) {
385 sizeof_ioinfo = _msize(__pioinfo[0]) / IOINFO_ARRAY_ELTS;
386 }
387 if (sizeof_ioinfo == 0) {
388 /* This should not happen... */
389 goto fail;
390 }
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000391
392 /* See that it isn't a special CLEAR fileno */
393 if (fd != _NO_CONSOLE_FILENO) {
394 /* Microsoft CRT would check that 0<=fd<_nhandle but we can't do that. Instead
395 * we check pointer validity and other info
396 */
397 if (0 <= i1 && i1 < IOINFO_ARRAYS && __pioinfo[i1] != NULL) {
398 /* finally, check that the file is open */
Kristján Valur Jónssonf64e6512009-04-13 10:16:14 +0000399 my_ioinfo* info = (my_ioinfo*)(__pioinfo[i1] + i2 * sizeof_ioinfo);
400 if (info->osfile & FOPEN) {
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000401 return 1;
Kristján Valur Jónssonf64e6512009-04-13 10:16:14 +0000402 }
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000403 }
404 }
Kristján Valur Jónssonf64e6512009-04-13 10:16:14 +0000405 fail:
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000406 errno = EBADF;
407 return 0;
408}
409
410/* the special case of checking dup2. The target fd must be in a sensible range */
411static int
412_PyVerify_fd_dup2(int fd1, int fd2)
413{
414 if (!_PyVerify_fd(fd1))
415 return 0;
416 if (fd2 == _NO_CONSOLE_FILENO)
417 return 0;
418 if ((unsigned)fd2 < _NHANDLE_)
419 return 1;
420 else
421 return 0;
422}
423#else
424/* dummy version. _PyVerify_fd() is already defined in fileobject.h */
425#define _PyVerify_fd_dup2(A, B) (1)
426#endif
427
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428/* Return a dictionary corresponding to the POSIX environment table */
Jack Jansenea0c3822002-08-01 21:57:49 +0000429#ifdef WITH_NEXT_FRAMEWORK
430/* On Darwin/MacOSX a shared library or framework has no access to
431** environ directly, we must obtain it with _NSGetEnviron().
432*/
433#include <crt_externs.h>
434static char **environ;
435#elif !defined(_MSC_VER) && ( !defined(__WATCOMC__) || defined(__QNX__) )
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000437#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000438
Barry Warsaw53699e91996-12-10 23:23:01 +0000439static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000440convertenviron(void)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441{
Barry Warsaw53699e91996-12-10 23:23:01 +0000442 PyObject *d;
Thomas Hellerf78f12a2007-11-08 19:33:05 +0000443#ifdef MS_WINDOWS
444 wchar_t **e;
445#else
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446 char **e;
Thomas Hellerf78f12a2007-11-08 19:33:05 +0000447#endif
Barry Warsaw53699e91996-12-10 23:23:01 +0000448 d = PyDict_New();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449 if (d == NULL)
450 return NULL;
Jack Jansenea0c3822002-08-01 21:57:49 +0000451#ifdef WITH_NEXT_FRAMEWORK
452 if (environ == NULL)
453 environ = *_NSGetEnviron();
454#endif
Thomas Hellerf78f12a2007-11-08 19:33:05 +0000455#ifdef MS_WINDOWS
456 /* _wenviron must be initialized in this way if the program is started
457 through main() instead of wmain(). */
458 _wgetenv(L"");
459 if (_wenviron == NULL)
460 return d;
461 /* This part ignores errors */
462 for (e = _wenviron; *e != NULL; e++) {
463 PyObject *k;
464 PyObject *v;
465 wchar_t *p = wcschr(*e, L'=');
466 if (p == NULL)
467 continue;
468 k = PyUnicode_FromWideChar(*e, (Py_ssize_t)(p-*e));
469 if (k == NULL) {
470 PyErr_Clear();
471 continue;
472 }
473 v = PyUnicode_FromWideChar(p+1, wcslen(p+1));
474 if (v == NULL) {
475 PyErr_Clear();
476 Py_DECREF(k);
477 continue;
478 }
479 if (PyDict_GetItem(d, k) == NULL) {
480 if (PyDict_SetItem(d, k, v) != 0)
481 PyErr_Clear();
482 }
483 Py_DECREF(k);
484 Py_DECREF(v);
485 }
486#else
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487 if (environ == NULL)
488 return d;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000489 /* This part ignores errors */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490 for (e = environ; *e != NULL; e++) {
Guido van Rossum6a619f41999-08-03 19:41:10 +0000491 PyObject *k;
Barry Warsaw53699e91996-12-10 23:23:01 +0000492 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000493 char *p = strchr(*e, '=');
494 if (p == NULL)
495 continue;
Martin v. Löwis011e8422009-05-05 04:43:17 +0000496 k = PyUnicode_Decode(*e, (int)(p-*e),
Martin v. Löwis43c57782009-05-10 08:15:24 +0000497 Py_FileSystemDefaultEncoding, "surrogateescape");
Guido van Rossum6a619f41999-08-03 19:41:10 +0000498 if (k == NULL) {
499 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000500 continue;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000501 }
Martin v. Löwis011e8422009-05-05 04:43:17 +0000502 v = PyUnicode_Decode(p+1, strlen(p+1),
Martin v. Löwis43c57782009-05-10 08:15:24 +0000503 Py_FileSystemDefaultEncoding, "surrogateescape");
Guido van Rossum6a619f41999-08-03 19:41:10 +0000504 if (v == NULL) {
505 PyErr_Clear();
506 Py_DECREF(k);
507 continue;
508 }
509 if (PyDict_GetItem(d, k) == NULL) {
510 if (PyDict_SetItem(d, k, v) != 0)
511 PyErr_Clear();
512 }
513 Py_DECREF(k);
Barry Warsaw53699e91996-12-10 23:23:01 +0000514 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000515 }
Thomas Hellerf78f12a2007-11-08 19:33:05 +0000516#endif
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +0000517#if defined(PYOS_OS2)
Guido van Rossumd48f2521997-12-05 22:19:34 +0000518 {
519 APIRET rc;
520 char buffer[1024]; /* OS/2 Provides a Documented Max of 1024 Chars */
521
522 rc = DosQueryExtLIBPATH(buffer, BEGIN_LIBPATH);
Fredrik Lundhff7df9d2000-07-08 22:48:53 +0000523 if (rc == NO_ERROR) { /* (not a type, envname is NOT 'BEGIN_LIBPATH') */
Christian Heimes72b710a2008-05-26 13:28:38 +0000524 PyObject *v = PyBytes_FromString(buffer);
Neal Norwitz93c56822007-08-26 07:10:06 +0000525 PyDict_SetItemString(d, "BEGINLIBPATH", v);
Guido van Rossumd48f2521997-12-05 22:19:34 +0000526 Py_DECREF(v);
527 }
528 rc = DosQueryExtLIBPATH(buffer, END_LIBPATH);
529 if (rc == NO_ERROR) { /* (not a typo, envname is NOT 'END_LIBPATH') */
Christian Heimes72b710a2008-05-26 13:28:38 +0000530 PyObject *v = PyBytes_FromString(buffer);
Neal Norwitz93c56822007-08-26 07:10:06 +0000531 PyDict_SetItemString(d, "ENDLIBPATH", v);
Guido van Rossumd48f2521997-12-05 22:19:34 +0000532 Py_DECREF(v);
533 }
534 }
535#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000536 return d;
537}
538
Martin v. Löwis011e8422009-05-05 04:43:17 +0000539/* Convert a bytes object to a char*. Optionally lock the buffer if it is a
540 bytes array. */
541
542static char*
543bytes2str(PyObject* o, int lock)
544{
545 if(PyBytes_Check(o))
546 return PyBytes_AsString(o);
547 else if(PyByteArray_Check(o)) {
548 if (lock && PyObject_GetBuffer(o, NULL, 0) < 0)
549 /* On a bytearray, this should not fail. */
550 PyErr_BadInternalCall();
551 return PyByteArray_AsString(o);
552 } else {
553 /* The FS converter should have verified that this
554 is either bytes or bytearray. */
555 Py_FatalError("bad object passed to bytes2str");
556 /* not reached. */
557 return "";
558 }
559}
560
561/* Release the lock, decref the object. */
562static void
563release_bytes(PyObject* o)
564{
565 if (PyByteArray_Check(o))
Antoine Pitrou1119a642010-01-17 12:16:23 +0000566 o->ob_type->tp_as_buffer->bf_releasebuffer(o, 0);
Martin v. Löwis011e8422009-05-05 04:43:17 +0000567 Py_DECREF(o);
568}
569
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000570
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000571/* Set a POSIX-specific error from errno, and return NULL */
572
Barry Warsawd58d7641998-07-23 16:14:40 +0000573static PyObject *
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000574posix_error(void)
Guido van Rossumad0ee831995-03-01 10:34:45 +0000575{
Barry Warsawca74da41999-02-09 19:31:45 +0000576 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000577}
Barry Warsawd58d7641998-07-23 16:14:40 +0000578static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +0000579posix_error_with_filename(char* name)
Barry Warsawd58d7641998-07-23 16:14:40 +0000580{
Barry Warsawca74da41999-02-09 19:31:45 +0000581 return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);
Barry Warsawd58d7641998-07-23 16:14:40 +0000582}
583
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000584#ifdef MS_WINDOWS
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000585static PyObject *
586posix_error_with_unicode_filename(Py_UNICODE* name)
587{
588 return PyErr_SetFromErrnoWithUnicodeFilename(PyExc_OSError, name);
589}
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000590#endif /* MS_WINDOWS */
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000591
592
Mark Hammondef8b6542001-05-13 08:04:26 +0000593static PyObject *
Martin v. Löwis011e8422009-05-05 04:43:17 +0000594posix_error_with_allocated_filename(PyObject* name)
Mark Hammondef8b6542001-05-13 08:04:26 +0000595{
Martin v. Löwis011e8422009-05-05 04:43:17 +0000596 PyObject *rc = PyErr_SetFromErrnoWithFilename(PyExc_OSError,
597 bytes2str(name, 0));
598 release_bytes(name);
Mark Hammondef8b6542001-05-13 08:04:26 +0000599 return rc;
600}
601
Martin v. Löwis6238d2b2002-06-30 15:26:10 +0000602#ifdef MS_WINDOWS
Fredrik Lundhffb9c772000-07-09 14:49:51 +0000603static PyObject *
604win32_error(char* function, char* filename)
605{
Mark Hammond33a6da92000-08-15 00:46:38 +0000606 /* XXX We should pass the function name along in the future.
Georg Brandl38feaf02008-05-25 07:45:51 +0000607 (winreg.c also wants to pass the function name.)
Tim Peters5aa91602002-01-30 05:46:57 +0000608 This would however require an additional param to the
Mark Hammond33a6da92000-08-15 00:46:38 +0000609 Windows error object, which is non-trivial.
610 */
Fredrik Lundhffb9c772000-07-09 14:49:51 +0000611 errno = GetLastError();
612 if (filename)
Mark Hammond33a6da92000-08-15 00:46:38 +0000613 return PyErr_SetFromWindowsErrWithFilename(errno, filename);
Fredrik Lundhffb9c772000-07-09 14:49:51 +0000614 else
Mark Hammond33a6da92000-08-15 00:46:38 +0000615 return PyErr_SetFromWindowsErr(errno);
Fredrik Lundhffb9c772000-07-09 14:49:51 +0000616}
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000617
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000618static PyObject *
619win32_error_unicode(char* function, Py_UNICODE* filename)
620{
621 /* XXX - see win32_error for comments on 'function' */
622 errno = GetLastError();
623 if (filename)
624 return PyErr_SetFromWindowsErrWithUnicodeFilename(errno, filename);
625 else
626 return PyErr_SetFromWindowsErr(errno);
627}
628
Thomas Wouters477c8d52006-05-27 19:21:47 +0000629static int
Hirokazu Yamamotod7e4c082008-08-17 09:30:15 +0000630convert_to_unicode(PyObject **param)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000631{
Hirokazu Yamamotod7e4c082008-08-17 09:30:15 +0000632 if (PyUnicode_CheckExact(*param))
633 Py_INCREF(*param);
634 else if (PyUnicode_Check(*param))
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000635 /* For a Unicode subtype that's not a Unicode object,
636 return a true Unicode object with the same data. */
Hirokazu Yamamotod7e4c082008-08-17 09:30:15 +0000637 *param = PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(*param),
638 PyUnicode_GET_SIZE(*param));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000639 else
Hirokazu Yamamotod7e4c082008-08-17 09:30:15 +0000640 *param = PyUnicode_FromEncodedObject(*param,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000641 Py_FileSystemDefaultEncoding,
642 "strict");
643 return (*param) != NULL;
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000644}
645
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000646#endif /* MS_WINDOWS */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000647
Guido van Rossumd48f2521997-12-05 22:19:34 +0000648#if defined(PYOS_OS2)
649/**********************************************************************
650 * Helper Function to Trim and Format OS/2 Messages
651 **********************************************************************/
652 static void
653os2_formatmsg(char *msgbuf, int msglen, char *reason)
654{
655 msgbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
656
657 if (strlen(msgbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
658 char *lastc = &msgbuf[ strlen(msgbuf)-1 ];
659
Neal Norwitz30b5c5d2005-12-19 06:05:18 +0000660 while (lastc > msgbuf && isspace(Py_CHARMASK(*lastc)))
Guido van Rossumd48f2521997-12-05 22:19:34 +0000661 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
662 }
663
664 /* Add Optional Reason Text */
665 if (reason) {
666 strcat(msgbuf, " : ");
667 strcat(msgbuf, reason);
668 }
669}
670
671/**********************************************************************
672 * Decode an OS/2 Operating System Error Code
673 *
674 * A convenience function to lookup an OS/2 error code and return a
675 * text message we can use to raise a Python exception.
676 *
677 * Notes:
678 * The messages for errors returned from the OS/2 kernel reside in
679 * the file OSO001.MSG in the \OS2 directory hierarchy.
680 *
681 **********************************************************************/
682 static char *
683os2_strerror(char *msgbuf, int msgbuflen, int errorcode, char *reason)
684{
685 APIRET rc;
686 ULONG msglen;
687
688 /* Retrieve Kernel-Related Error Message from OSO001.MSG File */
689 Py_BEGIN_ALLOW_THREADS
690 rc = DosGetMessage(NULL, 0, msgbuf, msgbuflen,
691 errorcode, "oso001.msg", &msglen);
692 Py_END_ALLOW_THREADS
693
694 if (rc == NO_ERROR)
695 os2_formatmsg(msgbuf, msglen, reason);
696 else
Tim Peters1ceb5fb2001-11-28 20:32:57 +0000697 PyOS_snprintf(msgbuf, msgbuflen,
Tim Peters885d4572001-11-28 20:27:42 +0000698 "unknown OS error #%d", errorcode);
Guido van Rossumd48f2521997-12-05 22:19:34 +0000699
700 return msgbuf;
701}
702
703/* Set an OS/2-specific error and return NULL. OS/2 kernel
704 errors are not in a global variable e.g. 'errno' nor are
705 they congruent with posix error numbers. */
706
707static PyObject * os2_error(int code)
708{
709 char text[1024];
710 PyObject *v;
711
712 os2_strerror(text, sizeof(text), code, "");
713
714 v = Py_BuildValue("(is)", code, text);
715 if (v != NULL) {
Barry Warsawca74da41999-02-09 19:31:45 +0000716 PyErr_SetObject(PyExc_OSError, v);
Guido van Rossumd48f2521997-12-05 22:19:34 +0000717 Py_DECREF(v);
718 }
719 return NULL; /* Signal to Python that an Exception is Pending */
720}
721
722#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000723
724/* POSIX generic methods */
725
Barry Warsaw53699e91996-12-10 23:23:01 +0000726static PyObject *
Fred Drake4d1e64b2002-04-15 19:40:07 +0000727posix_fildes(PyObject *fdobj, int (*func)(int))
728{
729 int fd;
730 int res;
731 fd = PyObject_AsFileDescriptor(fdobj);
732 if (fd < 0)
733 return NULL;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +0000734 if (!_PyVerify_fd(fd))
735 return posix_error();
Fred Drake4d1e64b2002-04-15 19:40:07 +0000736 Py_BEGIN_ALLOW_THREADS
737 res = (*func)(fd);
738 Py_END_ALLOW_THREADS
739 if (res < 0)
740 return posix_error();
741 Py_INCREF(Py_None);
742 return Py_None;
743}
Guido van Rossum21142a01999-01-08 21:05:37 +0000744
745static PyObject *
Thomas Wouters477c8d52006-05-27 19:21:47 +0000746posix_1str(PyObject *args, char *format, int (*func)(const char*))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000747{
Martin v. Löwis011e8422009-05-05 04:43:17 +0000748 PyObject *opath1 = NULL;
749 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000750 int res;
Tim Peters5aa91602002-01-30 05:46:57 +0000751 if (!PyArg_ParseTuple(args, format,
Martin v. Löwis011e8422009-05-05 04:43:17 +0000752 PyUnicode_FSConverter, &opath1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000753 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +0000754 path1 = bytes2str(opath1, 1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000755 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000756 res = (*func)(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000757 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000758 if (res < 0)
Martin v. Löwis011e8422009-05-05 04:43:17 +0000759 return posix_error_with_allocated_filename(opath1);
760 release_bytes(opath1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000761 Py_INCREF(Py_None);
762 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000763}
764
Barry Warsaw53699e91996-12-10 23:23:01 +0000765static PyObject *
Tim Peters11b23062003-04-23 02:39:17 +0000766posix_2str(PyObject *args,
Mark Hammondc2e85bd2002-10-03 05:10:39 +0000767 char *format,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000768 int (*func)(const char *, const char *))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000769{
Antoine Pitroua6bb9842009-05-10 22:27:00 +0000770 PyObject *opath1 = NULL, *opath2 = NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +0000771 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000772 int res;
Mark Hammondef8b6542001-05-13 08:04:26 +0000773 if (!PyArg_ParseTuple(args, format,
Martin v. Löwis011e8422009-05-05 04:43:17 +0000774 PyUnicode_FSConverter, &opath1,
Antoine Pitroua6bb9842009-05-10 22:27:00 +0000775 PyUnicode_FSConverter, &opath2)) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000776 return NULL;
Antoine Pitroua6bb9842009-05-10 22:27:00 +0000777 }
Martin v. Löwis011e8422009-05-05 04:43:17 +0000778 path1 = bytes2str(opath1, 1);
779 path2 = bytes2str(opath2, 1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000780 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000781 res = (*func)(path1, path2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000782 Py_END_ALLOW_THREADS
Martin v. Löwis011e8422009-05-05 04:43:17 +0000783 release_bytes(opath1);
784 release_bytes(opath2);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000785 if (res != 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000786 /* XXX how to report both path1 and path2??? */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000787 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000788 Py_INCREF(Py_None);
789 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000790}
791
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +0000792#ifdef MS_WINDOWS
Thomas Wouters477c8d52006-05-27 19:21:47 +0000793static PyObject*
794win32_1str(PyObject* args, char* func,
795 char* format, BOOL (__stdcall *funcA)(LPCSTR),
796 char* wformat, BOOL (__stdcall *funcW)(LPWSTR))
797{
798 PyObject *uni;
799 char *ansi;
800 BOOL result;
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +0000801
802 if (!PyArg_ParseTuple(args, wformat, &uni))
803 PyErr_Clear();
804 else {
805 Py_BEGIN_ALLOW_THREADS
806 result = funcW(PyUnicode_AsUnicode(uni));
807 Py_END_ALLOW_THREADS
808 if (!result)
809 return win32_error_unicode(func, PyUnicode_AsUnicode(uni));
810 Py_INCREF(Py_None);
811 return Py_None;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000812 }
813 if (!PyArg_ParseTuple(args, format, &ansi))
814 return NULL;
815 Py_BEGIN_ALLOW_THREADS
816 result = funcA(ansi);
817 Py_END_ALLOW_THREADS
818 if (!result)
819 return win32_error(func, ansi);
820 Py_INCREF(Py_None);
821 return Py_None;
822
823}
824
825/* This is a reimplementation of the C library's chdir function,
826 but one that produces Win32 errors instead of DOS error codes.
827 chdir is essentially a wrapper around SetCurrentDirectory; however,
828 it also needs to set "magic" environment variables indicating
829 the per-drive current directory, which are of the form =<drive>: */
Benjamin Peterson206e3072008-10-19 14:07:49 +0000830static BOOL __stdcall
Thomas Wouters477c8d52006-05-27 19:21:47 +0000831win32_chdir(LPCSTR path)
832{
833 char new_path[MAX_PATH+1];
834 int result;
835 char env[4] = "=x:";
836
837 if(!SetCurrentDirectoryA(path))
838 return FALSE;
839 result = GetCurrentDirectoryA(MAX_PATH+1, new_path);
840 if (!result)
841 return FALSE;
842 /* In the ANSI API, there should not be any paths longer
843 than MAX_PATH. */
844 assert(result <= MAX_PATH+1);
845 if (strncmp(new_path, "\\\\", 2) == 0 ||
846 strncmp(new_path, "//", 2) == 0)
847 /* UNC path, nothing to do. */
848 return TRUE;
849 env[1] = new_path[0];
850 return SetEnvironmentVariableA(env, new_path);
851}
852
853/* The Unicode version differs from the ANSI version
854 since the current directory might exceed MAX_PATH characters */
Benjamin Peterson206e3072008-10-19 14:07:49 +0000855static BOOL __stdcall
Thomas Wouters477c8d52006-05-27 19:21:47 +0000856win32_wchdir(LPCWSTR path)
857{
858 wchar_t _new_path[MAX_PATH+1], *new_path = _new_path;
859 int result;
860 wchar_t env[4] = L"=x:";
861
862 if(!SetCurrentDirectoryW(path))
863 return FALSE;
864 result = GetCurrentDirectoryW(MAX_PATH+1, new_path);
865 if (!result)
866 return FALSE;
867 if (result > MAX_PATH+1) {
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000868 new_path = malloc(result * sizeof(wchar_t));
Thomas Wouters477c8d52006-05-27 19:21:47 +0000869 if (!new_path) {
870 SetLastError(ERROR_OUTOFMEMORY);
871 return FALSE;
872 }
Benjamin Petersonf10a79a2008-10-11 00:49:57 +0000873 result = GetCurrentDirectoryW(result, new_path);
874 if (!result) {
875 free(new_path);
876 return FALSE;
877 }
Thomas Wouters477c8d52006-05-27 19:21:47 +0000878 }
879 if (wcsncmp(new_path, L"\\\\", 2) == 0 ||
880 wcsncmp(new_path, L"//", 2) == 0)
881 /* UNC path, nothing to do. */
882 return TRUE;
883 env[1] = new_path[0];
884 result = SetEnvironmentVariableW(env, new_path);
885 if (new_path != _new_path)
886 free(new_path);
887 return result;
888}
889#endif
890
Martin v. Löwis14694662006-02-03 12:54:16 +0000891#ifdef MS_WINDOWS
892/* The CRT of Windows has a number of flaws wrt. its stat() implementation:
893 - time stamps are restricted to second resolution
894 - file modification times suffer from forth-and-back conversions between
895 UTC and local time
896 Therefore, we implement our own stat, based on the Win32 API directly.
897*/
898#define HAVE_STAT_NSEC 1
899
900struct win32_stat{
901 int st_dev;
902 __int64 st_ino;
903 unsigned short st_mode;
904 int st_nlink;
905 int st_uid;
906 int st_gid;
907 int st_rdev;
908 __int64 st_size;
909 int st_atime;
910 int st_atime_nsec;
911 int st_mtime;
912 int st_mtime_nsec;
913 int st_ctime;
914 int st_ctime_nsec;
915};
916
917static __int64 secs_between_epochs = 11644473600; /* Seconds between 1.1.1601 and 1.1.1970 */
918
919static void
920FILE_TIME_to_time_t_nsec(FILETIME *in_ptr, int *time_out, int* nsec_out)
921{
Thomas Wouters477c8d52006-05-27 19:21:47 +0000922 /* XXX endianness. Shouldn't matter, as all Windows implementations are little-endian */
923 /* Cannot simply cast and dereference in_ptr,
924 since it might not be aligned properly */
925 __int64 in;
926 memcpy(&in, in_ptr, sizeof(in));
Martin v. Löwis14694662006-02-03 12:54:16 +0000927 *nsec_out = (int)(in % 10000000) * 100; /* FILETIME is in units of 100 nsec. */
928 /* XXX Win32 supports time stamps past 2038; we currently don't */
929 *time_out = Py_SAFE_DOWNCAST((in / 10000000) - secs_between_epochs, __int64, int);
930}
931
Thomas Wouters477c8d52006-05-27 19:21:47 +0000932static void
933time_t_to_FILE_TIME(int time_in, int nsec_in, FILETIME *out_ptr)
934{
935 /* XXX endianness */
936 __int64 out;
937 out = time_in + secs_between_epochs;
Thomas Wouters89f507f2006-12-13 04:49:30 +0000938 out = out * 10000000 + nsec_in / 100;
Thomas Wouters477c8d52006-05-27 19:21:47 +0000939 memcpy(out_ptr, &out, sizeof(out));
940}
941
Martin v. Löwis14694662006-02-03 12:54:16 +0000942/* Below, we *know* that ugo+r is 0444 */
943#if _S_IREAD != 0400
944#error Unsupported C library
945#endif
946static int
947attributes_to_mode(DWORD attr)
948{
949 int m = 0;
950 if (attr & FILE_ATTRIBUTE_DIRECTORY)
951 m |= _S_IFDIR | 0111; /* IFEXEC for user,group,other */
952 else
953 m |= _S_IFREG;
954 if (attr & FILE_ATTRIBUTE_READONLY)
955 m |= 0444;
956 else
957 m |= 0666;
958 return m;
959}
960
961static int
962attribute_data_to_stat(WIN32_FILE_ATTRIBUTE_DATA *info, struct win32_stat *result)
963{
964 memset(result, 0, sizeof(*result));
965 result->st_mode = attributes_to_mode(info->dwFileAttributes);
966 result->st_size = (((__int64)info->nFileSizeHigh)<<32) + info->nFileSizeLow;
967 FILE_TIME_to_time_t_nsec(&info->ftCreationTime, &result->st_ctime, &result->st_ctime_nsec);
968 FILE_TIME_to_time_t_nsec(&info->ftLastWriteTime, &result->st_mtime, &result->st_mtime_nsec);
969 FILE_TIME_to_time_t_nsec(&info->ftLastAccessTime, &result->st_atime, &result->st_atime_nsec);
970
971 return 0;
972}
973
Guido van Rossumd8faa362007-04-27 19:54:29 +0000974static BOOL
975attributes_from_dir(LPCSTR pszFile, LPWIN32_FILE_ATTRIBUTE_DATA pfad)
976{
977 HANDLE hFindFile;
978 WIN32_FIND_DATAA FileData;
979 hFindFile = FindFirstFileA(pszFile, &FileData);
980 if (hFindFile == INVALID_HANDLE_VALUE)
981 return FALSE;
982 FindClose(hFindFile);
983 pfad->dwFileAttributes = FileData.dwFileAttributes;
984 pfad->ftCreationTime = FileData.ftCreationTime;
985 pfad->ftLastAccessTime = FileData.ftLastAccessTime;
986 pfad->ftLastWriteTime = FileData.ftLastWriteTime;
987 pfad->nFileSizeHigh = FileData.nFileSizeHigh;
988 pfad->nFileSizeLow = FileData.nFileSizeLow;
989 return TRUE;
990}
991
992static BOOL
993attributes_from_dir_w(LPCWSTR pszFile, LPWIN32_FILE_ATTRIBUTE_DATA pfad)
994{
995 HANDLE hFindFile;
996 WIN32_FIND_DATAW FileData;
997 hFindFile = FindFirstFileW(pszFile, &FileData);
998 if (hFindFile == INVALID_HANDLE_VALUE)
999 return FALSE;
1000 FindClose(hFindFile);
1001 pfad->dwFileAttributes = FileData.dwFileAttributes;
1002 pfad->ftCreationTime = FileData.ftCreationTime;
1003 pfad->ftLastAccessTime = FileData.ftLastAccessTime;
1004 pfad->ftLastWriteTime = FileData.ftLastWriteTime;
1005 pfad->nFileSizeHigh = FileData.nFileSizeHigh;
1006 pfad->nFileSizeLow = FileData.nFileSizeLow;
1007 return TRUE;
1008}
1009
Martin v. Löwis14694662006-02-03 12:54:16 +00001010static int
1011win32_stat(const char* path, struct win32_stat *result)
1012{
1013 WIN32_FILE_ATTRIBUTE_DATA info;
1014 int code;
1015 char *dot;
Hirokazu Yamamoto6fbdfda2009-06-29 11:37:19 +00001016 if (!GetFileAttributesExA(path, GetFileExInfoStandard, &info)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00001017 if (GetLastError() != ERROR_SHARING_VIOLATION) {
1018 /* Protocol violation: we explicitly clear errno, instead of
1019 setting it to a POSIX error. Callers should use GetLastError. */
1020 errno = 0;
1021 return -1;
1022 } else {
1023 /* Could not get attributes on open file. Fall back to
1024 reading the directory. */
1025 if (!attributes_from_dir(path, &info)) {
1026 /* Very strange. This should not fail now */
1027 errno = 0;
1028 return -1;
1029 }
1030 }
Martin v. Löwis14694662006-02-03 12:54:16 +00001031 }
1032 code = attribute_data_to_stat(&info, result);
1033 if (code != 0)
1034 return code;
1035 /* Set S_IFEXEC if it is an .exe, .bat, ... */
1036 dot = strrchr(path, '.');
1037 if (dot) {
1038 if (stricmp(dot, ".bat") == 0 ||
1039 stricmp(dot, ".cmd") == 0 ||
1040 stricmp(dot, ".exe") == 0 ||
1041 stricmp(dot, ".com") == 0)
1042 result->st_mode |= 0111;
1043 }
1044 return code;
1045}
1046
1047static int
1048win32_wstat(const wchar_t* path, struct win32_stat *result)
1049{
1050 int code;
1051 const wchar_t *dot;
1052 WIN32_FILE_ATTRIBUTE_DATA info;
Hirokazu Yamamoto6fbdfda2009-06-29 11:37:19 +00001053 if (!GetFileAttributesExW(path, GetFileExInfoStandard, &info)) {
Guido van Rossumd8faa362007-04-27 19:54:29 +00001054 if (GetLastError() != ERROR_SHARING_VIOLATION) {
1055 /* Protocol violation: we explicitly clear errno, instead of
1056 setting it to a POSIX error. Callers should use GetLastError. */
1057 errno = 0;
1058 return -1;
1059 } else {
1060 /* Could not get attributes on open file. Fall back to
1061 reading the directory. */
1062 if (!attributes_from_dir_w(path, &info)) {
1063 /* Very strange. This should not fail now */
1064 errno = 0;
1065 return -1;
1066 }
1067 }
Martin v. Löwis14694662006-02-03 12:54:16 +00001068 }
1069 code = attribute_data_to_stat(&info, result);
1070 if (code < 0)
1071 return code;
1072 /* Set IFEXEC if it is an .exe, .bat, ... */
1073 dot = wcsrchr(path, '.');
1074 if (dot) {
1075 if (_wcsicmp(dot, L".bat") == 0 ||
1076 _wcsicmp(dot, L".cmd") == 0 ||
1077 _wcsicmp(dot, L".exe") == 0 ||
1078 _wcsicmp(dot, L".com") == 0)
1079 result->st_mode |= 0111;
1080 }
1081 return code;
1082}
1083
1084static int
1085win32_fstat(int file_number, struct win32_stat *result)
1086{
1087 BY_HANDLE_FILE_INFORMATION info;
1088 HANDLE h;
1089 int type;
1090
1091 h = (HANDLE)_get_osfhandle(file_number);
1092
1093 /* Protocol violation: we explicitly clear errno, instead of
1094 setting it to a POSIX error. Callers should use GetLastError. */
1095 errno = 0;
1096
1097 if (h == INVALID_HANDLE_VALUE) {
1098 /* This is really a C library error (invalid file handle).
1099 We set the Win32 error to the closes one matching. */
1100 SetLastError(ERROR_INVALID_HANDLE);
1101 return -1;
1102 }
1103 memset(result, 0, sizeof(*result));
1104
1105 type = GetFileType(h);
1106 if (type == FILE_TYPE_UNKNOWN) {
1107 DWORD error = GetLastError();
1108 if (error != 0) {
1109 return -1;
1110 }
1111 /* else: valid but unknown file */
1112 }
1113
1114 if (type != FILE_TYPE_DISK) {
1115 if (type == FILE_TYPE_CHAR)
1116 result->st_mode = _S_IFCHR;
1117 else if (type == FILE_TYPE_PIPE)
1118 result->st_mode = _S_IFIFO;
1119 return 0;
1120 }
1121
1122 if (!GetFileInformationByHandle(h, &info)) {
1123 return -1;
1124 }
1125
1126 /* similar to stat() */
1127 result->st_mode = attributes_to_mode(info.dwFileAttributes);
1128 result->st_size = (((__int64)info.nFileSizeHigh)<<32) + info.nFileSizeLow;
1129 FILE_TIME_to_time_t_nsec(&info.ftCreationTime, &result->st_ctime, &result->st_ctime_nsec);
1130 FILE_TIME_to_time_t_nsec(&info.ftLastWriteTime, &result->st_mtime, &result->st_mtime_nsec);
1131 FILE_TIME_to_time_t_nsec(&info.ftLastAccessTime, &result->st_atime, &result->st_atime_nsec);
1132 /* specific to fstat() */
1133 result->st_nlink = info.nNumberOfLinks;
1134 result->st_ino = (((__int64)info.nFileIndexHigh)<<32) + info.nFileIndexLow;
1135 return 0;
1136}
1137
1138#endif /* MS_WINDOWS */
1139
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001140PyDoc_STRVAR(stat_result__doc__,
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001141"stat_result: Result from stat or lstat.\n\n\
1142This object may be accessed either as a tuple of\n\
Fred Drakef7ce04d2002-06-20 18:31:21 +00001143 (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001144or via the attributes st_mode, st_ino, st_dev, st_nlink, st_uid, and so on.\n\
1145\n\
Hye-Shik Chang5f937a72005-06-02 13:09:30 +00001146Posix/windows: If your platform supports st_blksize, st_blocks, st_rdev,\n\
1147or st_flags, they are available as attributes only.\n\
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001148\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001149See os.stat for more information.");
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001150
1151static PyStructSequence_Field stat_result_fields[] = {
1152 {"st_mode", "protection bits"},
1153 {"st_ino", "inode"},
1154 {"st_dev", "device"},
1155 {"st_nlink", "number of hard links"},
1156 {"st_uid", "user ID of owner"},
1157 {"st_gid", "group ID of owner"},
1158 {"st_size", "total size, in bytes"},
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001159 /* The NULL is replaced with PyStructSequence_UnnamedField later. */
1160 {NULL, "integer time of last access"},
1161 {NULL, "integer time of last modification"},
1162 {NULL, "integer time of last change"},
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001163 {"st_atime", "time of last access"},
1164 {"st_mtime", "time of last modification"},
1165 {"st_ctime", "time of last change"},
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001166#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001167 {"st_blksize", "blocksize for filesystem I/O"},
1168#endif
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001169#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001170 {"st_blocks", "number of blocks allocated"},
1171#endif
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001172#ifdef HAVE_STRUCT_STAT_ST_RDEV
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001173 {"st_rdev", "device type (if inode device)"},
1174#endif
Hye-Shik Chang5f937a72005-06-02 13:09:30 +00001175#ifdef HAVE_STRUCT_STAT_ST_FLAGS
1176 {"st_flags", "user defined flags for file"},
1177#endif
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001178#ifdef HAVE_STRUCT_STAT_ST_GEN
1179 {"st_gen", "generation number"},
1180#endif
1181#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME
1182 {"st_birthtime", "time of creation"},
1183#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001184 {0}
1185};
1186
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001187#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001188#define ST_BLKSIZE_IDX 13
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001189#else
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001190#define ST_BLKSIZE_IDX 12
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001191#endif
1192
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001193#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001194#define ST_BLOCKS_IDX (ST_BLKSIZE_IDX+1)
1195#else
1196#define ST_BLOCKS_IDX ST_BLKSIZE_IDX
1197#endif
1198
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001199#ifdef HAVE_STRUCT_STAT_ST_RDEV
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001200#define ST_RDEV_IDX (ST_BLOCKS_IDX+1)
1201#else
1202#define ST_RDEV_IDX ST_BLOCKS_IDX
1203#endif
1204
Hye-Shik Chang5f937a72005-06-02 13:09:30 +00001205#ifdef HAVE_STRUCT_STAT_ST_FLAGS
1206#define ST_FLAGS_IDX (ST_RDEV_IDX+1)
1207#else
1208#define ST_FLAGS_IDX ST_RDEV_IDX
1209#endif
1210
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001211#ifdef HAVE_STRUCT_STAT_ST_GEN
Martin v. Löwisf09582e2005-08-14 21:42:34 +00001212#define ST_GEN_IDX (ST_FLAGS_IDX+1)
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001213#else
Martin v. Löwisf09582e2005-08-14 21:42:34 +00001214#define ST_GEN_IDX ST_FLAGS_IDX
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001215#endif
1216
1217#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME
1218#define ST_BIRTHTIME_IDX (ST_GEN_IDX+1)
1219#else
1220#define ST_BIRTHTIME_IDX ST_GEN_IDX
1221#endif
1222
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001223static PyStructSequence_Desc stat_result_desc = {
1224 "stat_result", /* name */
1225 stat_result__doc__, /* doc */
1226 stat_result_fields,
1227 10
1228};
1229
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001230PyDoc_STRVAR(statvfs_result__doc__,
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001231"statvfs_result: Result from statvfs or fstatvfs.\n\n\
1232This object may be accessed either as a tuple of\n\
Fred Drakef7ce04d2002-06-20 18:31:21 +00001233 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax),\n\
Guido van Rossuma4dc73e2001-10-18 20:53:15 +00001234or via the attributes f_bsize, f_frsize, f_blocks, f_bfree, and so on.\n\
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001235\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001236See os.statvfs for more information.");
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001237
1238static PyStructSequence_Field statvfs_result_fields[] = {
1239 {"f_bsize", },
1240 {"f_frsize", },
1241 {"f_blocks", },
1242 {"f_bfree", },
1243 {"f_bavail", },
1244 {"f_files", },
1245 {"f_ffree", },
1246 {"f_favail", },
1247 {"f_flag", },
1248 {"f_namemax",},
1249 {0}
1250};
1251
1252static PyStructSequence_Desc statvfs_result_desc = {
1253 "statvfs_result", /* name */
1254 statvfs_result__doc__, /* doc */
1255 statvfs_result_fields,
1256 10
1257};
1258
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001259static int initialized;
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001260static PyTypeObject StatResultType;
1261static PyTypeObject StatVFSResultType;
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001262static newfunc structseq_new;
1263
1264static PyObject *
1265statresult_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
1266{
1267 PyStructSequence *result;
1268 int i;
1269
1270 result = (PyStructSequence*)structseq_new(type, args, kwds);
1271 if (!result)
1272 return NULL;
1273 /* If we have been initialized from a tuple,
1274 st_?time might be set to None. Initialize it
1275 from the int slots. */
1276 for (i = 7; i <= 9; i++) {
1277 if (result->ob_item[i+3] == Py_None) {
1278 Py_DECREF(Py_None);
1279 Py_INCREF(result->ob_item[i]);
1280 result->ob_item[i+3] = result->ob_item[i];
1281 }
1282 }
1283 return (PyObject*)result;
1284}
1285
1286
1287
1288/* If true, st_?time is float. */
Martin v. Löwisfe33d0b2005-01-16 08:57:39 +00001289static int _stat_float_times = 1;
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001290
1291PyDoc_STRVAR(stat_float_times__doc__,
1292"stat_float_times([newval]) -> oldval\n\n\
1293Determine whether os.[lf]stat represents time stamps as float objects.\n\
1294If newval is True, future calls to stat() return floats, if it is False,\n\
1295future calls return ints. \n\
1296If newval is omitted, return the current setting.\n");
1297
1298static PyObject*
1299stat_float_times(PyObject* self, PyObject *args)
1300{
1301 int newval = -1;
1302 if (!PyArg_ParseTuple(args, "|i:stat_float_times", &newval))
1303 return NULL;
1304 if (newval == -1)
1305 /* Return old value */
1306 return PyBool_FromLong(_stat_float_times);
1307 _stat_float_times = newval;
1308 Py_INCREF(Py_None);
1309 return Py_None;
1310}
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001311
Martin v. Löwis94717ed2002-09-09 14:24:16 +00001312static void
1313fill_time(PyObject *v, int index, time_t sec, unsigned long nsec)
1314{
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001315 PyObject *fval,*ival;
1316#if SIZEOF_TIME_T > SIZEOF_LONG
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00001317 ival = PyLong_FromLongLong((PY_LONG_LONG)sec);
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001318#else
Christian Heimes217cfd12007-12-02 14:31:20 +00001319 ival = PyLong_FromLong((long)sec);
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001320#endif
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001321 if (!ival)
1322 return;
Martin v. Löwisf607bda2002-10-16 18:27:39 +00001323 if (_stat_float_times) {
1324 fval = PyFloat_FromDouble(sec + 1e-9*nsec);
1325 } else {
1326 fval = ival;
1327 Py_INCREF(fval);
1328 }
1329 PyStructSequence_SET_ITEM(v, index, ival);
1330 PyStructSequence_SET_ITEM(v, index+3, fval);
Martin v. Löwis94717ed2002-09-09 14:24:16 +00001331}
1332
Tim Peters5aa91602002-01-30 05:46:57 +00001333/* pack a system stat C structure into the Python stat tuple
Fred Drake699f3522000-06-29 21:12:41 +00001334 (used by posix_stat() and posix_fstat()) */
1335static PyObject*
Martin v. Löwis14694662006-02-03 12:54:16 +00001336_pystat_fromstructstat(STRUCT_STAT *st)
Fred Drake699f3522000-06-29 21:12:41 +00001337{
Martin v. Löwis94717ed2002-09-09 14:24:16 +00001338 unsigned long ansec, mnsec, cnsec;
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001339 PyObject *v = PyStructSequence_New(&StatResultType);
Fred Drake699f3522000-06-29 21:12:41 +00001340 if (v == NULL)
1341 return NULL;
1342
Christian Heimes217cfd12007-12-02 14:31:20 +00001343 PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long)st->st_mode));
Fred Drake699f3522000-06-29 21:12:41 +00001344#ifdef HAVE_LARGEFILE_SUPPORT
Tim Peters5aa91602002-01-30 05:46:57 +00001345 PyStructSequence_SET_ITEM(v, 1,
Martin v. Löwis14694662006-02-03 12:54:16 +00001346 PyLong_FromLongLong((PY_LONG_LONG)st->st_ino));
Fred Drake699f3522000-06-29 21:12:41 +00001347#else
Christian Heimes217cfd12007-12-02 14:31:20 +00001348 PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long)st->st_ino));
Fred Drake699f3522000-06-29 21:12:41 +00001349#endif
1350#if defined(HAVE_LONG_LONG) && !defined(MS_WINDOWS)
Tim Peters5aa91602002-01-30 05:46:57 +00001351 PyStructSequence_SET_ITEM(v, 2,
Martin v. Löwis14694662006-02-03 12:54:16 +00001352 PyLong_FromLongLong((PY_LONG_LONG)st->st_dev));
Fred Drake699f3522000-06-29 21:12:41 +00001353#else
Christian Heimes217cfd12007-12-02 14:31:20 +00001354 PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long)st->st_dev));
Fred Drake699f3522000-06-29 21:12:41 +00001355#endif
Christian Heimes217cfd12007-12-02 14:31:20 +00001356 PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long)st->st_nlink));
1357 PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong((long)st->st_uid));
1358 PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong((long)st->st_gid));
Fred Drake699f3522000-06-29 21:12:41 +00001359#ifdef HAVE_LARGEFILE_SUPPORT
Tim Peters5aa91602002-01-30 05:46:57 +00001360 PyStructSequence_SET_ITEM(v, 6,
Martin v. Löwis14694662006-02-03 12:54:16 +00001361 PyLong_FromLongLong((PY_LONG_LONG)st->st_size));
Fred Drake699f3522000-06-29 21:12:41 +00001362#else
Christian Heimes217cfd12007-12-02 14:31:20 +00001363 PyStructSequence_SET_ITEM(v, 6, PyLong_FromLong(st->st_size));
Fred Drake699f3522000-06-29 21:12:41 +00001364#endif
Martin v. Löwis94717ed2002-09-09 14:24:16 +00001365
Martin v. Löwis14694662006-02-03 12:54:16 +00001366#if defined(HAVE_STAT_TV_NSEC)
1367 ansec = st->st_atim.tv_nsec;
1368 mnsec = st->st_mtim.tv_nsec;
1369 cnsec = st->st_ctim.tv_nsec;
1370#elif defined(HAVE_STAT_TV_NSEC2)
1371 ansec = st->st_atimespec.tv_nsec;
1372 mnsec = st->st_mtimespec.tv_nsec;
1373 cnsec = st->st_ctimespec.tv_nsec;
1374#elif defined(HAVE_STAT_NSEC)
1375 ansec = st->st_atime_nsec;
1376 mnsec = st->st_mtime_nsec;
1377 cnsec = st->st_ctime_nsec;
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001378#else
Martin v. Löwis94717ed2002-09-09 14:24:16 +00001379 ansec = mnsec = cnsec = 0;
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001380#endif
Martin v. Löwis14694662006-02-03 12:54:16 +00001381 fill_time(v, 7, st->st_atime, ansec);
1382 fill_time(v, 8, st->st_mtime, mnsec);
1383 fill_time(v, 9, st->st_ctime, cnsec);
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001384
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001385#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
Tim Peters5aa91602002-01-30 05:46:57 +00001386 PyStructSequence_SET_ITEM(v, ST_BLKSIZE_IDX,
Christian Heimes217cfd12007-12-02 14:31:20 +00001387 PyLong_FromLong((long)st->st_blksize));
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001388#endif
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001389#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
Tim Peters5aa91602002-01-30 05:46:57 +00001390 PyStructSequence_SET_ITEM(v, ST_BLOCKS_IDX,
Christian Heimes217cfd12007-12-02 14:31:20 +00001391 PyLong_FromLong((long)st->st_blocks));
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001392#endif
Martin v. Löwis60a5d722002-10-16 20:28:25 +00001393#ifdef HAVE_STRUCT_STAT_ST_RDEV
Guido van Rossum98bf58f2001-10-18 20:34:25 +00001394 PyStructSequence_SET_ITEM(v, ST_RDEV_IDX,
Christian Heimes217cfd12007-12-02 14:31:20 +00001395 PyLong_FromLong((long)st->st_rdev));
Fred Drake699f3522000-06-29 21:12:41 +00001396#endif
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001397#ifdef HAVE_STRUCT_STAT_ST_GEN
1398 PyStructSequence_SET_ITEM(v, ST_GEN_IDX,
Christian Heimes217cfd12007-12-02 14:31:20 +00001399 PyLong_FromLong((long)st->st_gen));
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001400#endif
1401#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME
1402 {
1403 PyObject *val;
1404 unsigned long bsec,bnsec;
Martin v. Löwis14694662006-02-03 12:54:16 +00001405 bsec = (long)st->st_birthtime;
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001406#ifdef HAVE_STAT_TV_NSEC2
Hye-Shik Changd69e0342006-02-19 16:22:22 +00001407 bnsec = st->st_birthtimespec.tv_nsec;
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001408#else
1409 bnsec = 0;
1410#endif
1411 if (_stat_float_times) {
1412 val = PyFloat_FromDouble(bsec + 1e-9*bnsec);
1413 } else {
Christian Heimes217cfd12007-12-02 14:31:20 +00001414 val = PyLong_FromLong((long)bsec);
Martin v. Löwisebd9d5b2005-08-09 15:00:59 +00001415 }
1416 PyStructSequence_SET_ITEM(v, ST_BIRTHTIME_IDX,
1417 val);
1418 }
1419#endif
Hye-Shik Chang5f937a72005-06-02 13:09:30 +00001420#ifdef HAVE_STRUCT_STAT_ST_FLAGS
1421 PyStructSequence_SET_ITEM(v, ST_FLAGS_IDX,
Christian Heimes217cfd12007-12-02 14:31:20 +00001422 PyLong_FromLong((long)st->st_flags));
Hye-Shik Chang5f937a72005-06-02 13:09:30 +00001423#endif
Fred Drake699f3522000-06-29 21:12:41 +00001424
1425 if (PyErr_Occurred()) {
1426 Py_DECREF(v);
1427 return NULL;
1428 }
1429
1430 return v;
1431}
1432
Martin v. Löwisd8948722004-06-02 09:57:56 +00001433#ifdef MS_WINDOWS
1434
1435/* IsUNCRoot -- test whether the supplied path is of the form \\SERVER\SHARE\,
1436 where / can be used in place of \ and the trailing slash is optional.
1437 Both SERVER and SHARE must have at least one character.
1438*/
1439
1440#define ISSLASHA(c) ((c) == '\\' || (c) == '/')
1441#define ISSLASHW(c) ((c) == L'\\' || (c) == L'/')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001442#ifndef ARRAYSIZE
Martin v. Löwisd8948722004-06-02 09:57:56 +00001443#define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0]))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001444#endif
Martin v. Löwisd8948722004-06-02 09:57:56 +00001445
Tim Peters4ad82172004-08-30 17:02:04 +00001446static BOOL
Martin v. Löwisd8948722004-06-02 09:57:56 +00001447IsUNCRootA(char *path, int pathlen)
1448{
1449 #define ISSLASH ISSLASHA
1450
1451 int i, share;
1452
1453 if (pathlen < 5 || !ISSLASH(path[0]) || !ISSLASH(path[1]))
1454 /* minimum UNCRoot is \\x\y */
1455 return FALSE;
1456 for (i = 2; i < pathlen ; i++)
1457 if (ISSLASH(path[i])) break;
1458 if (i == 2 || i == pathlen)
1459 /* do not allow \\\SHARE or \\SERVER */
1460 return FALSE;
1461 share = i+1;
1462 for (i = share; i < pathlen; i++)
1463 if (ISSLASH(path[i])) break;
1464 return (i != share && (i == pathlen || i == pathlen-1));
1465
1466 #undef ISSLASH
1467}
1468
Tim Peters4ad82172004-08-30 17:02:04 +00001469static BOOL
Martin v. Löwisd8948722004-06-02 09:57:56 +00001470IsUNCRootW(Py_UNICODE *path, int pathlen)
1471{
1472 #define ISSLASH ISSLASHW
1473
1474 int i, share;
1475
1476 if (pathlen < 5 || !ISSLASH(path[0]) || !ISSLASH(path[1]))
1477 /* minimum UNCRoot is \\x\y */
1478 return FALSE;
1479 for (i = 2; i < pathlen ; i++)
1480 if (ISSLASH(path[i])) break;
1481 if (i == 2 || i == pathlen)
1482 /* do not allow \\\SHARE or \\SERVER */
1483 return FALSE;
1484 share = i+1;
1485 for (i = share; i < pathlen; i++)
1486 if (ISSLASH(path[i])) break;
1487 return (i != share && (i == pathlen || i == pathlen-1));
1488
1489 #undef ISSLASH
1490}
Martin v. Löwisd8948722004-06-02 09:57:56 +00001491#endif /* MS_WINDOWS */
1492
Barry Warsaw53699e91996-12-10 23:23:01 +00001493static PyObject *
Tim Peters11b23062003-04-23 02:39:17 +00001494posix_do_stat(PyObject *self, PyObject *args,
Mark Hammondc2e85bd2002-10-03 05:10:39 +00001495 char *format,
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001496#ifdef __VMS
1497 int (*statfunc)(const char *, STRUCT_STAT *, ...),
1498#else
Mark Hammondc2e85bd2002-10-03 05:10:39 +00001499 int (*statfunc)(const char *, STRUCT_STAT *),
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001500#endif
Mark Hammondc2e85bd2002-10-03 05:10:39 +00001501 char *wformat,
1502 int (*wstatfunc)(const Py_UNICODE *, STRUCT_STAT *))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001503{
Fred Drake699f3522000-06-29 21:12:41 +00001504 STRUCT_STAT st;
Martin v. Löwis011e8422009-05-05 04:43:17 +00001505 PyObject *opath;
1506 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001507 int res;
Martin v. Löwis14694662006-02-03 12:54:16 +00001508 PyObject *result;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00001509
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00001510#ifdef MS_WINDOWS
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00001511 PyUnicodeObject *po;
1512 if (PyArg_ParseTuple(args, wformat, &po)) {
1513 Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po);
Martin v. Löwis14694662006-02-03 12:54:16 +00001514
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00001515 Py_BEGIN_ALLOW_THREADS
1516 /* PyUnicode_AS_UNICODE result OK without
1517 thread lock as it is a simple dereference. */
1518 res = wstatfunc(wpath, &st);
1519 Py_END_ALLOW_THREADS
Martin v. Löwis14694662006-02-03 12:54:16 +00001520
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00001521 if (res != 0)
1522 return win32_error_unicode("stat", wpath);
1523 return _pystat_fromstructstat(&st);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00001524 }
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00001525 /* Drop the argument parsing error as narrow strings
1526 are also valid. */
1527 PyErr_Clear();
Mark Hammondc2e85bd2002-10-03 05:10:39 +00001528#endif
1529
Tim Peters5aa91602002-01-30 05:46:57 +00001530 if (!PyArg_ParseTuple(args, format,
Martin v. Löwis011e8422009-05-05 04:43:17 +00001531 PyUnicode_FSConverter, &opath))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001532 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00001533 path = bytes2str(opath, 1);
Barry Warsaw53699e91996-12-10 23:23:01 +00001534 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001535 res = (*statfunc)(path, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00001536 Py_END_ALLOW_THREADS
Martin v. Löwis14694662006-02-03 12:54:16 +00001537
1538 if (res != 0) {
1539#ifdef MS_WINDOWS
Martin v. Löwis011e8422009-05-05 04:43:17 +00001540 result = win32_error("stat", path);
Martin v. Löwis14694662006-02-03 12:54:16 +00001541#else
Martin v. Löwis011e8422009-05-05 04:43:17 +00001542 result = posix_error_with_filename(path);
Martin v. Löwis14694662006-02-03 12:54:16 +00001543#endif
1544 }
1545 else
1546 result = _pystat_fromstructstat(&st);
Fred Drake699f3522000-06-29 21:12:41 +00001547
Martin v. Löwis011e8422009-05-05 04:43:17 +00001548 release_bytes(opath);
Martin v. Löwis14694662006-02-03 12:54:16 +00001549 return result;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001550}
1551
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001552/* POSIX methods */
1553
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001554PyDoc_STRVAR(posix_access__doc__,
Thomas Wouters9fe394c2007-02-05 01:24:16 +00001555"access(path, mode) -> True if granted, False otherwise\n\n\
Guido van Rossuma0b90752002-06-18 16:22:43 +00001556Use the real uid/gid to test for access to a path. Note that most\n\
1557operations will use the effective uid/gid, therefore this routine can\n\
1558be used in a suid/sgid environment to test if the invoking user has the\n\
1559specified access to the path. The mode argument can be F_OK to test\n\
1560existence, or the inclusive-OR of R_OK, W_OK, and X_OK.");
Guido van Rossum94f6f721999-01-06 18:42:14 +00001561
1562static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00001563posix_access(PyObject *self, PyObject *args)
Guido van Rossum94f6f721999-01-06 18:42:14 +00001564{
Martin v. Löwis011e8422009-05-05 04:43:17 +00001565 PyObject *opath;
Guido van Rossum015f22a1999-01-06 22:52:38 +00001566 char *path;
1567 int mode;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001568
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00001569#ifdef MS_WINDOWS
Thomas Wouters477c8d52006-05-27 19:21:47 +00001570 DWORD attr;
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00001571 PyUnicodeObject *po;
1572 if (PyArg_ParseTuple(args, "Ui:access", &po, &mode)) {
1573 Py_BEGIN_ALLOW_THREADS
1574 /* PyUnicode_AS_UNICODE OK without thread lock as
1575 it is a simple dereference. */
1576 attr = GetFileAttributesW(PyUnicode_AS_UNICODE(po));
1577 Py_END_ALLOW_THREADS
1578 goto finish;
Martin v. Löwis1b699a52003-09-12 16:25:38 +00001579 }
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00001580 /* Drop the argument parsing error as narrow strings
1581 are also valid. */
1582 PyErr_Clear();
Martin v. Löwis011e8422009-05-05 04:43:17 +00001583 if (!PyArg_ParseTuple(args, "O&i:access",
1584 PyUnicode_FSConverter, &opath, &mode))
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00001585 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00001586 path = bytes2str(opath, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001587 Py_BEGIN_ALLOW_THREADS
1588 attr = GetFileAttributesA(path);
1589 Py_END_ALLOW_THREADS
Martin v. Löwis011e8422009-05-05 04:43:17 +00001590 release_bytes(opath);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001591finish:
1592 if (attr == 0xFFFFFFFF)
1593 /* File does not exist, or cannot read attributes */
1594 return PyBool_FromLong(0);
1595 /* Access is possible if either write access wasn't requested, or
Guido van Rossumb00324f2007-12-04 01:13:14 +00001596 the file isn't read-only, or if it's a directory, as there are
1597 no read-only directories on Windows. */
1598 return PyBool_FromLong(!(mode & 2)
1599 || !(attr & FILE_ATTRIBUTE_READONLY)
1600 || (attr & FILE_ATTRIBUTE_DIRECTORY));
Thomas Wouters477c8d52006-05-27 19:21:47 +00001601#else
1602 int res;
Martin v. Löwis011e8422009-05-05 04:43:17 +00001603 if (!PyArg_ParseTuple(args, "O&i:access",
1604 PyUnicode_FSConverter, &opath, &mode))
Guido van Rossum015f22a1999-01-06 22:52:38 +00001605 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00001606 path = bytes2str(opath, 1);
Guido van Rossum015f22a1999-01-06 22:52:38 +00001607 Py_BEGIN_ALLOW_THREADS
1608 res = access(path, mode);
1609 Py_END_ALLOW_THREADS
Martin v. Löwis011e8422009-05-05 04:43:17 +00001610 release_bytes(opath);
Neal Norwitz3efd0a12005-09-19 06:45:53 +00001611 return PyBool_FromLong(res == 0);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001612#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00001613}
1614
Guido van Rossumd371ff11999-01-25 16:12:23 +00001615#ifndef F_OK
1616#define F_OK 0
1617#endif
1618#ifndef R_OK
1619#define R_OK 4
1620#endif
1621#ifndef W_OK
1622#define W_OK 2
1623#endif
1624#ifndef X_OK
1625#define X_OK 1
1626#endif
1627
1628#ifdef HAVE_TTYNAME
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001629PyDoc_STRVAR(posix_ttyname__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00001630"ttyname(fd) -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001631Return the name of the terminal device connected to 'fd'.");
Guido van Rossum94f6f721999-01-06 18:42:14 +00001632
1633static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00001634posix_ttyname(PyObject *self, PyObject *args)
Guido van Rossum94f6f721999-01-06 18:42:14 +00001635{
Guido van Rossum94f6f721999-01-06 18:42:14 +00001636 int id;
1637 char *ret;
1638
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001639 if (!PyArg_ParseTuple(args, "i:ttyname", &id))
Guido van Rossum94f6f721999-01-06 18:42:14 +00001640 return NULL;
1641
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001642#if defined(__VMS)
Martin v. Löwisc16f3bd2003-05-03 09:14:54 +00001643 /* file descriptor 0 only, the default input device (stdin) */
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001644 if (id == 0) {
1645 ret = ttyname();
1646 }
1647 else {
1648 ret = NULL;
1649 }
1650#else
Guido van Rossum94f6f721999-01-06 18:42:14 +00001651 ret = ttyname(id);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001652#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00001653 if (ret == NULL)
Neal Norwitz3efd0a12005-09-19 06:45:53 +00001654 return posix_error();
Neal Norwitz93c56822007-08-26 07:10:06 +00001655 return PyUnicode_FromString(ret);
Guido van Rossum94f6f721999-01-06 18:42:14 +00001656}
Guido van Rossumd371ff11999-01-25 16:12:23 +00001657#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00001658
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001659#ifdef HAVE_CTERMID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001660PyDoc_STRVAR(posix_ctermid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00001661"ctermid() -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001662Return the name of the controlling terminal for this process.");
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001663
1664static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00001665posix_ctermid(PyObject *self, PyObject *noargs)
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001666{
1667 char *ret;
1668 char buffer[L_ctermid];
1669
Greg Wardb48bc172000-03-01 21:51:56 +00001670#ifdef USE_CTERMID_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001671 ret = ctermid_r(buffer);
1672#else
1673 ret = ctermid(buffer);
1674#endif
1675 if (ret == NULL)
Neal Norwitz3efd0a12005-09-19 06:45:53 +00001676 return posix_error();
Neal Norwitz93c56822007-08-26 07:10:06 +00001677 return PyUnicode_FromString(buffer);
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001678}
1679#endif
1680
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001681PyDoc_STRVAR(posix_chdir__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00001682"chdir(path)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001683Change the current working directory to the specified path.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001684
Barry Warsaw53699e91996-12-10 23:23:01 +00001685static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00001686posix_chdir(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001687{
Mark Hammondc2e85bd2002-10-03 05:10:39 +00001688#ifdef MS_WINDOWS
Amaury Forgeot d'Arcc72ef8b2008-10-03 18:38:26 +00001689 return win32_1str(args, "chdir", "y:chdir", win32_chdir, "U:chdir", win32_wchdir);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00001690#elif defined(PYOS_OS2) && defined(PYCC_GCC)
Martin v. Löwis011e8422009-05-05 04:43:17 +00001691 return posix_1str(args, "O&:chdir", _chdir2);
Martin v. Löwis7a924e62003-03-05 14:15:21 +00001692#elif defined(__VMS)
Martin v. Löwis011e8422009-05-05 04:43:17 +00001693 return posix_1str(args, "O&:chdir", (int (*)(const char *))chdir);
Martin v. Löwis79acb9e2002-12-06 12:48:53 +00001694#else
Martin v. Löwis011e8422009-05-05 04:43:17 +00001695 return posix_1str(args, "O&:chdir", chdir);
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00001696#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001697}
1698
Fred Drake4d1e64b2002-04-15 19:40:07 +00001699#ifdef HAVE_FCHDIR
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001700PyDoc_STRVAR(posix_fchdir__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00001701"fchdir(fildes)\n\n\
Fred Drake4d1e64b2002-04-15 19:40:07 +00001702Change to the directory of the given file descriptor. fildes must be\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001703opened on a directory, not a file.");
Fred Drake4d1e64b2002-04-15 19:40:07 +00001704
1705static PyObject *
1706posix_fchdir(PyObject *self, PyObject *fdobj)
1707{
1708 return posix_fildes(fdobj, fchdir);
1709}
1710#endif /* HAVE_FCHDIR */
1711
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001712
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001713PyDoc_STRVAR(posix_chmod__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00001714"chmod(path, mode)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001715Change the access permissions of a file.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001716
Barry Warsaw53699e91996-12-10 23:23:01 +00001717static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00001718posix_chmod(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001719{
Martin v. Löwis011e8422009-05-05 04:43:17 +00001720 PyObject *opath = NULL;
Mark Hammondef8b6542001-05-13 08:04:26 +00001721 char *path = NULL;
Guido van Rossumffd15f52000-03-31 00:47:28 +00001722 int i;
1723 int res;
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00001724#ifdef MS_WINDOWS
Thomas Wouters477c8d52006-05-27 19:21:47 +00001725 DWORD attr;
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00001726 PyUnicodeObject *po;
1727 if (PyArg_ParseTuple(args, "Ui|:chmod", &po, &i)) {
1728 Py_BEGIN_ALLOW_THREADS
1729 attr = GetFileAttributesW(PyUnicode_AS_UNICODE(po));
1730 if (attr != 0xFFFFFFFF) {
1731 if (i & _S_IWRITE)
1732 attr &= ~FILE_ATTRIBUTE_READONLY;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001733 else
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00001734 attr |= FILE_ATTRIBUTE_READONLY;
1735 res = SetFileAttributesW(PyUnicode_AS_UNICODE(po), attr);
Mark Hammond817c9292003-12-03 01:22:38 +00001736 }
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00001737 else
1738 res = 0;
1739 Py_END_ALLOW_THREADS
1740 if (!res)
1741 return win32_error_unicode("chmod",
1742 PyUnicode_AS_UNICODE(po));
1743 Py_INCREF(Py_None);
1744 return Py_None;
Mark Hammond817c9292003-12-03 01:22:38 +00001745 }
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00001746 /* Drop the argument parsing error as narrow strings
1747 are also valid. */
1748 PyErr_Clear();
1749
Martin v. Löwis011e8422009-05-05 04:43:17 +00001750 if (!PyArg_ParseTuple(args, "O&i:chmod", PyUnicode_FSConverter,
1751 &opath, &i))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001752 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00001753 path = bytes2str(opath, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001754 Py_BEGIN_ALLOW_THREADS
1755 attr = GetFileAttributesA(path);
1756 if (attr != 0xFFFFFFFF) {
1757 if (i & _S_IWRITE)
1758 attr &= ~FILE_ATTRIBUTE_READONLY;
1759 else
1760 attr |= FILE_ATTRIBUTE_READONLY;
1761 res = SetFileAttributesA(path, attr);
1762 }
1763 else
1764 res = 0;
1765 Py_END_ALLOW_THREADS
1766 if (!res) {
1767 win32_error("chmod", path);
Martin v. Löwis011e8422009-05-05 04:43:17 +00001768 release_bytes(opath);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001769 return NULL;
1770 }
Martin v. Löwis011e8422009-05-05 04:43:17 +00001771 release_bytes(opath);
Thomas Wouters477c8d52006-05-27 19:21:47 +00001772 Py_INCREF(Py_None);
1773 return Py_None;
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00001774#else /* MS_WINDOWS */
Martin v. Löwis011e8422009-05-05 04:43:17 +00001775 if (!PyArg_ParseTuple(args, "O&i:chmod", PyUnicode_FSConverter,
1776 &opath, &i))
Guido van Rossumffd15f52000-03-31 00:47:28 +00001777 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00001778 path = bytes2str(opath, 1);
Guido van Rossumffd15f52000-03-31 00:47:28 +00001779 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef40e772000-03-31 01:26:23 +00001780 res = chmod(path, i);
Guido van Rossumffd15f52000-03-31 00:47:28 +00001781 Py_END_ALLOW_THREADS
1782 if (res < 0)
Martin v. Löwis011e8422009-05-05 04:43:17 +00001783 return posix_error_with_allocated_filename(opath);
1784 release_bytes(opath);
Guido van Rossumffd15f52000-03-31 00:47:28 +00001785 Py_INCREF(Py_None);
1786 return Py_None;
Thomas Wouters477c8d52006-05-27 19:21:47 +00001787#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001788}
1789
Christian Heimes4e30a842007-11-30 22:12:06 +00001790#ifdef HAVE_FCHMOD
1791PyDoc_STRVAR(posix_fchmod__doc__,
1792"fchmod(fd, mode)\n\n\
1793Change the access permissions of the file given by file\n\
1794descriptor fd.");
1795
1796static PyObject *
1797posix_fchmod(PyObject *self, PyObject *args)
1798{
1799 int fd, mode, res;
1800 if (!PyArg_ParseTuple(args, "ii:fchmod", &fd, &mode))
1801 return NULL;
1802 Py_BEGIN_ALLOW_THREADS
1803 res = fchmod(fd, mode);
1804 Py_END_ALLOW_THREADS
1805 if (res < 0)
1806 return posix_error();
1807 Py_RETURN_NONE;
1808}
1809#endif /* HAVE_FCHMOD */
1810
1811#ifdef HAVE_LCHMOD
1812PyDoc_STRVAR(posix_lchmod__doc__,
1813"lchmod(path, mode)\n\n\
1814Change the access permissions of a file. If path is a symlink, this\n\
1815affects the link itself rather than the target.");
1816
1817static PyObject *
1818posix_lchmod(PyObject *self, PyObject *args)
1819{
Martin v. Löwis011e8422009-05-05 04:43:17 +00001820 PyObject *opath;
1821 char *path;
Christian Heimes4e30a842007-11-30 22:12:06 +00001822 int i;
1823 int res;
Martin v. Löwis011e8422009-05-05 04:43:17 +00001824 if (!PyArg_ParseTuple(args, "O&i:lchmod", PyUnicode_FSConverter,
1825 &opath, &i))
Christian Heimes4e30a842007-11-30 22:12:06 +00001826 return NULL;
Eric Smith86a05ec2009-05-05 13:07:30 +00001827 path = bytes2str(opath, 1);
Christian Heimes4e30a842007-11-30 22:12:06 +00001828 Py_BEGIN_ALLOW_THREADS
1829 res = lchmod(path, i);
1830 Py_END_ALLOW_THREADS
1831 if (res < 0)
Martin v. Löwis011e8422009-05-05 04:43:17 +00001832 return posix_error_with_allocated_filename(opath);
1833 release_bytes(opath);
Christian Heimes4e30a842007-11-30 22:12:06 +00001834 Py_RETURN_NONE;
1835}
1836#endif /* HAVE_LCHMOD */
1837
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001838
Thomas Wouterscf297e42007-02-23 15:07:44 +00001839#ifdef HAVE_CHFLAGS
1840PyDoc_STRVAR(posix_chflags__doc__,
1841"chflags(path, flags)\n\n\
1842Set file flags.");
1843
1844static PyObject *
1845posix_chflags(PyObject *self, PyObject *args)
1846{
Martin v. Löwis011e8422009-05-05 04:43:17 +00001847 PyObject *opath;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001848 char *path;
1849 unsigned long flags;
1850 int res;
Martin v. Löwis011e8422009-05-05 04:43:17 +00001851 if (!PyArg_ParseTuple(args, "O&k:chflags",
1852 PyUnicode_FSConverter, &opath, &flags))
Thomas Wouterscf297e42007-02-23 15:07:44 +00001853 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00001854 path = bytes2str(opath, 1);
Thomas Wouterscf297e42007-02-23 15:07:44 +00001855 Py_BEGIN_ALLOW_THREADS
1856 res = chflags(path, flags);
1857 Py_END_ALLOW_THREADS
1858 if (res < 0)
Martin v. Löwis011e8422009-05-05 04:43:17 +00001859 return posix_error_with_allocated_filename(opath);
1860 release_bytes(opath);
Thomas Wouterscf297e42007-02-23 15:07:44 +00001861 Py_INCREF(Py_None);
1862 return Py_None;
1863}
1864#endif /* HAVE_CHFLAGS */
1865
1866#ifdef HAVE_LCHFLAGS
1867PyDoc_STRVAR(posix_lchflags__doc__,
1868"lchflags(path, flags)\n\n\
1869Set file flags.\n\
1870This function will not follow symbolic links.");
1871
1872static PyObject *
1873posix_lchflags(PyObject *self, PyObject *args)
1874{
Martin v. Löwis011e8422009-05-05 04:43:17 +00001875 PyObject *opath;
Thomas Wouterscf297e42007-02-23 15:07:44 +00001876 char *path;
1877 unsigned long flags;
1878 int res;
Martin v. Löwis011e8422009-05-05 04:43:17 +00001879 if (!PyArg_ParseTuple(args, "O&k:lchflags",
Martin v. Löwis4adbc342009-05-05 17:17:55 +00001880 PyUnicode_FSConverter, &opath, &flags))
Thomas Wouterscf297e42007-02-23 15:07:44 +00001881 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00001882 path = bytes2str(opath, 1);
Thomas Wouterscf297e42007-02-23 15:07:44 +00001883 Py_BEGIN_ALLOW_THREADS
1884 res = lchflags(path, flags);
1885 Py_END_ALLOW_THREADS
1886 if (res < 0)
Martin v. Löwis011e8422009-05-05 04:43:17 +00001887 return posix_error_with_allocated_filename(opath);
1888 release_bytes(opath);
Thomas Wouterscf297e42007-02-23 15:07:44 +00001889 Py_INCREF(Py_None);
1890 return Py_None;
1891}
1892#endif /* HAVE_LCHFLAGS */
1893
Martin v. Löwis244edc82001-10-04 22:44:26 +00001894#ifdef HAVE_CHROOT
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001895PyDoc_STRVAR(posix_chroot__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00001896"chroot(path)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001897Change root directory to path.");
Martin v. Löwis244edc82001-10-04 22:44:26 +00001898
1899static PyObject *
1900posix_chroot(PyObject *self, PyObject *args)
1901{
Martin v. Löwis011e8422009-05-05 04:43:17 +00001902 return posix_1str(args, "O&:chroot", chroot);
Martin v. Löwis244edc82001-10-04 22:44:26 +00001903}
1904#endif
1905
Guido van Rossum21142a01999-01-08 21:05:37 +00001906#ifdef HAVE_FSYNC
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001907PyDoc_STRVAR(posix_fsync__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00001908"fsync(fildes)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001909force write of file with filedescriptor to disk.");
Guido van Rossum21142a01999-01-08 21:05:37 +00001910
1911static PyObject *
Fred Drake4d1e64b2002-04-15 19:40:07 +00001912posix_fsync(PyObject *self, PyObject *fdobj)
Guido van Rossum21142a01999-01-08 21:05:37 +00001913{
Fred Drake4d1e64b2002-04-15 19:40:07 +00001914 return posix_fildes(fdobj, fsync);
Guido van Rossum21142a01999-01-08 21:05:37 +00001915}
1916#endif /* HAVE_FSYNC */
1917
1918#ifdef HAVE_FDATASYNC
Guido van Rossumecc23b02000-09-22 16:01:05 +00001919
Guido van Rossum7f58e2e2000-09-22 17:26:14 +00001920#ifdef __hpux
Guido van Rossumecc23b02000-09-22 16:01:05 +00001921extern int fdatasync(int); /* On HP-UX, in libc but not in unistd.h */
1922#endif
1923
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001924PyDoc_STRVAR(posix_fdatasync__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00001925"fdatasync(fildes)\n\n\
Guido van Rossum21142a01999-01-08 21:05:37 +00001926force write of file with filedescriptor to disk.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001927 does not force update of metadata.");
Guido van Rossum21142a01999-01-08 21:05:37 +00001928
1929static PyObject *
Fred Drake4d1e64b2002-04-15 19:40:07 +00001930posix_fdatasync(PyObject *self, PyObject *fdobj)
Guido van Rossum21142a01999-01-08 21:05:37 +00001931{
Fred Drake4d1e64b2002-04-15 19:40:07 +00001932 return posix_fildes(fdobj, fdatasync);
Guido van Rossum21142a01999-01-08 21:05:37 +00001933}
1934#endif /* HAVE_FDATASYNC */
1935
1936
Fredrik Lundh10723342000-07-10 16:38:09 +00001937#ifdef HAVE_CHOWN
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001938PyDoc_STRVAR(posix_chown__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00001939"chown(path, uid, gid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001940Change the owner and group id of path to the numeric uid and gid.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001941
Barry Warsaw53699e91996-12-10 23:23:01 +00001942static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00001943posix_chown(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001944{
Martin v. Löwis011e8422009-05-05 04:43:17 +00001945 PyObject *opath;
1946 char *path;
Christian Heimesd5e2b6f2008-03-19 21:50:51 +00001947 long uid, gid;
Fredrik Lundh44328e62000-07-10 15:59:30 +00001948 int res;
Martin v. Löwis011e8422009-05-05 04:43:17 +00001949 if (!PyArg_ParseTuple(args, "O&ll:chown",
1950 PyUnicode_FSConverter, &opath,
Mark Hammondef8b6542001-05-13 08:04:26 +00001951 &uid, &gid))
Fredrik Lundh44328e62000-07-10 15:59:30 +00001952 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00001953 path = bytes2str(opath, 1);
Fredrik Lundh44328e62000-07-10 15:59:30 +00001954 Py_BEGIN_ALLOW_THREADS
1955 res = chown(path, (uid_t) uid, (gid_t) gid);
1956 Py_END_ALLOW_THREADS
1957 if (res < 0)
Martin v. Löwis011e8422009-05-05 04:43:17 +00001958 return posix_error_with_allocated_filename(opath);
1959 release_bytes(opath);
Fredrik Lundh44328e62000-07-10 15:59:30 +00001960 Py_INCREF(Py_None);
1961 return Py_None;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001962}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001963#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001964
Christian Heimes4e30a842007-11-30 22:12:06 +00001965#ifdef HAVE_FCHOWN
1966PyDoc_STRVAR(posix_fchown__doc__,
1967"fchown(fd, uid, gid)\n\n\
1968Change the owner and group id of the file given by file descriptor\n\
1969fd to the numeric uid and gid.");
1970
1971static PyObject *
1972posix_fchown(PyObject *self, PyObject *args)
1973{
Benjamin Peterson1baf4652009-12-31 03:11:23 +00001974 int fd;
1975 long uid, gid;
Christian Heimes4e30a842007-11-30 22:12:06 +00001976 int res;
Benjamin Peterson1baf4652009-12-31 03:11:23 +00001977 if (!PyArg_ParseTuple(args, "ill:chown", &fd, &uid, &gid))
Christian Heimes4e30a842007-11-30 22:12:06 +00001978 return NULL;
1979 Py_BEGIN_ALLOW_THREADS
1980 res = fchown(fd, (uid_t) uid, (gid_t) gid);
1981 Py_END_ALLOW_THREADS
1982 if (res < 0)
1983 return posix_error();
1984 Py_RETURN_NONE;
1985}
1986#endif /* HAVE_FCHOWN */
1987
Martin v. Löwis0cec0ff2002-07-28 16:33:45 +00001988#ifdef HAVE_LCHOWN
1989PyDoc_STRVAR(posix_lchown__doc__,
1990"lchown(path, uid, gid)\n\n\
1991Change the owner and group id of path to the numeric uid and gid.\n\
1992This function will not follow symbolic links.");
1993
1994static PyObject *
1995posix_lchown(PyObject *self, PyObject *args)
1996{
Martin v. Löwis011e8422009-05-05 04:43:17 +00001997 PyObject *opath;
1998 char *path;
Benjamin Peterson1baf4652009-12-31 03:11:23 +00001999 long uid, gid;
Martin v. Löwis0cec0ff2002-07-28 16:33:45 +00002000 int res;
Benjamin Peterson1baf4652009-12-31 03:11:23 +00002001 if (!PyArg_ParseTuple(args, "O&ll:lchown",
Martin v. Löwis011e8422009-05-05 04:43:17 +00002002 PyUnicode_FSConverter, &opath,
Martin v. Löwis0cec0ff2002-07-28 16:33:45 +00002003 &uid, &gid))
2004 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002005 path = bytes2str(opath, 1);
Martin v. Löwis0cec0ff2002-07-28 16:33:45 +00002006 Py_BEGIN_ALLOW_THREADS
2007 res = lchown(path, (uid_t) uid, (gid_t) gid);
2008 Py_END_ALLOW_THREADS
Tim Peters11b23062003-04-23 02:39:17 +00002009 if (res < 0)
Martin v. Löwis011e8422009-05-05 04:43:17 +00002010 return posix_error_with_allocated_filename(opath);
2011 release_bytes(opath);
Martin v. Löwis0cec0ff2002-07-28 16:33:45 +00002012 Py_INCREF(Py_None);
2013 return Py_None;
2014}
2015#endif /* HAVE_LCHOWN */
2016
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002017
Guido van Rossum36bc6801995-06-14 22:54:23 +00002018#ifdef HAVE_GETCWD
Barry Warsaw53699e91996-12-10 23:23:01 +00002019static PyObject *
Guido van Rossumf0af3e32008-10-02 18:55:37 +00002020posix_getcwd(int use_bytes)
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002021{
2022 char buf[1026];
2023 char *res;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002024
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00002025#ifdef MS_WINDOWS
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00002026 if (!use_bytes) {
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002027 wchar_t wbuf[1026];
Thomas Wouters477c8d52006-05-27 19:21:47 +00002028 wchar_t *wbuf2 = wbuf;
2029 PyObject *resobj;
Guido van Rossumf0af3e32008-10-02 18:55:37 +00002030 DWORD len;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002031 Py_BEGIN_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002032 len = GetCurrentDirectoryW(sizeof wbuf/ sizeof wbuf[0], wbuf);
2033 /* If the buffer is large enough, len does not include the
2034 terminating \0. If the buffer is too small, len includes
2035 the space needed for the terminator. */
2036 if (len >= sizeof wbuf/ sizeof wbuf[0]) {
2037 wbuf2 = malloc(len * sizeof(wchar_t));
2038 if (wbuf2)
2039 len = GetCurrentDirectoryW(len, wbuf2);
2040 }
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002041 Py_END_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002042 if (!wbuf2) {
2043 PyErr_NoMemory();
2044 return NULL;
2045 }
2046 if (!len) {
2047 if (wbuf2 != wbuf) free(wbuf2);
2048 return win32_error("getcwdu", NULL);
2049 }
2050 resobj = PyUnicode_FromWideChar(wbuf2, len);
2051 if (wbuf2 != wbuf) free(wbuf2);
2052 return resobj;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002053 }
2054#endif
2055
2056 Py_BEGIN_ALLOW_THREADS
2057#if defined(PYOS_OS2) && defined(PYCC_GCC)
2058 res = _getcwd2(buf, sizeof buf);
2059#else
2060 res = getcwd(buf, sizeof buf);
2061#endif
2062 Py_END_ALLOW_THREADS
2063 if (res == NULL)
2064 return posix_error();
Guido van Rossumf0af3e32008-10-02 18:55:37 +00002065 if (use_bytes)
2066 return PyBytes_FromStringAndSize(buf, strlen(buf));
Martin v. Löwis43c57782009-05-10 08:15:24 +00002067 return PyUnicode_Decode(buf, strlen(buf), Py_FileSystemDefaultEncoding,"surrogateescape");
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002068}
Guido van Rossumf0af3e32008-10-02 18:55:37 +00002069
2070PyDoc_STRVAR(posix_getcwd__doc__,
2071"getcwd() -> path\n\n\
2072Return a unicode string representing the current working directory.");
2073
2074static PyObject *
2075posix_getcwd_unicode(PyObject *self)
2076{
2077 return posix_getcwd(0);
2078}
2079
2080PyDoc_STRVAR(posix_getcwdb__doc__,
2081"getcwdb() -> path\n\n\
2082Return a bytes string representing the current working directory.");
2083
2084static PyObject *
2085posix_getcwd_bytes(PyObject *self)
2086{
2087 return posix_getcwd(1);
2088}
Guido van Rossum36bc6801995-06-14 22:54:23 +00002089#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002090
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002091
Guido van Rossumb6775db1994-08-01 11:34:53 +00002092#ifdef HAVE_LINK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002093PyDoc_STRVAR(posix_link__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002094"link(src, dst)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002095Create a hard link to a file.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002096
Barry Warsaw53699e91996-12-10 23:23:01 +00002097static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002098posix_link(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002099{
Martin v. Löwis011e8422009-05-05 04:43:17 +00002100 return posix_2str(args, "O&O&:link", link);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002101}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002102#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002103
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002104
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002105PyDoc_STRVAR(posix_listdir__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002106"listdir(path) -> list_of_strings\n\n\
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002107Return a list containing the names of the entries in the directory.\n\
2108\n\
2109 path: path of directory to list\n\
2110\n\
2111The list is in arbitrary order. It does not include the special\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002112entries '.' and '..' even if they are present in the directory.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002113
Barry Warsaw53699e91996-12-10 23:23:01 +00002114static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002115posix_listdir(PyObject *self, PyObject *args)
Guido van Rossumb6775db1994-08-01 11:34:53 +00002116{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002117 /* XXX Should redo this putting the (now four) versions of opendir
Guido van Rossum6d8841c1997-08-14 19:57:39 +00002118 in separate files instead of having them all here... */
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00002119#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002120
Barry Warsaw53699e91996-12-10 23:23:01 +00002121 PyObject *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00002122 HANDLE hFindFile;
Martin v. Löwise920f0d2006-03-07 23:59:33 +00002123 BOOL result;
Guido van Rossumb6775db1994-08-01 11:34:53 +00002124 WIN32_FIND_DATA FileData;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002125 PyObject *opath;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002126 char namebuf[MAX_PATH+5]; /* Overallocate for \\*.*\0 */
Mark Hammondef8b6542001-05-13 08:04:26 +00002127 char *bufptr = namebuf;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002128 Py_ssize_t len = sizeof(namebuf)-5; /* only claim to have space for MAX_PATH */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002129
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00002130 PyObject *po;
2131 if (PyArg_ParseTuple(args, "U:listdir", &po)) {
2132 WIN32_FIND_DATAW wFileData;
2133 Py_UNICODE *wnamebuf;
2134 /* Overallocate for \\*.*\0 */
2135 len = PyUnicode_GET_SIZE(po);
2136 wnamebuf = malloc((len + 5) * sizeof(wchar_t));
2137 if (!wnamebuf) {
2138 PyErr_NoMemory();
2139 return NULL;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002140 }
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00002141 wcscpy(wnamebuf, PyUnicode_AS_UNICODE(po));
2142 if (len > 0) {
2143 Py_UNICODE wch = wnamebuf[len-1];
2144 if (wch != L'/' && wch != L'\\' && wch != L':')
2145 wnamebuf[len++] = L'\\';
2146 wcscpy(wnamebuf + len, L"*.*");
2147 }
2148 if ((d = PyList_New(0)) == NULL) {
2149 free(wnamebuf);
2150 return NULL;
2151 }
2152 hFindFile = FindFirstFileW(wnamebuf, &wFileData);
2153 if (hFindFile == INVALID_HANDLE_VALUE) {
2154 int error = GetLastError();
2155 if (error == ERROR_FILE_NOT_FOUND) {
2156 free(wnamebuf);
2157 return d;
2158 }
2159 Py_DECREF(d);
2160 win32_error_unicode("FindFirstFileW", wnamebuf);
2161 free(wnamebuf);
2162 return NULL;
2163 }
2164 do {
2165 /* Skip over . and .. */
2166 if (wcscmp(wFileData.cFileName, L".") != 0 &&
2167 wcscmp(wFileData.cFileName, L"..") != 0) {
2168 v = PyUnicode_FromUnicode(wFileData.cFileName, wcslen(wFileData.cFileName));
2169 if (v == NULL) {
2170 Py_DECREF(d);
2171 d = NULL;
2172 break;
2173 }
2174 if (PyList_Append(d, v) != 0) {
2175 Py_DECREF(v);
2176 Py_DECREF(d);
2177 d = NULL;
2178 break;
2179 }
2180 Py_DECREF(v);
2181 }
2182 Py_BEGIN_ALLOW_THREADS
2183 result = FindNextFileW(hFindFile, &wFileData);
2184 Py_END_ALLOW_THREADS
2185 /* FindNextFile sets error to ERROR_NO_MORE_FILES if
2186 it got to the end of the directory. */
2187 if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
2188 Py_DECREF(d);
2189 win32_error_unicode("FindNextFileW", wnamebuf);
2190 FindClose(hFindFile);
2191 free(wnamebuf);
2192 return NULL;
2193 }
2194 } while (result == TRUE);
2195
2196 if (FindClose(hFindFile) == FALSE) {
2197 Py_DECREF(d);
2198 win32_error_unicode("FindClose", wnamebuf);
2199 free(wnamebuf);
2200 return NULL;
2201 }
2202 free(wnamebuf);
2203 return d;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002204 }
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00002205 /* Drop the argument parsing error as narrow strings
2206 are also valid. */
2207 PyErr_Clear();
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002208
Martin v. Löwis011e8422009-05-05 04:43:17 +00002209 if (!PyArg_ParseTuple(args, "O&:listdir",
2210 PyUnicode_FSConverter, &opath))
Guido van Rossumb6775db1994-08-01 11:34:53 +00002211 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002212 if (PyObject_Size(opath)+1 > MAX_PATH) {
2213 PyErr_SetString(PyExc_ValueError, "path too long");
2214 Py_DECREF(opath);
2215 return NULL;
2216 }
2217 strcpy(namebuf, bytes2str(opath, 0));
2218 len = PyObject_Size(opath);
Neil Schemenauer94b866a2002-03-22 20:51:58 +00002219 if (len > 0) {
2220 char ch = namebuf[len-1];
2221 if (ch != SEP && ch != ALTSEP && ch != ':')
2222 namebuf[len++] = '/';
Hirokazu Yamamotobbb9be72009-05-04 05:56:46 +00002223 strcpy(namebuf + len, "*.*");
Neil Schemenauer94b866a2002-03-22 20:51:58 +00002224 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002225
Barry Warsaw53699e91996-12-10 23:23:01 +00002226 if ((d = PyList_New(0)) == NULL)
Guido van Rossumb6775db1994-08-01 11:34:53 +00002227 return NULL;
2228
2229 hFindFile = FindFirstFile(namebuf, &FileData);
2230 if (hFindFile == INVALID_HANDLE_VALUE) {
Thomas Wouters477c8d52006-05-27 19:21:47 +00002231 int error = GetLastError();
2232 if (error == ERROR_FILE_NOT_FOUND)
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002233 return d;
2234 Py_DECREF(d);
Mark Hammondef8b6542001-05-13 08:04:26 +00002235 return win32_error("FindFirstFile", namebuf);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002236 }
2237 do {
Martin v. Löwise920f0d2006-03-07 23:59:33 +00002238 /* Skip over . and .. */
2239 if (strcmp(FileData.cFileName, ".") != 0 &&
2240 strcmp(FileData.cFileName, "..") != 0) {
Christian Heimes72b710a2008-05-26 13:28:38 +00002241 v = PyBytes_FromString(FileData.cFileName);
Martin v. Löwise920f0d2006-03-07 23:59:33 +00002242 if (v == NULL) {
2243 Py_DECREF(d);
2244 d = NULL;
2245 break;
2246 }
2247 if (PyList_Append(d, v) != 0) {
2248 Py_DECREF(v);
2249 Py_DECREF(d);
2250 d = NULL;
2251 break;
2252 }
Barry Warsaw53699e91996-12-10 23:23:01 +00002253 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002254 }
Georg Brandl622927b2006-03-07 12:48:03 +00002255 Py_BEGIN_ALLOW_THREADS
2256 result = FindNextFile(hFindFile, &FileData);
2257 Py_END_ALLOW_THREADS
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002258 /* FindNextFile sets error to ERROR_NO_MORE_FILES if
2259 it got to the end of the directory. */
2260 if (!result && GetLastError() != ERROR_NO_MORE_FILES) {
2261 Py_DECREF(d);
2262 win32_error("FindNextFile", namebuf);
2263 FindClose(hFindFile);
2264 return NULL;
2265 }
Georg Brandl622927b2006-03-07 12:48:03 +00002266 } while (result == TRUE);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002267
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002268 if (FindClose(hFindFile) == FALSE) {
2269 Py_DECREF(d);
Mark Hammondef8b6542001-05-13 08:04:26 +00002270 return win32_error("FindClose", namebuf);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002271 }
Guido van Rossumb6775db1994-08-01 11:34:53 +00002272
2273 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002274
Tim Peters0bb44a42000-09-15 07:44:49 +00002275#elif defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002276
2277#ifndef MAX_PATH
2278#define MAX_PATH CCHMAXPATH
2279#endif
Martin v. Löwis011e8422009-05-05 04:43:17 +00002280 PyObject *oname;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002281 char *name, *pt;
Thomas Wouters68bc4f92006-03-01 01:05:10 +00002282 Py_ssize_t len;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002283 PyObject *d, *v;
2284 char namebuf[MAX_PATH+5];
2285 HDIR hdir = 1;
2286 ULONG srchcnt = 1;
2287 FILEFINDBUF3 ep;
2288 APIRET rc;
2289
Martin v. Löwis011e8422009-05-05 04:43:17 +00002290 if (!PyArg_ParseTuple(args, "O&:listdir",
2291 PyUnicode_FSConverter, &oname))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002292 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002293 name = bytes2str(oname);
2294 len = PyObject_Size(oname);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002295 if (len >= MAX_PATH) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00002296 release_bytes(oname);
Neal Norwitz6c913782007-10-14 03:23:09 +00002297 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002298 return NULL;
2299 }
2300 strcpy(namebuf, name);
2301 for (pt = namebuf; *pt; pt++)
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00002302 if (*pt == ALTSEP)
2303 *pt = SEP;
2304 if (namebuf[len-1] != SEP)
2305 namebuf[len++] = SEP;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002306 strcpy(namebuf + len, "*.*");
2307
Neal Norwitz6c913782007-10-14 03:23:09 +00002308 if ((d = PyList_New(0)) == NULL) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00002309 release_bytes(oname);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002310 return NULL;
Alexandre Vassalotti4167ebc2007-10-14 02:54:41 +00002311 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002312
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002313 rc = DosFindFirst(namebuf, /* Wildcard Pattern to Match */
2314 &hdir, /* Handle to Use While Search Directory */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002315 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002316 &ep, sizeof(ep), /* Structure to Receive Directory Entry */
2317 &srchcnt, /* Max and Actual Count of Entries Per Iteration */
2318 FIL_STANDARD); /* Format of Entry (EAs or Not) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002319
2320 if (rc != NO_ERROR) {
2321 errno = ENOENT;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002322 return posix_error_with_allocated_filename(oname);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002323 }
2324
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002325 if (srchcnt > 0) { /* If Directory is NOT Totally Empty, */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002326 do {
2327 if (ep.achName[0] == '.'
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00002328 && (ep.achName[1] == '\0' || (ep.achName[1] == '.' && ep.achName[2] == '\0')))
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002329 continue; /* Skip Over "." and ".." Names */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002330
2331 strcpy(namebuf, ep.achName);
2332
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002333 /* Leave Case of Name Alone -- In Native Form */
2334 /* (Removed Forced Lowercasing Code) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002335
Christian Heimes72b710a2008-05-26 13:28:38 +00002336 v = PyBytes_FromString(namebuf);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002337 if (v == NULL) {
2338 Py_DECREF(d);
2339 d = NULL;
2340 break;
2341 }
2342 if (PyList_Append(d, v) != 0) {
2343 Py_DECREF(v);
2344 Py_DECREF(d);
2345 d = NULL;
2346 break;
2347 }
2348 Py_DECREF(v);
2349 } while (DosFindNext(hdir, &ep, sizeof(ep), &srchcnt) == NO_ERROR && srchcnt > 0);
2350 }
2351
Martin v. Löwis011e8422009-05-05 04:43:17 +00002352 release_bytes(oname);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002353 return d;
2354#else
Martin v. Löwis011e8422009-05-05 04:43:17 +00002355 PyObject *oname;
2356 char *name;
Barry Warsaw53699e91996-12-10 23:23:01 +00002357 PyObject *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002358 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +00002359 struct dirent *ep;
Just van Rossum96b1c902003-03-03 17:32:15 +00002360 int arg_is_unicode = 1;
2361
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002362 errno = 0;
Just van Rossum96b1c902003-03-03 17:32:15 +00002363 if (!PyArg_ParseTuple(args, "U:listdir", &v)) {
2364 arg_is_unicode = 0;
2365 PyErr_Clear();
2366 }
Martin v. Löwis011e8422009-05-05 04:43:17 +00002367 if (!PyArg_ParseTuple(args, "O&:listdir", PyUnicode_FSConverter, &oname))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002368 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002369 name = bytes2str(oname, 1);
Guido van Rossumff4949e1992-08-05 19:58:53 +00002370 if ((dirp = opendir(name)) == NULL) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00002371 return posix_error_with_allocated_filename(oname);
Guido van Rossumff4949e1992-08-05 19:58:53 +00002372 }
Barry Warsaw53699e91996-12-10 23:23:01 +00002373 if ((d = PyList_New(0)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002374 closedir(dirp);
Martin v. Löwis011e8422009-05-05 04:43:17 +00002375 release_bytes(oname);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002376 return NULL;
2377 }
Georg Brandl622927b2006-03-07 12:48:03 +00002378 for (;;) {
Georg Brandl3dbca812008-07-23 16:10:53 +00002379 errno = 0;
Georg Brandl622927b2006-03-07 12:48:03 +00002380 Py_BEGIN_ALLOW_THREADS
2381 ep = readdir(dirp);
2382 Py_END_ALLOW_THREADS
Georg Brandl3dbca812008-07-23 16:10:53 +00002383 if (ep == NULL) {
2384 if (errno == 0) {
2385 break;
2386 } else {
2387 closedir(dirp);
2388 Py_DECREF(d);
Martin v. Löwis011e8422009-05-05 04:43:17 +00002389 return posix_error_with_allocated_filename(oname);
Georg Brandl3dbca812008-07-23 16:10:53 +00002390 }
2391 }
Guido van Rossum24f42ac1995-07-18 18:16:52 +00002392 if (ep->d_name[0] == '.' &&
2393 (NAMLEN(ep) == 1 ||
Guido van Rossuma376cc51996-12-05 23:43:35 +00002394 (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
Guido van Rossum24f42ac1995-07-18 18:16:52 +00002395 continue;
Christian Heimes72b710a2008-05-26 13:28:38 +00002396 v = PyBytes_FromStringAndSize(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002397 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002398 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002399 d = NULL;
2400 break;
2401 }
Just van Rossum96b1c902003-03-03 17:32:15 +00002402 if (arg_is_unicode) {
Just van Rossum46c97842003-02-25 21:42:15 +00002403 PyObject *w;
2404
2405 w = PyUnicode_FromEncodedObject(v,
Tim Peters11b23062003-04-23 02:39:17 +00002406 Py_FileSystemDefaultEncoding,
Martin v. Löwis43c57782009-05-10 08:15:24 +00002407 "surrogateescape");
Martin v. Löwis011e8422009-05-05 04:43:17 +00002408 Py_DECREF(v);
2409 if (w != NULL)
Just van Rossum6a421832003-03-04 19:30:44 +00002410 v = w;
Just van Rossum6a421832003-03-04 19:30:44 +00002411 else {
Martin v. Löwis011e8422009-05-05 04:43:17 +00002412 /* Encoding failed to decode ASCII bytes.
2413 Raise exception. */
2414 Py_DECREF(d);
2415 d = NULL;
2416 break;
Just van Rossum46c97842003-02-25 21:42:15 +00002417 }
Just van Rossum46c97842003-02-25 21:42:15 +00002418 }
Barry Warsaw53699e91996-12-10 23:23:01 +00002419 if (PyList_Append(d, v) != 0) {
2420 Py_DECREF(v);
2421 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002422 d = NULL;
2423 break;
2424 }
Barry Warsaw53699e91996-12-10 23:23:01 +00002425 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002426 }
2427 closedir(dirp);
Martin v. Löwis011e8422009-05-05 04:43:17 +00002428 release_bytes(oname);
Guido van Rossum0ee42cd1991-04-08 21:01:03 +00002429
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002430 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002431
Tim Peters0bb44a42000-09-15 07:44:49 +00002432#endif /* which OS */
2433} /* end of posix_listdir */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002434
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00002435#ifdef MS_WINDOWS
Mark Hammondef8b6542001-05-13 08:04:26 +00002436/* A helper function for abspath on win32 */
2437static PyObject *
2438posix__getfullpathname(PyObject *self, PyObject *args)
2439{
Martin v. Löwis011e8422009-05-05 04:43:17 +00002440 PyObject *opath;
2441 char *path;
Mark Hammondef8b6542001-05-13 08:04:26 +00002442 char outbuf[MAX_PATH*2];
2443 char *temp;
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00002444#ifdef MS_WINDOWS
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00002445 PyUnicodeObject *po;
2446 if (PyArg_ParseTuple(args, "U|:_getfullpathname", &po)) {
2447 Py_UNICODE *wpath = PyUnicode_AS_UNICODE(po);
2448 Py_UNICODE woutbuf[MAX_PATH*2], *woutbufp = woutbuf;
2449 Py_UNICODE *wtemp;
2450 DWORD result;
2451 PyObject *v;
2452 result = GetFullPathNameW(wpath,
2453 sizeof(woutbuf)/sizeof(woutbuf[0]),
2454 woutbuf, &wtemp);
2455 if (result > sizeof(woutbuf)/sizeof(woutbuf[0])) {
2456 woutbufp = malloc(result * sizeof(Py_UNICODE));
2457 if (!woutbufp)
2458 return PyErr_NoMemory();
2459 result = GetFullPathNameW(wpath, result, woutbufp, &wtemp);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002460 }
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00002461 if (result)
2462 v = PyUnicode_FromUnicode(woutbufp, wcslen(woutbufp));
2463 else
2464 v = win32_error_unicode("GetFullPathNameW", wpath);
2465 if (woutbufp != woutbuf)
2466 free(woutbufp);
2467 return v;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002468 }
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00002469 /* Drop the argument parsing error as narrow strings
2470 are also valid. */
2471 PyErr_Clear();
2472
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002473#endif
Martin v. Löwis011e8422009-05-05 04:43:17 +00002474 if (!PyArg_ParseTuple (args, "O&:_getfullpathname",
2475 PyUnicode_FSConverter, &opath))
Mark Hammondef8b6542001-05-13 08:04:26 +00002476 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002477 path = bytes2str(opath, 1);
2478 if (!GetFullPathName(path, sizeof(outbuf)/sizeof(outbuf[0]),
2479 outbuf, &temp)) {
2480 win32_error("GetFullPathName", path);
2481 release_bytes(opath);
2482 return NULL;
2483 }
2484 release_bytes(opath);
Martin v. Löwis969297f2004-06-15 18:49:58 +00002485 if (PyUnicode_Check(PyTuple_GetItem(args, 0))) {
2486 return PyUnicode_Decode(outbuf, strlen(outbuf),
2487 Py_FileSystemDefaultEncoding, NULL);
2488 }
Christian Heimes72b710a2008-05-26 13:28:38 +00002489 return PyBytes_FromString(outbuf);
Mark Hammondef8b6542001-05-13 08:04:26 +00002490} /* end of posix__getfullpathname */
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00002491#endif /* MS_WINDOWS */
Mark Hammondef8b6542001-05-13 08:04:26 +00002492
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002493PyDoc_STRVAR(posix_mkdir__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002494"mkdir(path [, mode=0777])\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002495Create a directory.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002496
Barry Warsaw53699e91996-12-10 23:23:01 +00002497static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002498posix_mkdir(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002499{
Guido van Rossumb0824db1996-02-25 04:50:32 +00002500 int res;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002501 PyObject *opath;
2502 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002503 int mode = 0777;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002504
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00002505#ifdef MS_WINDOWS
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00002506 PyUnicodeObject *po;
2507 if (PyArg_ParseTuple(args, "U|i:mkdir", &po, &mode)) {
2508 Py_BEGIN_ALLOW_THREADS
2509 /* PyUnicode_AS_UNICODE OK without thread lock as
2510 it is a simple dereference. */
2511 res = CreateDirectoryW(PyUnicode_AS_UNICODE(po), NULL);
2512 Py_END_ALLOW_THREADS
2513 if (!res)
2514 return win32_error_unicode("mkdir", PyUnicode_AS_UNICODE(po));
2515 Py_INCREF(Py_None);
2516 return Py_None;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002517 }
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00002518 /* Drop the argument parsing error as narrow strings
2519 are also valid. */
2520 PyErr_Clear();
Martin v. Löwis011e8422009-05-05 04:43:17 +00002521 if (!PyArg_ParseTuple(args, "O&|i:mkdir",
2522 PyUnicode_FSConverter, &opath, &mode))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002523 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002524 path = bytes2str(opath, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002525 Py_BEGIN_ALLOW_THREADS
2526 /* PyUnicode_AS_UNICODE OK without thread lock as
2527 it is a simple dereference. */
2528 res = CreateDirectoryA(path, NULL);
2529 Py_END_ALLOW_THREADS
2530 if (!res) {
2531 win32_error("mkdir", path);
Martin v. Löwis011e8422009-05-05 04:43:17 +00002532 release_bytes(opath);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002533 return NULL;
2534 }
Martin v. Löwis011e8422009-05-05 04:43:17 +00002535 release_bytes(opath);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002536 Py_INCREF(Py_None);
2537 return Py_None;
2538#else
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002539
Martin v. Löwis011e8422009-05-05 04:43:17 +00002540 if (!PyArg_ParseTuple(args, "O&|i:mkdir",
2541 PyUnicode_FSConverter, &opath, &mode))
Guido van Rossumb0824db1996-02-25 04:50:32 +00002542 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002543 path = bytes2str(opath, 1);
Barry Warsaw53699e91996-12-10 23:23:01 +00002544 Py_BEGIN_ALLOW_THREADS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002545#if ( defined(__WATCOMC__) || defined(PYCC_VACPP) ) && !defined(__QNX__)
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002546 res = mkdir(path);
2547#else
Guido van Rossumb0824db1996-02-25 04:50:32 +00002548 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002549#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002550 Py_END_ALLOW_THREADS
Guido van Rossumb0824db1996-02-25 04:50:32 +00002551 if (res < 0)
Martin v. Löwis011e8422009-05-05 04:43:17 +00002552 return posix_error_with_allocated_filename(opath);
2553 release_bytes(opath);
Barry Warsaw53699e91996-12-10 23:23:01 +00002554 Py_INCREF(Py_None);
2555 return Py_None;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002556#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002557}
2558
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002559
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002560/* sys/resource.h is needed for at least: wait3(), wait4(), broken nice. */
2561#if defined(HAVE_SYS_RESOURCE_H)
Thomas Wouterse38b2f12001-07-11 22:35:31 +00002562#include <sys/resource.h>
2563#endif
Thomas Wouterse38b2f12001-07-11 22:35:31 +00002564
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002565
2566#ifdef HAVE_NICE
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002567PyDoc_STRVAR(posix_nice__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002568"nice(inc) -> new_priority\n\n\
2569Decrease the priority of process by inc and return the new priority.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002570
Barry Warsaw53699e91996-12-10 23:23:01 +00002571static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002572posix_nice(PyObject *self, PyObject *args)
Guido van Rossum775f4da1993-01-09 17:18:52 +00002573{
2574 int increment, value;
2575
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002576 if (!PyArg_ParseTuple(args, "i:nice", &increment))
Guido van Rossum775f4da1993-01-09 17:18:52 +00002577 return NULL;
Thomas Woutersc2c12dc2001-07-11 14:45:34 +00002578
2579 /* There are two flavours of 'nice': one that returns the new
2580 priority (as required by almost all standards out there) and the
Thomas Wouterse38b2f12001-07-11 22:35:31 +00002581 Linux/FreeBSD/BSDI one, which returns '0' on success and advices
2582 the use of getpriority() to get the new priority.
Tim Peters5aa91602002-01-30 05:46:57 +00002583
Thomas Woutersc2c12dc2001-07-11 14:45:34 +00002584 If we are of the nice family that returns the new priority, we
2585 need to clear errno before the call, and check if errno is filled
2586 before calling posix_error() on a returnvalue of -1, because the
2587 -1 may be the actual new priority! */
2588
2589 errno = 0;
Guido van Rossum775f4da1993-01-09 17:18:52 +00002590 value = nice(increment);
Thomas Wouterse38b2f12001-07-11 22:35:31 +00002591#if defined(HAVE_BROKEN_NICE) && defined(HAVE_GETPRIORITY)
Thomas Woutersc2c12dc2001-07-11 14:45:34 +00002592 if (value == 0)
2593 value = getpriority(PRIO_PROCESS, 0);
2594#endif
2595 if (value == -1 && errno != 0)
2596 /* either nice() or getpriority() returned an error */
Guido van Rossum775f4da1993-01-09 17:18:52 +00002597 return posix_error();
Christian Heimes217cfd12007-12-02 14:31:20 +00002598 return PyLong_FromLong((long) value);
Guido van Rossum775f4da1993-01-09 17:18:52 +00002599}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002600#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00002601
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002602PyDoc_STRVAR(posix_rename__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002603"rename(old, new)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002604Rename a file or directory.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002605
Barry Warsaw53699e91996-12-10 23:23:01 +00002606static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002607posix_rename(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002608{
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002609#ifdef MS_WINDOWS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002610 PyObject *o1, *o2;
2611 char *p1, *p2;
2612 BOOL result;
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00002613 if (!PyArg_ParseTuple(args, "OO:rename", &o1, &o2))
Hirokazu Yamamotod7e4c082008-08-17 09:30:15 +00002614 goto error;
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00002615 if (!convert_to_unicode(&o1))
Hirokazu Yamamotod7e4c082008-08-17 09:30:15 +00002616 goto error;
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00002617 if (!convert_to_unicode(&o2)) {
Hirokazu Yamamotod7e4c082008-08-17 09:30:15 +00002618 Py_DECREF(o1);
2619 goto error;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002620 }
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00002621 Py_BEGIN_ALLOW_THREADS
2622 result = MoveFileW(PyUnicode_AsUnicode(o1),
2623 PyUnicode_AsUnicode(o2));
2624 Py_END_ALLOW_THREADS
2625 Py_DECREF(o1);
2626 Py_DECREF(o2);
2627 if (!result)
2628 return win32_error("rename", NULL);
2629 Py_INCREF(Py_None);
2630 return Py_None;
2631error:
2632 PyErr_Clear();
Thomas Wouters477c8d52006-05-27 19:21:47 +00002633 if (!PyArg_ParseTuple(args, "ss:rename", &p1, &p2))
2634 return NULL;
2635 Py_BEGIN_ALLOW_THREADS
2636 result = MoveFileA(p1, p2);
2637 Py_END_ALLOW_THREADS
2638 if (!result)
2639 return win32_error("rename", NULL);
2640 Py_INCREF(Py_None);
2641 return Py_None;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002642#else
Martin v. Löwis011e8422009-05-05 04:43:17 +00002643 return posix_2str(args, "O&O&:rename", rename);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002644#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002645}
2646
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002647
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002648PyDoc_STRVAR(posix_rmdir__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002649"rmdir(path)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002650Remove a directory.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002651
Barry Warsaw53699e91996-12-10 23:23:01 +00002652static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002653posix_rmdir(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002654{
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002655#ifdef MS_WINDOWS
Amaury Forgeot d'Arcc72ef8b2008-10-03 18:38:26 +00002656 return win32_1str(args, "rmdir", "y:rmdir", RemoveDirectoryA, "U:rmdir", RemoveDirectoryW);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002657#else
Martin v. Löwis011e8422009-05-05 04:43:17 +00002658 return posix_1str(args, "O&:rmdir", rmdir);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002659#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002660}
2661
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002662
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002663PyDoc_STRVAR(posix_stat__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002664"stat(path) -> stat result\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002665Perform a stat system call on the given path.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002666
Barry Warsaw53699e91996-12-10 23:23:01 +00002667static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002668posix_stat(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002669{
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002670#ifdef MS_WINDOWS
Martin v. Löwis011e8422009-05-05 04:43:17 +00002671 return posix_do_stat(self, args, "O&:stat", STAT, "U:stat", win32_wstat);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002672#else
Martin v. Löwis011e8422009-05-05 04:43:17 +00002673 return posix_do_stat(self, args, "O&:stat", STAT, NULL, NULL);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002674#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002675}
2676
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002677
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002678#ifdef HAVE_SYSTEM
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002679PyDoc_STRVAR(posix_system__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002680"system(command) -> exit_status\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002681Execute the command (a string) in a subshell.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002682
Barry Warsaw53699e91996-12-10 23:23:01 +00002683static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002684posix_system(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002685{
Guido van Rossumff4949e1992-08-05 19:58:53 +00002686 long sts;
Amaury Forgeot d'Arc90ebd3e2007-11-20 01:52:14 +00002687#ifdef MS_WINDOWS
2688 wchar_t *command;
2689 if (!PyArg_ParseTuple(args, "u:system", &command))
2690 return NULL;
2691#else
2692 char *command;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002693 if (!PyArg_ParseTuple(args, "s:system", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002694 return NULL;
Amaury Forgeot d'Arc90ebd3e2007-11-20 01:52:14 +00002695#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002696 Py_BEGIN_ALLOW_THREADS
Amaury Forgeot d'Arc90ebd3e2007-11-20 01:52:14 +00002697#ifdef MS_WINDOWS
2698 sts = _wsystem(command);
2699#else
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002700 sts = system(command);
Amaury Forgeot d'Arc90ebd3e2007-11-20 01:52:14 +00002701#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002702 Py_END_ALLOW_THREADS
Christian Heimes217cfd12007-12-02 14:31:20 +00002703 return PyLong_FromLong(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002704}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002705#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002706
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002707
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002708PyDoc_STRVAR(posix_umask__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002709"umask(new_mask) -> old_mask\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002710Set the current numeric umask and return the previous umask.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002711
Barry Warsaw53699e91996-12-10 23:23:01 +00002712static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002713posix_umask(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002714{
2715 int i;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002716 if (!PyArg_ParseTuple(args, "i:umask", &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002717 return NULL;
Fred Drake0368bc42001-07-19 20:48:32 +00002718 i = (int)umask(i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002719 if (i < 0)
2720 return posix_error();
Christian Heimes217cfd12007-12-02 14:31:20 +00002721 return PyLong_FromLong((long)i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002722}
2723
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002724
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002725PyDoc_STRVAR(posix_unlink__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002726"unlink(path)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002727Remove a file (same as remove(path)).");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002728
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002729PyDoc_STRVAR(posix_remove__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002730"remove(path)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002731Remove a file (same as unlink(path)).");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002732
Barry Warsaw53699e91996-12-10 23:23:01 +00002733static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002734posix_unlink(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002735{
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002736#ifdef MS_WINDOWS
Amaury Forgeot d'Arcc72ef8b2008-10-03 18:38:26 +00002737 return win32_1str(args, "remove", "y:remove", DeleteFileA, "U:remove", DeleteFileW);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002738#else
Martin v. Löwis011e8422009-05-05 04:43:17 +00002739 return posix_1str(args, "O&:remove", unlink);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00002740#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002741}
2742
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002743
Guido van Rossumb6775db1994-08-01 11:34:53 +00002744#ifdef HAVE_UNAME
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002745PyDoc_STRVAR(posix_uname__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002746"uname() -> (sysname, nodename, release, version, machine)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002747Return a tuple identifying the current operating system.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002748
Barry Warsaw53699e91996-12-10 23:23:01 +00002749static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00002750posix_uname(PyObject *self, PyObject *noargs)
Guido van Rossumc39de5f1992-02-05 11:15:54 +00002751{
Guido van Rossumc39de5f1992-02-05 11:15:54 +00002752 struct utsname u;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002753 int res;
Neal Norwitze241ce82003-02-17 18:17:05 +00002754
Barry Warsaw53699e91996-12-10 23:23:01 +00002755 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002756 res = uname(&u);
Barry Warsaw53699e91996-12-10 23:23:01 +00002757 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00002758 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +00002759 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002760 return Py_BuildValue("(sssss)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00002761 u.sysname,
2762 u.nodename,
2763 u.release,
2764 u.version,
2765 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +00002766}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002767#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00002768
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002769static int
2770extract_time(PyObject *t, long* sec, long* usec)
2771{
2772 long intval;
2773 if (PyFloat_Check(t)) {
2774 double tval = PyFloat_AsDouble(t);
Christian Heimes90aa7642007-12-19 02:45:37 +00002775 PyObject *intobj = Py_TYPE(t)->tp_as_number->nb_int(t);
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002776 if (!intobj)
2777 return -1;
Christian Heimes217cfd12007-12-02 14:31:20 +00002778 intval = PyLong_AsLong(intobj);
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002779 Py_DECREF(intobj);
Michael W. Hudsonb8963812005-07-05 15:21:58 +00002780 if (intval == -1 && PyErr_Occurred())
2781 return -1;
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002782 *sec = intval;
Tim Peters96940cf2002-09-10 15:37:28 +00002783 *usec = (long)((tval - intval) * 1e6); /* can't exceed 1000000 */
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002784 if (*usec < 0)
2785 /* If rounding gave us a negative number,
2786 truncate. */
2787 *usec = 0;
2788 return 0;
2789 }
Christian Heimes217cfd12007-12-02 14:31:20 +00002790 intval = PyLong_AsLong(t);
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002791 if (intval == -1 && PyErr_Occurred())
2792 return -1;
2793 *sec = intval;
2794 *usec = 0;
Martin v. Löwis076b2092002-09-10 15:04:41 +00002795 return 0;
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002796}
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002798PyDoc_STRVAR(posix_utime__doc__,
Thomas Wouters477c8d52006-05-27 19:21:47 +00002799"utime(path, (atime, mtime))\n\
Fred Drakef7ce04d2002-06-20 18:31:21 +00002800utime(path, None)\n\n\
Barry Warsaw3cef8562000-05-01 16:17:24 +00002801Set the access and modified time of the file to the given values. If the\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002802second form is used, set the access and modified times to the current time.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002803
Barry Warsaw53699e91996-12-10 23:23:01 +00002804static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002805posix_utime(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002806{
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00002807#ifdef MS_WINDOWS
Thomas Wouters477c8d52006-05-27 19:21:47 +00002808 PyObject *arg;
2809 PyUnicodeObject *obwpath;
2810 wchar_t *wpath = NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002811 PyObject *oapath;
2812 char *apath;
Thomas Wouters477c8d52006-05-27 19:21:47 +00002813 HANDLE hFile;
2814 long atimesec, mtimesec, ausec, musec;
2815 FILETIME atime, mtime;
2816 PyObject *result = NULL;
2817
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00002818 if (PyArg_ParseTuple(args, "UO|:utime", &obwpath, &arg)) {
2819 wpath = PyUnicode_AS_UNICODE(obwpath);
2820 Py_BEGIN_ALLOW_THREADS
2821 hFile = CreateFileW(wpath, FILE_WRITE_ATTRIBUTES, 0,
2822 NULL, OPEN_EXISTING,
2823 FILE_FLAG_BACKUP_SEMANTICS, NULL);
2824 Py_END_ALLOW_THREADS
2825 if (hFile == INVALID_HANDLE_VALUE)
2826 return win32_error_unicode("utime", wpath);
2827 } else
2828 /* Drop the argument parsing error as narrow strings
2829 are also valid. */
2830 PyErr_Clear();
2831
Thomas Wouters477c8d52006-05-27 19:21:47 +00002832 if (!wpath) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00002833 if (!PyArg_ParseTuple(args, "O&O:utime",
2834 PyUnicode_FSConverter, &oapath, &arg))
Thomas Wouters477c8d52006-05-27 19:21:47 +00002835 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002836 apath = bytes2str(oapath, 1);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002837 Py_BEGIN_ALLOW_THREADS
2838 hFile = CreateFileA(apath, FILE_WRITE_ATTRIBUTES, 0,
Thomas Wouters89f507f2006-12-13 04:49:30 +00002839 NULL, OPEN_EXISTING,
2840 FILE_FLAG_BACKUP_SEMANTICS, NULL);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002841 Py_END_ALLOW_THREADS
2842 if (hFile == INVALID_HANDLE_VALUE) {
2843 win32_error("utime", apath);
Martin v. Löwis011e8422009-05-05 04:43:17 +00002844 release_bytes(oapath);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002845 return NULL;
2846 }
Martin v. Löwis011e8422009-05-05 04:43:17 +00002847 release_bytes(oapath);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002848 }
2849
2850 if (arg == Py_None) {
2851 SYSTEMTIME now;
2852 GetSystemTime(&now);
2853 if (!SystemTimeToFileTime(&now, &mtime) ||
2854 !SystemTimeToFileTime(&now, &atime)) {
2855 win32_error("utime", NULL);
2856 goto done;
2857 }
2858 }
2859 else if (!PyTuple_Check(arg) || PyTuple_Size(arg) != 2) {
2860 PyErr_SetString(PyExc_TypeError,
2861 "utime() arg 2 must be a tuple (atime, mtime)");
2862 goto done;
2863 }
2864 else {
2865 if (extract_time(PyTuple_GET_ITEM(arg, 0),
2866 &atimesec, &ausec) == -1)
2867 goto done;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002868 time_t_to_FILE_TIME(atimesec, 1000*ausec, &atime);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002869 if (extract_time(PyTuple_GET_ITEM(arg, 1),
2870 &mtimesec, &musec) == -1)
2871 goto done;
Thomas Wouters89f507f2006-12-13 04:49:30 +00002872 time_t_to_FILE_TIME(mtimesec, 1000*musec, &mtime);
Thomas Wouters477c8d52006-05-27 19:21:47 +00002873 }
2874 if (!SetFileTime(hFile, NULL, &atime, &mtime)) {
2875 /* Avoid putting the file name into the error here,
2876 as that may confuse the user into believing that
2877 something is wrong with the file, when it also
2878 could be the time stamp that gives a problem. */
2879 win32_error("utime", NULL);
2880 }
2881 Py_INCREF(Py_None);
2882 result = Py_None;
2883done:
2884 CloseHandle(hFile);
2885 return result;
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00002886#else /* MS_WINDOWS */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002887
Martin v. Löwis011e8422009-05-05 04:43:17 +00002888 PyObject *opath;
2889 char *path;
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002890 long atime, mtime, ausec, musec;
Guido van Rossumff4949e1992-08-05 19:58:53 +00002891 int res;
Barry Warsaw3cef8562000-05-01 16:17:24 +00002892 PyObject* arg;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00002893
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002894#if defined(HAVE_UTIMES)
2895 struct timeval buf[2];
2896#define ATIME buf[0].tv_sec
2897#define MTIME buf[1].tv_sec
2898#elif defined(HAVE_UTIME_H)
Guido van Rossum6d8841c1997-08-14 19:57:39 +00002899/* XXX should define struct utimbuf instead, above */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00002900 struct utimbuf buf;
2901#define ATIME buf.actime
2902#define MTIME buf.modtime
2903#define UTIME_ARG &buf
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002904#else /* HAVE_UTIMES */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00002905 time_t buf[2];
2906#define ATIME buf[0]
2907#define MTIME buf[1]
2908#define UTIME_ARG buf
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002909#endif /* HAVE_UTIMES */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00002910
Mark Hammond817c9292003-12-03 01:22:38 +00002911
Martin v. Löwis011e8422009-05-05 04:43:17 +00002912 if (!PyArg_ParseTuple(args, "O&O:utime",
2913 PyUnicode_FSConverter, &opath, &arg))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002914 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00002915 path = bytes2str(opath, 1);
Barry Warsaw3cef8562000-05-01 16:17:24 +00002916 if (arg == Py_None) {
2917 /* optional time values not given */
2918 Py_BEGIN_ALLOW_THREADS
2919 res = utime(path, NULL);
2920 Py_END_ALLOW_THREADS
2921 }
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002922 else if (!PyTuple_Check(arg) || PyTuple_Size(arg) != 2) {
Barry Warsaw3cef8562000-05-01 16:17:24 +00002923 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002924 "utime() arg 2 must be a tuple (atime, mtime)");
Martin v. Löwis011e8422009-05-05 04:43:17 +00002925 release_bytes(opath);
Barry Warsaw3cef8562000-05-01 16:17:24 +00002926 return NULL;
2927 }
2928 else {
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002929 if (extract_time(PyTuple_GET_ITEM(arg, 0),
Neal Norwitz96652712004-06-06 20:40:27 +00002930 &atime, &ausec) == -1) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00002931 release_bytes(opath);
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002932 return NULL;
Neal Norwitz96652712004-06-06 20:40:27 +00002933 }
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002934 if (extract_time(PyTuple_GET_ITEM(arg, 1),
Neal Norwitz96652712004-06-06 20:40:27 +00002935 &mtime, &musec) == -1) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00002936 release_bytes(opath);
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002937 return NULL;
Neal Norwitz96652712004-06-06 20:40:27 +00002938 }
Barry Warsaw3cef8562000-05-01 16:17:24 +00002939 ATIME = atime;
2940 MTIME = mtime;
Martin v. Löwis6aa9fdb2002-09-10 09:16:13 +00002941#ifdef HAVE_UTIMES
2942 buf[0].tv_usec = ausec;
2943 buf[1].tv_usec = musec;
2944 Py_BEGIN_ALLOW_THREADS
2945 res = utimes(path, buf);
2946 Py_END_ALLOW_THREADS
2947#else
Barry Warsaw3cef8562000-05-01 16:17:24 +00002948 Py_BEGIN_ALLOW_THREADS
2949 res = utime(path, UTIME_ARG);
2950 Py_END_ALLOW_THREADS
Mark Hammond817c9292003-12-03 01:22:38 +00002951#endif /* HAVE_UTIMES */
Barry Warsaw3cef8562000-05-01 16:17:24 +00002952 }
Mark Hammond2d5914b2004-05-04 08:10:37 +00002953 if (res < 0) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00002954 return posix_error_with_allocated_filename(opath);
Mark Hammond2d5914b2004-05-04 08:10:37 +00002955 }
Martin v. Löwis011e8422009-05-05 04:43:17 +00002956 release_bytes(opath);
Barry Warsaw53699e91996-12-10 23:23:01 +00002957 Py_INCREF(Py_None);
2958 return Py_None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00002959#undef UTIME_ARG
2960#undef ATIME
2961#undef MTIME
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00002962#endif /* MS_WINDOWS */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002963}
2964
Guido van Rossum85e3b011991-06-03 12:42:10 +00002965
Guido van Rossum3b066191991-06-04 19:40:25 +00002966/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +00002967
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002968PyDoc_STRVAR(posix__exit__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00002969"_exit(status)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002970Exit to the system with specified status, without normal exit processing.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002971
Barry Warsaw53699e91996-12-10 23:23:01 +00002972static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00002973posix__exit(PyObject *self, PyObject *args)
Guido van Rossum85e3b011991-06-03 12:42:10 +00002974{
2975 int sts;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002976 if (!PyArg_ParseTuple(args, "i:_exit", &sts))
Guido van Rossum85e3b011991-06-03 12:42:10 +00002977 return NULL;
2978 _exit(sts);
Guido van Rossuma376cc51996-12-05 23:43:35 +00002979 return NULL; /* Make gcc -Wall happy */
Guido van Rossum85e3b011991-06-03 12:42:10 +00002980}
2981
Martin v. Löwis114619e2002-10-07 06:44:21 +00002982#if defined(HAVE_EXECV) || defined(HAVE_SPAWNV)
2983static void
Martin v. Löwis725507b2006-03-07 12:08:51 +00002984free_string_array(char **array, Py_ssize_t count)
Martin v. Löwis114619e2002-10-07 06:44:21 +00002985{
Martin v. Löwis725507b2006-03-07 12:08:51 +00002986 Py_ssize_t i;
Martin v. Löwis114619e2002-10-07 06:44:21 +00002987 for (i = 0; i < count; i++)
2988 PyMem_Free(array[i]);
2989 PyMem_DEL(array);
2990}
Martin v. Löwis011e8422009-05-05 04:43:17 +00002991
Antoine Pitrou69f71142009-05-24 21:25:49 +00002992static
Martin v. Löwis011e8422009-05-05 04:43:17 +00002993int fsconvert_strdup(PyObject *o, char**out)
2994{
2995 PyObject *bytes;
2996 Py_ssize_t size;
2997 if (!PyUnicode_FSConverter(o, &bytes))
2998 return 0;
2999 size = PyObject_Size(bytes);
3000 *out = PyMem_Malloc(size+1);
3001 if (!*out)
3002 return 0;
3003 /* Don't lock bytes, as we hold the GIL */
3004 memcpy(*out, bytes2str(bytes, 0), size+1);
3005 Py_DECREF(bytes);
3006 return 1;
3007}
Martin v. Löwis114619e2002-10-07 06:44:21 +00003008#endif
3009
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003010
Guido van Rossuma4916fa1996-05-23 22:58:55 +00003011#ifdef HAVE_EXECV
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003012PyDoc_STRVAR(posix_execv__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003013"execv(path, args)\n\n\
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003014Execute an executable path with arguments, replacing current process.\n\
3015\n\
3016 path: path of executable file\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003017 args: tuple or list of strings");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003018
Barry Warsaw53699e91996-12-10 23:23:01 +00003019static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00003020posix_execv(PyObject *self, PyObject *args)
Guido van Rossum85e3b011991-06-03 12:42:10 +00003021{
Martin v. Löwis011e8422009-05-05 04:43:17 +00003022 PyObject *opath;
Guido van Rossumef0a00e1992-01-27 16:51:30 +00003023 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00003024 PyObject *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +00003025 char **argvlist;
Martin v. Löwis725507b2006-03-07 12:08:51 +00003026 Py_ssize_t i, argc;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003027 PyObject *(*getitem)(PyObject *, Py_ssize_t);
Guido van Rossum85e3b011991-06-03 12:42:10 +00003028
Guido van Rossum89b33251993-10-22 14:26:06 +00003029 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +00003030 argv is a list or tuple of strings. */
3031
Martin v. Löwis011e8422009-05-05 04:43:17 +00003032 if (!PyArg_ParseTuple(args, "O&O:execv",
3033 PyUnicode_FSConverter,
3034 &opath, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +00003035 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00003036 path = bytes2str(opath, 1);
Barry Warsaw53699e91996-12-10 23:23:01 +00003037 if (PyList_Check(argv)) {
3038 argc = PyList_Size(argv);
3039 getitem = PyList_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00003040 }
Barry Warsaw53699e91996-12-10 23:23:01 +00003041 else if (PyTuple_Check(argv)) {
3042 argc = PyTuple_Size(argv);
3043 getitem = PyTuple_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00003044 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +00003045 else {
Fred Drake661ea262000-10-24 19:57:45 +00003046 PyErr_SetString(PyExc_TypeError, "execv() arg 2 must be a tuple or list");
Martin v. Löwis011e8422009-05-05 04:43:17 +00003047 release_bytes(opath);
Guido van Rossum50422b42000-04-26 20:34:28 +00003048 return NULL;
3049 }
Thomas Heller6790d602007-08-30 17:15:14 +00003050 if (argc < 1) {
3051 PyErr_SetString(PyExc_ValueError, "execv() arg 2 must not be empty");
Martin v. Löwis011e8422009-05-05 04:43:17 +00003052 release_bytes(opath);
Thomas Heller6790d602007-08-30 17:15:14 +00003053 return NULL;
3054 }
Guido van Rossum50422b42000-04-26 20:34:28 +00003055
Barry Warsaw53699e91996-12-10 23:23:01 +00003056 argvlist = PyMem_NEW(char *, argc+1);
Martin v. Löwis114619e2002-10-07 06:44:21 +00003057 if (argvlist == NULL) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00003058 release_bytes(opath);
Neal Norwitzec74f2f2003-02-11 23:05:40 +00003059 return PyErr_NoMemory();
Martin v. Löwis114619e2002-10-07 06:44:21 +00003060 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00003061 for (i = 0; i < argc; i++) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00003062 if (!fsconvert_strdup((*getitem)(argv, i),
3063 &argvlist[i])) {
Martin v. Löwis114619e2002-10-07 06:44:21 +00003064 free_string_array(argvlist, i);
Tim Peters5aa91602002-01-30 05:46:57 +00003065 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00003066 "execv() arg 2 must contain only strings");
Martin v. Löwis011e8422009-05-05 04:43:17 +00003067 release_bytes(opath);
Guido van Rossum50422b42000-04-26 20:34:28 +00003068 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00003069
Guido van Rossum85e3b011991-06-03 12:42:10 +00003070 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00003071 }
3072 argvlist[argc] = NULL;
3073
Guido van Rossumef0a00e1992-01-27 16:51:30 +00003074 execv(path, argvlist);
Guido van Rossumb6775db1994-08-01 11:34:53 +00003075
Guido van Rossum85e3b011991-06-03 12:42:10 +00003076 /* If we get here it's definitely an error */
3077
Martin v. Löwis114619e2002-10-07 06:44:21 +00003078 free_string_array(argvlist, argc);
Martin v. Löwis011e8422009-05-05 04:43:17 +00003079 release_bytes(opath);
Guido van Rossum85e3b011991-06-03 12:42:10 +00003080 return posix_error();
3081}
3082
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003083
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003084PyDoc_STRVAR(posix_execve__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003085"execve(path, args, env)\n\n\
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003086Execute a path with arguments and environment, replacing current process.\n\
3087\n\
3088 path: path of executable file\n\
3089 args: tuple or list of arguments\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003090 env: dictionary of strings mapping to strings");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003091
Barry Warsaw53699e91996-12-10 23:23:01 +00003092static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00003093posix_execve(PyObject *self, PyObject *args)
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003094{
Martin v. Löwis011e8422009-05-05 04:43:17 +00003095 PyObject *opath;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003096 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00003097 PyObject *argv, *env;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003098 char **argvlist;
3099 char **envlist;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00003100 PyObject *key, *val, *keys=NULL, *vals=NULL;
Martin v. Löwis725507b2006-03-07 12:08:51 +00003101 Py_ssize_t i, pos, argc, envc;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003102 PyObject *(*getitem)(PyObject *, Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003103 Py_ssize_t lastarg = 0;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003104
3105 /* execve has three arguments: (path, argv, env), where
3106 argv is a list or tuple of strings and env is a dictionary
3107 like posix.environ. */
3108
Martin v. Löwis011e8422009-05-05 04:43:17 +00003109 if (!PyArg_ParseTuple(args, "O&OO:execve",
3110 PyUnicode_FSConverter,
3111 &opath, &argv, &env))
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003112 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00003113 path = bytes2str(opath, 1);
Barry Warsaw53699e91996-12-10 23:23:01 +00003114 if (PyList_Check(argv)) {
3115 argc = PyList_Size(argv);
3116 getitem = PyList_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003117 }
Barry Warsaw53699e91996-12-10 23:23:01 +00003118 else if (PyTuple_Check(argv)) {
3119 argc = PyTuple_Size(argv);
3120 getitem = PyTuple_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003121 }
3122 else {
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003123 PyErr_SetString(PyExc_TypeError,
3124 "execve() arg 2 must be a tuple or list");
Martin v. Löwis114619e2002-10-07 06:44:21 +00003125 goto fail_0;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003126 }
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00003127 if (!PyMapping_Check(env)) {
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003128 PyErr_SetString(PyExc_TypeError,
3129 "execve() arg 3 must be a mapping object");
Martin v. Löwis114619e2002-10-07 06:44:21 +00003130 goto fail_0;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003131 }
3132
Barry Warsaw53699e91996-12-10 23:23:01 +00003133 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003134 if (argvlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00003135 PyErr_NoMemory();
Martin v. Löwis114619e2002-10-07 06:44:21 +00003136 goto fail_0;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003137 }
3138 for (i = 0; i < argc; i++) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00003139 if (!fsconvert_strdup((*getitem)(argv, i),
3140 &argvlist[i]))
Barry Warsaw43d68b81996-12-19 22:10:44 +00003141 {
Martin v. Löwis114619e2002-10-07 06:44:21 +00003142 lastarg = i;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003143 goto fail_1;
3144 }
3145 }
Martin v. Löwis114619e2002-10-07 06:44:21 +00003146 lastarg = argc;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003147 argvlist[argc] = NULL;
3148
Jeremy Hylton03657cf2000-07-12 13:05:33 +00003149 i = PyMapping_Size(env);
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003150 if (i < 0)
3151 goto fail_1;
Barry Warsaw53699e91996-12-10 23:23:01 +00003152 envlist = PyMem_NEW(char *, i + 1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003153 if (envlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00003154 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003155 goto fail_1;
3156 }
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003157 envc = 0;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00003158 keys = PyMapping_Keys(env);
3159 vals = PyMapping_Values(env);
3160 if (!keys || !vals)
3161 goto fail_2;
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003162 if (!PyList_Check(keys) || !PyList_Check(vals)) {
3163 PyErr_SetString(PyExc_TypeError,
3164 "execve(): env.keys() or env.values() is not a list");
3165 goto fail_2;
3166 }
Tim Peters5aa91602002-01-30 05:46:57 +00003167
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00003168 for (pos = 0; pos < i; pos++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003169 char *p, *k, *v;
Tim Petersc8996f52001-12-03 20:41:00 +00003170 size_t len;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00003171
3172 key = PyList_GetItem(keys, pos);
3173 val = PyList_GetItem(vals, pos);
3174 if (!key || !val)
3175 goto fail_2;
Tim Peters5aa91602002-01-30 05:46:57 +00003176
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003177 if (!PyArg_Parse(
3178 key,
3179 "s;execve() arg 3 contains a non-string key",
3180 &k) ||
3181 !PyArg_Parse(
3182 val,
3183 "s;execve() arg 3 contains a non-string value",
3184 &v))
Barry Warsaw43d68b81996-12-19 22:10:44 +00003185 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003186 goto fail_2;
3187 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00003188
3189#if defined(PYOS_OS2)
3190 /* Omit Pseudo-Env Vars that Would Confuse Programs if Passed On */
3191 if (stricmp(k, "BEGINLIBPATH") != 0 && stricmp(k, "ENDLIBPATH") != 0) {
3192#endif
Christian Heimes830a4bc2007-11-22 07:43:40 +00003193 len = PyUnicode_GetSize(key) + PyUnicode_GetSize(val) + 2;
Tim Petersc8996f52001-12-03 20:41:00 +00003194 p = PyMem_NEW(char, len);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003195 if (p == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00003196 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003197 goto fail_2;
3198 }
Tim Petersc8996f52001-12-03 20:41:00 +00003199 PyOS_snprintf(p, len, "%s=%s", k, v);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003200 envlist[envc++] = p;
Guido van Rossumd48f2521997-12-05 22:19:34 +00003201#if defined(PYOS_OS2)
3202 }
3203#endif
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003204 }
3205 envlist[envc] = 0;
3206
3207 execve(path, argvlist, envlist);
Tim Peters5aa91602002-01-30 05:46:57 +00003208
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003209 /* If we get here it's definitely an error */
3210
3211 (void) posix_error();
3212
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003213 fail_2:
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003214 while (--envc >= 0)
Barry Warsaw53699e91996-12-10 23:23:01 +00003215 PyMem_DEL(envlist[envc]);
3216 PyMem_DEL(envlist);
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003217 fail_1:
3218 free_string_array(argvlist, lastarg);
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00003219 Py_XDECREF(vals);
3220 Py_XDECREF(keys);
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003221 fail_0:
Martin v. Löwis011e8422009-05-05 04:43:17 +00003222 release_bytes(opath);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003223 return NULL;
3224}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00003225#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00003226
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003227
Guido van Rossuma1065681999-01-25 23:20:23 +00003228#ifdef HAVE_SPAWNV
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003229PyDoc_STRVAR(posix_spawnv__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003230"spawnv(mode, path, args)\n\n\
Tim Peters25059d32001-12-07 20:35:43 +00003231Execute the program 'path' in a new process.\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00003232\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00003233 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00003234 path: path of executable file\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003235 args: tuple or list of strings");
Guido van Rossuma1065681999-01-25 23:20:23 +00003236
3237static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00003238posix_spawnv(PyObject *self, PyObject *args)
Guido van Rossuma1065681999-01-25 23:20:23 +00003239{
Martin v. Löwis011e8422009-05-05 04:43:17 +00003240 PyObject *opath;
Guido van Rossuma1065681999-01-25 23:20:23 +00003241 char *path;
3242 PyObject *argv;
3243 char **argvlist;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003244 int mode, i;
3245 Py_ssize_t argc;
Tim Peters79248aa2001-08-29 21:37:10 +00003246 Py_intptr_t spawnval;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003247 PyObject *(*getitem)(PyObject *, Py_ssize_t);
Guido van Rossuma1065681999-01-25 23:20:23 +00003248
3249 /* spawnv has three arguments: (mode, path, argv), where
3250 argv is a list or tuple of strings. */
3251
Martin v. Löwis011e8422009-05-05 04:43:17 +00003252 if (!PyArg_ParseTuple(args, "iO&O:spawnv", &mode,
3253 PyUnicode_FSConverter,
3254 &opath, &argv))
Guido van Rossuma1065681999-01-25 23:20:23 +00003255 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00003256 path = bytes2str(opath, 1);
Guido van Rossuma1065681999-01-25 23:20:23 +00003257 if (PyList_Check(argv)) {
3258 argc = PyList_Size(argv);
3259 getitem = PyList_GetItem;
3260 }
3261 else if (PyTuple_Check(argv)) {
3262 argc = PyTuple_Size(argv);
3263 getitem = PyTuple_GetItem;
3264 }
3265 else {
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003266 PyErr_SetString(PyExc_TypeError,
3267 "spawnv() arg 2 must be a tuple or list");
Martin v. Löwis011e8422009-05-05 04:43:17 +00003268 release_bytes(opath);
Guido van Rossuma1065681999-01-25 23:20:23 +00003269 return NULL;
3270 }
3271
3272 argvlist = PyMem_NEW(char *, argc+1);
Martin v. Löwis114619e2002-10-07 06:44:21 +00003273 if (argvlist == NULL) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00003274 release_bytes(opath);
Neal Norwitzec74f2f2003-02-11 23:05:40 +00003275 return PyErr_NoMemory();
Martin v. Löwis114619e2002-10-07 06:44:21 +00003276 }
Guido van Rossuma1065681999-01-25 23:20:23 +00003277 for (i = 0; i < argc; i++) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00003278 if (!fsconvert_strdup((*getitem)(argv, i),
3279 &argvlist[i])) {
Martin v. Löwis114619e2002-10-07 06:44:21 +00003280 free_string_array(argvlist, i);
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003281 PyErr_SetString(
3282 PyExc_TypeError,
3283 "spawnv() arg 2 must contain only strings");
Martin v. Löwis011e8422009-05-05 04:43:17 +00003284 release_bytes(opath);
Fred Drake137507e2000-06-01 02:02:46 +00003285 return NULL;
Guido van Rossuma1065681999-01-25 23:20:23 +00003286 }
3287 }
3288 argvlist[argc] = NULL;
3289
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00003290#if defined(PYOS_OS2) && defined(PYCC_GCC)
3291 Py_BEGIN_ALLOW_THREADS
3292 spawnval = spawnv(mode, path, argvlist);
3293 Py_END_ALLOW_THREADS
3294#else
Guido van Rossum246bc171999-02-01 23:54:31 +00003295 if (mode == _OLD_P_OVERLAY)
3296 mode = _P_OVERLAY;
Tim Peters5aa91602002-01-30 05:46:57 +00003297
Tim Peters25059d32001-12-07 20:35:43 +00003298 Py_BEGIN_ALLOW_THREADS
Fred Drake699f3522000-06-29 21:12:41 +00003299 spawnval = _spawnv(mode, path, argvlist);
Tim Peters25059d32001-12-07 20:35:43 +00003300 Py_END_ALLOW_THREADS
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00003301#endif
Tim Peters5aa91602002-01-30 05:46:57 +00003302
Martin v. Löwis114619e2002-10-07 06:44:21 +00003303 free_string_array(argvlist, argc);
Martin v. Löwis011e8422009-05-05 04:43:17 +00003304 release_bytes(opath);
Guido van Rossuma1065681999-01-25 23:20:23 +00003305
Fred Drake699f3522000-06-29 21:12:41 +00003306 if (spawnval == -1)
Guido van Rossuma1065681999-01-25 23:20:23 +00003307 return posix_error();
3308 else
Fredrik Lundhe25cfd82000-07-09 13:10:40 +00003309#if SIZEOF_LONG == SIZEOF_VOID_P
3310 return Py_BuildValue("l", (long) spawnval);
Fred Drake699f3522000-06-29 21:12:41 +00003311#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00003312 return Py_BuildValue("L", (PY_LONG_LONG) spawnval);
Fred Drake699f3522000-06-29 21:12:41 +00003313#endif
Guido van Rossuma1065681999-01-25 23:20:23 +00003314}
3315
3316
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003317PyDoc_STRVAR(posix_spawnve__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003318"spawnve(mode, path, args, env)\n\n\
Tim Peters25059d32001-12-07 20:35:43 +00003319Execute the program 'path' in a new process.\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00003320\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00003321 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00003322 path: path of executable file\n\
3323 args: tuple or list of arguments\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003324 env: dictionary of strings mapping to strings");
Guido van Rossuma1065681999-01-25 23:20:23 +00003325
3326static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00003327posix_spawnve(PyObject *self, PyObject *args)
Guido van Rossuma1065681999-01-25 23:20:23 +00003328{
Martin v. Löwis011e8422009-05-05 04:43:17 +00003329 PyObject *opath;
Guido van Rossuma1065681999-01-25 23:20:23 +00003330 char *path;
3331 PyObject *argv, *env;
3332 char **argvlist;
3333 char **envlist;
3334 PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00003335 int mode, pos, envc;
3336 Py_ssize_t argc, i;
Tim Peters79248aa2001-08-29 21:37:10 +00003337 Py_intptr_t spawnval;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003338 PyObject *(*getitem)(PyObject *, Py_ssize_t);
Thomas Wouters477c8d52006-05-27 19:21:47 +00003339 Py_ssize_t lastarg = 0;
Guido van Rossuma1065681999-01-25 23:20:23 +00003340
3341 /* spawnve has four arguments: (mode, path, argv, env), where
3342 argv is a list or tuple of strings and env is a dictionary
3343 like posix.environ. */
3344
Martin v. Löwis011e8422009-05-05 04:43:17 +00003345 if (!PyArg_ParseTuple(args, "iO&OO:spawnve", &mode,
3346 PyUnicode_FSConverter,
3347 &opath, &argv, &env))
Guido van Rossuma1065681999-01-25 23:20:23 +00003348 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00003349 path = bytes2str(opath, 1);
Guido van Rossuma1065681999-01-25 23:20:23 +00003350 if (PyList_Check(argv)) {
3351 argc = PyList_Size(argv);
3352 getitem = PyList_GetItem;
3353 }
3354 else if (PyTuple_Check(argv)) {
3355 argc = PyTuple_Size(argv);
3356 getitem = PyTuple_GetItem;
3357 }
3358 else {
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003359 PyErr_SetString(PyExc_TypeError,
3360 "spawnve() arg 2 must be a tuple or list");
Martin v. Löwis114619e2002-10-07 06:44:21 +00003361 goto fail_0;
Guido van Rossuma1065681999-01-25 23:20:23 +00003362 }
3363 if (!PyMapping_Check(env)) {
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003364 PyErr_SetString(PyExc_TypeError,
3365 "spawnve() arg 3 must be a mapping object");
Martin v. Löwis114619e2002-10-07 06:44:21 +00003366 goto fail_0;
Guido van Rossuma1065681999-01-25 23:20:23 +00003367 }
3368
3369 argvlist = PyMem_NEW(char *, argc+1);
3370 if (argvlist == NULL) {
3371 PyErr_NoMemory();
Martin v. Löwis114619e2002-10-07 06:44:21 +00003372 goto fail_0;
Guido van Rossuma1065681999-01-25 23:20:23 +00003373 }
3374 for (i = 0; i < argc; i++) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00003375 if (!fsconvert_strdup((*getitem)(argv, i),
3376 &argvlist[i]))
Guido van Rossuma1065681999-01-25 23:20:23 +00003377 {
Martin v. Löwis114619e2002-10-07 06:44:21 +00003378 lastarg = i;
Guido van Rossuma1065681999-01-25 23:20:23 +00003379 goto fail_1;
3380 }
3381 }
Martin v. Löwis114619e2002-10-07 06:44:21 +00003382 lastarg = argc;
Guido van Rossuma1065681999-01-25 23:20:23 +00003383 argvlist[argc] = NULL;
3384
Jeremy Hylton03657cf2000-07-12 13:05:33 +00003385 i = PyMapping_Size(env);
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003386 if (i < 0)
3387 goto fail_1;
Guido van Rossuma1065681999-01-25 23:20:23 +00003388 envlist = PyMem_NEW(char *, i + 1);
3389 if (envlist == NULL) {
3390 PyErr_NoMemory();
3391 goto fail_1;
3392 }
3393 envc = 0;
3394 keys = PyMapping_Keys(env);
3395 vals = PyMapping_Values(env);
3396 if (!keys || !vals)
3397 goto fail_2;
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003398 if (!PyList_Check(keys) || !PyList_Check(vals)) {
3399 PyErr_SetString(PyExc_TypeError,
3400 "spawnve(): env.keys() or env.values() is not a list");
3401 goto fail_2;
3402 }
Tim Peters5aa91602002-01-30 05:46:57 +00003403
Guido van Rossuma1065681999-01-25 23:20:23 +00003404 for (pos = 0; pos < i; pos++) {
3405 char *p, *k, *v;
Tim Petersc8996f52001-12-03 20:41:00 +00003406 size_t len;
Guido van Rossuma1065681999-01-25 23:20:23 +00003407
3408 key = PyList_GetItem(keys, pos);
3409 val = PyList_GetItem(vals, pos);
3410 if (!key || !val)
3411 goto fail_2;
Tim Peters5aa91602002-01-30 05:46:57 +00003412
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003413 if (!PyArg_Parse(
3414 key,
3415 "s;spawnve() arg 3 contains a non-string key",
3416 &k) ||
3417 !PyArg_Parse(
3418 val,
3419 "s;spawnve() arg 3 contains a non-string value",
3420 &v))
Guido van Rossuma1065681999-01-25 23:20:23 +00003421 {
3422 goto fail_2;
3423 }
Christian Heimes830a4bc2007-11-22 07:43:40 +00003424 len = PyUnicode_GetSize(key) + PyUnicode_GetSize(val) + 2;
Tim Petersc8996f52001-12-03 20:41:00 +00003425 p = PyMem_NEW(char, len);
Guido van Rossuma1065681999-01-25 23:20:23 +00003426 if (p == NULL) {
3427 PyErr_NoMemory();
3428 goto fail_2;
3429 }
Tim Petersc8996f52001-12-03 20:41:00 +00003430 PyOS_snprintf(p, len, "%s=%s", k, v);
Guido van Rossuma1065681999-01-25 23:20:23 +00003431 envlist[envc++] = p;
3432 }
3433 envlist[envc] = 0;
3434
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00003435#if defined(PYOS_OS2) && defined(PYCC_GCC)
3436 Py_BEGIN_ALLOW_THREADS
3437 spawnval = spawnve(mode, path, argvlist, envlist);
3438 Py_END_ALLOW_THREADS
3439#else
Guido van Rossum246bc171999-02-01 23:54:31 +00003440 if (mode == _OLD_P_OVERLAY)
3441 mode = _P_OVERLAY;
Tim Peters25059d32001-12-07 20:35:43 +00003442
3443 Py_BEGIN_ALLOW_THREADS
Fred Drake699f3522000-06-29 21:12:41 +00003444 spawnval = _spawnve(mode, path, argvlist, envlist);
Tim Peters25059d32001-12-07 20:35:43 +00003445 Py_END_ALLOW_THREADS
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00003446#endif
Tim Peters25059d32001-12-07 20:35:43 +00003447
Fred Drake699f3522000-06-29 21:12:41 +00003448 if (spawnval == -1)
Guido van Rossuma1065681999-01-25 23:20:23 +00003449 (void) posix_error();
3450 else
Fredrik Lundhe25cfd82000-07-09 13:10:40 +00003451#if SIZEOF_LONG == SIZEOF_VOID_P
3452 res = Py_BuildValue("l", (long) spawnval);
Fred Drake699f3522000-06-29 21:12:41 +00003453#else
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00003454 res = Py_BuildValue("L", (PY_LONG_LONG) spawnval);
Fred Drake699f3522000-06-29 21:12:41 +00003455#endif
Guido van Rossuma1065681999-01-25 23:20:23 +00003456
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003457 fail_2:
Guido van Rossuma1065681999-01-25 23:20:23 +00003458 while (--envc >= 0)
3459 PyMem_DEL(envlist[envc]);
3460 PyMem_DEL(envlist);
Guido van Rossum0847c5c2002-12-13 18:36:22 +00003461 fail_1:
Martin v. Löwis114619e2002-10-07 06:44:21 +00003462 free_string_array(argvlist, lastarg);
Guido van Rossuma1065681999-01-25 23:20:23 +00003463 Py_XDECREF(vals);
3464 Py_XDECREF(keys);
Martin v. Löwis114619e2002-10-07 06:44:21 +00003465 fail_0:
Martin v. Löwis011e8422009-05-05 04:43:17 +00003466 release_bytes(opath);
Guido van Rossuma1065681999-01-25 23:20:23 +00003467 return res;
3468}
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003469
3470/* OS/2 supports spawnvp & spawnvpe natively */
3471#if defined(PYOS_OS2)
3472PyDoc_STRVAR(posix_spawnvp__doc__,
3473"spawnvp(mode, file, args)\n\n\
3474Execute the program 'file' in a new process, using the environment\n\
3475search path to find the file.\n\
3476\n\
3477 mode: mode of process creation\n\
3478 file: executable file name\n\
3479 args: tuple or list of strings");
3480
3481static PyObject *
3482posix_spawnvp(PyObject *self, PyObject *args)
3483{
Martin v. Löwis011e8422009-05-05 04:43:17 +00003484 PyObject *opath;
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003485 char *path;
3486 PyObject *argv;
3487 char **argvlist;
3488 int mode, i, argc;
3489 Py_intptr_t spawnval;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003490 PyObject *(*getitem)(PyObject *, Py_ssize_t);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003491
3492 /* spawnvp has three arguments: (mode, path, argv), where
3493 argv is a list or tuple of strings. */
3494
Martin v. Löwis011e8422009-05-05 04:43:17 +00003495 if (!PyArg_ParseTuple(args, "iO&O:spawnvp", &mode,
3496 PyUnicode_FSConverter,
3497 &opath, &argv))
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003498 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00003499 path = bytes2str(opath);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003500 if (PyList_Check(argv)) {
3501 argc = PyList_Size(argv);
3502 getitem = PyList_GetItem;
3503 }
3504 else if (PyTuple_Check(argv)) {
3505 argc = PyTuple_Size(argv);
3506 getitem = PyTuple_GetItem;
3507 }
3508 else {
3509 PyErr_SetString(PyExc_TypeError,
3510 "spawnvp() arg 2 must be a tuple or list");
Martin v. Löwis011e8422009-05-05 04:43:17 +00003511 release_bytes(opath);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003512 return NULL;
3513 }
3514
3515 argvlist = PyMem_NEW(char *, argc+1);
3516 if (argvlist == NULL) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00003517 release_bytes(opath);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003518 return PyErr_NoMemory();
3519 }
3520 for (i = 0; i < argc; i++) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00003521 if (!fsconvert_strdup((*getitem)(argv, i),
3522 &argvlist[i])) {
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003523 free_string_array(argvlist, i);
3524 PyErr_SetString(
3525 PyExc_TypeError,
3526 "spawnvp() arg 2 must contain only strings");
Martin v. Löwis011e8422009-05-05 04:43:17 +00003527 release_bytes(opath);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003528 return NULL;
3529 }
3530 }
3531 argvlist[argc] = NULL;
3532
3533 Py_BEGIN_ALLOW_THREADS
3534#if defined(PYCC_GCC)
3535 spawnval = spawnvp(mode, path, argvlist);
3536#else
3537 spawnval = _spawnvp(mode, path, argvlist);
3538#endif
3539 Py_END_ALLOW_THREADS
3540
3541 free_string_array(argvlist, argc);
Martin v. Löwis011e8422009-05-05 04:43:17 +00003542 release_bytes(opath);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003543
3544 if (spawnval == -1)
3545 return posix_error();
3546 else
3547 return Py_BuildValue("l", (long) spawnval);
3548}
3549
3550
3551PyDoc_STRVAR(posix_spawnvpe__doc__,
3552"spawnvpe(mode, file, args, env)\n\n\
3553Execute the program 'file' in a new process, using the environment\n\
3554search path to find the file.\n\
3555\n\
3556 mode: mode of process creation\n\
3557 file: executable file name\n\
3558 args: tuple or list of arguments\n\
3559 env: dictionary of strings mapping to strings");
3560
3561static PyObject *
3562posix_spawnvpe(PyObject *self, PyObject *args)
3563{
Martin v. Löwis011e8422009-05-05 04:43:17 +00003564 PyObject *opath
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003565 char *path;
3566 PyObject *argv, *env;
3567 char **argvlist;
3568 char **envlist;
3569 PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL;
3570 int mode, i, pos, argc, envc;
3571 Py_intptr_t spawnval;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003572 PyObject *(*getitem)(PyObject *, Py_ssize_t);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003573 int lastarg = 0;
3574
3575 /* spawnvpe has four arguments: (mode, path, argv, env), where
3576 argv is a list or tuple of strings and env is a dictionary
3577 like posix.environ. */
3578
3579 if (!PyArg_ParseTuple(args, "ietOO:spawnvpe", &mode,
Martin v. Löwis011e8422009-05-05 04:43:17 +00003580 PyUnicode_FSConverter,
3581 &opath, &argv, &env))
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003582 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00003583 path = bytes2str(opath);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003584 if (PyList_Check(argv)) {
3585 argc = PyList_Size(argv);
3586 getitem = PyList_GetItem;
3587 }
3588 else if (PyTuple_Check(argv)) {
3589 argc = PyTuple_Size(argv);
3590 getitem = PyTuple_GetItem;
3591 }
3592 else {
3593 PyErr_SetString(PyExc_TypeError,
3594 "spawnvpe() arg 2 must be a tuple or list");
3595 goto fail_0;
3596 }
3597 if (!PyMapping_Check(env)) {
3598 PyErr_SetString(PyExc_TypeError,
3599 "spawnvpe() arg 3 must be a mapping object");
3600 goto fail_0;
3601 }
3602
3603 argvlist = PyMem_NEW(char *, argc+1);
3604 if (argvlist == NULL) {
3605 PyErr_NoMemory();
3606 goto fail_0;
3607 }
3608 for (i = 0; i < argc; i++) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00003609 if (!fsconvert_strdup((*getitem)(argv, i),
3610 &argvlist[i]))
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003611 {
3612 lastarg = i;
3613 goto fail_1;
3614 }
3615 }
3616 lastarg = argc;
3617 argvlist[argc] = NULL;
3618
3619 i = PyMapping_Size(env);
3620 if (i < 0)
3621 goto fail_1;
3622 envlist = PyMem_NEW(char *, i + 1);
3623 if (envlist == NULL) {
3624 PyErr_NoMemory();
3625 goto fail_1;
3626 }
3627 envc = 0;
3628 keys = PyMapping_Keys(env);
3629 vals = PyMapping_Values(env);
3630 if (!keys || !vals)
3631 goto fail_2;
3632 if (!PyList_Check(keys) || !PyList_Check(vals)) {
3633 PyErr_SetString(PyExc_TypeError,
3634 "spawnvpe(): env.keys() or env.values() is not a list");
3635 goto fail_2;
3636 }
3637
3638 for (pos = 0; pos < i; pos++) {
3639 char *p, *k, *v;
3640 size_t len;
3641
3642 key = PyList_GetItem(keys, pos);
3643 val = PyList_GetItem(vals, pos);
3644 if (!key || !val)
3645 goto fail_2;
3646
3647 if (!PyArg_Parse(
3648 key,
3649 "s;spawnvpe() arg 3 contains a non-string key",
3650 &k) ||
3651 !PyArg_Parse(
3652 val,
3653 "s;spawnvpe() arg 3 contains a non-string value",
3654 &v))
3655 {
3656 goto fail_2;
3657 }
Christian Heimes830a4bc2007-11-22 07:43:40 +00003658 len = PyUnicode_GetSize(key) + PyUnicode_GetSize(val) + 2;
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003659 p = PyMem_NEW(char, len);
3660 if (p == NULL) {
3661 PyErr_NoMemory();
3662 goto fail_2;
3663 }
3664 PyOS_snprintf(p, len, "%s=%s", k, v);
3665 envlist[envc++] = p;
3666 }
3667 envlist[envc] = 0;
3668
3669 Py_BEGIN_ALLOW_THREADS
3670#if defined(PYCC_GCC)
Christian Heimes292d3512008-02-03 16:51:08 +00003671 spawnval = spawnvpe(mode, path, argvlist, envlist);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003672#else
Christian Heimes292d3512008-02-03 16:51:08 +00003673 spawnval = _spawnvpe(mode, path, argvlist, envlist);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003674#endif
3675 Py_END_ALLOW_THREADS
3676
3677 if (spawnval == -1)
3678 (void) posix_error();
3679 else
3680 res = Py_BuildValue("l", (long) spawnval);
3681
3682 fail_2:
3683 while (--envc >= 0)
3684 PyMem_DEL(envlist[envc]);
3685 PyMem_DEL(envlist);
3686 fail_1:
3687 free_string_array(argvlist, lastarg);
3688 Py_XDECREF(vals);
3689 Py_XDECREF(keys);
3690 fail_0:
Martin v. Löwis011e8422009-05-05 04:43:17 +00003691 release_bytes(opath);
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00003692 return res;
3693}
3694#endif /* PYOS_OS2 */
Guido van Rossuma1065681999-01-25 23:20:23 +00003695#endif /* HAVE_SPAWNV */
3696
3697
Guido van Rossum2242f2f2001-04-11 20:58:20 +00003698#ifdef HAVE_FORK1
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003699PyDoc_STRVAR(posix_fork1__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003700"fork1() -> pid\n\n\
Guido van Rossum2242f2f2001-04-11 20:58:20 +00003701Fork a child process with a single multiplexed (i.e., not bound) thread.\n\
3702\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003703Return 0 to child process and PID of child to parent process.");
Guido van Rossum2242f2f2001-04-11 20:58:20 +00003704
3705static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003706posix_fork1(PyObject *self, PyObject *noargs)
Guido van Rossum2242f2f2001-04-11 20:58:20 +00003707{
Benjamin Peterson0df35a92009-10-04 20:32:25 +00003708 pid_t pid;
Gregory P. Smith24cec9f2010-03-01 06:18:41 +00003709 int result = 0;
Benjamin Peterson0df35a92009-10-04 20:32:25 +00003710 _PyImport_AcquireLock();
3711 pid = fork1();
Gregory P. Smith24cec9f2010-03-01 06:18:41 +00003712 if (pid == 0) {
3713 /* child: this clobbers and resets the import lock. */
3714 PyOS_AfterFork();
3715 } else {
3716 /* parent: release the import lock. */
3717 result = _PyImport_ReleaseLock();
3718 }
Guido van Rossum2242f2f2001-04-11 20:58:20 +00003719 if (pid == -1)
3720 return posix_error();
Benjamin Peterson0df35a92009-10-04 20:32:25 +00003721 if (result < 0) {
3722 /* Don't clobber the OSError if the fork failed. */
3723 PyErr_SetString(PyExc_RuntimeError,
3724 "not holding the import lock");
3725 return NULL;
3726 }
Antoine Pitrouc3ee1662009-05-23 16:02:33 +00003727 return PyLong_FromPid(pid);
Guido van Rossum2242f2f2001-04-11 20:58:20 +00003728}
3729#endif
3730
3731
Guido van Rossumad0ee831995-03-01 10:34:45 +00003732#ifdef HAVE_FORK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003733PyDoc_STRVAR(posix_fork__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003734"fork() -> pid\n\n\
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003735Fork a child process.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003736Return 0 to child process and PID of child to parent process.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003737
Barry Warsaw53699e91996-12-10 23:23:01 +00003738static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003739posix_fork(PyObject *self, PyObject *noargs)
Guido van Rossum85e3b011991-06-03 12:42:10 +00003740{
Benjamin Peterson0df35a92009-10-04 20:32:25 +00003741 pid_t pid;
Gregory P. Smith24cec9f2010-03-01 06:18:41 +00003742 int result = 0;
Benjamin Peterson0df35a92009-10-04 20:32:25 +00003743 _PyImport_AcquireLock();
3744 pid = fork();
Gregory P. Smith24cec9f2010-03-01 06:18:41 +00003745 if (pid == 0) {
3746 /* child: this clobbers and resets the import lock. */
3747 PyOS_AfterFork();
3748 } else {
3749 /* parent: release the import lock. */
3750 result = _PyImport_ReleaseLock();
3751 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00003752 if (pid == -1)
3753 return posix_error();
Benjamin Peterson0df35a92009-10-04 20:32:25 +00003754 if (result < 0) {
3755 /* Don't clobber the OSError if the fork failed. */
3756 PyErr_SetString(PyExc_RuntimeError,
3757 "not holding the import lock");
3758 return NULL;
3759 }
Antoine Pitrouc3ee1662009-05-23 16:02:33 +00003760 return PyLong_FromPid(pid);
Guido van Rossum85e3b011991-06-03 12:42:10 +00003761}
Guido van Rossumad0ee831995-03-01 10:34:45 +00003762#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00003763
Neal Norwitzb59798b2003-03-21 01:43:31 +00003764/* AIX uses /dev/ptc but is otherwise the same as /dev/ptmx */
Neal Norwitz2deaddb2003-03-21 03:08:31 +00003765/* IRIX has both /dev/ptc and /dev/ptmx, use ptmx */
3766#if defined(HAVE_DEV_PTC) && !defined(HAVE_DEV_PTMX)
Neal Norwitzb59798b2003-03-21 01:43:31 +00003767#define DEV_PTY_FILE "/dev/ptc"
3768#define HAVE_DEV_PTMX
3769#else
3770#define DEV_PTY_FILE "/dev/ptmx"
3771#endif
3772
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003773#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX)
Fred Drake8cef4cf2000-06-28 16:40:38 +00003774#ifdef HAVE_PTY_H
3775#include <pty.h>
3776#else
3777#ifdef HAVE_LIBUTIL_H
3778#include <libutil.h>
Ronald Oussoren755740f2010-02-07 19:56:39 +00003779#else
3780#ifdef HAVE_UTIL_H
3781#include <util.h>
3782#endif /* HAVE_UTIL_H */
Fred Drake8cef4cf2000-06-28 16:40:38 +00003783#endif /* HAVE_LIBUTIL_H */
3784#endif /* HAVE_PTY_H */
Martin v. Löwis14e73b12003-01-01 09:51:12 +00003785#ifdef HAVE_STROPTS_H
3786#include <stropts.h>
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003787#endif
3788#endif /* defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY) || defined(HAVE_DEV_PTMX */
Fred Drake8cef4cf2000-06-28 16:40:38 +00003789
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003790#if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX)
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003791PyDoc_STRVAR(posix_openpty__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003792"openpty() -> (master_fd, slave_fd)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003793Open a pseudo-terminal, returning open fd's for both master and slave end.\n");
Fred Drake8cef4cf2000-06-28 16:40:38 +00003794
3795static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003796posix_openpty(PyObject *self, PyObject *noargs)
Fred Drake8cef4cf2000-06-28 16:40:38 +00003797{
3798 int master_fd, slave_fd;
Thomas Wouters70c21a12000-07-14 14:28:33 +00003799#ifndef HAVE_OPENPTY
3800 char * slave_name;
Thomas Wouters70c21a12000-07-14 14:28:33 +00003801#endif
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003802#if defined(HAVE_DEV_PTMX) && !defined(HAVE_OPENPTY) && !defined(HAVE__GETPTY)
Martin v. Löwisc8b2e772002-12-31 14:30:26 +00003803 PyOS_sighandler_t sig_saved;
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003804#ifdef sun
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00003805 extern char *ptsname(int fildes);
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003806#endif
3807#endif
Thomas Wouters70c21a12000-07-14 14:28:33 +00003808
Thomas Wouters70c21a12000-07-14 14:28:33 +00003809#ifdef HAVE_OPENPTY
Fred Drake8cef4cf2000-06-28 16:40:38 +00003810 if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) != 0)
3811 return posix_error();
Neal Norwitzb59798b2003-03-21 01:43:31 +00003812#elif defined(HAVE__GETPTY)
Thomas Wouters70c21a12000-07-14 14:28:33 +00003813 slave_name = _getpty(&master_fd, O_RDWR, 0666, 0);
3814 if (slave_name == NULL)
3815 return posix_error();
3816
3817 slave_fd = open(slave_name, O_RDWR);
3818 if (slave_fd < 0)
3819 return posix_error();
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003820#else
Neal Norwitzb59798b2003-03-21 01:43:31 +00003821 master_fd = open(DEV_PTY_FILE, O_RDWR | O_NOCTTY); /* open master */
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003822 if (master_fd < 0)
3823 return posix_error();
Anthony Baxter9ceaa722004-10-13 14:48:50 +00003824 sig_saved = PyOS_setsig(SIGCHLD, SIG_DFL);
Martin v. Löwisc8b2e772002-12-31 14:30:26 +00003825 /* change permission of slave */
3826 if (grantpt(master_fd) < 0) {
Anthony Baxter9ceaa722004-10-13 14:48:50 +00003827 PyOS_setsig(SIGCHLD, sig_saved);
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003828 return posix_error();
Martin v. Löwisc8b2e772002-12-31 14:30:26 +00003829 }
3830 /* unlock slave */
3831 if (unlockpt(master_fd) < 0) {
Anthony Baxter9ceaa722004-10-13 14:48:50 +00003832 PyOS_setsig(SIGCHLD, sig_saved);
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003833 return posix_error();
Martin v. Löwisc8b2e772002-12-31 14:30:26 +00003834 }
Anthony Baxter9ceaa722004-10-13 14:48:50 +00003835 PyOS_setsig(SIGCHLD, sig_saved);
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003836 slave_name = ptsname(master_fd); /* get name of slave */
3837 if (slave_name == NULL)
3838 return posix_error();
3839 slave_fd = open(slave_name, O_RDWR | O_NOCTTY); /* open slave */
3840 if (slave_fd < 0)
3841 return posix_error();
Neal Norwitzb59798b2003-03-21 01:43:31 +00003842#if !defined(__CYGWIN__) && !defined(HAVE_DEV_PTC)
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003843 ioctl(slave_fd, I_PUSH, "ptem"); /* push ptem */
3844 ioctl(slave_fd, I_PUSH, "ldterm"); /* push ldterm */
Neal Norwitz6700e472002-12-31 16:16:07 +00003845#ifndef __hpux
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003846 ioctl(slave_fd, I_PUSH, "ttcompat"); /* push ttcompat */
Neal Norwitz6700e472002-12-31 16:16:07 +00003847#endif /* __hpux */
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003848#endif /* HAVE_CYGWIN */
Thomas Wouters1e0c2f42000-07-24 16:06:23 +00003849#endif /* HAVE_OPENPTY */
Thomas Wouters70c21a12000-07-14 14:28:33 +00003850
Fred Drake8cef4cf2000-06-28 16:40:38 +00003851 return Py_BuildValue("(ii)", master_fd, slave_fd);
Thomas Wouters70c21a12000-07-14 14:28:33 +00003852
Fred Drake8cef4cf2000-06-28 16:40:38 +00003853}
Martin v. Löwis24a880b2002-12-31 12:55:15 +00003854#endif /* defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX) */
Fred Drake8cef4cf2000-06-28 16:40:38 +00003855
3856#ifdef HAVE_FORKPTY
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003857PyDoc_STRVAR(posix_forkpty__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003858"forkpty() -> (pid, master_fd)\n\n\
Fred Drake8cef4cf2000-06-28 16:40:38 +00003859Fork a new process with a new pseudo-terminal as controlling tty.\n\n\
3860Like fork(), return 0 as pid to child process, and PID of child to parent.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003861To both, return fd of newly opened pseudo-terminal.\n");
Fred Drake8cef4cf2000-06-28 16:40:38 +00003862
3863static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003864posix_forkpty(PyObject *self, PyObject *noargs)
Fred Drake8cef4cf2000-06-28 16:40:38 +00003865{
Gregory P. Smith2a1c0272010-03-01 17:04:45 +00003866 int master_fd = -1, result = 0;
Christian Heimes400adb02008-02-01 08:12:03 +00003867 pid_t pid;
Tim Peters5aa91602002-01-30 05:46:57 +00003868
Benjamin Peterson0df35a92009-10-04 20:32:25 +00003869 _PyImport_AcquireLock();
Fred Drake8cef4cf2000-06-28 16:40:38 +00003870 pid = forkpty(&master_fd, NULL, NULL, NULL);
Gregory P. Smith2a1c0272010-03-01 17:04:45 +00003871 if (pid == 0) {
3872 /* child: this clobbers and resets the import lock. */
Gregory P. Smith24cec9f2010-03-01 06:18:41 +00003873 PyOS_AfterFork();
Gregory P. Smith2a1c0272010-03-01 17:04:45 +00003874 } else {
3875 /* parent: release the import lock. */
3876 result = _PyImport_ReleaseLock();
3877 }
Fred Drake8cef4cf2000-06-28 16:40:38 +00003878 if (pid == -1)
3879 return posix_error();
Benjamin Peterson0df35a92009-10-04 20:32:25 +00003880 if (result < 0) {
3881 /* Don't clobber the OSError if the fork failed. */
3882 PyErr_SetString(PyExc_RuntimeError,
3883 "not holding the import lock");
3884 return NULL;
3885 }
Antoine Pitrouc3ee1662009-05-23 16:02:33 +00003886 return Py_BuildValue("(Ni)", PyLong_FromPid(pid), master_fd);
Fred Drake8cef4cf2000-06-28 16:40:38 +00003887}
3888#endif
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003889
Guido van Rossumad0ee831995-03-01 10:34:45 +00003890#ifdef HAVE_GETEGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003891PyDoc_STRVAR(posix_getegid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003892"getegid() -> egid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003893Return the current process's effective group id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003894
Barry Warsaw53699e91996-12-10 23:23:01 +00003895static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003896posix_getegid(PyObject *self, PyObject *noargs)
Guido van Rossum46003ff1992-05-15 11:05:24 +00003897{
Christian Heimes217cfd12007-12-02 14:31:20 +00003898 return PyLong_FromLong((long)getegid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00003899}
Guido van Rossumad0ee831995-03-01 10:34:45 +00003900#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00003901
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003902
Guido van Rossumad0ee831995-03-01 10:34:45 +00003903#ifdef HAVE_GETEUID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003904PyDoc_STRVAR(posix_geteuid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003905"geteuid() -> euid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003906Return the current process's effective user id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003907
Barry Warsaw53699e91996-12-10 23:23:01 +00003908static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003909posix_geteuid(PyObject *self, PyObject *noargs)
Guido van Rossum46003ff1992-05-15 11:05:24 +00003910{
Christian Heimes217cfd12007-12-02 14:31:20 +00003911 return PyLong_FromLong((long)geteuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00003912}
Guido van Rossumad0ee831995-03-01 10:34:45 +00003913#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00003914
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003915
Guido van Rossumad0ee831995-03-01 10:34:45 +00003916#ifdef HAVE_GETGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003917PyDoc_STRVAR(posix_getgid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003918"getgid() -> gid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003919Return the current process's group id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003920
Barry Warsaw53699e91996-12-10 23:23:01 +00003921static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003922posix_getgid(PyObject *self, PyObject *noargs)
Guido van Rossum46003ff1992-05-15 11:05:24 +00003923{
Christian Heimes217cfd12007-12-02 14:31:20 +00003924 return PyLong_FromLong((long)getgid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00003925}
Guido van Rossumad0ee831995-03-01 10:34:45 +00003926#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00003927
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003928
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003929PyDoc_STRVAR(posix_getpid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003930"getpid() -> pid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003931Return the current process id");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003932
Barry Warsaw53699e91996-12-10 23:23:01 +00003933static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003934posix_getpid(PyObject *self, PyObject *noargs)
Guido van Rossum85e3b011991-06-03 12:42:10 +00003935{
Antoine Pitrou971e51b2009-05-23 16:14:27 +00003936 return PyLong_FromPid(getpid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00003937}
3938
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003939
Fred Drakec9680921999-12-13 16:37:25 +00003940#ifdef HAVE_GETGROUPS
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003941PyDoc_STRVAR(posix_getgroups__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00003942"getgroups() -> list of group IDs\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00003943Return list of supplemental group IDs for the process.");
Fred Drakec9680921999-12-13 16:37:25 +00003944
3945static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00003946posix_getgroups(PyObject *self, PyObject *noargs)
Fred Drakec9680921999-12-13 16:37:25 +00003947{
3948 PyObject *result = NULL;
3949
Fred Drakec9680921999-12-13 16:37:25 +00003950#ifdef NGROUPS_MAX
3951#define MAX_GROUPS NGROUPS_MAX
3952#else
3953 /* defined to be 16 on Solaris7, so this should be a small number */
3954#define MAX_GROUPS 64
3955#endif
3956 gid_t grouplist[MAX_GROUPS];
3957 int n;
3958
3959 n = getgroups(MAX_GROUPS, grouplist);
3960 if (n < 0)
3961 posix_error();
3962 else {
3963 result = PyList_New(n);
3964 if (result != NULL) {
Fred Drakec9680921999-12-13 16:37:25 +00003965 int i;
3966 for (i = 0; i < n; ++i) {
Christian Heimes217cfd12007-12-02 14:31:20 +00003967 PyObject *o = PyLong_FromLong((long)grouplist[i]);
Fred Drakec9680921999-12-13 16:37:25 +00003968 if (o == NULL) {
3969 Py_DECREF(result);
3970 result = NULL;
3971 break;
3972 }
3973 PyList_SET_ITEM(result, i, o);
3974 }
3975 }
3976 }
Neal Norwitze241ce82003-02-17 18:17:05 +00003977
Fred Drakec9680921999-12-13 16:37:25 +00003978 return result;
3979}
3980#endif
3981
Antoine Pitroub7572f02009-12-02 20:46:48 +00003982#ifdef HAVE_INITGROUPS
3983PyDoc_STRVAR(posix_initgroups__doc__,
3984"initgroups(username, gid) -> None\n\n\
3985Call the system initgroups() to initialize the group access list with all of\n\
3986the groups of which the specified username is a member, plus the specified\n\
3987group id.");
3988
3989static PyObject *
3990posix_initgroups(PyObject *self, PyObject *args)
3991{
3992 char *username;
3993 long gid;
3994
3995 if (!PyArg_ParseTuple(args, "sl:initgroups", &username, &gid))
3996 return NULL;
3997
3998 if (initgroups(username, (gid_t) gid) == -1)
3999 return PyErr_SetFromErrno(PyExc_OSError);
4000
4001 Py_INCREF(Py_None);
4002 return Py_None;
4003}
4004#endif
4005
Martin v. Löwis606edc12002-06-13 21:09:11 +00004006#ifdef HAVE_GETPGID
Neal Norwitz0c2c17c2002-06-13 21:22:11 +00004007PyDoc_STRVAR(posix_getpgid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004008"getpgid(pid) -> pgid\n\n\
Neal Norwitz0c2c17c2002-06-13 21:22:11 +00004009Call the system call getpgid().");
Martin v. Löwis606edc12002-06-13 21:09:11 +00004010
4011static PyObject *
4012posix_getpgid(PyObject *self, PyObject *args)
4013{
Antoine Pitrou971e51b2009-05-23 16:14:27 +00004014 pid_t pid, pgid;
Gregory P. Smith84508572010-03-14 18:56:11 +00004015 if (!PyArg_ParseTuple(args, _Py_PARSE_PID ":getpgid", &pid))
Martin v. Löwis606edc12002-06-13 21:09:11 +00004016 return NULL;
4017 pgid = getpgid(pid);
4018 if (pgid < 0)
4019 return posix_error();
Antoine Pitrou971e51b2009-05-23 16:14:27 +00004020 return PyLong_FromPid(pgid);
Martin v. Löwis606edc12002-06-13 21:09:11 +00004021}
4022#endif /* HAVE_GETPGID */
4023
4024
Guido van Rossumb6775db1994-08-01 11:34:53 +00004025#ifdef HAVE_GETPGRP
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004026PyDoc_STRVAR(posix_getpgrp__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004027"getpgrp() -> pgrp\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004028Return the current process group id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004029
Barry Warsaw53699e91996-12-10 23:23:01 +00004030static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004031posix_getpgrp(PyObject *self, PyObject *noargs)
Guido van Rossum04814471991-06-04 20:23:49 +00004032{
Guido van Rossumb6775db1994-08-01 11:34:53 +00004033#ifdef GETPGRP_HAVE_ARG
Antoine Pitrou971e51b2009-05-23 16:14:27 +00004034 return PyLong_FromPid(getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004035#else /* GETPGRP_HAVE_ARG */
Antoine Pitrou971e51b2009-05-23 16:14:27 +00004036 return PyLong_FromPid(getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004037#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00004038}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004039#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00004040
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004041
Guido van Rossumb6775db1994-08-01 11:34:53 +00004042#ifdef HAVE_SETPGRP
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004043PyDoc_STRVAR(posix_setpgrp__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004044"setpgrp()\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004045Make this process a session leader.");
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_setpgrp(PyObject *self, PyObject *noargs)
Guido van Rossumc2670a01992-09-13 20:07:29 +00004049{
Guido van Rossum64933891994-10-20 21:56:42 +00004050#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00004051 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00004052#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004053 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00004054#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00004055 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004056 Py_INCREF(Py_None);
4057 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00004058}
4059
Guido van Rossumb6775db1994-08-01 11:34:53 +00004060#endif /* HAVE_SETPGRP */
4061
Guido van Rossumad0ee831995-03-01 10:34:45 +00004062#ifdef HAVE_GETPPID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004063PyDoc_STRVAR(posix_getppid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004064"getppid() -> ppid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004065Return the parent's process id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004066
Barry Warsaw53699e91996-12-10 23:23:01 +00004067static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004068posix_getppid(PyObject *self, PyObject *noargs)
Guido van Rossum85e3b011991-06-03 12:42:10 +00004069{
Antoine Pitrou971e51b2009-05-23 16:14:27 +00004070 return PyLong_FromPid(getppid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00004071}
Guido van Rossumad0ee831995-03-01 10:34:45 +00004072#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00004073
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004074
Fred Drake12c6e2d1999-12-14 21:25:03 +00004075#ifdef HAVE_GETLOGIN
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004076PyDoc_STRVAR(posix_getlogin__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004077"getlogin() -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004078Return the actual login name.");
Fred Drake12c6e2d1999-12-14 21:25:03 +00004079
4080static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004081posix_getlogin(PyObject *self, PyObject *noargs)
Fred Drake12c6e2d1999-12-14 21:25:03 +00004082{
Neal Norwitze241ce82003-02-17 18:17:05 +00004083 PyObject *result = NULL;
Fred Drakea30680b2000-12-06 21:24:28 +00004084 char *name;
4085 int old_errno = errno;
Fred Drake12c6e2d1999-12-14 21:25:03 +00004086
Fred Drakea30680b2000-12-06 21:24:28 +00004087 errno = 0;
4088 name = getlogin();
4089 if (name == NULL) {
4090 if (errno)
4091 posix_error();
4092 else
4093 PyErr_SetString(PyExc_OSError,
Fred Drakee63544f2000-12-06 21:45:33 +00004094 "unable to determine login name");
Fred Drakea30680b2000-12-06 21:24:28 +00004095 }
Fred Drake12c6e2d1999-12-14 21:25:03 +00004096 else
Neal Norwitz93c56822007-08-26 07:10:06 +00004097 result = PyUnicode_FromString(name);
Fred Drakea30680b2000-12-06 21:24:28 +00004098 errno = old_errno;
Neal Norwitze241ce82003-02-17 18:17:05 +00004099
Fred Drake12c6e2d1999-12-14 21:25:03 +00004100 return result;
4101}
4102#endif
4103
Guido van Rossumad0ee831995-03-01 10:34:45 +00004104#ifdef HAVE_GETUID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004105PyDoc_STRVAR(posix_getuid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004106"getuid() -> uid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004107Return the current process's user id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004108
Barry Warsaw53699e91996-12-10 23:23:01 +00004109static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004110posix_getuid(PyObject *self, PyObject *noargs)
Guido van Rossum46003ff1992-05-15 11:05:24 +00004111{
Christian Heimes217cfd12007-12-02 14:31:20 +00004112 return PyLong_FromLong((long)getuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00004113}
Guido van Rossumad0ee831995-03-01 10:34:45 +00004114#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00004115
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004116
Guido van Rossumad0ee831995-03-01 10:34:45 +00004117#ifdef HAVE_KILL
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004118PyDoc_STRVAR(posix_kill__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004119"kill(pid, sig)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004120Kill a process with a signal.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004121
Barry Warsaw53699e91996-12-10 23:23:01 +00004122static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004123posix_kill(PyObject *self, PyObject *args)
Guido van Rossum85e3b011991-06-03 12:42:10 +00004124{
Christian Heimes292d3512008-02-03 16:51:08 +00004125 pid_t pid;
4126 int sig;
Gregory P. Smith84508572010-03-14 18:56:11 +00004127 if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:kill", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00004128 return NULL;
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00004129#if defined(PYOS_OS2) && !defined(PYCC_GCC)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004130 if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
4131 APIRET rc;
4132 if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00004133 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004134
4135 } else if (sig == XCPT_SIGNAL_KILLPROC) {
4136 APIRET rc;
4137 if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00004138 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004139
4140 } else
Guido van Rossumc5a0f531997-12-02 20:36:02 +00004141 return NULL; /* Unrecognized Signal Requested */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004142#else
Guido van Rossum85e3b011991-06-03 12:42:10 +00004143 if (kill(pid, sig) == -1)
4144 return posix_error();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004145#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00004146 Py_INCREF(Py_None);
4147 return Py_None;
Guido van Rossum85e3b011991-06-03 12:42:10 +00004148}
Guido van Rossumad0ee831995-03-01 10:34:45 +00004149#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00004150
Martin v. Löwisb2c92f42002-02-16 23:35:41 +00004151#ifdef HAVE_KILLPG
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004152PyDoc_STRVAR(posix_killpg__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004153"killpg(pgid, sig)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004154Kill a process group with a signal.");
Martin v. Löwisb2c92f42002-02-16 23:35:41 +00004155
4156static PyObject *
4157posix_killpg(PyObject *self, PyObject *args)
4158{
Antoine Pitrou971e51b2009-05-23 16:14:27 +00004159 int sig;
4160 pid_t pgid;
4161 /* XXX some man pages make the `pgid` parameter an int, others
4162 a pid_t. Since getpgrp() returns a pid_t, we assume killpg should
4163 take the same type. Moreover, pid_t is always at least as wide as
4164 int (else compilation of this module fails), which is safe. */
Gregory P. Smith84508572010-03-14 18:56:11 +00004165 if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:killpg", &pgid, &sig))
Martin v. Löwisb2c92f42002-02-16 23:35:41 +00004166 return NULL;
4167 if (killpg(pgid, sig) == -1)
4168 return posix_error();
4169 Py_INCREF(Py_None);
4170 return Py_None;
4171}
4172#endif
4173
Brian Curtineb24d742010-04-12 17:16:38 +00004174#ifdef MS_WINDOWS
4175PyDoc_STRVAR(win32_kill__doc__,
4176"kill(pid, sig)\n\n\
4177Kill a process with a signal.");
4178
4179static PyObject *
4180win32_kill(PyObject *self, PyObject *args)
4181{
4182 PyObject *result, handle_obj;
4183 DWORD pid, sig, err;
4184 HANDLE handle;
4185
4186 if (!PyArg_ParseTuple(args, "kk:kill", &pid, &sig))
4187 return NULL;
4188
4189 /* Console processes which share a common console can be sent CTRL+C or
4190 CTRL+BREAK events, provided they handle said events. */
4191 if (sig == CTRL_C_EVENT || sig == CTRL_BREAK_EVENT) {
4192 if (GenerateConsoleCtrlEvent(sig, pid) == 0) {
4193 err = GetLastError();
4194 PyErr_SetFromWindowsErr(err);
4195 }
4196 else
4197 Py_RETURN_NONE;
4198 }
4199
4200 /* If the signal is outside of what GenerateConsoleCtrlEvent can use,
4201 attempt to open and terminate the process. */
4202 handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
4203 if (handle == NULL) {
4204 err = GetLastError();
4205 return PyErr_SetFromWindowsErr(err);
4206 }
4207
4208 if (TerminateProcess(handle, sig) == 0) {
4209 err = GetLastError();
4210 result = PyErr_SetFromWindowsErr(err);
4211 } else {
4212 Py_INCREF(Py_None);
4213 result = Py_None;
4214 }
4215
4216 CloseHandle(handle);
4217 return result;
4218}
4219#endif /* MS_WINDOWS */
4220
Guido van Rossumc0125471996-06-28 18:55:32 +00004221#ifdef HAVE_PLOCK
4222
4223#ifdef HAVE_SYS_LOCK_H
4224#include <sys/lock.h>
4225#endif
4226
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004227PyDoc_STRVAR(posix_plock__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004228"plock(op)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004229Lock program segments into memory.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004230
Barry Warsaw53699e91996-12-10 23:23:01 +00004231static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004232posix_plock(PyObject *self, PyObject *args)
Guido van Rossumc0125471996-06-28 18:55:32 +00004233{
4234 int op;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004235 if (!PyArg_ParseTuple(args, "i:plock", &op))
Guido van Rossumc0125471996-06-28 18:55:32 +00004236 return NULL;
4237 if (plock(op) == -1)
4238 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004239 Py_INCREF(Py_None);
4240 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00004241}
4242#endif
4243
Guido van Rossumb6775db1994-08-01 11:34:53 +00004244#ifdef HAVE_SETUID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004245PyDoc_STRVAR(posix_setuid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004246"setuid(uid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004247Set the current process's user id.");
4248
Barry Warsaw53699e91996-12-10 23:23:01 +00004249static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004250posix_setuid(PyObject *self, PyObject *args)
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004251{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004252 long uid_arg;
4253 uid_t uid;
4254 if (!PyArg_ParseTuple(args, "l:setuid", &uid_arg))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004255 return NULL;
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004256 uid = uid_arg;
4257 if (uid != uid_arg) {
4258 PyErr_SetString(PyExc_OverflowError, "user id too big");
4259 return NULL;
4260 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004261 if (setuid(uid) < 0)
4262 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004263 Py_INCREF(Py_None);
4264 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004265}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004266#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004267
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004268
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004269#ifdef HAVE_SETEUID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004270PyDoc_STRVAR(posix_seteuid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004271"seteuid(uid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004272Set the current process's effective user id.");
4273
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004274static PyObject *
4275posix_seteuid (PyObject *self, PyObject *args)
4276{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004277 long euid_arg;
4278 uid_t euid;
4279 if (!PyArg_ParseTuple(args, "l", &euid_arg))
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004280 return NULL;
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004281 euid = euid_arg;
4282 if (euid != euid_arg) {
4283 PyErr_SetString(PyExc_OverflowError, "user id too big");
4284 return NULL;
4285 }
4286 if (seteuid(euid) < 0) {
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004287 return posix_error();
4288 } else {
4289 Py_INCREF(Py_None);
4290 return Py_None;
4291 }
4292}
4293#endif /* HAVE_SETEUID */
4294
4295#ifdef HAVE_SETEGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004296PyDoc_STRVAR(posix_setegid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004297"setegid(gid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004298Set the current process's effective group id.");
4299
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004300static PyObject *
4301posix_setegid (PyObject *self, PyObject *args)
4302{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004303 long egid_arg;
4304 gid_t egid;
4305 if (!PyArg_ParseTuple(args, "l", &egid_arg))
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004306 return NULL;
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004307 egid = egid_arg;
4308 if (egid != egid_arg) {
4309 PyErr_SetString(PyExc_OverflowError, "group id too big");
4310 return NULL;
4311 }
4312 if (setegid(egid) < 0) {
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004313 return posix_error();
4314 } else {
4315 Py_INCREF(Py_None);
4316 return Py_None;
4317 }
4318}
4319#endif /* HAVE_SETEGID */
4320
4321#ifdef HAVE_SETREUID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004322PyDoc_STRVAR(posix_setreuid__doc__,
Neal Norwitz94f1d712004-02-16 01:26:34 +00004323"setreuid(ruid, euid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004324Set the current process's real and effective user ids.");
4325
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004326static PyObject *
4327posix_setreuid (PyObject *self, PyObject *args)
4328{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004329 long ruid_arg, euid_arg;
4330 uid_t ruid, euid;
4331 if (!PyArg_ParseTuple(args, "ll", &ruid_arg, &euid_arg))
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004332 return NULL;
Gregory P. Smithc78d79c2010-03-01 05:54:14 +00004333 if (ruid_arg == -1)
4334 ruid = (uid_t)-1; /* let the compiler choose how -1 fits */
4335 else
4336 ruid = ruid_arg; /* otherwise, assign from our long */
4337 if (euid_arg == -1)
4338 euid = (uid_t)-1;
4339 else
4340 euid = euid_arg;
4341 if ((euid_arg != -1 && euid != euid_arg) ||
4342 (ruid_arg != -1 && ruid != ruid_arg)) {
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004343 PyErr_SetString(PyExc_OverflowError, "user id too big");
4344 return NULL;
4345 }
4346 if (setreuid(ruid, euid) < 0) {
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004347 return posix_error();
4348 } else {
4349 Py_INCREF(Py_None);
4350 return Py_None;
4351 }
4352}
4353#endif /* HAVE_SETREUID */
4354
4355#ifdef HAVE_SETREGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004356PyDoc_STRVAR(posix_setregid__doc__,
Neal Norwitz94f1d712004-02-16 01:26:34 +00004357"setregid(rgid, egid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004358Set the current process's real and effective group ids.");
4359
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004360static PyObject *
4361posix_setregid (PyObject *self, PyObject *args)
4362{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004363 long rgid_arg, egid_arg;
4364 gid_t rgid, egid;
4365 if (!PyArg_ParseTuple(args, "ll", &rgid_arg, &egid_arg))
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004366 return NULL;
Gregory P. Smithc78d79c2010-03-01 05:54:14 +00004367 if (rgid_arg == -1)
4368 rgid = (gid_t)-1; /* let the compiler choose how -1 fits */
4369 else
4370 rgid = rgid_arg; /* otherwise, assign from our long */
4371 if (egid_arg == -1)
4372 egid = (gid_t)-1;
4373 else
4374 egid = egid_arg;
4375 if ((egid_arg != -1 && egid != egid_arg) ||
4376 (rgid_arg != -1 && rgid != rgid_arg)) {
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004377 PyErr_SetString(PyExc_OverflowError, "group id too big");
4378 return NULL;
4379 }
4380 if (setregid(rgid, egid) < 0) {
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004381 return posix_error();
4382 } else {
4383 Py_INCREF(Py_None);
4384 return Py_None;
4385 }
4386}
4387#endif /* HAVE_SETREGID */
4388
Guido van Rossumb6775db1994-08-01 11:34:53 +00004389#ifdef HAVE_SETGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004390PyDoc_STRVAR(posix_setgid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004391"setgid(gid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004392Set the current process's group id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004393
Barry Warsaw53699e91996-12-10 23:23:01 +00004394static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004395posix_setgid(PyObject *self, PyObject *args)
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004396{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004397 long gid_arg;
4398 gid_t gid;
4399 if (!PyArg_ParseTuple(args, "l:setgid", &gid_arg))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004400 return NULL;
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004401 gid = gid_arg;
4402 if (gid != gid_arg) {
4403 PyErr_SetString(PyExc_OverflowError, "group id too big");
4404 return NULL;
4405 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004406 if (setgid(gid) < 0)
4407 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004408 Py_INCREF(Py_None);
4409 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004410}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004411#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004412
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004413#ifdef HAVE_SETGROUPS
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004414PyDoc_STRVAR(posix_setgroups__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004415"setgroups(list)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004416Set the groups of the current process to list.");
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004417
4418static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004419posix_setgroups(PyObject *self, PyObject *groups)
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004420{
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004421 int i, len;
4422 gid_t grouplist[MAX_GROUPS];
Tim Peters5aa91602002-01-30 05:46:57 +00004423
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004424 if (!PySequence_Check(groups)) {
4425 PyErr_SetString(PyExc_TypeError, "setgroups argument must be a sequence");
4426 return NULL;
4427 }
4428 len = PySequence_Size(groups);
4429 if (len > MAX_GROUPS) {
4430 PyErr_SetString(PyExc_ValueError, "too many groups");
4431 return NULL;
4432 }
4433 for(i = 0; i < len; i++) {
4434 PyObject *elem;
4435 elem = PySequence_GetItem(groups, i);
4436 if (!elem)
4437 return NULL;
Guido van Rossumddefaf32007-01-14 03:31:43 +00004438 if (!PyLong_Check(elem)) {
4439 PyErr_SetString(PyExc_TypeError,
4440 "groups must be integers");
4441 Py_DECREF(elem);
4442 return NULL;
4443 } else {
4444 unsigned long x = PyLong_AsUnsignedLong(elem);
4445 if (PyErr_Occurred()) {
4446 PyErr_SetString(PyExc_TypeError,
4447 "group id too big");
Georg Brandla13c2442005-11-22 19:30:31 +00004448 Py_DECREF(elem);
4449 return NULL;
Georg Brandla13c2442005-11-22 19:30:31 +00004450 }
Georg Brandla13c2442005-11-22 19:30:31 +00004451 grouplist[i] = x;
Guido van Rossumddefaf32007-01-14 03:31:43 +00004452 /* read back the value to see if it fitted in gid_t */
Georg Brandla13c2442005-11-22 19:30:31 +00004453 if (grouplist[i] != x) {
4454 PyErr_SetString(PyExc_TypeError,
4455 "group id too big");
4456 Py_DECREF(elem);
4457 return NULL;
4458 }
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004459 }
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004460 Py_DECREF(elem);
4461 }
4462
4463 if (setgroups(len, grouplist) < 0)
4464 return posix_error();
4465 Py_INCREF(Py_None);
4466 return Py_None;
4467}
4468#endif /* HAVE_SETGROUPS */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004469
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004470#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4)
4471static PyObject *
Christian Heimes292d3512008-02-03 16:51:08 +00004472wait_helper(pid_t pid, int status, struct rusage *ru)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004473{
4474 PyObject *result;
4475 static PyObject *struct_rusage;
4476
4477 if (pid == -1)
4478 return posix_error();
4479
4480 if (struct_rusage == NULL) {
Christian Heimes072c0f12008-01-03 23:01:04 +00004481 PyObject *m = PyImport_ImportModuleNoBlock("resource");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004482 if (m == NULL)
4483 return NULL;
4484 struct_rusage = PyObject_GetAttrString(m, "struct_rusage");
4485 Py_DECREF(m);
4486 if (struct_rusage == NULL)
4487 return NULL;
4488 }
4489
4490 /* XXX(nnorwitz): Copied (w/mods) from resource.c, there should be only one. */
4491 result = PyStructSequence_New((PyTypeObject*) struct_rusage);
4492 if (!result)
4493 return NULL;
4494
4495#ifndef doubletime
4496#define doubletime(TV) ((double)(TV).tv_sec + (TV).tv_usec * 0.000001)
4497#endif
4498
4499 PyStructSequence_SET_ITEM(result, 0,
4500 PyFloat_FromDouble(doubletime(ru->ru_utime)));
4501 PyStructSequence_SET_ITEM(result, 1,
4502 PyFloat_FromDouble(doubletime(ru->ru_stime)));
4503#define SET_INT(result, index, value)\
Christian Heimes217cfd12007-12-02 14:31:20 +00004504 PyStructSequence_SET_ITEM(result, index, PyLong_FromLong(value))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004505 SET_INT(result, 2, ru->ru_maxrss);
4506 SET_INT(result, 3, ru->ru_ixrss);
4507 SET_INT(result, 4, ru->ru_idrss);
4508 SET_INT(result, 5, ru->ru_isrss);
4509 SET_INT(result, 6, ru->ru_minflt);
4510 SET_INT(result, 7, ru->ru_majflt);
4511 SET_INT(result, 8, ru->ru_nswap);
4512 SET_INT(result, 9, ru->ru_inblock);
4513 SET_INT(result, 10, ru->ru_oublock);
4514 SET_INT(result, 11, ru->ru_msgsnd);
4515 SET_INT(result, 12, ru->ru_msgrcv);
4516 SET_INT(result, 13, ru->ru_nsignals);
4517 SET_INT(result, 14, ru->ru_nvcsw);
4518 SET_INT(result, 15, ru->ru_nivcsw);
4519#undef SET_INT
4520
4521 if (PyErr_Occurred()) {
4522 Py_DECREF(result);
4523 return NULL;
4524 }
4525
Antoine Pitrouc3ee1662009-05-23 16:02:33 +00004526 return Py_BuildValue("NiN", PyLong_FromPid(pid), status, result);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004527}
4528#endif /* HAVE_WAIT3 || HAVE_WAIT4 */
4529
4530#ifdef HAVE_WAIT3
4531PyDoc_STRVAR(posix_wait3__doc__,
4532"wait3(options) -> (pid, status, rusage)\n\n\
4533Wait for completion of a child process.");
4534
4535static PyObject *
4536posix_wait3(PyObject *self, PyObject *args)
4537{
Christian Heimes292d3512008-02-03 16:51:08 +00004538 pid_t pid;
4539 int options;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004540 struct rusage ru;
4541 WAIT_TYPE status;
4542 WAIT_STATUS_INT(status) = 0;
4543
4544 if (!PyArg_ParseTuple(args, "i:wait3", &options))
4545 return NULL;
4546
4547 Py_BEGIN_ALLOW_THREADS
4548 pid = wait3(&status, options, &ru);
4549 Py_END_ALLOW_THREADS
4550
4551 return wait_helper(pid, WAIT_STATUS_INT(status), &ru);
4552}
4553#endif /* HAVE_WAIT3 */
4554
4555#ifdef HAVE_WAIT4
4556PyDoc_STRVAR(posix_wait4__doc__,
4557"wait4(pid, options) -> (pid, status, rusage)\n\n\
4558Wait for completion of a given child process.");
4559
4560static PyObject *
4561posix_wait4(PyObject *self, PyObject *args)
4562{
Christian Heimes292d3512008-02-03 16:51:08 +00004563 pid_t pid;
4564 int options;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004565 struct rusage ru;
4566 WAIT_TYPE status;
4567 WAIT_STATUS_INT(status) = 0;
4568
Gregory P. Smith84508572010-03-14 18:56:11 +00004569 if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:wait4", &pid, &options))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004570 return NULL;
4571
4572 Py_BEGIN_ALLOW_THREADS
4573 pid = wait4(pid, &status, options, &ru);
4574 Py_END_ALLOW_THREADS
4575
4576 return wait_helper(pid, WAIT_STATUS_INT(status), &ru);
4577}
4578#endif /* HAVE_WAIT4 */
4579
Guido van Rossumb6775db1994-08-01 11:34:53 +00004580#ifdef HAVE_WAITPID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004581PyDoc_STRVAR(posix_waitpid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004582"waitpid(pid, options) -> (pid, status)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004583Wait for completion of a given child process.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004584
Barry Warsaw53699e91996-12-10 23:23:01 +00004585static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004586posix_waitpid(PyObject *self, PyObject *args)
Guido van Rossum85e3b011991-06-03 12:42:10 +00004587{
Christian Heimes292d3512008-02-03 16:51:08 +00004588 pid_t pid;
4589 int options;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004590 WAIT_TYPE status;
4591 WAIT_STATUS_INT(status) = 0;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00004592
Gregory P. Smith84508572010-03-14 18:56:11 +00004593 if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:waitpid", &pid, &options))
Guido van Rossum21803b81992-08-09 12:55:27 +00004594 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00004595 Py_BEGIN_ALLOW_THREADS
Guido van Rossume6a3aa61999-02-01 16:15:30 +00004596 pid = waitpid(pid, &status, options);
Barry Warsaw53699e91996-12-10 23:23:01 +00004597 Py_END_ALLOW_THREADS
Guido van Rossum85e3b011991-06-03 12:42:10 +00004598 if (pid == -1)
4599 return posix_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004600
Antoine Pitrouc3ee1662009-05-23 16:02:33 +00004601 return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status));
Guido van Rossum21803b81992-08-09 12:55:27 +00004602}
4603
Tim Petersab034fa2002-02-01 11:27:43 +00004604#elif defined(HAVE_CWAIT)
4605
4606/* MS C has a variant of waitpid() that's usable for most purposes. */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004607PyDoc_STRVAR(posix_waitpid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004608"waitpid(pid, options) -> (pid, status << 8)\n\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004609"Wait for completion of a given process. options is ignored on Windows.");
Tim Petersab034fa2002-02-01 11:27:43 +00004610
4611static PyObject *
4612posix_waitpid(PyObject *self, PyObject *args)
4613{
Thomas Wouters477c8d52006-05-27 19:21:47 +00004614 Py_intptr_t pid;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004615 int status, options;
Tim Petersab034fa2002-02-01 11:27:43 +00004616
Gregory P. Smith84508572010-03-14 18:56:11 +00004617 if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:waitpid", &pid, &options))
Tim Petersab034fa2002-02-01 11:27:43 +00004618 return NULL;
4619 Py_BEGIN_ALLOW_THREADS
4620 pid = _cwait(&status, pid, options);
4621 Py_END_ALLOW_THREADS
4622 if (pid == -1)
4623 return posix_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004624
4625 /* shift the status left a byte so this is more like the POSIX waitpid */
Antoine Pitrouc3ee1662009-05-23 16:02:33 +00004626 return Py_BuildValue("Ni", PyLong_FromPid(pid), status << 8);
Tim Petersab034fa2002-02-01 11:27:43 +00004627}
4628#endif /* HAVE_WAITPID || HAVE_CWAIT */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004629
Guido van Rossumad0ee831995-03-01 10:34:45 +00004630#ifdef HAVE_WAIT
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004631PyDoc_STRVAR(posix_wait__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004632"wait() -> (pid, status)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004633Wait for completion of a child process.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004634
Barry Warsaw53699e91996-12-10 23:23:01 +00004635static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004636posix_wait(PyObject *self, PyObject *noargs)
Guido van Rossum21803b81992-08-09 12:55:27 +00004637{
Christian Heimes292d3512008-02-03 16:51:08 +00004638 pid_t pid;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004639 WAIT_TYPE status;
4640 WAIT_STATUS_INT(status) = 0;
Neal Norwitze241ce82003-02-17 18:17:05 +00004641
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00004642 Py_BEGIN_ALLOW_THREADS
4643 pid = wait(&status);
Barry Warsaw53699e91996-12-10 23:23:01 +00004644 Py_END_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00004645 if (pid == -1)
4646 return posix_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004647
Antoine Pitrouc3ee1662009-05-23 16:02:33 +00004648 return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status));
Guido van Rossum85e3b011991-06-03 12:42:10 +00004649}
Guido van Rossumad0ee831995-03-01 10:34:45 +00004650#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00004651
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004652
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004653PyDoc_STRVAR(posix_lstat__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004654"lstat(path) -> stat result\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004655Like stat(path), but do not follow symbolic links.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004656
Barry Warsaw53699e91996-12-10 23:23:01 +00004657static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004658posix_lstat(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004659{
Guido van Rossumb6775db1994-08-01 11:34:53 +00004660#ifdef HAVE_LSTAT
Martin v. Löwis011e8422009-05-05 04:43:17 +00004661 return posix_do_stat(self, args, "O&:lstat", lstat, NULL, NULL);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004662#else /* !HAVE_LSTAT */
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004663#ifdef MS_WINDOWS
Martin v. Löwis011e8422009-05-05 04:43:17 +00004664 return posix_do_stat(self, args, "O&:lstat", STAT, "U:lstat", win32_wstat);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004665#else
Martin v. Löwis011e8422009-05-05 04:43:17 +00004666 return posix_do_stat(self, args, "O&:lstat", STAT, NULL, NULL);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004667#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004668#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004669}
4670
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004671
Guido van Rossumb6775db1994-08-01 11:34:53 +00004672#ifdef HAVE_READLINK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004673PyDoc_STRVAR(posix_readlink__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004674"readlink(path) -> path\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004675Return a string representing the path to which the symbolic link points.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004676
Barry Warsaw53699e91996-12-10 23:23:01 +00004677static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004678posix_readlink(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004679{
Thomas Wouters89f507f2006-12-13 04:49:30 +00004680 PyObject* v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00004681 char buf[MAXPATHLEN];
Martin v. Löwis011e8422009-05-05 04:43:17 +00004682 PyObject *opath;
Guido van Rossumef0a00e1992-01-27 16:51:30 +00004683 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004684 int n;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004685 int arg_is_unicode = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004686
Martin v. Löwis011e8422009-05-05 04:43:17 +00004687 if (!PyArg_ParseTuple(args, "O&:readlink",
4688 PyUnicode_FSConverter, &opath))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004689 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00004690 path = bytes2str(opath, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004691 v = PySequence_GetItem(args, 0);
Neal Norwitzcda5c062007-08-12 17:09:36 +00004692 if (v == NULL) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00004693 release_bytes(opath);
Neal Norwitzcda5c062007-08-12 17:09:36 +00004694 return NULL;
4695 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004696
4697 if (PyUnicode_Check(v)) {
4698 arg_is_unicode = 1;
4699 }
4700 Py_DECREF(v);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004701
Barry Warsaw53699e91996-12-10 23:23:01 +00004702 Py_BEGIN_ALLOW_THREADS
Guido van Rossum50e61dc1992-03-27 17:22:31 +00004703 n = readlink(path, buf, (int) sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +00004704 Py_END_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004705 if (n < 0)
Martin v. Löwis011e8422009-05-05 04:43:17 +00004706 return posix_error_with_allocated_filename(opath);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004707
Martin v. Löwis011e8422009-05-05 04:43:17 +00004708 release_bytes(opath);
Christian Heimes72b710a2008-05-26 13:28:38 +00004709 v = PyBytes_FromStringAndSize(buf, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004710 if (arg_is_unicode) {
4711 PyObject *w;
4712
4713 w = PyUnicode_FromEncodedObject(v,
4714 Py_FileSystemDefaultEncoding,
Martin v. Löwis43c57782009-05-10 08:15:24 +00004715 "surrogateescape");
Thomas Wouters89f507f2006-12-13 04:49:30 +00004716 if (w != NULL) {
4717 Py_DECREF(v);
4718 v = w;
4719 }
4720 else {
Guido van Rossumf0af3e32008-10-02 18:55:37 +00004721 v = NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004722 }
4723 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004724 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004725}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004726#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004727
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004728
Guido van Rossumb6775db1994-08-01 11:34:53 +00004729#ifdef HAVE_SYMLINK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004730PyDoc_STRVAR(posix_symlink__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004731"symlink(src, dst)\n\n\
Brett Cannon807413d2003-06-11 00:18:09 +00004732Create a symbolic link pointing to src named dst.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004733
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004734static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004735posix_symlink(PyObject *self, PyObject *args)
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004736{
Martin v. Löwis011e8422009-05-05 04:43:17 +00004737 return posix_2str(args, "O&O&:symlink", symlink);
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004738}
4739#endif /* HAVE_SYMLINK */
4740
4741
4742#ifdef HAVE_TIMES
Guido van Rossumd48f2521997-12-05 22:19:34 +00004743#if defined(PYCC_VACPP) && defined(PYOS_OS2)
4744static long
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00004745system_uptime(void)
Guido van Rossumd48f2521997-12-05 22:19:34 +00004746{
4747 ULONG value = 0;
4748
4749 Py_BEGIN_ALLOW_THREADS
4750 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &value, sizeof(value));
4751 Py_END_ALLOW_THREADS
4752
4753 return value;
4754}
4755
4756static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004757posix_times(PyObject *self, PyObject *noargs)
Guido van Rossumd48f2521997-12-05 22:19:34 +00004758{
Guido van Rossumd48f2521997-12-05 22:19:34 +00004759 /* Currently Only Uptime is Provided -- Others Later */
4760 return Py_BuildValue("ddddd",
4761 (double)0 /* t.tms_utime / HZ */,
4762 (double)0 /* t.tms_stime / HZ */,
4763 (double)0 /* t.tms_cutime / HZ */,
4764 (double)0 /* t.tms_cstime / HZ */,
4765 (double)system_uptime() / 1000);
4766}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004767#else /* not OS2 */
Martin v. Löwis05bfe1f2008-12-29 18:21:47 +00004768#define NEED_TICKS_PER_SECOND
4769static long ticks_per_second = -1;
Barry Warsaw53699e91996-12-10 23:23:01 +00004770static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004771posix_times(PyObject *self, PyObject *noargs)
Guido van Rossum22db57e1992-04-05 14:25:30 +00004772{
4773 struct tms t;
4774 clock_t c;
Guido van Rossum22db57e1992-04-05 14:25:30 +00004775 errno = 0;
4776 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00004777 if (c == (clock_t) -1)
4778 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004779 return Py_BuildValue("ddddd",
Martin v. Löwis05bfe1f2008-12-29 18:21:47 +00004780 (double)t.tms_utime / ticks_per_second,
4781 (double)t.tms_stime / ticks_per_second,
4782 (double)t.tms_cutime / ticks_per_second,
4783 (double)t.tms_cstime / ticks_per_second,
4784 (double)c / ticks_per_second);
Guido van Rossum22db57e1992-04-05 14:25:30 +00004785}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004786#endif /* not OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004787#endif /* HAVE_TIMES */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004788
4789
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00004790#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +00004791#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00004792static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004793posix_times(PyObject *self, PyObject *noargs)
Guido van Rossum14ed0b21994-09-29 09:50:09 +00004794{
4795 FILETIME create, exit, kernel, user;
4796 HANDLE hProc;
Guido van Rossum14ed0b21994-09-29 09:50:09 +00004797 hProc = GetCurrentProcess();
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00004798 GetProcessTimes(hProc, &create, &exit, &kernel, &user);
4799 /* The fields of a FILETIME structure are the hi and lo part
4800 of a 64-bit value expressed in 100 nanosecond units.
4801 1e7 is one second in such units; 1e-7 the inverse.
4802 429.4967296 is 2**32 / 1e7 or 2**32 * 1e-7.
4803 */
Barry Warsaw53699e91996-12-10 23:23:01 +00004804 return Py_BuildValue(
4805 "ddddd",
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00004806 (double)(user.dwHighDateTime*429.4967296 +
4807 user.dwLowDateTime*1e-7),
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004808 (double)(kernel.dwHighDateTime*429.4967296 +
4809 kernel.dwLowDateTime*1e-7),
Barry Warsaw53699e91996-12-10 23:23:01 +00004810 (double)0,
4811 (double)0,
4812 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00004813}
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00004814#endif /* MS_WINDOWS */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004815
4816#ifdef HAVE_TIMES
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004817PyDoc_STRVAR(posix_times__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004818"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004819Return a tuple of floating point numbers indicating process times.");
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004820#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00004821
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004822
Martin v. Löwis49ee14d2003-11-10 06:35:36 +00004823#ifdef HAVE_GETSID
4824PyDoc_STRVAR(posix_getsid__doc__,
4825"getsid(pid) -> sid\n\n\
4826Call the system call getsid().");
4827
4828static PyObject *
4829posix_getsid(PyObject *self, PyObject *args)
4830{
Christian Heimes292d3512008-02-03 16:51:08 +00004831 pid_t pid;
4832 int sid;
Gregory P. Smith84508572010-03-14 18:56:11 +00004833 if (!PyArg_ParseTuple(args, _Py_PARSE_PID ":getsid", &pid))
Martin v. Löwis49ee14d2003-11-10 06:35:36 +00004834 return NULL;
4835 sid = getsid(pid);
4836 if (sid < 0)
4837 return posix_error();
Christian Heimes217cfd12007-12-02 14:31:20 +00004838 return PyLong_FromLong((long)sid);
Martin v. Löwis49ee14d2003-11-10 06:35:36 +00004839}
4840#endif /* HAVE_GETSID */
4841
4842
Guido van Rossumb6775db1994-08-01 11:34:53 +00004843#ifdef HAVE_SETSID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004844PyDoc_STRVAR(posix_setsid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004845"setsid()\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004846Call the system call setsid().");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004847
Barry Warsaw53699e91996-12-10 23:23:01 +00004848static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004849posix_setsid(PyObject *self, PyObject *noargs)
Guido van Rossumc2670a01992-09-13 20:07:29 +00004850{
Guido van Rossum687dd131993-05-17 08:34:16 +00004851 if (setsid() < 0)
4852 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004853 Py_INCREF(Py_None);
4854 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00004855}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004856#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00004857
Guido van Rossumb6775db1994-08-01 11:34:53 +00004858#ifdef HAVE_SETPGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004859PyDoc_STRVAR(posix_setpgid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004860"setpgid(pid, pgrp)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004861Call the system call setpgid().");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004862
Barry Warsaw53699e91996-12-10 23:23:01 +00004863static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004864posix_setpgid(PyObject *self, PyObject *args)
Guido van Rossumc2670a01992-09-13 20:07:29 +00004865{
Christian Heimes292d3512008-02-03 16:51:08 +00004866 pid_t pid;
4867 int pgrp;
Gregory P. Smith84508572010-03-14 18:56:11 +00004868 if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:setpgid", &pid, &pgrp))
Guido van Rossumc2670a01992-09-13 20:07:29 +00004869 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00004870 if (setpgid(pid, pgrp) < 0)
4871 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004872 Py_INCREF(Py_None);
4873 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00004874}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004875#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00004876
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004877
Guido van Rossumb6775db1994-08-01 11:34:53 +00004878#ifdef HAVE_TCGETPGRP
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004879PyDoc_STRVAR(posix_tcgetpgrp__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004880"tcgetpgrp(fd) -> pgid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004881Return the process group associated with the terminal given by a fd.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004882
Barry Warsaw53699e91996-12-10 23:23:01 +00004883static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004884posix_tcgetpgrp(PyObject *self, PyObject *args)
Guido van Rossum7066dd71992-09-17 17:54:56 +00004885{
Christian Heimes15ebc882008-02-04 18:48:49 +00004886 int fd;
4887 pid_t pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004888 if (!PyArg_ParseTuple(args, "i:tcgetpgrp", &fd))
Guido van Rossum7066dd71992-09-17 17:54:56 +00004889 return NULL;
4890 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00004891 if (pgid < 0)
4892 return posix_error();
Antoine Pitrouc3ee1662009-05-23 16:02:33 +00004893 return PyLong_FromPid(pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00004894}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004895#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00004896
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004897
Guido van Rossumb6775db1994-08-01 11:34:53 +00004898#ifdef HAVE_TCSETPGRP
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004899PyDoc_STRVAR(posix_tcsetpgrp__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004900"tcsetpgrp(fd, pgid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004901Set the process group associated with the terminal given by a fd.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004902
Barry Warsaw53699e91996-12-10 23:23:01 +00004903static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004904posix_tcsetpgrp(PyObject *self, PyObject *args)
Guido van Rossum7066dd71992-09-17 17:54:56 +00004905{
Antoine Pitrou971e51b2009-05-23 16:14:27 +00004906 int fd;
4907 pid_t pgid;
Gregory P. Smith84508572010-03-14 18:56:11 +00004908 if (!PyArg_ParseTuple(args, "i" _Py_PARSE_PID ":tcsetpgrp", &fd, &pgid))
Guido van Rossum7066dd71992-09-17 17:54:56 +00004909 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00004910 if (tcsetpgrp(fd, pgid) < 0)
4911 return posix_error();
Barry Warsaw43d68b81996-12-19 22:10:44 +00004912 Py_INCREF(Py_None);
Barry Warsaw53699e91996-12-10 23:23:01 +00004913 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00004914}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004915#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00004916
Guido van Rossum687dd131993-05-17 08:34:16 +00004917/* Functions acting on file descriptors */
4918
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004919PyDoc_STRVAR(posix_open__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004920"open(filename, flag [, mode=0777]) -> fd\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004921Open a file (for low level IO).");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004922
Barry Warsaw53699e91996-12-10 23:23:01 +00004923static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004924posix_open(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00004925{
Martin v. Löwis011e8422009-05-05 04:43:17 +00004926 PyObject *ofile;
4927 char *file;
Guido van Rossum687dd131993-05-17 08:34:16 +00004928 int flag;
4929 int mode = 0777;
4930 int fd;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004931
4932#ifdef MS_WINDOWS
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00004933 PyUnicodeObject *po;
4934 if (PyArg_ParseTuple(args, "Ui|i:mkdir", &po, &flag, &mode)) {
4935 Py_BEGIN_ALLOW_THREADS
4936 /* PyUnicode_AS_UNICODE OK without thread
4937 lock as it is a simple dereference. */
4938 fd = _wopen(PyUnicode_AS_UNICODE(po), flag, mode);
4939 Py_END_ALLOW_THREADS
4940 if (fd < 0)
4941 return posix_error();
4942 return PyLong_FromLong((long)fd);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004943 }
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00004944 /* Drop the argument parsing error as narrow strings
4945 are also valid. */
4946 PyErr_Clear();
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004947#endif
4948
Martin v. Löwis011e8422009-05-05 04:43:17 +00004949 if (!PyArg_ParseTuple(args, "O&i|i",
4950 PyUnicode_FSConverter, &ofile,
Mark Hammondef8b6542001-05-13 08:04:26 +00004951 &flag, &mode))
Barry Warsaw43d68b81996-12-19 22:10:44 +00004952 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00004953 file = bytes2str(ofile, 1);
Barry Warsaw53699e91996-12-10 23:23:01 +00004954 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00004955 fd = open(file, flag, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00004956 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00004957 if (fd < 0)
Martin v. Löwis011e8422009-05-05 04:43:17 +00004958 return posix_error_with_allocated_filename(ofile);
4959 release_bytes(ofile);
Christian Heimes217cfd12007-12-02 14:31:20 +00004960 return PyLong_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00004961}
4962
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004963
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004964PyDoc_STRVAR(posix_close__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004965"close(fd)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004966Close a file descriptor (for low level IO).");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004967
Barry Warsaw53699e91996-12-10 23:23:01 +00004968static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004969posix_close(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00004970{
4971 int fd, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004972 if (!PyArg_ParseTuple(args, "i:close", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00004973 return NULL;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00004974 if (!_PyVerify_fd(fd))
4975 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004976 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00004977 res = close(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00004978 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00004979 if (res < 0)
4980 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004981 Py_INCREF(Py_None);
4982 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00004983}
4984
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004985
Christian Heimesfdab48e2008-01-20 09:06:41 +00004986PyDoc_STRVAR(posix_closerange__doc__,
4987"closerange(fd_low, fd_high)\n\n\
4988Closes all file descriptors in [fd_low, fd_high), ignoring errors.");
4989
4990static PyObject *
4991posix_closerange(PyObject *self, PyObject *args)
4992{
4993 int fd_from, fd_to, i;
4994 if (!PyArg_ParseTuple(args, "ii:closerange", &fd_from, &fd_to))
4995 return NULL;
4996 Py_BEGIN_ALLOW_THREADS
4997 for (i = fd_from; i < fd_to; i++)
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00004998 if (_PyVerify_fd(i))
4999 close(i);
Christian Heimesfdab48e2008-01-20 09:06:41 +00005000 Py_END_ALLOW_THREADS
5001 Py_RETURN_NONE;
5002}
5003
5004
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005005PyDoc_STRVAR(posix_dup__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005006"dup(fd) -> fd2\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005007Return a duplicate of a file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005008
Barry Warsaw53699e91996-12-10 23:23:01 +00005009static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005010posix_dup(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005011{
5012 int fd;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005013 if (!PyArg_ParseTuple(args, "i:dup", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00005014 return NULL;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00005015 if (!_PyVerify_fd(fd))
5016 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005017 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00005018 fd = dup(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00005019 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00005020 if (fd < 0)
5021 return posix_error();
Christian Heimes217cfd12007-12-02 14:31:20 +00005022 return PyLong_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00005023}
5024
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005025
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005026PyDoc_STRVAR(posix_dup2__doc__,
Andrew M. Kuchling8135fd52004-01-16 13:18:42 +00005027"dup2(old_fd, new_fd)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005028Duplicate file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005029
Barry Warsaw53699e91996-12-10 23:23:01 +00005030static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005031posix_dup2(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005032{
5033 int fd, fd2, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005034 if (!PyArg_ParseTuple(args, "ii:dup2", &fd, &fd2))
Guido van Rossum687dd131993-05-17 08:34:16 +00005035 return NULL;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00005036 if (!_PyVerify_fd_dup2(fd, fd2))
5037 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005038 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00005039 res = dup2(fd, fd2);
Barry Warsaw53699e91996-12-10 23:23:01 +00005040 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00005041 if (res < 0)
5042 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005043 Py_INCREF(Py_None);
5044 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00005045}
5046
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005047
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005048PyDoc_STRVAR(posix_lseek__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005049"lseek(fd, pos, how) -> newpos\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005050Set the current position of a file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005051
Barry Warsaw53699e91996-12-10 23:23:01 +00005052static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005053posix_lseek(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005054{
5055 int fd, how;
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005056#if defined(MS_WIN64) || defined(MS_WINDOWS)
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00005057 PY_LONG_LONG pos, res;
Fred Drake699f3522000-06-29 21:12:41 +00005058#else
Guido van Rossum94f6f721999-01-06 18:42:14 +00005059 off_t pos, res;
Fred Drake699f3522000-06-29 21:12:41 +00005060#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00005061 PyObject *posobj;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005062 if (!PyArg_ParseTuple(args, "iOi:lseek", &fd, &posobj, &how))
Guido van Rossum687dd131993-05-17 08:34:16 +00005063 return NULL;
5064#ifdef SEEK_SET
5065 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
5066 switch (how) {
5067 case 0: how = SEEK_SET; break;
5068 case 1: how = SEEK_CUR; break;
5069 case 2: how = SEEK_END; break;
5070 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00005071#endif /* SEEK_END */
Guido van Rossum94f6f721999-01-06 18:42:14 +00005072
5073#if !defined(HAVE_LARGEFILE_SUPPORT)
Christian Heimes217cfd12007-12-02 14:31:20 +00005074 pos = PyLong_AsLong(posobj);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005075#else
5076 pos = PyLong_Check(posobj) ?
Christian Heimes217cfd12007-12-02 14:31:20 +00005077 PyLong_AsLongLong(posobj) : PyLong_AsLong(posobj);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005078#endif
5079 if (PyErr_Occurred())
5080 return NULL;
5081
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00005082 if (!_PyVerify_fd(fd))
5083 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005084 Py_BEGIN_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005085#if defined(MS_WIN64) || defined(MS_WINDOWS)
Fred Drake699f3522000-06-29 21:12:41 +00005086 res = _lseeki64(fd, pos, how);
5087#else
Guido van Rossum687dd131993-05-17 08:34:16 +00005088 res = lseek(fd, pos, how);
Fred Drake699f3522000-06-29 21:12:41 +00005089#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00005090 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00005091 if (res < 0)
5092 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00005093
5094#if !defined(HAVE_LARGEFILE_SUPPORT)
Christian Heimes217cfd12007-12-02 14:31:20 +00005095 return PyLong_FromLong(res);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005096#else
5097 return PyLong_FromLongLong(res);
5098#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00005099}
5100
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005101
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005102PyDoc_STRVAR(posix_read__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005103"read(fd, buffersize) -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005104Read a file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005105
Barry Warsaw53699e91996-12-10 23:23:01 +00005106static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005107posix_read(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005108{
Guido van Rossum572dbf82007-04-27 23:53:51 +00005109 int fd, size;
5110 Py_ssize_t n;
Barry Warsaw53699e91996-12-10 23:23:01 +00005111 PyObject *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005112 if (!PyArg_ParseTuple(args, "ii:read", &fd, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00005113 return NULL;
Michael W. Hudson9867ced2005-01-31 17:01:59 +00005114 if (size < 0) {
5115 errno = EINVAL;
5116 return posix_error();
5117 }
Christian Heimes72b710a2008-05-26 13:28:38 +00005118 buffer = PyBytes_FromStringAndSize((char *)NULL, size);
Guido van Rossum687dd131993-05-17 08:34:16 +00005119 if (buffer == NULL)
5120 return NULL;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00005121 if (!_PyVerify_fd(fd))
5122 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005123 Py_BEGIN_ALLOW_THREADS
Christian Heimes72b710a2008-05-26 13:28:38 +00005124 n = read(fd, PyBytes_AS_STRING(buffer), size);
Barry Warsaw53699e91996-12-10 23:23:01 +00005125 Py_END_ALLOW_THREADS
Guido van Rossum8bac5461996-06-11 18:38:48 +00005126 if (n < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00005127 Py_DECREF(buffer);
Guido van Rossum687dd131993-05-17 08:34:16 +00005128 return posix_error();
5129 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00005130 if (n != size)
Christian Heimes72b710a2008-05-26 13:28:38 +00005131 _PyBytes_Resize(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00005132 return buffer;
5133}
5134
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005135
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005136PyDoc_STRVAR(posix_write__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005137"write(fd, string) -> byteswritten\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005138Write a string to a file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005139
Barry Warsaw53699e91996-12-10 23:23:01 +00005140static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005141posix_write(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005142{
Martin v. Löwis423be952008-08-13 15:53:07 +00005143 Py_buffer pbuf;
Thomas Wouters68bc4f92006-03-01 01:05:10 +00005144 int fd;
5145 Py_ssize_t size;
Thomas Wouters68bc4f92006-03-01 01:05:10 +00005146
Antoine Pitrou9cadb1b2008-09-15 23:02:56 +00005147 if (!PyArg_ParseTuple(args, "iy*:write", &fd, &pbuf))
Guido van Rossum687dd131993-05-17 08:34:16 +00005148 return NULL;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00005149 if (!_PyVerify_fd(fd))
5150 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005151 Py_BEGIN_ALLOW_THREADS
Martin v. Löwis423be952008-08-13 15:53:07 +00005152 size = write(fd, pbuf.buf, (size_t)pbuf.len);
Barry Warsaw53699e91996-12-10 23:23:01 +00005153 Py_END_ALLOW_THREADS
Martin v. Löwis423be952008-08-13 15:53:07 +00005154 PyBuffer_Release(&pbuf);
Guido van Rossum687dd131993-05-17 08:34:16 +00005155 if (size < 0)
5156 return posix_error();
Christian Heimes217cfd12007-12-02 14:31:20 +00005157 return PyLong_FromSsize_t(size);
Guido van Rossum687dd131993-05-17 08:34:16 +00005158}
5159
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005160
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005161PyDoc_STRVAR(posix_fstat__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005162"fstat(fd) -> stat result\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005163Like stat(), but for an open file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005164
Barry Warsaw53699e91996-12-10 23:23:01 +00005165static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005166posix_fstat(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005167{
5168 int fd;
Fred Drake699f3522000-06-29 21:12:41 +00005169 STRUCT_STAT st;
Guido van Rossum687dd131993-05-17 08:34:16 +00005170 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005171 if (!PyArg_ParseTuple(args, "i:fstat", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00005172 return NULL;
Martin v. Löwis7a924e62003-03-05 14:15:21 +00005173#ifdef __VMS
5174 /* on OpenVMS we must ensure that all bytes are written to the file */
5175 fsync(fd);
5176#endif
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00005177 if (!_PyVerify_fd(fd))
5178 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005179 Py_BEGIN_ALLOW_THREADS
Fred Drake699f3522000-06-29 21:12:41 +00005180 res = FSTAT(fd, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00005181 Py_END_ALLOW_THREADS
Martin v. Löwis14694662006-02-03 12:54:16 +00005182 if (res != 0) {
5183#ifdef MS_WINDOWS
5184 return win32_error("fstat", NULL);
5185#else
Guido van Rossum687dd131993-05-17 08:34:16 +00005186 return posix_error();
Martin v. Löwis14694662006-02-03 12:54:16 +00005187#endif
5188 }
Tim Peters5aa91602002-01-30 05:46:57 +00005189
Martin v. Löwis14694662006-02-03 12:54:16 +00005190 return _pystat_fromstructstat(&st);
Guido van Rossum687dd131993-05-17 08:34:16 +00005191}
5192
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005193PyDoc_STRVAR(posix_isatty__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005194"isatty(fd) -> bool\n\n\
Fred Drake106c1a02002-04-23 15:58:02 +00005195Return True if the file descriptor 'fd' is an open file descriptor\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005196connected to the slave end of a terminal.");
Skip Montanaro1517d842000-07-19 14:34:14 +00005197
5198static PyObject *
Thomas Wouters616607a2000-07-19 14:45:40 +00005199posix_isatty(PyObject *self, PyObject *args)
Skip Montanaro1517d842000-07-19 14:34:14 +00005200{
5201 int fd;
5202 if (!PyArg_ParseTuple(args, "i:isatty", &fd))
5203 return NULL;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00005204 if (!_PyVerify_fd(fd))
5205 return PyBool_FromLong(0);
Fred Drake106c1a02002-04-23 15:58:02 +00005206 return PyBool_FromLong(isatty(fd));
Skip Montanaro1517d842000-07-19 14:34:14 +00005207}
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005208
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005209#ifdef HAVE_PIPE
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005210PyDoc_STRVAR(posix_pipe__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005211"pipe() -> (read_end, write_end)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005212Create a pipe.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005213
Barry Warsaw53699e91996-12-10 23:23:01 +00005214static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00005215posix_pipe(PyObject *self, PyObject *noargs)
Guido van Rossum687dd131993-05-17 08:34:16 +00005216{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005217#if defined(PYOS_OS2)
5218 HFILE read, write;
5219 APIRET rc;
5220
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005221 Py_BEGIN_ALLOW_THREADS
5222 rc = DosCreatePipe( &read, &write, 4096);
5223 Py_END_ALLOW_THREADS
5224 if (rc != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00005225 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005226
5227 return Py_BuildValue("(ii)", read, write);
5228#else
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005229#if !defined(MS_WINDOWS)
Guido van Rossum687dd131993-05-17 08:34:16 +00005230 int fds[2];
5231 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00005232 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00005233 res = pipe(fds);
Barry Warsaw53699e91996-12-10 23:23:01 +00005234 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00005235 if (res != 0)
5236 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005237 return Py_BuildValue("(ii)", fds[0], fds[1]);
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005238#else /* MS_WINDOWS */
Guido van Rossum794d8131994-08-23 13:48:48 +00005239 HANDLE read, write;
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00005240 int read_fd, write_fd;
Guido van Rossum794d8131994-08-23 13:48:48 +00005241 BOOL ok;
Barry Warsaw53699e91996-12-10 23:23:01 +00005242 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00005243 ok = CreatePipe(&read, &write, NULL, 0);
Barry Warsaw53699e91996-12-10 23:23:01 +00005244 Py_END_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00005245 if (!ok)
Fredrik Lundhffb9c772000-07-09 14:49:51 +00005246 return win32_error("CreatePipe", NULL);
Tim Peters79248aa2001-08-29 21:37:10 +00005247 read_fd = _open_osfhandle((Py_intptr_t)read, 0);
5248 write_fd = _open_osfhandle((Py_intptr_t)write, 1);
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00005249 return Py_BuildValue("(ii)", read_fd, write_fd);
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005250#endif /* MS_WINDOWS */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005251#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00005252}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005253#endif /* HAVE_PIPE */
5254
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005255
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005256#ifdef HAVE_MKFIFO
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005257PyDoc_STRVAR(posix_mkfifo__doc__,
Neal Norwitzc18b3082002-10-11 22:19:42 +00005258"mkfifo(filename [, mode=0666])\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005259Create a FIFO (a POSIX named pipe).");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005260
Barry Warsaw53699e91996-12-10 23:23:01 +00005261static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005262posix_mkfifo(PyObject *self, PyObject *args)
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005263{
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005264 char *filename;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005265 int mode = 0666;
5266 int res;
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005267 if (!PyArg_ParseTuple(args, "s|i:mkfifo", &filename, &mode))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005268 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00005269 Py_BEGIN_ALLOW_THREADS
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005270 res = mkfifo(filename, mode);
5271 Py_END_ALLOW_THREADS
5272 if (res < 0)
5273 return posix_error();
5274 Py_INCREF(Py_None);
5275 return Py_None;
5276}
5277#endif
5278
5279
Neal Norwitz11690112002-07-30 01:08:28 +00005280#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005281PyDoc_STRVAR(posix_mknod__doc__,
Neal Norwitzc18b3082002-10-11 22:19:42 +00005282"mknod(filename [, mode=0600, device])\n\n\
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005283Create a filesystem node (file, device special file or named pipe)\n\
5284named filename. mode specifies both the permissions to use and the\n\
5285type of node to be created, being combined (bitwise OR) with one of\n\
5286S_IFREG, S_IFCHR, S_IFBLK, and S_IFIFO. For S_IFCHR and S_IFBLK,\n\
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005287device defines the newly created device special file (probably using\n\
5288os.makedev()), otherwise it is ignored.");
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005289
5290
5291static PyObject *
5292posix_mknod(PyObject *self, PyObject *args)
5293{
5294 char *filename;
5295 int mode = 0600;
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005296 int device = 0;
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005297 int res;
Martin v. Löwisd631ebe2002-11-02 17:42:33 +00005298 if (!PyArg_ParseTuple(args, "s|ii:mknod", &filename, &mode, &device))
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005299 return NULL;
5300 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005301 res = mknod(filename, mode, device);
Barry Warsaw53699e91996-12-10 23:23:01 +00005302 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005303 if (res < 0)
5304 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005305 Py_INCREF(Py_None);
5306 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005307}
5308#endif
5309
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005310#ifdef HAVE_DEVICE_MACROS
5311PyDoc_STRVAR(posix_major__doc__,
5312"major(device) -> major number\n\
5313Extracts a device major number from a raw device number.");
5314
5315static PyObject *
5316posix_major(PyObject *self, PyObject *args)
5317{
5318 int device;
5319 if (!PyArg_ParseTuple(args, "i:major", &device))
5320 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +00005321 return PyLong_FromLong((long)major(device));
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005322}
5323
5324PyDoc_STRVAR(posix_minor__doc__,
5325"minor(device) -> minor number\n\
5326Extracts a device minor number from a raw device number.");
5327
5328static PyObject *
5329posix_minor(PyObject *self, PyObject *args)
5330{
5331 int device;
5332 if (!PyArg_ParseTuple(args, "i:minor", &device))
5333 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +00005334 return PyLong_FromLong((long)minor(device));
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005335}
5336
5337PyDoc_STRVAR(posix_makedev__doc__,
5338"makedev(major, minor) -> device number\n\
5339Composes a raw device number from the major and minor device numbers.");
5340
5341static PyObject *
5342posix_makedev(PyObject *self, PyObject *args)
5343{
5344 int major, minor;
5345 if (!PyArg_ParseTuple(args, "ii:makedev", &major, &minor))
5346 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +00005347 return PyLong_FromLong((long)makedev(major, minor));
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005348}
5349#endif /* device macros */
5350
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005351
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005352#ifdef HAVE_FTRUNCATE
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005353PyDoc_STRVAR(posix_ftruncate__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005354"ftruncate(fd, length)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005355Truncate a file to a specified length.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005356
Barry Warsaw53699e91996-12-10 23:23:01 +00005357static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005358posix_ftruncate(PyObject *self, PyObject *args)
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005359{
5360 int fd;
Guido van Rossum94f6f721999-01-06 18:42:14 +00005361 off_t length;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005362 int res;
Guido van Rossum94f6f721999-01-06 18:42:14 +00005363 PyObject *lenobj;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005364
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005365 if (!PyArg_ParseTuple(args, "iO:ftruncate", &fd, &lenobj))
Guido van Rossum94f6f721999-01-06 18:42:14 +00005366 return NULL;
5367
5368#if !defined(HAVE_LARGEFILE_SUPPORT)
Christian Heimes217cfd12007-12-02 14:31:20 +00005369 length = PyLong_AsLong(lenobj);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005370#else
5371 length = PyLong_Check(lenobj) ?
Christian Heimes217cfd12007-12-02 14:31:20 +00005372 PyLong_AsLongLong(lenobj) : PyLong_AsLong(lenobj);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005373#endif
5374 if (PyErr_Occurred())
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005375 return NULL;
5376
Barry Warsaw53699e91996-12-10 23:23:01 +00005377 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005378 res = ftruncate(fd, length);
Barry Warsaw53699e91996-12-10 23:23:01 +00005379 Py_END_ALLOW_THREADS
Benjamin Peterson9053d752009-01-19 17:53:36 +00005380 if (res < 0)
5381 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005382 Py_INCREF(Py_None);
5383 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005384}
5385#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00005386
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005387#ifdef HAVE_PUTENV
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005388PyDoc_STRVAR(posix_putenv__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005389"putenv(key, value)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005390Change or add an environment variable.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005391
Fred Drake762e2061999-08-26 17:23:54 +00005392/* Save putenv() parameters as values here, so we can collect them when they
5393 * get re-set with another call for the same key. */
5394static PyObject *posix_putenv_garbage;
5395
Tim Peters5aa91602002-01-30 05:46:57 +00005396static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005397posix_putenv(PyObject *self, PyObject *args)
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005398{
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005399#ifdef MS_WINDOWS
5400 wchar_t *s1, *s2;
5401 wchar_t *newenv;
5402#else
Martin v. Löwis011e8422009-05-05 04:43:17 +00005403 PyObject *os1, *os2;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005404 char *s1, *s2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005405 char *newenv;
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005406#endif
Fred Drake762e2061999-08-26 17:23:54 +00005407 PyObject *newstr;
Tim Petersc8996f52001-12-03 20:41:00 +00005408 size_t len;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005409
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005410#ifdef MS_WINDOWS
Martin v. Löwis011e8422009-05-05 04:43:17 +00005411 if (!PyArg_ParseTuple(args,
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005412 "uu:putenv",
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005413 &s1, &s2))
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005414 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00005415#else
5416 if (!PyArg_ParseTuple(args,
5417 "O&O&:putenv",
5418 PyUnicode_FSConverter, &os1,
5419 PyUnicode_FSConverter, &os2))
5420 return NULL;
5421 s1 = bytes2str(os1, 1);
5422 s2 = bytes2str(os2, 1);
5423#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +00005424
5425#if defined(PYOS_OS2)
5426 if (stricmp(s1, "BEGINLIBPATH") == 0) {
5427 APIRET rc;
5428
Guido van Rossumd48f2521997-12-05 22:19:34 +00005429 rc = DosSetExtLIBPATH(s2, BEGIN_LIBPATH);
5430 if (rc != NO_ERROR)
5431 return os2_error(rc);
5432
5433 } else if (stricmp(s1, "ENDLIBPATH") == 0) {
5434 APIRET rc;
5435
Guido van Rossumd48f2521997-12-05 22:19:34 +00005436 rc = DosSetExtLIBPATH(s2, END_LIBPATH);
5437 if (rc != NO_ERROR)
5438 return os2_error(rc);
5439 } else {
5440#endif
Fred Drake762e2061999-08-26 17:23:54 +00005441 /* XXX This can leak memory -- not easy to fix :-( */
Tim Petersc8996f52001-12-03 20:41:00 +00005442 /* len includes space for a trailing \0; the size arg to
Christian Heimes72b710a2008-05-26 13:28:38 +00005443 PyBytes_FromStringAndSize does not count that */
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005444#ifdef MS_WINDOWS
5445 len = wcslen(s1) + wcslen(s2) + 2;
5446 newstr = PyUnicode_FromUnicode(NULL, (int)len - 1);
5447#else
5448 len = strlen(s1) + strlen(s2) + 2;
Christian Heimes72b710a2008-05-26 13:28:38 +00005449 newstr = PyBytes_FromStringAndSize(NULL, (int)len - 1);
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005450#endif
Fred Drake762e2061999-08-26 17:23:54 +00005451 if (newstr == NULL)
5452 return PyErr_NoMemory();
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005453#ifdef MS_WINDOWS
5454 newenv = PyUnicode_AsUnicode(newstr);
5455 _snwprintf(newenv, len, L"%s=%s", s1, s2);
5456 if (_wputenv(newenv)) {
5457 Py_DECREF(newstr);
5458 posix_error();
5459 return NULL;
5460 }
5461#else
Christian Heimes72b710a2008-05-26 13:28:38 +00005462 newenv = PyBytes_AS_STRING(newstr);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005463 PyOS_snprintf(newenv, len, "%s=%s", s1, s2);
5464 if (putenv(newenv)) {
Neal Norwitz4adc9ab2003-02-10 03:10:43 +00005465 Py_DECREF(newstr);
Martin v. Löwis011e8422009-05-05 04:43:17 +00005466 release_bytes(os1);
5467 release_bytes(os2);
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005468 posix_error();
5469 return NULL;
5470 }
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005471#endif
Fred Drake762e2061999-08-26 17:23:54 +00005472 /* Install the first arg and newstr in posix_putenv_garbage;
5473 * this will cause previous value to be collected. This has to
5474 * happen after the real putenv() call because the old value
5475 * was still accessible until then. */
5476 if (PyDict_SetItem(posix_putenv_garbage,
5477 PyTuple_GET_ITEM(args, 0), newstr)) {
5478 /* really not much we can do; just leak */
5479 PyErr_Clear();
5480 }
5481 else {
5482 Py_DECREF(newstr);
5483 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00005484
5485#if defined(PYOS_OS2)
5486 }
5487#endif
Martin v. Löwis011e8422009-05-05 04:43:17 +00005488#ifndef MS_WINDOWS
5489 release_bytes(os1);
5490 release_bytes(os2);
5491#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00005492 Py_INCREF(Py_None);
5493 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005494}
Guido van Rossumb6a47161997-09-15 22:54:34 +00005495#endif /* putenv */
5496
Guido van Rossumc524d952001-10-19 01:31:59 +00005497#ifdef HAVE_UNSETENV
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005498PyDoc_STRVAR(posix_unsetenv__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005499"unsetenv(key)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005500Delete an environment variable.");
Guido van Rossumc524d952001-10-19 01:31:59 +00005501
5502static PyObject *
5503posix_unsetenv(PyObject *self, PyObject *args)
5504{
5505 char *s1;
5506
5507 if (!PyArg_ParseTuple(args, "s:unsetenv", &s1))
5508 return NULL;
5509
5510 unsetenv(s1);
5511
5512 /* Remove the key from posix_putenv_garbage;
5513 * this will cause it to be collected. This has to
Tim Peters5aa91602002-01-30 05:46:57 +00005514 * happen after the real unsetenv() call because the
Guido van Rossumc524d952001-10-19 01:31:59 +00005515 * old value was still accessible until then.
5516 */
5517 if (PyDict_DelItem(posix_putenv_garbage,
5518 PyTuple_GET_ITEM(args, 0))) {
5519 /* really not much we can do; just leak */
5520 PyErr_Clear();
5521 }
5522
5523 Py_INCREF(Py_None);
5524 return Py_None;
5525}
5526#endif /* unsetenv */
5527
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005528PyDoc_STRVAR(posix_strerror__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005529"strerror(code) -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005530Translate an error code to a message string.");
Guido van Rossumb6a47161997-09-15 22:54:34 +00005531
Guido van Rossumf68d8e52001-04-14 17:55:09 +00005532static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005533posix_strerror(PyObject *self, PyObject *args)
Guido van Rossumb6a47161997-09-15 22:54:34 +00005534{
5535 int code;
5536 char *message;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005537 if (!PyArg_ParseTuple(args, "i:strerror", &code))
Guido van Rossumb6a47161997-09-15 22:54:34 +00005538 return NULL;
5539 message = strerror(code);
5540 if (message == NULL) {
5541 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00005542 "strerror() argument out of range");
Guido van Rossumb6a47161997-09-15 22:54:34 +00005543 return NULL;
5544 }
Neal Norwitz93c56822007-08-26 07:10:06 +00005545 return PyUnicode_FromString(message);
Guido van Rossumb6a47161997-09-15 22:54:34 +00005546}
Guido van Rossumb6a47161997-09-15 22:54:34 +00005547
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005548
Guido van Rossumc9641791998-08-04 15:26:23 +00005549#ifdef HAVE_SYS_WAIT_H
5550
Fred Drake106c1a02002-04-23 15:58:02 +00005551#ifdef WCOREDUMP
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005552PyDoc_STRVAR(posix_WCOREDUMP__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005553"WCOREDUMP(status) -> bool\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005554Return True if the process returning 'status' was dumped to a core file.");
Fred Drake106c1a02002-04-23 15:58:02 +00005555
5556static PyObject *
5557posix_WCOREDUMP(PyObject *self, PyObject *args)
5558{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005559 WAIT_TYPE status;
5560 WAIT_STATUS_INT(status) = 0;
Fred Drake106c1a02002-04-23 15:58:02 +00005561
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005562 if (!PyArg_ParseTuple(args, "i:WCOREDUMP", &WAIT_STATUS_INT(status)))
Fred Drake106c1a02002-04-23 15:58:02 +00005563 return NULL;
Fred Drake106c1a02002-04-23 15:58:02 +00005564
5565 return PyBool_FromLong(WCOREDUMP(status));
Fred Drake106c1a02002-04-23 15:58:02 +00005566}
5567#endif /* WCOREDUMP */
5568
5569#ifdef WIFCONTINUED
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005570PyDoc_STRVAR(posix_WIFCONTINUED__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005571"WIFCONTINUED(status) -> bool\n\n\
Fred Drake106c1a02002-04-23 15:58:02 +00005572Return True if the process returning 'status' was continued from a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005573job control stop.");
Fred Drake106c1a02002-04-23 15:58:02 +00005574
5575static PyObject *
Martin v. Löwis2b41b0d2002-05-04 13:13:41 +00005576posix_WIFCONTINUED(PyObject *self, PyObject *args)
Fred Drake106c1a02002-04-23 15:58:02 +00005577{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005578 WAIT_TYPE status;
5579 WAIT_STATUS_INT(status) = 0;
Fred Drake106c1a02002-04-23 15:58:02 +00005580
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005581 if (!PyArg_ParseTuple(args, "i:WCONTINUED", &WAIT_STATUS_INT(status)))
Fred Drake106c1a02002-04-23 15:58:02 +00005582 return NULL;
Fred Drake106c1a02002-04-23 15:58:02 +00005583
Martin v. Löwis2b41b0d2002-05-04 13:13:41 +00005584 return PyBool_FromLong(WIFCONTINUED(status));
Fred Drake106c1a02002-04-23 15:58:02 +00005585}
5586#endif /* WIFCONTINUED */
5587
Guido van Rossumc9641791998-08-04 15:26:23 +00005588#ifdef WIFSTOPPED
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005589PyDoc_STRVAR(posix_WIFSTOPPED__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005590"WIFSTOPPED(status) -> bool\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005591Return True if the process returning 'status' was stopped.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005592
5593static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005594posix_WIFSTOPPED(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005595{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005596 WAIT_TYPE status;
5597 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005598
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005599 if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &WAIT_STATUS_INT(status)))
Guido van Rossumc9641791998-08-04 15:26:23 +00005600 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005601
Fred Drake106c1a02002-04-23 15:58:02 +00005602 return PyBool_FromLong(WIFSTOPPED(status));
Guido van Rossumc9641791998-08-04 15:26:23 +00005603}
5604#endif /* WIFSTOPPED */
5605
5606#ifdef WIFSIGNALED
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005607PyDoc_STRVAR(posix_WIFSIGNALED__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005608"WIFSIGNALED(status) -> bool\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005609Return True if the process returning 'status' was terminated by a signal.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005610
5611static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005612posix_WIFSIGNALED(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005613{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005614 WAIT_TYPE status;
5615 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005616
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005617 if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &WAIT_STATUS_INT(status)))
Guido van Rossumc9641791998-08-04 15:26:23 +00005618 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005619
Fred Drake106c1a02002-04-23 15:58:02 +00005620 return PyBool_FromLong(WIFSIGNALED(status));
Guido van Rossumc9641791998-08-04 15:26:23 +00005621}
5622#endif /* WIFSIGNALED */
5623
5624#ifdef WIFEXITED
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005625PyDoc_STRVAR(posix_WIFEXITED__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005626"WIFEXITED(status) -> bool\n\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00005627Return true if the process returning 'status' exited using the exit()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005628system call.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005629
5630static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005631posix_WIFEXITED(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005632{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005633 WAIT_TYPE status;
5634 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005635
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005636 if (!PyArg_ParseTuple(args, "i:WIFEXITED", &WAIT_STATUS_INT(status)))
Guido van Rossumc9641791998-08-04 15:26:23 +00005637 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005638
Fred Drake106c1a02002-04-23 15:58:02 +00005639 return PyBool_FromLong(WIFEXITED(status));
Guido van Rossumc9641791998-08-04 15:26:23 +00005640}
5641#endif /* WIFEXITED */
5642
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00005643#ifdef WEXITSTATUS
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005644PyDoc_STRVAR(posix_WEXITSTATUS__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005645"WEXITSTATUS(status) -> integer\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005646Return the process return code from 'status'.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005647
5648static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005649posix_WEXITSTATUS(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005650{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005651 WAIT_TYPE status;
5652 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005653
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005654 if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &WAIT_STATUS_INT(status)))
Guido van Rossumc9641791998-08-04 15:26:23 +00005655 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005656
Guido van Rossumc9641791998-08-04 15:26:23 +00005657 return Py_BuildValue("i", WEXITSTATUS(status));
5658}
5659#endif /* WEXITSTATUS */
5660
5661#ifdef WTERMSIG
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005662PyDoc_STRVAR(posix_WTERMSIG__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005663"WTERMSIG(status) -> integer\n\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00005664Return the signal that terminated the process that provided the 'status'\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005665value.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005666
5667static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005668posix_WTERMSIG(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005669{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005670 WAIT_TYPE status;
5671 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005672
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005673 if (!PyArg_ParseTuple(args, "i:WTERMSIG", &WAIT_STATUS_INT(status)))
Guido van Rossumc9641791998-08-04 15:26:23 +00005674 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005675
Guido van Rossumc9641791998-08-04 15:26:23 +00005676 return Py_BuildValue("i", WTERMSIG(status));
5677}
5678#endif /* WTERMSIG */
5679
5680#ifdef WSTOPSIG
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005681PyDoc_STRVAR(posix_WSTOPSIG__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005682"WSTOPSIG(status) -> integer\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005683Return the signal that stopped the process that provided\n\
5684the 'status' value.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005685
5686static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005687posix_WSTOPSIG(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005688{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005689 WAIT_TYPE status;
5690 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005691
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005692 if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &WAIT_STATUS_INT(status)))
Guido van Rossumc9641791998-08-04 15:26:23 +00005693 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005694
Guido van Rossumc9641791998-08-04 15:26:23 +00005695 return Py_BuildValue("i", WSTOPSIG(status));
5696}
5697#endif /* WSTOPSIG */
5698
5699#endif /* HAVE_SYS_WAIT_H */
5700
5701
Thomas Wouters477c8d52006-05-27 19:21:47 +00005702#if defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H)
Guido van Rossumd5753e11999-10-19 13:29:23 +00005703#ifdef _SCO_DS
5704/* SCO OpenServer 5.0 and later requires _SVID3 before it reveals the
5705 needed definitions in sys/statvfs.h */
5706#define _SVID3
5707#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00005708#include <sys/statvfs.h>
5709
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005710static PyObject*
5711_pystatvfs_fromstructstatvfs(struct statvfs st) {
5712 PyObject *v = PyStructSequence_New(&StatVFSResultType);
5713 if (v == NULL)
5714 return NULL;
5715
5716#if !defined(HAVE_LARGEFILE_SUPPORT)
Christian Heimes217cfd12007-12-02 14:31:20 +00005717 PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize));
5718 PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize));
5719 PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long) st.f_blocks));
5720 PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long) st.f_bfree));
5721 PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong((long) st.f_bavail));
5722 PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong((long) st.f_files));
5723 PyStructSequence_SET_ITEM(v, 6, PyLong_FromLong((long) st.f_ffree));
5724 PyStructSequence_SET_ITEM(v, 7, PyLong_FromLong((long) st.f_favail));
5725 PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag));
5726 PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax));
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005727#else
Christian Heimes217cfd12007-12-02 14:31:20 +00005728 PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize));
5729 PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize));
Tim Peters5aa91602002-01-30 05:46:57 +00005730 PyStructSequence_SET_ITEM(v, 2,
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00005731 PyLong_FromLongLong((PY_LONG_LONG) st.f_blocks));
Tim Peters5aa91602002-01-30 05:46:57 +00005732 PyStructSequence_SET_ITEM(v, 3,
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00005733 PyLong_FromLongLong((PY_LONG_LONG) st.f_bfree));
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005734 PyStructSequence_SET_ITEM(v, 4,
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00005735 PyLong_FromLongLong((PY_LONG_LONG) st.f_bavail));
Tim Peters5aa91602002-01-30 05:46:57 +00005736 PyStructSequence_SET_ITEM(v, 5,
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00005737 PyLong_FromLongLong((PY_LONG_LONG) st.f_files));
Tim Peters5aa91602002-01-30 05:46:57 +00005738 PyStructSequence_SET_ITEM(v, 6,
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00005739 PyLong_FromLongLong((PY_LONG_LONG) st.f_ffree));
Tim Peters5aa91602002-01-30 05:46:57 +00005740 PyStructSequence_SET_ITEM(v, 7,
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00005741 PyLong_FromLongLong((PY_LONG_LONG) st.f_favail));
Christian Heimes217cfd12007-12-02 14:31:20 +00005742 PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag));
5743 PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax));
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005744#endif
5745
5746 return v;
5747}
5748
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005749PyDoc_STRVAR(posix_fstatvfs__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005750"fstatvfs(fd) -> statvfs result\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005751Perform an fstatvfs system call on the given fd.");
Guido van Rossum94f6f721999-01-06 18:42:14 +00005752
5753static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005754posix_fstatvfs(PyObject *self, PyObject *args)
Guido van Rossum94f6f721999-01-06 18:42:14 +00005755{
5756 int fd, res;
5757 struct statvfs st;
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005758
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005759 if (!PyArg_ParseTuple(args, "i:fstatvfs", &fd))
Guido van Rossum94f6f721999-01-06 18:42:14 +00005760 return NULL;
5761 Py_BEGIN_ALLOW_THREADS
5762 res = fstatvfs(fd, &st);
5763 Py_END_ALLOW_THREADS
5764 if (res != 0)
5765 return posix_error();
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005766
5767 return _pystatvfs_fromstructstatvfs(st);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005768}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005769#endif /* HAVE_FSTATVFS && HAVE_SYS_STATVFS_H */
Guido van Rossum94f6f721999-01-06 18:42:14 +00005770
5771
Thomas Wouters477c8d52006-05-27 19:21:47 +00005772#if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H)
Guido van Rossum94f6f721999-01-06 18:42:14 +00005773#include <sys/statvfs.h>
5774
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005775PyDoc_STRVAR(posix_statvfs__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005776"statvfs(path) -> statvfs result\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005777Perform a statvfs system call on the given path.");
Guido van Rossum94f6f721999-01-06 18:42:14 +00005778
5779static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005780posix_statvfs(PyObject *self, PyObject *args)
Guido van Rossum94f6f721999-01-06 18:42:14 +00005781{
5782 char *path;
5783 int res;
5784 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005785 if (!PyArg_ParseTuple(args, "s:statvfs", &path))
Guido van Rossum94f6f721999-01-06 18:42:14 +00005786 return NULL;
5787 Py_BEGIN_ALLOW_THREADS
5788 res = statvfs(path, &st);
5789 Py_END_ALLOW_THREADS
5790 if (res != 0)
5791 return posix_error_with_filename(path);
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005792
5793 return _pystatvfs_fromstructstatvfs(st);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005794}
5795#endif /* HAVE_STATVFS */
5796
Fred Drakec9680921999-12-13 16:37:25 +00005797/* This is used for fpathconf(), pathconf(), confstr() and sysconf().
5798 * It maps strings representing configuration variable names to
5799 * integer values, allowing those functions to be called with the
Thomas Wouters7e474022000-07-16 12:04:32 +00005800 * magic names instead of polluting the module's namespace with tons of
Fred Drake12c6e2d1999-12-14 21:25:03 +00005801 * rarely-used constants. There are three separate tables that use
5802 * these definitions.
Fred Drakebec628d1999-12-15 18:31:10 +00005803 *
5804 * This code is always included, even if none of the interfaces that
5805 * need it are included. The #if hackery needed to avoid it would be
5806 * sufficiently pervasive that it's not worth the loss of readability.
Fred Drakec9680921999-12-13 16:37:25 +00005807 */
5808struct constdef {
5809 char *name;
5810 long value;
5811};
5812
Fred Drake12c6e2d1999-12-14 21:25:03 +00005813static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005814conv_confname(PyObject *arg, int *valuep, struct constdef *table,
Guido van Rossum7d5baac2007-08-27 23:24:46 +00005815 size_t tablesize)
Fred Drake12c6e2d1999-12-14 21:25:03 +00005816{
Christian Heimes217cfd12007-12-02 14:31:20 +00005817 if (PyLong_Check(arg)) {
5818 *valuep = PyLong_AS_LONG(arg);
Fred Drake12c6e2d1999-12-14 21:25:03 +00005819 return 1;
5820 }
Guido van Rossumbce56a62007-05-10 18:04:33 +00005821 else {
Fred Drake12c6e2d1999-12-14 21:25:03 +00005822 /* look up the value in the table using a binary search */
Fred Drake699f3522000-06-29 21:12:41 +00005823 size_t lo = 0;
Guido van Rossum7d5baac2007-08-27 23:24:46 +00005824 size_t mid;
Fred Drake699f3522000-06-29 21:12:41 +00005825 size_t hi = tablesize;
5826 int cmp;
Guido van Rossumbce56a62007-05-10 18:04:33 +00005827 const char *confname;
Guido van Rossum7d5baac2007-08-27 23:24:46 +00005828 if (!PyUnicode_Check(arg)) {
Guido van Rossumbce56a62007-05-10 18:04:33 +00005829 PyErr_SetString(PyExc_TypeError,
5830 "configuration names must be strings or integers");
5831 return 0;
5832 }
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00005833 confname = _PyUnicode_AsString(arg);
Guido van Rossum7d5baac2007-08-27 23:24:46 +00005834 if (confname == NULL)
5835 return 0;
Fred Drake12c6e2d1999-12-14 21:25:03 +00005836 while (lo < hi) {
5837 mid = (lo + hi) / 2;
5838 cmp = strcmp(confname, table[mid].name);
5839 if (cmp < 0)
5840 hi = mid;
5841 else if (cmp > 0)
5842 lo = mid + 1;
5843 else {
5844 *valuep = table[mid].value;
5845 return 1;
5846 }
5847 }
5848 PyErr_SetString(PyExc_ValueError, "unrecognized configuration name");
Guido van Rossumbce56a62007-05-10 18:04:33 +00005849 return 0;
Fred Drake12c6e2d1999-12-14 21:25:03 +00005850 }
Fred Drake12c6e2d1999-12-14 21:25:03 +00005851}
5852
5853
5854#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
5855static struct constdef posix_constants_pathconf[] = {
Fred Draked86ed291999-12-15 15:34:33 +00005856#ifdef _PC_ABI_AIO_XFER_MAX
5857 {"PC_ABI_AIO_XFER_MAX", _PC_ABI_AIO_XFER_MAX},
5858#endif
5859#ifdef _PC_ABI_ASYNC_IO
5860 {"PC_ABI_ASYNC_IO", _PC_ABI_ASYNC_IO},
5861#endif
Fred Drakec9680921999-12-13 16:37:25 +00005862#ifdef _PC_ASYNC_IO
5863 {"PC_ASYNC_IO", _PC_ASYNC_IO},
5864#endif
5865#ifdef _PC_CHOWN_RESTRICTED
5866 {"PC_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED},
5867#endif
5868#ifdef _PC_FILESIZEBITS
5869 {"PC_FILESIZEBITS", _PC_FILESIZEBITS},
5870#endif
5871#ifdef _PC_LAST
5872 {"PC_LAST", _PC_LAST},
5873#endif
5874#ifdef _PC_LINK_MAX
5875 {"PC_LINK_MAX", _PC_LINK_MAX},
5876#endif
5877#ifdef _PC_MAX_CANON
5878 {"PC_MAX_CANON", _PC_MAX_CANON},
5879#endif
5880#ifdef _PC_MAX_INPUT
5881 {"PC_MAX_INPUT", _PC_MAX_INPUT},
5882#endif
5883#ifdef _PC_NAME_MAX
5884 {"PC_NAME_MAX", _PC_NAME_MAX},
5885#endif
5886#ifdef _PC_NO_TRUNC
5887 {"PC_NO_TRUNC", _PC_NO_TRUNC},
5888#endif
5889#ifdef _PC_PATH_MAX
5890 {"PC_PATH_MAX", _PC_PATH_MAX},
5891#endif
5892#ifdef _PC_PIPE_BUF
5893 {"PC_PIPE_BUF", _PC_PIPE_BUF},
5894#endif
5895#ifdef _PC_PRIO_IO
5896 {"PC_PRIO_IO", _PC_PRIO_IO},
5897#endif
5898#ifdef _PC_SOCK_MAXBUF
5899 {"PC_SOCK_MAXBUF", _PC_SOCK_MAXBUF},
5900#endif
5901#ifdef _PC_SYNC_IO
5902 {"PC_SYNC_IO", _PC_SYNC_IO},
5903#endif
5904#ifdef _PC_VDISABLE
5905 {"PC_VDISABLE", _PC_VDISABLE},
5906#endif
5907};
5908
Fred Drakec9680921999-12-13 16:37:25 +00005909static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005910conv_path_confname(PyObject *arg, int *valuep)
Fred Drakec9680921999-12-13 16:37:25 +00005911{
5912 return conv_confname(arg, valuep, posix_constants_pathconf,
5913 sizeof(posix_constants_pathconf)
5914 / sizeof(struct constdef));
5915}
5916#endif
5917
5918#ifdef HAVE_FPATHCONF
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005919PyDoc_STRVAR(posix_fpathconf__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005920"fpathconf(fd, name) -> integer\n\n\
Fred Drakec9680921999-12-13 16:37:25 +00005921Return the configuration limit name for the file descriptor fd.\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_fpathconf(PyObject *self, PyObject *args)
Fred Drakec9680921999-12-13 16:37:25 +00005926{
5927 PyObject *result = NULL;
5928 int name, fd;
5929
Fred Drake12c6e2d1999-12-14 21:25:03 +00005930 if (PyArg_ParseTuple(args, "iO&:fpathconf", &fd,
5931 conv_path_confname, &name)) {
Fred Drakec9680921999-12-13 16:37:25 +00005932 long limit;
5933
5934 errno = 0;
5935 limit = fpathconf(fd, name);
5936 if (limit == -1 && errno != 0)
5937 posix_error();
5938 else
Christian Heimes217cfd12007-12-02 14:31:20 +00005939 result = PyLong_FromLong(limit);
Fred Drakec9680921999-12-13 16:37:25 +00005940 }
5941 return result;
5942}
5943#endif
5944
5945
5946#ifdef HAVE_PATHCONF
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005947PyDoc_STRVAR(posix_pathconf__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005948"pathconf(path, name) -> integer\n\n\
Fred Drakec9680921999-12-13 16:37:25 +00005949Return the configuration limit name for the file or directory path.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005950If there is no limit, return -1.");
Fred Drakec9680921999-12-13 16:37:25 +00005951
5952static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005953posix_pathconf(PyObject *self, PyObject *args)
Fred Drakec9680921999-12-13 16:37:25 +00005954{
5955 PyObject *result = NULL;
5956 int name;
5957 char *path;
5958
5959 if (PyArg_ParseTuple(args, "sO&:pathconf", &path,
5960 conv_path_confname, &name)) {
5961 long limit;
5962
5963 errno = 0;
5964 limit = pathconf(path, name);
Fred Drake12c6e2d1999-12-14 21:25:03 +00005965 if (limit == -1 && errno != 0) {
Fred Drakec9680921999-12-13 16:37:25 +00005966 if (errno == EINVAL)
5967 /* could be a path or name problem */
5968 posix_error();
5969 else
5970 posix_error_with_filename(path);
Fred Drake12c6e2d1999-12-14 21:25:03 +00005971 }
Fred Drakec9680921999-12-13 16:37:25 +00005972 else
Christian Heimes217cfd12007-12-02 14:31:20 +00005973 result = PyLong_FromLong(limit);
Fred Drakec9680921999-12-13 16:37:25 +00005974 }
5975 return result;
5976}
5977#endif
5978
5979#ifdef HAVE_CONFSTR
5980static struct constdef posix_constants_confstr[] = {
Fred Draked86ed291999-12-15 15:34:33 +00005981#ifdef _CS_ARCHITECTURE
5982 {"CS_ARCHITECTURE", _CS_ARCHITECTURE},
5983#endif
5984#ifdef _CS_HOSTNAME
5985 {"CS_HOSTNAME", _CS_HOSTNAME},
5986#endif
5987#ifdef _CS_HW_PROVIDER
5988 {"CS_HW_PROVIDER", _CS_HW_PROVIDER},
5989#endif
5990#ifdef _CS_HW_SERIAL
5991 {"CS_HW_SERIAL", _CS_HW_SERIAL},
5992#endif
5993#ifdef _CS_INITTAB_NAME
5994 {"CS_INITTAB_NAME", _CS_INITTAB_NAME},
5995#endif
Fred Drakec9680921999-12-13 16:37:25 +00005996#ifdef _CS_LFS64_CFLAGS
5997 {"CS_LFS64_CFLAGS", _CS_LFS64_CFLAGS},
5998#endif
5999#ifdef _CS_LFS64_LDFLAGS
6000 {"CS_LFS64_LDFLAGS", _CS_LFS64_LDFLAGS},
6001#endif
6002#ifdef _CS_LFS64_LIBS
6003 {"CS_LFS64_LIBS", _CS_LFS64_LIBS},
6004#endif
6005#ifdef _CS_LFS64_LINTFLAGS
6006 {"CS_LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS},
6007#endif
6008#ifdef _CS_LFS_CFLAGS
6009 {"CS_LFS_CFLAGS", _CS_LFS_CFLAGS},
6010#endif
6011#ifdef _CS_LFS_LDFLAGS
6012 {"CS_LFS_LDFLAGS", _CS_LFS_LDFLAGS},
6013#endif
6014#ifdef _CS_LFS_LIBS
6015 {"CS_LFS_LIBS", _CS_LFS_LIBS},
6016#endif
6017#ifdef _CS_LFS_LINTFLAGS
6018 {"CS_LFS_LINTFLAGS", _CS_LFS_LINTFLAGS},
6019#endif
Fred Draked86ed291999-12-15 15:34:33 +00006020#ifdef _CS_MACHINE
6021 {"CS_MACHINE", _CS_MACHINE},
6022#endif
Fred Drakec9680921999-12-13 16:37:25 +00006023#ifdef _CS_PATH
6024 {"CS_PATH", _CS_PATH},
6025#endif
Fred Draked86ed291999-12-15 15:34:33 +00006026#ifdef _CS_RELEASE
6027 {"CS_RELEASE", _CS_RELEASE},
6028#endif
6029#ifdef _CS_SRPC_DOMAIN
6030 {"CS_SRPC_DOMAIN", _CS_SRPC_DOMAIN},
6031#endif
6032#ifdef _CS_SYSNAME
6033 {"CS_SYSNAME", _CS_SYSNAME},
6034#endif
6035#ifdef _CS_VERSION
6036 {"CS_VERSION", _CS_VERSION},
6037#endif
Fred Drakec9680921999-12-13 16:37:25 +00006038#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS
6039 {"CS_XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS},
6040#endif
6041#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS
6042 {"CS_XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS},
6043#endif
6044#ifdef _CS_XBS5_ILP32_OFF32_LIBS
6045 {"CS_XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS},
6046#endif
6047#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS
6048 {"CS_XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS},
6049#endif
6050#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS
6051 {"CS_XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS},
6052#endif
6053#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS
6054 {"CS_XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS},
6055#endif
6056#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS
6057 {"CS_XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS},
6058#endif
6059#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
6060 {"CS_XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS},
6061#endif
6062#ifdef _CS_XBS5_LP64_OFF64_CFLAGS
6063 {"CS_XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS},
6064#endif
6065#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS
6066 {"CS_XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS},
6067#endif
6068#ifdef _CS_XBS5_LP64_OFF64_LIBS
6069 {"CS_XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS},
6070#endif
6071#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS
6072 {"CS_XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS},
6073#endif
6074#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS
6075 {"CS_XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS},
6076#endif
6077#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
6078 {"CS_XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS},
6079#endif
6080#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS
6081 {"CS_XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS},
6082#endif
6083#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
6084 {"CS_XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS},
6085#endif
Fred Draked86ed291999-12-15 15:34:33 +00006086#ifdef _MIPS_CS_AVAIL_PROCESSORS
6087 {"MIPS_CS_AVAIL_PROCESSORS", _MIPS_CS_AVAIL_PROCESSORS},
6088#endif
6089#ifdef _MIPS_CS_BASE
6090 {"MIPS_CS_BASE", _MIPS_CS_BASE},
6091#endif
6092#ifdef _MIPS_CS_HOSTID
6093 {"MIPS_CS_HOSTID", _MIPS_CS_HOSTID},
6094#endif
6095#ifdef _MIPS_CS_HW_NAME
6096 {"MIPS_CS_HW_NAME", _MIPS_CS_HW_NAME},
6097#endif
6098#ifdef _MIPS_CS_NUM_PROCESSORS
6099 {"MIPS_CS_NUM_PROCESSORS", _MIPS_CS_NUM_PROCESSORS},
6100#endif
6101#ifdef _MIPS_CS_OSREL_MAJ
6102 {"MIPS_CS_OSREL_MAJ", _MIPS_CS_OSREL_MAJ},
6103#endif
6104#ifdef _MIPS_CS_OSREL_MIN
6105 {"MIPS_CS_OSREL_MIN", _MIPS_CS_OSREL_MIN},
6106#endif
6107#ifdef _MIPS_CS_OSREL_PATCH
6108 {"MIPS_CS_OSREL_PATCH", _MIPS_CS_OSREL_PATCH},
6109#endif
6110#ifdef _MIPS_CS_OS_NAME
6111 {"MIPS_CS_OS_NAME", _MIPS_CS_OS_NAME},
6112#endif
6113#ifdef _MIPS_CS_OS_PROVIDER
6114 {"MIPS_CS_OS_PROVIDER", _MIPS_CS_OS_PROVIDER},
6115#endif
6116#ifdef _MIPS_CS_PROCESSORS
6117 {"MIPS_CS_PROCESSORS", _MIPS_CS_PROCESSORS},
6118#endif
6119#ifdef _MIPS_CS_SERIAL
6120 {"MIPS_CS_SERIAL", _MIPS_CS_SERIAL},
6121#endif
6122#ifdef _MIPS_CS_VENDOR
6123 {"MIPS_CS_VENDOR", _MIPS_CS_VENDOR},
6124#endif
Fred Drakec9680921999-12-13 16:37:25 +00006125};
6126
6127static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006128conv_confstr_confname(PyObject *arg, int *valuep)
Fred Drakec9680921999-12-13 16:37:25 +00006129{
6130 return conv_confname(arg, valuep, posix_constants_confstr,
6131 sizeof(posix_constants_confstr)
6132 / sizeof(struct constdef));
6133}
6134
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006135PyDoc_STRVAR(posix_confstr__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00006136"confstr(name) -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006137Return a string-valued system configuration variable.");
Fred Drakec9680921999-12-13 16:37:25 +00006138
6139static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006140posix_confstr(PyObject *self, PyObject *args)
Fred Drakec9680921999-12-13 16:37:25 +00006141{
6142 PyObject *result = NULL;
6143 int name;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006144 char buffer[256];
Fred Drakec9680921999-12-13 16:37:25 +00006145
6146 if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006147 int len;
Fred Drakec9680921999-12-13 16:37:25 +00006148
Fred Drakec9680921999-12-13 16:37:25 +00006149 errno = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006150 len = confstr(name, buffer, sizeof(buffer));
6151 if (len == 0) {
6152 if (errno) {
6153 posix_error();
6154 }
6155 else {
6156 result = Py_None;
6157 Py_INCREF(Py_None);
6158 }
Fred Drakec9680921999-12-13 16:37:25 +00006159 }
6160 else {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006161 if ((unsigned int)len >= sizeof(buffer)) {
Neal Norwitz93c56822007-08-26 07:10:06 +00006162 result = PyUnicode_FromStringAndSize(NULL, len-1);
Fred Drakec9680921999-12-13 16:37:25 +00006163 if (result != NULL)
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00006164 confstr(name, _PyUnicode_AsString(result), len);
Fred Drakec9680921999-12-13 16:37:25 +00006165 }
6166 else
Neal Norwitz93c56822007-08-26 07:10:06 +00006167 result = PyUnicode_FromStringAndSize(buffer, len-1);
Fred Drakec9680921999-12-13 16:37:25 +00006168 }
6169 }
6170 return result;
6171}
6172#endif
6173
6174
6175#ifdef HAVE_SYSCONF
6176static struct constdef posix_constants_sysconf[] = {
6177#ifdef _SC_2_CHAR_TERM
6178 {"SC_2_CHAR_TERM", _SC_2_CHAR_TERM},
6179#endif
6180#ifdef _SC_2_C_BIND
6181 {"SC_2_C_BIND", _SC_2_C_BIND},
6182#endif
6183#ifdef _SC_2_C_DEV
6184 {"SC_2_C_DEV", _SC_2_C_DEV},
6185#endif
6186#ifdef _SC_2_C_VERSION
6187 {"SC_2_C_VERSION", _SC_2_C_VERSION},
6188#endif
6189#ifdef _SC_2_FORT_DEV
6190 {"SC_2_FORT_DEV", _SC_2_FORT_DEV},
6191#endif
6192#ifdef _SC_2_FORT_RUN
6193 {"SC_2_FORT_RUN", _SC_2_FORT_RUN},
6194#endif
6195#ifdef _SC_2_LOCALEDEF
6196 {"SC_2_LOCALEDEF", _SC_2_LOCALEDEF},
6197#endif
6198#ifdef _SC_2_SW_DEV
6199 {"SC_2_SW_DEV", _SC_2_SW_DEV},
6200#endif
6201#ifdef _SC_2_UPE
6202 {"SC_2_UPE", _SC_2_UPE},
6203#endif
6204#ifdef _SC_2_VERSION
6205 {"SC_2_VERSION", _SC_2_VERSION},
6206#endif
Fred Draked86ed291999-12-15 15:34:33 +00006207#ifdef _SC_ABI_ASYNCHRONOUS_IO
6208 {"SC_ABI_ASYNCHRONOUS_IO", _SC_ABI_ASYNCHRONOUS_IO},
6209#endif
6210#ifdef _SC_ACL
6211 {"SC_ACL", _SC_ACL},
6212#endif
Fred Drakec9680921999-12-13 16:37:25 +00006213#ifdef _SC_AIO_LISTIO_MAX
6214 {"SC_AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX},
6215#endif
Fred Drakec9680921999-12-13 16:37:25 +00006216#ifdef _SC_AIO_MAX
6217 {"SC_AIO_MAX", _SC_AIO_MAX},
6218#endif
6219#ifdef _SC_AIO_PRIO_DELTA_MAX
6220 {"SC_AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX},
6221#endif
6222#ifdef _SC_ARG_MAX
6223 {"SC_ARG_MAX", _SC_ARG_MAX},
6224#endif
6225#ifdef _SC_ASYNCHRONOUS_IO
6226 {"SC_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO},
6227#endif
6228#ifdef _SC_ATEXIT_MAX
6229 {"SC_ATEXIT_MAX", _SC_ATEXIT_MAX},
6230#endif
Fred Draked86ed291999-12-15 15:34:33 +00006231#ifdef _SC_AUDIT
6232 {"SC_AUDIT", _SC_AUDIT},
6233#endif
Fred Drakec9680921999-12-13 16:37:25 +00006234#ifdef _SC_AVPHYS_PAGES
6235 {"SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES},
6236#endif
6237#ifdef _SC_BC_BASE_MAX
6238 {"SC_BC_BASE_MAX", _SC_BC_BASE_MAX},
6239#endif
6240#ifdef _SC_BC_DIM_MAX
6241 {"SC_BC_DIM_MAX", _SC_BC_DIM_MAX},
6242#endif
6243#ifdef _SC_BC_SCALE_MAX
6244 {"SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX},
6245#endif
6246#ifdef _SC_BC_STRING_MAX
6247 {"SC_BC_STRING_MAX", _SC_BC_STRING_MAX},
6248#endif
Fred Draked86ed291999-12-15 15:34:33 +00006249#ifdef _SC_CAP
6250 {"SC_CAP", _SC_CAP},
6251#endif
Fred Drakec9680921999-12-13 16:37:25 +00006252#ifdef _SC_CHARCLASS_NAME_MAX
6253 {"SC_CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX},
6254#endif
6255#ifdef _SC_CHAR_BIT
6256 {"SC_CHAR_BIT", _SC_CHAR_BIT},
6257#endif
6258#ifdef _SC_CHAR_MAX
6259 {"SC_CHAR_MAX", _SC_CHAR_MAX},
6260#endif
6261#ifdef _SC_CHAR_MIN
6262 {"SC_CHAR_MIN", _SC_CHAR_MIN},
6263#endif
6264#ifdef _SC_CHILD_MAX
6265 {"SC_CHILD_MAX", _SC_CHILD_MAX},
6266#endif
6267#ifdef _SC_CLK_TCK
6268 {"SC_CLK_TCK", _SC_CLK_TCK},
6269#endif
6270#ifdef _SC_COHER_BLKSZ
6271 {"SC_COHER_BLKSZ", _SC_COHER_BLKSZ},
6272#endif
6273#ifdef _SC_COLL_WEIGHTS_MAX
6274 {"SC_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX},
6275#endif
6276#ifdef _SC_DCACHE_ASSOC
6277 {"SC_DCACHE_ASSOC", _SC_DCACHE_ASSOC},
6278#endif
6279#ifdef _SC_DCACHE_BLKSZ
6280 {"SC_DCACHE_BLKSZ", _SC_DCACHE_BLKSZ},
6281#endif
6282#ifdef _SC_DCACHE_LINESZ
6283 {"SC_DCACHE_LINESZ", _SC_DCACHE_LINESZ},
6284#endif
6285#ifdef _SC_DCACHE_SZ
6286 {"SC_DCACHE_SZ", _SC_DCACHE_SZ},
6287#endif
6288#ifdef _SC_DCACHE_TBLKSZ
6289 {"SC_DCACHE_TBLKSZ", _SC_DCACHE_TBLKSZ},
6290#endif
6291#ifdef _SC_DELAYTIMER_MAX
6292 {"SC_DELAYTIMER_MAX", _SC_DELAYTIMER_MAX},
6293#endif
6294#ifdef _SC_EQUIV_CLASS_MAX
6295 {"SC_EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX},
6296#endif
6297#ifdef _SC_EXPR_NEST_MAX
6298 {"SC_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX},
6299#endif
6300#ifdef _SC_FSYNC
6301 {"SC_FSYNC", _SC_FSYNC},
6302#endif
6303#ifdef _SC_GETGR_R_SIZE_MAX
6304 {"SC_GETGR_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX},
6305#endif
6306#ifdef _SC_GETPW_R_SIZE_MAX
6307 {"SC_GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX},
6308#endif
6309#ifdef _SC_ICACHE_ASSOC
6310 {"SC_ICACHE_ASSOC", _SC_ICACHE_ASSOC},
6311#endif
6312#ifdef _SC_ICACHE_BLKSZ
6313 {"SC_ICACHE_BLKSZ", _SC_ICACHE_BLKSZ},
6314#endif
6315#ifdef _SC_ICACHE_LINESZ
6316 {"SC_ICACHE_LINESZ", _SC_ICACHE_LINESZ},
6317#endif
6318#ifdef _SC_ICACHE_SZ
6319 {"SC_ICACHE_SZ", _SC_ICACHE_SZ},
6320#endif
Fred Draked86ed291999-12-15 15:34:33 +00006321#ifdef _SC_INF
6322 {"SC_INF", _SC_INF},
6323#endif
Fred Drakec9680921999-12-13 16:37:25 +00006324#ifdef _SC_INT_MAX
6325 {"SC_INT_MAX", _SC_INT_MAX},
6326#endif
6327#ifdef _SC_INT_MIN
6328 {"SC_INT_MIN", _SC_INT_MIN},
6329#endif
6330#ifdef _SC_IOV_MAX
6331 {"SC_IOV_MAX", _SC_IOV_MAX},
6332#endif
Fred Draked86ed291999-12-15 15:34:33 +00006333#ifdef _SC_IP_SECOPTS
6334 {"SC_IP_SECOPTS", _SC_IP_SECOPTS},
6335#endif
Fred Drakec9680921999-12-13 16:37:25 +00006336#ifdef _SC_JOB_CONTROL
6337 {"SC_JOB_CONTROL", _SC_JOB_CONTROL},
6338#endif
Fred Draked86ed291999-12-15 15:34:33 +00006339#ifdef _SC_KERN_POINTERS
6340 {"SC_KERN_POINTERS", _SC_KERN_POINTERS},
6341#endif
6342#ifdef _SC_KERN_SIM
6343 {"SC_KERN_SIM", _SC_KERN_SIM},
6344#endif
Fred Drakec9680921999-12-13 16:37:25 +00006345#ifdef _SC_LINE_MAX
6346 {"SC_LINE_MAX", _SC_LINE_MAX},
6347#endif
6348#ifdef _SC_LOGIN_NAME_MAX
6349 {"SC_LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX},
6350#endif
6351#ifdef _SC_LOGNAME_MAX
6352 {"SC_LOGNAME_MAX", _SC_LOGNAME_MAX},
6353#endif
6354#ifdef _SC_LONG_BIT
6355 {"SC_LONG_BIT", _SC_LONG_BIT},
6356#endif
Fred Draked86ed291999-12-15 15:34:33 +00006357#ifdef _SC_MAC
6358 {"SC_MAC", _SC_MAC},
6359#endif
Fred Drakec9680921999-12-13 16:37:25 +00006360#ifdef _SC_MAPPED_FILES
6361 {"SC_MAPPED_FILES", _SC_MAPPED_FILES},
6362#endif
6363#ifdef _SC_MAXPID
6364 {"SC_MAXPID", _SC_MAXPID},
6365#endif
6366#ifdef _SC_MB_LEN_MAX
6367 {"SC_MB_LEN_MAX", _SC_MB_LEN_MAX},
6368#endif
6369#ifdef _SC_MEMLOCK
6370 {"SC_MEMLOCK", _SC_MEMLOCK},
6371#endif
6372#ifdef _SC_MEMLOCK_RANGE
6373 {"SC_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE},
6374#endif
6375#ifdef _SC_MEMORY_PROTECTION
6376 {"SC_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION},
6377#endif
6378#ifdef _SC_MESSAGE_PASSING
6379 {"SC_MESSAGE_PASSING", _SC_MESSAGE_PASSING},
6380#endif
Fred Draked86ed291999-12-15 15:34:33 +00006381#ifdef _SC_MMAP_FIXED_ALIGNMENT
6382 {"SC_MMAP_FIXED_ALIGNMENT", _SC_MMAP_FIXED_ALIGNMENT},
6383#endif
Fred Drakec9680921999-12-13 16:37:25 +00006384#ifdef _SC_MQ_OPEN_MAX
6385 {"SC_MQ_OPEN_MAX", _SC_MQ_OPEN_MAX},
6386#endif
6387#ifdef _SC_MQ_PRIO_MAX
6388 {"SC_MQ_PRIO_MAX", _SC_MQ_PRIO_MAX},
6389#endif
Fred Draked86ed291999-12-15 15:34:33 +00006390#ifdef _SC_NACLS_MAX
6391 {"SC_NACLS_MAX", _SC_NACLS_MAX},
6392#endif
Fred Drakec9680921999-12-13 16:37:25 +00006393#ifdef _SC_NGROUPS_MAX
6394 {"SC_NGROUPS_MAX", _SC_NGROUPS_MAX},
6395#endif
6396#ifdef _SC_NL_ARGMAX
6397 {"SC_NL_ARGMAX", _SC_NL_ARGMAX},
6398#endif
6399#ifdef _SC_NL_LANGMAX
6400 {"SC_NL_LANGMAX", _SC_NL_LANGMAX},
6401#endif
6402#ifdef _SC_NL_MSGMAX
6403 {"SC_NL_MSGMAX", _SC_NL_MSGMAX},
6404#endif
6405#ifdef _SC_NL_NMAX
6406 {"SC_NL_NMAX", _SC_NL_NMAX},
6407#endif
6408#ifdef _SC_NL_SETMAX
6409 {"SC_NL_SETMAX", _SC_NL_SETMAX},
6410#endif
6411#ifdef _SC_NL_TEXTMAX
6412 {"SC_NL_TEXTMAX", _SC_NL_TEXTMAX},
6413#endif
6414#ifdef _SC_NPROCESSORS_CONF
6415 {"SC_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF},
6416#endif
6417#ifdef _SC_NPROCESSORS_ONLN
6418 {"SC_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN},
6419#endif
Fred Draked86ed291999-12-15 15:34:33 +00006420#ifdef _SC_NPROC_CONF
6421 {"SC_NPROC_CONF", _SC_NPROC_CONF},
6422#endif
6423#ifdef _SC_NPROC_ONLN
6424 {"SC_NPROC_ONLN", _SC_NPROC_ONLN},
6425#endif
Fred Drakec9680921999-12-13 16:37:25 +00006426#ifdef _SC_NZERO
6427 {"SC_NZERO", _SC_NZERO},
6428#endif
6429#ifdef _SC_OPEN_MAX
6430 {"SC_OPEN_MAX", _SC_OPEN_MAX},
6431#endif
6432#ifdef _SC_PAGESIZE
6433 {"SC_PAGESIZE", _SC_PAGESIZE},
6434#endif
6435#ifdef _SC_PAGE_SIZE
6436 {"SC_PAGE_SIZE", _SC_PAGE_SIZE},
6437#endif
6438#ifdef _SC_PASS_MAX
6439 {"SC_PASS_MAX", _SC_PASS_MAX},
6440#endif
6441#ifdef _SC_PHYS_PAGES
6442 {"SC_PHYS_PAGES", _SC_PHYS_PAGES},
6443#endif
6444#ifdef _SC_PII
6445 {"SC_PII", _SC_PII},
6446#endif
6447#ifdef _SC_PII_INTERNET
6448 {"SC_PII_INTERNET", _SC_PII_INTERNET},
6449#endif
6450#ifdef _SC_PII_INTERNET_DGRAM
6451 {"SC_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM},
6452#endif
6453#ifdef _SC_PII_INTERNET_STREAM
6454 {"SC_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM},
6455#endif
6456#ifdef _SC_PII_OSI
6457 {"SC_PII_OSI", _SC_PII_OSI},
6458#endif
6459#ifdef _SC_PII_OSI_CLTS
6460 {"SC_PII_OSI_CLTS", _SC_PII_OSI_CLTS},
6461#endif
6462#ifdef _SC_PII_OSI_COTS
6463 {"SC_PII_OSI_COTS", _SC_PII_OSI_COTS},
6464#endif
6465#ifdef _SC_PII_OSI_M
6466 {"SC_PII_OSI_M", _SC_PII_OSI_M},
6467#endif
6468#ifdef _SC_PII_SOCKET
6469 {"SC_PII_SOCKET", _SC_PII_SOCKET},
6470#endif
6471#ifdef _SC_PII_XTI
6472 {"SC_PII_XTI", _SC_PII_XTI},
6473#endif
6474#ifdef _SC_POLL
6475 {"SC_POLL", _SC_POLL},
6476#endif
6477#ifdef _SC_PRIORITIZED_IO
6478 {"SC_PRIORITIZED_IO", _SC_PRIORITIZED_IO},
6479#endif
6480#ifdef _SC_PRIORITY_SCHEDULING
6481 {"SC_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING},
6482#endif
6483#ifdef _SC_REALTIME_SIGNALS
6484 {"SC_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS},
6485#endif
6486#ifdef _SC_RE_DUP_MAX
6487 {"SC_RE_DUP_MAX", _SC_RE_DUP_MAX},
6488#endif
6489#ifdef _SC_RTSIG_MAX
6490 {"SC_RTSIG_MAX", _SC_RTSIG_MAX},
6491#endif
6492#ifdef _SC_SAVED_IDS
6493 {"SC_SAVED_IDS", _SC_SAVED_IDS},
6494#endif
6495#ifdef _SC_SCHAR_MAX
6496 {"SC_SCHAR_MAX", _SC_SCHAR_MAX},
6497#endif
6498#ifdef _SC_SCHAR_MIN
6499 {"SC_SCHAR_MIN", _SC_SCHAR_MIN},
6500#endif
6501#ifdef _SC_SELECT
6502 {"SC_SELECT", _SC_SELECT},
6503#endif
6504#ifdef _SC_SEMAPHORES
6505 {"SC_SEMAPHORES", _SC_SEMAPHORES},
6506#endif
6507#ifdef _SC_SEM_NSEMS_MAX
6508 {"SC_SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX},
6509#endif
6510#ifdef _SC_SEM_VALUE_MAX
6511 {"SC_SEM_VALUE_MAX", _SC_SEM_VALUE_MAX},
6512#endif
6513#ifdef _SC_SHARED_MEMORY_OBJECTS
6514 {"SC_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS},
6515#endif
6516#ifdef _SC_SHRT_MAX
6517 {"SC_SHRT_MAX", _SC_SHRT_MAX},
6518#endif
6519#ifdef _SC_SHRT_MIN
6520 {"SC_SHRT_MIN", _SC_SHRT_MIN},
6521#endif
6522#ifdef _SC_SIGQUEUE_MAX
6523 {"SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX},
6524#endif
6525#ifdef _SC_SIGRT_MAX
6526 {"SC_SIGRT_MAX", _SC_SIGRT_MAX},
6527#endif
6528#ifdef _SC_SIGRT_MIN
6529 {"SC_SIGRT_MIN", _SC_SIGRT_MIN},
6530#endif
Fred Draked86ed291999-12-15 15:34:33 +00006531#ifdef _SC_SOFTPOWER
6532 {"SC_SOFTPOWER", _SC_SOFTPOWER},
6533#endif
Fred Drakec9680921999-12-13 16:37:25 +00006534#ifdef _SC_SPLIT_CACHE
6535 {"SC_SPLIT_CACHE", _SC_SPLIT_CACHE},
6536#endif
6537#ifdef _SC_SSIZE_MAX
6538 {"SC_SSIZE_MAX", _SC_SSIZE_MAX},
6539#endif
6540#ifdef _SC_STACK_PROT
6541 {"SC_STACK_PROT", _SC_STACK_PROT},
6542#endif
6543#ifdef _SC_STREAM_MAX
6544 {"SC_STREAM_MAX", _SC_STREAM_MAX},
6545#endif
6546#ifdef _SC_SYNCHRONIZED_IO
6547 {"SC_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO},
6548#endif
6549#ifdef _SC_THREADS
6550 {"SC_THREADS", _SC_THREADS},
6551#endif
6552#ifdef _SC_THREAD_ATTR_STACKADDR
6553 {"SC_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR},
6554#endif
6555#ifdef _SC_THREAD_ATTR_STACKSIZE
6556 {"SC_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE},
6557#endif
6558#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS
6559 {"SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS},
6560#endif
6561#ifdef _SC_THREAD_KEYS_MAX
6562 {"SC_THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX},
6563#endif
6564#ifdef _SC_THREAD_PRIORITY_SCHEDULING
6565 {"SC_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING},
6566#endif
6567#ifdef _SC_THREAD_PRIO_INHERIT
6568 {"SC_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT},
6569#endif
6570#ifdef _SC_THREAD_PRIO_PROTECT
6571 {"SC_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT},
6572#endif
6573#ifdef _SC_THREAD_PROCESS_SHARED
6574 {"SC_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED},
6575#endif
6576#ifdef _SC_THREAD_SAFE_FUNCTIONS
6577 {"SC_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS},
6578#endif
6579#ifdef _SC_THREAD_STACK_MIN
6580 {"SC_THREAD_STACK_MIN", _SC_THREAD_STACK_MIN},
6581#endif
6582#ifdef _SC_THREAD_THREADS_MAX
6583 {"SC_THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX},
6584#endif
6585#ifdef _SC_TIMERS
6586 {"SC_TIMERS", _SC_TIMERS},
6587#endif
6588#ifdef _SC_TIMER_MAX
6589 {"SC_TIMER_MAX", _SC_TIMER_MAX},
6590#endif
6591#ifdef _SC_TTY_NAME_MAX
6592 {"SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX},
6593#endif
6594#ifdef _SC_TZNAME_MAX
6595 {"SC_TZNAME_MAX", _SC_TZNAME_MAX},
6596#endif
6597#ifdef _SC_T_IOV_MAX
6598 {"SC_T_IOV_MAX", _SC_T_IOV_MAX},
6599#endif
6600#ifdef _SC_UCHAR_MAX
6601 {"SC_UCHAR_MAX", _SC_UCHAR_MAX},
6602#endif
6603#ifdef _SC_UINT_MAX
6604 {"SC_UINT_MAX", _SC_UINT_MAX},
6605#endif
6606#ifdef _SC_UIO_MAXIOV
6607 {"SC_UIO_MAXIOV", _SC_UIO_MAXIOV},
6608#endif
6609#ifdef _SC_ULONG_MAX
6610 {"SC_ULONG_MAX", _SC_ULONG_MAX},
6611#endif
6612#ifdef _SC_USHRT_MAX
6613 {"SC_USHRT_MAX", _SC_USHRT_MAX},
6614#endif
6615#ifdef _SC_VERSION
6616 {"SC_VERSION", _SC_VERSION},
6617#endif
6618#ifdef _SC_WORD_BIT
6619 {"SC_WORD_BIT", _SC_WORD_BIT},
6620#endif
6621#ifdef _SC_XBS5_ILP32_OFF32
6622 {"SC_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32},
6623#endif
6624#ifdef _SC_XBS5_ILP32_OFFBIG
6625 {"SC_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG},
6626#endif
6627#ifdef _SC_XBS5_LP64_OFF64
6628 {"SC_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64},
6629#endif
6630#ifdef _SC_XBS5_LPBIG_OFFBIG
6631 {"SC_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG},
6632#endif
6633#ifdef _SC_XOPEN_CRYPT
6634 {"SC_XOPEN_CRYPT", _SC_XOPEN_CRYPT},
6635#endif
6636#ifdef _SC_XOPEN_ENH_I18N
6637 {"SC_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N},
6638#endif
6639#ifdef _SC_XOPEN_LEGACY
6640 {"SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY},
6641#endif
6642#ifdef _SC_XOPEN_REALTIME
6643 {"SC_XOPEN_REALTIME", _SC_XOPEN_REALTIME},
6644#endif
6645#ifdef _SC_XOPEN_REALTIME_THREADS
6646 {"SC_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS},
6647#endif
6648#ifdef _SC_XOPEN_SHM
6649 {"SC_XOPEN_SHM", _SC_XOPEN_SHM},
6650#endif
6651#ifdef _SC_XOPEN_UNIX
6652 {"SC_XOPEN_UNIX", _SC_XOPEN_UNIX},
6653#endif
6654#ifdef _SC_XOPEN_VERSION
6655 {"SC_XOPEN_VERSION", _SC_XOPEN_VERSION},
6656#endif
6657#ifdef _SC_XOPEN_XCU_VERSION
6658 {"SC_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION},
6659#endif
6660#ifdef _SC_XOPEN_XPG2
6661 {"SC_XOPEN_XPG2", _SC_XOPEN_XPG2},
6662#endif
6663#ifdef _SC_XOPEN_XPG3
6664 {"SC_XOPEN_XPG3", _SC_XOPEN_XPG3},
6665#endif
6666#ifdef _SC_XOPEN_XPG4
6667 {"SC_XOPEN_XPG4", _SC_XOPEN_XPG4},
6668#endif
6669};
6670
6671static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006672conv_sysconf_confname(PyObject *arg, int *valuep)
Fred Drakec9680921999-12-13 16:37:25 +00006673{
6674 return conv_confname(arg, valuep, posix_constants_sysconf,
6675 sizeof(posix_constants_sysconf)
6676 / sizeof(struct constdef));
6677}
6678
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006679PyDoc_STRVAR(posix_sysconf__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00006680"sysconf(name) -> integer\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006681Return an integer-valued system configuration variable.");
Fred Drakec9680921999-12-13 16:37:25 +00006682
6683static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006684posix_sysconf(PyObject *self, PyObject *args)
Fred Drakec9680921999-12-13 16:37:25 +00006685{
6686 PyObject *result = NULL;
6687 int name;
6688
6689 if (PyArg_ParseTuple(args, "O&:sysconf", conv_sysconf_confname, &name)) {
6690 int value;
6691
6692 errno = 0;
6693 value = sysconf(name);
6694 if (value == -1 && errno != 0)
6695 posix_error();
6696 else
Christian Heimes217cfd12007-12-02 14:31:20 +00006697 result = PyLong_FromLong(value);
Fred Drakec9680921999-12-13 16:37:25 +00006698 }
6699 return result;
6700}
6701#endif
6702
6703
Fred Drakebec628d1999-12-15 18:31:10 +00006704/* This code is used to ensure that the tables of configuration value names
6705 * are in sorted order as required by conv_confname(), and also to build the
6706 * the exported dictionaries that are used to publish information about the
6707 * names available on the host platform.
6708 *
6709 * Sorting the table at runtime ensures that the table is properly ordered
6710 * when used, even for platforms we're not able to test on. It also makes
6711 * it easier to add additional entries to the tables.
Fred Draked86ed291999-12-15 15:34:33 +00006712 */
Fred Drakebec628d1999-12-15 18:31:10 +00006713
6714static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006715cmp_constdefs(const void *v1, const void *v2)
Fred Drakebec628d1999-12-15 18:31:10 +00006716{
6717 const struct constdef *c1 =
6718 (const struct constdef *) v1;
6719 const struct constdef *c2 =
6720 (const struct constdef *) v2;
6721
6722 return strcmp(c1->name, c2->name);
6723}
6724
6725static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006726setup_confname_table(struct constdef *table, size_t tablesize,
Fred Drake4d1e64b2002-04-15 19:40:07 +00006727 char *tablename, PyObject *module)
Fred Draked86ed291999-12-15 15:34:33 +00006728{
Fred Drakebec628d1999-12-15 18:31:10 +00006729 PyObject *d = NULL;
Barry Warsaw3155db32000-04-13 15:20:40 +00006730 size_t i;
Fred Drakebec628d1999-12-15 18:31:10 +00006731
6732 qsort(table, tablesize, sizeof(struct constdef), cmp_constdefs);
6733 d = PyDict_New();
Barry Warsaw3155db32000-04-13 15:20:40 +00006734 if (d == NULL)
6735 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00006736
Barry Warsaw3155db32000-04-13 15:20:40 +00006737 for (i=0; i < tablesize; ++i) {
Christian Heimes217cfd12007-12-02 14:31:20 +00006738 PyObject *o = PyLong_FromLong(table[i].value);
Barry Warsaw3155db32000-04-13 15:20:40 +00006739 if (o == NULL || PyDict_SetItemString(d, table[i].name, o) == -1) {
6740 Py_XDECREF(o);
6741 Py_DECREF(d);
6742 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00006743 }
Barry Warsaw3155db32000-04-13 15:20:40 +00006744 Py_DECREF(o);
Fred Draked86ed291999-12-15 15:34:33 +00006745 }
Fred Drake4d1e64b2002-04-15 19:40:07 +00006746 return PyModule_AddObject(module, tablename, d);
Fred Draked86ed291999-12-15 15:34:33 +00006747}
6748
Fred Drakebec628d1999-12-15 18:31:10 +00006749/* Return -1 on failure, 0 on success. */
6750static int
Fred Drake4d1e64b2002-04-15 19:40:07 +00006751setup_confname_tables(PyObject *module)
Fred Draked86ed291999-12-15 15:34:33 +00006752{
6753#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
Fred Drakebec628d1999-12-15 18:31:10 +00006754 if (setup_confname_table(posix_constants_pathconf,
Fred Draked86ed291999-12-15 15:34:33 +00006755 sizeof(posix_constants_pathconf)
6756 / sizeof(struct constdef),
Fred Drake4d1e64b2002-04-15 19:40:07 +00006757 "pathconf_names", module))
Fred Drakebec628d1999-12-15 18:31:10 +00006758 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00006759#endif
6760#ifdef HAVE_CONFSTR
Fred Drakebec628d1999-12-15 18:31:10 +00006761 if (setup_confname_table(posix_constants_confstr,
Fred Draked86ed291999-12-15 15:34:33 +00006762 sizeof(posix_constants_confstr)
6763 / sizeof(struct constdef),
Fred Drake4d1e64b2002-04-15 19:40:07 +00006764 "confstr_names", module))
Fred Drakebec628d1999-12-15 18:31:10 +00006765 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00006766#endif
6767#ifdef HAVE_SYSCONF
Fred Drakebec628d1999-12-15 18:31:10 +00006768 if (setup_confname_table(posix_constants_sysconf,
Fred Draked86ed291999-12-15 15:34:33 +00006769 sizeof(posix_constants_sysconf)
6770 / sizeof(struct constdef),
Fred Drake4d1e64b2002-04-15 19:40:07 +00006771 "sysconf_names", module))
Fred Drakebec628d1999-12-15 18:31:10 +00006772 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00006773#endif
Fred Drakebec628d1999-12-15 18:31:10 +00006774 return 0;
Fred Draked86ed291999-12-15 15:34:33 +00006775}
Fred Draked86ed291999-12-15 15:34:33 +00006776
6777
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006778PyDoc_STRVAR(posix_abort__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00006779"abort() -> does not return!\n\n\
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006780Abort the interpreter immediately. This 'dumps core' or otherwise fails\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006781in the hardest way possible on the hosting operating system.");
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006782
6783static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00006784posix_abort(PyObject *self, PyObject *noargs)
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006785{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006786 abort();
6787 /*NOTREACHED*/
6788 Py_FatalError("abort() called from Python code didn't abort!");
6789 return NULL;
6790}
Fred Drakebec628d1999-12-15 18:31:10 +00006791
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00006792#ifdef MS_WINDOWS
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006793PyDoc_STRVAR(win32_startfile__doc__,
Georg Brandlf4f44152006-02-18 22:29:33 +00006794"startfile(filepath [, operation]) - Start a file with its associated\n\
6795application.\n\
Tim Petersf58a7aa2000-09-22 10:05:54 +00006796\n\
Georg Brandlf4f44152006-02-18 22:29:33 +00006797When \"operation\" is not specified or \"open\", this acts like\n\
6798double-clicking the file in Explorer, or giving the file name as an\n\
6799argument to the DOS \"start\" command: the file is opened with whatever\n\
6800application (if any) its extension is associated.\n\
6801When another \"operation\" is given, it specifies what should be done with\n\
6802the file. A typical operation is \"print\".\n\
Tim Petersf58a7aa2000-09-22 10:05:54 +00006803\n\
6804startfile returns as soon as the associated application is launched.\n\
6805There is no option to wait for the application to close, and no way\n\
6806to retrieve the application's exit status.\n\
6807\n\
6808The filepath is relative to the current directory. If you want to use\n\
6809an absolute path, make sure the first character is not a slash (\"/\");\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006810the underlying Win32 ShellExecute function doesn't work if it is.");
Tim Petersf58a7aa2000-09-22 10:05:54 +00006811
6812static PyObject *
6813win32_startfile(PyObject *self, PyObject *args)
6814{
Martin v. Löwis011e8422009-05-05 04:43:17 +00006815 PyObject *ofilepath;
Tim Petersf58a7aa2000-09-22 10:05:54 +00006816 char *filepath;
Georg Brandlf4f44152006-02-18 22:29:33 +00006817 char *operation = NULL;
Tim Petersf58a7aa2000-09-22 10:05:54 +00006818 HINSTANCE rc;
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00006819
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00006820 PyObject *unipath, *woperation = NULL;
6821 if (!PyArg_ParseTuple(args, "U|s:startfile",
6822 &unipath, &operation)) {
6823 PyErr_Clear();
6824 goto normal;
6825 }
6826
6827 if (operation) {
6828 woperation = PyUnicode_DecodeASCII(operation,
6829 strlen(operation), NULL);
6830 if (!woperation) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006831 PyErr_Clear();
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00006832 operation = NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006833 goto normal;
6834 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006835 }
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00006836
6837 Py_BEGIN_ALLOW_THREADS
6838 rc = ShellExecuteW((HWND)0, woperation ? PyUnicode_AS_UNICODE(woperation) : 0,
6839 PyUnicode_AS_UNICODE(unipath),
6840 NULL, NULL, SW_SHOWNORMAL);
6841 Py_END_ALLOW_THREADS
6842
6843 Py_XDECREF(woperation);
6844 if (rc <= (HINSTANCE)32) {
6845 PyObject *errval = win32_error_unicode("startfile",
6846 PyUnicode_AS_UNICODE(unipath));
6847 return errval;
6848 }
6849 Py_INCREF(Py_None);
6850 return Py_None;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006851
6852normal:
Martin v. Löwis011e8422009-05-05 04:43:17 +00006853 if (!PyArg_ParseTuple(args, "O&|s:startfile",
6854 PyUnicode_FSConverter, &ofilepath,
Georg Brandlf4f44152006-02-18 22:29:33 +00006855 &operation))
Tim Petersf58a7aa2000-09-22 10:05:54 +00006856 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00006857 filepath = bytes2str(ofilepath, 1);
Tim Petersf58a7aa2000-09-22 10:05:54 +00006858 Py_BEGIN_ALLOW_THREADS
Georg Brandlf4f44152006-02-18 22:29:33 +00006859 rc = ShellExecute((HWND)0, operation, filepath,
6860 NULL, NULL, SW_SHOWNORMAL);
Tim Petersf58a7aa2000-09-22 10:05:54 +00006861 Py_END_ALLOW_THREADS
Georg Brandle9f8ec92005-09-25 06:16:40 +00006862 if (rc <= (HINSTANCE)32) {
6863 PyObject *errval = win32_error("startfile", filepath);
Martin v. Löwis011e8422009-05-05 04:43:17 +00006864 release_bytes(ofilepath);
Georg Brandle9f8ec92005-09-25 06:16:40 +00006865 return errval;
6866 }
Martin v. Löwis011e8422009-05-05 04:43:17 +00006867 release_bytes(ofilepath);
Tim Petersf58a7aa2000-09-22 10:05:54 +00006868 Py_INCREF(Py_None);
6869 return Py_None;
6870}
6871#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006872
Martin v. Löwis438b5342002-12-27 10:16:42 +00006873#ifdef HAVE_GETLOADAVG
6874PyDoc_STRVAR(posix_getloadavg__doc__,
6875"getloadavg() -> (float, float, float)\n\n\
6876Return the number of processes in the system run queue averaged over\n\
6877the last 1, 5, and 15 minutes or raises OSError if the load average\n\
6878was unobtainable");
6879
6880static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00006881posix_getloadavg(PyObject *self, PyObject *noargs)
Martin v. Löwis438b5342002-12-27 10:16:42 +00006882{
6883 double loadavg[3];
Martin v. Löwis438b5342002-12-27 10:16:42 +00006884 if (getloadavg(loadavg, 3)!=3) {
6885 PyErr_SetString(PyExc_OSError, "Load averages are unobtainable");
6886 return NULL;
6887 } else
6888 return Py_BuildValue("ddd", loadavg[0], loadavg[1], loadavg[2]);
6889}
6890#endif
6891
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006892#ifdef MS_WINDOWS
6893
6894PyDoc_STRVAR(win32_urandom__doc__,
6895"urandom(n) -> str\n\n\
Neal Norwitz93c56822007-08-26 07:10:06 +00006896Return n random bytes suitable for cryptographic use.");
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006897
6898typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\
6899 LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\
6900 DWORD dwFlags );
6901typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\
6902 BYTE *pbBuffer );
6903
6904static CRYPTGENRANDOM pCryptGenRandom = NULL;
Thomas Wouters89d996e2007-09-08 17:39:28 +00006905/* This handle is never explicitly released. Instead, the operating
6906 system will release it when the process terminates. */
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006907static HCRYPTPROV hCryptProv = 0;
6908
Tim Peters4ad82172004-08-30 17:02:04 +00006909static PyObject*
6910win32_urandom(PyObject *self, PyObject *args)
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006911{
Tim Petersd3115382004-08-30 17:36:46 +00006912 int howMany;
6913 PyObject* result;
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006914
Tim Peters4ad82172004-08-30 17:02:04 +00006915 /* Read arguments */
Tim Peters9b279a82004-08-30 17:10:53 +00006916 if (! PyArg_ParseTuple(args, "i:urandom", &howMany))
Tim Peters4ad82172004-08-30 17:02:04 +00006917 return NULL;
Tim Peters51eba612004-08-30 17:08:02 +00006918 if (howMany < 0)
6919 return PyErr_Format(PyExc_ValueError,
6920 "negative argument not allowed");
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006921
Tim Peters4ad82172004-08-30 17:02:04 +00006922 if (hCryptProv == 0) {
6923 HINSTANCE hAdvAPI32 = NULL;
6924 CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL;
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006925
Tim Peters4ad82172004-08-30 17:02:04 +00006926 /* Obtain handle to the DLL containing CryptoAPI
6927 This should not fail */
6928 hAdvAPI32 = GetModuleHandle("advapi32.dll");
6929 if(hAdvAPI32 == NULL)
6930 return win32_error("GetModuleHandle", NULL);
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006931
Tim Peters4ad82172004-08-30 17:02:04 +00006932 /* Obtain pointers to the CryptoAPI functions
6933 This will fail on some early versions of Win95 */
6934 pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress(
6935 hAdvAPI32,
6936 "CryptAcquireContextA");
6937 if (pCryptAcquireContext == NULL)
6938 return PyErr_Format(PyExc_NotImplementedError,
6939 "CryptAcquireContextA not found");
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006940
Tim Peters4ad82172004-08-30 17:02:04 +00006941 pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress(
6942 hAdvAPI32, "CryptGenRandom");
Thomas Wouters89f507f2006-12-13 04:49:30 +00006943 if (pCryptGenRandom == NULL)
Tim Peters4ad82172004-08-30 17:02:04 +00006944 return PyErr_Format(PyExc_NotImplementedError,
6945 "CryptGenRandom not found");
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006946
Tim Peters4ad82172004-08-30 17:02:04 +00006947 /* Acquire context */
6948 if (! pCryptAcquireContext(&hCryptProv, NULL, NULL,
6949 PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
6950 return win32_error("CryptAcquireContext", NULL);
6951 }
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006952
Tim Peters4ad82172004-08-30 17:02:04 +00006953 /* Allocate bytes */
Christian Heimes72b710a2008-05-26 13:28:38 +00006954 result = PyBytes_FromStringAndSize(NULL, howMany);
Tim Petersd3115382004-08-30 17:36:46 +00006955 if (result != NULL) {
6956 /* Get random data */
Amaury Forgeot d'Arca05ada32008-07-21 21:13:14 +00006957 memset(PyBytes_AS_STRING(result), 0, howMany); /* zero seed */
Tim Petersd3115382004-08-30 17:36:46 +00006958 if (! pCryptGenRandom(hCryptProv, howMany, (unsigned char*)
Christian Heimes72b710a2008-05-26 13:28:38 +00006959 PyBytes_AS_STRING(result))) {
Tim Petersd3115382004-08-30 17:36:46 +00006960 Py_DECREF(result);
6961 return win32_error("CryptGenRandom", NULL);
6962 }
Tim Peters4ad82172004-08-30 17:02:04 +00006963 }
Tim Petersd3115382004-08-30 17:36:46 +00006964 return result;
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006965}
6966#endif
Martin v. Löwis438b5342002-12-27 10:16:42 +00006967
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00006968PyDoc_STRVAR(device_encoding__doc__,
6969"device_encoding(fd) -> str\n\n\
6970Return a string describing the encoding of the device\n\
6971if the output is a terminal; else return None.");
6972
6973static PyObject *
6974device_encoding(PyObject *self, PyObject *args)
6975{
6976 int fd;
6977 if (!PyArg_ParseTuple(args, "i:device_encoding", &fd))
6978 return NULL;
Kristján Valur Jónsson649170b2009-03-24 14:15:49 +00006979 if (!_PyVerify_fd(fd) || !isatty(fd)) {
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00006980 Py_INCREF(Py_None);
6981 return Py_None;
6982 }
6983#if defined(MS_WINDOWS) || defined(MS_WIN64)
6984 if (fd == 0) {
6985 char buf[100];
6986 sprintf(buf, "cp%d", GetConsoleCP());
6987 return PyUnicode_FromString(buf);
6988 }
6989 if (fd == 1 || fd == 2) {
6990 char buf[100];
6991 sprintf(buf, "cp%d", GetConsoleOutputCP());
6992 return PyUnicode_FromString(buf);
6993 }
6994#elif defined(CODESET)
6995 {
6996 char *codeset = nl_langinfo(CODESET);
Mark Dickinsonda2706b2008-12-11 18:03:03 +00006997 if (codeset != NULL && codeset[0] != 0)
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00006998 return PyUnicode_FromString(codeset);
6999 }
7000#endif
7001 Py_INCREF(Py_None);
7002 return Py_None;
7003}
7004
Thomas Wouters0e3f5912006-08-11 14:57:12 +00007005#ifdef __VMS
7006/* Use openssl random routine */
7007#include <openssl/rand.h>
7008PyDoc_STRVAR(vms_urandom__doc__,
7009"urandom(n) -> str\n\n\
Neal Norwitz93c56822007-08-26 07:10:06 +00007010Return n random bytes suitable for cryptographic use.");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00007011
7012static PyObject*
7013vms_urandom(PyObject *self, PyObject *args)
7014{
7015 int howMany;
7016 PyObject* result;
7017
7018 /* Read arguments */
7019 if (! PyArg_ParseTuple(args, "i:urandom", &howMany))
7020 return NULL;
7021 if (howMany < 0)
7022 return PyErr_Format(PyExc_ValueError,
7023 "negative argument not allowed");
7024
7025 /* Allocate bytes */
Christian Heimes72b710a2008-05-26 13:28:38 +00007026 result = PyBytes_FromStringAndSize(NULL, howMany);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00007027 if (result != NULL) {
7028 /* Get random data */
7029 if (RAND_pseudo_bytes((unsigned char*)
Christian Heimes72b710a2008-05-26 13:28:38 +00007030 PyBytes_AS_STRING(result),
Thomas Wouters0e3f5912006-08-11 14:57:12 +00007031 howMany) < 0) {
7032 Py_DECREF(result);
7033 return PyErr_Format(PyExc_ValueError,
7034 "RAND_pseudo_bytes");
7035 }
7036 }
7037 return result;
7038}
7039#endif
7040
Martin v. Löwis7aed61a2009-11-27 14:09:49 +00007041#ifdef HAVE_SETRESUID
7042PyDoc_STRVAR(posix_setresuid__doc__,
7043"setresuid(ruid, euid, suid)\n\n\
7044Set the current process's real, effective, and saved user ids.");
7045
7046static PyObject*
7047posix_setresuid (PyObject *self, PyObject *args)
7048{
7049 /* We assume uid_t is no larger than a long. */
7050 long ruid, euid, suid;
7051 if (!PyArg_ParseTuple(args, "lll", &ruid, &euid, &suid))
7052 return NULL;
7053 if (setresuid(ruid, euid, suid) < 0)
7054 return posix_error();
7055 Py_RETURN_NONE;
7056}
7057#endif
7058
7059#ifdef HAVE_SETRESGID
7060PyDoc_STRVAR(posix_setresgid__doc__,
7061"setresgid(rgid, egid, sgid)\n\n\
7062Set the current process's real, effective, and saved group ids.");
7063
7064static PyObject*
7065posix_setresgid (PyObject *self, PyObject *args)
7066{
7067 /* We assume uid_t is no larger than a long. */
7068 long rgid, egid, sgid;
7069 if (!PyArg_ParseTuple(args, "lll", &rgid, &egid, &sgid))
7070 return NULL;
7071 if (setresgid(rgid, egid, sgid) < 0)
7072 return posix_error();
7073 Py_RETURN_NONE;
7074}
7075#endif
7076
7077#ifdef HAVE_GETRESUID
7078PyDoc_STRVAR(posix_getresuid__doc__,
7079"getresuid() -> (ruid, euid, suid)\n\n\
7080Get tuple of the current process's real, effective, and saved user ids.");
7081
7082static PyObject*
7083posix_getresuid (PyObject *self, PyObject *noargs)
7084{
7085 uid_t ruid, euid, suid;
7086 long l_ruid, l_euid, l_suid;
7087 if (getresuid(&ruid, &euid, &suid) < 0)
7088 return posix_error();
7089 /* Force the values into long's as we don't know the size of uid_t. */
7090 l_ruid = ruid;
7091 l_euid = euid;
7092 l_suid = suid;
7093 return Py_BuildValue("(lll)", l_ruid, l_euid, l_suid);
7094}
7095#endif
7096
7097#ifdef HAVE_GETRESGID
7098PyDoc_STRVAR(posix_getresgid__doc__,
7099"getresgid() -> (rgid, egid, sgid)\n\n\
7100Get tuple of the current process's real, effective, and saved user ids.");
7101
7102static PyObject*
7103posix_getresgid (PyObject *self, PyObject *noargs)
7104{
7105 uid_t rgid, egid, sgid;
7106 long l_rgid, l_egid, l_sgid;
7107 if (getresgid(&rgid, &egid, &sgid) < 0)
7108 return posix_error();
7109 /* Force the values into long's as we don't know the size of uid_t. */
7110 l_rgid = rgid;
7111 l_egid = egid;
7112 l_sgid = sgid;
7113 return Py_BuildValue("(lll)", l_rgid, l_egid, l_sgid);
7114}
7115#endif
7116
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007117static PyMethodDef posix_methods[] = {
7118 {"access", posix_access, METH_VARARGS, posix_access__doc__},
7119#ifdef HAVE_TTYNAME
7120 {"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__},
7121#endif
7122 {"chdir", posix_chdir, METH_VARARGS, posix_chdir__doc__},
Thomas Wouterscf297e42007-02-23 15:07:44 +00007123#ifdef HAVE_CHFLAGS
7124 {"chflags", posix_chflags, METH_VARARGS, posix_chflags__doc__},
7125#endif /* HAVE_CHFLAGS */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007126 {"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__},
Christian Heimes4e30a842007-11-30 22:12:06 +00007127#ifdef HAVE_FCHMOD
7128 {"fchmod", posix_fchmod, METH_VARARGS, posix_fchmod__doc__},
7129#endif /* HAVE_FCHMOD */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007130#ifdef HAVE_CHOWN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007131 {"chown", posix_chown, METH_VARARGS, posix_chown__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007132#endif /* HAVE_CHOWN */
Christian Heimes4e30a842007-11-30 22:12:06 +00007133#ifdef HAVE_LCHMOD
7134 {"lchmod", posix_lchmod, METH_VARARGS, posix_lchmod__doc__},
7135#endif /* HAVE_LCHMOD */
7136#ifdef HAVE_FCHOWN
7137 {"fchown", posix_fchown, METH_VARARGS, posix_fchown__doc__},
7138#endif /* HAVE_FCHOWN */
Thomas Wouterscf297e42007-02-23 15:07:44 +00007139#ifdef HAVE_LCHFLAGS
7140 {"lchflags", posix_lchflags, METH_VARARGS, posix_lchflags__doc__},
7141#endif /* HAVE_LCHFLAGS */
Martin v. Löwis0cec0ff2002-07-28 16:33:45 +00007142#ifdef HAVE_LCHOWN
7143 {"lchown", posix_lchown, METH_VARARGS, posix_lchown__doc__},
7144#endif /* HAVE_LCHOWN */
Martin v. Löwis244edc82001-10-04 22:44:26 +00007145#ifdef HAVE_CHROOT
7146 {"chroot", posix_chroot, METH_VARARGS, posix_chroot__doc__},
7147#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007148#ifdef HAVE_CTERMID
Neal Norwitze241ce82003-02-17 18:17:05 +00007149 {"ctermid", posix_ctermid, METH_NOARGS, posix_ctermid__doc__},
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007150#endif
Guido van Rossum36bc6801995-06-14 22:54:23 +00007151#ifdef HAVE_GETCWD
Guido van Rossumf0af3e32008-10-02 18:55:37 +00007152 {"getcwd", (PyCFunction)posix_getcwd_unicode,
7153 METH_NOARGS, posix_getcwd__doc__},
7154 {"getcwdb", (PyCFunction)posix_getcwd_bytes,
7155 METH_NOARGS, posix_getcwdb__doc__},
Guido van Rossum36bc6801995-06-14 22:54:23 +00007156#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00007157#ifdef HAVE_LINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007158 {"link", posix_link, METH_VARARGS, posix_link__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007159#endif /* HAVE_LINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007160 {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__},
7161 {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__},
7162 {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007163#ifdef HAVE_NICE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007164 {"nice", posix_nice, METH_VARARGS, posix_nice__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007165#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007166#ifdef HAVE_READLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007167 {"readlink", posix_readlink, METH_VARARGS, posix_readlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007168#endif /* HAVE_READLINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007169 {"rename", posix_rename, METH_VARARGS, posix_rename__doc__},
7170 {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__},
7171 {"stat", posix_stat, METH_VARARGS, posix_stat__doc__},
Martin v. Löwisf607bda2002-10-16 18:27:39 +00007172 {"stat_float_times", stat_float_times, METH_VARARGS, stat_float_times__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007173#ifdef HAVE_SYMLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007174 {"symlink", posix_symlink, METH_VARARGS, posix_symlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007175#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007176#ifdef HAVE_SYSTEM
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007177 {"system", posix_system, METH_VARARGS, posix_system__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007178#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007179 {"umask", posix_umask, METH_VARARGS, posix_umask__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007180#ifdef HAVE_UNAME
Neal Norwitze241ce82003-02-17 18:17:05 +00007181 {"uname", posix_uname, METH_NOARGS, posix_uname__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007182#endif /* HAVE_UNAME */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007183 {"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__},
7184 {"remove", posix_unlink, METH_VARARGS, posix_remove__doc__},
7185 {"utime", posix_utime, METH_VARARGS, posix_utime__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007186#ifdef HAVE_TIMES
Neal Norwitze241ce82003-02-17 18:17:05 +00007187 {"times", posix_times, METH_NOARGS, posix_times__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007188#endif /* HAVE_TIMES */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007189 {"_exit", posix__exit, METH_VARARGS, posix__exit__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007190#ifdef HAVE_EXECV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007191 {"execv", posix_execv, METH_VARARGS, posix_execv__doc__},
7192 {"execve", posix_execve, METH_VARARGS, posix_execve__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007193#endif /* HAVE_EXECV */
Guido van Rossuma1065681999-01-25 23:20:23 +00007194#ifdef HAVE_SPAWNV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007195 {"spawnv", posix_spawnv, METH_VARARGS, posix_spawnv__doc__},
7196 {"spawnve", posix_spawnve, METH_VARARGS, posix_spawnve__doc__},
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00007197#if defined(PYOS_OS2)
7198 {"spawnvp", posix_spawnvp, METH_VARARGS, posix_spawnvp__doc__},
7199 {"spawnvpe", posix_spawnvpe, METH_VARARGS, posix_spawnvpe__doc__},
7200#endif /* PYOS_OS2 */
Guido van Rossuma1065681999-01-25 23:20:23 +00007201#endif /* HAVE_SPAWNV */
Guido van Rossum2242f2f2001-04-11 20:58:20 +00007202#ifdef HAVE_FORK1
Neal Norwitze241ce82003-02-17 18:17:05 +00007203 {"fork1", posix_fork1, METH_NOARGS, posix_fork1__doc__},
Guido van Rossum2242f2f2001-04-11 20:58:20 +00007204#endif /* HAVE_FORK1 */
Guido van Rossumad0ee831995-03-01 10:34:45 +00007205#ifdef HAVE_FORK
Neal Norwitze241ce82003-02-17 18:17:05 +00007206 {"fork", posix_fork, METH_NOARGS, posix_fork__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007207#endif /* HAVE_FORK */
Martin v. Löwis24a880b2002-12-31 12:55:15 +00007208#if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX)
Neal Norwitze241ce82003-02-17 18:17:05 +00007209 {"openpty", posix_openpty, METH_NOARGS, posix_openpty__doc__},
Martin v. Löwis24a880b2002-12-31 12:55:15 +00007210#endif /* HAVE_OPENPTY || HAVE__GETPTY || HAVE_DEV_PTMX */
Fred Drake8cef4cf2000-06-28 16:40:38 +00007211#ifdef HAVE_FORKPTY
Neal Norwitze241ce82003-02-17 18:17:05 +00007212 {"forkpty", posix_forkpty, METH_NOARGS, posix_forkpty__doc__},
Fred Drake8cef4cf2000-06-28 16:40:38 +00007213#endif /* HAVE_FORKPTY */
Guido van Rossumad0ee831995-03-01 10:34:45 +00007214#ifdef HAVE_GETEGID
Neal Norwitze241ce82003-02-17 18:17:05 +00007215 {"getegid", posix_getegid, METH_NOARGS, posix_getegid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007216#endif /* HAVE_GETEGID */
7217#ifdef HAVE_GETEUID
Neal Norwitze241ce82003-02-17 18:17:05 +00007218 {"geteuid", posix_geteuid, METH_NOARGS, posix_geteuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007219#endif /* HAVE_GETEUID */
7220#ifdef HAVE_GETGID
Neal Norwitze241ce82003-02-17 18:17:05 +00007221 {"getgid", posix_getgid, METH_NOARGS, posix_getgid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007222#endif /* HAVE_GETGID */
Fred Drakec9680921999-12-13 16:37:25 +00007223#ifdef HAVE_GETGROUPS
Neal Norwitze241ce82003-02-17 18:17:05 +00007224 {"getgroups", posix_getgroups, METH_NOARGS, posix_getgroups__doc__},
Fred Drakec9680921999-12-13 16:37:25 +00007225#endif
Neal Norwitze241ce82003-02-17 18:17:05 +00007226 {"getpid", posix_getpid, METH_NOARGS, posix_getpid__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007227#ifdef HAVE_GETPGRP
Neal Norwitze241ce82003-02-17 18:17:05 +00007228 {"getpgrp", posix_getpgrp, METH_NOARGS, posix_getpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007229#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00007230#ifdef HAVE_GETPPID
Neal Norwitze241ce82003-02-17 18:17:05 +00007231 {"getppid", posix_getppid, METH_NOARGS, posix_getppid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007232#endif /* HAVE_GETPPID */
7233#ifdef HAVE_GETUID
Neal Norwitze241ce82003-02-17 18:17:05 +00007234 {"getuid", posix_getuid, METH_NOARGS, posix_getuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007235#endif /* HAVE_GETUID */
Fred Drake12c6e2d1999-12-14 21:25:03 +00007236#ifdef HAVE_GETLOGIN
Neal Norwitze241ce82003-02-17 18:17:05 +00007237 {"getlogin", posix_getlogin, METH_NOARGS, posix_getlogin__doc__},
Fred Drake12c6e2d1999-12-14 21:25:03 +00007238#endif
Guido van Rossumad0ee831995-03-01 10:34:45 +00007239#ifdef HAVE_KILL
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007240 {"kill", posix_kill, METH_VARARGS, posix_kill__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007241#endif /* HAVE_KILL */
Martin v. Löwisb2c92f42002-02-16 23:35:41 +00007242#ifdef HAVE_KILLPG
7243 {"killpg", posix_killpg, METH_VARARGS, posix_killpg__doc__},
7244#endif /* HAVE_KILLPG */
Guido van Rossumc0125471996-06-28 18:55:32 +00007245#ifdef HAVE_PLOCK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007246 {"plock", posix_plock, METH_VARARGS, posix_plock__doc__},
Guido van Rossumc0125471996-06-28 18:55:32 +00007247#endif /* HAVE_PLOCK */
Thomas Heller8b7a9572007-08-31 06:44:36 +00007248#ifdef MS_WINDOWS
7249 {"startfile", win32_startfile, METH_VARARGS, win32_startfile__doc__},
Brian Curtineb24d742010-04-12 17:16:38 +00007250 {"kill", win32_kill, METH_VARARGS, win32_kill__doc__},
Thomas Heller8b7a9572007-08-31 06:44:36 +00007251#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00007252#ifdef HAVE_SETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007253 {"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007254#endif /* HAVE_SETUID */
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00007255#ifdef HAVE_SETEUID
7256 {"seteuid", posix_seteuid, METH_VARARGS, posix_seteuid__doc__},
7257#endif /* HAVE_SETEUID */
7258#ifdef HAVE_SETEGID
7259 {"setegid", posix_setegid, METH_VARARGS, posix_setegid__doc__},
7260#endif /* HAVE_SETEGID */
7261#ifdef HAVE_SETREUID
7262 {"setreuid", posix_setreuid, METH_VARARGS, posix_setreuid__doc__},
7263#endif /* HAVE_SETREUID */
7264#ifdef HAVE_SETREGID
7265 {"setregid", posix_setregid, METH_VARARGS, posix_setregid__doc__},
7266#endif /* HAVE_SETREGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007267#ifdef HAVE_SETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007268 {"setgid", posix_setgid, METH_VARARGS, posix_setgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007269#endif /* HAVE_SETGID */
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00007270#ifdef HAVE_SETGROUPS
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00007271 {"setgroups", posix_setgroups, METH_O, posix_setgroups__doc__},
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00007272#endif /* HAVE_SETGROUPS */
Antoine Pitroub7572f02009-12-02 20:46:48 +00007273#ifdef HAVE_INITGROUPS
7274 {"initgroups", posix_initgroups, METH_VARARGS, posix_initgroups__doc__},
7275#endif /* HAVE_INITGROUPS */
Martin v. Löwis606edc12002-06-13 21:09:11 +00007276#ifdef HAVE_GETPGID
7277 {"getpgid", posix_getpgid, METH_VARARGS, posix_getpgid__doc__},
7278#endif /* HAVE_GETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007279#ifdef HAVE_SETPGRP
Neal Norwitze241ce82003-02-17 18:17:05 +00007280 {"setpgrp", posix_setpgrp, METH_NOARGS, posix_setpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007281#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00007282#ifdef HAVE_WAIT
Neal Norwitze241ce82003-02-17 18:17:05 +00007283 {"wait", posix_wait, METH_NOARGS, posix_wait__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007284#endif /* HAVE_WAIT */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007285#ifdef HAVE_WAIT3
7286 {"wait3", posix_wait3, METH_VARARGS, posix_wait3__doc__},
7287#endif /* HAVE_WAIT3 */
7288#ifdef HAVE_WAIT4
7289 {"wait4", posix_wait4, METH_VARARGS, posix_wait4__doc__},
7290#endif /* HAVE_WAIT4 */
Tim Petersab034fa2002-02-01 11:27:43 +00007291#if defined(HAVE_WAITPID) || defined(HAVE_CWAIT)
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007292 {"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007293#endif /* HAVE_WAITPID */
Martin v. Löwis49ee14d2003-11-10 06:35:36 +00007294#ifdef HAVE_GETSID
7295 {"getsid", posix_getsid, METH_VARARGS, posix_getsid__doc__},
7296#endif /* HAVE_GETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007297#ifdef HAVE_SETSID
Neal Norwitze241ce82003-02-17 18:17:05 +00007298 {"setsid", posix_setsid, METH_NOARGS, posix_setsid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007299#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007300#ifdef HAVE_SETPGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007301 {"setpgid", posix_setpgid, METH_VARARGS, posix_setpgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007302#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007303#ifdef HAVE_TCGETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007304 {"tcgetpgrp", posix_tcgetpgrp, METH_VARARGS, posix_tcgetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007305#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007306#ifdef HAVE_TCSETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007307 {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007308#endif /* HAVE_TCSETPGRP */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007309 {"open", posix_open, METH_VARARGS, posix_open__doc__},
7310 {"close", posix_close, METH_VARARGS, posix_close__doc__},
Christian Heimesfdab48e2008-01-20 09:06:41 +00007311 {"closerange", posix_closerange, METH_VARARGS, posix_closerange__doc__},
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00007312 {"device_encoding", device_encoding, METH_VARARGS, device_encoding__doc__},
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007313 {"dup", posix_dup, METH_VARARGS, posix_dup__doc__},
7314 {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__},
7315 {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},
7316 {"read", posix_read, METH_VARARGS, posix_read__doc__},
7317 {"write", posix_write, METH_VARARGS, posix_write__doc__},
7318 {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__},
Skip Montanaro1517d842000-07-19 14:34:14 +00007319 {"isatty", posix_isatty, METH_VARARGS, posix_isatty__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007320#ifdef HAVE_PIPE
Neal Norwitze241ce82003-02-17 18:17:05 +00007321 {"pipe", posix_pipe, METH_NOARGS, posix_pipe__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007322#endif
7323#ifdef HAVE_MKFIFO
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007324 {"mkfifo", posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007325#endif
Neal Norwitz11690112002-07-30 01:08:28 +00007326#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)
Martin v. Löwis06a83e92002-04-14 10:19:44 +00007327 {"mknod", posix_mknod, METH_VARARGS, posix_mknod__doc__},
7328#endif
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00007329#ifdef HAVE_DEVICE_MACROS
7330 {"major", posix_major, METH_VARARGS, posix_major__doc__},
7331 {"minor", posix_minor, METH_VARARGS, posix_minor__doc__},
7332 {"makedev", posix_makedev, METH_VARARGS, posix_makedev__doc__},
7333#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007334#ifdef HAVE_FTRUNCATE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007335 {"ftruncate", posix_ftruncate, METH_VARARGS, posix_ftruncate__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007336#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00007337#ifdef HAVE_PUTENV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007338 {"putenv", posix_putenv, METH_VARARGS, posix_putenv__doc__},
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00007339#endif
Guido van Rossumc524d952001-10-19 01:31:59 +00007340#ifdef HAVE_UNSETENV
7341 {"unsetenv", posix_unsetenv, METH_VARARGS, posix_unsetenv__doc__},
7342#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007343 {"strerror", posix_strerror, METH_VARARGS, posix_strerror__doc__},
Fred Drake4d1e64b2002-04-15 19:40:07 +00007344#ifdef HAVE_FCHDIR
7345 {"fchdir", posix_fchdir, METH_O, posix_fchdir__doc__},
7346#endif
Guido van Rossum21142a01999-01-08 21:05:37 +00007347#ifdef HAVE_FSYNC
Fred Drake4d1e64b2002-04-15 19:40:07 +00007348 {"fsync", posix_fsync, METH_O, posix_fsync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00007349#endif
7350#ifdef HAVE_FDATASYNC
Fred Drake4d1e64b2002-04-15 19:40:07 +00007351 {"fdatasync", posix_fdatasync, METH_O, posix_fdatasync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00007352#endif
Guido van Rossumc9641791998-08-04 15:26:23 +00007353#ifdef HAVE_SYS_WAIT_H
Fred Drake106c1a02002-04-23 15:58:02 +00007354#ifdef WCOREDUMP
7355 {"WCOREDUMP", posix_WCOREDUMP, METH_VARARGS, posix_WCOREDUMP__doc__},
7356#endif /* WCOREDUMP */
Martin v. Löwis2b41b0d2002-05-04 13:13:41 +00007357#ifdef WIFCONTINUED
7358 {"WIFCONTINUED",posix_WIFCONTINUED, METH_VARARGS, posix_WIFCONTINUED__doc__},
7359#endif /* WIFCONTINUED */
Guido van Rossumc9641791998-08-04 15:26:23 +00007360#ifdef WIFSTOPPED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007361 {"WIFSTOPPED", posix_WIFSTOPPED, METH_VARARGS, posix_WIFSTOPPED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007362#endif /* WIFSTOPPED */
7363#ifdef WIFSIGNALED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007364 {"WIFSIGNALED", posix_WIFSIGNALED, METH_VARARGS, posix_WIFSIGNALED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007365#endif /* WIFSIGNALED */
7366#ifdef WIFEXITED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007367 {"WIFEXITED", posix_WIFEXITED, METH_VARARGS, posix_WIFEXITED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007368#endif /* WIFEXITED */
7369#ifdef WEXITSTATUS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007370 {"WEXITSTATUS", posix_WEXITSTATUS, METH_VARARGS, posix_WEXITSTATUS__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007371#endif /* WEXITSTATUS */
7372#ifdef WTERMSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007373 {"WTERMSIG", posix_WTERMSIG, METH_VARARGS, posix_WTERMSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007374#endif /* WTERMSIG */
7375#ifdef WSTOPSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007376 {"WSTOPSIG", posix_WSTOPSIG, METH_VARARGS, posix_WSTOPSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007377#endif /* WSTOPSIG */
7378#endif /* HAVE_SYS_WAIT_H */
Thomas Wouters477c8d52006-05-27 19:21:47 +00007379#if defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H)
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007380 {"fstatvfs", posix_fstatvfs, METH_VARARGS, posix_fstatvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00007381#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00007382#if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H)
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007383 {"statvfs", posix_statvfs, METH_VARARGS, posix_statvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00007384#endif
Fred Drakec9680921999-12-13 16:37:25 +00007385#ifdef HAVE_CONFSTR
7386 {"confstr", posix_confstr, METH_VARARGS, posix_confstr__doc__},
7387#endif
7388#ifdef HAVE_SYSCONF
7389 {"sysconf", posix_sysconf, METH_VARARGS, posix_sysconf__doc__},
7390#endif
7391#ifdef HAVE_FPATHCONF
7392 {"fpathconf", posix_fpathconf, METH_VARARGS, posix_fpathconf__doc__},
7393#endif
7394#ifdef HAVE_PATHCONF
7395 {"pathconf", posix_pathconf, METH_VARARGS, posix_pathconf__doc__},
7396#endif
Neal Norwitze241ce82003-02-17 18:17:05 +00007397 {"abort", posix_abort, METH_NOARGS, posix_abort__doc__},
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00007398#ifdef MS_WINDOWS
Mark Hammondef8b6542001-05-13 08:04:26 +00007399 {"_getfullpathname", posix__getfullpathname, METH_VARARGS, NULL},
7400#endif
Martin v. Löwis438b5342002-12-27 10:16:42 +00007401#ifdef HAVE_GETLOADAVG
Neal Norwitze241ce82003-02-17 18:17:05 +00007402 {"getloadavg", posix_getloadavg, METH_NOARGS, posix_getloadavg__doc__},
Martin v. Löwis438b5342002-12-27 10:16:42 +00007403#endif
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00007404 #ifdef MS_WINDOWS
7405 {"urandom", win32_urandom, METH_VARARGS, win32_urandom__doc__},
7406 #endif
Thomas Wouters0e3f5912006-08-11 14:57:12 +00007407 #ifdef __VMS
7408 {"urandom", vms_urandom, METH_VARARGS, vms_urandom__doc__},
7409 #endif
Martin v. Löwis7aed61a2009-11-27 14:09:49 +00007410#ifdef HAVE_SETRESUID
7411 {"setresuid", posix_setresuid, METH_VARARGS, posix_setresuid__doc__},
7412#endif
7413#ifdef HAVE_SETRESGID
7414 {"setresgid", posix_setresgid, METH_VARARGS, posix_setresgid__doc__},
7415#endif
7416#ifdef HAVE_GETRESUID
7417 {"getresuid", posix_getresuid, METH_NOARGS, posix_getresuid__doc__},
7418#endif
7419#ifdef HAVE_GETRESGID
7420 {"getresgid", posix_getresgid, METH_NOARGS, posix_getresgid__doc__},
7421#endif
7422
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00007423 {NULL, NULL} /* Sentinel */
7424};
7425
7426
Barry Warsaw4a342091996-12-19 23:50:02 +00007427static int
Fred Drake4d1e64b2002-04-15 19:40:07 +00007428ins(PyObject *module, char *symbol, long value)
Barry Warsaw4a342091996-12-19 23:50:02 +00007429{
Fred Drake4d1e64b2002-04-15 19:40:07 +00007430 return PyModule_AddIntConstant(module, symbol, value);
Barry Warsaw4a342091996-12-19 23:50:02 +00007431}
7432
Guido van Rossumd48f2521997-12-05 22:19:34 +00007433#if defined(PYOS_OS2)
7434/* Insert Platform-Specific Constant Values (Strings & Numbers) of Common Use */
Fred Drake4d1e64b2002-04-15 19:40:07 +00007435static int insertvalues(PyObject *module)
Guido van Rossumd48f2521997-12-05 22:19:34 +00007436{
7437 APIRET rc;
7438 ULONG values[QSV_MAX+1];
7439 PyObject *v;
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00007440 char *ver, tmp[50];
Guido van Rossumd48f2521997-12-05 22:19:34 +00007441
7442 Py_BEGIN_ALLOW_THREADS
Andrew MacIntyre75e01452003-04-21 14:19:51 +00007443 rc = DosQuerySysInfo(1L, QSV_MAX, &values[1], sizeof(ULONG) * QSV_MAX);
Guido van Rossumd48f2521997-12-05 22:19:34 +00007444 Py_END_ALLOW_THREADS
7445
7446 if (rc != NO_ERROR) {
7447 os2_error(rc);
7448 return -1;
7449 }
7450
Fred Drake4d1e64b2002-04-15 19:40:07 +00007451 if (ins(module, "meminstalled", values[QSV_TOTPHYSMEM])) return -1;
7452 if (ins(module, "memkernel", values[QSV_TOTRESMEM])) return -1;
7453 if (ins(module, "memvirtual", values[QSV_TOTAVAILMEM])) return -1;
7454 if (ins(module, "maxpathlen", values[QSV_MAX_PATH_LENGTH])) return -1;
7455 if (ins(module, "maxnamelen", values[QSV_MAX_COMP_LENGTH])) return -1;
7456 if (ins(module, "revision", values[QSV_VERSION_REVISION])) return -1;
7457 if (ins(module, "timeslice", values[QSV_MIN_SLICE])) return -1;
Guido van Rossumd48f2521997-12-05 22:19:34 +00007458
7459 switch (values[QSV_VERSION_MINOR]) {
7460 case 0: ver = "2.00"; break;
7461 case 10: ver = "2.10"; break;
7462 case 11: ver = "2.11"; break;
7463 case 30: ver = "3.00"; break;
7464 case 40: ver = "4.00"; break;
7465 case 50: ver = "5.00"; break;
7466 default:
Tim Peters885d4572001-11-28 20:27:42 +00007467 PyOS_snprintf(tmp, sizeof(tmp),
7468 "%d-%d", values[QSV_VERSION_MAJOR],
7469 values[QSV_VERSION_MINOR]);
Guido van Rossumd48f2521997-12-05 22:19:34 +00007470 ver = &tmp[0];
7471 }
7472
7473 /* Add Indicator of the Version of the Operating System */
Fred Drake4d1e64b2002-04-15 19:40:07 +00007474 if (PyModule_AddStringConstant(module, "version", tmp) < 0)
Guido van Rossumd48f2521997-12-05 22:19:34 +00007475 return -1;
Guido van Rossumd48f2521997-12-05 22:19:34 +00007476
7477 /* Add Indicator of Which Drive was Used to Boot the System */
7478 tmp[0] = 'A' + values[QSV_BOOT_DRIVE] - 1;
7479 tmp[1] = ':';
7480 tmp[2] = '\0';
7481
Fred Drake4d1e64b2002-04-15 19:40:07 +00007482 return PyModule_AddStringConstant(module, "bootdrive", tmp);
Guido van Rossumd48f2521997-12-05 22:19:34 +00007483}
7484#endif
7485
Barry Warsaw4a342091996-12-19 23:50:02 +00007486static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00007487all_ins(PyObject *d)
Barry Warsaw4a342091996-12-19 23:50:02 +00007488{
Guido van Rossum94f6f721999-01-06 18:42:14 +00007489#ifdef F_OK
7490 if (ins(d, "F_OK", (long)F_OK)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007491#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00007492#ifdef R_OK
7493 if (ins(d, "R_OK", (long)R_OK)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007494#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00007495#ifdef W_OK
7496 if (ins(d, "W_OK", (long)W_OK)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007497#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00007498#ifdef X_OK
7499 if (ins(d, "X_OK", (long)X_OK)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007500#endif
Fred Drakec9680921999-12-13 16:37:25 +00007501#ifdef NGROUPS_MAX
7502 if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1;
7503#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007504#ifdef TMP_MAX
7505 if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1;
7506#endif
Fred Drake106c1a02002-04-23 15:58:02 +00007507#ifdef WCONTINUED
7508 if (ins(d, "WCONTINUED", (long)WCONTINUED)) return -1;
7509#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00007510#ifdef WNOHANG
7511 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007512#endif
Fred Drake106c1a02002-04-23 15:58:02 +00007513#ifdef WUNTRACED
7514 if (ins(d, "WUNTRACED", (long)WUNTRACED)) return -1;
7515#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00007516#ifdef O_RDONLY
7517 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
7518#endif
7519#ifdef O_WRONLY
7520 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
7521#endif
7522#ifdef O_RDWR
7523 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
7524#endif
7525#ifdef O_NDELAY
7526 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
7527#endif
7528#ifdef O_NONBLOCK
7529 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
7530#endif
7531#ifdef O_APPEND
7532 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
7533#endif
7534#ifdef O_DSYNC
7535 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
7536#endif
7537#ifdef O_RSYNC
7538 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
7539#endif
7540#ifdef O_SYNC
7541 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
7542#endif
7543#ifdef O_NOCTTY
7544 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
7545#endif
7546#ifdef O_CREAT
7547 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
7548#endif
7549#ifdef O_EXCL
7550 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
7551#endif
7552#ifdef O_TRUNC
7553 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
7554#endif
Guido van Rossum98d9d091997-08-08 21:48:51 +00007555#ifdef O_BINARY
7556 if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
7557#endif
7558#ifdef O_TEXT
7559 if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
7560#endif
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007561#ifdef O_LARGEFILE
7562 if (ins(d, "O_LARGEFILE", (long)O_LARGEFILE)) return -1;
7563#endif
Skip Montanaro5ff14922005-05-16 02:42:22 +00007564#ifdef O_SHLOCK
7565 if (ins(d, "O_SHLOCK", (long)O_SHLOCK)) return -1;
7566#endif
7567#ifdef O_EXLOCK
7568 if (ins(d, "O_EXLOCK", (long)O_EXLOCK)) return -1;
7569#endif
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007570
Tim Peters5aa91602002-01-30 05:46:57 +00007571/* MS Windows */
7572#ifdef O_NOINHERIT
7573 /* Don't inherit in child processes. */
7574 if (ins(d, "O_NOINHERIT", (long)O_NOINHERIT)) return -1;
7575#endif
7576#ifdef _O_SHORT_LIVED
7577 /* Optimize for short life (keep in memory). */
7578 /* MS forgot to define this one with a non-underscore form too. */
7579 if (ins(d, "O_SHORT_LIVED", (long)_O_SHORT_LIVED)) return -1;
7580#endif
7581#ifdef O_TEMPORARY
7582 /* Automatically delete when last handle is closed. */
7583 if (ins(d, "O_TEMPORARY", (long)O_TEMPORARY)) return -1;
7584#endif
7585#ifdef O_RANDOM
7586 /* Optimize for random access. */
7587 if (ins(d, "O_RANDOM", (long)O_RANDOM)) return -1;
7588#endif
7589#ifdef O_SEQUENTIAL
7590 /* Optimize for sequential access. */
7591 if (ins(d, "O_SEQUENTIAL", (long)O_SEQUENTIAL)) return -1;
7592#endif
7593
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007594/* GNU extensions. */
Alexandre Vassalottibee32532008-05-16 18:15:12 +00007595#ifdef O_ASYNC
7596 /* Send a SIGIO signal whenever input or output
7597 becomes available on file descriptor */
7598 if (ins(d, "O_ASYNC", (long)O_ASYNC)) return -1;
7599#endif
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007600#ifdef O_DIRECT
7601 /* Direct disk access. */
7602 if (ins(d, "O_DIRECT", (long)O_DIRECT)) return -1;
7603#endif
7604#ifdef O_DIRECTORY
7605 /* Must be a directory. */
7606 if (ins(d, "O_DIRECTORY", (long)O_DIRECTORY)) return -1;
7607#endif
7608#ifdef O_NOFOLLOW
7609 /* Do not follow links. */
7610 if (ins(d, "O_NOFOLLOW", (long)O_NOFOLLOW)) return -1;
7611#endif
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00007612#ifdef O_NOATIME
7613 /* Do not update the access time. */
7614 if (ins(d, "O_NOATIME", (long)O_NOATIME)) return -1;
7615#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +00007616
Barry Warsaw5676bd12003-01-07 20:57:09 +00007617 /* These come from sysexits.h */
7618#ifdef EX_OK
7619 if (ins(d, "EX_OK", (long)EX_OK)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007620#endif /* EX_OK */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007621#ifdef EX_USAGE
7622 if (ins(d, "EX_USAGE", (long)EX_USAGE)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007623#endif /* EX_USAGE */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007624#ifdef EX_DATAERR
7625 if (ins(d, "EX_DATAERR", (long)EX_DATAERR)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007626#endif /* EX_DATAERR */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007627#ifdef EX_NOINPUT
7628 if (ins(d, "EX_NOINPUT", (long)EX_NOINPUT)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007629#endif /* EX_NOINPUT */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007630#ifdef EX_NOUSER
7631 if (ins(d, "EX_NOUSER", (long)EX_NOUSER)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007632#endif /* EX_NOUSER */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007633#ifdef EX_NOHOST
7634 if (ins(d, "EX_NOHOST", (long)EX_NOHOST)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007635#endif /* EX_NOHOST */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007636#ifdef EX_UNAVAILABLE
7637 if (ins(d, "EX_UNAVAILABLE", (long)EX_UNAVAILABLE)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007638#endif /* EX_UNAVAILABLE */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007639#ifdef EX_SOFTWARE
7640 if (ins(d, "EX_SOFTWARE", (long)EX_SOFTWARE)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007641#endif /* EX_SOFTWARE */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007642#ifdef EX_OSERR
7643 if (ins(d, "EX_OSERR", (long)EX_OSERR)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007644#endif /* EX_OSERR */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007645#ifdef EX_OSFILE
7646 if (ins(d, "EX_OSFILE", (long)EX_OSFILE)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007647#endif /* EX_OSFILE */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007648#ifdef EX_CANTCREAT
7649 if (ins(d, "EX_CANTCREAT", (long)EX_CANTCREAT)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007650#endif /* EX_CANTCREAT */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007651#ifdef EX_IOERR
7652 if (ins(d, "EX_IOERR", (long)EX_IOERR)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007653#endif /* EX_IOERR */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007654#ifdef EX_TEMPFAIL
7655 if (ins(d, "EX_TEMPFAIL", (long)EX_TEMPFAIL)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007656#endif /* EX_TEMPFAIL */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007657#ifdef EX_PROTOCOL
7658 if (ins(d, "EX_PROTOCOL", (long)EX_PROTOCOL)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007659#endif /* EX_PROTOCOL */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007660#ifdef EX_NOPERM
7661 if (ins(d, "EX_NOPERM", (long)EX_NOPERM)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007662#endif /* EX_NOPERM */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007663#ifdef EX_CONFIG
7664 if (ins(d, "EX_CONFIG", (long)EX_CONFIG)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007665#endif /* EX_CONFIG */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007666#ifdef EX_NOTFOUND
7667 if (ins(d, "EX_NOTFOUND", (long)EX_NOTFOUND)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007668#endif /* EX_NOTFOUND */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007669
Guido van Rossum246bc171999-02-01 23:54:31 +00007670#ifdef HAVE_SPAWNV
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00007671#if defined(PYOS_OS2) && defined(PYCC_GCC)
7672 if (ins(d, "P_WAIT", (long)P_WAIT)) return -1;
7673 if (ins(d, "P_NOWAIT", (long)P_NOWAIT)) return -1;
7674 if (ins(d, "P_OVERLAY", (long)P_OVERLAY)) return -1;
7675 if (ins(d, "P_DEBUG", (long)P_DEBUG)) return -1;
7676 if (ins(d, "P_SESSION", (long)P_SESSION)) return -1;
7677 if (ins(d, "P_DETACH", (long)P_DETACH)) return -1;
7678 if (ins(d, "P_PM", (long)P_PM)) return -1;
7679 if (ins(d, "P_DEFAULT", (long)P_DEFAULT)) return -1;
7680 if (ins(d, "P_MINIMIZE", (long)P_MINIMIZE)) return -1;
7681 if (ins(d, "P_MAXIMIZE", (long)P_MAXIMIZE)) return -1;
7682 if (ins(d, "P_FULLSCREEN", (long)P_FULLSCREEN)) return -1;
7683 if (ins(d, "P_WINDOWED", (long)P_WINDOWED)) return -1;
7684 if (ins(d, "P_FOREGROUND", (long)P_FOREGROUND)) return -1;
7685 if (ins(d, "P_BACKGROUND", (long)P_BACKGROUND)) return -1;
7686 if (ins(d, "P_NOCLOSE", (long)P_NOCLOSE)) return -1;
7687 if (ins(d, "P_NOSESSION", (long)P_NOSESSION)) return -1;
7688 if (ins(d, "P_QUOTE", (long)P_QUOTE)) return -1;
7689 if (ins(d, "P_TILDE", (long)P_TILDE)) return -1;
7690 if (ins(d, "P_UNRELATED", (long)P_UNRELATED)) return -1;
7691 if (ins(d, "P_DEBUGDESC", (long)P_DEBUGDESC)) return -1;
7692#else
Guido van Rossum7d385291999-02-16 19:38:04 +00007693 if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1;
7694 if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1;
7695 if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1;
7696 if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1;
7697 if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1;
Guido van Rossum246bc171999-02-01 23:54:31 +00007698#endif
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00007699#endif
Guido van Rossum246bc171999-02-01 23:54:31 +00007700
Guido van Rossumd48f2521997-12-05 22:19:34 +00007701#if defined(PYOS_OS2)
7702 if (insertvalues(d)) return -1;
7703#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00007704 return 0;
7705}
7706
7707
Tim Peters5aa91602002-01-30 05:46:57 +00007708#if (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__)) && !defined(__QNX__)
Martin v. Löwis1a214512008-06-11 05:26:20 +00007709#define INITFUNC PyInit_nt
Guido van Rossum0cb96de1997-10-01 04:29:29 +00007710#define MODNAME "nt"
Tim Peters58e0a8c2001-05-14 22:32:33 +00007711
7712#elif defined(PYOS_OS2)
Martin v. Löwis1a214512008-06-11 05:26:20 +00007713#define INITFUNC PyInit_os2
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007714#define MODNAME "os2"
Tim Peters58e0a8c2001-05-14 22:32:33 +00007715
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007716#else
Martin v. Löwis1a214512008-06-11 05:26:20 +00007717#define INITFUNC PyInit_posix
Guido van Rossum0cb96de1997-10-01 04:29:29 +00007718#define MODNAME "posix"
7719#endif
7720
Martin v. Löwis1a214512008-06-11 05:26:20 +00007721static struct PyModuleDef posixmodule = {
7722 PyModuleDef_HEAD_INIT,
7723 MODNAME,
7724 posix__doc__,
7725 -1,
7726 posix_methods,
7727 NULL,
7728 NULL,
7729 NULL,
7730 NULL
7731};
7732
7733
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007734PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00007735INITFUNC(void)
Guido van Rossumb6775db1994-08-01 11:34:53 +00007736{
Fred Drake4d1e64b2002-04-15 19:40:07 +00007737 PyObject *m, *v;
Tim Peters5aa91602002-01-30 05:46:57 +00007738
Martin v. Löwis1a214512008-06-11 05:26:20 +00007739 m = PyModule_Create(&posixmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00007740 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00007741 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00007742
Guido van Rossum0cb96de1997-10-01 04:29:29 +00007743 /* Initialize environ dictionary */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007744 v = convertenviron();
Fred Drake4d1e64b2002-04-15 19:40:07 +00007745 Py_XINCREF(v);
7746 if (v == NULL || PyModule_AddObject(m, "environ", v) != 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00007747 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00007748 Py_DECREF(v);
Fred Drakec9680921999-12-13 16:37:25 +00007749
Fred Drake4d1e64b2002-04-15 19:40:07 +00007750 if (all_ins(m))
Martin v. Löwis1a214512008-06-11 05:26:20 +00007751 return NULL;
Barry Warsaw4a342091996-12-19 23:50:02 +00007752
Fred Drake4d1e64b2002-04-15 19:40:07 +00007753 if (setup_confname_tables(m))
Martin v. Löwis1a214512008-06-11 05:26:20 +00007754 return NULL;
Fred Drakebec628d1999-12-15 18:31:10 +00007755
Fred Drake4d1e64b2002-04-15 19:40:07 +00007756 Py_INCREF(PyExc_OSError);
7757 PyModule_AddObject(m, "error", PyExc_OSError);
Fred Drake762e2061999-08-26 17:23:54 +00007758
Guido van Rossumb3d39562000-01-31 18:41:26 +00007759#ifdef HAVE_PUTENV
Neil Schemenauer19030a02001-01-16 04:27:47 +00007760 if (posix_putenv_garbage == NULL)
7761 posix_putenv_garbage = PyDict_New();
Guido van Rossumb3d39562000-01-31 18:41:26 +00007762#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +00007763
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007764 if (!initialized) {
7765 stat_result_desc.name = MODNAME ".stat_result";
7766 stat_result_desc.fields[7].name = PyStructSequence_UnnamedField;
7767 stat_result_desc.fields[8].name = PyStructSequence_UnnamedField;
7768 stat_result_desc.fields[9].name = PyStructSequence_UnnamedField;
7769 PyStructSequence_InitType(&StatResultType, &stat_result_desc);
7770 structseq_new = StatResultType.tp_new;
7771 StatResultType.tp_new = statresult_new;
7772
7773 statvfs_result_desc.name = MODNAME ".statvfs_result";
7774 PyStructSequence_InitType(&StatVFSResultType, &statvfs_result_desc);
Martin v. Löwis05bfe1f2008-12-29 18:21:47 +00007775#ifdef NEED_TICKS_PER_SECOND
7776# if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
7777 ticks_per_second = sysconf(_SC_CLK_TCK);
7778# elif defined(HZ)
7779 ticks_per_second = HZ;
7780# else
7781 ticks_per_second = 60; /* magic fallback value; may be bogus */
7782# endif
7783#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007784 }
Fred Drake4d1e64b2002-04-15 19:40:07 +00007785 Py_INCREF((PyObject*) &StatResultType);
7786 PyModule_AddObject(m, "stat_result", (PyObject*) &StatResultType);
Fred Drake4d1e64b2002-04-15 19:40:07 +00007787 Py_INCREF((PyObject*) &StatVFSResultType);
7788 PyModule_AddObject(m, "statvfs_result",
7789 (PyObject*) &StatVFSResultType);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007790 initialized = 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00007791
7792#ifdef __APPLE__
7793 /*
7794 * Step 2 of weak-linking support on Mac OS X.
7795 *
7796 * The code below removes functions that are not available on the
7797 * currently active platform.
7798 *
7799 * This block allow one to use a python binary that was build on
7800 * OSX 10.4 on OSX 10.3, without loosing access to new APIs on
7801 * OSX 10.4.
7802 */
7803#ifdef HAVE_FSTATVFS
7804 if (fstatvfs == NULL) {
7805 if (PyObject_DelAttrString(m, "fstatvfs") == -1) {
Martin v. Löwis1a214512008-06-11 05:26:20 +00007806 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00007807 }
7808 }
7809#endif /* HAVE_FSTATVFS */
7810
7811#ifdef HAVE_STATVFS
7812 if (statvfs == NULL) {
7813 if (PyObject_DelAttrString(m, "statvfs") == -1) {
Martin v. Löwis1a214512008-06-11 05:26:20 +00007814 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00007815 }
7816 }
7817#endif /* HAVE_STATVFS */
7818
7819# ifdef HAVE_LCHOWN
7820 if (lchown == NULL) {
7821 if (PyObject_DelAttrString(m, "lchown") == -1) {
Martin v. Löwis1a214512008-06-11 05:26:20 +00007822 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00007823 }
7824 }
7825#endif /* HAVE_LCHOWN */
7826
7827
7828#endif /* __APPLE__ */
Martin v. Löwis1a214512008-06-11 05:26:20 +00007829 return m;
Thomas Wouters477c8d52006-05-27 19:21:47 +00007830
Guido van Rossumb6775db1994-08-01 11:34:53 +00007831}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007832
7833#ifdef __cplusplus
7834}
7835#endif