blob: 1afba39224ec056c95e947115f42a690be542948 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* POSIX module implementation */
33
Guido van Rossuma4916fa1996-05-23 22:58:55 +000034/* This file is also used for Windows NT and MS-Win. In that case the module
Guido van Rossumad0ee831995-03-01 10:34:45 +000035 actually calls itself 'nt', not 'posix', and a few functions are
36 either unimplemented or implemented differently. The source
Guido van Rossum8d665e61996-06-26 18:22:49 +000037 assumes that for Windows NT, the macro 'MS_WIN32' is defined independent
Guido van Rossumad0ee831995-03-01 10:34:45 +000038 of the compiler used. Different compilers define their own feature
Guido van Rossuma4916fa1996-05-23 22:58:55 +000039 test macro, e.g. '__BORLANDC__' or '_MSC_VER'. */
Guido van Rossumad0ee831995-03-01 10:34:45 +000040
Guido van Rossuma4916fa1996-05-23 22:58:55 +000041/* See also ../Dos/dosmodule.c */
Guido van Rossumad0ee831995-03-01 10:34:45 +000042
Guido van Rossumec4f4ac1997-06-02 22:20:51 +000043static char posix__doc__ [] =
44"This module provides access to operating system functionality that is\n\
45standardized by the C Standard and the POSIX standard (a thinly\n\
46disguised Unix interface). Refer to the library manual and\n\
47corresponding Unix manual entries for more information on calls.";
48
Barry Warsaw53699e91996-12-10 23:23:01 +000049#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000051#if defined(PYOS_OS2)
52#define INCL_DOS
53#define INCL_DOSERRORS
54#define INCL_DOSPROCESS
55#define INCL_NOPMAPI
56#include <os2.h>
57#endif
58
Guido van Rossumb6775db1994-08-01 11:34:53 +000059#include <sys/types.h>
60#include <sys/stat.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +000061#ifdef HAVE_SYS_WAIT_H
62#include <sys/wait.h> /* For WNOHANG */
63#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000064
Guido van Rossuma376cc51996-12-05 23:43:35 +000065#ifdef HAVE_SIGNAL_H
66#include <signal.h>
67#endif
68
Guido van Rossumb6775db1994-08-01 11:34:53 +000069#include "mytime.h" /* For clock_t on some systems */
70
71#ifdef HAVE_FCNTL_H
72#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000073#endif /* HAVE_FCNTL_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +000074
Guido van Rossuma4916fa1996-05-23 22:58:55 +000075/* Various compilers have only certain posix functions */
Guido van Rossum6d8841c1997-08-14 19:57:39 +000076/* XXX Gosh I wish these were all moved into config.h */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000077#if defined(PYCC_VACPP) && defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000078#include <process.h>
79#else
Guido van Rossumc5a0f531997-12-02 20:36:02 +000080#if defined(__WATCOMC__) && !defined(__QNX__) /* Watcom compiler */
Guido van Rossuma4916fa1996-05-23 22:58:55 +000081#define HAVE_GETCWD 1
82#define HAVE_OPENDIR 1
83#define HAVE_SYSTEM 1
84#if defined(__OS2__)
85#define HAVE_EXECV 1
86#define HAVE_WAIT 1
Guido van Rossumad0ee831995-03-01 10:34:45 +000087#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +000088#include <process.h>
89#else
90#ifdef __BORLANDC__ /* Borland compiler */
91#define HAVE_EXECV 1
92#define HAVE_GETCWD 1
93#define HAVE_GETEGID 1
94#define HAVE_GETEUID 1
95#define HAVE_GETGID 1
96#define HAVE_GETPPID 1
97#define HAVE_GETUID 1
98#define HAVE_KILL 1
99#define HAVE_OPENDIR 1
100#define HAVE_PIPE 1
101#define HAVE_POPEN 1
102#define HAVE_SYSTEM 1
103#define HAVE_WAIT 1
104#else
105#ifdef _MSC_VER /* Microsoft compiler */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000106#define HAVE_GETCWD 1
107#ifdef MS_WIN32
Guido van Rossuma1065681999-01-25 23:20:23 +0000108#define HAVE_SPAWNV 1
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000109#define HAVE_EXECV 1
110#define HAVE_PIPE 1
111#define HAVE_POPEN 1
112#define HAVE_SYSTEM 1
113#else /* 16-bit Windows */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000114#endif /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000115#else /* all other compilers */
116/* Unix functions that the configure script doesn't check for */
117#define HAVE_EXECV 1
118#define HAVE_FORK 1
119#define HAVE_GETCWD 1
120#define HAVE_GETEGID 1
121#define HAVE_GETEUID 1
122#define HAVE_GETGID 1
123#define HAVE_GETPPID 1
124#define HAVE_GETUID 1
125#define HAVE_KILL 1
126#define HAVE_OPENDIR 1
127#define HAVE_PIPE 1
128#define HAVE_POPEN 1
129#define HAVE_SYSTEM 1
130#define HAVE_WAIT 1
Guido van Rossumd371ff11999-01-25 16:12:23 +0000131#define HAVE_TTYNAME 1
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000132#endif /* _MSC_VER */
133#endif /* __BORLANDC__ */
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000134#endif /* ! __WATCOMC__ || __QNX__ */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000135#endif /* ! __IBMC__ */
Guido van Rossumad0ee831995-03-01 10:34:45 +0000136
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000137#ifndef _MSC_VER
Guido van Rossum36bc6801995-06-14 22:54:23 +0000138
Guido van Rossumb6775db1994-08-01 11:34:53 +0000139#ifdef HAVE_UNISTD_H
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000140#include <unistd.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +0000141#endif
142
143#ifdef NeXT
144/* NeXT's <unistd.h> and <utime.h> aren't worth much */
145#undef HAVE_UNISTD_H
146#undef HAVE_UTIME_H
Guido van Rossumb9f866c1997-05-22 15:12:39 +0000147#define HAVE_WAITPID
Guido van Rossum36bc6801995-06-14 22:54:23 +0000148/* #undef HAVE_GETCWD */
Guido van Rossum54ecc3d1999-01-27 17:53:11 +0000149#define UNION_WAIT /* This should really be checked for by autoconf */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000150#endif
151
152#ifdef HAVE_UNISTD_H
Guido van Rossumad0ee831995-03-01 10:34:45 +0000153/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
154extern int rename();
155extern int pclose();
156extern int lstat();
157extern int symlink();
Guido van Rossum8c67e4e1999-04-07 15:49:41 +0000158extern int fsync();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000159#else /* !HAVE_UNISTD_H */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000160#if defined(PYCC_VACPP)
161extern int mkdir Py_PROTO((char *));
162#else
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000163#if ( defined(__WATCOMC__) || defined(_MSC_VER) ) && !defined(__QNX__)
Barry Warsaw53699e91996-12-10 23:23:01 +0000164extern int mkdir Py_PROTO((const char *));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000165#else
Barry Warsaw53699e91996-12-10 23:23:01 +0000166extern int mkdir Py_PROTO((const char *, mode_t));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000167#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000168#endif
169#if defined(__IBMC__) || defined(__IBMCPP__)
170extern int chdir Py_PROTO((char *));
171extern int rmdir Py_PROTO((char *));
172#else
Barry Warsaw53699e91996-12-10 23:23:01 +0000173extern int chdir Py_PROTO((const char *));
174extern int rmdir Py_PROTO((const char *));
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000175#endif
Barry Warsaw53699e91996-12-10 23:23:01 +0000176extern int chmod Py_PROTO((const char *, mode_t));
177extern int chown Py_PROTO((const char *, uid_t, gid_t));
178extern char *getcwd Py_PROTO((char *, int));
179extern char *strerror Py_PROTO((int));
180extern int link Py_PROTO((const char *, const char *));
181extern int rename Py_PROTO((const char *, const char *));
182extern int stat Py_PROTO((const char *, struct stat *));
183extern int unlink Py_PROTO((const char *));
184extern int pclose Py_PROTO((FILE *));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000185#ifdef HAVE_SYMLINK
Barry Warsaw53699e91996-12-10 23:23:01 +0000186extern int symlink Py_PROTO((const char *, const char *));
Guido van Rossuma38a5031995-02-17 15:11:36 +0000187#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000188#ifdef HAVE_LSTAT
Barry Warsaw53699e91996-12-10 23:23:01 +0000189extern int lstat Py_PROTO((const char *, struct stat *));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000190#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000191#endif /* !HAVE_UNISTD_H */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000192
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000193#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194
Guido van Rossumb6775db1994-08-01 11:34:53 +0000195#ifdef HAVE_UTIME_H
196#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000197#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000198
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000199#ifdef HAVE_SYS_UTIME_H
200#include <sys/utime.h>
201#define HAVE_UTIME_H /* pretend we do for the rest of this file */
202#endif /* HAVE_SYS_UTIME_H */
203
Guido van Rossumb6775db1994-08-01 11:34:53 +0000204#ifdef HAVE_SYS_TIMES_H
205#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000206#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000207
208#ifdef HAVE_SYS_PARAM_H
209#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000210#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000211
212#ifdef HAVE_SYS_UTSNAME_H
213#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000214#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000215
216#ifndef MAXPATHLEN
217#define MAXPATHLEN 1024
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000218#endif /* MAXPATHLEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000219
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000220#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000221#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000222#define NAMLEN(dirent) strlen((dirent)->d_name)
223#else
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000224#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000225#include <direct.h>
226#define NAMLEN(dirent) strlen((dirent)->d_name)
227#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000228#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000229#define NAMLEN(dirent) (dirent)->d_namlen
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000230#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000231#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000232#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000233#endif
234#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000235#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000236#endif
237#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000238#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000239#endif
240#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000241
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000242#ifdef _MSC_VER
Guido van Rossumb6775db1994-08-01 11:34:53 +0000243#include <direct.h>
244#include <io.h>
245#include <process.h>
246#include <windows.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000247#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000248#define popen _popen
Guido van Rossum794d8131994-08-23 13:48:48 +0000249#define pclose _pclose
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000250#else /* 16-bit Windows */
251#include <dos.h>
252#include <ctype.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000253#endif /* MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000254#endif /* _MSC_VER */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000255
Guido van Rossumd48f2521997-12-05 22:19:34 +0000256#if defined(PYCC_VACPP) && defined(PYOS_OS2)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000257#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000258#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259
Guido van Rossum54ecc3d1999-01-27 17:53:11 +0000260#ifdef UNION_WAIT
261/* Emulate some macros on systems that have a union instead of macros */
262
263#ifndef WIFEXITED
264#define WIFEXITED(u_wait) (!(u_wait).w_termsig && !(u_wait).w_coredump)
265#endif
266
267#ifndef WEXITSTATUS
268#define WEXITSTATUS(u_wait) (WIFEXITED(u_wait)?((u_wait).w_retcode):-1)
269#endif
270
271#ifndef WTERMSIG
272#define WTERMSIG(u_wait) ((u_wait).w_termsig)
273#endif
274
275#endif /* UNION_WAIT */
276
Greg Wardb48bc172000-03-01 21:51:56 +0000277/* Don't use the "_r" form if we don't need it (also, won't have a
278 prototype for it, at least on Solaris -- maybe others as well?). */
279#if defined(HAVE_CTERMID_R) && defined(WITH_THREAD)
280#define USE_CTERMID_R
281#endif
282
283#if defined(HAVE_TMPNAM_R) && defined(WITH_THREAD)
284#define USE_TMPNAM_R
285#endif
286
Fred Drake699f3522000-06-29 21:12:41 +0000287/* choose the appropriate stat and fstat functions and return structs */
Guido van Rossum64529cd2000-06-30 22:45:12 +0000288#undef STAT
Fred Drake699f3522000-06-29 21:12:41 +0000289#ifdef MS_WIN64
290# define STAT _stati64
291# define FSTAT _fstati64
292# define STRUCT_STAT struct _stati64
293#else
294# define STAT stat
295# define FSTAT fstat
296# define STRUCT_STAT struct stat
297#endif
298
299
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300/* Return a dictionary corresponding to the POSIX environment table */
301
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000302#if !defined(_MSC_VER) && ( !defined(__WATCOMC__) || defined(__QNX__) )
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000304#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305
Barry Warsaw53699e91996-12-10 23:23:01 +0000306static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307convertenviron()
308{
Barry Warsaw53699e91996-12-10 23:23:01 +0000309 PyObject *d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310 char **e;
Barry Warsaw53699e91996-12-10 23:23:01 +0000311 d = PyDict_New();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312 if (d == NULL)
313 return NULL;
314 if (environ == NULL)
315 return d;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000316 /* This part ignores errors */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317 for (e = environ; *e != NULL; e++) {
Guido van Rossum6a619f41999-08-03 19:41:10 +0000318 PyObject *k;
Barry Warsaw53699e91996-12-10 23:23:01 +0000319 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320 char *p = strchr(*e, '=');
321 if (p == NULL)
322 continue;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000323 k = PyString_FromStringAndSize(*e, (int)(p-*e));
324 if (k == NULL) {
325 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000326 continue;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000327 }
328 v = PyString_FromString(p+1);
329 if (v == NULL) {
330 PyErr_Clear();
331 Py_DECREF(k);
332 continue;
333 }
334 if (PyDict_GetItem(d, k) == NULL) {
335 if (PyDict_SetItem(d, k, v) != 0)
336 PyErr_Clear();
337 }
338 Py_DECREF(k);
Barry Warsaw53699e91996-12-10 23:23:01 +0000339 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340 }
Guido van Rossumd48f2521997-12-05 22:19:34 +0000341#if defined(PYOS_OS2)
342 {
343 APIRET rc;
344 char buffer[1024]; /* OS/2 Provides a Documented Max of 1024 Chars */
345
346 rc = DosQueryExtLIBPATH(buffer, BEGIN_LIBPATH);
347 if (rc == NO_ERROR) { /* (not a type, envname is NOT 'BEGIN_LIBPATH') */
348 PyObject *v = PyString_FromString(buffer);
349 PyDict_SetItemString(d, "BEGINLIBPATH", v);
350 Py_DECREF(v);
351 }
352 rc = DosQueryExtLIBPATH(buffer, END_LIBPATH);
353 if (rc == NO_ERROR) { /* (not a typo, envname is NOT 'END_LIBPATH') */
354 PyObject *v = PyString_FromString(buffer);
355 PyDict_SetItemString(d, "ENDLIBPATH", v);
356 Py_DECREF(v);
357 }
358 }
359#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360 return d;
361}
362
363
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364/* Set a POSIX-specific error from errno, and return NULL */
365
Barry Warsawd58d7641998-07-23 16:14:40 +0000366static PyObject *
367posix_error()
Guido van Rossumad0ee831995-03-01 10:34:45 +0000368{
Barry Warsawca74da41999-02-09 19:31:45 +0000369 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000370}
Barry Warsawd58d7641998-07-23 16:14:40 +0000371static PyObject *
372posix_error_with_filename(name)
373 char* name;
374{
Barry Warsawca74da41999-02-09 19:31:45 +0000375 return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);
Barry Warsawd58d7641998-07-23 16:14:40 +0000376}
377
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000378
Guido van Rossumd48f2521997-12-05 22:19:34 +0000379#if defined(PYOS_OS2)
380/**********************************************************************
381 * Helper Function to Trim and Format OS/2 Messages
382 **********************************************************************/
383 static void
384os2_formatmsg(char *msgbuf, int msglen, char *reason)
385{
386 msgbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
387
388 if (strlen(msgbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
389 char *lastc = &msgbuf[ strlen(msgbuf)-1 ];
390
391 while (lastc > msgbuf && isspace(*lastc))
392 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
393 }
394
395 /* Add Optional Reason Text */
396 if (reason) {
397 strcat(msgbuf, " : ");
398 strcat(msgbuf, reason);
399 }
400}
401
402/**********************************************************************
403 * Decode an OS/2 Operating System Error Code
404 *
405 * A convenience function to lookup an OS/2 error code and return a
406 * text message we can use to raise a Python exception.
407 *
408 * Notes:
409 * The messages for errors returned from the OS/2 kernel reside in
410 * the file OSO001.MSG in the \OS2 directory hierarchy.
411 *
412 **********************************************************************/
413 static char *
414os2_strerror(char *msgbuf, int msgbuflen, int errorcode, char *reason)
415{
416 APIRET rc;
417 ULONG msglen;
418
419 /* Retrieve Kernel-Related Error Message from OSO001.MSG File */
420 Py_BEGIN_ALLOW_THREADS
421 rc = DosGetMessage(NULL, 0, msgbuf, msgbuflen,
422 errorcode, "oso001.msg", &msglen);
423 Py_END_ALLOW_THREADS
424
425 if (rc == NO_ERROR)
426 os2_formatmsg(msgbuf, msglen, reason);
427 else
428 sprintf(msgbuf, "unknown OS error #%d", errorcode);
429
430 return msgbuf;
431}
432
433/* Set an OS/2-specific error and return NULL. OS/2 kernel
434 errors are not in a global variable e.g. 'errno' nor are
435 they congruent with posix error numbers. */
436
437static PyObject * os2_error(int code)
438{
439 char text[1024];
440 PyObject *v;
441
442 os2_strerror(text, sizeof(text), code, "");
443
444 v = Py_BuildValue("(is)", code, text);
445 if (v != NULL) {
Barry Warsawca74da41999-02-09 19:31:45 +0000446 PyErr_SetObject(PyExc_OSError, v);
Guido van Rossumd48f2521997-12-05 22:19:34 +0000447 Py_DECREF(v);
448 }
449 return NULL; /* Signal to Python that an Exception is Pending */
450}
451
452#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453
454/* POSIX generic methods */
455
Barry Warsaw53699e91996-12-10 23:23:01 +0000456static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000457posix_int(args, format, func)
Guido van Rossum21142a01999-01-08 21:05:37 +0000458 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000459 char *format;
Guido van Rossum21142a01999-01-08 21:05:37 +0000460 int (*func) Py_FPROTO((int));
461{
462 int fd;
463 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000464 if (!PyArg_ParseTuple(args, format, &fd))
Guido van Rossum21142a01999-01-08 21:05:37 +0000465 return NULL;
466 Py_BEGIN_ALLOW_THREADS
467 res = (*func)(fd);
468 Py_END_ALLOW_THREADS
469 if (res < 0)
470 return posix_error();
471 Py_INCREF(Py_None);
472 return Py_None;
473}
474
475
476static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000477posix_1str(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000478 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000479 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000480 int (*func) Py_FPROTO((const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000481{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000482 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000483 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000484 if (!PyArg_ParseTuple(args, format, &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000485 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000486 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000487 res = (*func)(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000488 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000489 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000490 return posix_error_with_filename(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000491 Py_INCREF(Py_None);
492 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000493}
494
Barry Warsaw53699e91996-12-10 23:23:01 +0000495static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000496posix_2str(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000497 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000498 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000499 int (*func) Py_FPROTO((const char *, const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000500{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000501 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000502 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000503 if (!PyArg_ParseTuple(args, format, &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000504 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000505 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000506 res = (*func)(path1, path2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000507 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000508 if (res != 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000509 /* XXX how to report both path1 and path2??? */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000510 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000511 Py_INCREF(Py_None);
512 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000513}
514
Barry Warsaw53699e91996-12-10 23:23:01 +0000515static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000516posix_strint(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000517 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000518 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000519 int (*func) Py_FPROTO((const char *, int));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000520{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000521 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000522 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000523 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000524 if (!PyArg_ParseTuple(args, format, &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000525 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000526 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000527 res = (*func)(path, i);
Barry Warsaw53699e91996-12-10 23:23:01 +0000528 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000529 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000530 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +0000531 Py_INCREF(Py_None);
532 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000533}
534
Barry Warsaw53699e91996-12-10 23:23:01 +0000535static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000536posix_strintint(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000537 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000538 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000539 int (*func) Py_FPROTO((const char *, int, int));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000540{
541 char *path;
542 int i,i2;
543 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000544 if (!PyArg_ParseTuple(args, format, &path, &i, &i2))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000545 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000546 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000547 res = (*func)(path, i, i2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000548 Py_END_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000549 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000550 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +0000551 Py_INCREF(Py_None);
552 return Py_None;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000553}
554
Fred Drake699f3522000-06-29 21:12:41 +0000555
556
557/* pack a system stat C structure into the Python stat tuple
558 (used by posix_stat() and posix_fstat()) */
559static PyObject*
560_pystat_fromstructstat(st)
561 STRUCT_STAT st;
562{
563 PyObject *v = PyTuple_New(10);
564 if (v == NULL)
565 return NULL;
566
567 PyTuple_SetItem(v, 0, PyInt_FromLong((long)st.st_mode));
568#ifdef HAVE_LARGEFILE_SUPPORT
569 PyTuple_SetItem(v, 1, PyLong_FromLongLong((LONG_LONG)st.st_ino));
570#else
571 PyTuple_SetItem(v, 1, PyInt_FromLong((long)st.st_ino));
572#endif
573#if defined(HAVE_LONG_LONG) && !defined(MS_WINDOWS)
574 PyTuple_SetItem(v, 2, PyLong_FromLongLong((LONG_LONG)st.st_dev));
575#else
576 PyTuple_SetItem(v, 2, PyInt_FromLong((long)st.st_dev));
577#endif
578 PyTuple_SetItem(v, 3, PyInt_FromLong((long)st.st_nlink));
579 PyTuple_SetItem(v, 4, PyInt_FromLong((long)st.st_uid));
580 PyTuple_SetItem(v, 5, PyInt_FromLong((long)st.st_gid));
581#ifdef HAVE_LARGEFILE_SUPPORT
582 PyTuple_SetItem(v, 6, PyLong_FromLongLong((LONG_LONG)st.st_size));
583#else
584 PyTuple_SetItem(v, 6, PyInt_FromLong(st.st_size));
585#endif
586#if SIZEOF_TIME_T > SIZEOF_LONG
587 PyTuple_SetItem(v, 7, PyLong_FromLongLong((LONG_LONG)st.st_atime));
588 PyTuple_SetItem(v, 8, PyLong_FromLongLong((LONG_LONG)st.st_mtime));
589 PyTuple_SetItem(v, 9, PyLong_FromLongLong((LONG_LONG)st.st_ctime));
590#else
591 PyTuple_SetItem(v, 7, PyInt_FromLong((long)st.st_atime));
592 PyTuple_SetItem(v, 8, PyInt_FromLong((long)st.st_mtime));
593 PyTuple_SetItem(v, 9, PyInt_FromLong((long)st.st_ctime));
594#endif
595
596 if (PyErr_Occurred()) {
597 Py_DECREF(v);
598 return NULL;
599 }
600
601 return v;
602}
603
604
Barry Warsaw53699e91996-12-10 23:23:01 +0000605static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000606posix_do_stat(self, args, format, statfunc)
Barry Warsaw53699e91996-12-10 23:23:01 +0000607 PyObject *self;
608 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000609 char *format;
Fred Drake699f3522000-06-29 21:12:41 +0000610 int (*statfunc) Py_FPROTO((const char *, STRUCT_STAT *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000611{
Fred Drake699f3522000-06-29 21:12:41 +0000612 STRUCT_STAT st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000613 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000614 int res;
Guido van Rossumace88ae2000-04-21 18:54:45 +0000615
616#ifdef MS_WIN32
617 int pathlen;
618 char pathcopy[MAX_PATH];
619#endif /* MS_WIN32 */
620
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000621 if (!PyArg_ParseTuple(args, format, &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000622 return NULL;
Guido van Rossumace88ae2000-04-21 18:54:45 +0000623
624#ifdef MS_WIN32
625 pathlen = strlen(path);
626 /* the library call can blow up if the file name is too long! */
627 if (pathlen > MAX_PATH) {
628 errno = ENAMETOOLONG;
629 return posix_error();
630 }
631
632 if ((pathlen > 0) && (path[pathlen-1] == '\\' || path[pathlen-1] == '/')) {
Guido van Rossum19dde102000-05-03 02:44:55 +0000633 /* exception for specific or current drive root */
634 if (!((pathlen == 1) ||
635 ((pathlen == 3) &&
Guido van Rossumace88ae2000-04-21 18:54:45 +0000636 (path[1] == ':') &&
Guido van Rossum19dde102000-05-03 02:44:55 +0000637 (path[2] == '\\' || path[2] == '/'))))
Guido van Rossumace88ae2000-04-21 18:54:45 +0000638 {
639 strncpy(pathcopy, path, pathlen);
640 pathcopy[pathlen-1] = '\0'; /* nuke the trailing backslash */
641 path = pathcopy;
642 }
643 }
644#endif /* MS_WIN32 */
645
Barry Warsaw53699e91996-12-10 23:23:01 +0000646 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000647 res = (*statfunc)(path, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +0000648 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000649 if (res != 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000650 return posix_error_with_filename(path);
Fred Drake699f3522000-06-29 21:12:41 +0000651
652 return _pystat_fromstructstat(st);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000653}
654
655
656/* POSIX methods */
657
Guido van Rossum94f6f721999-01-06 18:42:14 +0000658static char posix_access__doc__[] =
Guido van Rossum015f22a1999-01-06 22:52:38 +0000659"access(path, mode) -> 1 if granted, 0 otherwise\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +0000660Test for access to a file.";
661
662static PyObject *
663posix_access(self, args)
664 PyObject *self;
665 PyObject *args;
666{
Guido van Rossum015f22a1999-01-06 22:52:38 +0000667 char *path;
668 int mode;
669 int res;
670
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000671 if (!PyArg_ParseTuple(args, "si:access", &path, &mode))
Guido van Rossum015f22a1999-01-06 22:52:38 +0000672 return NULL;
673 Py_BEGIN_ALLOW_THREADS
674 res = access(path, mode);
675 Py_END_ALLOW_THREADS
676 return(PyInt_FromLong(res == 0 ? 1L : 0L));
Guido van Rossum94f6f721999-01-06 18:42:14 +0000677}
678
Guido van Rossumd371ff11999-01-25 16:12:23 +0000679#ifndef F_OK
680#define F_OK 0
681#endif
682#ifndef R_OK
683#define R_OK 4
684#endif
685#ifndef W_OK
686#define W_OK 2
687#endif
688#ifndef X_OK
689#define X_OK 1
690#endif
691
692#ifdef HAVE_TTYNAME
Guido van Rossum94f6f721999-01-06 18:42:14 +0000693static char posix_ttyname__doc__[] =
Guido van Rossum61eeb041999-02-22 15:29:15 +0000694"ttyname(fd) -> String\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +0000695Return the name of the terminal device connected to 'fd'.";
696
697static PyObject *
698posix_ttyname(self, args)
699 PyObject *self;
700 PyObject *args;
701{
Guido van Rossum94f6f721999-01-06 18:42:14 +0000702 int id;
703 char *ret;
704
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000705 if (!PyArg_ParseTuple(args, "i:ttyname", &id))
Guido van Rossum94f6f721999-01-06 18:42:14 +0000706 return NULL;
707
Guido van Rossum94f6f721999-01-06 18:42:14 +0000708 ret = ttyname(id);
709 if (ret == NULL)
710 return(posix_error());
711 return(PyString_FromString(ret));
712}
Guido van Rossumd371ff11999-01-25 16:12:23 +0000713#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +0000714
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000715#ifdef HAVE_CTERMID
716static char posix_ctermid__doc__[] =
717"ctermid() -> String\n\
718Return the name of the controlling terminal for this process.";
719
720static PyObject *
721posix_ctermid(self, args)
722 PyObject *self;
723 PyObject *args;
724{
725 char *ret;
726 char buffer[L_ctermid];
727
728 if (!PyArg_ParseTuple(args, ":ctermid"))
729 return NULL;
730
Greg Wardb48bc172000-03-01 21:51:56 +0000731#ifdef USE_CTERMID_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000732 ret = ctermid_r(buffer);
733#else
734 ret = ctermid(buffer);
735#endif
736 if (ret == NULL)
737 return(posix_error());
738 return(PyString_FromString(buffer));
739}
740#endif
741
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000742static char posix_chdir__doc__[] =
743"chdir(path) -> None\n\
744Change the current working directory to the specified path.";
745
Barry Warsaw53699e91996-12-10 23:23:01 +0000746static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000747posix_chdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000748 PyObject *self;
749 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000750{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000751 return posix_1str(args, "s:chdir", chdir);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000752}
753
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000754
755static char posix_chmod__doc__[] =
756"chmod(path, mode) -> None\n\
757Change the access permissions of a file.";
758
Barry Warsaw53699e91996-12-10 23:23:01 +0000759static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000760posix_chmod(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000761 PyObject *self;
762 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000763{
Guido van Rossumffd15f52000-03-31 00:47:28 +0000764 char *path;
765 int i;
766 int res;
Guido van Rossum49679b42000-03-31 00:48:21 +0000767 if (!PyArg_ParseTuple(args, "si", &path, &i))
Guido van Rossumffd15f52000-03-31 00:47:28 +0000768 return NULL;
769 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef40e772000-03-31 01:26:23 +0000770 res = chmod(path, i);
Guido van Rossumffd15f52000-03-31 00:47:28 +0000771 Py_END_ALLOW_THREADS
772 if (res < 0)
773 return posix_error_with_filename(path);
774 Py_INCREF(Py_None);
775 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000776}
777
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000778
Guido van Rossum21142a01999-01-08 21:05:37 +0000779#ifdef HAVE_FSYNC
780static char posix_fsync__doc__[] =
781"fsync(fildes) -> None\n\
782force write of file with filedescriptor to disk.";
783
784static PyObject *
785posix_fsync(self, args)
786 PyObject *self;
787 PyObject *args;
788{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000789 return posix_int(args, "i:fsync", fsync);
Guido van Rossum21142a01999-01-08 21:05:37 +0000790}
791#endif /* HAVE_FSYNC */
792
793#ifdef HAVE_FDATASYNC
794static char posix_fdatasync__doc__[] =
795"fdatasync(fildes) -> None\n\
796force write of file with filedescriptor to disk.\n\
797 does not force update of metadata.";
798
Guido van Rossum5d00b6d1999-01-08 21:28:05 +0000799extern int fdatasync(int); /* Prototype just in case */
800
Guido van Rossum21142a01999-01-08 21:05:37 +0000801static PyObject *
802posix_fdatasync(self, args)
803 PyObject *self;
804 PyObject *args;
805{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000806 return posix_int(args, "i:fdatasync", fdatasync);
Guido van Rossum21142a01999-01-08 21:05:37 +0000807}
808#endif /* HAVE_FDATASYNC */
809
810
Guido van Rossumb6775db1994-08-01 11:34:53 +0000811#ifdef HAVE_CHOWN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000812static char posix_chown__doc__[] =
813"chown(path, uid, gid) -> None\n\
814Change the owner and group id of path to the numeric uid and gid.";
815
Barry Warsaw53699e91996-12-10 23:23:01 +0000816static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000817posix_chown(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000818 PyObject *self;
819 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000820{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000821 return posix_strintint(args, "sii:chown", chown);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000822}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000823#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000824
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000825
Guido van Rossum36bc6801995-06-14 22:54:23 +0000826#ifdef HAVE_GETCWD
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000827static char posix_getcwd__doc__[] =
828"getcwd() -> path\n\
829Return a string representing the current working directory.";
830
Barry Warsaw53699e91996-12-10 23:23:01 +0000831static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000832posix_getcwd(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000833 PyObject *self;
834 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000835{
836 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000837 char *res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000838 if (!PyArg_ParseTuple(args, ":getcwd"))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000839 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000840 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000841 res = getcwd(buf, sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +0000842 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000843 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000844 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000845 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000846}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000847#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000848
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000849
Guido van Rossumb6775db1994-08-01 11:34:53 +0000850#ifdef HAVE_LINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000851static char posix_link__doc__[] =
852"link(src, dst) -> None\n\
853Create a hard link to a file.";
854
Barry Warsaw53699e91996-12-10 23:23:01 +0000855static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000856posix_link(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000857 PyObject *self;
858 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000859{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000860 return posix_2str(args, "ss:link", link);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000861}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000862#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000863
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000864
865static char posix_listdir__doc__[] =
866"listdir(path) -> list_of_strings\n\
867Return a list containing the names of the entries in the directory.\n\
868\n\
869 path: path of directory to list\n\
870\n\
871The list is in arbitrary order. It does not include the special\n\
872entries '.' and '..' even if they are present in the directory.";
873
Barry Warsaw53699e91996-12-10 23:23:01 +0000874static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000875posix_listdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000876 PyObject *self;
877 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000878{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000879 /* XXX Should redo this putting the (now four) versions of opendir
Guido van Rossum6d8841c1997-08-14 19:57:39 +0000880 in separate files instead of having them all here... */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000881#if defined(MS_WIN32) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000882
Guido van Rossumb6775db1994-08-01 11:34:53 +0000883 char *name;
884 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000885 PyObject *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000886 HANDLE hFindFile;
887 WIN32_FIND_DATA FileData;
888 char namebuf[MAX_PATH+5];
889
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000890 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000891 return NULL;
892 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000893 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000894 return NULL;
895 }
896 strcpy(namebuf, name);
897 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
898 namebuf[len++] = '/';
899 strcpy(namebuf + len, "*.*");
900
Barry Warsaw53699e91996-12-10 23:23:01 +0000901 if ((d = PyList_New(0)) == NULL)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000902 return NULL;
903
904 hFindFile = FindFirstFile(namebuf, &FileData);
905 if (hFindFile == INVALID_HANDLE_VALUE) {
906 errno = GetLastError();
Guido van Rossum617bc191998-08-06 03:23:32 +0000907 if (errno == ERROR_FILE_NOT_FOUND)
908 return PyList_New(0);
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000909 return posix_error_with_filename(name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000910 }
911 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000912 if (FileData.cFileName[0] == '.' &&
913 (FileData.cFileName[1] == '\0' ||
914 FileData.cFileName[1] == '.' &&
915 FileData.cFileName[2] == '\0'))
916 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000917 v = PyString_FromString(FileData.cFileName);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000918 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000919 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000920 d = NULL;
921 break;
922 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000923 if (PyList_Append(d, v) != 0) {
924 Py_DECREF(v);
925 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000926 d = NULL;
927 break;
928 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000929 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000930 } while (FindNextFile(hFindFile, &FileData) == TRUE);
931
932 if (FindClose(hFindFile) == FALSE) {
933 errno = GetLastError();
Andrew M. Kuchling54c8dc22000-06-06 20:52:17 +0000934 return posix_error_with_filename(name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000935 }
936
937 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000938
Guido van Rossum8d665e61996-06-26 18:22:49 +0000939#else /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000940#ifdef _MSC_VER /* 16-bit Windows */
941
942#ifndef MAX_PATH
943#define MAX_PATH 250
944#endif
945 char *name, *pt;
946 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000947 PyObject *d, *v;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000948 char namebuf[MAX_PATH+5];
949 struct _find_t ep;
950
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000951 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000952 return NULL;
953 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000954 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000955 return NULL;
956 }
957 strcpy(namebuf, name);
958 for (pt = namebuf; *pt; pt++)
959 if (*pt == '/')
960 *pt = '\\';
961 if (namebuf[len-1] != '\\')
962 namebuf[len++] = '\\';
963 strcpy(namebuf + len, "*.*");
964
Barry Warsaw53699e91996-12-10 23:23:01 +0000965 if ((d = PyList_New(0)) == NULL)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000966 return NULL;
967
968 if (_dos_findfirst(namebuf, _A_RDONLY |
Barry Warsaw43d68b81996-12-19 22:10:44 +0000969 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0)
970 {
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000971 errno = ENOENT;
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000972 return posix_error_with_filename(name);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000973 }
974 do {
975 if (ep.name[0] == '.' &&
976 (ep.name[1] == '\0' ||
977 ep.name[1] == '.' &&
978 ep.name[2] == '\0'))
979 continue;
980 strcpy(namebuf, ep.name);
981 for (pt = namebuf; *pt; pt++)
982 if (isupper(*pt))
983 *pt = tolower(*pt);
Barry Warsaw53699e91996-12-10 23:23:01 +0000984 v = PyString_FromString(namebuf);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000985 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000986 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000987 d = NULL;
988 break;
989 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000990 if (PyList_Append(d, v) != 0) {
991 Py_DECREF(v);
992 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000993 d = NULL;
994 break;
995 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000996 Py_DECREF(v);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000997 } while (_dos_findnext(&ep) == 0);
998
999 return d;
1000
1001#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001002#if defined(PYOS_OS2)
1003
1004#ifndef MAX_PATH
1005#define MAX_PATH CCHMAXPATH
1006#endif
1007 char *name, *pt;
1008 int len;
1009 PyObject *d, *v;
1010 char namebuf[MAX_PATH+5];
1011 HDIR hdir = 1;
1012 ULONG srchcnt = 1;
1013 FILEFINDBUF3 ep;
1014 APIRET rc;
1015
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001016 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001017 return NULL;
1018 if (len >= MAX_PATH) {
1019 PyErr_SetString(PyExc_ValueError, "path too long");
1020 return NULL;
1021 }
1022 strcpy(namebuf, name);
1023 for (pt = namebuf; *pt; pt++)
1024 if (*pt == '/')
1025 *pt = '\\';
1026 if (namebuf[len-1] != '\\')
1027 namebuf[len++] = '\\';
1028 strcpy(namebuf + len, "*.*");
1029
1030 if ((d = PyList_New(0)) == NULL)
1031 return NULL;
1032
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001033 rc = DosFindFirst(namebuf, /* Wildcard Pattern to Match */
1034 &hdir, /* Handle to Use While Search Directory */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001035 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001036 &ep, sizeof(ep), /* Structure to Receive Directory Entry */
1037 &srchcnt, /* Max and Actual Count of Entries Per Iteration */
1038 FIL_STANDARD); /* Format of Entry (EAs or Not) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001039
1040 if (rc != NO_ERROR) {
1041 errno = ENOENT;
Barry Warsawf63b8cc1999-05-27 23:13:21 +00001042 return posix_error_with_filename(name);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001043 }
1044
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001045 if (srchcnt > 0) { /* If Directory is NOT Totally Empty, */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001046 do {
1047 if (ep.achName[0] == '.'
1048 && (ep.achName[1] == '\0' || ep.achName[1] == '.' && ep.achName[2] == '\0'))
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001049 continue; /* Skip Over "." and ".." Names */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001050
1051 strcpy(namebuf, ep.achName);
1052
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001053 /* Leave Case of Name Alone -- In Native Form */
1054 /* (Removed Forced Lowercasing Code) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001055
1056 v = PyString_FromString(namebuf);
1057 if (v == NULL) {
1058 Py_DECREF(d);
1059 d = NULL;
1060 break;
1061 }
1062 if (PyList_Append(d, v) != 0) {
1063 Py_DECREF(v);
1064 Py_DECREF(d);
1065 d = NULL;
1066 break;
1067 }
1068 Py_DECREF(v);
1069 } while (DosFindNext(hdir, &ep, sizeof(ep), &srchcnt) == NO_ERROR && srchcnt > 0);
1070 }
1071
1072 return d;
1073#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001074
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001075 char *name;
Barry Warsaw53699e91996-12-10 23:23:01 +00001076 PyObject *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001077 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001078 struct dirent *ep;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001079 if (!PyArg_ParseTuple(args, "s:listdir", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001080 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001081 if ((dirp = opendir(name)) == NULL) {
Barry Warsawf63b8cc1999-05-27 23:13:21 +00001082 return posix_error_with_filename(name);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001083 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001084 if ((d = PyList_New(0)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001085 closedir(dirp);
1086 return NULL;
1087 }
1088 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +00001089 if (ep->d_name[0] == '.' &&
1090 (NAMLEN(ep) == 1 ||
Guido van Rossuma376cc51996-12-05 23:43:35 +00001091 (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
Guido van Rossum24f42ac1995-07-18 18:16:52 +00001092 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +00001093 v = PyString_FromStringAndSize(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001094 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001095 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001096 d = NULL;
1097 break;
1098 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001099 if (PyList_Append(d, v) != 0) {
1100 Py_DECREF(v);
1101 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001102 d = NULL;
1103 break;
1104 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001105 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001106 }
1107 closedir(dirp);
Guido van Rossum0ee42cd1991-04-08 21:01:03 +00001108
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001109 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001110
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001111#endif /* !PYOS_OS2 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001112#endif /* !_MSC_VER */
Guido van Rossum8d665e61996-06-26 18:22:49 +00001113#endif /* !MS_WIN32 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001114}
1115
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001116static char posix_mkdir__doc__[] =
1117"mkdir(path [, mode=0777]) -> None\n\
1118Create a directory.";
1119
Barry Warsaw53699e91996-12-10 23:23:01 +00001120static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001121posix_mkdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001122 PyObject *self;
1123 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001124{
Guido van Rossumb0824db1996-02-25 04:50:32 +00001125 int res;
1126 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001127 int mode = 0777;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001128 if (!PyArg_ParseTuple(args, "s|i:mkdir", &path, &mode))
Guido van Rossumb0824db1996-02-25 04:50:32 +00001129 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001130 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001131#if ( defined(__WATCOMC__) || defined(_MSC_VER) || defined(PYCC_VACPP) ) && !defined(__QNX__)
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001132 res = mkdir(path);
1133#else
Guido van Rossumb0824db1996-02-25 04:50:32 +00001134 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001135#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001136 Py_END_ALLOW_THREADS
Guido van Rossumb0824db1996-02-25 04:50:32 +00001137 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00001138 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00001139 Py_INCREF(Py_None);
1140 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001141}
1142
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001143
Guido van Rossumb6775db1994-08-01 11:34:53 +00001144#ifdef HAVE_NICE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001145static char posix_nice__doc__[] =
1146"nice(inc) -> new_priority\n\
1147Decrease the priority of process and return new priority.";
1148
Barry Warsaw53699e91996-12-10 23:23:01 +00001149static PyObject *
Guido van Rossum775f4da1993-01-09 17:18:52 +00001150posix_nice(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001151 PyObject *self;
1152 PyObject *args;
Guido van Rossum775f4da1993-01-09 17:18:52 +00001153{
1154 int increment, value;
1155
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001156 if (!PyArg_ParseTuple(args, "i:nice", &increment))
Guido van Rossum775f4da1993-01-09 17:18:52 +00001157 return NULL;
1158 value = nice(increment);
1159 if (value == -1)
1160 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001161 return PyInt_FromLong((long) value);
Guido van Rossum775f4da1993-01-09 17:18:52 +00001162}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001163#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001164
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001165
1166static char posix_rename__doc__[] =
1167"rename(old, new) -> None\n\
1168Rename a file or directory.";
1169
Barry Warsaw53699e91996-12-10 23:23:01 +00001170static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001171posix_rename(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001172 PyObject *self;
1173 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001174{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001175 return posix_2str(args, "ss:rename", rename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001176}
1177
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001178
1179static char posix_rmdir__doc__[] =
1180"rmdir(path) -> None\n\
1181Remove a directory.";
1182
Barry Warsaw53699e91996-12-10 23:23:01 +00001183static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001184posix_rmdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001185 PyObject *self;
1186 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001187{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001188 return posix_1str(args, "s:rmdir", rmdir);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001189}
1190
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001191
1192static char posix_stat__doc__[] =
1193"stat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
1194Perform a stat system call on the given path.";
1195
Barry Warsaw53699e91996-12-10 23:23:01 +00001196static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001197posix_stat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001198 PyObject *self;
1199 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001200{
Fred Drake699f3522000-06-29 21:12:41 +00001201 return posix_do_stat(self, args, "s:stat", STAT);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001202}
1203
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001204
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001205#ifdef HAVE_SYSTEM
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001206static char posix_system__doc__[] =
1207"system(command) -> exit_status\n\
1208Execute the command (a string) in a subshell.";
1209
Barry Warsaw53699e91996-12-10 23:23:01 +00001210static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001211posix_system(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001212 PyObject *self;
1213 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001214{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001215 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001216 long sts;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001217 if (!PyArg_ParseTuple(args, "s:system", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001218 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001219 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001220 sts = system(command);
Barry Warsaw53699e91996-12-10 23:23:01 +00001221 Py_END_ALLOW_THREADS
1222 return PyInt_FromLong(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001223}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001224#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001225
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001226
1227static char posix_umask__doc__[] =
1228"umask(new_mask) -> old_mask\n\
1229Set the current numeric umask and return the previous umask.";
1230
Barry Warsaw53699e91996-12-10 23:23:01 +00001231static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001232posix_umask(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001233 PyObject *self;
1234 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001235{
1236 int i;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001237 if (!PyArg_ParseTuple(args, "i:umask", &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001238 return NULL;
1239 i = umask(i);
1240 if (i < 0)
1241 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001242 return PyInt_FromLong((long)i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001243}
1244
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001245
1246static char posix_unlink__doc__[] =
1247"unlink(path) -> None\n\
1248Remove a file (same as remove(path)).";
1249
1250static char posix_remove__doc__[] =
1251"remove(path) -> None\n\
1252Remove a file (same as unlink(path)).";
1253
Barry Warsaw53699e91996-12-10 23:23:01 +00001254static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001255posix_unlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001256 PyObject *self;
1257 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001258{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001259 return posix_1str(args, "s:remove", unlink);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001260}
1261
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001262
Guido van Rossumb6775db1994-08-01 11:34:53 +00001263#ifdef HAVE_UNAME
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001264static char posix_uname__doc__[] =
1265"uname() -> (sysname, nodename, release, version, machine)\n\
1266Return a tuple identifying the current operating system.";
1267
Barry Warsaw53699e91996-12-10 23:23:01 +00001268static PyObject *
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001269posix_uname(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001270 PyObject *self;
1271 PyObject *args;
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001272{
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001273 struct utsname u;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001274 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001275 if (!PyArg_ParseTuple(args, ":uname"))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001276 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001277 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001278 res = uname(&u);
Barry Warsaw53699e91996-12-10 23:23:01 +00001279 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001280 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001281 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001282 return Py_BuildValue("(sssss)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00001283 u.sysname,
1284 u.nodename,
1285 u.release,
1286 u.version,
1287 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001288}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001289#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001290
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001291
1292static char posix_utime__doc__[] =
1293"utime(path, (atime, utime)) -> None\n\
Barry Warsaw3cef8562000-05-01 16:17:24 +00001294utime(path, None) -> None\n\
1295Set the access and modified time of the file to the given values. If the\n\
1296second form is used, set the access and modified times to the current time.";
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001297
Barry Warsaw53699e91996-12-10 23:23:01 +00001298static PyObject *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001299posix_utime(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001300 PyObject *self;
1301 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001302{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001303 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +00001304 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001305 int res;
Barry Warsaw3cef8562000-05-01 16:17:24 +00001306 PyObject* arg;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001307
Guido van Rossum6d8841c1997-08-14 19:57:39 +00001308/* XXX should define struct utimbuf instead, above */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001309#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001310 struct utimbuf buf;
1311#define ATIME buf.actime
1312#define MTIME buf.modtime
1313#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001314#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001315 time_t buf[2];
1316#define ATIME buf[0]
1317#define MTIME buf[1]
1318#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001319#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001320
Barry Warsaw3cef8562000-05-01 16:17:24 +00001321 if (!PyArg_ParseTuple(args, "sO:utime", &path, &arg))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001322 return NULL;
Barry Warsaw3cef8562000-05-01 16:17:24 +00001323 if (arg == Py_None) {
1324 /* optional time values not given */
1325 Py_BEGIN_ALLOW_THREADS
1326 res = utime(path, NULL);
1327 Py_END_ALLOW_THREADS
1328 }
1329 else if (!PyArg_Parse(arg, "(ll)", &atime, &mtime)) {
1330 PyErr_SetString(PyExc_TypeError,
1331 "Second argument must be a 2-tuple of numbers.");
1332 return NULL;
1333 }
1334 else {
1335 ATIME = atime;
1336 MTIME = mtime;
1337 Py_BEGIN_ALLOW_THREADS
1338 res = utime(path, UTIME_ARG);
1339 Py_END_ALLOW_THREADS
1340 }
Guido van Rossumff4949e1992-08-05 19:58:53 +00001341 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00001342 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00001343 Py_INCREF(Py_None);
1344 return Py_None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001345#undef UTIME_ARG
1346#undef ATIME
1347#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001348}
1349
Guido van Rossum85e3b011991-06-03 12:42:10 +00001350
Guido van Rossum3b066191991-06-04 19:40:25 +00001351/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001352
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001353static char posix__exit__doc__[] =
1354"_exit(status)\n\
1355Exit to the system with specified status, without normal exit processing.";
1356
Barry Warsaw53699e91996-12-10 23:23:01 +00001357static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001358posix__exit(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001359 PyObject *self;
1360 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001361{
1362 int sts;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001363 if (!PyArg_ParseTuple(args, "i:_exit", &sts))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001364 return NULL;
1365 _exit(sts);
Guido van Rossuma376cc51996-12-05 23:43:35 +00001366 return NULL; /* Make gcc -Wall happy */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001367}
1368
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001369
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001370#ifdef HAVE_EXECV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001371static char posix_execv__doc__[] =
1372"execv(path, args)\n\
1373Execute an executable path with arguments, replacing current process.\n\
1374\n\
1375 path: path of executable file\n\
1376 args: tuple or list of strings";
1377
Barry Warsaw53699e91996-12-10 23:23:01 +00001378static PyObject *
Guido van Rossum89b33251993-10-22 14:26:06 +00001379posix_execv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001380 PyObject *self;
1381 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001382{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001383 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00001384 PyObject *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001385 char **argvlist;
1386 int i, argc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001387 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossum85e3b011991-06-03 12:42:10 +00001388
Guido van Rossum89b33251993-10-22 14:26:06 +00001389 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +00001390 argv is a list or tuple of strings. */
1391
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001392 if (!PyArg_ParseTuple(args, "sO:execv", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001393 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001394 if (PyList_Check(argv)) {
1395 argc = PyList_Size(argv);
1396 getitem = PyList_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001397 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001398 else if (PyTuple_Check(argv)) {
1399 argc = PyTuple_Size(argv);
1400 getitem = PyTuple_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001401 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001402 else {
Guido van Rossum50422b42000-04-26 20:34:28 +00001403 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
1404 return NULL;
1405 }
1406
1407 if (argc == 0) {
1408 PyErr_SetString(PyExc_ValueError, "empty argument list");
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001409 return NULL;
1410 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00001411
Barry Warsaw53699e91996-12-10 23:23:01 +00001412 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001413 if (argvlist == NULL)
1414 return NULL;
1415 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001416 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
1417 PyMem_DEL(argvlist);
Guido van Rossum50422b42000-04-26 20:34:28 +00001418 PyErr_SetString(PyExc_TypeError,
1419 "all arguments must be strings");
1420 return NULL;
1421
Guido van Rossum85e3b011991-06-03 12:42:10 +00001422 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00001423 }
1424 argvlist[argc] = NULL;
1425
Guido van Rossumb6775db1994-08-01 11:34:53 +00001426#ifdef BAD_EXEC_PROTOTYPES
1427 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001428#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001429 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001430#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001431
Guido van Rossum85e3b011991-06-03 12:42:10 +00001432 /* If we get here it's definitely an error */
1433
Barry Warsaw53699e91996-12-10 23:23:01 +00001434 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001435 return posix_error();
1436}
1437
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001438
1439static char posix_execve__doc__[] =
1440"execve(path, args, env)\n\
1441Execute a path with arguments and environment, replacing current process.\n\
1442\n\
1443 path: path of executable file\n\
1444 args: tuple or list of arguments\n\
1445 env: dictonary of strings mapping to strings";
1446
Barry Warsaw53699e91996-12-10 23:23:01 +00001447static PyObject *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001448posix_execve(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001449 PyObject *self;
1450 PyObject *args;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001451{
1452 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00001453 PyObject *argv, *env;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001454 char **argvlist;
1455 char **envlist;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001456 PyObject *key, *val, *keys=NULL, *vals=NULL;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001457 int i, pos, argc, envc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001458 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001459
1460 /* execve has three arguments: (path, argv, env), where
1461 argv is a list or tuple of strings and env is a dictionary
1462 like posix.environ. */
1463
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001464 if (!PyArg_ParseTuple(args, "sOO:execve", &path, &argv, &env))
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001465 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001466 if (PyList_Check(argv)) {
1467 argc = PyList_Size(argv);
1468 getitem = PyList_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001469 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001470 else if (PyTuple_Check(argv)) {
1471 argc = PyTuple_Size(argv);
1472 getitem = PyTuple_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001473 }
1474 else {
Barry Warsaw53699e91996-12-10 23:23:01 +00001475 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001476 return NULL;
1477 }
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001478 if (!PyMapping_Check(env)) {
1479 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001480 return NULL;
1481 }
1482
Guido van Rossum50422b42000-04-26 20:34:28 +00001483 if (argc == 0) {
1484 PyErr_SetString(PyExc_ValueError,
1485 "empty argument list");
1486 return NULL;
1487 }
1488
Barry Warsaw53699e91996-12-10 23:23:01 +00001489 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001490 if (argvlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001491 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001492 return NULL;
1493 }
1494 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001495 if (!PyArg_Parse((*getitem)(argv, i),
Barry Warsaw43d68b81996-12-19 22:10:44 +00001496 "s;argv must be list of strings",
1497 &argvlist[i]))
1498 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001499 goto fail_1;
1500 }
1501 }
1502 argvlist[argc] = NULL;
1503
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001504 i = PyMapping_Length(env);
Barry Warsaw53699e91996-12-10 23:23:01 +00001505 envlist = PyMem_NEW(char *, i + 1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001506 if (envlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001507 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001508 goto fail_1;
1509 }
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001510 envc = 0;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001511 keys = PyMapping_Keys(env);
1512 vals = PyMapping_Values(env);
1513 if (!keys || !vals)
1514 goto fail_2;
1515
1516 for (pos = 0; pos < i; pos++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001517 char *p, *k, *v;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001518
1519 key = PyList_GetItem(keys, pos);
1520 val = PyList_GetItem(vals, pos);
1521 if (!key || !val)
1522 goto fail_2;
1523
Barry Warsaw53699e91996-12-10 23:23:01 +00001524 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
Barry Warsaw43d68b81996-12-19 22:10:44 +00001525 !PyArg_Parse(val, "s;non-string value in env", &v))
1526 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001527 goto fail_2;
1528 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00001529
1530#if defined(PYOS_OS2)
1531 /* Omit Pseudo-Env Vars that Would Confuse Programs if Passed On */
1532 if (stricmp(k, "BEGINLIBPATH") != 0 && stricmp(k, "ENDLIBPATH") != 0) {
1533#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001534 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001535 if (p == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001536 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001537 goto fail_2;
1538 }
1539 sprintf(p, "%s=%s", k, v);
1540 envlist[envc++] = p;
Guido van Rossumd48f2521997-12-05 22:19:34 +00001541#if defined(PYOS_OS2)
1542 }
1543#endif
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001544 }
1545 envlist[envc] = 0;
1546
Guido van Rossumb6775db1994-08-01 11:34:53 +00001547
1548#ifdef BAD_EXEC_PROTOTYPES
1549 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001550#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001551 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001552#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001553
1554 /* If we get here it's definitely an error */
1555
1556 (void) posix_error();
1557
1558 fail_2:
1559 while (--envc >= 0)
Barry Warsaw53699e91996-12-10 23:23:01 +00001560 PyMem_DEL(envlist[envc]);
1561 PyMem_DEL(envlist);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001562 fail_1:
Barry Warsaw53699e91996-12-10 23:23:01 +00001563 PyMem_DEL(argvlist);
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001564 Py_XDECREF(vals);
1565 Py_XDECREF(keys);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001566 return NULL;
1567}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001568#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001569
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001570
Guido van Rossuma1065681999-01-25 23:20:23 +00001571#ifdef HAVE_SPAWNV
1572static char posix_spawnv__doc__[] =
Fred Drakea6dff3e1999-02-01 22:24:40 +00001573"spawnv(mode, path, args)\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001574Execute an executable path with arguments, replacing current process.\n\
1575\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00001576 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001577 path: path of executable file\n\
1578 args: tuple or list of strings";
1579
1580static PyObject *
1581posix_spawnv(self, args)
1582 PyObject *self;
1583 PyObject *args;
1584{
1585 char *path;
1586 PyObject *argv;
1587 char **argvlist;
1588 int mode, i, argc;
Fred Drake699f3522000-06-29 21:12:41 +00001589 intptr_t spawnval;
Guido van Rossuma1065681999-01-25 23:20:23 +00001590 PyObject *(*getitem) Py_PROTO((PyObject *, int));
1591
1592 /* spawnv has three arguments: (mode, path, argv), where
1593 argv is a list or tuple of strings. */
1594
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001595 if (!PyArg_ParseTuple(args, "isO:spawnv", &mode, &path, &argv))
Guido van Rossuma1065681999-01-25 23:20:23 +00001596 return NULL;
1597 if (PyList_Check(argv)) {
1598 argc = PyList_Size(argv);
1599 getitem = PyList_GetItem;
1600 }
1601 else if (PyTuple_Check(argv)) {
1602 argc = PyTuple_Size(argv);
1603 getitem = PyTuple_GetItem;
1604 }
1605 else {
Fred Drake137507e2000-06-01 02:02:46 +00001606 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossuma1065681999-01-25 23:20:23 +00001607 return NULL;
1608 }
1609
1610 argvlist = PyMem_NEW(char *, argc+1);
1611 if (argvlist == NULL)
1612 return NULL;
1613 for (i = 0; i < argc; i++) {
1614 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
1615 PyMem_DEL(argvlist);
Fred Drake137507e2000-06-01 02:02:46 +00001616 PyErr_SetString(PyExc_TypeError,
1617 "all arguments must be strings");
1618 return NULL;
Guido van Rossuma1065681999-01-25 23:20:23 +00001619 }
1620 }
1621 argvlist[argc] = NULL;
1622
Guido van Rossum246bc171999-02-01 23:54:31 +00001623 if (mode == _OLD_P_OVERLAY)
1624 mode = _P_OVERLAY;
Fred Drake699f3522000-06-29 21:12:41 +00001625 spawnval = _spawnv(mode, path, argvlist);
Guido van Rossuma1065681999-01-25 23:20:23 +00001626
1627 PyMem_DEL(argvlist);
1628
Fred Drake699f3522000-06-29 21:12:41 +00001629 if (spawnval == -1)
Guido van Rossuma1065681999-01-25 23:20:23 +00001630 return posix_error();
1631 else
Fred Drake699f3522000-06-29 21:12:41 +00001632#if SIZEOF_LONG == SIZE_VOID_P
1633 return Py_BuildValue("l", spawnval);
1634#else
1635 return Py_BuildValue("L", spawnval);
1636#endif
Guido van Rossuma1065681999-01-25 23:20:23 +00001637}
1638
1639
1640static char posix_spawnve__doc__[] =
Fred Drakea6dff3e1999-02-01 22:24:40 +00001641"spawnve(mode, path, args, env)\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001642Execute a path with arguments and environment, replacing current process.\n\
1643\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00001644 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001645 path: path of executable file\n\
1646 args: tuple or list of arguments\n\
1647 env: dictonary of strings mapping to strings";
1648
1649static PyObject *
1650posix_spawnve(self, args)
1651 PyObject *self;
1652 PyObject *args;
1653{
1654 char *path;
1655 PyObject *argv, *env;
1656 char **argvlist;
1657 char **envlist;
1658 PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL;
1659 int mode, i, pos, argc, envc;
Fred Drake699f3522000-06-29 21:12:41 +00001660 intptr_t spawnval;
Guido van Rossuma1065681999-01-25 23:20:23 +00001661 PyObject *(*getitem) Py_PROTO((PyObject *, int));
1662
1663 /* spawnve has four arguments: (mode, path, argv, env), where
1664 argv is a list or tuple of strings and env is a dictionary
1665 like posix.environ. */
1666
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001667 if (!PyArg_ParseTuple(args, "isOO:spawnve", &mode, &path, &argv, &env))
Guido van Rossuma1065681999-01-25 23:20:23 +00001668 return NULL;
1669 if (PyList_Check(argv)) {
1670 argc = PyList_Size(argv);
1671 getitem = PyList_GetItem;
1672 }
1673 else if (PyTuple_Check(argv)) {
1674 argc = PyTuple_Size(argv);
1675 getitem = PyTuple_GetItem;
1676 }
1677 else {
1678 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
1679 return NULL;
1680 }
1681 if (!PyMapping_Check(env)) {
1682 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
1683 return NULL;
1684 }
1685
1686 argvlist = PyMem_NEW(char *, argc+1);
1687 if (argvlist == NULL) {
1688 PyErr_NoMemory();
1689 return NULL;
1690 }
1691 for (i = 0; i < argc; i++) {
1692 if (!PyArg_Parse((*getitem)(argv, i),
1693 "s;argv must be list of strings",
1694 &argvlist[i]))
1695 {
1696 goto fail_1;
1697 }
1698 }
1699 argvlist[argc] = NULL;
1700
1701 i = PyMapping_Length(env);
1702 envlist = PyMem_NEW(char *, i + 1);
1703 if (envlist == NULL) {
1704 PyErr_NoMemory();
1705 goto fail_1;
1706 }
1707 envc = 0;
1708 keys = PyMapping_Keys(env);
1709 vals = PyMapping_Values(env);
1710 if (!keys || !vals)
1711 goto fail_2;
1712
1713 for (pos = 0; pos < i; pos++) {
1714 char *p, *k, *v;
1715
1716 key = PyList_GetItem(keys, pos);
1717 val = PyList_GetItem(vals, pos);
1718 if (!key || !val)
1719 goto fail_2;
1720
1721 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
1722 !PyArg_Parse(val, "s;non-string value in env", &v))
1723 {
1724 goto fail_2;
1725 }
1726 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
1727 if (p == NULL) {
1728 PyErr_NoMemory();
1729 goto fail_2;
1730 }
1731 sprintf(p, "%s=%s", k, v);
1732 envlist[envc++] = p;
1733 }
1734 envlist[envc] = 0;
1735
Guido van Rossum246bc171999-02-01 23:54:31 +00001736 if (mode == _OLD_P_OVERLAY)
1737 mode = _P_OVERLAY;
Fred Drake699f3522000-06-29 21:12:41 +00001738 spawnval = _spawnve(mode, path, argvlist, envlist);
1739 if (spawnval == -1)
Guido van Rossuma1065681999-01-25 23:20:23 +00001740 (void) posix_error();
1741 else
Fred Drake699f3522000-06-29 21:12:41 +00001742#if SIZEOF_LONG == SIZE_VOID_P
1743 res = Py_BuildValue("l", spawnval);
1744#else
1745 res = Py_BuildValue("L", spawnval);
1746#endif
Guido van Rossuma1065681999-01-25 23:20:23 +00001747
1748 fail_2:
1749 while (--envc >= 0)
1750 PyMem_DEL(envlist[envc]);
1751 PyMem_DEL(envlist);
1752 fail_1:
1753 PyMem_DEL(argvlist);
1754 Py_XDECREF(vals);
1755 Py_XDECREF(keys);
1756 return res;
1757}
1758#endif /* HAVE_SPAWNV */
1759
1760
Guido van Rossumad0ee831995-03-01 10:34:45 +00001761#ifdef HAVE_FORK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001762static char posix_fork__doc__[] =
1763"fork() -> pid\n\
1764Fork a child process.\n\
1765\n\
1766Return 0 to child process and PID of child to parent process.";
1767
Barry Warsaw53699e91996-12-10 23:23:01 +00001768static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001769posix_fork(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001770 PyObject *self;
1771 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001772{
1773 int pid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001774 if (!PyArg_ParseTuple(args, ":fork"))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001775 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001776 pid = fork();
1777 if (pid == -1)
1778 return posix_error();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001779 PyOS_AfterFork();
Barry Warsaw53699e91996-12-10 23:23:01 +00001780 return PyInt_FromLong((long)pid);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001781}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001782#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001783
Fred Drake8cef4cf2000-06-28 16:40:38 +00001784#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY)
1785#ifdef HAVE_PTY_H
1786#include <pty.h>
1787#else
1788#ifdef HAVE_LIBUTIL_H
1789#include <libutil.h>
1790#else
1791/* BSDI does not supply a prototype for the 'openpty' and 'forkpty'
1792 functions, eventhough they are included in libutil. */
1793#include <termios.h>
1794extern int openpty(int *, int *, char *, struct termios *, struct winsize *);
1795extern int forkpty(int *, char *, struct termios *, struct winsize *);
1796#endif /* HAVE_LIBUTIL_H */
1797#endif /* HAVE_PTY_H */
1798#endif /* defined(HAVE_OPENPTY) or defined(HAVE_FORKPTY) */
1799
1800#ifdef HAVE_OPENPTY
1801static char posix_openpty__doc__[] =
1802"openpty() -> (master_fd, slave_fd)\n\
1803Open a pseudo-terminal, returning open fd's for both master and slave end.\n";
1804
1805static PyObject *
1806posix_openpty(self, args)
1807 PyObject *self;
1808 PyObject *args;
1809{
1810 int master_fd, slave_fd;
1811 if (!PyArg_ParseTuple(args, ":openpty"))
1812 return NULL;
1813 if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) != 0)
1814 return posix_error();
1815 return Py_BuildValue("(ii)", master_fd, slave_fd);
1816}
1817#endif
1818
1819#ifdef HAVE_FORKPTY
1820static char posix_forkpty__doc__[] =
1821"forkpty() -> (pid, master_fd)\n\
1822Fork a new process with a new pseudo-terminal as controlling tty.\n\n\
1823Like fork(), return 0 as pid to child process, and PID of child to parent.\n\
1824To both, return fd of newly opened pseudo-terminal.\n";
1825
1826static PyObject *
1827posix_forkpty(self, args)
1828 PyObject *self;
1829 PyObject *args;
1830{
1831 int master_fd, pid;
1832
1833 if (!PyArg_ParseTuple(args, ":forkpty"))
1834 return NULL;
1835 pid = forkpty(&master_fd, NULL, NULL, NULL);
1836 if (pid == -1)
1837 return posix_error();
1838 PyOS_AfterFork();
1839 return Py_BuildValue("(ii)", pid, master_fd);
1840}
1841#endif
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001842
Guido van Rossumad0ee831995-03-01 10:34:45 +00001843#ifdef HAVE_GETEGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001844static char posix_getegid__doc__[] =
1845"getegid() -> egid\n\
1846Return the current process's effective group id.";
1847
Barry Warsaw53699e91996-12-10 23:23:01 +00001848static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001849posix_getegid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001850 PyObject *self;
1851 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001852{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001853 if (!PyArg_ParseTuple(args, ":getegid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001854 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001855 return PyInt_FromLong((long)getegid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001856}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001857#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001858
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001859
Guido van Rossumad0ee831995-03-01 10:34:45 +00001860#ifdef HAVE_GETEUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001861static char posix_geteuid__doc__[] =
1862"geteuid() -> euid\n\
1863Return the current process's effective user id.";
1864
Barry Warsaw53699e91996-12-10 23:23:01 +00001865static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001866posix_geteuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001867 PyObject *self;
1868 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001869{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001870 if (!PyArg_ParseTuple(args, ":geteuid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001871 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001872 return PyInt_FromLong((long)geteuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001873}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001874#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001875
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001876
Guido van Rossumad0ee831995-03-01 10:34:45 +00001877#ifdef HAVE_GETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001878static char posix_getgid__doc__[] =
1879"getgid() -> gid\n\
1880Return the current process's group id.";
1881
Barry Warsaw53699e91996-12-10 23:23:01 +00001882static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001883posix_getgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001884 PyObject *self;
1885 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001886{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001887 if (!PyArg_ParseTuple(args, ":getgid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001888 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001889 return PyInt_FromLong((long)getgid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001890}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001891#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001892
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001893
1894static char posix_getpid__doc__[] =
1895"getpid() -> pid\n\
1896Return the current process id";
1897
Barry Warsaw53699e91996-12-10 23:23:01 +00001898static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001899posix_getpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001900 PyObject *self;
1901 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001902{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001903 if (!PyArg_ParseTuple(args, ":getpid"))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001904 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001905 return PyInt_FromLong((long)getpid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001906}
1907
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001908
Fred Drakec9680921999-12-13 16:37:25 +00001909#ifdef HAVE_GETGROUPS
1910static char posix_getgroups__doc__[] = "\
1911getgroups() -> list of group IDs\n\
1912Return list of supplemental group IDs for the process.";
1913
1914static PyObject *
1915posix_getgroups(self, args)
1916 PyObject *self;
1917 PyObject *args;
1918{
1919 PyObject *result = NULL;
1920
1921 if (PyArg_ParseTuple(args, ":getgroups")) {
1922#ifdef NGROUPS_MAX
1923#define MAX_GROUPS NGROUPS_MAX
1924#else
1925 /* defined to be 16 on Solaris7, so this should be a small number */
1926#define MAX_GROUPS 64
1927#endif
1928 gid_t grouplist[MAX_GROUPS];
1929 int n;
1930
1931 n = getgroups(MAX_GROUPS, grouplist);
1932 if (n < 0)
1933 posix_error();
1934 else {
1935 result = PyList_New(n);
1936 if (result != NULL) {
1937 PyObject *o;
1938 int i;
1939 for (i = 0; i < n; ++i) {
1940 o = PyInt_FromLong((long)grouplist[i]);
1941 if (o == NULL) {
1942 Py_DECREF(result);
1943 result = NULL;
1944 break;
1945 }
1946 PyList_SET_ITEM(result, i, o);
1947 }
1948 }
1949 }
1950 }
1951 return result;
1952}
1953#endif
1954
Guido van Rossumb6775db1994-08-01 11:34:53 +00001955#ifdef HAVE_GETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001956static char posix_getpgrp__doc__[] =
1957"getpgrp() -> pgrp\n\
1958Return the current process group id.";
1959
Barry Warsaw53699e91996-12-10 23:23:01 +00001960static PyObject *
Guido van Rossum04814471991-06-04 20:23:49 +00001961posix_getpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001962 PyObject *self;
1963 PyObject *args;
Guido van Rossum04814471991-06-04 20:23:49 +00001964{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001965 if (!PyArg_ParseTuple(args, ":getpgrp"))
Guido van Rossum04814471991-06-04 20:23:49 +00001966 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001967#ifdef GETPGRP_HAVE_ARG
Barry Warsaw53699e91996-12-10 23:23:01 +00001968 return PyInt_FromLong((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001969#else /* GETPGRP_HAVE_ARG */
Barry Warsaw53699e91996-12-10 23:23:01 +00001970 return PyInt_FromLong((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001971#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001972}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001973#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001974
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001975
Guido van Rossumb6775db1994-08-01 11:34:53 +00001976#ifdef HAVE_SETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001977static char posix_setpgrp__doc__[] =
1978"setpgrp() -> None\n\
1979Make this process a session leader.";
1980
Barry Warsaw53699e91996-12-10 23:23:01 +00001981static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001982posix_setpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001983 PyObject *self;
1984 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001985{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001986 if (!PyArg_ParseTuple(args, ":setpgrp"))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001987 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001988#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001989 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001990#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001991 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001992#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001993 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001994 Py_INCREF(Py_None);
1995 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001996}
1997
Guido van Rossumb6775db1994-08-01 11:34:53 +00001998#endif /* HAVE_SETPGRP */
1999
Guido van Rossumad0ee831995-03-01 10:34:45 +00002000#ifdef HAVE_GETPPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002001static char posix_getppid__doc__[] =
2002"getppid() -> ppid\n\
2003Return the parent's process id.";
2004
Barry Warsaw53699e91996-12-10 23:23:01 +00002005static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00002006posix_getppid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002007 PyObject *self;
2008 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00002009{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002010 if (!PyArg_ParseTuple(args, ":getppid"))
Guido van Rossum85e3b011991-06-03 12:42:10 +00002011 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002012 return PyInt_FromLong((long)getppid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00002013}
Guido van Rossumad0ee831995-03-01 10:34:45 +00002014#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00002015
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002016
Fred Drake12c6e2d1999-12-14 21:25:03 +00002017#ifdef HAVE_GETLOGIN
2018static char posix_getlogin__doc__[] = "\
2019getlogin() -> string\n\
2020Return the actual login name.";
2021
2022static PyObject *
2023posix_getlogin(self, args)
2024 PyObject *self;
2025 PyObject *args;
2026{
2027 PyObject *result = NULL;
2028
2029 if (PyArg_ParseTuple(args, ":getlogin")) {
2030 char *name = getlogin();
2031
2032 if (name == NULL)
2033 posix_error();
2034 else
2035 result = PyString_FromString(name);
2036 }
2037 return result;
2038}
2039#endif
2040
Guido van Rossumad0ee831995-03-01 10:34:45 +00002041#ifdef HAVE_GETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002042static char posix_getuid__doc__[] =
2043"getuid() -> uid\n\
2044Return the current process's user id.";
2045
Barry Warsaw53699e91996-12-10 23:23:01 +00002046static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00002047posix_getuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002048 PyObject *self;
2049 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00002050{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002051 if (!PyArg_ParseTuple(args, ":getuid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00002052 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002053 return PyInt_FromLong((long)getuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00002054}
Guido van Rossumad0ee831995-03-01 10:34:45 +00002055#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00002056
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002057
Guido van Rossumad0ee831995-03-01 10:34:45 +00002058#ifdef HAVE_KILL
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002059static char posix_kill__doc__[] =
2060"kill(pid, sig) -> None\n\
2061Kill a process with a signal.";
2062
Barry Warsaw53699e91996-12-10 23:23:01 +00002063static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00002064posix_kill(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002065 PyObject *self;
2066 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00002067{
2068 int pid, sig;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002069 if (!PyArg_ParseTuple(args, "ii:kill", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00002070 return NULL;
Guido van Rossumd48f2521997-12-05 22:19:34 +00002071#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002072 if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
2073 APIRET rc;
2074 if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002075 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002076
2077 } else if (sig == XCPT_SIGNAL_KILLPROC) {
2078 APIRET rc;
2079 if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002080 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002081
2082 } else
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002083 return NULL; /* Unrecognized Signal Requested */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002084#else
Guido van Rossum85e3b011991-06-03 12:42:10 +00002085 if (kill(pid, sig) == -1)
2086 return posix_error();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002087#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002088 Py_INCREF(Py_None);
2089 return Py_None;
Guido van Rossum85e3b011991-06-03 12:42:10 +00002090}
Guido van Rossumad0ee831995-03-01 10:34:45 +00002091#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00002092
Guido van Rossumc0125471996-06-28 18:55:32 +00002093#ifdef HAVE_PLOCK
2094
2095#ifdef HAVE_SYS_LOCK_H
2096#include <sys/lock.h>
2097#endif
2098
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002099static char posix_plock__doc__[] =
2100"plock(op) -> None\n\
2101Lock program segments into memory.";
2102
Barry Warsaw53699e91996-12-10 23:23:01 +00002103static PyObject *
Guido van Rossumc0125471996-06-28 18:55:32 +00002104posix_plock(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002105 PyObject *self;
2106 PyObject *args;
Guido van Rossumc0125471996-06-28 18:55:32 +00002107{
2108 int op;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002109 if (!PyArg_ParseTuple(args, "i:plock", &op))
Guido van Rossumc0125471996-06-28 18:55:32 +00002110 return NULL;
2111 if (plock(op) == -1)
2112 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002113 Py_INCREF(Py_None);
2114 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00002115}
2116#endif
2117
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002118
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002119#ifdef HAVE_POPEN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002120static char posix_popen__doc__[] =
2121"popen(command [, mode='r' [, bufsize]]) -> pipe\n\
2122Open a pipe to/from a command returning a file object.";
2123
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002124#if defined(PYOS_OS2)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002125static int
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002126async_system(const char *command)
2127{
2128 char *p, errormsg[256], args[1024];
2129 RESULTCODES rcodes;
2130 APIRET rc;
2131 char *shell = getenv("COMSPEC");
2132 if (!shell)
2133 shell = "cmd";
2134
2135 strcpy(args, shell);
2136 p = &args[ strlen(args)+1 ];
2137 strcpy(p, "/c ");
2138 strcat(p, command);
2139 p += strlen(p) + 1;
2140 *p = '\0';
2141
2142 rc = DosExecPgm(errormsg, sizeof(errormsg),
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002143 EXEC_ASYNC, /* Execute Async w/o Wait for Results */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002144 args,
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002145 NULL, /* Inherit Parent's Environment */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002146 &rcodes, shell);
2147 return rc;
2148}
2149
Guido van Rossumd48f2521997-12-05 22:19:34 +00002150static FILE *
2151popen(const char *command, const char *mode, int pipesize, int *err)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002152{
2153 HFILE rhan, whan;
2154 FILE *retfd = NULL;
2155 APIRET rc = DosCreatePipe(&rhan, &whan, pipesize);
2156
Guido van Rossumd48f2521997-12-05 22:19:34 +00002157 if (rc != NO_ERROR) {
2158 *err = rc;
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002159 return NULL; /* ERROR - Unable to Create Anon Pipe */
Guido van Rossumd48f2521997-12-05 22:19:34 +00002160 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002161
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002162 if (strchr(mode, 'r') != NULL) { /* Treat Command as a Data Source */
2163 int oldfd = dup(1); /* Save STDOUT Handle in Another Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002164
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002165 DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
2166 close(1); /* Make STDOUT Available for Reallocation */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002167
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002168 if (dup2(whan, 1) == 0) { /* Connect STDOUT to Pipe Write Side */
2169 DosClose(whan); /* Close Now-Unused Pipe Write Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002170
2171 if (async_system(command) == NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002172 retfd = fdopen(rhan, mode); /* And Return Pipe Read Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002173 }
2174
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002175 dup2(oldfd, 1); /* Reconnect STDOUT to Original Handle */
2176 DosExitCritSec(); /* Now Allow Other Threads to Run */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002177
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002178 close(oldfd); /* And Close Saved STDOUT Handle */
2179 return retfd; /* Return fd of Pipe or NULL if Error */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002180
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002181 } else if (strchr(mode, 'w')) { /* Treat Command as a Data Sink */
2182 int oldfd = dup(0); /* Save STDIN Handle in Another Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002183
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002184 DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
2185 close(0); /* Make STDIN Available for Reallocation */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002186
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002187 if (dup2(rhan, 0) == 0) { /* Connect STDIN to Pipe Read Side */
2188 DosClose(rhan); /* Close Now-Unused Pipe Read Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002189
2190 if (async_system(command) == NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002191 retfd = fdopen(whan, mode); /* And Return Pipe Write Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002192 }
2193
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002194 dup2(oldfd, 0); /* Reconnect STDIN to Original Handle */
2195 DosExitCritSec(); /* Now Allow Other Threads to Run */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002196
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002197 close(oldfd); /* And Close Saved STDIN Handle */
2198 return retfd; /* Return fd of Pipe or NULL if Error */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002199
Guido van Rossumd48f2521997-12-05 22:19:34 +00002200 } else {
2201 *err = ERROR_INVALID_ACCESS;
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002202 return NULL; /* ERROR - Invalid Mode (Neither Read nor Write) */
Guido van Rossumd48f2521997-12-05 22:19:34 +00002203 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002204}
2205
2206static PyObject *
2207posix_popen(self, args)
2208 PyObject *self;
2209 PyObject *args;
2210{
2211 char *name;
2212 char *mode = "r";
Guido van Rossumd48f2521997-12-05 22:19:34 +00002213 int err, bufsize = -1;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002214 FILE *fp;
2215 PyObject *f;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002216 if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002217 return NULL;
2218 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd48f2521997-12-05 22:19:34 +00002219 fp = popen(name, mode, (bufsize > 0) ? bufsize : 4096, &err);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002220 Py_END_ALLOW_THREADS
2221 if (fp == NULL)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002222 return os2_error(err);
2223
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002224 f = PyFile_FromFile(fp, name, mode, fclose);
2225 if (f != NULL)
2226 PyFile_SetBufSize(f, bufsize);
2227 return f;
2228}
2229
2230#else
Barry Warsaw53699e91996-12-10 23:23:01 +00002231static PyObject *
Guido van Rossum3b066191991-06-04 19:40:25 +00002232posix_popen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002233 PyObject *self;
2234 PyObject *args;
Guido van Rossum3b066191991-06-04 19:40:25 +00002235{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002236 char *name;
2237 char *mode = "r";
2238 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00002239 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002240 PyObject *f;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002241 if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00002242 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002243 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002244 fp = popen(name, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002245 Py_END_ALLOW_THREADS
Guido van Rossum3b066191991-06-04 19:40:25 +00002246 if (fp == NULL)
2247 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002248 f = PyFile_FromFile(fp, name, mode, pclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002249 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002250 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002251 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00002252}
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002253#endif
2254
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002255#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00002256
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002257
Guido van Rossumb6775db1994-08-01 11:34:53 +00002258#ifdef HAVE_SETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002259static char posix_setuid__doc__[] =
2260"setuid(uid) -> None\n\
2261Set the current process's user id.";
Barry Warsaw53699e91996-12-10 23:23:01 +00002262static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002263posix_setuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002264 PyObject *self;
2265 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002266{
2267 int uid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002268 if (!PyArg_ParseTuple(args, "i:setuid", &uid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002269 return NULL;
2270 if (setuid(uid) < 0)
2271 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002272 Py_INCREF(Py_None);
2273 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002274}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002275#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002276
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002277
Guido van Rossumb6775db1994-08-01 11:34:53 +00002278#ifdef HAVE_SETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002279static char posix_setgid__doc__[] =
2280"setgid(gid) -> None\n\
2281Set the current process's group id.";
2282
Barry Warsaw53699e91996-12-10 23:23:01 +00002283static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002284posix_setgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002285 PyObject *self;
2286 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002287{
2288 int gid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002289 if (!PyArg_ParseTuple(args, "i:setgid", &gid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002290 return NULL;
2291 if (setgid(gid) < 0)
2292 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002293 Py_INCREF(Py_None);
2294 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002295}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002296#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002297
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002298
Guido van Rossumb6775db1994-08-01 11:34:53 +00002299#ifdef HAVE_WAITPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002300static char posix_waitpid__doc__[] =
2301"waitpid(pid, options) -> (pid, status)\n\
2302Wait for completion of a give child process.";
2303
Barry Warsaw53699e91996-12-10 23:23:01 +00002304static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00002305posix_waitpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002306 PyObject *self;
2307 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00002308{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002309 int pid, options;
2310#ifdef UNION_WAIT
2311 union wait status;
2312#define status_i (status.w_status)
2313#else
2314 int status;
2315#define status_i status
2316#endif
2317 status_i = 0;
2318
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002319 if (!PyArg_ParseTuple(args, "ii:waitpid", &pid, &options))
Guido van Rossum21803b81992-08-09 12:55:27 +00002320 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002321 Py_BEGIN_ALLOW_THREADS
Guido van Rossume6a3aa61999-02-01 16:15:30 +00002322#ifdef NeXT
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002323 pid = wait4(pid, &status, options, NULL);
Guido van Rossume6a3aa61999-02-01 16:15:30 +00002324#else
2325 pid = waitpid(pid, &status, options);
2326#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002327 Py_END_ALLOW_THREADS
Guido van Rossum85e3b011991-06-03 12:42:10 +00002328 if (pid == -1)
2329 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00002330 else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002331 return Py_BuildValue("ii", pid, status_i);
Guido van Rossum21803b81992-08-09 12:55:27 +00002332}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002333#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00002334
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002335
Guido van Rossumad0ee831995-03-01 10:34:45 +00002336#ifdef HAVE_WAIT
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002337static char posix_wait__doc__[] =
2338"wait() -> (pid, status)\n\
2339Wait for completion of a child process.";
2340
Barry Warsaw53699e91996-12-10 23:23:01 +00002341static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00002342posix_wait(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002343 PyObject *self;
2344 PyObject *args;
Guido van Rossum21803b81992-08-09 12:55:27 +00002345{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002346 int pid;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002347#ifdef UNION_WAIT
2348 union wait status;
2349#define status_i (status.w_status)
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002350#else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002351 int status;
2352#define status_i status
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002353#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002354 if (!PyArg_ParseTuple(args, ":wait"))
2355 return NULL;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002356 status_i = 0;
2357 Py_BEGIN_ALLOW_THREADS
2358 pid = wait(&status);
Barry Warsaw53699e91996-12-10 23:23:01 +00002359 Py_END_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00002360 if (pid == -1)
2361 return posix_error();
2362 else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002363 return Py_BuildValue("ii", pid, status_i);
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002364#undef status_i
Guido van Rossum85e3b011991-06-03 12:42:10 +00002365}
Guido van Rossumad0ee831995-03-01 10:34:45 +00002366#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00002367
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002368
2369static char posix_lstat__doc__[] =
2370"lstat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
2371Like stat(path), but do not follow symbolic links.";
2372
Barry Warsaw53699e91996-12-10 23:23:01 +00002373static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002374posix_lstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002375 PyObject *self;
2376 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002377{
Guido van Rossumb6775db1994-08-01 11:34:53 +00002378#ifdef HAVE_LSTAT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002379 return posix_do_stat(self, args, "s:lstat", lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002380#else /* !HAVE_LSTAT */
Fred Drake699f3522000-06-29 21:12:41 +00002381 return posix_do_stat(self, args, "s:lstat", STAT);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002382#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002383}
2384
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002385
Guido van Rossumb6775db1994-08-01 11:34:53 +00002386#ifdef HAVE_READLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002387static char posix_readlink__doc__[] =
2388"readlink(path) -> path\n\
2389Return a string representing the path to which the symbolic link points.";
2390
Barry Warsaw53699e91996-12-10 23:23:01 +00002391static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002392posix_readlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002393 PyObject *self;
2394 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002395{
Guido van Rossumb6775db1994-08-01 11:34:53 +00002396 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002397 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002398 int n;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002399 if (!PyArg_ParseTuple(args, "s:readlink", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002400 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002401 Py_BEGIN_ALLOW_THREADS
Guido van Rossum50e61dc1992-03-27 17:22:31 +00002402 n = readlink(path, buf, (int) sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +00002403 Py_END_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002404 if (n < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00002405 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00002406 return PyString_FromStringAndSize(buf, n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002407}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002408#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002409
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002410
Guido van Rossumb6775db1994-08-01 11:34:53 +00002411#ifdef HAVE_SYMLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002412static char posix_symlink__doc__[] =
2413"symlink(src, dst) -> None\n\
2414Create a symbolic link.";
2415
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002416static PyObject *
2417posix_symlink(self, args)
2418 PyObject *self;
2419 PyObject *args;
2420{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002421 return posix_2str(args, "ss:symlink", symlink);
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002422}
2423#endif /* HAVE_SYMLINK */
2424
2425
2426#ifdef HAVE_TIMES
2427#ifndef HZ
2428#define HZ 60 /* Universal constant :-) */
2429#endif /* HZ */
2430
Guido van Rossumd48f2521997-12-05 22:19:34 +00002431#if defined(PYCC_VACPP) && defined(PYOS_OS2)
2432static long
2433system_uptime()
2434{
2435 ULONG value = 0;
2436
2437 Py_BEGIN_ALLOW_THREADS
2438 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &value, sizeof(value));
2439 Py_END_ALLOW_THREADS
2440
2441 return value;
2442}
2443
2444static PyObject *
2445posix_times(self, args)
2446 PyObject *self;
2447 PyObject *args;
2448{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002449 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossumd48f2521997-12-05 22:19:34 +00002450 return NULL;
2451
2452 /* Currently Only Uptime is Provided -- Others Later */
2453 return Py_BuildValue("ddddd",
2454 (double)0 /* t.tms_utime / HZ */,
2455 (double)0 /* t.tms_stime / HZ */,
2456 (double)0 /* t.tms_cutime / HZ */,
2457 (double)0 /* t.tms_cstime / HZ */,
2458 (double)system_uptime() / 1000);
2459}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002460#else /* not OS2 */
Barry Warsaw53699e91996-12-10 23:23:01 +00002461static PyObject *
Guido van Rossum22db57e1992-04-05 14:25:30 +00002462posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002463 PyObject *self;
2464 PyObject *args;
Guido van Rossum22db57e1992-04-05 14:25:30 +00002465{
2466 struct tms t;
2467 clock_t c;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002468 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossum22db57e1992-04-05 14:25:30 +00002469 return NULL;
2470 errno = 0;
2471 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00002472 if (c == (clock_t) -1)
2473 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002474 return Py_BuildValue("ddddd",
Barry Warsaw43d68b81996-12-19 22:10:44 +00002475 (double)t.tms_utime / HZ,
2476 (double)t.tms_stime / HZ,
2477 (double)t.tms_cutime / HZ,
2478 (double)t.tms_cstime / HZ,
2479 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00002480}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002481#endif /* not OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002482#endif /* HAVE_TIMES */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002483
2484
Guido van Rossum87755a21996-09-07 00:59:43 +00002485#ifdef MS_WIN32
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002486#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00002487static PyObject *
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002488posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002489 PyObject *self;
2490 PyObject *args;
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002491{
2492 FILETIME create, exit, kernel, user;
2493 HANDLE hProc;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002494 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002495 return NULL;
2496 hProc = GetCurrentProcess();
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00002497 GetProcessTimes(hProc, &create, &exit, &kernel, &user);
2498 /* The fields of a FILETIME structure are the hi and lo part
2499 of a 64-bit value expressed in 100 nanosecond units.
2500 1e7 is one second in such units; 1e-7 the inverse.
2501 429.4967296 is 2**32 / 1e7 or 2**32 * 1e-7.
2502 */
Barry Warsaw53699e91996-12-10 23:23:01 +00002503 return Py_BuildValue(
2504 "ddddd",
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00002505 (double)(kernel.dwHighDateTime*429.4967296 +
2506 kernel.dwLowDateTime*1e-7),
2507 (double)(user.dwHighDateTime*429.4967296 +
2508 user.dwLowDateTime*1e-7),
Barry Warsaw53699e91996-12-10 23:23:01 +00002509 (double)0,
2510 (double)0,
2511 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002512}
Guido van Rossum8d665e61996-06-26 18:22:49 +00002513#endif /* MS_WIN32 */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002514
2515#ifdef HAVE_TIMES
Roger E. Masse0318fd61997-06-05 22:07:58 +00002516static char posix_times__doc__[] =
2517"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\
2518Return a tuple of floating point numbers indicating process times.";
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002519#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002520
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002521
Guido van Rossumb6775db1994-08-01 11:34:53 +00002522#ifdef HAVE_SETSID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002523static char posix_setsid__doc__[] =
2524"setsid() -> None\n\
2525Call the system call setsid().";
2526
Barry Warsaw53699e91996-12-10 23:23:01 +00002527static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00002528posix_setsid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002529 PyObject *self;
2530 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002531{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002532 if (!PyArg_ParseTuple(args, ":setsid"))
Guido van Rossumc2670a01992-09-13 20:07:29 +00002533 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002534 if (setsid() < 0)
2535 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002536 Py_INCREF(Py_None);
2537 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002538}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002539#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00002540
Guido van Rossumb6775db1994-08-01 11:34:53 +00002541#ifdef HAVE_SETPGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002542static char posix_setpgid__doc__[] =
2543"setpgid(pid, pgrp) -> None\n\
2544Call the system call setpgid().";
2545
Barry Warsaw53699e91996-12-10 23:23:01 +00002546static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00002547posix_setpgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002548 PyObject *self;
2549 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002550{
2551 int pid, pgrp;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002552 if (!PyArg_ParseTuple(args, "ii:setpgid", &pid, &pgrp))
Guido van Rossumc2670a01992-09-13 20:07:29 +00002553 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002554 if (setpgid(pid, pgrp) < 0)
2555 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002556 Py_INCREF(Py_None);
2557 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002558}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002559#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00002560
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002561
Guido van Rossumb6775db1994-08-01 11:34:53 +00002562#ifdef HAVE_TCGETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002563static char posix_tcgetpgrp__doc__[] =
2564"tcgetpgrp(fd) -> pgid\n\
2565Return the process group associated with the terminal given by a fd.";
2566
Barry Warsaw53699e91996-12-10 23:23:01 +00002567static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00002568posix_tcgetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002569 PyObject *self;
2570 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002571{
2572 int fd, pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002573 if (!PyArg_ParseTuple(args, "i:tcgetpgrp", &fd))
Guido van Rossum7066dd71992-09-17 17:54:56 +00002574 return NULL;
2575 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002576 if (pgid < 0)
2577 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002578 return PyInt_FromLong((long)pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00002579}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002580#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00002581
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002582
Guido van Rossumb6775db1994-08-01 11:34:53 +00002583#ifdef HAVE_TCSETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002584static char posix_tcsetpgrp__doc__[] =
2585"tcsetpgrp(fd, pgid) -> None\n\
2586Set the process group associated with the terminal given by a fd.";
2587
Barry Warsaw53699e91996-12-10 23:23:01 +00002588static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00002589posix_tcsetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002590 PyObject *self;
2591 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002592{
2593 int fd, pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002594 if (!PyArg_ParseTuple(args, "ii:tcsetpgrp", &fd, &pgid))
Guido van Rossum7066dd71992-09-17 17:54:56 +00002595 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002596 if (tcsetpgrp(fd, pgid) < 0)
2597 return posix_error();
Barry Warsaw43d68b81996-12-19 22:10:44 +00002598 Py_INCREF(Py_None);
Barry Warsaw53699e91996-12-10 23:23:01 +00002599 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002600}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002601#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00002602
Guido van Rossum687dd131993-05-17 08:34:16 +00002603/* Functions acting on file descriptors */
2604
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002605static char posix_open__doc__[] =
2606"open(filename, flag [, mode=0777]) -> fd\n\
2607Open a file (for low level IO).";
2608
Barry Warsaw53699e91996-12-10 23:23:01 +00002609static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002610posix_open(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002611 PyObject *self;
2612 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002613{
2614 char *file;
2615 int flag;
2616 int mode = 0777;
2617 int fd;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002618 if (!PyArg_ParseTuple(args, "si|i", &file, &flag, &mode))
2619 return NULL;
2620
Barry Warsaw53699e91996-12-10 23:23:01 +00002621 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002622 fd = open(file, flag, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002623 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002624 if (fd < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00002625 return posix_error_with_filename(file);
Barry Warsaw53699e91996-12-10 23:23:01 +00002626 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002627}
2628
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002629
2630static char posix_close__doc__[] =
2631"close(fd) -> None\n\
2632Close a file descriptor (for low level IO).";
2633
Barry Warsaw53699e91996-12-10 23:23:01 +00002634static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002635posix_close(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002636 PyObject *self;
2637 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002638{
2639 int fd, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002640 if (!PyArg_ParseTuple(args, "i:close", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002641 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002642 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002643 res = close(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00002644 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002645 if (res < 0)
2646 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002647 Py_INCREF(Py_None);
2648 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00002649}
2650
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002651
2652static char posix_dup__doc__[] =
2653"dup(fd) -> fd2\n\
2654Return a duplicate of a file descriptor.";
2655
Barry Warsaw53699e91996-12-10 23:23:01 +00002656static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002657posix_dup(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002658 PyObject *self;
2659 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002660{
2661 int fd;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002662 if (!PyArg_ParseTuple(args, "i:dup", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002663 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002664 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002665 fd = dup(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00002666 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002667 if (fd < 0)
2668 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002669 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002670}
2671
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002672
2673static char posix_dup2__doc__[] =
2674"dup2(fd, fd2) -> None\n\
2675Duplicate file descriptor.";
2676
Barry Warsaw53699e91996-12-10 23:23:01 +00002677static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002678posix_dup2(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002679 PyObject *self;
2680 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002681{
2682 int fd, fd2, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002683 if (!PyArg_ParseTuple(args, "ii:dup2", &fd, &fd2))
Guido van Rossum687dd131993-05-17 08:34:16 +00002684 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002685 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002686 res = dup2(fd, fd2);
Barry Warsaw53699e91996-12-10 23:23:01 +00002687 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002688 if (res < 0)
2689 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002690 Py_INCREF(Py_None);
2691 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00002692}
2693
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002694
2695static char posix_lseek__doc__[] =
2696"lseek(fd, pos, how) -> newpos\n\
2697Set the current position of a file descriptor.";
2698
Barry Warsaw53699e91996-12-10 23:23:01 +00002699static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002700posix_lseek(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002701 PyObject *self;
2702 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002703{
2704 int fd, how;
Fred Drake699f3522000-06-29 21:12:41 +00002705#ifdef MS_WIN64
2706 LONG_LONG pos, res;
2707#else
Guido van Rossum94f6f721999-01-06 18:42:14 +00002708 off_t pos, res;
Fred Drake699f3522000-06-29 21:12:41 +00002709#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00002710 PyObject *posobj;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002711 if (!PyArg_ParseTuple(args, "iOi:lseek", &fd, &posobj, &how))
Guido van Rossum687dd131993-05-17 08:34:16 +00002712 return NULL;
2713#ifdef SEEK_SET
2714 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
2715 switch (how) {
2716 case 0: how = SEEK_SET; break;
2717 case 1: how = SEEK_CUR; break;
2718 case 2: how = SEEK_END; break;
2719 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002720#endif /* SEEK_END */
Guido van Rossum94f6f721999-01-06 18:42:14 +00002721
2722#if !defined(HAVE_LARGEFILE_SUPPORT)
2723 pos = PyInt_AsLong(posobj);
2724#else
2725 pos = PyLong_Check(posobj) ?
2726 PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj);
2727#endif
2728 if (PyErr_Occurred())
2729 return NULL;
2730
Barry Warsaw53699e91996-12-10 23:23:01 +00002731 Py_BEGIN_ALLOW_THREADS
Fred Drake699f3522000-06-29 21:12:41 +00002732#ifdef MS_WIN64
2733 res = _lseeki64(fd, pos, how);
2734#else
Guido van Rossum687dd131993-05-17 08:34:16 +00002735 res = lseek(fd, pos, how);
Fred Drake699f3522000-06-29 21:12:41 +00002736#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002737 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002738 if (res < 0)
2739 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00002740
2741#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +00002742 return PyInt_FromLong(res);
Guido van Rossum94f6f721999-01-06 18:42:14 +00002743#else
2744 return PyLong_FromLongLong(res);
2745#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002746}
2747
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002748
2749static char posix_read__doc__[] =
2750"read(fd, buffersize) -> string\n\
2751Read a file descriptor.";
2752
Barry Warsaw53699e91996-12-10 23:23:01 +00002753static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002754posix_read(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002755 PyObject *self;
2756 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002757{
Guido van Rossum8bac5461996-06-11 18:38:48 +00002758 int fd, size, n;
Barry Warsaw53699e91996-12-10 23:23:01 +00002759 PyObject *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002760 if (!PyArg_ParseTuple(args, "ii:read", &fd, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00002761 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002762 buffer = PyString_FromStringAndSize((char *)NULL, size);
Guido van Rossum687dd131993-05-17 08:34:16 +00002763 if (buffer == NULL)
2764 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002765 Py_BEGIN_ALLOW_THREADS
2766 n = read(fd, PyString_AsString(buffer), size);
2767 Py_END_ALLOW_THREADS
Guido van Rossum8bac5461996-06-11 18:38:48 +00002768 if (n < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002769 Py_DECREF(buffer);
Guido van Rossum687dd131993-05-17 08:34:16 +00002770 return posix_error();
2771 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00002772 if (n != size)
Barry Warsaw53699e91996-12-10 23:23:01 +00002773 _PyString_Resize(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00002774 return buffer;
2775}
2776
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002777
2778static char posix_write__doc__[] =
2779"write(fd, string) -> byteswritten\n\
2780Write a string to a file descriptor.";
2781
Barry Warsaw53699e91996-12-10 23:23:01 +00002782static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002783posix_write(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002784 PyObject *self;
2785 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002786{
2787 int fd, size;
2788 char *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002789 if (!PyArg_ParseTuple(args, "is#:write", &fd, &buffer, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00002790 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002791 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002792 size = write(fd, buffer, size);
Barry Warsaw53699e91996-12-10 23:23:01 +00002793 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002794 if (size < 0)
2795 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002796 return PyInt_FromLong((long)size);
Guido van Rossum687dd131993-05-17 08:34:16 +00002797}
2798
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002799
2800static char posix_fstat__doc__[]=
2801"fstat(fd) -> (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\
2802Like stat(), but for an open file descriptor.";
2803
Barry Warsaw53699e91996-12-10 23:23:01 +00002804static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002805posix_fstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002806 PyObject *self;
2807 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002808{
2809 int fd;
Fred Drake699f3522000-06-29 21:12:41 +00002810 STRUCT_STAT st;
Guido van Rossum687dd131993-05-17 08:34:16 +00002811 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002812 if (!PyArg_ParseTuple(args, "i:fstat", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002813 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002814 Py_BEGIN_ALLOW_THREADS
Fred Drake699f3522000-06-29 21:12:41 +00002815 res = FSTAT(fd, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00002816 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002817 if (res != 0)
2818 return posix_error();
Fred Drake699f3522000-06-29 21:12:41 +00002819
2820 return _pystat_fromstructstat(st);
Guido van Rossum687dd131993-05-17 08:34:16 +00002821}
2822
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002823
2824static char posix_fdopen__doc__[] =
2825"fdopen(fd, [, mode='r' [, bufsize]]) -> file_object\n\
2826Return an open file object connected to a file descriptor.";
2827
Barry Warsaw53699e91996-12-10 23:23:01 +00002828static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002829posix_fdopen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002830 PyObject *self;
2831 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002832{
Barry Warsaw53699e91996-12-10 23:23:01 +00002833 extern int fclose Py_PROTO((FILE *));
Guido van Rossum687dd131993-05-17 08:34:16 +00002834 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002835 char *mode = "r";
2836 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00002837 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002838 PyObject *f;
2839 if (!PyArg_ParseTuple(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00002840 return NULL;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002841
Barry Warsaw53699e91996-12-10 23:23:01 +00002842 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002843 fp = fdopen(fd, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002844 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002845 if (fp == NULL)
2846 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002847 f = PyFile_FromFile(fp, "(fdopen)", mode, fclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002848 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002849 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002850 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00002851}
2852
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002853
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002854#ifdef HAVE_PIPE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002855static char posix_pipe__doc__[] =
2856"pipe() -> (read_end, write_end)\n\
2857Create a pipe.";
2858
Barry Warsaw53699e91996-12-10 23:23:01 +00002859static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002860posix_pipe(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002861 PyObject *self;
2862 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002863{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002864#if defined(PYOS_OS2)
2865 HFILE read, write;
2866 APIRET rc;
2867
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002868 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002869 return NULL;
2870
2871 Py_BEGIN_ALLOW_THREADS
2872 rc = DosCreatePipe( &read, &write, 4096);
2873 Py_END_ALLOW_THREADS
2874 if (rc != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002875 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002876
2877 return Py_BuildValue("(ii)", read, write);
2878#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002879#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00002880 int fds[2];
2881 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002882 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum687dd131993-05-17 08:34:16 +00002883 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002884 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002885 res = pipe(fds);
Barry Warsaw53699e91996-12-10 23:23:01 +00002886 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002887 if (res != 0)
2888 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002889 return Py_BuildValue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002890#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00002891 HANDLE read, write;
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002892 int read_fd, write_fd;
Guido van Rossum794d8131994-08-23 13:48:48 +00002893 BOOL ok;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002894 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum794d8131994-08-23 13:48:48 +00002895 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002896 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002897 ok = CreatePipe(&read, &write, NULL, 0);
Barry Warsaw53699e91996-12-10 23:23:01 +00002898 Py_END_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00002899 if (!ok)
2900 return posix_error();
Fred Drake699f3522000-06-29 21:12:41 +00002901 read_fd = _open_osfhandle((intptr_t)read, 0);
2902 write_fd = _open_osfhandle((intptr_t)write, 1);
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002903 return Py_BuildValue("(ii)", read_fd, write_fd);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002904#endif /* MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002905#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002906}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002907#endif /* HAVE_PIPE */
2908
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002909
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002910#ifdef HAVE_MKFIFO
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002911static char posix_mkfifo__doc__[] =
2912"mkfifo(file, [, mode=0666]) -> None\n\
2913Create a FIFO (a POSIX named pipe).";
2914
Barry Warsaw53699e91996-12-10 23:23:01 +00002915static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002916posix_mkfifo(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002917 PyObject *self;
2918 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002919{
2920 char *file;
2921 int mode = 0666;
2922 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002923 if (!PyArg_ParseTuple(args, "s|i:mkfifo", &file, &mode))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002924 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002925 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002926 res = mkfifo(file, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002927 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002928 if (res < 0)
2929 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002930 Py_INCREF(Py_None);
2931 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002932}
2933#endif
2934
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002935
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002936#ifdef HAVE_FTRUNCATE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002937static char posix_ftruncate__doc__[] =
2938"ftruncate(fd, length) -> None\n\
2939Truncate a file to a specified length.";
2940
Barry Warsaw53699e91996-12-10 23:23:01 +00002941static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002942posix_ftruncate(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002943 PyObject *self; /* Not used */
2944 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002945{
2946 int fd;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002947 off_t length;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002948 int res;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002949 PyObject *lenobj;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002950
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002951 if (!PyArg_ParseTuple(args, "iO:ftruncate", &fd, &lenobj))
Guido van Rossum94f6f721999-01-06 18:42:14 +00002952 return NULL;
2953
2954#if !defined(HAVE_LARGEFILE_SUPPORT)
2955 length = PyInt_AsLong(lenobj);
2956#else
2957 length = PyLong_Check(lenobj) ?
2958 PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj);
2959#endif
2960 if (PyErr_Occurred())
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002961 return NULL;
2962
Barry Warsaw53699e91996-12-10 23:23:01 +00002963 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002964 res = ftruncate(fd, length);
Barry Warsaw53699e91996-12-10 23:23:01 +00002965 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002966 if (res < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002967 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002968 return NULL;
2969 }
Barry Warsaw53699e91996-12-10 23:23:01 +00002970 Py_INCREF(Py_None);
2971 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002972}
2973#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002974
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002975#ifdef NeXT
2976#define HAVE_PUTENV
2977/* Steve Spicklemire got this putenv from NeXTAnswers */
2978static int
2979putenv(char *newval)
2980{
2981 extern char **environ;
2982
2983 static int firstTime = 1;
2984 char **ep;
2985 char *cp;
2986 int esiz;
2987 char *np;
2988
2989 if (!(np = strchr(newval, '=')))
2990 return 1;
2991 *np = '\0';
2992
2993 /* look it up */
2994 for (ep=environ ; *ep ; ep++)
2995 {
2996 /* this should always be true... */
2997 if (cp = strchr(*ep, '='))
2998 {
2999 *cp = '\0';
3000 if (!strcmp(*ep, newval))
3001 {
3002 /* got it! */
3003 *cp = '=';
3004 break;
3005 }
3006 *cp = '=';
3007 }
3008 else
3009 {
3010 *np = '=';
3011 return 1;
3012 }
3013 }
3014
3015 *np = '=';
3016 if (*ep)
3017 {
3018 /* the string was already there:
3019 just replace it with the new one */
3020 *ep = newval;
3021 return 0;
3022 }
3023
3024 /* expand environ by one */
3025 for (esiz=2, ep=environ ; *ep ; ep++)
3026 esiz++;
3027 if (firstTime)
3028 {
3029 char **epp;
3030 char **newenv;
3031 if (!(newenv = malloc(esiz * sizeof(char *))))
3032 return 1;
3033
3034 for (ep=environ, epp=newenv ; *ep ;)
3035 *epp++ = *ep++;
3036 *epp++ = newval;
3037 *epp = (char *) 0;
3038 environ = newenv;
3039 }
3040 else
3041 {
3042 if (!(environ = realloc(environ, esiz * sizeof(char *))))
3043 return 1;
3044 environ[esiz - 2] = newval;
3045 environ[esiz - 1] = (char *) 0;
3046 firstTime = 0;
3047 }
3048
3049 return 0;
3050}
Guido van Rossumc6ef2041997-08-21 02:30:45 +00003051#endif /* NeXT */
Guido van Rossumb9f866c1997-05-22 15:12:39 +00003052
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003053
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003054#ifdef HAVE_PUTENV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003055static char posix_putenv__doc__[] =
3056"putenv(key, value) -> None\n\
3057Change or add an environment variable.";
3058
Guido van Rossumbcc20741998-08-04 22:53:56 +00003059#ifdef __BEOS__
3060/* We have putenv(), but not in the headers (as of PR2). - [cjh] */
3061int putenv( const char *str );
3062#endif
3063
Fred Drake762e2061999-08-26 17:23:54 +00003064/* Save putenv() parameters as values here, so we can collect them when they
3065 * get re-set with another call for the same key. */
3066static PyObject *posix_putenv_garbage;
3067
Barry Warsaw53699e91996-12-10 23:23:01 +00003068static PyObject *
Guido van Rossumb6a47161997-09-15 22:54:34 +00003069posix_putenv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00003070 PyObject *self;
3071 PyObject *args;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003072{
3073 char *s1, *s2;
3074 char *new;
Fred Drake762e2061999-08-26 17:23:54 +00003075 PyObject *newstr;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003076
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003077 if (!PyArg_ParseTuple(args, "ss:putenv", &s1, &s2))
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003078 return NULL;
Guido van Rossumd48f2521997-12-05 22:19:34 +00003079
3080#if defined(PYOS_OS2)
3081 if (stricmp(s1, "BEGINLIBPATH") == 0) {
3082 APIRET rc;
3083
3084 if (strlen(s2) == 0) /* If New Value is an Empty String */
3085 s2 = NULL; /* Then OS/2 API Wants a NULL to Undefine It */
3086
3087 rc = DosSetExtLIBPATH(s2, BEGIN_LIBPATH);
3088 if (rc != NO_ERROR)
3089 return os2_error(rc);
3090
3091 } else if (stricmp(s1, "ENDLIBPATH") == 0) {
3092 APIRET rc;
3093
3094 if (strlen(s2) == 0) /* If New Value is an Empty String */
3095 s2 = NULL; /* Then OS/2 API Wants a NULL to Undefine It */
3096
3097 rc = DosSetExtLIBPATH(s2, END_LIBPATH);
3098 if (rc != NO_ERROR)
3099 return os2_error(rc);
3100 } else {
3101#endif
3102
Fred Drake762e2061999-08-26 17:23:54 +00003103 /* XXX This can leak memory -- not easy to fix :-( */
3104 newstr = PyString_FromStringAndSize(NULL, strlen(s1) + strlen(s2) + 2);
3105 if (newstr == NULL)
3106 return PyErr_NoMemory();
3107 new = PyString_AS_STRING(newstr);
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003108 (void) sprintf(new, "%s=%s", s1, s2);
3109 if (putenv(new)) {
3110 posix_error();
3111 return NULL;
3112 }
Fred Drake762e2061999-08-26 17:23:54 +00003113 /* Install the first arg and newstr in posix_putenv_garbage;
3114 * this will cause previous value to be collected. This has to
3115 * happen after the real putenv() call because the old value
3116 * was still accessible until then. */
3117 if (PyDict_SetItem(posix_putenv_garbage,
3118 PyTuple_GET_ITEM(args, 0), newstr)) {
3119 /* really not much we can do; just leak */
3120 PyErr_Clear();
3121 }
3122 else {
3123 Py_DECREF(newstr);
3124 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00003125
3126#if defined(PYOS_OS2)
3127 }
3128#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00003129 Py_INCREF(Py_None);
3130 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003131}
Guido van Rossumb6a47161997-09-15 22:54:34 +00003132#endif /* putenv */
3133
3134#ifdef HAVE_STRERROR
3135static char posix_strerror__doc__[] =
3136"strerror(code) -> string\n\
3137Translate an error code to a message string.";
3138
3139PyObject *
3140posix_strerror(self, args)
3141 PyObject *self;
3142 PyObject *args;
3143{
3144 int code;
3145 char *message;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003146 if (!PyArg_ParseTuple(args, "i:strerror", &code))
Guido van Rossumb6a47161997-09-15 22:54:34 +00003147 return NULL;
3148 message = strerror(code);
3149 if (message == NULL) {
3150 PyErr_SetString(PyExc_ValueError,
3151 "strerror code out of range");
3152 return NULL;
3153 }
3154 return PyString_FromString(message);
3155}
3156#endif /* strerror */
3157
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003158
Guido van Rossumc9641791998-08-04 15:26:23 +00003159#ifdef HAVE_SYS_WAIT_H
3160
3161#ifdef WIFSTOPPED
3162static char posix_WIFSTOPPED__doc__[] =
3163"WIFSTOPPED(status) -> Boolean\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003164Return true if the process returning 'status' was stopped.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003165
3166static PyObject *
3167posix_WIFSTOPPED(self, args)
3168 PyObject *self;
3169 PyObject *args;
3170{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003171#ifdef UNION_WAIT
3172 union wait status;
3173#define status_i (status.w_status)
3174#else
3175 int status;
3176#define status_i status
3177#endif
3178 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003179
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003180 if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003181 {
3182 return NULL;
3183 }
3184
3185 return Py_BuildValue("i", WIFSTOPPED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003186#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003187}
3188#endif /* WIFSTOPPED */
3189
3190#ifdef WIFSIGNALED
3191static char posix_WIFSIGNALED__doc__[] =
3192"WIFSIGNALED(status) -> Boolean\n\
Guido van Rossum3366d1c1999-02-23 18:34:43 +00003193Return true if the process returning 'status' was terminated by a signal.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003194
3195static PyObject *
3196posix_WIFSIGNALED(self, args)
3197 PyObject *self;
3198 PyObject *args;
3199{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003200#ifdef UNION_WAIT
3201 union wait status;
3202#define status_i (status.w_status)
3203#else
3204 int status;
3205#define status_i status
3206#endif
3207 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003208
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003209 if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003210 {
3211 return NULL;
3212 }
3213
3214 return Py_BuildValue("i", WIFSIGNALED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003215#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003216}
3217#endif /* WIFSIGNALED */
3218
3219#ifdef WIFEXITED
3220static char posix_WIFEXITED__doc__[] =
3221"WIFEXITED(status) -> Boolean\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003222Return true if the process returning 'status' exited using the exit()\n\
3223system call.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003224
3225static PyObject *
3226posix_WIFEXITED(self, args)
3227 PyObject *self;
3228 PyObject *args;
3229{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003230#ifdef UNION_WAIT
3231 union wait status;
3232#define status_i (status.w_status)
3233#else
3234 int status;
3235#define status_i status
3236#endif
3237 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003238
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003239 if (!PyArg_ParseTuple(args, "i:WIFEXITED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003240 {
3241 return NULL;
3242 }
3243
3244 return Py_BuildValue("i", WIFEXITED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003245#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003246}
3247#endif /* WIFEXITED */
3248
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003249#ifdef WEXITSTATUS
Guido van Rossumc9641791998-08-04 15:26:23 +00003250static char posix_WEXITSTATUS__doc__[] =
3251"WEXITSTATUS(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003252Return the process return code from 'status'.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003253
3254static PyObject *
3255posix_WEXITSTATUS(self, args)
3256 PyObject *self;
3257 PyObject *args;
3258{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003259#ifdef UNION_WAIT
3260 union wait status;
3261#define status_i (status.w_status)
3262#else
3263 int status;
3264#define status_i status
3265#endif
3266 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003267
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003268 if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003269 {
3270 return NULL;
3271 }
3272
3273 return Py_BuildValue("i", WEXITSTATUS(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003274#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003275}
3276#endif /* WEXITSTATUS */
3277
3278#ifdef WTERMSIG
3279static char posix_WTERMSIG__doc__[] =
3280"WTERMSIG(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003281Return the signal that terminated the process that provided the 'status'\n\
3282value.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003283
3284static PyObject *
3285posix_WTERMSIG(self, args)
3286 PyObject *self;
3287 PyObject *args;
3288{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003289#ifdef UNION_WAIT
3290 union wait status;
3291#define status_i (status.w_status)
3292#else
3293 int status;
3294#define status_i status
3295#endif
3296 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003297
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003298 if (!PyArg_ParseTuple(args, "i:WTERMSIG", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003299 {
3300 return NULL;
3301 }
3302
3303 return Py_BuildValue("i", WTERMSIG(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003304#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003305}
3306#endif /* WTERMSIG */
3307
3308#ifdef WSTOPSIG
3309static char posix_WSTOPSIG__doc__[] =
3310"WSTOPSIG(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003311Return the signal that stopped the process that provided the 'status' value.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003312
3313static PyObject *
3314posix_WSTOPSIG(self, args)
3315 PyObject *self;
3316 PyObject *args;
3317{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003318#ifdef UNION_WAIT
3319 union wait status;
3320#define status_i (status.w_status)
3321#else
3322 int status;
3323#define status_i status
3324#endif
3325 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003326
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003327 if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003328 {
3329 return NULL;
3330 }
3331
3332 return Py_BuildValue("i", WSTOPSIG(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003333#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003334}
3335#endif /* WSTOPSIG */
3336
3337#endif /* HAVE_SYS_WAIT_H */
3338
3339
Guido van Rossum94f6f721999-01-06 18:42:14 +00003340#if defined(HAVE_FSTATVFS)
Guido van Rossumd5753e11999-10-19 13:29:23 +00003341#ifdef _SCO_DS
3342/* SCO OpenServer 5.0 and later requires _SVID3 before it reveals the
3343 needed definitions in sys/statvfs.h */
3344#define _SVID3
3345#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00003346#include <sys/statvfs.h>
3347
3348static char posix_fstatvfs__doc__[] =
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003349"fstatvfs(fd) -> \n\
3350 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +00003351Perform an fstatvfs system call on the given fd.";
3352
3353static PyObject *
3354posix_fstatvfs(self, args)
3355 PyObject *self;
3356 PyObject *args;
3357{
3358 int fd, res;
3359 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003360 if (!PyArg_ParseTuple(args, "i:fstatvfs", &fd))
Guido van Rossum94f6f721999-01-06 18:42:14 +00003361 return NULL;
3362 Py_BEGIN_ALLOW_THREADS
3363 res = fstatvfs(fd, &st);
3364 Py_END_ALLOW_THREADS
3365 if (res != 0)
3366 return posix_error();
3367#if !defined(HAVE_LARGEFILE_SUPPORT)
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003368 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003369 (long) st.f_bsize,
3370 (long) st.f_frsize,
3371 (long) st.f_blocks,
3372 (long) st.f_bfree,
3373 (long) st.f_bavail,
3374 (long) st.f_files,
3375 (long) st.f_ffree,
3376 (long) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003377 (long) st.f_flag,
3378 (long) st.f_namemax);
3379#else
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003380 return Py_BuildValue("(llLLLLLLll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003381 (long) st.f_bsize,
3382 (long) st.f_frsize,
3383 (LONG_LONG) st.f_blocks,
3384 (LONG_LONG) st.f_bfree,
3385 (LONG_LONG) st.f_bavail,
3386 (LONG_LONG) st.f_files,
3387 (LONG_LONG) st.f_ffree,
3388 (LONG_LONG) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003389 (long) st.f_flag,
3390 (long) st.f_namemax);
3391#endif
3392}
3393#endif /* HAVE_FSTATVFS */
3394
3395
3396#if defined(HAVE_STATVFS)
3397#include <sys/statvfs.h>
3398
3399static char posix_statvfs__doc__[] =
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003400"statvfs(path) -> \n\
3401 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +00003402Perform a statvfs system call on the given path.";
3403
3404static PyObject *
3405posix_statvfs(self, args)
3406 PyObject *self;
3407 PyObject *args;
3408{
3409 char *path;
3410 int res;
3411 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003412 if (!PyArg_ParseTuple(args, "s:statvfs", &path))
Guido van Rossum94f6f721999-01-06 18:42:14 +00003413 return NULL;
3414 Py_BEGIN_ALLOW_THREADS
3415 res = statvfs(path, &st);
3416 Py_END_ALLOW_THREADS
3417 if (res != 0)
3418 return posix_error_with_filename(path);
3419#if !defined(HAVE_LARGEFILE_SUPPORT)
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003420 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003421 (long) st.f_bsize,
3422 (long) st.f_frsize,
3423 (long) st.f_blocks,
3424 (long) st.f_bfree,
3425 (long) st.f_bavail,
3426 (long) st.f_files,
3427 (long) st.f_ffree,
3428 (long) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003429 (long) st.f_flag,
3430 (long) st.f_namemax);
3431#else /* HAVE_LARGEFILE_SUPPORT */
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003432 return Py_BuildValue("(llLLLLLLll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003433 (long) st.f_bsize,
3434 (long) st.f_frsize,
3435 (LONG_LONG) st.f_blocks,
3436 (LONG_LONG) st.f_bfree,
3437 (LONG_LONG) st.f_bavail,
3438 (LONG_LONG) st.f_files,
3439 (LONG_LONG) st.f_ffree,
3440 (LONG_LONG) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003441 (long) st.f_flag,
3442 (long) st.f_namemax);
3443#endif
3444}
3445#endif /* HAVE_STATVFS */
3446
3447
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003448#ifdef HAVE_TEMPNAM
3449static char posix_tempnam__doc__[] = "\
3450tempnam([dir[, prefix]]) -> string\n\
3451Return a unique name for a temporary file.\n\
3452The directory and a short may be specified as strings; they may be omitted\n\
3453or None if not needed.";
3454
3455static PyObject *
3456posix_tempnam(self, args)
3457 PyObject *self;
3458 PyObject *args;
3459{
3460 PyObject *result = NULL;
3461 char *dir = NULL;
3462 char *pfx = NULL;
3463 char *name;
3464
3465 if (!PyArg_ParseTuple(args, "|zz:tempnam", &dir, &pfx))
3466 return NULL;
3467 name = tempnam(dir, pfx);
3468 if (name == NULL)
3469 return PyErr_NoMemory();
3470 result = PyString_FromString(name);
3471 free(name);
3472 return result;
3473}
Guido van Rossumd371ff11999-01-25 16:12:23 +00003474#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003475
3476
3477#ifdef HAVE_TMPFILE
3478static char posix_tmpfile__doc__[] = "\
3479tmpfile() -> file object\n\
3480Create a temporary file with no directory entries.";
3481
3482static PyObject *
3483posix_tmpfile(self, args)
3484 PyObject *self;
3485 PyObject *args;
3486{
3487 FILE *fp;
3488
3489 if (!PyArg_ParseTuple(args, ":tmpfile"))
3490 return NULL;
3491 fp = tmpfile();
3492 if (fp == NULL)
3493 return posix_error();
3494 return PyFile_FromFile(fp, "<tmpfile>", "w+", fclose);
3495}
3496#endif
3497
3498
3499#ifdef HAVE_TMPNAM
3500static char posix_tmpnam__doc__[] = "\
3501tmpnam() -> string\n\
3502Return a unique name for a temporary file.";
3503
3504static PyObject *
3505posix_tmpnam(self, args)
3506 PyObject *self;
3507 PyObject *args;
3508{
3509 char buffer[L_tmpnam];
3510 char *name;
3511
3512 if (!PyArg_ParseTuple(args, ":tmpnam"))
3513 return NULL;
Greg Wardb48bc172000-03-01 21:51:56 +00003514#ifdef USE_TMPNAM_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003515 name = tmpnam_r(buffer);
3516#else
3517 name = tmpnam(buffer);
3518#endif
3519 if (name == NULL) {
3520 PyErr_SetObject(PyExc_OSError,
3521 Py_BuildValue("is", 0,
Greg Wardb48bc172000-03-01 21:51:56 +00003522#ifdef USE_TMPNAM_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003523 "unexpected NULL from tmpnam_r"
3524#else
3525 "unexpected NULL from tmpnam"
3526#endif
3527 ));
3528 return NULL;
3529 }
3530 return PyString_FromString(buffer);
3531}
3532#endif
3533
3534
Fred Drakec9680921999-12-13 16:37:25 +00003535/* This is used for fpathconf(), pathconf(), confstr() and sysconf().
3536 * It maps strings representing configuration variable names to
3537 * integer values, allowing those functions to be called with the
3538 * magic names instead of poluting the module's namespace with tons of
Fred Drake12c6e2d1999-12-14 21:25:03 +00003539 * rarely-used constants. There are three separate tables that use
3540 * these definitions.
Fred Drakebec628d1999-12-15 18:31:10 +00003541 *
3542 * This code is always included, even if none of the interfaces that
3543 * need it are included. The #if hackery needed to avoid it would be
3544 * sufficiently pervasive that it's not worth the loss of readability.
Fred Drakec9680921999-12-13 16:37:25 +00003545 */
3546struct constdef {
3547 char *name;
3548 long value;
3549};
3550
Fred Drake12c6e2d1999-12-14 21:25:03 +00003551static int
3552conv_confname(arg, valuep, table, tablesize)
3553 PyObject *arg;
3554 int *valuep;
3555 struct constdef *table;
3556 size_t tablesize;
3557{
3558 if (PyInt_Check(arg)) {
3559 *valuep = PyInt_AS_LONG(arg);
3560 return 1;
3561 }
3562 if (PyString_Check(arg)) {
3563 /* look up the value in the table using a binary search */
Fred Drake699f3522000-06-29 21:12:41 +00003564 size_t lo = 0;
3565 size_t mid;
3566 size_t hi = tablesize;
3567 int cmp;
Fred Drake12c6e2d1999-12-14 21:25:03 +00003568 char *confname = PyString_AS_STRING(arg);
3569 while (lo < hi) {
3570 mid = (lo + hi) / 2;
3571 cmp = strcmp(confname, table[mid].name);
3572 if (cmp < 0)
3573 hi = mid;
3574 else if (cmp > 0)
3575 lo = mid + 1;
3576 else {
3577 *valuep = table[mid].value;
3578 return 1;
3579 }
3580 }
3581 PyErr_SetString(PyExc_ValueError, "unrecognized configuration name");
3582 }
3583 else
3584 PyErr_SetString(PyExc_TypeError,
3585 "configuration names must be strings or integers");
3586 return 0;
3587}
3588
3589
3590#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
3591static struct constdef posix_constants_pathconf[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003592#ifdef _PC_ABI_AIO_XFER_MAX
3593 {"PC_ABI_AIO_XFER_MAX", _PC_ABI_AIO_XFER_MAX},
3594#endif
3595#ifdef _PC_ABI_ASYNC_IO
3596 {"PC_ABI_ASYNC_IO", _PC_ABI_ASYNC_IO},
3597#endif
Fred Drakec9680921999-12-13 16:37:25 +00003598#ifdef _PC_ASYNC_IO
3599 {"PC_ASYNC_IO", _PC_ASYNC_IO},
3600#endif
3601#ifdef _PC_CHOWN_RESTRICTED
3602 {"PC_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED},
3603#endif
3604#ifdef _PC_FILESIZEBITS
3605 {"PC_FILESIZEBITS", _PC_FILESIZEBITS},
3606#endif
3607#ifdef _PC_LAST
3608 {"PC_LAST", _PC_LAST},
3609#endif
3610#ifdef _PC_LINK_MAX
3611 {"PC_LINK_MAX", _PC_LINK_MAX},
3612#endif
3613#ifdef _PC_MAX_CANON
3614 {"PC_MAX_CANON", _PC_MAX_CANON},
3615#endif
3616#ifdef _PC_MAX_INPUT
3617 {"PC_MAX_INPUT", _PC_MAX_INPUT},
3618#endif
3619#ifdef _PC_NAME_MAX
3620 {"PC_NAME_MAX", _PC_NAME_MAX},
3621#endif
3622#ifdef _PC_NO_TRUNC
3623 {"PC_NO_TRUNC", _PC_NO_TRUNC},
3624#endif
3625#ifdef _PC_PATH_MAX
3626 {"PC_PATH_MAX", _PC_PATH_MAX},
3627#endif
3628#ifdef _PC_PIPE_BUF
3629 {"PC_PIPE_BUF", _PC_PIPE_BUF},
3630#endif
3631#ifdef _PC_PRIO_IO
3632 {"PC_PRIO_IO", _PC_PRIO_IO},
3633#endif
3634#ifdef _PC_SOCK_MAXBUF
3635 {"PC_SOCK_MAXBUF", _PC_SOCK_MAXBUF},
3636#endif
3637#ifdef _PC_SYNC_IO
3638 {"PC_SYNC_IO", _PC_SYNC_IO},
3639#endif
3640#ifdef _PC_VDISABLE
3641 {"PC_VDISABLE", _PC_VDISABLE},
3642#endif
3643};
3644
Fred Drakec9680921999-12-13 16:37:25 +00003645static int
3646conv_path_confname(arg, valuep)
3647 PyObject *arg;
3648 int *valuep;
3649{
3650 return conv_confname(arg, valuep, posix_constants_pathconf,
3651 sizeof(posix_constants_pathconf)
3652 / sizeof(struct constdef));
3653}
3654#endif
3655
3656#ifdef HAVE_FPATHCONF
3657static char posix_fpathconf__doc__[] = "\
3658fpathconf(fd, name) -> integer\n\
3659Return the configuration limit name for the file descriptor fd.\n\
3660If there is no limit, return -1.";
3661
3662static PyObject *
3663posix_fpathconf(self, args)
3664 PyObject *self;
3665 PyObject *args;
3666{
3667 PyObject *result = NULL;
3668 int name, fd;
3669
Fred Drake12c6e2d1999-12-14 21:25:03 +00003670 if (PyArg_ParseTuple(args, "iO&:fpathconf", &fd,
3671 conv_path_confname, &name)) {
Fred Drakec9680921999-12-13 16:37:25 +00003672 long limit;
3673
3674 errno = 0;
3675 limit = fpathconf(fd, name);
3676 if (limit == -1 && errno != 0)
3677 posix_error();
3678 else
3679 result = PyInt_FromLong(limit);
3680 }
3681 return result;
3682}
3683#endif
3684
3685
3686#ifdef HAVE_PATHCONF
3687static char posix_pathconf__doc__[] = "\
3688pathconf(path, name) -> integer\n\
3689Return the configuration limit name for the file or directory path.\n\
3690If there is no limit, return -1.";
3691
3692static PyObject *
3693posix_pathconf(self, args)
3694 PyObject *self;
3695 PyObject *args;
3696{
3697 PyObject *result = NULL;
3698 int name;
3699 char *path;
3700
3701 if (PyArg_ParseTuple(args, "sO&:pathconf", &path,
3702 conv_path_confname, &name)) {
3703 long limit;
3704
3705 errno = 0;
3706 limit = pathconf(path, name);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003707 if (limit == -1 && errno != 0) {
Fred Drakec9680921999-12-13 16:37:25 +00003708 if (errno == EINVAL)
3709 /* could be a path or name problem */
3710 posix_error();
3711 else
3712 posix_error_with_filename(path);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003713 }
Fred Drakec9680921999-12-13 16:37:25 +00003714 else
3715 result = PyInt_FromLong(limit);
3716 }
3717 return result;
3718}
3719#endif
3720
3721#ifdef HAVE_CONFSTR
3722static struct constdef posix_constants_confstr[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003723#ifdef _CS_ARCHITECTURE
3724 {"CS_ARCHITECTURE", _CS_ARCHITECTURE},
3725#endif
3726#ifdef _CS_HOSTNAME
3727 {"CS_HOSTNAME", _CS_HOSTNAME},
3728#endif
3729#ifdef _CS_HW_PROVIDER
3730 {"CS_HW_PROVIDER", _CS_HW_PROVIDER},
3731#endif
3732#ifdef _CS_HW_SERIAL
3733 {"CS_HW_SERIAL", _CS_HW_SERIAL},
3734#endif
3735#ifdef _CS_INITTAB_NAME
3736 {"CS_INITTAB_NAME", _CS_INITTAB_NAME},
3737#endif
Fred Drakec9680921999-12-13 16:37:25 +00003738#ifdef _CS_LFS64_CFLAGS
3739 {"CS_LFS64_CFLAGS", _CS_LFS64_CFLAGS},
3740#endif
3741#ifdef _CS_LFS64_LDFLAGS
3742 {"CS_LFS64_LDFLAGS", _CS_LFS64_LDFLAGS},
3743#endif
3744#ifdef _CS_LFS64_LIBS
3745 {"CS_LFS64_LIBS", _CS_LFS64_LIBS},
3746#endif
3747#ifdef _CS_LFS64_LINTFLAGS
3748 {"CS_LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS},
3749#endif
3750#ifdef _CS_LFS_CFLAGS
3751 {"CS_LFS_CFLAGS", _CS_LFS_CFLAGS},
3752#endif
3753#ifdef _CS_LFS_LDFLAGS
3754 {"CS_LFS_LDFLAGS", _CS_LFS_LDFLAGS},
3755#endif
3756#ifdef _CS_LFS_LIBS
3757 {"CS_LFS_LIBS", _CS_LFS_LIBS},
3758#endif
3759#ifdef _CS_LFS_LINTFLAGS
3760 {"CS_LFS_LINTFLAGS", _CS_LFS_LINTFLAGS},
3761#endif
Fred Draked86ed291999-12-15 15:34:33 +00003762#ifdef _CS_MACHINE
3763 {"CS_MACHINE", _CS_MACHINE},
3764#endif
Fred Drakec9680921999-12-13 16:37:25 +00003765#ifdef _CS_PATH
3766 {"CS_PATH", _CS_PATH},
3767#endif
Fred Draked86ed291999-12-15 15:34:33 +00003768#ifdef _CS_RELEASE
3769 {"CS_RELEASE", _CS_RELEASE},
3770#endif
3771#ifdef _CS_SRPC_DOMAIN
3772 {"CS_SRPC_DOMAIN", _CS_SRPC_DOMAIN},
3773#endif
3774#ifdef _CS_SYSNAME
3775 {"CS_SYSNAME", _CS_SYSNAME},
3776#endif
3777#ifdef _CS_VERSION
3778 {"CS_VERSION", _CS_VERSION},
3779#endif
Fred Drakec9680921999-12-13 16:37:25 +00003780#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS
3781 {"CS_XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS},
3782#endif
3783#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS
3784 {"CS_XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS},
3785#endif
3786#ifdef _CS_XBS5_ILP32_OFF32_LIBS
3787 {"CS_XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS},
3788#endif
3789#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS
3790 {"CS_XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS},
3791#endif
3792#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS
3793 {"CS_XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS},
3794#endif
3795#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS
3796 {"CS_XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS},
3797#endif
3798#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS
3799 {"CS_XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS},
3800#endif
3801#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
3802 {"CS_XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS},
3803#endif
3804#ifdef _CS_XBS5_LP64_OFF64_CFLAGS
3805 {"CS_XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS},
3806#endif
3807#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS
3808 {"CS_XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS},
3809#endif
3810#ifdef _CS_XBS5_LP64_OFF64_LIBS
3811 {"CS_XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS},
3812#endif
3813#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS
3814 {"CS_XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS},
3815#endif
3816#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS
3817 {"CS_XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS},
3818#endif
3819#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
3820 {"CS_XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS},
3821#endif
3822#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS
3823 {"CS_XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS},
3824#endif
3825#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
3826 {"CS_XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS},
3827#endif
Fred Draked86ed291999-12-15 15:34:33 +00003828#ifdef _MIPS_CS_AVAIL_PROCESSORS
3829 {"MIPS_CS_AVAIL_PROCESSORS", _MIPS_CS_AVAIL_PROCESSORS},
3830#endif
3831#ifdef _MIPS_CS_BASE
3832 {"MIPS_CS_BASE", _MIPS_CS_BASE},
3833#endif
3834#ifdef _MIPS_CS_HOSTID
3835 {"MIPS_CS_HOSTID", _MIPS_CS_HOSTID},
3836#endif
3837#ifdef _MIPS_CS_HW_NAME
3838 {"MIPS_CS_HW_NAME", _MIPS_CS_HW_NAME},
3839#endif
3840#ifdef _MIPS_CS_NUM_PROCESSORS
3841 {"MIPS_CS_NUM_PROCESSORS", _MIPS_CS_NUM_PROCESSORS},
3842#endif
3843#ifdef _MIPS_CS_OSREL_MAJ
3844 {"MIPS_CS_OSREL_MAJ", _MIPS_CS_OSREL_MAJ},
3845#endif
3846#ifdef _MIPS_CS_OSREL_MIN
3847 {"MIPS_CS_OSREL_MIN", _MIPS_CS_OSREL_MIN},
3848#endif
3849#ifdef _MIPS_CS_OSREL_PATCH
3850 {"MIPS_CS_OSREL_PATCH", _MIPS_CS_OSREL_PATCH},
3851#endif
3852#ifdef _MIPS_CS_OS_NAME
3853 {"MIPS_CS_OS_NAME", _MIPS_CS_OS_NAME},
3854#endif
3855#ifdef _MIPS_CS_OS_PROVIDER
3856 {"MIPS_CS_OS_PROVIDER", _MIPS_CS_OS_PROVIDER},
3857#endif
3858#ifdef _MIPS_CS_PROCESSORS
3859 {"MIPS_CS_PROCESSORS", _MIPS_CS_PROCESSORS},
3860#endif
3861#ifdef _MIPS_CS_SERIAL
3862 {"MIPS_CS_SERIAL", _MIPS_CS_SERIAL},
3863#endif
3864#ifdef _MIPS_CS_VENDOR
3865 {"MIPS_CS_VENDOR", _MIPS_CS_VENDOR},
3866#endif
Fred Drakec9680921999-12-13 16:37:25 +00003867};
3868
3869static int
3870conv_confstr_confname(arg, valuep)
3871 PyObject *arg;
3872 int *valuep;
3873{
3874 return conv_confname(arg, valuep, posix_constants_confstr,
3875 sizeof(posix_constants_confstr)
3876 / sizeof(struct constdef));
3877}
3878
3879static char posix_confstr__doc__[] = "\
3880confstr(name) -> string\n\
3881Return a string-valued system configuration variable.";
3882
3883static PyObject *
3884posix_confstr(self, args)
3885 PyObject *self;
3886 PyObject *args;
3887{
3888 PyObject *result = NULL;
3889 int name;
3890 char buffer[64];
3891
3892 if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) {
3893 int len = confstr(name, buffer, sizeof(buffer));
3894
Fred Drakec9680921999-12-13 16:37:25 +00003895 errno = 0;
3896 if (len == 0) {
3897 if (errno != 0)
3898 posix_error();
3899 else
3900 result = PyString_FromString("");
3901 }
3902 else {
3903 if (len >= sizeof(buffer)) {
3904 result = PyString_FromStringAndSize(NULL, len);
3905 if (result != NULL)
3906 confstr(name, PyString_AS_STRING(result), len+1);
3907 }
3908 else
3909 result = PyString_FromString(buffer);
3910 }
3911 }
3912 return result;
3913}
3914#endif
3915
3916
3917#ifdef HAVE_SYSCONF
3918static struct constdef posix_constants_sysconf[] = {
3919#ifdef _SC_2_CHAR_TERM
3920 {"SC_2_CHAR_TERM", _SC_2_CHAR_TERM},
3921#endif
3922#ifdef _SC_2_C_BIND
3923 {"SC_2_C_BIND", _SC_2_C_BIND},
3924#endif
3925#ifdef _SC_2_C_DEV
3926 {"SC_2_C_DEV", _SC_2_C_DEV},
3927#endif
3928#ifdef _SC_2_C_VERSION
3929 {"SC_2_C_VERSION", _SC_2_C_VERSION},
3930#endif
3931#ifdef _SC_2_FORT_DEV
3932 {"SC_2_FORT_DEV", _SC_2_FORT_DEV},
3933#endif
3934#ifdef _SC_2_FORT_RUN
3935 {"SC_2_FORT_RUN", _SC_2_FORT_RUN},
3936#endif
3937#ifdef _SC_2_LOCALEDEF
3938 {"SC_2_LOCALEDEF", _SC_2_LOCALEDEF},
3939#endif
3940#ifdef _SC_2_SW_DEV
3941 {"SC_2_SW_DEV", _SC_2_SW_DEV},
3942#endif
3943#ifdef _SC_2_UPE
3944 {"SC_2_UPE", _SC_2_UPE},
3945#endif
3946#ifdef _SC_2_VERSION
3947 {"SC_2_VERSION", _SC_2_VERSION},
3948#endif
Fred Draked86ed291999-12-15 15:34:33 +00003949#ifdef _SC_ABI_ASYNCHRONOUS_IO
3950 {"SC_ABI_ASYNCHRONOUS_IO", _SC_ABI_ASYNCHRONOUS_IO},
3951#endif
3952#ifdef _SC_ACL
3953 {"SC_ACL", _SC_ACL},
3954#endif
Fred Drakec9680921999-12-13 16:37:25 +00003955#ifdef _SC_AIO_LISTIO_MAX
3956 {"SC_AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX},
3957#endif
Fred Drakec9680921999-12-13 16:37:25 +00003958#ifdef _SC_AIO_MAX
3959 {"SC_AIO_MAX", _SC_AIO_MAX},
3960#endif
3961#ifdef _SC_AIO_PRIO_DELTA_MAX
3962 {"SC_AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX},
3963#endif
3964#ifdef _SC_ARG_MAX
3965 {"SC_ARG_MAX", _SC_ARG_MAX},
3966#endif
3967#ifdef _SC_ASYNCHRONOUS_IO
3968 {"SC_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO},
3969#endif
3970#ifdef _SC_ATEXIT_MAX
3971 {"SC_ATEXIT_MAX", _SC_ATEXIT_MAX},
3972#endif
Fred Draked86ed291999-12-15 15:34:33 +00003973#ifdef _SC_AUDIT
3974 {"SC_AUDIT", _SC_AUDIT},
3975#endif
Fred Drakec9680921999-12-13 16:37:25 +00003976#ifdef _SC_AVPHYS_PAGES
3977 {"SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES},
3978#endif
3979#ifdef _SC_BC_BASE_MAX
3980 {"SC_BC_BASE_MAX", _SC_BC_BASE_MAX},
3981#endif
3982#ifdef _SC_BC_DIM_MAX
3983 {"SC_BC_DIM_MAX", _SC_BC_DIM_MAX},
3984#endif
3985#ifdef _SC_BC_SCALE_MAX
3986 {"SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX},
3987#endif
3988#ifdef _SC_BC_STRING_MAX
3989 {"SC_BC_STRING_MAX", _SC_BC_STRING_MAX},
3990#endif
Fred Draked86ed291999-12-15 15:34:33 +00003991#ifdef _SC_CAP
3992 {"SC_CAP", _SC_CAP},
3993#endif
Fred Drakec9680921999-12-13 16:37:25 +00003994#ifdef _SC_CHARCLASS_NAME_MAX
3995 {"SC_CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX},
3996#endif
3997#ifdef _SC_CHAR_BIT
3998 {"SC_CHAR_BIT", _SC_CHAR_BIT},
3999#endif
4000#ifdef _SC_CHAR_MAX
4001 {"SC_CHAR_MAX", _SC_CHAR_MAX},
4002#endif
4003#ifdef _SC_CHAR_MIN
4004 {"SC_CHAR_MIN", _SC_CHAR_MIN},
4005#endif
4006#ifdef _SC_CHILD_MAX
4007 {"SC_CHILD_MAX", _SC_CHILD_MAX},
4008#endif
4009#ifdef _SC_CLK_TCK
4010 {"SC_CLK_TCK", _SC_CLK_TCK},
4011#endif
4012#ifdef _SC_COHER_BLKSZ
4013 {"SC_COHER_BLKSZ", _SC_COHER_BLKSZ},
4014#endif
4015#ifdef _SC_COLL_WEIGHTS_MAX
4016 {"SC_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX},
4017#endif
4018#ifdef _SC_DCACHE_ASSOC
4019 {"SC_DCACHE_ASSOC", _SC_DCACHE_ASSOC},
4020#endif
4021#ifdef _SC_DCACHE_BLKSZ
4022 {"SC_DCACHE_BLKSZ", _SC_DCACHE_BLKSZ},
4023#endif
4024#ifdef _SC_DCACHE_LINESZ
4025 {"SC_DCACHE_LINESZ", _SC_DCACHE_LINESZ},
4026#endif
4027#ifdef _SC_DCACHE_SZ
4028 {"SC_DCACHE_SZ", _SC_DCACHE_SZ},
4029#endif
4030#ifdef _SC_DCACHE_TBLKSZ
4031 {"SC_DCACHE_TBLKSZ", _SC_DCACHE_TBLKSZ},
4032#endif
4033#ifdef _SC_DELAYTIMER_MAX
4034 {"SC_DELAYTIMER_MAX", _SC_DELAYTIMER_MAX},
4035#endif
4036#ifdef _SC_EQUIV_CLASS_MAX
4037 {"SC_EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX},
4038#endif
4039#ifdef _SC_EXPR_NEST_MAX
4040 {"SC_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX},
4041#endif
4042#ifdef _SC_FSYNC
4043 {"SC_FSYNC", _SC_FSYNC},
4044#endif
4045#ifdef _SC_GETGR_R_SIZE_MAX
4046 {"SC_GETGR_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX},
4047#endif
4048#ifdef _SC_GETPW_R_SIZE_MAX
4049 {"SC_GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX},
4050#endif
4051#ifdef _SC_ICACHE_ASSOC
4052 {"SC_ICACHE_ASSOC", _SC_ICACHE_ASSOC},
4053#endif
4054#ifdef _SC_ICACHE_BLKSZ
4055 {"SC_ICACHE_BLKSZ", _SC_ICACHE_BLKSZ},
4056#endif
4057#ifdef _SC_ICACHE_LINESZ
4058 {"SC_ICACHE_LINESZ", _SC_ICACHE_LINESZ},
4059#endif
4060#ifdef _SC_ICACHE_SZ
4061 {"SC_ICACHE_SZ", _SC_ICACHE_SZ},
4062#endif
Fred Draked86ed291999-12-15 15:34:33 +00004063#ifdef _SC_INF
4064 {"SC_INF", _SC_INF},
4065#endif
Fred Drakec9680921999-12-13 16:37:25 +00004066#ifdef _SC_INT_MAX
4067 {"SC_INT_MAX", _SC_INT_MAX},
4068#endif
4069#ifdef _SC_INT_MIN
4070 {"SC_INT_MIN", _SC_INT_MIN},
4071#endif
4072#ifdef _SC_IOV_MAX
4073 {"SC_IOV_MAX", _SC_IOV_MAX},
4074#endif
Fred Draked86ed291999-12-15 15:34:33 +00004075#ifdef _SC_IP_SECOPTS
4076 {"SC_IP_SECOPTS", _SC_IP_SECOPTS},
4077#endif
Fred Drakec9680921999-12-13 16:37:25 +00004078#ifdef _SC_JOB_CONTROL
4079 {"SC_JOB_CONTROL", _SC_JOB_CONTROL},
4080#endif
Fred Draked86ed291999-12-15 15:34:33 +00004081#ifdef _SC_KERN_POINTERS
4082 {"SC_KERN_POINTERS", _SC_KERN_POINTERS},
4083#endif
4084#ifdef _SC_KERN_SIM
4085 {"SC_KERN_SIM", _SC_KERN_SIM},
4086#endif
Fred Drakec9680921999-12-13 16:37:25 +00004087#ifdef _SC_LINE_MAX
4088 {"SC_LINE_MAX", _SC_LINE_MAX},
4089#endif
4090#ifdef _SC_LOGIN_NAME_MAX
4091 {"SC_LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX},
4092#endif
4093#ifdef _SC_LOGNAME_MAX
4094 {"SC_LOGNAME_MAX", _SC_LOGNAME_MAX},
4095#endif
4096#ifdef _SC_LONG_BIT
4097 {"SC_LONG_BIT", _SC_LONG_BIT},
4098#endif
Fred Draked86ed291999-12-15 15:34:33 +00004099#ifdef _SC_MAC
4100 {"SC_MAC", _SC_MAC},
4101#endif
Fred Drakec9680921999-12-13 16:37:25 +00004102#ifdef _SC_MAPPED_FILES
4103 {"SC_MAPPED_FILES", _SC_MAPPED_FILES},
4104#endif
4105#ifdef _SC_MAXPID
4106 {"SC_MAXPID", _SC_MAXPID},
4107#endif
4108#ifdef _SC_MB_LEN_MAX
4109 {"SC_MB_LEN_MAX", _SC_MB_LEN_MAX},
4110#endif
4111#ifdef _SC_MEMLOCK
4112 {"SC_MEMLOCK", _SC_MEMLOCK},
4113#endif
4114#ifdef _SC_MEMLOCK_RANGE
4115 {"SC_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE},
4116#endif
4117#ifdef _SC_MEMORY_PROTECTION
4118 {"SC_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION},
4119#endif
4120#ifdef _SC_MESSAGE_PASSING
4121 {"SC_MESSAGE_PASSING", _SC_MESSAGE_PASSING},
4122#endif
Fred Draked86ed291999-12-15 15:34:33 +00004123#ifdef _SC_MMAP_FIXED_ALIGNMENT
4124 {"SC_MMAP_FIXED_ALIGNMENT", _SC_MMAP_FIXED_ALIGNMENT},
4125#endif
Fred Drakec9680921999-12-13 16:37:25 +00004126#ifdef _SC_MQ_OPEN_MAX
4127 {"SC_MQ_OPEN_MAX", _SC_MQ_OPEN_MAX},
4128#endif
4129#ifdef _SC_MQ_PRIO_MAX
4130 {"SC_MQ_PRIO_MAX", _SC_MQ_PRIO_MAX},
4131#endif
Fred Draked86ed291999-12-15 15:34:33 +00004132#ifdef _SC_NACLS_MAX
4133 {"SC_NACLS_MAX", _SC_NACLS_MAX},
4134#endif
Fred Drakec9680921999-12-13 16:37:25 +00004135#ifdef _SC_NGROUPS_MAX
4136 {"SC_NGROUPS_MAX", _SC_NGROUPS_MAX},
4137#endif
4138#ifdef _SC_NL_ARGMAX
4139 {"SC_NL_ARGMAX", _SC_NL_ARGMAX},
4140#endif
4141#ifdef _SC_NL_LANGMAX
4142 {"SC_NL_LANGMAX", _SC_NL_LANGMAX},
4143#endif
4144#ifdef _SC_NL_MSGMAX
4145 {"SC_NL_MSGMAX", _SC_NL_MSGMAX},
4146#endif
4147#ifdef _SC_NL_NMAX
4148 {"SC_NL_NMAX", _SC_NL_NMAX},
4149#endif
4150#ifdef _SC_NL_SETMAX
4151 {"SC_NL_SETMAX", _SC_NL_SETMAX},
4152#endif
4153#ifdef _SC_NL_TEXTMAX
4154 {"SC_NL_TEXTMAX", _SC_NL_TEXTMAX},
4155#endif
4156#ifdef _SC_NPROCESSORS_CONF
4157 {"SC_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF},
4158#endif
4159#ifdef _SC_NPROCESSORS_ONLN
4160 {"SC_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN},
4161#endif
Fred Draked86ed291999-12-15 15:34:33 +00004162#ifdef _SC_NPROC_CONF
4163 {"SC_NPROC_CONF", _SC_NPROC_CONF},
4164#endif
4165#ifdef _SC_NPROC_ONLN
4166 {"SC_NPROC_ONLN", _SC_NPROC_ONLN},
4167#endif
Fred Drakec9680921999-12-13 16:37:25 +00004168#ifdef _SC_NZERO
4169 {"SC_NZERO", _SC_NZERO},
4170#endif
4171#ifdef _SC_OPEN_MAX
4172 {"SC_OPEN_MAX", _SC_OPEN_MAX},
4173#endif
4174#ifdef _SC_PAGESIZE
4175 {"SC_PAGESIZE", _SC_PAGESIZE},
4176#endif
4177#ifdef _SC_PAGE_SIZE
4178 {"SC_PAGE_SIZE", _SC_PAGE_SIZE},
4179#endif
4180#ifdef _SC_PASS_MAX
4181 {"SC_PASS_MAX", _SC_PASS_MAX},
4182#endif
4183#ifdef _SC_PHYS_PAGES
4184 {"SC_PHYS_PAGES", _SC_PHYS_PAGES},
4185#endif
4186#ifdef _SC_PII
4187 {"SC_PII", _SC_PII},
4188#endif
4189#ifdef _SC_PII_INTERNET
4190 {"SC_PII_INTERNET", _SC_PII_INTERNET},
4191#endif
4192#ifdef _SC_PII_INTERNET_DGRAM
4193 {"SC_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM},
4194#endif
4195#ifdef _SC_PII_INTERNET_STREAM
4196 {"SC_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM},
4197#endif
4198#ifdef _SC_PII_OSI
4199 {"SC_PII_OSI", _SC_PII_OSI},
4200#endif
4201#ifdef _SC_PII_OSI_CLTS
4202 {"SC_PII_OSI_CLTS", _SC_PII_OSI_CLTS},
4203#endif
4204#ifdef _SC_PII_OSI_COTS
4205 {"SC_PII_OSI_COTS", _SC_PII_OSI_COTS},
4206#endif
4207#ifdef _SC_PII_OSI_M
4208 {"SC_PII_OSI_M", _SC_PII_OSI_M},
4209#endif
4210#ifdef _SC_PII_SOCKET
4211 {"SC_PII_SOCKET", _SC_PII_SOCKET},
4212#endif
4213#ifdef _SC_PII_XTI
4214 {"SC_PII_XTI", _SC_PII_XTI},
4215#endif
4216#ifdef _SC_POLL
4217 {"SC_POLL", _SC_POLL},
4218#endif
4219#ifdef _SC_PRIORITIZED_IO
4220 {"SC_PRIORITIZED_IO", _SC_PRIORITIZED_IO},
4221#endif
4222#ifdef _SC_PRIORITY_SCHEDULING
4223 {"SC_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING},
4224#endif
4225#ifdef _SC_REALTIME_SIGNALS
4226 {"SC_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS},
4227#endif
4228#ifdef _SC_RE_DUP_MAX
4229 {"SC_RE_DUP_MAX", _SC_RE_DUP_MAX},
4230#endif
4231#ifdef _SC_RTSIG_MAX
4232 {"SC_RTSIG_MAX", _SC_RTSIG_MAX},
4233#endif
4234#ifdef _SC_SAVED_IDS
4235 {"SC_SAVED_IDS", _SC_SAVED_IDS},
4236#endif
4237#ifdef _SC_SCHAR_MAX
4238 {"SC_SCHAR_MAX", _SC_SCHAR_MAX},
4239#endif
4240#ifdef _SC_SCHAR_MIN
4241 {"SC_SCHAR_MIN", _SC_SCHAR_MIN},
4242#endif
4243#ifdef _SC_SELECT
4244 {"SC_SELECT", _SC_SELECT},
4245#endif
4246#ifdef _SC_SEMAPHORES
4247 {"SC_SEMAPHORES", _SC_SEMAPHORES},
4248#endif
4249#ifdef _SC_SEM_NSEMS_MAX
4250 {"SC_SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX},
4251#endif
4252#ifdef _SC_SEM_VALUE_MAX
4253 {"SC_SEM_VALUE_MAX", _SC_SEM_VALUE_MAX},
4254#endif
4255#ifdef _SC_SHARED_MEMORY_OBJECTS
4256 {"SC_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS},
4257#endif
4258#ifdef _SC_SHRT_MAX
4259 {"SC_SHRT_MAX", _SC_SHRT_MAX},
4260#endif
4261#ifdef _SC_SHRT_MIN
4262 {"SC_SHRT_MIN", _SC_SHRT_MIN},
4263#endif
4264#ifdef _SC_SIGQUEUE_MAX
4265 {"SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX},
4266#endif
4267#ifdef _SC_SIGRT_MAX
4268 {"SC_SIGRT_MAX", _SC_SIGRT_MAX},
4269#endif
4270#ifdef _SC_SIGRT_MIN
4271 {"SC_SIGRT_MIN", _SC_SIGRT_MIN},
4272#endif
Fred Draked86ed291999-12-15 15:34:33 +00004273#ifdef _SC_SOFTPOWER
4274 {"SC_SOFTPOWER", _SC_SOFTPOWER},
4275#endif
Fred Drakec9680921999-12-13 16:37:25 +00004276#ifdef _SC_SPLIT_CACHE
4277 {"SC_SPLIT_CACHE", _SC_SPLIT_CACHE},
4278#endif
4279#ifdef _SC_SSIZE_MAX
4280 {"SC_SSIZE_MAX", _SC_SSIZE_MAX},
4281#endif
4282#ifdef _SC_STACK_PROT
4283 {"SC_STACK_PROT", _SC_STACK_PROT},
4284#endif
4285#ifdef _SC_STREAM_MAX
4286 {"SC_STREAM_MAX", _SC_STREAM_MAX},
4287#endif
4288#ifdef _SC_SYNCHRONIZED_IO
4289 {"SC_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO},
4290#endif
4291#ifdef _SC_THREADS
4292 {"SC_THREADS", _SC_THREADS},
4293#endif
4294#ifdef _SC_THREAD_ATTR_STACKADDR
4295 {"SC_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR},
4296#endif
4297#ifdef _SC_THREAD_ATTR_STACKSIZE
4298 {"SC_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE},
4299#endif
4300#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS
4301 {"SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS},
4302#endif
4303#ifdef _SC_THREAD_KEYS_MAX
4304 {"SC_THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX},
4305#endif
4306#ifdef _SC_THREAD_PRIORITY_SCHEDULING
4307 {"SC_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING},
4308#endif
4309#ifdef _SC_THREAD_PRIO_INHERIT
4310 {"SC_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT},
4311#endif
4312#ifdef _SC_THREAD_PRIO_PROTECT
4313 {"SC_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT},
4314#endif
4315#ifdef _SC_THREAD_PROCESS_SHARED
4316 {"SC_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED},
4317#endif
4318#ifdef _SC_THREAD_SAFE_FUNCTIONS
4319 {"SC_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS},
4320#endif
4321#ifdef _SC_THREAD_STACK_MIN
4322 {"SC_THREAD_STACK_MIN", _SC_THREAD_STACK_MIN},
4323#endif
4324#ifdef _SC_THREAD_THREADS_MAX
4325 {"SC_THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX},
4326#endif
4327#ifdef _SC_TIMERS
4328 {"SC_TIMERS", _SC_TIMERS},
4329#endif
4330#ifdef _SC_TIMER_MAX
4331 {"SC_TIMER_MAX", _SC_TIMER_MAX},
4332#endif
4333#ifdef _SC_TTY_NAME_MAX
4334 {"SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX},
4335#endif
4336#ifdef _SC_TZNAME_MAX
4337 {"SC_TZNAME_MAX", _SC_TZNAME_MAX},
4338#endif
4339#ifdef _SC_T_IOV_MAX
4340 {"SC_T_IOV_MAX", _SC_T_IOV_MAX},
4341#endif
4342#ifdef _SC_UCHAR_MAX
4343 {"SC_UCHAR_MAX", _SC_UCHAR_MAX},
4344#endif
4345#ifdef _SC_UINT_MAX
4346 {"SC_UINT_MAX", _SC_UINT_MAX},
4347#endif
4348#ifdef _SC_UIO_MAXIOV
4349 {"SC_UIO_MAXIOV", _SC_UIO_MAXIOV},
4350#endif
4351#ifdef _SC_ULONG_MAX
4352 {"SC_ULONG_MAX", _SC_ULONG_MAX},
4353#endif
4354#ifdef _SC_USHRT_MAX
4355 {"SC_USHRT_MAX", _SC_USHRT_MAX},
4356#endif
4357#ifdef _SC_VERSION
4358 {"SC_VERSION", _SC_VERSION},
4359#endif
4360#ifdef _SC_WORD_BIT
4361 {"SC_WORD_BIT", _SC_WORD_BIT},
4362#endif
4363#ifdef _SC_XBS5_ILP32_OFF32
4364 {"SC_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32},
4365#endif
4366#ifdef _SC_XBS5_ILP32_OFFBIG
4367 {"SC_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG},
4368#endif
4369#ifdef _SC_XBS5_LP64_OFF64
4370 {"SC_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64},
4371#endif
4372#ifdef _SC_XBS5_LPBIG_OFFBIG
4373 {"SC_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG},
4374#endif
4375#ifdef _SC_XOPEN_CRYPT
4376 {"SC_XOPEN_CRYPT", _SC_XOPEN_CRYPT},
4377#endif
4378#ifdef _SC_XOPEN_ENH_I18N
4379 {"SC_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N},
4380#endif
4381#ifdef _SC_XOPEN_LEGACY
4382 {"SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY},
4383#endif
4384#ifdef _SC_XOPEN_REALTIME
4385 {"SC_XOPEN_REALTIME", _SC_XOPEN_REALTIME},
4386#endif
4387#ifdef _SC_XOPEN_REALTIME_THREADS
4388 {"SC_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS},
4389#endif
4390#ifdef _SC_XOPEN_SHM
4391 {"SC_XOPEN_SHM", _SC_XOPEN_SHM},
4392#endif
4393#ifdef _SC_XOPEN_UNIX
4394 {"SC_XOPEN_UNIX", _SC_XOPEN_UNIX},
4395#endif
4396#ifdef _SC_XOPEN_VERSION
4397 {"SC_XOPEN_VERSION", _SC_XOPEN_VERSION},
4398#endif
4399#ifdef _SC_XOPEN_XCU_VERSION
4400 {"SC_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION},
4401#endif
4402#ifdef _SC_XOPEN_XPG2
4403 {"SC_XOPEN_XPG2", _SC_XOPEN_XPG2},
4404#endif
4405#ifdef _SC_XOPEN_XPG3
4406 {"SC_XOPEN_XPG3", _SC_XOPEN_XPG3},
4407#endif
4408#ifdef _SC_XOPEN_XPG4
4409 {"SC_XOPEN_XPG4", _SC_XOPEN_XPG4},
4410#endif
4411};
4412
4413static int
4414conv_sysconf_confname(arg, valuep)
4415 PyObject *arg;
4416 int *valuep;
4417{
4418 return conv_confname(arg, valuep, posix_constants_sysconf,
4419 sizeof(posix_constants_sysconf)
4420 / sizeof(struct constdef));
4421}
4422
4423static char posix_sysconf__doc__[] = "\
4424sysconf(name) -> integer\n\
4425Return an integer-valued system configuration variable.";
4426
4427static PyObject *
4428posix_sysconf(self, args)
4429 PyObject *self;
4430 PyObject *args;
4431{
4432 PyObject *result = NULL;
4433 int name;
4434
4435 if (PyArg_ParseTuple(args, "O&:sysconf", conv_sysconf_confname, &name)) {
4436 int value;
4437
4438 errno = 0;
4439 value = sysconf(name);
4440 if (value == -1 && errno != 0)
4441 posix_error();
4442 else
4443 result = PyInt_FromLong(value);
4444 }
4445 return result;
4446}
4447#endif
4448
4449
Fred Drakebec628d1999-12-15 18:31:10 +00004450/* This code is used to ensure that the tables of configuration value names
4451 * are in sorted order as required by conv_confname(), and also to build the
4452 * the exported dictionaries that are used to publish information about the
4453 * names available on the host platform.
4454 *
4455 * Sorting the table at runtime ensures that the table is properly ordered
4456 * when used, even for platforms we're not able to test on. It also makes
4457 * it easier to add additional entries to the tables.
Fred Draked86ed291999-12-15 15:34:33 +00004458 */
Fred Drakebec628d1999-12-15 18:31:10 +00004459
4460static int
4461cmp_constdefs(v1, v2)
4462 const void *v1;
4463 const void *v2;
4464{
4465 const struct constdef *c1 =
4466 (const struct constdef *) v1;
4467 const struct constdef *c2 =
4468 (const struct constdef *) v2;
4469
4470 return strcmp(c1->name, c2->name);
4471}
4472
4473static int
4474setup_confname_table(table, tablesize, tablename, moddict)
Fred Draked86ed291999-12-15 15:34:33 +00004475 struct constdef *table;
4476 size_t tablesize;
Fred Drakebec628d1999-12-15 18:31:10 +00004477 char * tablename;
4478 PyObject *moddict;
Fred Draked86ed291999-12-15 15:34:33 +00004479{
Fred Drakebec628d1999-12-15 18:31:10 +00004480 PyObject *d = NULL;
Barry Warsaw3155db32000-04-13 15:20:40 +00004481 size_t i;
4482 int status;
Fred Drakebec628d1999-12-15 18:31:10 +00004483
4484 qsort(table, tablesize, sizeof(struct constdef), cmp_constdefs);
4485 d = PyDict_New();
Barry Warsaw3155db32000-04-13 15:20:40 +00004486 if (d == NULL)
4487 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004488
Barry Warsaw3155db32000-04-13 15:20:40 +00004489 for (i=0; i < tablesize; ++i) {
4490 PyObject *o = PyInt_FromLong(table[i].value);
4491 if (o == NULL || PyDict_SetItemString(d, table[i].name, o) == -1) {
4492 Py_XDECREF(o);
4493 Py_DECREF(d);
4494 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004495 }
Barry Warsaw3155db32000-04-13 15:20:40 +00004496 Py_DECREF(o);
Fred Draked86ed291999-12-15 15:34:33 +00004497 }
Barry Warsaw3155db32000-04-13 15:20:40 +00004498 status = PyDict_SetItemString(moddict, tablename, d);
4499 Py_DECREF(d);
4500 return status;
Fred Draked86ed291999-12-15 15:34:33 +00004501}
4502
Fred Drakebec628d1999-12-15 18:31:10 +00004503/* Return -1 on failure, 0 on success. */
4504static int
4505setup_confname_tables(moddict)
4506 PyObject *moddict;
Fred Draked86ed291999-12-15 15:34:33 +00004507{
4508#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
Fred Drakebec628d1999-12-15 18:31:10 +00004509 if (setup_confname_table(posix_constants_pathconf,
Fred Draked86ed291999-12-15 15:34:33 +00004510 sizeof(posix_constants_pathconf)
4511 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004512 "pathconf_names", moddict))
4513 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004514#endif
4515#ifdef HAVE_CONFSTR
Fred Drakebec628d1999-12-15 18:31:10 +00004516 if (setup_confname_table(posix_constants_confstr,
Fred Draked86ed291999-12-15 15:34:33 +00004517 sizeof(posix_constants_confstr)
4518 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004519 "confstr_names", moddict))
4520 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004521#endif
4522#ifdef HAVE_SYSCONF
Fred Drakebec628d1999-12-15 18:31:10 +00004523 if (setup_confname_table(posix_constants_sysconf,
Fred Draked86ed291999-12-15 15:34:33 +00004524 sizeof(posix_constants_sysconf)
4525 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004526 "sysconf_names", moddict))
4527 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004528#endif
Fred Drakebec628d1999-12-15 18:31:10 +00004529 return 0;
Fred Draked86ed291999-12-15 15:34:33 +00004530}
Fred Draked86ed291999-12-15 15:34:33 +00004531
4532
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004533static char posix_abort__doc__[] = "\
4534abort() -> does not return!\n\
4535Abort the interpreter immediately. This 'dumps core' or otherwise fails\n\
4536in the hardest way possible on the hosting operating system.";
4537
4538static PyObject *
4539posix_abort(self, args)
4540 PyObject *self;
4541 PyObject *args;
4542{
4543 if (!PyArg_ParseTuple(args, ":abort"))
4544 return NULL;
4545 abort();
4546 /*NOTREACHED*/
4547 Py_FatalError("abort() called from Python code didn't abort!");
4548 return NULL;
4549}
Fred Drakebec628d1999-12-15 18:31:10 +00004550
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004551
4552static PyMethodDef posix_methods[] = {
4553 {"access", posix_access, METH_VARARGS, posix_access__doc__},
4554#ifdef HAVE_TTYNAME
4555 {"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__},
4556#endif
4557 {"chdir", posix_chdir, METH_VARARGS, posix_chdir__doc__},
4558 {"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004559#ifdef HAVE_CHOWN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004560 {"chown", posix_chown, METH_VARARGS, posix_chown__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004561#endif /* HAVE_CHOWN */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004562#ifdef HAVE_CTERMID
4563 {"ctermid", posix_ctermid, METH_VARARGS, posix_ctermid__doc__},
4564#endif
Guido van Rossum36bc6801995-06-14 22:54:23 +00004565#ifdef HAVE_GETCWD
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004566 {"getcwd", posix_getcwd, METH_VARARGS, posix_getcwd__doc__},
Guido van Rossum36bc6801995-06-14 22:54:23 +00004567#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004568#ifdef HAVE_LINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004569 {"link", posix_link, METH_VARARGS, posix_link__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004570#endif /* HAVE_LINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004571 {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__},
4572 {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__},
4573 {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004574#ifdef HAVE_NICE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004575 {"nice", posix_nice, METH_VARARGS, posix_nice__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004576#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004577#ifdef HAVE_READLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004578 {"readlink", posix_readlink, METH_VARARGS, posix_readlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004579#endif /* HAVE_READLINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004580 {"rename", posix_rename, METH_VARARGS, posix_rename__doc__},
4581 {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__},
4582 {"stat", posix_stat, METH_VARARGS, posix_stat__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004583#ifdef HAVE_SYMLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004584 {"symlink", posix_symlink, METH_VARARGS, posix_symlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004585#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004586#ifdef HAVE_SYSTEM
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004587 {"system", posix_system, METH_VARARGS, posix_system__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004588#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004589 {"umask", posix_umask, METH_VARARGS, posix_umask__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004590#ifdef HAVE_UNAME
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004591 {"uname", posix_uname, METH_VARARGS, posix_uname__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004592#endif /* HAVE_UNAME */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004593 {"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__},
4594 {"remove", posix_unlink, METH_VARARGS, posix_remove__doc__},
4595 {"utime", posix_utime, METH_VARARGS, posix_utime__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004596#ifdef HAVE_TIMES
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004597 {"times", posix_times, METH_VARARGS, posix_times__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004598#endif /* HAVE_TIMES */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004599 {"_exit", posix__exit, METH_VARARGS, posix__exit__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004600#ifdef HAVE_EXECV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004601 {"execv", posix_execv, METH_VARARGS, posix_execv__doc__},
4602 {"execve", posix_execve, METH_VARARGS, posix_execve__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004603#endif /* HAVE_EXECV */
Guido van Rossuma1065681999-01-25 23:20:23 +00004604#ifdef HAVE_SPAWNV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004605 {"spawnv", posix_spawnv, METH_VARARGS, posix_spawnv__doc__},
4606 {"spawnve", posix_spawnve, METH_VARARGS, posix_spawnve__doc__},
Guido van Rossuma1065681999-01-25 23:20:23 +00004607#endif /* HAVE_SPAWNV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004608#ifdef HAVE_FORK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004609 {"fork", posix_fork, METH_VARARGS, posix_fork__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004610#endif /* HAVE_FORK */
Fred Drake8cef4cf2000-06-28 16:40:38 +00004611#ifdef HAVE_OPENPTY
4612 {"openpty", posix_openpty, METH_VARARGS, posix_openpty__doc__},
4613#endif /* HAVE_OPENPTY */
4614#ifdef HAVE_FORKPTY
4615 {"forkpty", posix_forkpty, METH_VARARGS, posix_forkpty__doc__},
4616#endif /* HAVE_FORKPTY */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004617#ifdef HAVE_GETEGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004618 {"getegid", posix_getegid, METH_VARARGS, posix_getegid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004619#endif /* HAVE_GETEGID */
4620#ifdef HAVE_GETEUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004621 {"geteuid", posix_geteuid, METH_VARARGS, posix_geteuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004622#endif /* HAVE_GETEUID */
4623#ifdef HAVE_GETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004624 {"getgid", posix_getgid, METH_VARARGS, posix_getgid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004625#endif /* HAVE_GETGID */
Fred Drakec9680921999-12-13 16:37:25 +00004626#ifdef HAVE_GETGROUPS
4627 {"getgroups", posix_getgroups, METH_VARARGS, posix_getgroups__doc__},
4628#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004629 {"getpid", posix_getpid, METH_VARARGS, posix_getpid__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004630#ifdef HAVE_GETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004631 {"getpgrp", posix_getpgrp, METH_VARARGS, posix_getpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004632#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004633#ifdef HAVE_GETPPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004634 {"getppid", posix_getppid, METH_VARARGS, posix_getppid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004635#endif /* HAVE_GETPPID */
4636#ifdef HAVE_GETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004637 {"getuid", posix_getuid, METH_VARARGS, posix_getuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004638#endif /* HAVE_GETUID */
Fred Drake12c6e2d1999-12-14 21:25:03 +00004639#ifdef HAVE_GETLOGIN
4640 {"getlogin", posix_getlogin, METH_VARARGS, posix_getlogin__doc__},
4641#endif
Guido van Rossumad0ee831995-03-01 10:34:45 +00004642#ifdef HAVE_KILL
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004643 {"kill", posix_kill, METH_VARARGS, posix_kill__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004644#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00004645#ifdef HAVE_PLOCK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004646 {"plock", posix_plock, METH_VARARGS, posix_plock__doc__},
Guido van Rossumc0125471996-06-28 18:55:32 +00004647#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004648#ifdef HAVE_POPEN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004649 {"popen", posix_popen, METH_VARARGS, posix_popen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004650#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004651#ifdef HAVE_SETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004652 {"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004653#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004654#ifdef HAVE_SETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004655 {"setgid", posix_setgid, METH_VARARGS, posix_setgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004656#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004657#ifdef HAVE_SETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004658 {"setpgrp", posix_setpgrp, METH_VARARGS, posix_setpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004659#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004660#ifdef HAVE_WAIT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004661 {"wait", posix_wait, METH_VARARGS, posix_wait__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004662#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004663#ifdef HAVE_WAITPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004664 {"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004665#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004666#ifdef HAVE_SETSID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004667 {"setsid", posix_setsid, METH_VARARGS, posix_setsid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004668#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004669#ifdef HAVE_SETPGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004670 {"setpgid", posix_setpgid, METH_VARARGS, posix_setpgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004671#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004672#ifdef HAVE_TCGETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004673 {"tcgetpgrp", posix_tcgetpgrp, METH_VARARGS, posix_tcgetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004674#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004675#ifdef HAVE_TCSETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004676 {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004677#endif /* HAVE_TCSETPGRP */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004678 {"open", posix_open, METH_VARARGS, posix_open__doc__},
4679 {"close", posix_close, METH_VARARGS, posix_close__doc__},
4680 {"dup", posix_dup, METH_VARARGS, posix_dup__doc__},
4681 {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__},
4682 {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},
4683 {"read", posix_read, METH_VARARGS, posix_read__doc__},
4684 {"write", posix_write, METH_VARARGS, posix_write__doc__},
4685 {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__},
4686 {"fdopen", posix_fdopen, METH_VARARGS, posix_fdopen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004687#ifdef HAVE_PIPE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004688 {"pipe", posix_pipe, METH_VARARGS, posix_pipe__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004689#endif
4690#ifdef HAVE_MKFIFO
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004691 {"mkfifo", posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004692#endif
4693#ifdef HAVE_FTRUNCATE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004694 {"ftruncate", posix_ftruncate, METH_VARARGS, posix_ftruncate__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004695#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004696#ifdef HAVE_PUTENV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004697 {"putenv", posix_putenv, METH_VARARGS, posix_putenv__doc__},
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004698#endif
Guido van Rossumb6a47161997-09-15 22:54:34 +00004699#ifdef HAVE_STRERROR
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004700 {"strerror", posix_strerror, METH_VARARGS, posix_strerror__doc__},
Guido van Rossumb6a47161997-09-15 22:54:34 +00004701#endif
Guido van Rossum21142a01999-01-08 21:05:37 +00004702#ifdef HAVE_FSYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004703 {"fsync", posix_fsync, METH_VARARGS, posix_fsync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004704#endif
4705#ifdef HAVE_FDATASYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004706 {"fdatasync", posix_fdatasync, METH_VARARGS, posix_fdatasync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004707#endif
Guido van Rossumc9641791998-08-04 15:26:23 +00004708#ifdef HAVE_SYS_WAIT_H
4709#ifdef WIFSTOPPED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004710 {"WIFSTOPPED", posix_WIFSTOPPED, METH_VARARGS, posix_WIFSTOPPED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004711#endif /* WIFSTOPPED */
4712#ifdef WIFSIGNALED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004713 {"WIFSIGNALED", posix_WIFSIGNALED, METH_VARARGS, posix_WIFSIGNALED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004714#endif /* WIFSIGNALED */
4715#ifdef WIFEXITED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004716 {"WIFEXITED", posix_WIFEXITED, METH_VARARGS, posix_WIFEXITED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004717#endif /* WIFEXITED */
4718#ifdef WEXITSTATUS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004719 {"WEXITSTATUS", posix_WEXITSTATUS, METH_VARARGS, posix_WEXITSTATUS__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004720#endif /* WEXITSTATUS */
4721#ifdef WTERMSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004722 {"WTERMSIG", posix_WTERMSIG, METH_VARARGS, posix_WTERMSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004723#endif /* WTERMSIG */
4724#ifdef WSTOPSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004725 {"WSTOPSIG", posix_WSTOPSIG, METH_VARARGS, posix_WSTOPSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004726#endif /* WSTOPSIG */
4727#endif /* HAVE_SYS_WAIT_H */
Guido van Rossum94f6f721999-01-06 18:42:14 +00004728#ifdef HAVE_FSTATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004729 {"fstatvfs", posix_fstatvfs, METH_VARARGS, posix_fstatvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004730#endif
4731#ifdef HAVE_STATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004732 {"statvfs", posix_statvfs, METH_VARARGS, posix_statvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004733#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004734#ifdef HAVE_TMPNAM
4735 {"tmpfile", posix_tmpfile, METH_VARARGS, posix_tmpfile__doc__},
4736#endif
4737#ifdef HAVE_TEMPNAM
4738 {"tempnam", posix_tempnam, METH_VARARGS, posix_tempnam__doc__},
4739#endif
4740#ifdef HAVE_TMPNAM
4741 {"tmpnam", posix_tmpnam, METH_VARARGS, posix_tmpnam__doc__},
4742#endif
Fred Drakec9680921999-12-13 16:37:25 +00004743#ifdef HAVE_CONFSTR
4744 {"confstr", posix_confstr, METH_VARARGS, posix_confstr__doc__},
4745#endif
4746#ifdef HAVE_SYSCONF
4747 {"sysconf", posix_sysconf, METH_VARARGS, posix_sysconf__doc__},
4748#endif
4749#ifdef HAVE_FPATHCONF
4750 {"fpathconf", posix_fpathconf, METH_VARARGS, posix_fpathconf__doc__},
4751#endif
4752#ifdef HAVE_PATHCONF
4753 {"pathconf", posix_pathconf, METH_VARARGS, posix_pathconf__doc__},
4754#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004755 {"abort", posix_abort, METH_VARARGS, posix_abort__doc__},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004756 {NULL, NULL} /* Sentinel */
4757};
4758
4759
Barry Warsaw4a342091996-12-19 23:50:02 +00004760static int
4761ins(d, symbol, value)
4762 PyObject* d;
4763 char* symbol;
4764 long value;
4765{
4766 PyObject* v = PyInt_FromLong(value);
4767 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
4768 return -1; /* triggers fatal error */
4769
4770 Py_DECREF(v);
4771 return 0;
4772}
4773
Guido van Rossumd48f2521997-12-05 22:19:34 +00004774#if defined(PYOS_OS2)
4775/* Insert Platform-Specific Constant Values (Strings & Numbers) of Common Use */
4776static int insertvalues(PyObject *d)
4777{
4778 APIRET rc;
4779 ULONG values[QSV_MAX+1];
4780 PyObject *v;
4781 char *ver, tmp[10];
4782
4783 Py_BEGIN_ALLOW_THREADS
4784 rc = DosQuerySysInfo(1, QSV_MAX, &values[1], sizeof(values));
4785 Py_END_ALLOW_THREADS
4786
4787 if (rc != NO_ERROR) {
4788 os2_error(rc);
4789 return -1;
4790 }
4791
4792 if (ins(d, "meminstalled", values[QSV_TOTPHYSMEM])) return -1;
4793 if (ins(d, "memkernel", values[QSV_TOTRESMEM])) return -1;
4794 if (ins(d, "memvirtual", values[QSV_TOTAVAILMEM])) return -1;
4795 if (ins(d, "maxpathlen", values[QSV_MAX_PATH_LENGTH])) return -1;
4796 if (ins(d, "maxnamelen", values[QSV_MAX_COMP_LENGTH])) return -1;
4797 if (ins(d, "revision", values[QSV_VERSION_REVISION])) return -1;
4798 if (ins(d, "timeslice", values[QSV_MIN_SLICE])) return -1;
4799
4800 switch (values[QSV_VERSION_MINOR]) {
4801 case 0: ver = "2.00"; break;
4802 case 10: ver = "2.10"; break;
4803 case 11: ver = "2.11"; break;
4804 case 30: ver = "3.00"; break;
4805 case 40: ver = "4.00"; break;
4806 case 50: ver = "5.00"; break;
4807 default:
4808 sprintf(tmp, "%d-%d", values[QSV_VERSION_MAJOR],
4809 values[QSV_VERSION_MINOR]);
4810 ver = &tmp[0];
4811 }
4812
4813 /* Add Indicator of the Version of the Operating System */
4814 v = PyString_FromString(ver);
4815 if (!v || PyDict_SetItemString(d, "version", v) < 0)
4816 return -1;
4817 Py_DECREF(v);
4818
4819 /* Add Indicator of Which Drive was Used to Boot the System */
4820 tmp[0] = 'A' + values[QSV_BOOT_DRIVE] - 1;
4821 tmp[1] = ':';
4822 tmp[2] = '\0';
4823
4824 v = PyString_FromString(tmp);
4825 if (!v || PyDict_SetItemString(d, "bootdrive", v) < 0)
4826 return -1;
4827 Py_DECREF(v);
4828
4829 return 0;
4830}
4831#endif
4832
Barry Warsaw4a342091996-12-19 23:50:02 +00004833static int
4834all_ins(d)
4835 PyObject* d;
4836{
Guido van Rossum94f6f721999-01-06 18:42:14 +00004837#ifdef F_OK
4838 if (ins(d, "F_OK", (long)F_OK)) return -1;
4839#endif
4840#ifdef R_OK
4841 if (ins(d, "R_OK", (long)R_OK)) return -1;
4842#endif
4843#ifdef W_OK
4844 if (ins(d, "W_OK", (long)W_OK)) return -1;
4845#endif
4846#ifdef X_OK
4847 if (ins(d, "X_OK", (long)X_OK)) return -1;
4848#endif
Fred Drakec9680921999-12-13 16:37:25 +00004849#ifdef NGROUPS_MAX
4850 if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1;
4851#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004852#ifdef TMP_MAX
4853 if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1;
4854#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004855#ifdef WNOHANG
4856 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
4857#endif
4858#ifdef O_RDONLY
4859 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
4860#endif
4861#ifdef O_WRONLY
4862 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
4863#endif
4864#ifdef O_RDWR
4865 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
4866#endif
4867#ifdef O_NDELAY
4868 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
4869#endif
4870#ifdef O_NONBLOCK
4871 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
4872#endif
4873#ifdef O_APPEND
4874 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
4875#endif
4876#ifdef O_DSYNC
4877 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
4878#endif
4879#ifdef O_RSYNC
4880 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
4881#endif
4882#ifdef O_SYNC
4883 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
4884#endif
4885#ifdef O_NOCTTY
4886 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
4887#endif
4888#ifdef O_CREAT
4889 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
4890#endif
4891#ifdef O_EXCL
4892 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
4893#endif
4894#ifdef O_TRUNC
4895 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
4896#endif
Guido van Rossum98d9d091997-08-08 21:48:51 +00004897#ifdef O_BINARY
4898 if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
4899#endif
4900#ifdef O_TEXT
4901 if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
4902#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +00004903
Guido van Rossum246bc171999-02-01 23:54:31 +00004904#ifdef HAVE_SPAWNV
Guido van Rossum7d385291999-02-16 19:38:04 +00004905 if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1;
4906 if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1;
4907 if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1;
4908 if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1;
4909 if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1;
Guido van Rossum246bc171999-02-01 23:54:31 +00004910#endif
4911
Guido van Rossumd48f2521997-12-05 22:19:34 +00004912#if defined(PYOS_OS2)
4913 if (insertvalues(d)) return -1;
4914#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004915 return 0;
4916}
4917
4918
Guido van Rossumc5a0f531997-12-02 20:36:02 +00004919#if ( defined(_MSC_VER) || defined(__WATCOMC__) ) && !defined(__QNX__)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004920#define INITFUNC initnt
4921#define MODNAME "nt"
4922#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004923#if defined(PYOS_OS2)
4924#define INITFUNC initos2
4925#define MODNAME "os2"
4926#else
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004927#define INITFUNC initposix
4928#define MODNAME "posix"
4929#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004930#endif
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004931
Guido van Rossum3886bb61998-12-04 18:50:17 +00004932DL_EXPORT(void)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004933INITFUNC()
Guido van Rossumb6775db1994-08-01 11:34:53 +00004934{
Barry Warsaw53699e91996-12-10 23:23:01 +00004935 PyObject *m, *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00004936
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004937 m = Py_InitModule4(MODNAME,
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004938 posix_methods,
4939 posix__doc__,
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004940 (PyObject *)NULL,
4941 PYTHON_API_VERSION);
Barry Warsaw53699e91996-12-10 23:23:01 +00004942 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004943
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004944 /* Initialize environ dictionary */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004945 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00004946 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004947 return;
Barry Warsaw53699e91996-12-10 23:23:01 +00004948 Py_DECREF(v);
Fred Drakec9680921999-12-13 16:37:25 +00004949
Barry Warsaw4a342091996-12-19 23:50:02 +00004950 if (all_ins(d))
Barry Warsaw4a342091996-12-19 23:50:02 +00004951 return;
4952
Fred Drakebec628d1999-12-15 18:31:10 +00004953 if (setup_confname_tables(d))
4954 return;
4955
Barry Warsawca74da41999-02-09 19:31:45 +00004956 PyDict_SetItemString(d, "error", PyExc_OSError);
Fred Drake762e2061999-08-26 17:23:54 +00004957
Guido van Rossumb3d39562000-01-31 18:41:26 +00004958#ifdef HAVE_PUTENV
Fred Drake762e2061999-08-26 17:23:54 +00004959 posix_putenv_garbage = PyDict_New();
Guido van Rossumb3d39562000-01-31 18:41:26 +00004960#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004961}