blob: 5076d3bdfd5d0a59707bbe1e34bed0839184b821 [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
Guido van Rossumc0125471996-06-28 18:55:32 +00004174#ifdef HAVE_PLOCK
4175
4176#ifdef HAVE_SYS_LOCK_H
4177#include <sys/lock.h>
4178#endif
4179
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004180PyDoc_STRVAR(posix_plock__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004181"plock(op)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004182Lock program segments into memory.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004183
Barry Warsaw53699e91996-12-10 23:23:01 +00004184static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004185posix_plock(PyObject *self, PyObject *args)
Guido van Rossumc0125471996-06-28 18:55:32 +00004186{
4187 int op;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004188 if (!PyArg_ParseTuple(args, "i:plock", &op))
Guido van Rossumc0125471996-06-28 18:55:32 +00004189 return NULL;
4190 if (plock(op) == -1)
4191 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004192 Py_INCREF(Py_None);
4193 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00004194}
4195#endif
4196
Guido van Rossumb6775db1994-08-01 11:34:53 +00004197#ifdef HAVE_SETUID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004198PyDoc_STRVAR(posix_setuid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004199"setuid(uid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004200Set the current process's user id.");
4201
Barry Warsaw53699e91996-12-10 23:23:01 +00004202static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004203posix_setuid(PyObject *self, PyObject *args)
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004204{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004205 long uid_arg;
4206 uid_t uid;
4207 if (!PyArg_ParseTuple(args, "l:setuid", &uid_arg))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004208 return NULL;
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004209 uid = uid_arg;
4210 if (uid != uid_arg) {
4211 PyErr_SetString(PyExc_OverflowError, "user id too big");
4212 return NULL;
4213 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004214 if (setuid(uid) < 0)
4215 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004216 Py_INCREF(Py_None);
4217 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004218}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004219#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004220
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004221
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004222#ifdef HAVE_SETEUID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004223PyDoc_STRVAR(posix_seteuid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004224"seteuid(uid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004225Set the current process's effective user id.");
4226
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004227static PyObject *
4228posix_seteuid (PyObject *self, PyObject *args)
4229{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004230 long euid_arg;
4231 uid_t euid;
4232 if (!PyArg_ParseTuple(args, "l", &euid_arg))
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004233 return NULL;
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004234 euid = euid_arg;
4235 if (euid != euid_arg) {
4236 PyErr_SetString(PyExc_OverflowError, "user id too big");
4237 return NULL;
4238 }
4239 if (seteuid(euid) < 0) {
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004240 return posix_error();
4241 } else {
4242 Py_INCREF(Py_None);
4243 return Py_None;
4244 }
4245}
4246#endif /* HAVE_SETEUID */
4247
4248#ifdef HAVE_SETEGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004249PyDoc_STRVAR(posix_setegid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004250"setegid(gid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004251Set the current process's effective group id.");
4252
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004253static PyObject *
4254posix_setegid (PyObject *self, PyObject *args)
4255{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004256 long egid_arg;
4257 gid_t egid;
4258 if (!PyArg_ParseTuple(args, "l", &egid_arg))
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004259 return NULL;
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004260 egid = egid_arg;
4261 if (egid != egid_arg) {
4262 PyErr_SetString(PyExc_OverflowError, "group id too big");
4263 return NULL;
4264 }
4265 if (setegid(egid) < 0) {
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004266 return posix_error();
4267 } else {
4268 Py_INCREF(Py_None);
4269 return Py_None;
4270 }
4271}
4272#endif /* HAVE_SETEGID */
4273
4274#ifdef HAVE_SETREUID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004275PyDoc_STRVAR(posix_setreuid__doc__,
Neal Norwitz94f1d712004-02-16 01:26:34 +00004276"setreuid(ruid, euid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004277Set the current process's real and effective user ids.");
4278
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004279static PyObject *
4280posix_setreuid (PyObject *self, PyObject *args)
4281{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004282 long ruid_arg, euid_arg;
4283 uid_t ruid, euid;
4284 if (!PyArg_ParseTuple(args, "ll", &ruid_arg, &euid_arg))
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004285 return NULL;
Gregory P. Smithc78d79c2010-03-01 05:54:14 +00004286 if (ruid_arg == -1)
4287 ruid = (uid_t)-1; /* let the compiler choose how -1 fits */
4288 else
4289 ruid = ruid_arg; /* otherwise, assign from our long */
4290 if (euid_arg == -1)
4291 euid = (uid_t)-1;
4292 else
4293 euid = euid_arg;
4294 if ((euid_arg != -1 && euid != euid_arg) ||
4295 (ruid_arg != -1 && ruid != ruid_arg)) {
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004296 PyErr_SetString(PyExc_OverflowError, "user id too big");
4297 return NULL;
4298 }
4299 if (setreuid(ruid, euid) < 0) {
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004300 return posix_error();
4301 } else {
4302 Py_INCREF(Py_None);
4303 return Py_None;
4304 }
4305}
4306#endif /* HAVE_SETREUID */
4307
4308#ifdef HAVE_SETREGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004309PyDoc_STRVAR(posix_setregid__doc__,
Neal Norwitz94f1d712004-02-16 01:26:34 +00004310"setregid(rgid, egid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004311Set the current process's real and effective group ids.");
4312
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004313static PyObject *
4314posix_setregid (PyObject *self, PyObject *args)
4315{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004316 long rgid_arg, egid_arg;
4317 gid_t rgid, egid;
4318 if (!PyArg_ParseTuple(args, "ll", &rgid_arg, &egid_arg))
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004319 return NULL;
Gregory P. Smithc78d79c2010-03-01 05:54:14 +00004320 if (rgid_arg == -1)
4321 rgid = (gid_t)-1; /* let the compiler choose how -1 fits */
4322 else
4323 rgid = rgid_arg; /* otherwise, assign from our long */
4324 if (egid_arg == -1)
4325 egid = (gid_t)-1;
4326 else
4327 egid = egid_arg;
4328 if ((egid_arg != -1 && egid != egid_arg) ||
4329 (rgid_arg != -1 && rgid != rgid_arg)) {
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004330 PyErr_SetString(PyExc_OverflowError, "group id too big");
4331 return NULL;
4332 }
4333 if (setregid(rgid, egid) < 0) {
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00004334 return posix_error();
4335 } else {
4336 Py_INCREF(Py_None);
4337 return Py_None;
4338 }
4339}
4340#endif /* HAVE_SETREGID */
4341
Guido van Rossumb6775db1994-08-01 11:34:53 +00004342#ifdef HAVE_SETGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004343PyDoc_STRVAR(posix_setgid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004344"setgid(gid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004345Set the current process's group id.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004346
Barry Warsaw53699e91996-12-10 23:23:01 +00004347static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004348posix_setgid(PyObject *self, PyObject *args)
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004349{
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004350 long gid_arg;
4351 gid_t gid;
4352 if (!PyArg_ParseTuple(args, "l:setgid", &gid_arg))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004353 return NULL;
Benjamin Petersonef3e4c22009-04-11 19:48:14 +00004354 gid = gid_arg;
4355 if (gid != gid_arg) {
4356 PyErr_SetString(PyExc_OverflowError, "group id too big");
4357 return NULL;
4358 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004359 if (setgid(gid) < 0)
4360 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004361 Py_INCREF(Py_None);
4362 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004363}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004364#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00004365
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004366#ifdef HAVE_SETGROUPS
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004367PyDoc_STRVAR(posix_setgroups__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004368"setgroups(list)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004369Set the groups of the current process to list.");
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004370
4371static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00004372posix_setgroups(PyObject *self, PyObject *groups)
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004373{
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004374 int i, len;
4375 gid_t grouplist[MAX_GROUPS];
Tim Peters5aa91602002-01-30 05:46:57 +00004376
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004377 if (!PySequence_Check(groups)) {
4378 PyErr_SetString(PyExc_TypeError, "setgroups argument must be a sequence");
4379 return NULL;
4380 }
4381 len = PySequence_Size(groups);
4382 if (len > MAX_GROUPS) {
4383 PyErr_SetString(PyExc_ValueError, "too many groups");
4384 return NULL;
4385 }
4386 for(i = 0; i < len; i++) {
4387 PyObject *elem;
4388 elem = PySequence_GetItem(groups, i);
4389 if (!elem)
4390 return NULL;
Guido van Rossumddefaf32007-01-14 03:31:43 +00004391 if (!PyLong_Check(elem)) {
4392 PyErr_SetString(PyExc_TypeError,
4393 "groups must be integers");
4394 Py_DECREF(elem);
4395 return NULL;
4396 } else {
4397 unsigned long x = PyLong_AsUnsignedLong(elem);
4398 if (PyErr_Occurred()) {
4399 PyErr_SetString(PyExc_TypeError,
4400 "group id too big");
Georg Brandla13c2442005-11-22 19:30:31 +00004401 Py_DECREF(elem);
4402 return NULL;
Georg Brandla13c2442005-11-22 19:30:31 +00004403 }
Georg Brandla13c2442005-11-22 19:30:31 +00004404 grouplist[i] = x;
Guido van Rossumddefaf32007-01-14 03:31:43 +00004405 /* read back the value to see if it fitted in gid_t */
Georg Brandla13c2442005-11-22 19:30:31 +00004406 if (grouplist[i] != x) {
4407 PyErr_SetString(PyExc_TypeError,
4408 "group id too big");
4409 Py_DECREF(elem);
4410 return NULL;
4411 }
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004412 }
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00004413 Py_DECREF(elem);
4414 }
4415
4416 if (setgroups(len, grouplist) < 0)
4417 return posix_error();
4418 Py_INCREF(Py_None);
4419 return Py_None;
4420}
4421#endif /* HAVE_SETGROUPS */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004422
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004423#if defined(HAVE_WAIT3) || defined(HAVE_WAIT4)
4424static PyObject *
Christian Heimes292d3512008-02-03 16:51:08 +00004425wait_helper(pid_t pid, int status, struct rusage *ru)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004426{
4427 PyObject *result;
4428 static PyObject *struct_rusage;
4429
4430 if (pid == -1)
4431 return posix_error();
4432
4433 if (struct_rusage == NULL) {
Christian Heimes072c0f12008-01-03 23:01:04 +00004434 PyObject *m = PyImport_ImportModuleNoBlock("resource");
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004435 if (m == NULL)
4436 return NULL;
4437 struct_rusage = PyObject_GetAttrString(m, "struct_rusage");
4438 Py_DECREF(m);
4439 if (struct_rusage == NULL)
4440 return NULL;
4441 }
4442
4443 /* XXX(nnorwitz): Copied (w/mods) from resource.c, there should be only one. */
4444 result = PyStructSequence_New((PyTypeObject*) struct_rusage);
4445 if (!result)
4446 return NULL;
4447
4448#ifndef doubletime
4449#define doubletime(TV) ((double)(TV).tv_sec + (TV).tv_usec * 0.000001)
4450#endif
4451
4452 PyStructSequence_SET_ITEM(result, 0,
4453 PyFloat_FromDouble(doubletime(ru->ru_utime)));
4454 PyStructSequence_SET_ITEM(result, 1,
4455 PyFloat_FromDouble(doubletime(ru->ru_stime)));
4456#define SET_INT(result, index, value)\
Christian Heimes217cfd12007-12-02 14:31:20 +00004457 PyStructSequence_SET_ITEM(result, index, PyLong_FromLong(value))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004458 SET_INT(result, 2, ru->ru_maxrss);
4459 SET_INT(result, 3, ru->ru_ixrss);
4460 SET_INT(result, 4, ru->ru_idrss);
4461 SET_INT(result, 5, ru->ru_isrss);
4462 SET_INT(result, 6, ru->ru_minflt);
4463 SET_INT(result, 7, ru->ru_majflt);
4464 SET_INT(result, 8, ru->ru_nswap);
4465 SET_INT(result, 9, ru->ru_inblock);
4466 SET_INT(result, 10, ru->ru_oublock);
4467 SET_INT(result, 11, ru->ru_msgsnd);
4468 SET_INT(result, 12, ru->ru_msgrcv);
4469 SET_INT(result, 13, ru->ru_nsignals);
4470 SET_INT(result, 14, ru->ru_nvcsw);
4471 SET_INT(result, 15, ru->ru_nivcsw);
4472#undef SET_INT
4473
4474 if (PyErr_Occurred()) {
4475 Py_DECREF(result);
4476 return NULL;
4477 }
4478
Antoine Pitrouc3ee1662009-05-23 16:02:33 +00004479 return Py_BuildValue("NiN", PyLong_FromPid(pid), status, result);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004480}
4481#endif /* HAVE_WAIT3 || HAVE_WAIT4 */
4482
4483#ifdef HAVE_WAIT3
4484PyDoc_STRVAR(posix_wait3__doc__,
4485"wait3(options) -> (pid, status, rusage)\n\n\
4486Wait for completion of a child process.");
4487
4488static PyObject *
4489posix_wait3(PyObject *self, PyObject *args)
4490{
Christian Heimes292d3512008-02-03 16:51:08 +00004491 pid_t pid;
4492 int options;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004493 struct rusage ru;
4494 WAIT_TYPE status;
4495 WAIT_STATUS_INT(status) = 0;
4496
4497 if (!PyArg_ParseTuple(args, "i:wait3", &options))
4498 return NULL;
4499
4500 Py_BEGIN_ALLOW_THREADS
4501 pid = wait3(&status, options, &ru);
4502 Py_END_ALLOW_THREADS
4503
4504 return wait_helper(pid, WAIT_STATUS_INT(status), &ru);
4505}
4506#endif /* HAVE_WAIT3 */
4507
4508#ifdef HAVE_WAIT4
4509PyDoc_STRVAR(posix_wait4__doc__,
4510"wait4(pid, options) -> (pid, status, rusage)\n\n\
4511Wait for completion of a given child process.");
4512
4513static PyObject *
4514posix_wait4(PyObject *self, PyObject *args)
4515{
Christian Heimes292d3512008-02-03 16:51:08 +00004516 pid_t pid;
4517 int options;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004518 struct rusage ru;
4519 WAIT_TYPE status;
4520 WAIT_STATUS_INT(status) = 0;
4521
Gregory P. Smith84508572010-03-14 18:56:11 +00004522 if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:wait4", &pid, &options))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004523 return NULL;
4524
4525 Py_BEGIN_ALLOW_THREADS
4526 pid = wait4(pid, &status, options, &ru);
4527 Py_END_ALLOW_THREADS
4528
4529 return wait_helper(pid, WAIT_STATUS_INT(status), &ru);
4530}
4531#endif /* HAVE_WAIT4 */
4532
Guido van Rossumb6775db1994-08-01 11:34:53 +00004533#ifdef HAVE_WAITPID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004534PyDoc_STRVAR(posix_waitpid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004535"waitpid(pid, options) -> (pid, status)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004536Wait for completion of a given child process.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004537
Barry Warsaw53699e91996-12-10 23:23:01 +00004538static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004539posix_waitpid(PyObject *self, PyObject *args)
Guido van Rossum85e3b011991-06-03 12:42:10 +00004540{
Christian Heimes292d3512008-02-03 16:51:08 +00004541 pid_t pid;
4542 int options;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004543 WAIT_TYPE status;
4544 WAIT_STATUS_INT(status) = 0;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00004545
Gregory P. Smith84508572010-03-14 18:56:11 +00004546 if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:waitpid", &pid, &options))
Guido van Rossum21803b81992-08-09 12:55:27 +00004547 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00004548 Py_BEGIN_ALLOW_THREADS
Guido van Rossume6a3aa61999-02-01 16:15:30 +00004549 pid = waitpid(pid, &status, options);
Barry Warsaw53699e91996-12-10 23:23:01 +00004550 Py_END_ALLOW_THREADS
Guido van Rossum85e3b011991-06-03 12:42:10 +00004551 if (pid == -1)
4552 return posix_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004553
Antoine Pitrouc3ee1662009-05-23 16:02:33 +00004554 return Py_BuildValue("Ni", PyLong_FromPid(pid), WAIT_STATUS_INT(status));
Guido van Rossum21803b81992-08-09 12:55:27 +00004555}
4556
Tim Petersab034fa2002-02-01 11:27:43 +00004557#elif defined(HAVE_CWAIT)
4558
4559/* MS C has a variant of waitpid() that's usable for most purposes. */
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004560PyDoc_STRVAR(posix_waitpid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004561"waitpid(pid, options) -> (pid, status << 8)\n\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004562"Wait for completion of a given process. options is ignored on Windows.");
Tim Petersab034fa2002-02-01 11:27:43 +00004563
4564static PyObject *
4565posix_waitpid(PyObject *self, PyObject *args)
4566{
Thomas Wouters477c8d52006-05-27 19:21:47 +00004567 Py_intptr_t pid;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004568 int status, options;
Tim Petersab034fa2002-02-01 11:27:43 +00004569
Gregory P. Smith84508572010-03-14 18:56:11 +00004570 if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:waitpid", &pid, &options))
Tim Petersab034fa2002-02-01 11:27:43 +00004571 return NULL;
4572 Py_BEGIN_ALLOW_THREADS
4573 pid = _cwait(&status, pid, options);
4574 Py_END_ALLOW_THREADS
4575 if (pid == -1)
4576 return posix_error();
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004577
4578 /* shift the status left a byte so this is more like the POSIX waitpid */
Antoine Pitrouc3ee1662009-05-23 16:02:33 +00004579 return Py_BuildValue("Ni", PyLong_FromPid(pid), status << 8);
Tim Petersab034fa2002-02-01 11:27:43 +00004580}
4581#endif /* HAVE_WAITPID || HAVE_CWAIT */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004582
Guido van Rossumad0ee831995-03-01 10:34:45 +00004583#ifdef HAVE_WAIT
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004584PyDoc_STRVAR(posix_wait__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004585"wait() -> (pid, status)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004586Wait for completion of a child process.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004587
Barry Warsaw53699e91996-12-10 23:23:01 +00004588static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004589posix_wait(PyObject *self, PyObject *noargs)
Guido van Rossum21803b81992-08-09 12:55:27 +00004590{
Christian Heimes292d3512008-02-03 16:51:08 +00004591 pid_t pid;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004592 WAIT_TYPE status;
4593 WAIT_STATUS_INT(status) = 0;
Neal Norwitze241ce82003-02-17 18:17:05 +00004594
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00004595 Py_BEGIN_ALLOW_THREADS
4596 pid = wait(&status);
Barry Warsaw53699e91996-12-10 23:23:01 +00004597 Py_END_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +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 Rossum85e3b011991-06-03 12:42:10 +00004602}
Guido van Rossumad0ee831995-03-01 10:34:45 +00004603#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00004604
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004605
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004606PyDoc_STRVAR(posix_lstat__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004607"lstat(path) -> stat result\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004608Like stat(path), but do not follow symbolic links.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004609
Barry Warsaw53699e91996-12-10 23:23:01 +00004610static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004611posix_lstat(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004612{
Guido van Rossumb6775db1994-08-01 11:34:53 +00004613#ifdef HAVE_LSTAT
Martin v. Löwis011e8422009-05-05 04:43:17 +00004614 return posix_do_stat(self, args, "O&:lstat", lstat, NULL, NULL);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004615#else /* !HAVE_LSTAT */
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004616#ifdef MS_WINDOWS
Martin v. Löwis011e8422009-05-05 04:43:17 +00004617 return posix_do_stat(self, args, "O&:lstat", STAT, "U:lstat", win32_wstat);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004618#else
Martin v. Löwis011e8422009-05-05 04:43:17 +00004619 return posix_do_stat(self, args, "O&:lstat", STAT, NULL, NULL);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004620#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004621#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004622}
4623
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004624
Guido van Rossumb6775db1994-08-01 11:34:53 +00004625#ifdef HAVE_READLINK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004626PyDoc_STRVAR(posix_readlink__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004627"readlink(path) -> path\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004628Return a string representing the path to which the symbolic link points.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004629
Barry Warsaw53699e91996-12-10 23:23:01 +00004630static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004631posix_readlink(PyObject *self, PyObject *args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004632{
Thomas Wouters89f507f2006-12-13 04:49:30 +00004633 PyObject* v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00004634 char buf[MAXPATHLEN];
Martin v. Löwis011e8422009-05-05 04:43:17 +00004635 PyObject *opath;
Guido van Rossumef0a00e1992-01-27 16:51:30 +00004636 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004637 int n;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004638 int arg_is_unicode = 0;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004639
Martin v. Löwis011e8422009-05-05 04:43:17 +00004640 if (!PyArg_ParseTuple(args, "O&:readlink",
4641 PyUnicode_FSConverter, &opath))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004642 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00004643 path = bytes2str(opath, 1);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004644 v = PySequence_GetItem(args, 0);
Neal Norwitzcda5c062007-08-12 17:09:36 +00004645 if (v == NULL) {
Martin v. Löwis011e8422009-05-05 04:43:17 +00004646 release_bytes(opath);
Neal Norwitzcda5c062007-08-12 17:09:36 +00004647 return NULL;
4648 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004649
4650 if (PyUnicode_Check(v)) {
4651 arg_is_unicode = 1;
4652 }
4653 Py_DECREF(v);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004654
Barry Warsaw53699e91996-12-10 23:23:01 +00004655 Py_BEGIN_ALLOW_THREADS
Guido van Rossum50e61dc1992-03-27 17:22:31 +00004656 n = readlink(path, buf, (int) sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +00004657 Py_END_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004658 if (n < 0)
Martin v. Löwis011e8422009-05-05 04:43:17 +00004659 return posix_error_with_allocated_filename(opath);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004660
Martin v. Löwis011e8422009-05-05 04:43:17 +00004661 release_bytes(opath);
Christian Heimes72b710a2008-05-26 13:28:38 +00004662 v = PyBytes_FromStringAndSize(buf, n);
Thomas Wouters89f507f2006-12-13 04:49:30 +00004663 if (arg_is_unicode) {
4664 PyObject *w;
4665
4666 w = PyUnicode_FromEncodedObject(v,
4667 Py_FileSystemDefaultEncoding,
Martin v. Löwis43c57782009-05-10 08:15:24 +00004668 "surrogateescape");
Thomas Wouters89f507f2006-12-13 04:49:30 +00004669 if (w != NULL) {
4670 Py_DECREF(v);
4671 v = w;
4672 }
4673 else {
Guido van Rossumf0af3e32008-10-02 18:55:37 +00004674 v = NULL;
Thomas Wouters89f507f2006-12-13 04:49:30 +00004675 }
4676 }
Thomas Wouters89f507f2006-12-13 04:49:30 +00004677 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004678}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004679#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004680
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004681
Guido van Rossumb6775db1994-08-01 11:34:53 +00004682#ifdef HAVE_SYMLINK
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004683PyDoc_STRVAR(posix_symlink__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004684"symlink(src, dst)\n\n\
Brett Cannon807413d2003-06-11 00:18:09 +00004685Create a symbolic link pointing to src named dst.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004686
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004687static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004688posix_symlink(PyObject *self, PyObject *args)
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004689{
Martin v. Löwis011e8422009-05-05 04:43:17 +00004690 return posix_2str(args, "O&O&:symlink", symlink);
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004691}
4692#endif /* HAVE_SYMLINK */
4693
4694
4695#ifdef HAVE_TIMES
Guido van Rossumd48f2521997-12-05 22:19:34 +00004696#if defined(PYCC_VACPP) && defined(PYOS_OS2)
4697static long
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00004698system_uptime(void)
Guido van Rossumd48f2521997-12-05 22:19:34 +00004699{
4700 ULONG value = 0;
4701
4702 Py_BEGIN_ALLOW_THREADS
4703 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &value, sizeof(value));
4704 Py_END_ALLOW_THREADS
4705
4706 return value;
4707}
4708
4709static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004710posix_times(PyObject *self, PyObject *noargs)
Guido van Rossumd48f2521997-12-05 22:19:34 +00004711{
Guido van Rossumd48f2521997-12-05 22:19:34 +00004712 /* Currently Only Uptime is Provided -- Others Later */
4713 return Py_BuildValue("ddddd",
4714 (double)0 /* t.tms_utime / HZ */,
4715 (double)0 /* t.tms_stime / HZ */,
4716 (double)0 /* t.tms_cutime / HZ */,
4717 (double)0 /* t.tms_cstime / HZ */,
4718 (double)system_uptime() / 1000);
4719}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004720#else /* not OS2 */
Martin v. Löwis05bfe1f2008-12-29 18:21:47 +00004721#define NEED_TICKS_PER_SECOND
4722static long ticks_per_second = -1;
Barry Warsaw53699e91996-12-10 23:23:01 +00004723static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004724posix_times(PyObject *self, PyObject *noargs)
Guido van Rossum22db57e1992-04-05 14:25:30 +00004725{
4726 struct tms t;
4727 clock_t c;
Guido van Rossum22db57e1992-04-05 14:25:30 +00004728 errno = 0;
4729 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00004730 if (c == (clock_t) -1)
4731 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004732 return Py_BuildValue("ddddd",
Martin v. Löwis05bfe1f2008-12-29 18:21:47 +00004733 (double)t.tms_utime / ticks_per_second,
4734 (double)t.tms_stime / ticks_per_second,
4735 (double)t.tms_cutime / ticks_per_second,
4736 (double)t.tms_cstime / ticks_per_second,
4737 (double)c / ticks_per_second);
Guido van Rossum22db57e1992-04-05 14:25:30 +00004738}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004739#endif /* not OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004740#endif /* HAVE_TIMES */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004741
4742
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00004743#ifdef MS_WINDOWS
Guido van Rossum14ed0b21994-09-29 09:50:09 +00004744#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00004745static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004746posix_times(PyObject *self, PyObject *noargs)
Guido van Rossum14ed0b21994-09-29 09:50:09 +00004747{
4748 FILETIME create, exit, kernel, user;
4749 HANDLE hProc;
Guido van Rossum14ed0b21994-09-29 09:50:09 +00004750 hProc = GetCurrentProcess();
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00004751 GetProcessTimes(hProc, &create, &exit, &kernel, &user);
4752 /* The fields of a FILETIME structure are the hi and lo part
4753 of a 64-bit value expressed in 100 nanosecond units.
4754 1e7 is one second in such units; 1e-7 the inverse.
4755 429.4967296 is 2**32 / 1e7 or 2**32 * 1e-7.
4756 */
Barry Warsaw53699e91996-12-10 23:23:01 +00004757 return Py_BuildValue(
4758 "ddddd",
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00004759 (double)(user.dwHighDateTime*429.4967296 +
4760 user.dwLowDateTime*1e-7),
Christian Heimes68f5fbe2008-02-14 08:27:37 +00004761 (double)(kernel.dwHighDateTime*429.4967296 +
4762 kernel.dwLowDateTime*1e-7),
Barry Warsaw53699e91996-12-10 23:23:01 +00004763 (double)0,
4764 (double)0,
4765 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00004766}
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00004767#endif /* MS_WINDOWS */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004768
4769#ifdef HAVE_TIMES
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004770PyDoc_STRVAR(posix_times__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004771"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004772Return a tuple of floating point numbers indicating process times.");
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00004773#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00004774
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004775
Martin v. Löwis49ee14d2003-11-10 06:35:36 +00004776#ifdef HAVE_GETSID
4777PyDoc_STRVAR(posix_getsid__doc__,
4778"getsid(pid) -> sid\n\n\
4779Call the system call getsid().");
4780
4781static PyObject *
4782posix_getsid(PyObject *self, PyObject *args)
4783{
Christian Heimes292d3512008-02-03 16:51:08 +00004784 pid_t pid;
4785 int sid;
Gregory P. Smith84508572010-03-14 18:56:11 +00004786 if (!PyArg_ParseTuple(args, _Py_PARSE_PID ":getsid", &pid))
Martin v. Löwis49ee14d2003-11-10 06:35:36 +00004787 return NULL;
4788 sid = getsid(pid);
4789 if (sid < 0)
4790 return posix_error();
Christian Heimes217cfd12007-12-02 14:31:20 +00004791 return PyLong_FromLong((long)sid);
Martin v. Löwis49ee14d2003-11-10 06:35:36 +00004792}
4793#endif /* HAVE_GETSID */
4794
4795
Guido van Rossumb6775db1994-08-01 11:34:53 +00004796#ifdef HAVE_SETSID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004797PyDoc_STRVAR(posix_setsid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004798"setsid()\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004799Call the system call setsid().");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004800
Barry Warsaw53699e91996-12-10 23:23:01 +00004801static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00004802posix_setsid(PyObject *self, PyObject *noargs)
Guido van Rossumc2670a01992-09-13 20:07:29 +00004803{
Guido van Rossum687dd131993-05-17 08:34:16 +00004804 if (setsid() < 0)
4805 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004806 Py_INCREF(Py_None);
4807 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00004808}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004809#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00004810
Guido van Rossumb6775db1994-08-01 11:34:53 +00004811#ifdef HAVE_SETPGID
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004812PyDoc_STRVAR(posix_setpgid__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004813"setpgid(pid, pgrp)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004814Call the system call setpgid().");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004815
Barry Warsaw53699e91996-12-10 23:23:01 +00004816static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004817posix_setpgid(PyObject *self, PyObject *args)
Guido van Rossumc2670a01992-09-13 20:07:29 +00004818{
Christian Heimes292d3512008-02-03 16:51:08 +00004819 pid_t pid;
4820 int pgrp;
Gregory P. Smith84508572010-03-14 18:56:11 +00004821 if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:setpgid", &pid, &pgrp))
Guido van Rossumc2670a01992-09-13 20:07:29 +00004822 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00004823 if (setpgid(pid, pgrp) < 0)
4824 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004825 Py_INCREF(Py_None);
4826 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00004827}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004828#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00004829
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004830
Guido van Rossumb6775db1994-08-01 11:34:53 +00004831#ifdef HAVE_TCGETPGRP
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004832PyDoc_STRVAR(posix_tcgetpgrp__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004833"tcgetpgrp(fd) -> pgid\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004834Return the process group associated with the terminal given by a fd.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004835
Barry Warsaw53699e91996-12-10 23:23:01 +00004836static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004837posix_tcgetpgrp(PyObject *self, PyObject *args)
Guido van Rossum7066dd71992-09-17 17:54:56 +00004838{
Christian Heimes15ebc882008-02-04 18:48:49 +00004839 int fd;
4840 pid_t pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004841 if (!PyArg_ParseTuple(args, "i:tcgetpgrp", &fd))
Guido van Rossum7066dd71992-09-17 17:54:56 +00004842 return NULL;
4843 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00004844 if (pgid < 0)
4845 return posix_error();
Antoine Pitrouc3ee1662009-05-23 16:02:33 +00004846 return PyLong_FromPid(pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00004847}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004848#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00004849
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004850
Guido van Rossumb6775db1994-08-01 11:34:53 +00004851#ifdef HAVE_TCSETPGRP
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004852PyDoc_STRVAR(posix_tcsetpgrp__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004853"tcsetpgrp(fd, pgid)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004854Set the process group associated with the terminal given by a fd.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004855
Barry Warsaw53699e91996-12-10 23:23:01 +00004856static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004857posix_tcsetpgrp(PyObject *self, PyObject *args)
Guido van Rossum7066dd71992-09-17 17:54:56 +00004858{
Antoine Pitrou971e51b2009-05-23 16:14:27 +00004859 int fd;
4860 pid_t pgid;
Gregory P. Smith84508572010-03-14 18:56:11 +00004861 if (!PyArg_ParseTuple(args, "i" _Py_PARSE_PID ":tcsetpgrp", &fd, &pgid))
Guido van Rossum7066dd71992-09-17 17:54:56 +00004862 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00004863 if (tcsetpgrp(fd, pgid) < 0)
4864 return posix_error();
Barry Warsaw43d68b81996-12-19 22:10:44 +00004865 Py_INCREF(Py_None);
Barry Warsaw53699e91996-12-10 23:23:01 +00004866 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00004867}
Guido van Rossumb6775db1994-08-01 11:34:53 +00004868#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00004869
Guido van Rossum687dd131993-05-17 08:34:16 +00004870/* Functions acting on file descriptors */
4871
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004872PyDoc_STRVAR(posix_open__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004873"open(filename, flag [, mode=0777]) -> fd\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004874Open a file (for low level IO).");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004875
Barry Warsaw53699e91996-12-10 23:23:01 +00004876static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004877posix_open(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00004878{
Martin v. Löwis011e8422009-05-05 04:43:17 +00004879 PyObject *ofile;
4880 char *file;
Guido van Rossum687dd131993-05-17 08:34:16 +00004881 int flag;
4882 int mode = 0777;
4883 int fd;
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004884
4885#ifdef MS_WINDOWS
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00004886 PyUnicodeObject *po;
4887 if (PyArg_ParseTuple(args, "Ui|i:mkdir", &po, &flag, &mode)) {
4888 Py_BEGIN_ALLOW_THREADS
4889 /* PyUnicode_AS_UNICODE OK without thread
4890 lock as it is a simple dereference. */
4891 fd = _wopen(PyUnicode_AS_UNICODE(po), flag, mode);
4892 Py_END_ALLOW_THREADS
4893 if (fd < 0)
4894 return posix_error();
4895 return PyLong_FromLong((long)fd);
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004896 }
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00004897 /* Drop the argument parsing error as narrow strings
4898 are also valid. */
4899 PyErr_Clear();
Mark Hammondc2e85bd2002-10-03 05:10:39 +00004900#endif
4901
Martin v. Löwis011e8422009-05-05 04:43:17 +00004902 if (!PyArg_ParseTuple(args, "O&i|i",
4903 PyUnicode_FSConverter, &ofile,
Mark Hammondef8b6542001-05-13 08:04:26 +00004904 &flag, &mode))
Barry Warsaw43d68b81996-12-19 22:10:44 +00004905 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00004906 file = bytes2str(ofile, 1);
Barry Warsaw53699e91996-12-10 23:23:01 +00004907 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00004908 fd = open(file, flag, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00004909 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00004910 if (fd < 0)
Martin v. Löwis011e8422009-05-05 04:43:17 +00004911 return posix_error_with_allocated_filename(ofile);
4912 release_bytes(ofile);
Christian Heimes217cfd12007-12-02 14:31:20 +00004913 return PyLong_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00004914}
4915
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004916
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004917PyDoc_STRVAR(posix_close__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004918"close(fd)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004919Close a file descriptor (for low level IO).");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004920
Barry Warsaw53699e91996-12-10 23:23:01 +00004921static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004922posix_close(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00004923{
4924 int fd, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004925 if (!PyArg_ParseTuple(args, "i:close", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00004926 return NULL;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00004927 if (!_PyVerify_fd(fd))
4928 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004929 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00004930 res = close(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00004931 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00004932 if (res < 0)
4933 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004934 Py_INCREF(Py_None);
4935 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00004936}
4937
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004938
Christian Heimesfdab48e2008-01-20 09:06:41 +00004939PyDoc_STRVAR(posix_closerange__doc__,
4940"closerange(fd_low, fd_high)\n\n\
4941Closes all file descriptors in [fd_low, fd_high), ignoring errors.");
4942
4943static PyObject *
4944posix_closerange(PyObject *self, PyObject *args)
4945{
4946 int fd_from, fd_to, i;
4947 if (!PyArg_ParseTuple(args, "ii:closerange", &fd_from, &fd_to))
4948 return NULL;
4949 Py_BEGIN_ALLOW_THREADS
4950 for (i = fd_from; i < fd_to; i++)
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00004951 if (_PyVerify_fd(i))
4952 close(i);
Christian Heimesfdab48e2008-01-20 09:06:41 +00004953 Py_END_ALLOW_THREADS
4954 Py_RETURN_NONE;
4955}
4956
4957
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004958PyDoc_STRVAR(posix_dup__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00004959"dup(fd) -> fd2\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004960Return a duplicate of a file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004961
Barry Warsaw53699e91996-12-10 23:23:01 +00004962static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004963posix_dup(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00004964{
4965 int fd;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004966 if (!PyArg_ParseTuple(args, "i:dup", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00004967 return NULL;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00004968 if (!_PyVerify_fd(fd))
4969 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004970 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00004971 fd = dup(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00004972 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00004973 if (fd < 0)
4974 return posix_error();
Christian Heimes217cfd12007-12-02 14:31:20 +00004975 return PyLong_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00004976}
4977
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004978
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004979PyDoc_STRVAR(posix_dup2__doc__,
Andrew M. Kuchling8135fd52004-01-16 13:18:42 +00004980"dup2(old_fd, new_fd)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004981Duplicate file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004982
Barry Warsaw53699e91996-12-10 23:23:01 +00004983static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00004984posix_dup2(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00004985{
4986 int fd, fd2, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004987 if (!PyArg_ParseTuple(args, "ii:dup2", &fd, &fd2))
Guido van Rossum687dd131993-05-17 08:34:16 +00004988 return NULL;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00004989 if (!_PyVerify_fd_dup2(fd, fd2))
4990 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004991 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00004992 res = dup2(fd, fd2);
Barry Warsaw53699e91996-12-10 23:23:01 +00004993 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00004994 if (res < 0)
4995 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00004996 Py_INCREF(Py_None);
4997 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00004998}
4999
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005000
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005001PyDoc_STRVAR(posix_lseek__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005002"lseek(fd, pos, how) -> newpos\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005003Set the current position of a file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005004
Barry Warsaw53699e91996-12-10 23:23:01 +00005005static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005006posix_lseek(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005007{
5008 int fd, how;
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005009#if defined(MS_WIN64) || defined(MS_WINDOWS)
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00005010 PY_LONG_LONG pos, res;
Fred Drake699f3522000-06-29 21:12:41 +00005011#else
Guido van Rossum94f6f721999-01-06 18:42:14 +00005012 off_t pos, res;
Fred Drake699f3522000-06-29 21:12:41 +00005013#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00005014 PyObject *posobj;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005015 if (!PyArg_ParseTuple(args, "iOi:lseek", &fd, &posobj, &how))
Guido van Rossum687dd131993-05-17 08:34:16 +00005016 return NULL;
5017#ifdef SEEK_SET
5018 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
5019 switch (how) {
5020 case 0: how = SEEK_SET; break;
5021 case 1: how = SEEK_CUR; break;
5022 case 2: how = SEEK_END; break;
5023 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00005024#endif /* SEEK_END */
Guido van Rossum94f6f721999-01-06 18:42:14 +00005025
5026#if !defined(HAVE_LARGEFILE_SUPPORT)
Christian Heimes217cfd12007-12-02 14:31:20 +00005027 pos = PyLong_AsLong(posobj);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005028#else
5029 pos = PyLong_Check(posobj) ?
Christian Heimes217cfd12007-12-02 14:31:20 +00005030 PyLong_AsLongLong(posobj) : PyLong_AsLong(posobj);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005031#endif
5032 if (PyErr_Occurred())
5033 return NULL;
5034
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00005035 if (!_PyVerify_fd(fd))
5036 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005037 Py_BEGIN_ALLOW_THREADS
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005038#if defined(MS_WIN64) || defined(MS_WINDOWS)
Fred Drake699f3522000-06-29 21:12:41 +00005039 res = _lseeki64(fd, pos, how);
5040#else
Guido van Rossum687dd131993-05-17 08:34:16 +00005041 res = lseek(fd, pos, how);
Fred Drake699f3522000-06-29 21:12:41 +00005042#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00005043 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00005044 if (res < 0)
5045 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00005046
5047#if !defined(HAVE_LARGEFILE_SUPPORT)
Christian Heimes217cfd12007-12-02 14:31:20 +00005048 return PyLong_FromLong(res);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005049#else
5050 return PyLong_FromLongLong(res);
5051#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00005052}
5053
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005054
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005055PyDoc_STRVAR(posix_read__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005056"read(fd, buffersize) -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005057Read a file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005058
Barry Warsaw53699e91996-12-10 23:23:01 +00005059static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005060posix_read(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005061{
Guido van Rossum572dbf82007-04-27 23:53:51 +00005062 int fd, size;
5063 Py_ssize_t n;
Barry Warsaw53699e91996-12-10 23:23:01 +00005064 PyObject *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005065 if (!PyArg_ParseTuple(args, "ii:read", &fd, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00005066 return NULL;
Michael W. Hudson9867ced2005-01-31 17:01:59 +00005067 if (size < 0) {
5068 errno = EINVAL;
5069 return posix_error();
5070 }
Christian Heimes72b710a2008-05-26 13:28:38 +00005071 buffer = PyBytes_FromStringAndSize((char *)NULL, size);
Guido van Rossum687dd131993-05-17 08:34:16 +00005072 if (buffer == NULL)
5073 return NULL;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00005074 if (!_PyVerify_fd(fd))
5075 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005076 Py_BEGIN_ALLOW_THREADS
Christian Heimes72b710a2008-05-26 13:28:38 +00005077 n = read(fd, PyBytes_AS_STRING(buffer), size);
Barry Warsaw53699e91996-12-10 23:23:01 +00005078 Py_END_ALLOW_THREADS
Guido van Rossum8bac5461996-06-11 18:38:48 +00005079 if (n < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00005080 Py_DECREF(buffer);
Guido van Rossum687dd131993-05-17 08:34:16 +00005081 return posix_error();
5082 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00005083 if (n != size)
Christian Heimes72b710a2008-05-26 13:28:38 +00005084 _PyBytes_Resize(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00005085 return buffer;
5086}
5087
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005088
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005089PyDoc_STRVAR(posix_write__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005090"write(fd, string) -> byteswritten\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005091Write a string to a file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005092
Barry Warsaw53699e91996-12-10 23:23:01 +00005093static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005094posix_write(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005095{
Martin v. Löwis423be952008-08-13 15:53:07 +00005096 Py_buffer pbuf;
Thomas Wouters68bc4f92006-03-01 01:05:10 +00005097 int fd;
5098 Py_ssize_t size;
Thomas Wouters68bc4f92006-03-01 01:05:10 +00005099
Antoine Pitrou9cadb1b2008-09-15 23:02:56 +00005100 if (!PyArg_ParseTuple(args, "iy*:write", &fd, &pbuf))
Guido van Rossum687dd131993-05-17 08:34:16 +00005101 return NULL;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00005102 if (!_PyVerify_fd(fd))
5103 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005104 Py_BEGIN_ALLOW_THREADS
Martin v. Löwis423be952008-08-13 15:53:07 +00005105 size = write(fd, pbuf.buf, (size_t)pbuf.len);
Barry Warsaw53699e91996-12-10 23:23:01 +00005106 Py_END_ALLOW_THREADS
Martin v. Löwis423be952008-08-13 15:53:07 +00005107 PyBuffer_Release(&pbuf);
Guido van Rossum687dd131993-05-17 08:34:16 +00005108 if (size < 0)
5109 return posix_error();
Christian Heimes217cfd12007-12-02 14:31:20 +00005110 return PyLong_FromSsize_t(size);
Guido van Rossum687dd131993-05-17 08:34:16 +00005111}
5112
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005113
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005114PyDoc_STRVAR(posix_fstat__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005115"fstat(fd) -> stat result\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005116Like stat(), but for an open file descriptor.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005117
Barry Warsaw53699e91996-12-10 23:23:01 +00005118static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005119posix_fstat(PyObject *self, PyObject *args)
Guido van Rossum687dd131993-05-17 08:34:16 +00005120{
5121 int fd;
Fred Drake699f3522000-06-29 21:12:41 +00005122 STRUCT_STAT st;
Guido van Rossum687dd131993-05-17 08:34:16 +00005123 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005124 if (!PyArg_ParseTuple(args, "i:fstat", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00005125 return NULL;
Martin v. Löwis7a924e62003-03-05 14:15:21 +00005126#ifdef __VMS
5127 /* on OpenVMS we must ensure that all bytes are written to the file */
5128 fsync(fd);
5129#endif
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00005130 if (!_PyVerify_fd(fd))
5131 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005132 Py_BEGIN_ALLOW_THREADS
Fred Drake699f3522000-06-29 21:12:41 +00005133 res = FSTAT(fd, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00005134 Py_END_ALLOW_THREADS
Martin v. Löwis14694662006-02-03 12:54:16 +00005135 if (res != 0) {
5136#ifdef MS_WINDOWS
5137 return win32_error("fstat", NULL);
5138#else
Guido van Rossum687dd131993-05-17 08:34:16 +00005139 return posix_error();
Martin v. Löwis14694662006-02-03 12:54:16 +00005140#endif
5141 }
Tim Peters5aa91602002-01-30 05:46:57 +00005142
Martin v. Löwis14694662006-02-03 12:54:16 +00005143 return _pystat_fromstructstat(&st);
Guido van Rossum687dd131993-05-17 08:34:16 +00005144}
5145
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005146PyDoc_STRVAR(posix_isatty__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005147"isatty(fd) -> bool\n\n\
Fred Drake106c1a02002-04-23 15:58:02 +00005148Return True if the file descriptor 'fd' is an open file descriptor\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005149connected to the slave end of a terminal.");
Skip Montanaro1517d842000-07-19 14:34:14 +00005150
5151static PyObject *
Thomas Wouters616607a2000-07-19 14:45:40 +00005152posix_isatty(PyObject *self, PyObject *args)
Skip Montanaro1517d842000-07-19 14:34:14 +00005153{
5154 int fd;
5155 if (!PyArg_ParseTuple(args, "i:isatty", &fd))
5156 return NULL;
Amaury Forgeot d'Arc2fc224f2009-02-19 23:23:47 +00005157 if (!_PyVerify_fd(fd))
5158 return PyBool_FromLong(0);
Fred Drake106c1a02002-04-23 15:58:02 +00005159 return PyBool_FromLong(isatty(fd));
Skip Montanaro1517d842000-07-19 14:34:14 +00005160}
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005161
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005162#ifdef HAVE_PIPE
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005163PyDoc_STRVAR(posix_pipe__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005164"pipe() -> (read_end, write_end)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005165Create a pipe.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005166
Barry Warsaw53699e91996-12-10 23:23:01 +00005167static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00005168posix_pipe(PyObject *self, PyObject *noargs)
Guido van Rossum687dd131993-05-17 08:34:16 +00005169{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005170#if defined(PYOS_OS2)
5171 HFILE read, write;
5172 APIRET rc;
5173
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005174 Py_BEGIN_ALLOW_THREADS
5175 rc = DosCreatePipe( &read, &write, 4096);
5176 Py_END_ALLOW_THREADS
5177 if (rc != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00005178 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005179
5180 return Py_BuildValue("(ii)", read, write);
5181#else
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005182#if !defined(MS_WINDOWS)
Guido van Rossum687dd131993-05-17 08:34:16 +00005183 int fds[2];
5184 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00005185 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00005186 res = pipe(fds);
Barry Warsaw53699e91996-12-10 23:23:01 +00005187 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00005188 if (res != 0)
5189 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005190 return Py_BuildValue("(ii)", fds[0], fds[1]);
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005191#else /* MS_WINDOWS */
Guido van Rossum794d8131994-08-23 13:48:48 +00005192 HANDLE read, write;
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00005193 int read_fd, write_fd;
Guido van Rossum794d8131994-08-23 13:48:48 +00005194 BOOL ok;
Barry Warsaw53699e91996-12-10 23:23:01 +00005195 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00005196 ok = CreatePipe(&read, &write, NULL, 0);
Barry Warsaw53699e91996-12-10 23:23:01 +00005197 Py_END_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00005198 if (!ok)
Fredrik Lundhffb9c772000-07-09 14:49:51 +00005199 return win32_error("CreatePipe", NULL);
Tim Peters79248aa2001-08-29 21:37:10 +00005200 read_fd = _open_osfhandle((Py_intptr_t)read, 0);
5201 write_fd = _open_osfhandle((Py_intptr_t)write, 1);
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00005202 return Py_BuildValue("(ii)", read_fd, write_fd);
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00005203#endif /* MS_WINDOWS */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00005204#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00005205}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005206#endif /* HAVE_PIPE */
5207
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005208
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005209#ifdef HAVE_MKFIFO
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005210PyDoc_STRVAR(posix_mkfifo__doc__,
Neal Norwitzc18b3082002-10-11 22:19:42 +00005211"mkfifo(filename [, mode=0666])\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005212Create a FIFO (a POSIX named pipe).");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005213
Barry Warsaw53699e91996-12-10 23:23:01 +00005214static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005215posix_mkfifo(PyObject *self, PyObject *args)
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005216{
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005217 char *filename;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005218 int mode = 0666;
5219 int res;
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005220 if (!PyArg_ParseTuple(args, "s|i:mkfifo", &filename, &mode))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005221 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00005222 Py_BEGIN_ALLOW_THREADS
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005223 res = mkfifo(filename, mode);
5224 Py_END_ALLOW_THREADS
5225 if (res < 0)
5226 return posix_error();
5227 Py_INCREF(Py_None);
5228 return Py_None;
5229}
5230#endif
5231
5232
Neal Norwitz11690112002-07-30 01:08:28 +00005233#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005234PyDoc_STRVAR(posix_mknod__doc__,
Neal Norwitzc18b3082002-10-11 22:19:42 +00005235"mknod(filename [, mode=0600, device])\n\n\
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005236Create a filesystem node (file, device special file or named pipe)\n\
5237named filename. mode specifies both the permissions to use and the\n\
5238type of node to be created, being combined (bitwise OR) with one of\n\
5239S_IFREG, S_IFCHR, S_IFBLK, and S_IFIFO. For S_IFCHR and S_IFBLK,\n\
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005240device defines the newly created device special file (probably using\n\
5241os.makedev()), otherwise it is ignored.");
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005242
5243
5244static PyObject *
5245posix_mknod(PyObject *self, PyObject *args)
5246{
5247 char *filename;
5248 int mode = 0600;
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005249 int device = 0;
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005250 int res;
Martin v. Löwisd631ebe2002-11-02 17:42:33 +00005251 if (!PyArg_ParseTuple(args, "s|ii:mknod", &filename, &mode, &device))
Martin v. Löwis06a83e92002-04-14 10:19:44 +00005252 return NULL;
5253 Py_BEGIN_ALLOW_THREADS
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005254 res = mknod(filename, mode, device);
Barry Warsaw53699e91996-12-10 23:23:01 +00005255 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005256 if (res < 0)
5257 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005258 Py_INCREF(Py_None);
5259 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005260}
5261#endif
5262
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005263#ifdef HAVE_DEVICE_MACROS
5264PyDoc_STRVAR(posix_major__doc__,
5265"major(device) -> major number\n\
5266Extracts a device major number from a raw device number.");
5267
5268static PyObject *
5269posix_major(PyObject *self, PyObject *args)
5270{
5271 int device;
5272 if (!PyArg_ParseTuple(args, "i:major", &device))
5273 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +00005274 return PyLong_FromLong((long)major(device));
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005275}
5276
5277PyDoc_STRVAR(posix_minor__doc__,
5278"minor(device) -> minor number\n\
5279Extracts a device minor number from a raw device number.");
5280
5281static PyObject *
5282posix_minor(PyObject *self, PyObject *args)
5283{
5284 int device;
5285 if (!PyArg_ParseTuple(args, "i:minor", &device))
5286 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +00005287 return PyLong_FromLong((long)minor(device));
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005288}
5289
5290PyDoc_STRVAR(posix_makedev__doc__,
5291"makedev(major, minor) -> device number\n\
5292Composes a raw device number from the major and minor device numbers.");
5293
5294static PyObject *
5295posix_makedev(PyObject *self, PyObject *args)
5296{
5297 int major, minor;
5298 if (!PyArg_ParseTuple(args, "ii:makedev", &major, &minor))
5299 return NULL;
Christian Heimes217cfd12007-12-02 14:31:20 +00005300 return PyLong_FromLong((long)makedev(major, minor));
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00005301}
5302#endif /* device macros */
5303
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005304
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005305#ifdef HAVE_FTRUNCATE
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005306PyDoc_STRVAR(posix_ftruncate__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005307"ftruncate(fd, length)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005308Truncate a file to a specified length.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005309
Barry Warsaw53699e91996-12-10 23:23:01 +00005310static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005311posix_ftruncate(PyObject *self, PyObject *args)
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005312{
5313 int fd;
Guido van Rossum94f6f721999-01-06 18:42:14 +00005314 off_t length;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005315 int res;
Guido van Rossum94f6f721999-01-06 18:42:14 +00005316 PyObject *lenobj;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005317
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005318 if (!PyArg_ParseTuple(args, "iO:ftruncate", &fd, &lenobj))
Guido van Rossum94f6f721999-01-06 18:42:14 +00005319 return NULL;
5320
5321#if !defined(HAVE_LARGEFILE_SUPPORT)
Christian Heimes217cfd12007-12-02 14:31:20 +00005322 length = PyLong_AsLong(lenobj);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005323#else
5324 length = PyLong_Check(lenobj) ?
Christian Heimes217cfd12007-12-02 14:31:20 +00005325 PyLong_AsLongLong(lenobj) : PyLong_AsLong(lenobj);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005326#endif
5327 if (PyErr_Occurred())
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005328 return NULL;
5329
Barry Warsaw53699e91996-12-10 23:23:01 +00005330 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005331 res = ftruncate(fd, length);
Barry Warsaw53699e91996-12-10 23:23:01 +00005332 Py_END_ALLOW_THREADS
Benjamin Peterson9053d752009-01-19 17:53:36 +00005333 if (res < 0)
5334 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00005335 Py_INCREF(Py_None);
5336 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00005337}
5338#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00005339
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005340#ifdef HAVE_PUTENV
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005341PyDoc_STRVAR(posix_putenv__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005342"putenv(key, value)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005343Change or add an environment variable.");
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00005344
Fred Drake762e2061999-08-26 17:23:54 +00005345/* Save putenv() parameters as values here, so we can collect them when they
5346 * get re-set with another call for the same key. */
5347static PyObject *posix_putenv_garbage;
5348
Tim Peters5aa91602002-01-30 05:46:57 +00005349static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005350posix_putenv(PyObject *self, PyObject *args)
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005351{
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005352#ifdef MS_WINDOWS
5353 wchar_t *s1, *s2;
5354 wchar_t *newenv;
5355#else
Martin v. Löwis011e8422009-05-05 04:43:17 +00005356 PyObject *os1, *os2;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005357 char *s1, *s2;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005358 char *newenv;
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005359#endif
Fred Drake762e2061999-08-26 17:23:54 +00005360 PyObject *newstr;
Tim Petersc8996f52001-12-03 20:41:00 +00005361 size_t len;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005362
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005363#ifdef MS_WINDOWS
Martin v. Löwis011e8422009-05-05 04:43:17 +00005364 if (!PyArg_ParseTuple(args,
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005365 "uu:putenv",
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005366 &s1, &s2))
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005367 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00005368#else
5369 if (!PyArg_ParseTuple(args,
5370 "O&O&:putenv",
5371 PyUnicode_FSConverter, &os1,
5372 PyUnicode_FSConverter, &os2))
5373 return NULL;
5374 s1 = bytes2str(os1, 1);
5375 s2 = bytes2str(os2, 1);
5376#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +00005377
5378#if defined(PYOS_OS2)
5379 if (stricmp(s1, "BEGINLIBPATH") == 0) {
5380 APIRET rc;
5381
Guido van Rossumd48f2521997-12-05 22:19:34 +00005382 rc = DosSetExtLIBPATH(s2, BEGIN_LIBPATH);
5383 if (rc != NO_ERROR)
5384 return os2_error(rc);
5385
5386 } else if (stricmp(s1, "ENDLIBPATH") == 0) {
5387 APIRET rc;
5388
Guido van Rossumd48f2521997-12-05 22:19:34 +00005389 rc = DosSetExtLIBPATH(s2, END_LIBPATH);
5390 if (rc != NO_ERROR)
5391 return os2_error(rc);
5392 } else {
5393#endif
Fred Drake762e2061999-08-26 17:23:54 +00005394 /* XXX This can leak memory -- not easy to fix :-( */
Tim Petersc8996f52001-12-03 20:41:00 +00005395 /* len includes space for a trailing \0; the size arg to
Christian Heimes72b710a2008-05-26 13:28:38 +00005396 PyBytes_FromStringAndSize does not count that */
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005397#ifdef MS_WINDOWS
5398 len = wcslen(s1) + wcslen(s2) + 2;
5399 newstr = PyUnicode_FromUnicode(NULL, (int)len - 1);
5400#else
5401 len = strlen(s1) + strlen(s2) + 2;
Christian Heimes72b710a2008-05-26 13:28:38 +00005402 newstr = PyBytes_FromStringAndSize(NULL, (int)len - 1);
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005403#endif
Fred Drake762e2061999-08-26 17:23:54 +00005404 if (newstr == NULL)
5405 return PyErr_NoMemory();
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005406#ifdef MS_WINDOWS
5407 newenv = PyUnicode_AsUnicode(newstr);
5408 _snwprintf(newenv, len, L"%s=%s", s1, s2);
5409 if (_wputenv(newenv)) {
5410 Py_DECREF(newstr);
5411 posix_error();
5412 return NULL;
5413 }
5414#else
Christian Heimes72b710a2008-05-26 13:28:38 +00005415 newenv = PyBytes_AS_STRING(newstr);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005416 PyOS_snprintf(newenv, len, "%s=%s", s1, s2);
5417 if (putenv(newenv)) {
Neal Norwitz4adc9ab2003-02-10 03:10:43 +00005418 Py_DECREF(newstr);
Martin v. Löwis011e8422009-05-05 04:43:17 +00005419 release_bytes(os1);
5420 release_bytes(os2);
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005421 posix_error();
5422 return NULL;
5423 }
Thomas Hellerf78f12a2007-11-08 19:33:05 +00005424#endif
Fred Drake762e2061999-08-26 17:23:54 +00005425 /* Install the first arg and newstr in posix_putenv_garbage;
5426 * this will cause previous value to be collected. This has to
5427 * happen after the real putenv() call because the old value
5428 * was still accessible until then. */
5429 if (PyDict_SetItem(posix_putenv_garbage,
5430 PyTuple_GET_ITEM(args, 0), newstr)) {
5431 /* really not much we can do; just leak */
5432 PyErr_Clear();
5433 }
5434 else {
5435 Py_DECREF(newstr);
5436 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00005437
5438#if defined(PYOS_OS2)
5439 }
5440#endif
Martin v. Löwis011e8422009-05-05 04:43:17 +00005441#ifndef MS_WINDOWS
5442 release_bytes(os1);
5443 release_bytes(os2);
5444#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00005445 Py_INCREF(Py_None);
5446 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005447}
Guido van Rossumb6a47161997-09-15 22:54:34 +00005448#endif /* putenv */
5449
Guido van Rossumc524d952001-10-19 01:31:59 +00005450#ifdef HAVE_UNSETENV
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005451PyDoc_STRVAR(posix_unsetenv__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005452"unsetenv(key)\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005453Delete an environment variable.");
Guido van Rossumc524d952001-10-19 01:31:59 +00005454
5455static PyObject *
5456posix_unsetenv(PyObject *self, PyObject *args)
5457{
5458 char *s1;
5459
5460 if (!PyArg_ParseTuple(args, "s:unsetenv", &s1))
5461 return NULL;
5462
5463 unsetenv(s1);
5464
5465 /* Remove the key from posix_putenv_garbage;
5466 * this will cause it to be collected. This has to
Tim Peters5aa91602002-01-30 05:46:57 +00005467 * happen after the real unsetenv() call because the
Guido van Rossumc524d952001-10-19 01:31:59 +00005468 * old value was still accessible until then.
5469 */
5470 if (PyDict_DelItem(posix_putenv_garbage,
5471 PyTuple_GET_ITEM(args, 0))) {
5472 /* really not much we can do; just leak */
5473 PyErr_Clear();
5474 }
5475
5476 Py_INCREF(Py_None);
5477 return Py_None;
5478}
5479#endif /* unsetenv */
5480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005481PyDoc_STRVAR(posix_strerror__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005482"strerror(code) -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005483Translate an error code to a message string.");
Guido van Rossumb6a47161997-09-15 22:54:34 +00005484
Guido van Rossumf68d8e52001-04-14 17:55:09 +00005485static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005486posix_strerror(PyObject *self, PyObject *args)
Guido van Rossumb6a47161997-09-15 22:54:34 +00005487{
5488 int code;
5489 char *message;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005490 if (!PyArg_ParseTuple(args, "i:strerror", &code))
Guido van Rossumb6a47161997-09-15 22:54:34 +00005491 return NULL;
5492 message = strerror(code);
5493 if (message == NULL) {
5494 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00005495 "strerror() argument out of range");
Guido van Rossumb6a47161997-09-15 22:54:34 +00005496 return NULL;
5497 }
Neal Norwitz93c56822007-08-26 07:10:06 +00005498 return PyUnicode_FromString(message);
Guido van Rossumb6a47161997-09-15 22:54:34 +00005499}
Guido van Rossumb6a47161997-09-15 22:54:34 +00005500
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00005501
Guido van Rossumc9641791998-08-04 15:26:23 +00005502#ifdef HAVE_SYS_WAIT_H
5503
Fred Drake106c1a02002-04-23 15:58:02 +00005504#ifdef WCOREDUMP
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005505PyDoc_STRVAR(posix_WCOREDUMP__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005506"WCOREDUMP(status) -> bool\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005507Return True if the process returning 'status' was dumped to a core file.");
Fred Drake106c1a02002-04-23 15:58:02 +00005508
5509static PyObject *
5510posix_WCOREDUMP(PyObject *self, PyObject *args)
5511{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005512 WAIT_TYPE status;
5513 WAIT_STATUS_INT(status) = 0;
Fred Drake106c1a02002-04-23 15:58:02 +00005514
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005515 if (!PyArg_ParseTuple(args, "i:WCOREDUMP", &WAIT_STATUS_INT(status)))
Fred Drake106c1a02002-04-23 15:58:02 +00005516 return NULL;
Fred Drake106c1a02002-04-23 15:58:02 +00005517
5518 return PyBool_FromLong(WCOREDUMP(status));
Fred Drake106c1a02002-04-23 15:58:02 +00005519}
5520#endif /* WCOREDUMP */
5521
5522#ifdef WIFCONTINUED
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005523PyDoc_STRVAR(posix_WIFCONTINUED__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005524"WIFCONTINUED(status) -> bool\n\n\
Fred Drake106c1a02002-04-23 15:58:02 +00005525Return True if the process returning 'status' was continued from a\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005526job control stop.");
Fred Drake106c1a02002-04-23 15:58:02 +00005527
5528static PyObject *
Martin v. Löwis2b41b0d2002-05-04 13:13:41 +00005529posix_WIFCONTINUED(PyObject *self, PyObject *args)
Fred Drake106c1a02002-04-23 15:58:02 +00005530{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005531 WAIT_TYPE status;
5532 WAIT_STATUS_INT(status) = 0;
Fred Drake106c1a02002-04-23 15:58:02 +00005533
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005534 if (!PyArg_ParseTuple(args, "i:WCONTINUED", &WAIT_STATUS_INT(status)))
Fred Drake106c1a02002-04-23 15:58:02 +00005535 return NULL;
Fred Drake106c1a02002-04-23 15:58:02 +00005536
Martin v. Löwis2b41b0d2002-05-04 13:13:41 +00005537 return PyBool_FromLong(WIFCONTINUED(status));
Fred Drake106c1a02002-04-23 15:58:02 +00005538}
5539#endif /* WIFCONTINUED */
5540
Guido van Rossumc9641791998-08-04 15:26:23 +00005541#ifdef WIFSTOPPED
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005542PyDoc_STRVAR(posix_WIFSTOPPED__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005543"WIFSTOPPED(status) -> bool\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005544Return True if the process returning 'status' was stopped.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005545
5546static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005547posix_WIFSTOPPED(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005548{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005549 WAIT_TYPE status;
5550 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005551
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005552 if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &WAIT_STATUS_INT(status)))
Guido van Rossumc9641791998-08-04 15:26:23 +00005553 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005554
Fred Drake106c1a02002-04-23 15:58:02 +00005555 return PyBool_FromLong(WIFSTOPPED(status));
Guido van Rossumc9641791998-08-04 15:26:23 +00005556}
5557#endif /* WIFSTOPPED */
5558
5559#ifdef WIFSIGNALED
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005560PyDoc_STRVAR(posix_WIFSIGNALED__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005561"WIFSIGNALED(status) -> bool\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005562Return True if the process returning 'status' was terminated by a signal.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005563
5564static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005565posix_WIFSIGNALED(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005566{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005567 WAIT_TYPE status;
5568 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005569
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005570 if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &WAIT_STATUS_INT(status)))
Guido van Rossumc9641791998-08-04 15:26:23 +00005571 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005572
Fred Drake106c1a02002-04-23 15:58:02 +00005573 return PyBool_FromLong(WIFSIGNALED(status));
Guido van Rossumc9641791998-08-04 15:26:23 +00005574}
5575#endif /* WIFSIGNALED */
5576
5577#ifdef WIFEXITED
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005578PyDoc_STRVAR(posix_WIFEXITED__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005579"WIFEXITED(status) -> bool\n\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00005580Return true if the process returning 'status' exited using the exit()\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005581system call.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005582
5583static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005584posix_WIFEXITED(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005585{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005586 WAIT_TYPE status;
5587 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005588
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005589 if (!PyArg_ParseTuple(args, "i:WIFEXITED", &WAIT_STATUS_INT(status)))
Guido van Rossumc9641791998-08-04 15:26:23 +00005590 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005591
Fred Drake106c1a02002-04-23 15:58:02 +00005592 return PyBool_FromLong(WIFEXITED(status));
Guido van Rossumc9641791998-08-04 15:26:23 +00005593}
5594#endif /* WIFEXITED */
5595
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00005596#ifdef WEXITSTATUS
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005597PyDoc_STRVAR(posix_WEXITSTATUS__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005598"WEXITSTATUS(status) -> integer\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005599Return the process return code from 'status'.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005600
5601static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005602posix_WEXITSTATUS(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005603{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005604 WAIT_TYPE status;
5605 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005606
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005607 if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &WAIT_STATUS_INT(status)))
Guido van Rossumc9641791998-08-04 15:26:23 +00005608 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005609
Guido van Rossumc9641791998-08-04 15:26:23 +00005610 return Py_BuildValue("i", WEXITSTATUS(status));
5611}
5612#endif /* WEXITSTATUS */
5613
5614#ifdef WTERMSIG
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005615PyDoc_STRVAR(posix_WTERMSIG__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005616"WTERMSIG(status) -> integer\n\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00005617Return the signal that terminated the process that provided the 'status'\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005618value.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005619
5620static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005621posix_WTERMSIG(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005622{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005623 WAIT_TYPE status;
5624 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005625
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005626 if (!PyArg_ParseTuple(args, "i:WTERMSIG", &WAIT_STATUS_INT(status)))
Guido van Rossumc9641791998-08-04 15:26:23 +00005627 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005628
Guido van Rossumc9641791998-08-04 15:26:23 +00005629 return Py_BuildValue("i", WTERMSIG(status));
5630}
5631#endif /* WTERMSIG */
5632
5633#ifdef WSTOPSIG
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005634PyDoc_STRVAR(posix_WSTOPSIG__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005635"WSTOPSIG(status) -> integer\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005636Return the signal that stopped the process that provided\n\
5637the 'status' value.");
Guido van Rossumc9641791998-08-04 15:26:23 +00005638
5639static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005640posix_WSTOPSIG(PyObject *self, PyObject *args)
Guido van Rossumc9641791998-08-04 15:26:23 +00005641{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005642 WAIT_TYPE status;
5643 WAIT_STATUS_INT(status) = 0;
Tim Peters5aa91602002-01-30 05:46:57 +00005644
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00005645 if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &WAIT_STATUS_INT(status)))
Guido van Rossumc9641791998-08-04 15:26:23 +00005646 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00005647
Guido van Rossumc9641791998-08-04 15:26:23 +00005648 return Py_BuildValue("i", WSTOPSIG(status));
5649}
5650#endif /* WSTOPSIG */
5651
5652#endif /* HAVE_SYS_WAIT_H */
5653
5654
Thomas Wouters477c8d52006-05-27 19:21:47 +00005655#if defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H)
Guido van Rossumd5753e11999-10-19 13:29:23 +00005656#ifdef _SCO_DS
5657/* SCO OpenServer 5.0 and later requires _SVID3 before it reveals the
5658 needed definitions in sys/statvfs.h */
5659#define _SVID3
5660#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00005661#include <sys/statvfs.h>
5662
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005663static PyObject*
5664_pystatvfs_fromstructstatvfs(struct statvfs st) {
5665 PyObject *v = PyStructSequence_New(&StatVFSResultType);
5666 if (v == NULL)
5667 return NULL;
5668
5669#if !defined(HAVE_LARGEFILE_SUPPORT)
Christian Heimes217cfd12007-12-02 14:31:20 +00005670 PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize));
5671 PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize));
5672 PyStructSequence_SET_ITEM(v, 2, PyLong_FromLong((long) st.f_blocks));
5673 PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long) st.f_bfree));
5674 PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong((long) st.f_bavail));
5675 PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong((long) st.f_files));
5676 PyStructSequence_SET_ITEM(v, 6, PyLong_FromLong((long) st.f_ffree));
5677 PyStructSequence_SET_ITEM(v, 7, PyLong_FromLong((long) st.f_favail));
5678 PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag));
5679 PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax));
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005680#else
Christian Heimes217cfd12007-12-02 14:31:20 +00005681 PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long) st.f_bsize));
5682 PyStructSequence_SET_ITEM(v, 1, PyLong_FromLong((long) st.f_frsize));
Tim Peters5aa91602002-01-30 05:46:57 +00005683 PyStructSequence_SET_ITEM(v, 2,
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00005684 PyLong_FromLongLong((PY_LONG_LONG) st.f_blocks));
Tim Peters5aa91602002-01-30 05:46:57 +00005685 PyStructSequence_SET_ITEM(v, 3,
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00005686 PyLong_FromLongLong((PY_LONG_LONG) st.f_bfree));
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005687 PyStructSequence_SET_ITEM(v, 4,
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00005688 PyLong_FromLongLong((PY_LONG_LONG) st.f_bavail));
Tim Peters5aa91602002-01-30 05:46:57 +00005689 PyStructSequence_SET_ITEM(v, 5,
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00005690 PyLong_FromLongLong((PY_LONG_LONG) st.f_files));
Tim Peters5aa91602002-01-30 05:46:57 +00005691 PyStructSequence_SET_ITEM(v, 6,
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00005692 PyLong_FromLongLong((PY_LONG_LONG) st.f_ffree));
Tim Peters5aa91602002-01-30 05:46:57 +00005693 PyStructSequence_SET_ITEM(v, 7,
Martin v. Löwisb9a0f912003-03-29 10:06:18 +00005694 PyLong_FromLongLong((PY_LONG_LONG) st.f_favail));
Christian Heimes217cfd12007-12-02 14:31:20 +00005695 PyStructSequence_SET_ITEM(v, 8, PyLong_FromLong((long) st.f_flag));
5696 PyStructSequence_SET_ITEM(v, 9, PyLong_FromLong((long) st.f_namemax));
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005697#endif
5698
5699 return v;
5700}
5701
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005702PyDoc_STRVAR(posix_fstatvfs__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005703"fstatvfs(fd) -> statvfs result\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005704Perform an fstatvfs system call on the given fd.");
Guido van Rossum94f6f721999-01-06 18:42:14 +00005705
5706static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005707posix_fstatvfs(PyObject *self, PyObject *args)
Guido van Rossum94f6f721999-01-06 18:42:14 +00005708{
5709 int fd, res;
5710 struct statvfs st;
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005711
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005712 if (!PyArg_ParseTuple(args, "i:fstatvfs", &fd))
Guido van Rossum94f6f721999-01-06 18:42:14 +00005713 return NULL;
5714 Py_BEGIN_ALLOW_THREADS
5715 res = fstatvfs(fd, &st);
5716 Py_END_ALLOW_THREADS
5717 if (res != 0)
5718 return posix_error();
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005719
5720 return _pystatvfs_fromstructstatvfs(st);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005721}
Thomas Wouters477c8d52006-05-27 19:21:47 +00005722#endif /* HAVE_FSTATVFS && HAVE_SYS_STATVFS_H */
Guido van Rossum94f6f721999-01-06 18:42:14 +00005723
5724
Thomas Wouters477c8d52006-05-27 19:21:47 +00005725#if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H)
Guido van Rossum94f6f721999-01-06 18:42:14 +00005726#include <sys/statvfs.h>
5727
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005728PyDoc_STRVAR(posix_statvfs__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005729"statvfs(path) -> statvfs result\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005730Perform a statvfs system call on the given path.");
Guido van Rossum94f6f721999-01-06 18:42:14 +00005731
5732static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005733posix_statvfs(PyObject *self, PyObject *args)
Guido van Rossum94f6f721999-01-06 18:42:14 +00005734{
5735 char *path;
5736 int res;
5737 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00005738 if (!PyArg_ParseTuple(args, "s:statvfs", &path))
Guido van Rossum94f6f721999-01-06 18:42:14 +00005739 return NULL;
5740 Py_BEGIN_ALLOW_THREADS
5741 res = statvfs(path, &st);
5742 Py_END_ALLOW_THREADS
5743 if (res != 0)
5744 return posix_error_with_filename(path);
Guido van Rossum98bf58f2001-10-18 20:34:25 +00005745
5746 return _pystatvfs_fromstructstatvfs(st);
Guido van Rossum94f6f721999-01-06 18:42:14 +00005747}
5748#endif /* HAVE_STATVFS */
5749
Fred Drakec9680921999-12-13 16:37:25 +00005750/* This is used for fpathconf(), pathconf(), confstr() and sysconf().
5751 * It maps strings representing configuration variable names to
5752 * integer values, allowing those functions to be called with the
Thomas Wouters7e474022000-07-16 12:04:32 +00005753 * magic names instead of polluting the module's namespace with tons of
Fred Drake12c6e2d1999-12-14 21:25:03 +00005754 * rarely-used constants. There are three separate tables that use
5755 * these definitions.
Fred Drakebec628d1999-12-15 18:31:10 +00005756 *
5757 * This code is always included, even if none of the interfaces that
5758 * need it are included. The #if hackery needed to avoid it would be
5759 * sufficiently pervasive that it's not worth the loss of readability.
Fred Drakec9680921999-12-13 16:37:25 +00005760 */
5761struct constdef {
5762 char *name;
5763 long value;
5764};
5765
Fred Drake12c6e2d1999-12-14 21:25:03 +00005766static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005767conv_confname(PyObject *arg, int *valuep, struct constdef *table,
Guido van Rossum7d5baac2007-08-27 23:24:46 +00005768 size_t tablesize)
Fred Drake12c6e2d1999-12-14 21:25:03 +00005769{
Christian Heimes217cfd12007-12-02 14:31:20 +00005770 if (PyLong_Check(arg)) {
5771 *valuep = PyLong_AS_LONG(arg);
Fred Drake12c6e2d1999-12-14 21:25:03 +00005772 return 1;
5773 }
Guido van Rossumbce56a62007-05-10 18:04:33 +00005774 else {
Fred Drake12c6e2d1999-12-14 21:25:03 +00005775 /* look up the value in the table using a binary search */
Fred Drake699f3522000-06-29 21:12:41 +00005776 size_t lo = 0;
Guido van Rossum7d5baac2007-08-27 23:24:46 +00005777 size_t mid;
Fred Drake699f3522000-06-29 21:12:41 +00005778 size_t hi = tablesize;
5779 int cmp;
Guido van Rossumbce56a62007-05-10 18:04:33 +00005780 const char *confname;
Guido van Rossum7d5baac2007-08-27 23:24:46 +00005781 if (!PyUnicode_Check(arg)) {
Guido van Rossumbce56a62007-05-10 18:04:33 +00005782 PyErr_SetString(PyExc_TypeError,
5783 "configuration names must be strings or integers");
5784 return 0;
5785 }
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00005786 confname = _PyUnicode_AsString(arg);
Guido van Rossum7d5baac2007-08-27 23:24:46 +00005787 if (confname == NULL)
5788 return 0;
Fred Drake12c6e2d1999-12-14 21:25:03 +00005789 while (lo < hi) {
5790 mid = (lo + hi) / 2;
5791 cmp = strcmp(confname, table[mid].name);
5792 if (cmp < 0)
5793 hi = mid;
5794 else if (cmp > 0)
5795 lo = mid + 1;
5796 else {
5797 *valuep = table[mid].value;
5798 return 1;
5799 }
5800 }
5801 PyErr_SetString(PyExc_ValueError, "unrecognized configuration name");
Guido van Rossumbce56a62007-05-10 18:04:33 +00005802 return 0;
Fred Drake12c6e2d1999-12-14 21:25:03 +00005803 }
Fred Drake12c6e2d1999-12-14 21:25:03 +00005804}
5805
5806
5807#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
5808static struct constdef posix_constants_pathconf[] = {
Fred Draked86ed291999-12-15 15:34:33 +00005809#ifdef _PC_ABI_AIO_XFER_MAX
5810 {"PC_ABI_AIO_XFER_MAX", _PC_ABI_AIO_XFER_MAX},
5811#endif
5812#ifdef _PC_ABI_ASYNC_IO
5813 {"PC_ABI_ASYNC_IO", _PC_ABI_ASYNC_IO},
5814#endif
Fred Drakec9680921999-12-13 16:37:25 +00005815#ifdef _PC_ASYNC_IO
5816 {"PC_ASYNC_IO", _PC_ASYNC_IO},
5817#endif
5818#ifdef _PC_CHOWN_RESTRICTED
5819 {"PC_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED},
5820#endif
5821#ifdef _PC_FILESIZEBITS
5822 {"PC_FILESIZEBITS", _PC_FILESIZEBITS},
5823#endif
5824#ifdef _PC_LAST
5825 {"PC_LAST", _PC_LAST},
5826#endif
5827#ifdef _PC_LINK_MAX
5828 {"PC_LINK_MAX", _PC_LINK_MAX},
5829#endif
5830#ifdef _PC_MAX_CANON
5831 {"PC_MAX_CANON", _PC_MAX_CANON},
5832#endif
5833#ifdef _PC_MAX_INPUT
5834 {"PC_MAX_INPUT", _PC_MAX_INPUT},
5835#endif
5836#ifdef _PC_NAME_MAX
5837 {"PC_NAME_MAX", _PC_NAME_MAX},
5838#endif
5839#ifdef _PC_NO_TRUNC
5840 {"PC_NO_TRUNC", _PC_NO_TRUNC},
5841#endif
5842#ifdef _PC_PATH_MAX
5843 {"PC_PATH_MAX", _PC_PATH_MAX},
5844#endif
5845#ifdef _PC_PIPE_BUF
5846 {"PC_PIPE_BUF", _PC_PIPE_BUF},
5847#endif
5848#ifdef _PC_PRIO_IO
5849 {"PC_PRIO_IO", _PC_PRIO_IO},
5850#endif
5851#ifdef _PC_SOCK_MAXBUF
5852 {"PC_SOCK_MAXBUF", _PC_SOCK_MAXBUF},
5853#endif
5854#ifdef _PC_SYNC_IO
5855 {"PC_SYNC_IO", _PC_SYNC_IO},
5856#endif
5857#ifdef _PC_VDISABLE
5858 {"PC_VDISABLE", _PC_VDISABLE},
5859#endif
5860};
5861
Fred Drakec9680921999-12-13 16:37:25 +00005862static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005863conv_path_confname(PyObject *arg, int *valuep)
Fred Drakec9680921999-12-13 16:37:25 +00005864{
5865 return conv_confname(arg, valuep, posix_constants_pathconf,
5866 sizeof(posix_constants_pathconf)
5867 / sizeof(struct constdef));
5868}
5869#endif
5870
5871#ifdef HAVE_FPATHCONF
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005872PyDoc_STRVAR(posix_fpathconf__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005873"fpathconf(fd, name) -> integer\n\n\
Fred Drakec9680921999-12-13 16:37:25 +00005874Return the configuration limit name for the file descriptor fd.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005875If there is no limit, return -1.");
Fred Drakec9680921999-12-13 16:37:25 +00005876
5877static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005878posix_fpathconf(PyObject *self, PyObject *args)
Fred Drakec9680921999-12-13 16:37:25 +00005879{
5880 PyObject *result = NULL;
5881 int name, fd;
5882
Fred Drake12c6e2d1999-12-14 21:25:03 +00005883 if (PyArg_ParseTuple(args, "iO&:fpathconf", &fd,
5884 conv_path_confname, &name)) {
Fred Drakec9680921999-12-13 16:37:25 +00005885 long limit;
5886
5887 errno = 0;
5888 limit = fpathconf(fd, name);
5889 if (limit == -1 && errno != 0)
5890 posix_error();
5891 else
Christian Heimes217cfd12007-12-02 14:31:20 +00005892 result = PyLong_FromLong(limit);
Fred Drakec9680921999-12-13 16:37:25 +00005893 }
5894 return result;
5895}
5896#endif
5897
5898
5899#ifdef HAVE_PATHCONF
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005900PyDoc_STRVAR(posix_pathconf__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00005901"pathconf(path, name) -> integer\n\n\
Fred Drakec9680921999-12-13 16:37:25 +00005902Return the configuration limit name for the file or directory path.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005903If there is no limit, return -1.");
Fred Drakec9680921999-12-13 16:37:25 +00005904
5905static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00005906posix_pathconf(PyObject *self, PyObject *args)
Fred Drakec9680921999-12-13 16:37:25 +00005907{
5908 PyObject *result = NULL;
5909 int name;
5910 char *path;
5911
5912 if (PyArg_ParseTuple(args, "sO&:pathconf", &path,
5913 conv_path_confname, &name)) {
5914 long limit;
5915
5916 errno = 0;
5917 limit = pathconf(path, name);
Fred Drake12c6e2d1999-12-14 21:25:03 +00005918 if (limit == -1 && errno != 0) {
Fred Drakec9680921999-12-13 16:37:25 +00005919 if (errno == EINVAL)
5920 /* could be a path or name problem */
5921 posix_error();
5922 else
5923 posix_error_with_filename(path);
Fred Drake12c6e2d1999-12-14 21:25:03 +00005924 }
Fred Drakec9680921999-12-13 16:37:25 +00005925 else
Christian Heimes217cfd12007-12-02 14:31:20 +00005926 result = PyLong_FromLong(limit);
Fred Drakec9680921999-12-13 16:37:25 +00005927 }
5928 return result;
5929}
5930#endif
5931
5932#ifdef HAVE_CONFSTR
5933static struct constdef posix_constants_confstr[] = {
Fred Draked86ed291999-12-15 15:34:33 +00005934#ifdef _CS_ARCHITECTURE
5935 {"CS_ARCHITECTURE", _CS_ARCHITECTURE},
5936#endif
5937#ifdef _CS_HOSTNAME
5938 {"CS_HOSTNAME", _CS_HOSTNAME},
5939#endif
5940#ifdef _CS_HW_PROVIDER
5941 {"CS_HW_PROVIDER", _CS_HW_PROVIDER},
5942#endif
5943#ifdef _CS_HW_SERIAL
5944 {"CS_HW_SERIAL", _CS_HW_SERIAL},
5945#endif
5946#ifdef _CS_INITTAB_NAME
5947 {"CS_INITTAB_NAME", _CS_INITTAB_NAME},
5948#endif
Fred Drakec9680921999-12-13 16:37:25 +00005949#ifdef _CS_LFS64_CFLAGS
5950 {"CS_LFS64_CFLAGS", _CS_LFS64_CFLAGS},
5951#endif
5952#ifdef _CS_LFS64_LDFLAGS
5953 {"CS_LFS64_LDFLAGS", _CS_LFS64_LDFLAGS},
5954#endif
5955#ifdef _CS_LFS64_LIBS
5956 {"CS_LFS64_LIBS", _CS_LFS64_LIBS},
5957#endif
5958#ifdef _CS_LFS64_LINTFLAGS
5959 {"CS_LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS},
5960#endif
5961#ifdef _CS_LFS_CFLAGS
5962 {"CS_LFS_CFLAGS", _CS_LFS_CFLAGS},
5963#endif
5964#ifdef _CS_LFS_LDFLAGS
5965 {"CS_LFS_LDFLAGS", _CS_LFS_LDFLAGS},
5966#endif
5967#ifdef _CS_LFS_LIBS
5968 {"CS_LFS_LIBS", _CS_LFS_LIBS},
5969#endif
5970#ifdef _CS_LFS_LINTFLAGS
5971 {"CS_LFS_LINTFLAGS", _CS_LFS_LINTFLAGS},
5972#endif
Fred Draked86ed291999-12-15 15:34:33 +00005973#ifdef _CS_MACHINE
5974 {"CS_MACHINE", _CS_MACHINE},
5975#endif
Fred Drakec9680921999-12-13 16:37:25 +00005976#ifdef _CS_PATH
5977 {"CS_PATH", _CS_PATH},
5978#endif
Fred Draked86ed291999-12-15 15:34:33 +00005979#ifdef _CS_RELEASE
5980 {"CS_RELEASE", _CS_RELEASE},
5981#endif
5982#ifdef _CS_SRPC_DOMAIN
5983 {"CS_SRPC_DOMAIN", _CS_SRPC_DOMAIN},
5984#endif
5985#ifdef _CS_SYSNAME
5986 {"CS_SYSNAME", _CS_SYSNAME},
5987#endif
5988#ifdef _CS_VERSION
5989 {"CS_VERSION", _CS_VERSION},
5990#endif
Fred Drakec9680921999-12-13 16:37:25 +00005991#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS
5992 {"CS_XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS},
5993#endif
5994#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS
5995 {"CS_XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS},
5996#endif
5997#ifdef _CS_XBS5_ILP32_OFF32_LIBS
5998 {"CS_XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS},
5999#endif
6000#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS
6001 {"CS_XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS},
6002#endif
6003#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS
6004 {"CS_XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS},
6005#endif
6006#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS
6007 {"CS_XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS},
6008#endif
6009#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS
6010 {"CS_XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS},
6011#endif
6012#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
6013 {"CS_XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS},
6014#endif
6015#ifdef _CS_XBS5_LP64_OFF64_CFLAGS
6016 {"CS_XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS},
6017#endif
6018#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS
6019 {"CS_XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS},
6020#endif
6021#ifdef _CS_XBS5_LP64_OFF64_LIBS
6022 {"CS_XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS},
6023#endif
6024#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS
6025 {"CS_XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS},
6026#endif
6027#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS
6028 {"CS_XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS},
6029#endif
6030#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
6031 {"CS_XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS},
6032#endif
6033#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS
6034 {"CS_XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS},
6035#endif
6036#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
6037 {"CS_XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS},
6038#endif
Fred Draked86ed291999-12-15 15:34:33 +00006039#ifdef _MIPS_CS_AVAIL_PROCESSORS
6040 {"MIPS_CS_AVAIL_PROCESSORS", _MIPS_CS_AVAIL_PROCESSORS},
6041#endif
6042#ifdef _MIPS_CS_BASE
6043 {"MIPS_CS_BASE", _MIPS_CS_BASE},
6044#endif
6045#ifdef _MIPS_CS_HOSTID
6046 {"MIPS_CS_HOSTID", _MIPS_CS_HOSTID},
6047#endif
6048#ifdef _MIPS_CS_HW_NAME
6049 {"MIPS_CS_HW_NAME", _MIPS_CS_HW_NAME},
6050#endif
6051#ifdef _MIPS_CS_NUM_PROCESSORS
6052 {"MIPS_CS_NUM_PROCESSORS", _MIPS_CS_NUM_PROCESSORS},
6053#endif
6054#ifdef _MIPS_CS_OSREL_MAJ
6055 {"MIPS_CS_OSREL_MAJ", _MIPS_CS_OSREL_MAJ},
6056#endif
6057#ifdef _MIPS_CS_OSREL_MIN
6058 {"MIPS_CS_OSREL_MIN", _MIPS_CS_OSREL_MIN},
6059#endif
6060#ifdef _MIPS_CS_OSREL_PATCH
6061 {"MIPS_CS_OSREL_PATCH", _MIPS_CS_OSREL_PATCH},
6062#endif
6063#ifdef _MIPS_CS_OS_NAME
6064 {"MIPS_CS_OS_NAME", _MIPS_CS_OS_NAME},
6065#endif
6066#ifdef _MIPS_CS_OS_PROVIDER
6067 {"MIPS_CS_OS_PROVIDER", _MIPS_CS_OS_PROVIDER},
6068#endif
6069#ifdef _MIPS_CS_PROCESSORS
6070 {"MIPS_CS_PROCESSORS", _MIPS_CS_PROCESSORS},
6071#endif
6072#ifdef _MIPS_CS_SERIAL
6073 {"MIPS_CS_SERIAL", _MIPS_CS_SERIAL},
6074#endif
6075#ifdef _MIPS_CS_VENDOR
6076 {"MIPS_CS_VENDOR", _MIPS_CS_VENDOR},
6077#endif
Fred Drakec9680921999-12-13 16:37:25 +00006078};
6079
6080static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006081conv_confstr_confname(PyObject *arg, int *valuep)
Fred Drakec9680921999-12-13 16:37:25 +00006082{
6083 return conv_confname(arg, valuep, posix_constants_confstr,
6084 sizeof(posix_constants_confstr)
6085 / sizeof(struct constdef));
6086}
6087
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006088PyDoc_STRVAR(posix_confstr__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00006089"confstr(name) -> string\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006090Return a string-valued system configuration variable.");
Fred Drakec9680921999-12-13 16:37:25 +00006091
6092static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006093posix_confstr(PyObject *self, PyObject *args)
Fred Drakec9680921999-12-13 16:37:25 +00006094{
6095 PyObject *result = NULL;
6096 int name;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006097 char buffer[256];
Fred Drakec9680921999-12-13 16:37:25 +00006098
6099 if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006100 int len;
Fred Drakec9680921999-12-13 16:37:25 +00006101
Fred Drakec9680921999-12-13 16:37:25 +00006102 errno = 0;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006103 len = confstr(name, buffer, sizeof(buffer));
6104 if (len == 0) {
6105 if (errno) {
6106 posix_error();
6107 }
6108 else {
6109 result = Py_None;
6110 Py_INCREF(Py_None);
6111 }
Fred Drakec9680921999-12-13 16:37:25 +00006112 }
6113 else {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006114 if ((unsigned int)len >= sizeof(buffer)) {
Neal Norwitz93c56822007-08-26 07:10:06 +00006115 result = PyUnicode_FromStringAndSize(NULL, len-1);
Fred Drakec9680921999-12-13 16:37:25 +00006116 if (result != NULL)
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +00006117 confstr(name, _PyUnicode_AsString(result), len);
Fred Drakec9680921999-12-13 16:37:25 +00006118 }
6119 else
Neal Norwitz93c56822007-08-26 07:10:06 +00006120 result = PyUnicode_FromStringAndSize(buffer, len-1);
Fred Drakec9680921999-12-13 16:37:25 +00006121 }
6122 }
6123 return result;
6124}
6125#endif
6126
6127
6128#ifdef HAVE_SYSCONF
6129static struct constdef posix_constants_sysconf[] = {
6130#ifdef _SC_2_CHAR_TERM
6131 {"SC_2_CHAR_TERM", _SC_2_CHAR_TERM},
6132#endif
6133#ifdef _SC_2_C_BIND
6134 {"SC_2_C_BIND", _SC_2_C_BIND},
6135#endif
6136#ifdef _SC_2_C_DEV
6137 {"SC_2_C_DEV", _SC_2_C_DEV},
6138#endif
6139#ifdef _SC_2_C_VERSION
6140 {"SC_2_C_VERSION", _SC_2_C_VERSION},
6141#endif
6142#ifdef _SC_2_FORT_DEV
6143 {"SC_2_FORT_DEV", _SC_2_FORT_DEV},
6144#endif
6145#ifdef _SC_2_FORT_RUN
6146 {"SC_2_FORT_RUN", _SC_2_FORT_RUN},
6147#endif
6148#ifdef _SC_2_LOCALEDEF
6149 {"SC_2_LOCALEDEF", _SC_2_LOCALEDEF},
6150#endif
6151#ifdef _SC_2_SW_DEV
6152 {"SC_2_SW_DEV", _SC_2_SW_DEV},
6153#endif
6154#ifdef _SC_2_UPE
6155 {"SC_2_UPE", _SC_2_UPE},
6156#endif
6157#ifdef _SC_2_VERSION
6158 {"SC_2_VERSION", _SC_2_VERSION},
6159#endif
Fred Draked86ed291999-12-15 15:34:33 +00006160#ifdef _SC_ABI_ASYNCHRONOUS_IO
6161 {"SC_ABI_ASYNCHRONOUS_IO", _SC_ABI_ASYNCHRONOUS_IO},
6162#endif
6163#ifdef _SC_ACL
6164 {"SC_ACL", _SC_ACL},
6165#endif
Fred Drakec9680921999-12-13 16:37:25 +00006166#ifdef _SC_AIO_LISTIO_MAX
6167 {"SC_AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX},
6168#endif
Fred Drakec9680921999-12-13 16:37:25 +00006169#ifdef _SC_AIO_MAX
6170 {"SC_AIO_MAX", _SC_AIO_MAX},
6171#endif
6172#ifdef _SC_AIO_PRIO_DELTA_MAX
6173 {"SC_AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX},
6174#endif
6175#ifdef _SC_ARG_MAX
6176 {"SC_ARG_MAX", _SC_ARG_MAX},
6177#endif
6178#ifdef _SC_ASYNCHRONOUS_IO
6179 {"SC_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO},
6180#endif
6181#ifdef _SC_ATEXIT_MAX
6182 {"SC_ATEXIT_MAX", _SC_ATEXIT_MAX},
6183#endif
Fred Draked86ed291999-12-15 15:34:33 +00006184#ifdef _SC_AUDIT
6185 {"SC_AUDIT", _SC_AUDIT},
6186#endif
Fred Drakec9680921999-12-13 16:37:25 +00006187#ifdef _SC_AVPHYS_PAGES
6188 {"SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES},
6189#endif
6190#ifdef _SC_BC_BASE_MAX
6191 {"SC_BC_BASE_MAX", _SC_BC_BASE_MAX},
6192#endif
6193#ifdef _SC_BC_DIM_MAX
6194 {"SC_BC_DIM_MAX", _SC_BC_DIM_MAX},
6195#endif
6196#ifdef _SC_BC_SCALE_MAX
6197 {"SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX},
6198#endif
6199#ifdef _SC_BC_STRING_MAX
6200 {"SC_BC_STRING_MAX", _SC_BC_STRING_MAX},
6201#endif
Fred Draked86ed291999-12-15 15:34:33 +00006202#ifdef _SC_CAP
6203 {"SC_CAP", _SC_CAP},
6204#endif
Fred Drakec9680921999-12-13 16:37:25 +00006205#ifdef _SC_CHARCLASS_NAME_MAX
6206 {"SC_CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX},
6207#endif
6208#ifdef _SC_CHAR_BIT
6209 {"SC_CHAR_BIT", _SC_CHAR_BIT},
6210#endif
6211#ifdef _SC_CHAR_MAX
6212 {"SC_CHAR_MAX", _SC_CHAR_MAX},
6213#endif
6214#ifdef _SC_CHAR_MIN
6215 {"SC_CHAR_MIN", _SC_CHAR_MIN},
6216#endif
6217#ifdef _SC_CHILD_MAX
6218 {"SC_CHILD_MAX", _SC_CHILD_MAX},
6219#endif
6220#ifdef _SC_CLK_TCK
6221 {"SC_CLK_TCK", _SC_CLK_TCK},
6222#endif
6223#ifdef _SC_COHER_BLKSZ
6224 {"SC_COHER_BLKSZ", _SC_COHER_BLKSZ},
6225#endif
6226#ifdef _SC_COLL_WEIGHTS_MAX
6227 {"SC_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX},
6228#endif
6229#ifdef _SC_DCACHE_ASSOC
6230 {"SC_DCACHE_ASSOC", _SC_DCACHE_ASSOC},
6231#endif
6232#ifdef _SC_DCACHE_BLKSZ
6233 {"SC_DCACHE_BLKSZ", _SC_DCACHE_BLKSZ},
6234#endif
6235#ifdef _SC_DCACHE_LINESZ
6236 {"SC_DCACHE_LINESZ", _SC_DCACHE_LINESZ},
6237#endif
6238#ifdef _SC_DCACHE_SZ
6239 {"SC_DCACHE_SZ", _SC_DCACHE_SZ},
6240#endif
6241#ifdef _SC_DCACHE_TBLKSZ
6242 {"SC_DCACHE_TBLKSZ", _SC_DCACHE_TBLKSZ},
6243#endif
6244#ifdef _SC_DELAYTIMER_MAX
6245 {"SC_DELAYTIMER_MAX", _SC_DELAYTIMER_MAX},
6246#endif
6247#ifdef _SC_EQUIV_CLASS_MAX
6248 {"SC_EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX},
6249#endif
6250#ifdef _SC_EXPR_NEST_MAX
6251 {"SC_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX},
6252#endif
6253#ifdef _SC_FSYNC
6254 {"SC_FSYNC", _SC_FSYNC},
6255#endif
6256#ifdef _SC_GETGR_R_SIZE_MAX
6257 {"SC_GETGR_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX},
6258#endif
6259#ifdef _SC_GETPW_R_SIZE_MAX
6260 {"SC_GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX},
6261#endif
6262#ifdef _SC_ICACHE_ASSOC
6263 {"SC_ICACHE_ASSOC", _SC_ICACHE_ASSOC},
6264#endif
6265#ifdef _SC_ICACHE_BLKSZ
6266 {"SC_ICACHE_BLKSZ", _SC_ICACHE_BLKSZ},
6267#endif
6268#ifdef _SC_ICACHE_LINESZ
6269 {"SC_ICACHE_LINESZ", _SC_ICACHE_LINESZ},
6270#endif
6271#ifdef _SC_ICACHE_SZ
6272 {"SC_ICACHE_SZ", _SC_ICACHE_SZ},
6273#endif
Fred Draked86ed291999-12-15 15:34:33 +00006274#ifdef _SC_INF
6275 {"SC_INF", _SC_INF},
6276#endif
Fred Drakec9680921999-12-13 16:37:25 +00006277#ifdef _SC_INT_MAX
6278 {"SC_INT_MAX", _SC_INT_MAX},
6279#endif
6280#ifdef _SC_INT_MIN
6281 {"SC_INT_MIN", _SC_INT_MIN},
6282#endif
6283#ifdef _SC_IOV_MAX
6284 {"SC_IOV_MAX", _SC_IOV_MAX},
6285#endif
Fred Draked86ed291999-12-15 15:34:33 +00006286#ifdef _SC_IP_SECOPTS
6287 {"SC_IP_SECOPTS", _SC_IP_SECOPTS},
6288#endif
Fred Drakec9680921999-12-13 16:37:25 +00006289#ifdef _SC_JOB_CONTROL
6290 {"SC_JOB_CONTROL", _SC_JOB_CONTROL},
6291#endif
Fred Draked86ed291999-12-15 15:34:33 +00006292#ifdef _SC_KERN_POINTERS
6293 {"SC_KERN_POINTERS", _SC_KERN_POINTERS},
6294#endif
6295#ifdef _SC_KERN_SIM
6296 {"SC_KERN_SIM", _SC_KERN_SIM},
6297#endif
Fred Drakec9680921999-12-13 16:37:25 +00006298#ifdef _SC_LINE_MAX
6299 {"SC_LINE_MAX", _SC_LINE_MAX},
6300#endif
6301#ifdef _SC_LOGIN_NAME_MAX
6302 {"SC_LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX},
6303#endif
6304#ifdef _SC_LOGNAME_MAX
6305 {"SC_LOGNAME_MAX", _SC_LOGNAME_MAX},
6306#endif
6307#ifdef _SC_LONG_BIT
6308 {"SC_LONG_BIT", _SC_LONG_BIT},
6309#endif
Fred Draked86ed291999-12-15 15:34:33 +00006310#ifdef _SC_MAC
6311 {"SC_MAC", _SC_MAC},
6312#endif
Fred Drakec9680921999-12-13 16:37:25 +00006313#ifdef _SC_MAPPED_FILES
6314 {"SC_MAPPED_FILES", _SC_MAPPED_FILES},
6315#endif
6316#ifdef _SC_MAXPID
6317 {"SC_MAXPID", _SC_MAXPID},
6318#endif
6319#ifdef _SC_MB_LEN_MAX
6320 {"SC_MB_LEN_MAX", _SC_MB_LEN_MAX},
6321#endif
6322#ifdef _SC_MEMLOCK
6323 {"SC_MEMLOCK", _SC_MEMLOCK},
6324#endif
6325#ifdef _SC_MEMLOCK_RANGE
6326 {"SC_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE},
6327#endif
6328#ifdef _SC_MEMORY_PROTECTION
6329 {"SC_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION},
6330#endif
6331#ifdef _SC_MESSAGE_PASSING
6332 {"SC_MESSAGE_PASSING", _SC_MESSAGE_PASSING},
6333#endif
Fred Draked86ed291999-12-15 15:34:33 +00006334#ifdef _SC_MMAP_FIXED_ALIGNMENT
6335 {"SC_MMAP_FIXED_ALIGNMENT", _SC_MMAP_FIXED_ALIGNMENT},
6336#endif
Fred Drakec9680921999-12-13 16:37:25 +00006337#ifdef _SC_MQ_OPEN_MAX
6338 {"SC_MQ_OPEN_MAX", _SC_MQ_OPEN_MAX},
6339#endif
6340#ifdef _SC_MQ_PRIO_MAX
6341 {"SC_MQ_PRIO_MAX", _SC_MQ_PRIO_MAX},
6342#endif
Fred Draked86ed291999-12-15 15:34:33 +00006343#ifdef _SC_NACLS_MAX
6344 {"SC_NACLS_MAX", _SC_NACLS_MAX},
6345#endif
Fred Drakec9680921999-12-13 16:37:25 +00006346#ifdef _SC_NGROUPS_MAX
6347 {"SC_NGROUPS_MAX", _SC_NGROUPS_MAX},
6348#endif
6349#ifdef _SC_NL_ARGMAX
6350 {"SC_NL_ARGMAX", _SC_NL_ARGMAX},
6351#endif
6352#ifdef _SC_NL_LANGMAX
6353 {"SC_NL_LANGMAX", _SC_NL_LANGMAX},
6354#endif
6355#ifdef _SC_NL_MSGMAX
6356 {"SC_NL_MSGMAX", _SC_NL_MSGMAX},
6357#endif
6358#ifdef _SC_NL_NMAX
6359 {"SC_NL_NMAX", _SC_NL_NMAX},
6360#endif
6361#ifdef _SC_NL_SETMAX
6362 {"SC_NL_SETMAX", _SC_NL_SETMAX},
6363#endif
6364#ifdef _SC_NL_TEXTMAX
6365 {"SC_NL_TEXTMAX", _SC_NL_TEXTMAX},
6366#endif
6367#ifdef _SC_NPROCESSORS_CONF
6368 {"SC_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF},
6369#endif
6370#ifdef _SC_NPROCESSORS_ONLN
6371 {"SC_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN},
6372#endif
Fred Draked86ed291999-12-15 15:34:33 +00006373#ifdef _SC_NPROC_CONF
6374 {"SC_NPROC_CONF", _SC_NPROC_CONF},
6375#endif
6376#ifdef _SC_NPROC_ONLN
6377 {"SC_NPROC_ONLN", _SC_NPROC_ONLN},
6378#endif
Fred Drakec9680921999-12-13 16:37:25 +00006379#ifdef _SC_NZERO
6380 {"SC_NZERO", _SC_NZERO},
6381#endif
6382#ifdef _SC_OPEN_MAX
6383 {"SC_OPEN_MAX", _SC_OPEN_MAX},
6384#endif
6385#ifdef _SC_PAGESIZE
6386 {"SC_PAGESIZE", _SC_PAGESIZE},
6387#endif
6388#ifdef _SC_PAGE_SIZE
6389 {"SC_PAGE_SIZE", _SC_PAGE_SIZE},
6390#endif
6391#ifdef _SC_PASS_MAX
6392 {"SC_PASS_MAX", _SC_PASS_MAX},
6393#endif
6394#ifdef _SC_PHYS_PAGES
6395 {"SC_PHYS_PAGES", _SC_PHYS_PAGES},
6396#endif
6397#ifdef _SC_PII
6398 {"SC_PII", _SC_PII},
6399#endif
6400#ifdef _SC_PII_INTERNET
6401 {"SC_PII_INTERNET", _SC_PII_INTERNET},
6402#endif
6403#ifdef _SC_PII_INTERNET_DGRAM
6404 {"SC_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM},
6405#endif
6406#ifdef _SC_PII_INTERNET_STREAM
6407 {"SC_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM},
6408#endif
6409#ifdef _SC_PII_OSI
6410 {"SC_PII_OSI", _SC_PII_OSI},
6411#endif
6412#ifdef _SC_PII_OSI_CLTS
6413 {"SC_PII_OSI_CLTS", _SC_PII_OSI_CLTS},
6414#endif
6415#ifdef _SC_PII_OSI_COTS
6416 {"SC_PII_OSI_COTS", _SC_PII_OSI_COTS},
6417#endif
6418#ifdef _SC_PII_OSI_M
6419 {"SC_PII_OSI_M", _SC_PII_OSI_M},
6420#endif
6421#ifdef _SC_PII_SOCKET
6422 {"SC_PII_SOCKET", _SC_PII_SOCKET},
6423#endif
6424#ifdef _SC_PII_XTI
6425 {"SC_PII_XTI", _SC_PII_XTI},
6426#endif
6427#ifdef _SC_POLL
6428 {"SC_POLL", _SC_POLL},
6429#endif
6430#ifdef _SC_PRIORITIZED_IO
6431 {"SC_PRIORITIZED_IO", _SC_PRIORITIZED_IO},
6432#endif
6433#ifdef _SC_PRIORITY_SCHEDULING
6434 {"SC_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING},
6435#endif
6436#ifdef _SC_REALTIME_SIGNALS
6437 {"SC_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS},
6438#endif
6439#ifdef _SC_RE_DUP_MAX
6440 {"SC_RE_DUP_MAX", _SC_RE_DUP_MAX},
6441#endif
6442#ifdef _SC_RTSIG_MAX
6443 {"SC_RTSIG_MAX", _SC_RTSIG_MAX},
6444#endif
6445#ifdef _SC_SAVED_IDS
6446 {"SC_SAVED_IDS", _SC_SAVED_IDS},
6447#endif
6448#ifdef _SC_SCHAR_MAX
6449 {"SC_SCHAR_MAX", _SC_SCHAR_MAX},
6450#endif
6451#ifdef _SC_SCHAR_MIN
6452 {"SC_SCHAR_MIN", _SC_SCHAR_MIN},
6453#endif
6454#ifdef _SC_SELECT
6455 {"SC_SELECT", _SC_SELECT},
6456#endif
6457#ifdef _SC_SEMAPHORES
6458 {"SC_SEMAPHORES", _SC_SEMAPHORES},
6459#endif
6460#ifdef _SC_SEM_NSEMS_MAX
6461 {"SC_SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX},
6462#endif
6463#ifdef _SC_SEM_VALUE_MAX
6464 {"SC_SEM_VALUE_MAX", _SC_SEM_VALUE_MAX},
6465#endif
6466#ifdef _SC_SHARED_MEMORY_OBJECTS
6467 {"SC_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS},
6468#endif
6469#ifdef _SC_SHRT_MAX
6470 {"SC_SHRT_MAX", _SC_SHRT_MAX},
6471#endif
6472#ifdef _SC_SHRT_MIN
6473 {"SC_SHRT_MIN", _SC_SHRT_MIN},
6474#endif
6475#ifdef _SC_SIGQUEUE_MAX
6476 {"SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX},
6477#endif
6478#ifdef _SC_SIGRT_MAX
6479 {"SC_SIGRT_MAX", _SC_SIGRT_MAX},
6480#endif
6481#ifdef _SC_SIGRT_MIN
6482 {"SC_SIGRT_MIN", _SC_SIGRT_MIN},
6483#endif
Fred Draked86ed291999-12-15 15:34:33 +00006484#ifdef _SC_SOFTPOWER
6485 {"SC_SOFTPOWER", _SC_SOFTPOWER},
6486#endif
Fred Drakec9680921999-12-13 16:37:25 +00006487#ifdef _SC_SPLIT_CACHE
6488 {"SC_SPLIT_CACHE", _SC_SPLIT_CACHE},
6489#endif
6490#ifdef _SC_SSIZE_MAX
6491 {"SC_SSIZE_MAX", _SC_SSIZE_MAX},
6492#endif
6493#ifdef _SC_STACK_PROT
6494 {"SC_STACK_PROT", _SC_STACK_PROT},
6495#endif
6496#ifdef _SC_STREAM_MAX
6497 {"SC_STREAM_MAX", _SC_STREAM_MAX},
6498#endif
6499#ifdef _SC_SYNCHRONIZED_IO
6500 {"SC_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO},
6501#endif
6502#ifdef _SC_THREADS
6503 {"SC_THREADS", _SC_THREADS},
6504#endif
6505#ifdef _SC_THREAD_ATTR_STACKADDR
6506 {"SC_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR},
6507#endif
6508#ifdef _SC_THREAD_ATTR_STACKSIZE
6509 {"SC_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE},
6510#endif
6511#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS
6512 {"SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS},
6513#endif
6514#ifdef _SC_THREAD_KEYS_MAX
6515 {"SC_THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX},
6516#endif
6517#ifdef _SC_THREAD_PRIORITY_SCHEDULING
6518 {"SC_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING},
6519#endif
6520#ifdef _SC_THREAD_PRIO_INHERIT
6521 {"SC_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT},
6522#endif
6523#ifdef _SC_THREAD_PRIO_PROTECT
6524 {"SC_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT},
6525#endif
6526#ifdef _SC_THREAD_PROCESS_SHARED
6527 {"SC_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED},
6528#endif
6529#ifdef _SC_THREAD_SAFE_FUNCTIONS
6530 {"SC_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS},
6531#endif
6532#ifdef _SC_THREAD_STACK_MIN
6533 {"SC_THREAD_STACK_MIN", _SC_THREAD_STACK_MIN},
6534#endif
6535#ifdef _SC_THREAD_THREADS_MAX
6536 {"SC_THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX},
6537#endif
6538#ifdef _SC_TIMERS
6539 {"SC_TIMERS", _SC_TIMERS},
6540#endif
6541#ifdef _SC_TIMER_MAX
6542 {"SC_TIMER_MAX", _SC_TIMER_MAX},
6543#endif
6544#ifdef _SC_TTY_NAME_MAX
6545 {"SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX},
6546#endif
6547#ifdef _SC_TZNAME_MAX
6548 {"SC_TZNAME_MAX", _SC_TZNAME_MAX},
6549#endif
6550#ifdef _SC_T_IOV_MAX
6551 {"SC_T_IOV_MAX", _SC_T_IOV_MAX},
6552#endif
6553#ifdef _SC_UCHAR_MAX
6554 {"SC_UCHAR_MAX", _SC_UCHAR_MAX},
6555#endif
6556#ifdef _SC_UINT_MAX
6557 {"SC_UINT_MAX", _SC_UINT_MAX},
6558#endif
6559#ifdef _SC_UIO_MAXIOV
6560 {"SC_UIO_MAXIOV", _SC_UIO_MAXIOV},
6561#endif
6562#ifdef _SC_ULONG_MAX
6563 {"SC_ULONG_MAX", _SC_ULONG_MAX},
6564#endif
6565#ifdef _SC_USHRT_MAX
6566 {"SC_USHRT_MAX", _SC_USHRT_MAX},
6567#endif
6568#ifdef _SC_VERSION
6569 {"SC_VERSION", _SC_VERSION},
6570#endif
6571#ifdef _SC_WORD_BIT
6572 {"SC_WORD_BIT", _SC_WORD_BIT},
6573#endif
6574#ifdef _SC_XBS5_ILP32_OFF32
6575 {"SC_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32},
6576#endif
6577#ifdef _SC_XBS5_ILP32_OFFBIG
6578 {"SC_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG},
6579#endif
6580#ifdef _SC_XBS5_LP64_OFF64
6581 {"SC_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64},
6582#endif
6583#ifdef _SC_XBS5_LPBIG_OFFBIG
6584 {"SC_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG},
6585#endif
6586#ifdef _SC_XOPEN_CRYPT
6587 {"SC_XOPEN_CRYPT", _SC_XOPEN_CRYPT},
6588#endif
6589#ifdef _SC_XOPEN_ENH_I18N
6590 {"SC_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N},
6591#endif
6592#ifdef _SC_XOPEN_LEGACY
6593 {"SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY},
6594#endif
6595#ifdef _SC_XOPEN_REALTIME
6596 {"SC_XOPEN_REALTIME", _SC_XOPEN_REALTIME},
6597#endif
6598#ifdef _SC_XOPEN_REALTIME_THREADS
6599 {"SC_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS},
6600#endif
6601#ifdef _SC_XOPEN_SHM
6602 {"SC_XOPEN_SHM", _SC_XOPEN_SHM},
6603#endif
6604#ifdef _SC_XOPEN_UNIX
6605 {"SC_XOPEN_UNIX", _SC_XOPEN_UNIX},
6606#endif
6607#ifdef _SC_XOPEN_VERSION
6608 {"SC_XOPEN_VERSION", _SC_XOPEN_VERSION},
6609#endif
6610#ifdef _SC_XOPEN_XCU_VERSION
6611 {"SC_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION},
6612#endif
6613#ifdef _SC_XOPEN_XPG2
6614 {"SC_XOPEN_XPG2", _SC_XOPEN_XPG2},
6615#endif
6616#ifdef _SC_XOPEN_XPG3
6617 {"SC_XOPEN_XPG3", _SC_XOPEN_XPG3},
6618#endif
6619#ifdef _SC_XOPEN_XPG4
6620 {"SC_XOPEN_XPG4", _SC_XOPEN_XPG4},
6621#endif
6622};
6623
6624static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006625conv_sysconf_confname(PyObject *arg, int *valuep)
Fred Drakec9680921999-12-13 16:37:25 +00006626{
6627 return conv_confname(arg, valuep, posix_constants_sysconf,
6628 sizeof(posix_constants_sysconf)
6629 / sizeof(struct constdef));
6630}
6631
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006632PyDoc_STRVAR(posix_sysconf__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00006633"sysconf(name) -> integer\n\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006634Return an integer-valued system configuration variable.");
Fred Drakec9680921999-12-13 16:37:25 +00006635
6636static PyObject *
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006637posix_sysconf(PyObject *self, PyObject *args)
Fred Drakec9680921999-12-13 16:37:25 +00006638{
6639 PyObject *result = NULL;
6640 int name;
6641
6642 if (PyArg_ParseTuple(args, "O&:sysconf", conv_sysconf_confname, &name)) {
6643 int value;
6644
6645 errno = 0;
6646 value = sysconf(name);
6647 if (value == -1 && errno != 0)
6648 posix_error();
6649 else
Christian Heimes217cfd12007-12-02 14:31:20 +00006650 result = PyLong_FromLong(value);
Fred Drakec9680921999-12-13 16:37:25 +00006651 }
6652 return result;
6653}
6654#endif
6655
6656
Fred Drakebec628d1999-12-15 18:31:10 +00006657/* This code is used to ensure that the tables of configuration value names
6658 * are in sorted order as required by conv_confname(), and also to build the
6659 * the exported dictionaries that are used to publish information about the
6660 * names available on the host platform.
6661 *
6662 * Sorting the table at runtime ensures that the table is properly ordered
6663 * when used, even for platforms we're not able to test on. It also makes
6664 * it easier to add additional entries to the tables.
Fred Draked86ed291999-12-15 15:34:33 +00006665 */
Fred Drakebec628d1999-12-15 18:31:10 +00006666
6667static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006668cmp_constdefs(const void *v1, const void *v2)
Fred Drakebec628d1999-12-15 18:31:10 +00006669{
6670 const struct constdef *c1 =
6671 (const struct constdef *) v1;
6672 const struct constdef *c2 =
6673 (const struct constdef *) v2;
6674
6675 return strcmp(c1->name, c2->name);
6676}
6677
6678static int
Fredrik Lundhff7df9d2000-07-08 22:48:53 +00006679setup_confname_table(struct constdef *table, size_t tablesize,
Fred Drake4d1e64b2002-04-15 19:40:07 +00006680 char *tablename, PyObject *module)
Fred Draked86ed291999-12-15 15:34:33 +00006681{
Fred Drakebec628d1999-12-15 18:31:10 +00006682 PyObject *d = NULL;
Barry Warsaw3155db32000-04-13 15:20:40 +00006683 size_t i;
Fred Drakebec628d1999-12-15 18:31:10 +00006684
6685 qsort(table, tablesize, sizeof(struct constdef), cmp_constdefs);
6686 d = PyDict_New();
Barry Warsaw3155db32000-04-13 15:20:40 +00006687 if (d == NULL)
6688 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00006689
Barry Warsaw3155db32000-04-13 15:20:40 +00006690 for (i=0; i < tablesize; ++i) {
Christian Heimes217cfd12007-12-02 14:31:20 +00006691 PyObject *o = PyLong_FromLong(table[i].value);
Barry Warsaw3155db32000-04-13 15:20:40 +00006692 if (o == NULL || PyDict_SetItemString(d, table[i].name, o) == -1) {
6693 Py_XDECREF(o);
6694 Py_DECREF(d);
6695 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00006696 }
Barry Warsaw3155db32000-04-13 15:20:40 +00006697 Py_DECREF(o);
Fred Draked86ed291999-12-15 15:34:33 +00006698 }
Fred Drake4d1e64b2002-04-15 19:40:07 +00006699 return PyModule_AddObject(module, tablename, d);
Fred Draked86ed291999-12-15 15:34:33 +00006700}
6701
Fred Drakebec628d1999-12-15 18:31:10 +00006702/* Return -1 on failure, 0 on success. */
6703static int
Fred Drake4d1e64b2002-04-15 19:40:07 +00006704setup_confname_tables(PyObject *module)
Fred Draked86ed291999-12-15 15:34:33 +00006705{
6706#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
Fred Drakebec628d1999-12-15 18:31:10 +00006707 if (setup_confname_table(posix_constants_pathconf,
Fred Draked86ed291999-12-15 15:34:33 +00006708 sizeof(posix_constants_pathconf)
6709 / sizeof(struct constdef),
Fred Drake4d1e64b2002-04-15 19:40:07 +00006710 "pathconf_names", module))
Fred Drakebec628d1999-12-15 18:31:10 +00006711 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00006712#endif
6713#ifdef HAVE_CONFSTR
Fred Drakebec628d1999-12-15 18:31:10 +00006714 if (setup_confname_table(posix_constants_confstr,
Fred Draked86ed291999-12-15 15:34:33 +00006715 sizeof(posix_constants_confstr)
6716 / sizeof(struct constdef),
Fred Drake4d1e64b2002-04-15 19:40:07 +00006717 "confstr_names", module))
Fred Drakebec628d1999-12-15 18:31:10 +00006718 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00006719#endif
6720#ifdef HAVE_SYSCONF
Fred Drakebec628d1999-12-15 18:31:10 +00006721 if (setup_confname_table(posix_constants_sysconf,
Fred Draked86ed291999-12-15 15:34:33 +00006722 sizeof(posix_constants_sysconf)
6723 / sizeof(struct constdef),
Fred Drake4d1e64b2002-04-15 19:40:07 +00006724 "sysconf_names", module))
Fred Drakebec628d1999-12-15 18:31:10 +00006725 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00006726#endif
Fred Drakebec628d1999-12-15 18:31:10 +00006727 return 0;
Fred Draked86ed291999-12-15 15:34:33 +00006728}
Fred Draked86ed291999-12-15 15:34:33 +00006729
6730
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006731PyDoc_STRVAR(posix_abort__doc__,
Fred Drakef7ce04d2002-06-20 18:31:21 +00006732"abort() -> does not return!\n\n\
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006733Abort the interpreter immediately. This 'dumps core' or otherwise fails\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006734in the hardest way possible on the hosting operating system.");
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006735
6736static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00006737posix_abort(PyObject *self, PyObject *noargs)
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006738{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006739 abort();
6740 /*NOTREACHED*/
6741 Py_FatalError("abort() called from Python code didn't abort!");
6742 return NULL;
6743}
Fred Drakebec628d1999-12-15 18:31:10 +00006744
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00006745#ifdef MS_WINDOWS
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006746PyDoc_STRVAR(win32_startfile__doc__,
Georg Brandlf4f44152006-02-18 22:29:33 +00006747"startfile(filepath [, operation]) - Start a file with its associated\n\
6748application.\n\
Tim Petersf58a7aa2000-09-22 10:05:54 +00006749\n\
Georg Brandlf4f44152006-02-18 22:29:33 +00006750When \"operation\" is not specified or \"open\", this acts like\n\
6751double-clicking the file in Explorer, or giving the file name as an\n\
6752argument to the DOS \"start\" command: the file is opened with whatever\n\
6753application (if any) its extension is associated.\n\
6754When another \"operation\" is given, it specifies what should be done with\n\
6755the file. A typical operation is \"print\".\n\
Tim Petersf58a7aa2000-09-22 10:05:54 +00006756\n\
6757startfile returns as soon as the associated application is launched.\n\
6758There is no option to wait for the application to close, and no way\n\
6759to retrieve the application's exit status.\n\
6760\n\
6761The filepath is relative to the current directory. If you want to use\n\
6762an absolute path, make sure the first character is not a slash (\"/\");\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006763the underlying Win32 ShellExecute function doesn't work if it is.");
Tim Petersf58a7aa2000-09-22 10:05:54 +00006764
6765static PyObject *
6766win32_startfile(PyObject *self, PyObject *args)
6767{
Martin v. Löwis011e8422009-05-05 04:43:17 +00006768 PyObject *ofilepath;
Tim Petersf58a7aa2000-09-22 10:05:54 +00006769 char *filepath;
Georg Brandlf4f44152006-02-18 22:29:33 +00006770 char *operation = NULL;
Tim Petersf58a7aa2000-09-22 10:05:54 +00006771 HINSTANCE rc;
Hirokazu Yamamoto8223c242009-05-17 04:21:53 +00006772
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00006773 PyObject *unipath, *woperation = NULL;
6774 if (!PyArg_ParseTuple(args, "U|s:startfile",
6775 &unipath, &operation)) {
6776 PyErr_Clear();
6777 goto normal;
6778 }
6779
6780 if (operation) {
6781 woperation = PyUnicode_DecodeASCII(operation,
6782 strlen(operation), NULL);
6783 if (!woperation) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006784 PyErr_Clear();
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00006785 operation = NULL;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006786 goto normal;
6787 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006788 }
Hirokazu Yamamoto892a37a2009-06-28 11:07:03 +00006789
6790 Py_BEGIN_ALLOW_THREADS
6791 rc = ShellExecuteW((HWND)0, woperation ? PyUnicode_AS_UNICODE(woperation) : 0,
6792 PyUnicode_AS_UNICODE(unipath),
6793 NULL, NULL, SW_SHOWNORMAL);
6794 Py_END_ALLOW_THREADS
6795
6796 Py_XDECREF(woperation);
6797 if (rc <= (HINSTANCE)32) {
6798 PyObject *errval = win32_error_unicode("startfile",
6799 PyUnicode_AS_UNICODE(unipath));
6800 return errval;
6801 }
6802 Py_INCREF(Py_None);
6803 return Py_None;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00006804
6805normal:
Martin v. Löwis011e8422009-05-05 04:43:17 +00006806 if (!PyArg_ParseTuple(args, "O&|s:startfile",
6807 PyUnicode_FSConverter, &ofilepath,
Georg Brandlf4f44152006-02-18 22:29:33 +00006808 &operation))
Tim Petersf58a7aa2000-09-22 10:05:54 +00006809 return NULL;
Martin v. Löwis011e8422009-05-05 04:43:17 +00006810 filepath = bytes2str(ofilepath, 1);
Tim Petersf58a7aa2000-09-22 10:05:54 +00006811 Py_BEGIN_ALLOW_THREADS
Georg Brandlf4f44152006-02-18 22:29:33 +00006812 rc = ShellExecute((HWND)0, operation, filepath,
6813 NULL, NULL, SW_SHOWNORMAL);
Tim Petersf58a7aa2000-09-22 10:05:54 +00006814 Py_END_ALLOW_THREADS
Georg Brandle9f8ec92005-09-25 06:16:40 +00006815 if (rc <= (HINSTANCE)32) {
6816 PyObject *errval = win32_error("startfile", filepath);
Martin v. Löwis011e8422009-05-05 04:43:17 +00006817 release_bytes(ofilepath);
Georg Brandle9f8ec92005-09-25 06:16:40 +00006818 return errval;
6819 }
Martin v. Löwis011e8422009-05-05 04:43:17 +00006820 release_bytes(ofilepath);
Tim Petersf58a7aa2000-09-22 10:05:54 +00006821 Py_INCREF(Py_None);
6822 return Py_None;
6823}
6824#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00006825
Martin v. Löwis438b5342002-12-27 10:16:42 +00006826#ifdef HAVE_GETLOADAVG
6827PyDoc_STRVAR(posix_getloadavg__doc__,
6828"getloadavg() -> (float, float, float)\n\n\
6829Return the number of processes in the system run queue averaged over\n\
6830the last 1, 5, and 15 minutes or raises OSError if the load average\n\
6831was unobtainable");
6832
6833static PyObject *
Neal Norwitze241ce82003-02-17 18:17:05 +00006834posix_getloadavg(PyObject *self, PyObject *noargs)
Martin v. Löwis438b5342002-12-27 10:16:42 +00006835{
6836 double loadavg[3];
Martin v. Löwis438b5342002-12-27 10:16:42 +00006837 if (getloadavg(loadavg, 3)!=3) {
6838 PyErr_SetString(PyExc_OSError, "Load averages are unobtainable");
6839 return NULL;
6840 } else
6841 return Py_BuildValue("ddd", loadavg[0], loadavg[1], loadavg[2]);
6842}
6843#endif
6844
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006845#ifdef MS_WINDOWS
6846
6847PyDoc_STRVAR(win32_urandom__doc__,
6848"urandom(n) -> str\n\n\
Neal Norwitz93c56822007-08-26 07:10:06 +00006849Return n random bytes suitable for cryptographic use.");
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006850
6851typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\
6852 LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\
6853 DWORD dwFlags );
6854typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\
6855 BYTE *pbBuffer );
6856
6857static CRYPTGENRANDOM pCryptGenRandom = NULL;
Thomas Wouters89d996e2007-09-08 17:39:28 +00006858/* This handle is never explicitly released. Instead, the operating
6859 system will release it when the process terminates. */
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006860static HCRYPTPROV hCryptProv = 0;
6861
Tim Peters4ad82172004-08-30 17:02:04 +00006862static PyObject*
6863win32_urandom(PyObject *self, PyObject *args)
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006864{
Tim Petersd3115382004-08-30 17:36:46 +00006865 int howMany;
6866 PyObject* result;
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006867
Tim Peters4ad82172004-08-30 17:02:04 +00006868 /* Read arguments */
Tim Peters9b279a82004-08-30 17:10:53 +00006869 if (! PyArg_ParseTuple(args, "i:urandom", &howMany))
Tim Peters4ad82172004-08-30 17:02:04 +00006870 return NULL;
Tim Peters51eba612004-08-30 17:08:02 +00006871 if (howMany < 0)
6872 return PyErr_Format(PyExc_ValueError,
6873 "negative argument not allowed");
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006874
Tim Peters4ad82172004-08-30 17:02:04 +00006875 if (hCryptProv == 0) {
6876 HINSTANCE hAdvAPI32 = NULL;
6877 CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL;
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006878
Tim Peters4ad82172004-08-30 17:02:04 +00006879 /* Obtain handle to the DLL containing CryptoAPI
6880 This should not fail */
6881 hAdvAPI32 = GetModuleHandle("advapi32.dll");
6882 if(hAdvAPI32 == NULL)
6883 return win32_error("GetModuleHandle", NULL);
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006884
Tim Peters4ad82172004-08-30 17:02:04 +00006885 /* Obtain pointers to the CryptoAPI functions
6886 This will fail on some early versions of Win95 */
6887 pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress(
6888 hAdvAPI32,
6889 "CryptAcquireContextA");
6890 if (pCryptAcquireContext == NULL)
6891 return PyErr_Format(PyExc_NotImplementedError,
6892 "CryptAcquireContextA not found");
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006893
Tim Peters4ad82172004-08-30 17:02:04 +00006894 pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress(
6895 hAdvAPI32, "CryptGenRandom");
Thomas Wouters89f507f2006-12-13 04:49:30 +00006896 if (pCryptGenRandom == NULL)
Tim Peters4ad82172004-08-30 17:02:04 +00006897 return PyErr_Format(PyExc_NotImplementedError,
6898 "CryptGenRandom not found");
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006899
Tim Peters4ad82172004-08-30 17:02:04 +00006900 /* Acquire context */
6901 if (! pCryptAcquireContext(&hCryptProv, NULL, NULL,
6902 PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
6903 return win32_error("CryptAcquireContext", NULL);
6904 }
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006905
Tim Peters4ad82172004-08-30 17:02:04 +00006906 /* Allocate bytes */
Christian Heimes72b710a2008-05-26 13:28:38 +00006907 result = PyBytes_FromStringAndSize(NULL, howMany);
Tim Petersd3115382004-08-30 17:36:46 +00006908 if (result != NULL) {
6909 /* Get random data */
Amaury Forgeot d'Arca05ada32008-07-21 21:13:14 +00006910 memset(PyBytes_AS_STRING(result), 0, howMany); /* zero seed */
Tim Petersd3115382004-08-30 17:36:46 +00006911 if (! pCryptGenRandom(hCryptProv, howMany, (unsigned char*)
Christian Heimes72b710a2008-05-26 13:28:38 +00006912 PyBytes_AS_STRING(result))) {
Tim Petersd3115382004-08-30 17:36:46 +00006913 Py_DECREF(result);
6914 return win32_error("CryptGenRandom", NULL);
6915 }
Tim Peters4ad82172004-08-30 17:02:04 +00006916 }
Tim Petersd3115382004-08-30 17:36:46 +00006917 return result;
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00006918}
6919#endif
Martin v. Löwis438b5342002-12-27 10:16:42 +00006920
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00006921PyDoc_STRVAR(device_encoding__doc__,
6922"device_encoding(fd) -> str\n\n\
6923Return a string describing the encoding of the device\n\
6924if the output is a terminal; else return None.");
6925
6926static PyObject *
6927device_encoding(PyObject *self, PyObject *args)
6928{
6929 int fd;
6930 if (!PyArg_ParseTuple(args, "i:device_encoding", &fd))
6931 return NULL;
Kristján Valur Jónsson649170b2009-03-24 14:15:49 +00006932 if (!_PyVerify_fd(fd) || !isatty(fd)) {
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00006933 Py_INCREF(Py_None);
6934 return Py_None;
6935 }
6936#if defined(MS_WINDOWS) || defined(MS_WIN64)
6937 if (fd == 0) {
6938 char buf[100];
6939 sprintf(buf, "cp%d", GetConsoleCP());
6940 return PyUnicode_FromString(buf);
6941 }
6942 if (fd == 1 || fd == 2) {
6943 char buf[100];
6944 sprintf(buf, "cp%d", GetConsoleOutputCP());
6945 return PyUnicode_FromString(buf);
6946 }
6947#elif defined(CODESET)
6948 {
6949 char *codeset = nl_langinfo(CODESET);
Mark Dickinsonda2706b2008-12-11 18:03:03 +00006950 if (codeset != NULL && codeset[0] != 0)
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00006951 return PyUnicode_FromString(codeset);
6952 }
6953#endif
6954 Py_INCREF(Py_None);
6955 return Py_None;
6956}
6957
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006958#ifdef __VMS
6959/* Use openssl random routine */
6960#include <openssl/rand.h>
6961PyDoc_STRVAR(vms_urandom__doc__,
6962"urandom(n) -> str\n\n\
Neal Norwitz93c56822007-08-26 07:10:06 +00006963Return n random bytes suitable for cryptographic use.");
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006964
6965static PyObject*
6966vms_urandom(PyObject *self, PyObject *args)
6967{
6968 int howMany;
6969 PyObject* result;
6970
6971 /* Read arguments */
6972 if (! PyArg_ParseTuple(args, "i:urandom", &howMany))
6973 return NULL;
6974 if (howMany < 0)
6975 return PyErr_Format(PyExc_ValueError,
6976 "negative argument not allowed");
6977
6978 /* Allocate bytes */
Christian Heimes72b710a2008-05-26 13:28:38 +00006979 result = PyBytes_FromStringAndSize(NULL, howMany);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006980 if (result != NULL) {
6981 /* Get random data */
6982 if (RAND_pseudo_bytes((unsigned char*)
Christian Heimes72b710a2008-05-26 13:28:38 +00006983 PyBytes_AS_STRING(result),
Thomas Wouters0e3f5912006-08-11 14:57:12 +00006984 howMany) < 0) {
6985 Py_DECREF(result);
6986 return PyErr_Format(PyExc_ValueError,
6987 "RAND_pseudo_bytes");
6988 }
6989 }
6990 return result;
6991}
6992#endif
6993
Martin v. Löwis7aed61a2009-11-27 14:09:49 +00006994#ifdef HAVE_SETRESUID
6995PyDoc_STRVAR(posix_setresuid__doc__,
6996"setresuid(ruid, euid, suid)\n\n\
6997Set the current process's real, effective, and saved user ids.");
6998
6999static PyObject*
7000posix_setresuid (PyObject *self, PyObject *args)
7001{
7002 /* We assume uid_t is no larger than a long. */
7003 long ruid, euid, suid;
7004 if (!PyArg_ParseTuple(args, "lll", &ruid, &euid, &suid))
7005 return NULL;
7006 if (setresuid(ruid, euid, suid) < 0)
7007 return posix_error();
7008 Py_RETURN_NONE;
7009}
7010#endif
7011
7012#ifdef HAVE_SETRESGID
7013PyDoc_STRVAR(posix_setresgid__doc__,
7014"setresgid(rgid, egid, sgid)\n\n\
7015Set the current process's real, effective, and saved group ids.");
7016
7017static PyObject*
7018posix_setresgid (PyObject *self, PyObject *args)
7019{
7020 /* We assume uid_t is no larger than a long. */
7021 long rgid, egid, sgid;
7022 if (!PyArg_ParseTuple(args, "lll", &rgid, &egid, &sgid))
7023 return NULL;
7024 if (setresgid(rgid, egid, sgid) < 0)
7025 return posix_error();
7026 Py_RETURN_NONE;
7027}
7028#endif
7029
7030#ifdef HAVE_GETRESUID
7031PyDoc_STRVAR(posix_getresuid__doc__,
7032"getresuid() -> (ruid, euid, suid)\n\n\
7033Get tuple of the current process's real, effective, and saved user ids.");
7034
7035static PyObject*
7036posix_getresuid (PyObject *self, PyObject *noargs)
7037{
7038 uid_t ruid, euid, suid;
7039 long l_ruid, l_euid, l_suid;
7040 if (getresuid(&ruid, &euid, &suid) < 0)
7041 return posix_error();
7042 /* Force the values into long's as we don't know the size of uid_t. */
7043 l_ruid = ruid;
7044 l_euid = euid;
7045 l_suid = suid;
7046 return Py_BuildValue("(lll)", l_ruid, l_euid, l_suid);
7047}
7048#endif
7049
7050#ifdef HAVE_GETRESGID
7051PyDoc_STRVAR(posix_getresgid__doc__,
7052"getresgid() -> (rgid, egid, sgid)\n\n\
7053Get tuple of the current process's real, effective, and saved user ids.");
7054
7055static PyObject*
7056posix_getresgid (PyObject *self, PyObject *noargs)
7057{
7058 uid_t rgid, egid, sgid;
7059 long l_rgid, l_egid, l_sgid;
7060 if (getresgid(&rgid, &egid, &sgid) < 0)
7061 return posix_error();
7062 /* Force the values into long's as we don't know the size of uid_t. */
7063 l_rgid = rgid;
7064 l_egid = egid;
7065 l_sgid = sgid;
7066 return Py_BuildValue("(lll)", l_rgid, l_egid, l_sgid);
7067}
7068#endif
7069
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007070static PyMethodDef posix_methods[] = {
7071 {"access", posix_access, METH_VARARGS, posix_access__doc__},
7072#ifdef HAVE_TTYNAME
7073 {"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__},
7074#endif
7075 {"chdir", posix_chdir, METH_VARARGS, posix_chdir__doc__},
Thomas Wouterscf297e42007-02-23 15:07:44 +00007076#ifdef HAVE_CHFLAGS
7077 {"chflags", posix_chflags, METH_VARARGS, posix_chflags__doc__},
7078#endif /* HAVE_CHFLAGS */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007079 {"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__},
Christian Heimes4e30a842007-11-30 22:12:06 +00007080#ifdef HAVE_FCHMOD
7081 {"fchmod", posix_fchmod, METH_VARARGS, posix_fchmod__doc__},
7082#endif /* HAVE_FCHMOD */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007083#ifdef HAVE_CHOWN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007084 {"chown", posix_chown, METH_VARARGS, posix_chown__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007085#endif /* HAVE_CHOWN */
Christian Heimes4e30a842007-11-30 22:12:06 +00007086#ifdef HAVE_LCHMOD
7087 {"lchmod", posix_lchmod, METH_VARARGS, posix_lchmod__doc__},
7088#endif /* HAVE_LCHMOD */
7089#ifdef HAVE_FCHOWN
7090 {"fchown", posix_fchown, METH_VARARGS, posix_fchown__doc__},
7091#endif /* HAVE_FCHOWN */
Thomas Wouterscf297e42007-02-23 15:07:44 +00007092#ifdef HAVE_LCHFLAGS
7093 {"lchflags", posix_lchflags, METH_VARARGS, posix_lchflags__doc__},
7094#endif /* HAVE_LCHFLAGS */
Martin v. Löwis0cec0ff2002-07-28 16:33:45 +00007095#ifdef HAVE_LCHOWN
7096 {"lchown", posix_lchown, METH_VARARGS, posix_lchown__doc__},
7097#endif /* HAVE_LCHOWN */
Martin v. Löwis244edc82001-10-04 22:44:26 +00007098#ifdef HAVE_CHROOT
7099 {"chroot", posix_chroot, METH_VARARGS, posix_chroot__doc__},
7100#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007101#ifdef HAVE_CTERMID
Neal Norwitze241ce82003-02-17 18:17:05 +00007102 {"ctermid", posix_ctermid, METH_NOARGS, posix_ctermid__doc__},
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007103#endif
Guido van Rossum36bc6801995-06-14 22:54:23 +00007104#ifdef HAVE_GETCWD
Guido van Rossumf0af3e32008-10-02 18:55:37 +00007105 {"getcwd", (PyCFunction)posix_getcwd_unicode,
7106 METH_NOARGS, posix_getcwd__doc__},
7107 {"getcwdb", (PyCFunction)posix_getcwd_bytes,
7108 METH_NOARGS, posix_getcwdb__doc__},
Guido van Rossum36bc6801995-06-14 22:54:23 +00007109#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00007110#ifdef HAVE_LINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007111 {"link", posix_link, METH_VARARGS, posix_link__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007112#endif /* HAVE_LINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007113 {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__},
7114 {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__},
7115 {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007116#ifdef HAVE_NICE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007117 {"nice", posix_nice, METH_VARARGS, posix_nice__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007118#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007119#ifdef HAVE_READLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007120 {"readlink", posix_readlink, METH_VARARGS, posix_readlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007121#endif /* HAVE_READLINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007122 {"rename", posix_rename, METH_VARARGS, posix_rename__doc__},
7123 {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__},
7124 {"stat", posix_stat, METH_VARARGS, posix_stat__doc__},
Martin v. Löwisf607bda2002-10-16 18:27:39 +00007125 {"stat_float_times", stat_float_times, METH_VARARGS, stat_float_times__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007126#ifdef HAVE_SYMLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007127 {"symlink", posix_symlink, METH_VARARGS, posix_symlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007128#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007129#ifdef HAVE_SYSTEM
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007130 {"system", posix_system, METH_VARARGS, posix_system__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007131#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007132 {"umask", posix_umask, METH_VARARGS, posix_umask__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007133#ifdef HAVE_UNAME
Neal Norwitze241ce82003-02-17 18:17:05 +00007134 {"uname", posix_uname, METH_NOARGS, posix_uname__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007135#endif /* HAVE_UNAME */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007136 {"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__},
7137 {"remove", posix_unlink, METH_VARARGS, posix_remove__doc__},
7138 {"utime", posix_utime, METH_VARARGS, posix_utime__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007139#ifdef HAVE_TIMES
Neal Norwitze241ce82003-02-17 18:17:05 +00007140 {"times", posix_times, METH_NOARGS, posix_times__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007141#endif /* HAVE_TIMES */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007142 {"_exit", posix__exit, METH_VARARGS, posix__exit__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007143#ifdef HAVE_EXECV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007144 {"execv", posix_execv, METH_VARARGS, posix_execv__doc__},
7145 {"execve", posix_execve, METH_VARARGS, posix_execve__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007146#endif /* HAVE_EXECV */
Guido van Rossuma1065681999-01-25 23:20:23 +00007147#ifdef HAVE_SPAWNV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007148 {"spawnv", posix_spawnv, METH_VARARGS, posix_spawnv__doc__},
7149 {"spawnve", posix_spawnve, METH_VARARGS, posix_spawnve__doc__},
Andrew MacIntyre69e18c92004-04-04 07:11:43 +00007150#if defined(PYOS_OS2)
7151 {"spawnvp", posix_spawnvp, METH_VARARGS, posix_spawnvp__doc__},
7152 {"spawnvpe", posix_spawnvpe, METH_VARARGS, posix_spawnvpe__doc__},
7153#endif /* PYOS_OS2 */
Guido van Rossuma1065681999-01-25 23:20:23 +00007154#endif /* HAVE_SPAWNV */
Guido van Rossum2242f2f2001-04-11 20:58:20 +00007155#ifdef HAVE_FORK1
Neal Norwitze241ce82003-02-17 18:17:05 +00007156 {"fork1", posix_fork1, METH_NOARGS, posix_fork1__doc__},
Guido van Rossum2242f2f2001-04-11 20:58:20 +00007157#endif /* HAVE_FORK1 */
Guido van Rossumad0ee831995-03-01 10:34:45 +00007158#ifdef HAVE_FORK
Neal Norwitze241ce82003-02-17 18:17:05 +00007159 {"fork", posix_fork, METH_NOARGS, posix_fork__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007160#endif /* HAVE_FORK */
Martin v. Löwis24a880b2002-12-31 12:55:15 +00007161#if defined(HAVE_OPENPTY) || defined(HAVE__GETPTY) || defined(HAVE_DEV_PTMX)
Neal Norwitze241ce82003-02-17 18:17:05 +00007162 {"openpty", posix_openpty, METH_NOARGS, posix_openpty__doc__},
Martin v. Löwis24a880b2002-12-31 12:55:15 +00007163#endif /* HAVE_OPENPTY || HAVE__GETPTY || HAVE_DEV_PTMX */
Fred Drake8cef4cf2000-06-28 16:40:38 +00007164#ifdef HAVE_FORKPTY
Neal Norwitze241ce82003-02-17 18:17:05 +00007165 {"forkpty", posix_forkpty, METH_NOARGS, posix_forkpty__doc__},
Fred Drake8cef4cf2000-06-28 16:40:38 +00007166#endif /* HAVE_FORKPTY */
Guido van Rossumad0ee831995-03-01 10:34:45 +00007167#ifdef HAVE_GETEGID
Neal Norwitze241ce82003-02-17 18:17:05 +00007168 {"getegid", posix_getegid, METH_NOARGS, posix_getegid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007169#endif /* HAVE_GETEGID */
7170#ifdef HAVE_GETEUID
Neal Norwitze241ce82003-02-17 18:17:05 +00007171 {"geteuid", posix_geteuid, METH_NOARGS, posix_geteuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007172#endif /* HAVE_GETEUID */
7173#ifdef HAVE_GETGID
Neal Norwitze241ce82003-02-17 18:17:05 +00007174 {"getgid", posix_getgid, METH_NOARGS, posix_getgid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007175#endif /* HAVE_GETGID */
Fred Drakec9680921999-12-13 16:37:25 +00007176#ifdef HAVE_GETGROUPS
Neal Norwitze241ce82003-02-17 18:17:05 +00007177 {"getgroups", posix_getgroups, METH_NOARGS, posix_getgroups__doc__},
Fred Drakec9680921999-12-13 16:37:25 +00007178#endif
Neal Norwitze241ce82003-02-17 18:17:05 +00007179 {"getpid", posix_getpid, METH_NOARGS, posix_getpid__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00007180#ifdef HAVE_GETPGRP
Neal Norwitze241ce82003-02-17 18:17:05 +00007181 {"getpgrp", posix_getpgrp, METH_NOARGS, posix_getpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007182#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00007183#ifdef HAVE_GETPPID
Neal Norwitze241ce82003-02-17 18:17:05 +00007184 {"getppid", posix_getppid, METH_NOARGS, posix_getppid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007185#endif /* HAVE_GETPPID */
7186#ifdef HAVE_GETUID
Neal Norwitze241ce82003-02-17 18:17:05 +00007187 {"getuid", posix_getuid, METH_NOARGS, posix_getuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007188#endif /* HAVE_GETUID */
Fred Drake12c6e2d1999-12-14 21:25:03 +00007189#ifdef HAVE_GETLOGIN
Neal Norwitze241ce82003-02-17 18:17:05 +00007190 {"getlogin", posix_getlogin, METH_NOARGS, posix_getlogin__doc__},
Fred Drake12c6e2d1999-12-14 21:25:03 +00007191#endif
Guido van Rossumad0ee831995-03-01 10:34:45 +00007192#ifdef HAVE_KILL
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007193 {"kill", posix_kill, METH_VARARGS, posix_kill__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007194#endif /* HAVE_KILL */
Martin v. Löwisb2c92f42002-02-16 23:35:41 +00007195#ifdef HAVE_KILLPG
7196 {"killpg", posix_killpg, METH_VARARGS, posix_killpg__doc__},
7197#endif /* HAVE_KILLPG */
Guido van Rossumc0125471996-06-28 18:55:32 +00007198#ifdef HAVE_PLOCK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007199 {"plock", posix_plock, METH_VARARGS, posix_plock__doc__},
Guido van Rossumc0125471996-06-28 18:55:32 +00007200#endif /* HAVE_PLOCK */
Thomas Heller8b7a9572007-08-31 06:44:36 +00007201#ifdef MS_WINDOWS
7202 {"startfile", win32_startfile, METH_VARARGS, win32_startfile__doc__},
7203#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00007204#ifdef HAVE_SETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007205 {"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007206#endif /* HAVE_SETUID */
Andrew M. Kuchling8d2f2b22000-07-13 01:26:58 +00007207#ifdef HAVE_SETEUID
7208 {"seteuid", posix_seteuid, METH_VARARGS, posix_seteuid__doc__},
7209#endif /* HAVE_SETEUID */
7210#ifdef HAVE_SETEGID
7211 {"setegid", posix_setegid, METH_VARARGS, posix_setegid__doc__},
7212#endif /* HAVE_SETEGID */
7213#ifdef HAVE_SETREUID
7214 {"setreuid", posix_setreuid, METH_VARARGS, posix_setreuid__doc__},
7215#endif /* HAVE_SETREUID */
7216#ifdef HAVE_SETREGID
7217 {"setregid", posix_setregid, METH_VARARGS, posix_setregid__doc__},
7218#endif /* HAVE_SETREGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007219#ifdef HAVE_SETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007220 {"setgid", posix_setgid, METH_VARARGS, posix_setgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007221#endif /* HAVE_SETGID */
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00007222#ifdef HAVE_SETGROUPS
Thomas Wouters4d70c3d2006-06-08 14:42:34 +00007223 {"setgroups", posix_setgroups, METH_O, posix_setgroups__doc__},
Martin v. Löwis61c5edf2001-10-18 04:06:00 +00007224#endif /* HAVE_SETGROUPS */
Antoine Pitroub7572f02009-12-02 20:46:48 +00007225#ifdef HAVE_INITGROUPS
7226 {"initgroups", posix_initgroups, METH_VARARGS, posix_initgroups__doc__},
7227#endif /* HAVE_INITGROUPS */
Martin v. Löwis606edc12002-06-13 21:09:11 +00007228#ifdef HAVE_GETPGID
7229 {"getpgid", posix_getpgid, METH_VARARGS, posix_getpgid__doc__},
7230#endif /* HAVE_GETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007231#ifdef HAVE_SETPGRP
Neal Norwitze241ce82003-02-17 18:17:05 +00007232 {"setpgrp", posix_setpgrp, METH_NOARGS, posix_setpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007233#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00007234#ifdef HAVE_WAIT
Neal Norwitze241ce82003-02-17 18:17:05 +00007235 {"wait", posix_wait, METH_NOARGS, posix_wait__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00007236#endif /* HAVE_WAIT */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007237#ifdef HAVE_WAIT3
7238 {"wait3", posix_wait3, METH_VARARGS, posix_wait3__doc__},
7239#endif /* HAVE_WAIT3 */
7240#ifdef HAVE_WAIT4
7241 {"wait4", posix_wait4, METH_VARARGS, posix_wait4__doc__},
7242#endif /* HAVE_WAIT4 */
Tim Petersab034fa2002-02-01 11:27:43 +00007243#if defined(HAVE_WAITPID) || defined(HAVE_CWAIT)
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007244 {"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007245#endif /* HAVE_WAITPID */
Martin v. Löwis49ee14d2003-11-10 06:35:36 +00007246#ifdef HAVE_GETSID
7247 {"getsid", posix_getsid, METH_VARARGS, posix_getsid__doc__},
7248#endif /* HAVE_GETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007249#ifdef HAVE_SETSID
Neal Norwitze241ce82003-02-17 18:17:05 +00007250 {"setsid", posix_setsid, METH_NOARGS, posix_setsid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007251#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007252#ifdef HAVE_SETPGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007253 {"setpgid", posix_setpgid, METH_VARARGS, posix_setpgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007254#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007255#ifdef HAVE_TCGETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007256 {"tcgetpgrp", posix_tcgetpgrp, METH_VARARGS, posix_tcgetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007257#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007258#ifdef HAVE_TCSETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007259 {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00007260#endif /* HAVE_TCSETPGRP */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007261 {"open", posix_open, METH_VARARGS, posix_open__doc__},
7262 {"close", posix_close, METH_VARARGS, posix_close__doc__},
Christian Heimesfdab48e2008-01-20 09:06:41 +00007263 {"closerange", posix_closerange, METH_VARARGS, posix_closerange__doc__},
Martin v. Löwisd1cd4d42007-08-11 14:02:14 +00007264 {"device_encoding", device_encoding, METH_VARARGS, device_encoding__doc__},
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007265 {"dup", posix_dup, METH_VARARGS, posix_dup__doc__},
7266 {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__},
7267 {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},
7268 {"read", posix_read, METH_VARARGS, posix_read__doc__},
7269 {"write", posix_write, METH_VARARGS, posix_write__doc__},
7270 {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__},
Skip Montanaro1517d842000-07-19 14:34:14 +00007271 {"isatty", posix_isatty, METH_VARARGS, posix_isatty__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007272#ifdef HAVE_PIPE
Neal Norwitze241ce82003-02-17 18:17:05 +00007273 {"pipe", posix_pipe, METH_NOARGS, posix_pipe__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007274#endif
7275#ifdef HAVE_MKFIFO
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007276 {"mkfifo", posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007277#endif
Neal Norwitz11690112002-07-30 01:08:28 +00007278#if defined(HAVE_MKNOD) && defined(HAVE_MAKEDEV)
Martin v. Löwis06a83e92002-04-14 10:19:44 +00007279 {"mknod", posix_mknod, METH_VARARGS, posix_mknod__doc__},
7280#endif
Martin v. Löwisdbe3f762002-10-10 14:27:30 +00007281#ifdef HAVE_DEVICE_MACROS
7282 {"major", posix_major, METH_VARARGS, posix_major__doc__},
7283 {"minor", posix_minor, METH_VARARGS, posix_minor__doc__},
7284 {"makedev", posix_makedev, METH_VARARGS, posix_makedev__doc__},
7285#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007286#ifdef HAVE_FTRUNCATE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007287 {"ftruncate", posix_ftruncate, METH_VARARGS, posix_ftruncate__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00007288#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00007289#ifdef HAVE_PUTENV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007290 {"putenv", posix_putenv, METH_VARARGS, posix_putenv__doc__},
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00007291#endif
Guido van Rossumc524d952001-10-19 01:31:59 +00007292#ifdef HAVE_UNSETENV
7293 {"unsetenv", posix_unsetenv, METH_VARARGS, posix_unsetenv__doc__},
7294#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007295 {"strerror", posix_strerror, METH_VARARGS, posix_strerror__doc__},
Fred Drake4d1e64b2002-04-15 19:40:07 +00007296#ifdef HAVE_FCHDIR
7297 {"fchdir", posix_fchdir, METH_O, posix_fchdir__doc__},
7298#endif
Guido van Rossum21142a01999-01-08 21:05:37 +00007299#ifdef HAVE_FSYNC
Fred Drake4d1e64b2002-04-15 19:40:07 +00007300 {"fsync", posix_fsync, METH_O, posix_fsync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00007301#endif
7302#ifdef HAVE_FDATASYNC
Fred Drake4d1e64b2002-04-15 19:40:07 +00007303 {"fdatasync", posix_fdatasync, METH_O, posix_fdatasync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00007304#endif
Guido van Rossumc9641791998-08-04 15:26:23 +00007305#ifdef HAVE_SYS_WAIT_H
Fred Drake106c1a02002-04-23 15:58:02 +00007306#ifdef WCOREDUMP
7307 {"WCOREDUMP", posix_WCOREDUMP, METH_VARARGS, posix_WCOREDUMP__doc__},
7308#endif /* WCOREDUMP */
Martin v. Löwis2b41b0d2002-05-04 13:13:41 +00007309#ifdef WIFCONTINUED
7310 {"WIFCONTINUED",posix_WIFCONTINUED, METH_VARARGS, posix_WIFCONTINUED__doc__},
7311#endif /* WIFCONTINUED */
Guido van Rossumc9641791998-08-04 15:26:23 +00007312#ifdef WIFSTOPPED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007313 {"WIFSTOPPED", posix_WIFSTOPPED, METH_VARARGS, posix_WIFSTOPPED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007314#endif /* WIFSTOPPED */
7315#ifdef WIFSIGNALED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007316 {"WIFSIGNALED", posix_WIFSIGNALED, METH_VARARGS, posix_WIFSIGNALED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007317#endif /* WIFSIGNALED */
7318#ifdef WIFEXITED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007319 {"WIFEXITED", posix_WIFEXITED, METH_VARARGS, posix_WIFEXITED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007320#endif /* WIFEXITED */
7321#ifdef WEXITSTATUS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007322 {"WEXITSTATUS", posix_WEXITSTATUS, METH_VARARGS, posix_WEXITSTATUS__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007323#endif /* WEXITSTATUS */
7324#ifdef WTERMSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007325 {"WTERMSIG", posix_WTERMSIG, METH_VARARGS, posix_WTERMSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007326#endif /* WTERMSIG */
7327#ifdef WSTOPSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007328 {"WSTOPSIG", posix_WSTOPSIG, METH_VARARGS, posix_WSTOPSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00007329#endif /* WSTOPSIG */
7330#endif /* HAVE_SYS_WAIT_H */
Thomas Wouters477c8d52006-05-27 19:21:47 +00007331#if defined(HAVE_FSTATVFS) && defined(HAVE_SYS_STATVFS_H)
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007332 {"fstatvfs", posix_fstatvfs, METH_VARARGS, posix_fstatvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00007333#endif
Thomas Wouters477c8d52006-05-27 19:21:47 +00007334#if defined(HAVE_STATVFS) && defined(HAVE_SYS_STATVFS_H)
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007335 {"statvfs", posix_statvfs, METH_VARARGS, posix_statvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00007336#endif
Fred Drakec9680921999-12-13 16:37:25 +00007337#ifdef HAVE_CONFSTR
7338 {"confstr", posix_confstr, METH_VARARGS, posix_confstr__doc__},
7339#endif
7340#ifdef HAVE_SYSCONF
7341 {"sysconf", posix_sysconf, METH_VARARGS, posix_sysconf__doc__},
7342#endif
7343#ifdef HAVE_FPATHCONF
7344 {"fpathconf", posix_fpathconf, METH_VARARGS, posix_fpathconf__doc__},
7345#endif
7346#ifdef HAVE_PATHCONF
7347 {"pathconf", posix_pathconf, METH_VARARGS, posix_pathconf__doc__},
7348#endif
Neal Norwitze241ce82003-02-17 18:17:05 +00007349 {"abort", posix_abort, METH_NOARGS, posix_abort__doc__},
Martin v. Löwis6238d2b2002-06-30 15:26:10 +00007350#ifdef MS_WINDOWS
Mark Hammondef8b6542001-05-13 08:04:26 +00007351 {"_getfullpathname", posix__getfullpathname, METH_VARARGS, NULL},
7352#endif
Martin v. Löwis438b5342002-12-27 10:16:42 +00007353#ifdef HAVE_GETLOADAVG
Neal Norwitze241ce82003-02-17 18:17:05 +00007354 {"getloadavg", posix_getloadavg, METH_NOARGS, posix_getloadavg__doc__},
Martin v. Löwis438b5342002-12-27 10:16:42 +00007355#endif
Martin v. Löwisdc3883f2004-08-29 15:46:35 +00007356 #ifdef MS_WINDOWS
7357 {"urandom", win32_urandom, METH_VARARGS, win32_urandom__doc__},
7358 #endif
Thomas Wouters0e3f5912006-08-11 14:57:12 +00007359 #ifdef __VMS
7360 {"urandom", vms_urandom, METH_VARARGS, vms_urandom__doc__},
7361 #endif
Martin v. Löwis7aed61a2009-11-27 14:09:49 +00007362#ifdef HAVE_SETRESUID
7363 {"setresuid", posix_setresuid, METH_VARARGS, posix_setresuid__doc__},
7364#endif
7365#ifdef HAVE_SETRESGID
7366 {"setresgid", posix_setresgid, METH_VARARGS, posix_setresgid__doc__},
7367#endif
7368#ifdef HAVE_GETRESUID
7369 {"getresuid", posix_getresuid, METH_NOARGS, posix_getresuid__doc__},
7370#endif
7371#ifdef HAVE_GETRESGID
7372 {"getresgid", posix_getresgid, METH_NOARGS, posix_getresgid__doc__},
7373#endif
7374
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00007375 {NULL, NULL} /* Sentinel */
7376};
7377
7378
Barry Warsaw4a342091996-12-19 23:50:02 +00007379static int
Fred Drake4d1e64b2002-04-15 19:40:07 +00007380ins(PyObject *module, char *symbol, long value)
Barry Warsaw4a342091996-12-19 23:50:02 +00007381{
Fred Drake4d1e64b2002-04-15 19:40:07 +00007382 return PyModule_AddIntConstant(module, symbol, value);
Barry Warsaw4a342091996-12-19 23:50:02 +00007383}
7384
Guido van Rossumd48f2521997-12-05 22:19:34 +00007385#if defined(PYOS_OS2)
7386/* Insert Platform-Specific Constant Values (Strings & Numbers) of Common Use */
Fred Drake4d1e64b2002-04-15 19:40:07 +00007387static int insertvalues(PyObject *module)
Guido van Rossumd48f2521997-12-05 22:19:34 +00007388{
7389 APIRET rc;
7390 ULONG values[QSV_MAX+1];
7391 PyObject *v;
Marc-André Lemburgd4c0a9c2001-11-28 11:47:00 +00007392 char *ver, tmp[50];
Guido van Rossumd48f2521997-12-05 22:19:34 +00007393
7394 Py_BEGIN_ALLOW_THREADS
Andrew MacIntyre75e01452003-04-21 14:19:51 +00007395 rc = DosQuerySysInfo(1L, QSV_MAX, &values[1], sizeof(ULONG) * QSV_MAX);
Guido van Rossumd48f2521997-12-05 22:19:34 +00007396 Py_END_ALLOW_THREADS
7397
7398 if (rc != NO_ERROR) {
7399 os2_error(rc);
7400 return -1;
7401 }
7402
Fred Drake4d1e64b2002-04-15 19:40:07 +00007403 if (ins(module, "meminstalled", values[QSV_TOTPHYSMEM])) return -1;
7404 if (ins(module, "memkernel", values[QSV_TOTRESMEM])) return -1;
7405 if (ins(module, "memvirtual", values[QSV_TOTAVAILMEM])) return -1;
7406 if (ins(module, "maxpathlen", values[QSV_MAX_PATH_LENGTH])) return -1;
7407 if (ins(module, "maxnamelen", values[QSV_MAX_COMP_LENGTH])) return -1;
7408 if (ins(module, "revision", values[QSV_VERSION_REVISION])) return -1;
7409 if (ins(module, "timeslice", values[QSV_MIN_SLICE])) return -1;
Guido van Rossumd48f2521997-12-05 22:19:34 +00007410
7411 switch (values[QSV_VERSION_MINOR]) {
7412 case 0: ver = "2.00"; break;
7413 case 10: ver = "2.10"; break;
7414 case 11: ver = "2.11"; break;
7415 case 30: ver = "3.00"; break;
7416 case 40: ver = "4.00"; break;
7417 case 50: ver = "5.00"; break;
7418 default:
Tim Peters885d4572001-11-28 20:27:42 +00007419 PyOS_snprintf(tmp, sizeof(tmp),
7420 "%d-%d", values[QSV_VERSION_MAJOR],
7421 values[QSV_VERSION_MINOR]);
Guido van Rossumd48f2521997-12-05 22:19:34 +00007422 ver = &tmp[0];
7423 }
7424
7425 /* Add Indicator of the Version of the Operating System */
Fred Drake4d1e64b2002-04-15 19:40:07 +00007426 if (PyModule_AddStringConstant(module, "version", tmp) < 0)
Guido van Rossumd48f2521997-12-05 22:19:34 +00007427 return -1;
Guido van Rossumd48f2521997-12-05 22:19:34 +00007428
7429 /* Add Indicator of Which Drive was Used to Boot the System */
7430 tmp[0] = 'A' + values[QSV_BOOT_DRIVE] - 1;
7431 tmp[1] = ':';
7432 tmp[2] = '\0';
7433
Fred Drake4d1e64b2002-04-15 19:40:07 +00007434 return PyModule_AddStringConstant(module, "bootdrive", tmp);
Guido van Rossumd48f2521997-12-05 22:19:34 +00007435}
7436#endif
7437
Barry Warsaw4a342091996-12-19 23:50:02 +00007438static int
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00007439all_ins(PyObject *d)
Barry Warsaw4a342091996-12-19 23:50:02 +00007440{
Guido van Rossum94f6f721999-01-06 18:42:14 +00007441#ifdef F_OK
7442 if (ins(d, "F_OK", (long)F_OK)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007443#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00007444#ifdef R_OK
7445 if (ins(d, "R_OK", (long)R_OK)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007446#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00007447#ifdef W_OK
7448 if (ins(d, "W_OK", (long)W_OK)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007449#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00007450#ifdef X_OK
7451 if (ins(d, "X_OK", (long)X_OK)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007452#endif
Fred Drakec9680921999-12-13 16:37:25 +00007453#ifdef NGROUPS_MAX
7454 if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1;
7455#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00007456#ifdef TMP_MAX
7457 if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1;
7458#endif
Fred Drake106c1a02002-04-23 15:58:02 +00007459#ifdef WCONTINUED
7460 if (ins(d, "WCONTINUED", (long)WCONTINUED)) return -1;
7461#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00007462#ifdef WNOHANG
7463 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
Tim Peters5aa91602002-01-30 05:46:57 +00007464#endif
Fred Drake106c1a02002-04-23 15:58:02 +00007465#ifdef WUNTRACED
7466 if (ins(d, "WUNTRACED", (long)WUNTRACED)) return -1;
7467#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00007468#ifdef O_RDONLY
7469 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
7470#endif
7471#ifdef O_WRONLY
7472 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
7473#endif
7474#ifdef O_RDWR
7475 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
7476#endif
7477#ifdef O_NDELAY
7478 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
7479#endif
7480#ifdef O_NONBLOCK
7481 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
7482#endif
7483#ifdef O_APPEND
7484 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
7485#endif
7486#ifdef O_DSYNC
7487 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
7488#endif
7489#ifdef O_RSYNC
7490 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
7491#endif
7492#ifdef O_SYNC
7493 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
7494#endif
7495#ifdef O_NOCTTY
7496 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
7497#endif
7498#ifdef O_CREAT
7499 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
7500#endif
7501#ifdef O_EXCL
7502 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
7503#endif
7504#ifdef O_TRUNC
7505 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
7506#endif
Guido van Rossum98d9d091997-08-08 21:48:51 +00007507#ifdef O_BINARY
7508 if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
7509#endif
7510#ifdef O_TEXT
7511 if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
7512#endif
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007513#ifdef O_LARGEFILE
7514 if (ins(d, "O_LARGEFILE", (long)O_LARGEFILE)) return -1;
7515#endif
Skip Montanaro5ff14922005-05-16 02:42:22 +00007516#ifdef O_SHLOCK
7517 if (ins(d, "O_SHLOCK", (long)O_SHLOCK)) return -1;
7518#endif
7519#ifdef O_EXLOCK
7520 if (ins(d, "O_EXLOCK", (long)O_EXLOCK)) return -1;
7521#endif
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007522
Tim Peters5aa91602002-01-30 05:46:57 +00007523/* MS Windows */
7524#ifdef O_NOINHERIT
7525 /* Don't inherit in child processes. */
7526 if (ins(d, "O_NOINHERIT", (long)O_NOINHERIT)) return -1;
7527#endif
7528#ifdef _O_SHORT_LIVED
7529 /* Optimize for short life (keep in memory). */
7530 /* MS forgot to define this one with a non-underscore form too. */
7531 if (ins(d, "O_SHORT_LIVED", (long)_O_SHORT_LIVED)) return -1;
7532#endif
7533#ifdef O_TEMPORARY
7534 /* Automatically delete when last handle is closed. */
7535 if (ins(d, "O_TEMPORARY", (long)O_TEMPORARY)) return -1;
7536#endif
7537#ifdef O_RANDOM
7538 /* Optimize for random access. */
7539 if (ins(d, "O_RANDOM", (long)O_RANDOM)) return -1;
7540#endif
7541#ifdef O_SEQUENTIAL
7542 /* Optimize for sequential access. */
7543 if (ins(d, "O_SEQUENTIAL", (long)O_SEQUENTIAL)) return -1;
7544#endif
7545
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007546/* GNU extensions. */
Alexandre Vassalottibee32532008-05-16 18:15:12 +00007547#ifdef O_ASYNC
7548 /* Send a SIGIO signal whenever input or output
7549 becomes available on file descriptor */
7550 if (ins(d, "O_ASYNC", (long)O_ASYNC)) return -1;
7551#endif
Martin v. Löwis4fe3c272001-10-18 22:05:36 +00007552#ifdef O_DIRECT
7553 /* Direct disk access. */
7554 if (ins(d, "O_DIRECT", (long)O_DIRECT)) return -1;
7555#endif
7556#ifdef O_DIRECTORY
7557 /* Must be a directory. */
7558 if (ins(d, "O_DIRECTORY", (long)O_DIRECTORY)) return -1;
7559#endif
7560#ifdef O_NOFOLLOW
7561 /* Do not follow links. */
7562 if (ins(d, "O_NOFOLLOW", (long)O_NOFOLLOW)) return -1;
7563#endif
Guido van Rossum0d3fb8a2007-11-26 23:23:18 +00007564#ifdef O_NOATIME
7565 /* Do not update the access time. */
7566 if (ins(d, "O_NOATIME", (long)O_NOATIME)) return -1;
7567#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +00007568
Barry Warsaw5676bd12003-01-07 20:57:09 +00007569 /* These come from sysexits.h */
7570#ifdef EX_OK
7571 if (ins(d, "EX_OK", (long)EX_OK)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007572#endif /* EX_OK */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007573#ifdef EX_USAGE
7574 if (ins(d, "EX_USAGE", (long)EX_USAGE)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007575#endif /* EX_USAGE */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007576#ifdef EX_DATAERR
7577 if (ins(d, "EX_DATAERR", (long)EX_DATAERR)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007578#endif /* EX_DATAERR */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007579#ifdef EX_NOINPUT
7580 if (ins(d, "EX_NOINPUT", (long)EX_NOINPUT)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007581#endif /* EX_NOINPUT */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007582#ifdef EX_NOUSER
7583 if (ins(d, "EX_NOUSER", (long)EX_NOUSER)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007584#endif /* EX_NOUSER */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007585#ifdef EX_NOHOST
7586 if (ins(d, "EX_NOHOST", (long)EX_NOHOST)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007587#endif /* EX_NOHOST */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007588#ifdef EX_UNAVAILABLE
7589 if (ins(d, "EX_UNAVAILABLE", (long)EX_UNAVAILABLE)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007590#endif /* EX_UNAVAILABLE */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007591#ifdef EX_SOFTWARE
7592 if (ins(d, "EX_SOFTWARE", (long)EX_SOFTWARE)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007593#endif /* EX_SOFTWARE */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007594#ifdef EX_OSERR
7595 if (ins(d, "EX_OSERR", (long)EX_OSERR)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007596#endif /* EX_OSERR */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007597#ifdef EX_OSFILE
7598 if (ins(d, "EX_OSFILE", (long)EX_OSFILE)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007599#endif /* EX_OSFILE */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007600#ifdef EX_CANTCREAT
7601 if (ins(d, "EX_CANTCREAT", (long)EX_CANTCREAT)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007602#endif /* EX_CANTCREAT */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007603#ifdef EX_IOERR
7604 if (ins(d, "EX_IOERR", (long)EX_IOERR)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007605#endif /* EX_IOERR */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007606#ifdef EX_TEMPFAIL
7607 if (ins(d, "EX_TEMPFAIL", (long)EX_TEMPFAIL)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007608#endif /* EX_TEMPFAIL */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007609#ifdef EX_PROTOCOL
7610 if (ins(d, "EX_PROTOCOL", (long)EX_PROTOCOL)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007611#endif /* EX_PROTOCOL */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007612#ifdef EX_NOPERM
7613 if (ins(d, "EX_NOPERM", (long)EX_NOPERM)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007614#endif /* EX_NOPERM */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007615#ifdef EX_CONFIG
7616 if (ins(d, "EX_CONFIG", (long)EX_CONFIG)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007617#endif /* EX_CONFIG */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007618#ifdef EX_NOTFOUND
7619 if (ins(d, "EX_NOTFOUND", (long)EX_NOTFOUND)) return -1;
Neal Norwitz8e914d92003-01-10 15:29:16 +00007620#endif /* EX_NOTFOUND */
Barry Warsaw5676bd12003-01-07 20:57:09 +00007621
Guido van Rossum246bc171999-02-01 23:54:31 +00007622#ifdef HAVE_SPAWNV
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00007623#if defined(PYOS_OS2) && defined(PYCC_GCC)
7624 if (ins(d, "P_WAIT", (long)P_WAIT)) return -1;
7625 if (ins(d, "P_NOWAIT", (long)P_NOWAIT)) return -1;
7626 if (ins(d, "P_OVERLAY", (long)P_OVERLAY)) return -1;
7627 if (ins(d, "P_DEBUG", (long)P_DEBUG)) return -1;
7628 if (ins(d, "P_SESSION", (long)P_SESSION)) return -1;
7629 if (ins(d, "P_DETACH", (long)P_DETACH)) return -1;
7630 if (ins(d, "P_PM", (long)P_PM)) return -1;
7631 if (ins(d, "P_DEFAULT", (long)P_DEFAULT)) return -1;
7632 if (ins(d, "P_MINIMIZE", (long)P_MINIMIZE)) return -1;
7633 if (ins(d, "P_MAXIMIZE", (long)P_MAXIMIZE)) return -1;
7634 if (ins(d, "P_FULLSCREEN", (long)P_FULLSCREEN)) return -1;
7635 if (ins(d, "P_WINDOWED", (long)P_WINDOWED)) return -1;
7636 if (ins(d, "P_FOREGROUND", (long)P_FOREGROUND)) return -1;
7637 if (ins(d, "P_BACKGROUND", (long)P_BACKGROUND)) return -1;
7638 if (ins(d, "P_NOCLOSE", (long)P_NOCLOSE)) return -1;
7639 if (ins(d, "P_NOSESSION", (long)P_NOSESSION)) return -1;
7640 if (ins(d, "P_QUOTE", (long)P_QUOTE)) return -1;
7641 if (ins(d, "P_TILDE", (long)P_TILDE)) return -1;
7642 if (ins(d, "P_UNRELATED", (long)P_UNRELATED)) return -1;
7643 if (ins(d, "P_DEBUGDESC", (long)P_DEBUGDESC)) return -1;
7644#else
Guido van Rossum7d385291999-02-16 19:38:04 +00007645 if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1;
7646 if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1;
7647 if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1;
7648 if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1;
7649 if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1;
Guido van Rossum246bc171999-02-01 23:54:31 +00007650#endif
Andrew MacIntyre6c73af22002-03-03 03:07:07 +00007651#endif
Guido van Rossum246bc171999-02-01 23:54:31 +00007652
Guido van Rossumd48f2521997-12-05 22:19:34 +00007653#if defined(PYOS_OS2)
7654 if (insertvalues(d)) return -1;
7655#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00007656 return 0;
7657}
7658
7659
Tim Peters5aa91602002-01-30 05:46:57 +00007660#if (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__BORLANDC__)) && !defined(__QNX__)
Martin v. Löwis1a214512008-06-11 05:26:20 +00007661#define INITFUNC PyInit_nt
Guido van Rossum0cb96de1997-10-01 04:29:29 +00007662#define MODNAME "nt"
Tim Peters58e0a8c2001-05-14 22:32:33 +00007663
7664#elif defined(PYOS_OS2)
Martin v. Löwis1a214512008-06-11 05:26:20 +00007665#define INITFUNC PyInit_os2
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007666#define MODNAME "os2"
Tim Peters58e0a8c2001-05-14 22:32:33 +00007667
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00007668#else
Martin v. Löwis1a214512008-06-11 05:26:20 +00007669#define INITFUNC PyInit_posix
Guido van Rossum0cb96de1997-10-01 04:29:29 +00007670#define MODNAME "posix"
7671#endif
7672
Martin v. Löwis1a214512008-06-11 05:26:20 +00007673static struct PyModuleDef posixmodule = {
7674 PyModuleDef_HEAD_INIT,
7675 MODNAME,
7676 posix__doc__,
7677 -1,
7678 posix_methods,
7679 NULL,
7680 NULL,
7681 NULL,
7682 NULL
7683};
7684
7685
Mark Hammondfe51c6d2002-08-02 02:27:13 +00007686PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00007687INITFUNC(void)
Guido van Rossumb6775db1994-08-01 11:34:53 +00007688{
Fred Drake4d1e64b2002-04-15 19:40:07 +00007689 PyObject *m, *v;
Tim Peters5aa91602002-01-30 05:46:57 +00007690
Martin v. Löwis1a214512008-06-11 05:26:20 +00007691 m = PyModule_Create(&posixmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00007692 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00007693 return NULL;
Tim Peters5aa91602002-01-30 05:46:57 +00007694
Guido van Rossum0cb96de1997-10-01 04:29:29 +00007695 /* Initialize environ dictionary */
Guido van Rossumb6775db1994-08-01 11:34:53 +00007696 v = convertenviron();
Fred Drake4d1e64b2002-04-15 19:40:07 +00007697 Py_XINCREF(v);
7698 if (v == NULL || PyModule_AddObject(m, "environ", v) != 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00007699 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00007700 Py_DECREF(v);
Fred Drakec9680921999-12-13 16:37:25 +00007701
Fred Drake4d1e64b2002-04-15 19:40:07 +00007702 if (all_ins(m))
Martin v. Löwis1a214512008-06-11 05:26:20 +00007703 return NULL;
Barry Warsaw4a342091996-12-19 23:50:02 +00007704
Fred Drake4d1e64b2002-04-15 19:40:07 +00007705 if (setup_confname_tables(m))
Martin v. Löwis1a214512008-06-11 05:26:20 +00007706 return NULL;
Fred Drakebec628d1999-12-15 18:31:10 +00007707
Fred Drake4d1e64b2002-04-15 19:40:07 +00007708 Py_INCREF(PyExc_OSError);
7709 PyModule_AddObject(m, "error", PyExc_OSError);
Fred Drake762e2061999-08-26 17:23:54 +00007710
Guido van Rossumb3d39562000-01-31 18:41:26 +00007711#ifdef HAVE_PUTENV
Neil Schemenauer19030a02001-01-16 04:27:47 +00007712 if (posix_putenv_garbage == NULL)
7713 posix_putenv_garbage = PyDict_New();
Guido van Rossumb3d39562000-01-31 18:41:26 +00007714#endif
Guido van Rossum98bf58f2001-10-18 20:34:25 +00007715
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007716 if (!initialized) {
7717 stat_result_desc.name = MODNAME ".stat_result";
7718 stat_result_desc.fields[7].name = PyStructSequence_UnnamedField;
7719 stat_result_desc.fields[8].name = PyStructSequence_UnnamedField;
7720 stat_result_desc.fields[9].name = PyStructSequence_UnnamedField;
7721 PyStructSequence_InitType(&StatResultType, &stat_result_desc);
7722 structseq_new = StatResultType.tp_new;
7723 StatResultType.tp_new = statresult_new;
7724
7725 statvfs_result_desc.name = MODNAME ".statvfs_result";
7726 PyStructSequence_InitType(&StatVFSResultType, &statvfs_result_desc);
Martin v. Löwis05bfe1f2008-12-29 18:21:47 +00007727#ifdef NEED_TICKS_PER_SECOND
7728# if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
7729 ticks_per_second = sysconf(_SC_CLK_TCK);
7730# elif defined(HZ)
7731 ticks_per_second = HZ;
7732# else
7733 ticks_per_second = 60; /* magic fallback value; may be bogus */
7734# endif
7735#endif
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007736 }
Fred Drake4d1e64b2002-04-15 19:40:07 +00007737 Py_INCREF((PyObject*) &StatResultType);
7738 PyModule_AddObject(m, "stat_result", (PyObject*) &StatResultType);
Fred Drake4d1e64b2002-04-15 19:40:07 +00007739 Py_INCREF((PyObject*) &StatVFSResultType);
7740 PyModule_AddObject(m, "statvfs_result",
7741 (PyObject*) &StatVFSResultType);
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007742 initialized = 1;
Thomas Wouters477c8d52006-05-27 19:21:47 +00007743
7744#ifdef __APPLE__
7745 /*
7746 * Step 2 of weak-linking support on Mac OS X.
7747 *
7748 * The code below removes functions that are not available on the
7749 * currently active platform.
7750 *
7751 * This block allow one to use a python binary that was build on
7752 * OSX 10.4 on OSX 10.3, without loosing access to new APIs on
7753 * OSX 10.4.
7754 */
7755#ifdef HAVE_FSTATVFS
7756 if (fstatvfs == NULL) {
7757 if (PyObject_DelAttrString(m, "fstatvfs") == -1) {
Martin v. Löwis1a214512008-06-11 05:26:20 +00007758 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00007759 }
7760 }
7761#endif /* HAVE_FSTATVFS */
7762
7763#ifdef HAVE_STATVFS
7764 if (statvfs == NULL) {
7765 if (PyObject_DelAttrString(m, "statvfs") == -1) {
Martin v. Löwis1a214512008-06-11 05:26:20 +00007766 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00007767 }
7768 }
7769#endif /* HAVE_STATVFS */
7770
7771# ifdef HAVE_LCHOWN
7772 if (lchown == NULL) {
7773 if (PyObject_DelAttrString(m, "lchown") == -1) {
Martin v. Löwis1a214512008-06-11 05:26:20 +00007774 return NULL;
Thomas Wouters477c8d52006-05-27 19:21:47 +00007775 }
7776 }
7777#endif /* HAVE_LCHOWN */
7778
7779
7780#endif /* __APPLE__ */
Martin v. Löwis1a214512008-06-11 05:26:20 +00007781 return m;
Thomas Wouters477c8d52006-05-27 19:21:47 +00007782
Guido van Rossumb6775db1994-08-01 11:34:53 +00007783}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00007784
7785#ifdef __cplusplus
7786}
7787#endif