blob: 8ae5d2f596b32de61b30e654c37a2a17fc53d601 [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
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287/* Return a dictionary corresponding to the POSIX environment table */
288
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000289#if !defined(_MSC_VER) && ( !defined(__WATCOMC__) || defined(__QNX__) )
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000291#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292
Barry Warsaw53699e91996-12-10 23:23:01 +0000293static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294convertenviron()
295{
Barry Warsaw53699e91996-12-10 23:23:01 +0000296 PyObject *d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000297 char **e;
Barry Warsaw53699e91996-12-10 23:23:01 +0000298 d = PyDict_New();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299 if (d == NULL)
300 return NULL;
301 if (environ == NULL)
302 return d;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000303 /* This part ignores errors */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304 for (e = environ; *e != NULL; e++) {
Guido van Rossum6a619f41999-08-03 19:41:10 +0000305 PyObject *k;
Barry Warsaw53699e91996-12-10 23:23:01 +0000306 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307 char *p = strchr(*e, '=');
308 if (p == NULL)
309 continue;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000310 k = PyString_FromStringAndSize(*e, (int)(p-*e));
311 if (k == NULL) {
312 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313 continue;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000314 }
315 v = PyString_FromString(p+1);
316 if (v == NULL) {
317 PyErr_Clear();
318 Py_DECREF(k);
319 continue;
320 }
321 if (PyDict_GetItem(d, k) == NULL) {
322 if (PyDict_SetItem(d, k, v) != 0)
323 PyErr_Clear();
324 }
325 Py_DECREF(k);
Barry Warsaw53699e91996-12-10 23:23:01 +0000326 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000327 }
Guido van Rossumd48f2521997-12-05 22:19:34 +0000328#if defined(PYOS_OS2)
329 {
330 APIRET rc;
331 char buffer[1024]; /* OS/2 Provides a Documented Max of 1024 Chars */
332
333 rc = DosQueryExtLIBPATH(buffer, BEGIN_LIBPATH);
334 if (rc == NO_ERROR) { /* (not a type, envname is NOT 'BEGIN_LIBPATH') */
335 PyObject *v = PyString_FromString(buffer);
336 PyDict_SetItemString(d, "BEGINLIBPATH", v);
337 Py_DECREF(v);
338 }
339 rc = DosQueryExtLIBPATH(buffer, END_LIBPATH);
340 if (rc == NO_ERROR) { /* (not a typo, envname is NOT 'END_LIBPATH') */
341 PyObject *v = PyString_FromString(buffer);
342 PyDict_SetItemString(d, "ENDLIBPATH", v);
343 Py_DECREF(v);
344 }
345 }
346#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347 return d;
348}
349
350
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000351/* Set a POSIX-specific error from errno, and return NULL */
352
Barry Warsawd58d7641998-07-23 16:14:40 +0000353static PyObject *
354posix_error()
Guido van Rossumad0ee831995-03-01 10:34:45 +0000355{
Barry Warsawca74da41999-02-09 19:31:45 +0000356 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000357}
Barry Warsawd58d7641998-07-23 16:14:40 +0000358static PyObject *
359posix_error_with_filename(name)
360 char* name;
361{
Barry Warsawca74da41999-02-09 19:31:45 +0000362 return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);
Barry Warsawd58d7641998-07-23 16:14:40 +0000363}
364
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365
Guido van Rossumd48f2521997-12-05 22:19:34 +0000366#if defined(PYOS_OS2)
367/**********************************************************************
368 * Helper Function to Trim and Format OS/2 Messages
369 **********************************************************************/
370 static void
371os2_formatmsg(char *msgbuf, int msglen, char *reason)
372{
373 msgbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
374
375 if (strlen(msgbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
376 char *lastc = &msgbuf[ strlen(msgbuf)-1 ];
377
378 while (lastc > msgbuf && isspace(*lastc))
379 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
380 }
381
382 /* Add Optional Reason Text */
383 if (reason) {
384 strcat(msgbuf, " : ");
385 strcat(msgbuf, reason);
386 }
387}
388
389/**********************************************************************
390 * Decode an OS/2 Operating System Error Code
391 *
392 * A convenience function to lookup an OS/2 error code and return a
393 * text message we can use to raise a Python exception.
394 *
395 * Notes:
396 * The messages for errors returned from the OS/2 kernel reside in
397 * the file OSO001.MSG in the \OS2 directory hierarchy.
398 *
399 **********************************************************************/
400 static char *
401os2_strerror(char *msgbuf, int msgbuflen, int errorcode, char *reason)
402{
403 APIRET rc;
404 ULONG msglen;
405
406 /* Retrieve Kernel-Related Error Message from OSO001.MSG File */
407 Py_BEGIN_ALLOW_THREADS
408 rc = DosGetMessage(NULL, 0, msgbuf, msgbuflen,
409 errorcode, "oso001.msg", &msglen);
410 Py_END_ALLOW_THREADS
411
412 if (rc == NO_ERROR)
413 os2_formatmsg(msgbuf, msglen, reason);
414 else
415 sprintf(msgbuf, "unknown OS error #%d", errorcode);
416
417 return msgbuf;
418}
419
420/* Set an OS/2-specific error and return NULL. OS/2 kernel
421 errors are not in a global variable e.g. 'errno' nor are
422 they congruent with posix error numbers. */
423
424static PyObject * os2_error(int code)
425{
426 char text[1024];
427 PyObject *v;
428
429 os2_strerror(text, sizeof(text), code, "");
430
431 v = Py_BuildValue("(is)", code, text);
432 if (v != NULL) {
Barry Warsawca74da41999-02-09 19:31:45 +0000433 PyErr_SetObject(PyExc_OSError, v);
Guido van Rossumd48f2521997-12-05 22:19:34 +0000434 Py_DECREF(v);
435 }
436 return NULL; /* Signal to Python that an Exception is Pending */
437}
438
439#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440
441/* POSIX generic methods */
442
Barry Warsaw53699e91996-12-10 23:23:01 +0000443static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000444posix_int(args, format, func)
Guido van Rossum21142a01999-01-08 21:05:37 +0000445 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000446 char *format;
Guido van Rossum21142a01999-01-08 21:05:37 +0000447 int (*func) Py_FPROTO((int));
448{
449 int fd;
450 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000451 if (!PyArg_ParseTuple(args, format, &fd))
Guido van Rossum21142a01999-01-08 21:05:37 +0000452 return NULL;
453 Py_BEGIN_ALLOW_THREADS
454 res = (*func)(fd);
455 Py_END_ALLOW_THREADS
456 if (res < 0)
457 return posix_error();
458 Py_INCREF(Py_None);
459 return Py_None;
460}
461
462
463static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000464posix_1str(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000465 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000466 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000467 int (*func) Py_FPROTO((const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000468{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000469 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000470 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000471 if (!PyArg_ParseTuple(args, format, &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000473 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000474 res = (*func)(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000475 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000476 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000477 return posix_error_with_filename(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000478 Py_INCREF(Py_None);
479 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000480}
481
Barry Warsaw53699e91996-12-10 23:23:01 +0000482static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000483posix_2str(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000484 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000485 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000486 int (*func) Py_FPROTO((const char *, const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000488 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000489 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000490 if (!PyArg_ParseTuple(args, format, &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000491 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000492 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000493 res = (*func)(path1, path2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000494 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000495 if (res != 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000496 /* XXX how to report both path1 and path2??? */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000497 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000498 Py_INCREF(Py_None);
499 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000500}
501
Barry Warsaw53699e91996-12-10 23:23:01 +0000502static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000503posix_strint(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000504 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000505 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000506 int (*func) Py_FPROTO((const char *, int));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000507{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000508 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000509 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000510 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000511 if (!PyArg_ParseTuple(args, format, &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000512 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000513 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000514 res = (*func)(path, i);
Barry Warsaw53699e91996-12-10 23:23:01 +0000515 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000516 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000517 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +0000518 Py_INCREF(Py_None);
519 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000520}
521
Barry Warsaw53699e91996-12-10 23:23:01 +0000522static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000523posix_strintint(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000524 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000525 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000526 int (*func) Py_FPROTO((const char *, int, int));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000527{
528 char *path;
529 int i,i2;
530 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000531 if (!PyArg_ParseTuple(args, format, &path, &i, &i2))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000532 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000533 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000534 res = (*func)(path, i, i2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000535 Py_END_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000536 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000537 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +0000538 Py_INCREF(Py_None);
539 return Py_None;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000540}
541
Barry Warsaw53699e91996-12-10 23:23:01 +0000542static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000543posix_do_stat(self, args, format, statfunc)
Barry Warsaw53699e91996-12-10 23:23:01 +0000544 PyObject *self;
545 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000546 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000547 int (*statfunc) Py_FPROTO((const char *, struct stat *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000548{
549 struct stat st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000550 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000551 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000552 if (!PyArg_ParseTuple(args, format, &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000553 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000554 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000555 res = (*statfunc)(path, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +0000556 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000557 if (res != 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000558 return posix_error_with_filename(path);
Guido van Rossum94f6f721999-01-06 18:42:14 +0000559#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +0000560 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +0000561 (long)st.st_mode,
562 (long)st.st_ino,
563 (long)st.st_dev,
564 (long)st.st_nlink,
565 (long)st.st_uid,
566 (long)st.st_gid,
567 (long)st.st_size,
568 (long)st.st_atime,
569 (long)st.st_mtime,
570 (long)st.st_ctime);
571#else
572 return Py_BuildValue("(lLllllLlll)",
573 (long)st.st_mode,
574 (LONG_LONG)st.st_ino,
575 (long)st.st_dev,
576 (long)st.st_nlink,
577 (long)st.st_uid,
578 (long)st.st_gid,
579 (LONG_LONG)st.st_size,
580 (long)st.st_atime,
581 (long)st.st_mtime,
582 (long)st.st_ctime);
583#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000584}
585
586
587/* POSIX methods */
588
Guido van Rossum94f6f721999-01-06 18:42:14 +0000589static char posix_access__doc__[] =
Guido van Rossum015f22a1999-01-06 22:52:38 +0000590"access(path, mode) -> 1 if granted, 0 otherwise\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +0000591Test for access to a file.";
592
593static PyObject *
594posix_access(self, args)
595 PyObject *self;
596 PyObject *args;
597{
Guido van Rossum015f22a1999-01-06 22:52:38 +0000598 char *path;
599 int mode;
600 int res;
601
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000602 if (!PyArg_ParseTuple(args, "si:access", &path, &mode))
Guido van Rossum015f22a1999-01-06 22:52:38 +0000603 return NULL;
604 Py_BEGIN_ALLOW_THREADS
605 res = access(path, mode);
606 Py_END_ALLOW_THREADS
607 return(PyInt_FromLong(res == 0 ? 1L : 0L));
Guido van Rossum94f6f721999-01-06 18:42:14 +0000608}
609
Guido van Rossumd371ff11999-01-25 16:12:23 +0000610#ifndef F_OK
611#define F_OK 0
612#endif
613#ifndef R_OK
614#define R_OK 4
615#endif
616#ifndef W_OK
617#define W_OK 2
618#endif
619#ifndef X_OK
620#define X_OK 1
621#endif
622
623#ifdef HAVE_TTYNAME
Guido van Rossum94f6f721999-01-06 18:42:14 +0000624static char posix_ttyname__doc__[] =
Guido van Rossum61eeb041999-02-22 15:29:15 +0000625"ttyname(fd) -> String\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +0000626Return the name of the terminal device connected to 'fd'.";
627
628static PyObject *
629posix_ttyname(self, args)
630 PyObject *self;
631 PyObject *args;
632{
Guido van Rossum94f6f721999-01-06 18:42:14 +0000633 int id;
634 char *ret;
635
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000636 if (!PyArg_ParseTuple(args, "i:ttyname", &id))
Guido van Rossum94f6f721999-01-06 18:42:14 +0000637 return NULL;
638
Guido van Rossum94f6f721999-01-06 18:42:14 +0000639 ret = ttyname(id);
640 if (ret == NULL)
641 return(posix_error());
642 return(PyString_FromString(ret));
643}
Guido van Rossumd371ff11999-01-25 16:12:23 +0000644#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +0000645
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000646#ifdef HAVE_CTERMID
647static char posix_ctermid__doc__[] =
648"ctermid() -> String\n\
649Return the name of the controlling terminal for this process.";
650
651static PyObject *
652posix_ctermid(self, args)
653 PyObject *self;
654 PyObject *args;
655{
656 char *ret;
657 char buffer[L_ctermid];
658
659 if (!PyArg_ParseTuple(args, ":ctermid"))
660 return NULL;
661
Greg Wardb48bc172000-03-01 21:51:56 +0000662#ifdef USE_CTERMID_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000663 ret = ctermid_r(buffer);
664#else
665 ret = ctermid(buffer);
666#endif
667 if (ret == NULL)
668 return(posix_error());
669 return(PyString_FromString(buffer));
670}
671#endif
672
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000673static char posix_chdir__doc__[] =
674"chdir(path) -> None\n\
675Change the current working directory to the specified path.";
676
Barry Warsaw53699e91996-12-10 23:23:01 +0000677static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000678posix_chdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000679 PyObject *self;
680 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000681{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000682 return posix_1str(args, "s:chdir", chdir);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000683}
684
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000685
686static char posix_chmod__doc__[] =
687"chmod(path, mode) -> None\n\
688Change the access permissions of a file.";
689
Barry Warsaw53699e91996-12-10 23:23:01 +0000690static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000691posix_chmod(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000692 PyObject *self;
693 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000694{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000695 return posix_strint(args, "si:chmod", chmod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000696}
697
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000698
Guido van Rossum21142a01999-01-08 21:05:37 +0000699#ifdef HAVE_FSYNC
700static char posix_fsync__doc__[] =
701"fsync(fildes) -> None\n\
702force write of file with filedescriptor to disk.";
703
704static PyObject *
705posix_fsync(self, args)
706 PyObject *self;
707 PyObject *args;
708{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000709 return posix_int(args, "i:fsync", fsync);
Guido van Rossum21142a01999-01-08 21:05:37 +0000710}
711#endif /* HAVE_FSYNC */
712
713#ifdef HAVE_FDATASYNC
714static char posix_fdatasync__doc__[] =
715"fdatasync(fildes) -> None\n\
716force write of file with filedescriptor to disk.\n\
717 does not force update of metadata.";
718
Guido van Rossum5d00b6d1999-01-08 21:28:05 +0000719extern int fdatasync(int); /* Prototype just in case */
720
Guido van Rossum21142a01999-01-08 21:05:37 +0000721static PyObject *
722posix_fdatasync(self, args)
723 PyObject *self;
724 PyObject *args;
725{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000726 return posix_int(args, "i:fdatasync", fdatasync);
Guido van Rossum21142a01999-01-08 21:05:37 +0000727}
728#endif /* HAVE_FDATASYNC */
729
730
Guido van Rossumb6775db1994-08-01 11:34:53 +0000731#ifdef HAVE_CHOWN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000732static char posix_chown__doc__[] =
733"chown(path, uid, gid) -> None\n\
734Change the owner and group id of path to the numeric uid and gid.";
735
Barry Warsaw53699e91996-12-10 23:23:01 +0000736static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000737posix_chown(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000738 PyObject *self;
739 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000740{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000741 return posix_strintint(args, "sii:chown", chown);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000742}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000743#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000744
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000745
Guido van Rossum36bc6801995-06-14 22:54:23 +0000746#ifdef HAVE_GETCWD
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000747static char posix_getcwd__doc__[] =
748"getcwd() -> path\n\
749Return a string representing the current working directory.";
750
Barry Warsaw53699e91996-12-10 23:23:01 +0000751static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000752posix_getcwd(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000753 PyObject *self;
754 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000755{
756 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000757 char *res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000758 if (!PyArg_ParseTuple(args, ":getcwd"))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000759 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000760 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000761 res = getcwd(buf, sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +0000762 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000763 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000764 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000765 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000766}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000767#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000768
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000769
Guido van Rossumb6775db1994-08-01 11:34:53 +0000770#ifdef HAVE_LINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000771static char posix_link__doc__[] =
772"link(src, dst) -> None\n\
773Create a hard link to a file.";
774
Barry Warsaw53699e91996-12-10 23:23:01 +0000775static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000776posix_link(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000777 PyObject *self;
778 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000779{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000780 return posix_2str(args, "ss:link", link);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000781}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000782#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000783
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000784
785static char posix_listdir__doc__[] =
786"listdir(path) -> list_of_strings\n\
787Return a list containing the names of the entries in the directory.\n\
788\n\
789 path: path of directory to list\n\
790\n\
791The list is in arbitrary order. It does not include the special\n\
792entries '.' and '..' even if they are present in the directory.";
793
Barry Warsaw53699e91996-12-10 23:23:01 +0000794static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000795posix_listdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000796 PyObject *self;
797 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000798{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000799 /* XXX Should redo this putting the (now four) versions of opendir
Guido van Rossum6d8841c1997-08-14 19:57:39 +0000800 in separate files instead of having them all here... */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000801#if defined(MS_WIN32) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000802
Guido van Rossumb6775db1994-08-01 11:34:53 +0000803 char *name;
804 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000805 PyObject *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000806 HANDLE hFindFile;
807 WIN32_FIND_DATA FileData;
808 char namebuf[MAX_PATH+5];
809
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000810 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000811 return NULL;
812 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000813 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000814 return NULL;
815 }
816 strcpy(namebuf, name);
817 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
818 namebuf[len++] = '/';
819 strcpy(namebuf + len, "*.*");
820
Barry Warsaw53699e91996-12-10 23:23:01 +0000821 if ((d = PyList_New(0)) == NULL)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000822 return NULL;
823
824 hFindFile = FindFirstFile(namebuf, &FileData);
825 if (hFindFile == INVALID_HANDLE_VALUE) {
826 errno = GetLastError();
Guido van Rossum617bc191998-08-06 03:23:32 +0000827 if (errno == ERROR_FILE_NOT_FOUND)
828 return PyList_New(0);
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000829 return posix_error_with_filename(name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000830 }
831 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000832 if (FileData.cFileName[0] == '.' &&
833 (FileData.cFileName[1] == '\0' ||
834 FileData.cFileName[1] == '.' &&
835 FileData.cFileName[2] == '\0'))
836 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000837 v = PyString_FromString(FileData.cFileName);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000838 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000839 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000840 d = NULL;
841 break;
842 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000843 if (PyList_Append(d, v) != 0) {
844 Py_DECREF(v);
845 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000846 d = NULL;
847 break;
848 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000849 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000850 } while (FindNextFile(hFindFile, &FileData) == TRUE);
851
852 if (FindClose(hFindFile) == FALSE) {
853 errno = GetLastError();
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000854 return posix_error_with_filename(&name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000855 }
856
857 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000858
Guido van Rossum8d665e61996-06-26 18:22:49 +0000859#else /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000860#ifdef _MSC_VER /* 16-bit Windows */
861
862#ifndef MAX_PATH
863#define MAX_PATH 250
864#endif
865 char *name, *pt;
866 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000867 PyObject *d, *v;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000868 char namebuf[MAX_PATH+5];
869 struct _find_t ep;
870
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000871 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000872 return NULL;
873 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000874 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000875 return NULL;
876 }
877 strcpy(namebuf, name);
878 for (pt = namebuf; *pt; pt++)
879 if (*pt == '/')
880 *pt = '\\';
881 if (namebuf[len-1] != '\\')
882 namebuf[len++] = '\\';
883 strcpy(namebuf + len, "*.*");
884
Barry Warsaw53699e91996-12-10 23:23:01 +0000885 if ((d = PyList_New(0)) == NULL)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000886 return NULL;
887
888 if (_dos_findfirst(namebuf, _A_RDONLY |
Barry Warsaw43d68b81996-12-19 22:10:44 +0000889 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0)
890 {
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000891 errno = ENOENT;
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000892 return posix_error_with_filename(name);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000893 }
894 do {
895 if (ep.name[0] == '.' &&
896 (ep.name[1] == '\0' ||
897 ep.name[1] == '.' &&
898 ep.name[2] == '\0'))
899 continue;
900 strcpy(namebuf, ep.name);
901 for (pt = namebuf; *pt; pt++)
902 if (isupper(*pt))
903 *pt = tolower(*pt);
Barry Warsaw53699e91996-12-10 23:23:01 +0000904 v = PyString_FromString(namebuf);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000905 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000906 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000907 d = NULL;
908 break;
909 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000910 if (PyList_Append(d, v) != 0) {
911 Py_DECREF(v);
912 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000913 d = NULL;
914 break;
915 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000916 Py_DECREF(v);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000917 } while (_dos_findnext(&ep) == 0);
918
919 return d;
920
921#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000922#if defined(PYOS_OS2)
923
924#ifndef MAX_PATH
925#define MAX_PATH CCHMAXPATH
926#endif
927 char *name, *pt;
928 int len;
929 PyObject *d, *v;
930 char namebuf[MAX_PATH+5];
931 HDIR hdir = 1;
932 ULONG srchcnt = 1;
933 FILEFINDBUF3 ep;
934 APIRET rc;
935
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000936 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000937 return NULL;
938 if (len >= MAX_PATH) {
939 PyErr_SetString(PyExc_ValueError, "path too long");
940 return NULL;
941 }
942 strcpy(namebuf, name);
943 for (pt = namebuf; *pt; pt++)
944 if (*pt == '/')
945 *pt = '\\';
946 if (namebuf[len-1] != '\\')
947 namebuf[len++] = '\\';
948 strcpy(namebuf + len, "*.*");
949
950 if ((d = PyList_New(0)) == NULL)
951 return NULL;
952
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000953 rc = DosFindFirst(namebuf, /* Wildcard Pattern to Match */
954 &hdir, /* Handle to Use While Search Directory */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000955 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000956 &ep, sizeof(ep), /* Structure to Receive Directory Entry */
957 &srchcnt, /* Max and Actual Count of Entries Per Iteration */
958 FIL_STANDARD); /* Format of Entry (EAs or Not) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000959
960 if (rc != NO_ERROR) {
961 errno = ENOENT;
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000962 return posix_error_with_filename(name);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000963 }
964
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000965 if (srchcnt > 0) { /* If Directory is NOT Totally Empty, */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000966 do {
967 if (ep.achName[0] == '.'
968 && (ep.achName[1] == '\0' || ep.achName[1] == '.' && ep.achName[2] == '\0'))
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000969 continue; /* Skip Over "." and ".." Names */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000970
971 strcpy(namebuf, ep.achName);
972
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000973 /* Leave Case of Name Alone -- In Native Form */
974 /* (Removed Forced Lowercasing Code) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000975
976 v = PyString_FromString(namebuf);
977 if (v == NULL) {
978 Py_DECREF(d);
979 d = NULL;
980 break;
981 }
982 if (PyList_Append(d, v) != 0) {
983 Py_DECREF(v);
984 Py_DECREF(d);
985 d = NULL;
986 break;
987 }
988 Py_DECREF(v);
989 } while (DosFindNext(hdir, &ep, sizeof(ep), &srchcnt) == NO_ERROR && srchcnt > 0);
990 }
991
992 return d;
993#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000994
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000995 char *name;
Barry Warsaw53699e91996-12-10 23:23:01 +0000996 PyObject *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000997 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000998 struct dirent *ep;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000999 if (!PyArg_ParseTuple(args, "s:listdir", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001000 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001001 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001002 if ((dirp = opendir(name)) == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001003 Py_BLOCK_THREADS
Barry Warsawf63b8cc1999-05-27 23:13:21 +00001004 return posix_error_with_filename(name);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001005 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001006 if ((d = PyList_New(0)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001007 closedir(dirp);
Barry Warsaw53699e91996-12-10 23:23:01 +00001008 Py_BLOCK_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001009 return NULL;
1010 }
1011 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +00001012 if (ep->d_name[0] == '.' &&
1013 (NAMLEN(ep) == 1 ||
Guido van Rossuma376cc51996-12-05 23:43:35 +00001014 (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
Guido van Rossum24f42ac1995-07-18 18:16:52 +00001015 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +00001016 v = PyString_FromStringAndSize(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001017 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001018 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001019 d = NULL;
1020 break;
1021 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001022 if (PyList_Append(d, v) != 0) {
1023 Py_DECREF(v);
1024 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001025 d = NULL;
1026 break;
1027 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001028 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001029 }
1030 closedir(dirp);
Barry Warsaw53699e91996-12-10 23:23:01 +00001031 Py_END_ALLOW_THREADS
Guido van Rossum0ee42cd1991-04-08 21:01:03 +00001032
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001033 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001034
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001035#endif /* !PYOS_OS2 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001036#endif /* !_MSC_VER */
Guido van Rossum8d665e61996-06-26 18:22:49 +00001037#endif /* !MS_WIN32 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001038}
1039
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001040static char posix_mkdir__doc__[] =
1041"mkdir(path [, mode=0777]) -> None\n\
1042Create a directory.";
1043
Barry Warsaw53699e91996-12-10 23:23:01 +00001044static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001045posix_mkdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001046 PyObject *self;
1047 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001048{
Guido van Rossumb0824db1996-02-25 04:50:32 +00001049 int res;
1050 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001051 int mode = 0777;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001052 if (!PyArg_ParseTuple(args, "s|i:mkdir", &path, &mode))
Guido van Rossumb0824db1996-02-25 04:50:32 +00001053 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001054 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001055#if ( defined(__WATCOMC__) || defined(_MSC_VER) || defined(PYCC_VACPP) ) && !defined(__QNX__)
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001056 res = mkdir(path);
1057#else
Guido van Rossumb0824db1996-02-25 04:50:32 +00001058 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001059#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001060 Py_END_ALLOW_THREADS
Guido van Rossumb0824db1996-02-25 04:50:32 +00001061 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00001062 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00001063 Py_INCREF(Py_None);
1064 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001065}
1066
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001067
Guido van Rossumb6775db1994-08-01 11:34:53 +00001068#ifdef HAVE_NICE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001069static char posix_nice__doc__[] =
1070"nice(inc) -> new_priority\n\
1071Decrease the priority of process and return new priority.";
1072
Barry Warsaw53699e91996-12-10 23:23:01 +00001073static PyObject *
Guido van Rossum775f4da1993-01-09 17:18:52 +00001074posix_nice(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001075 PyObject *self;
1076 PyObject *args;
Guido van Rossum775f4da1993-01-09 17:18:52 +00001077{
1078 int increment, value;
1079
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001080 if (!PyArg_ParseTuple(args, "i:nice", &increment))
Guido van Rossum775f4da1993-01-09 17:18:52 +00001081 return NULL;
1082 value = nice(increment);
1083 if (value == -1)
1084 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001085 return PyInt_FromLong((long) value);
Guido van Rossum775f4da1993-01-09 17:18:52 +00001086}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001087#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001088
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001089
1090static char posix_rename__doc__[] =
1091"rename(old, new) -> None\n\
1092Rename a file or directory.";
1093
Barry Warsaw53699e91996-12-10 23:23:01 +00001094static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001095posix_rename(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001096 PyObject *self;
1097 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001098{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001099 return posix_2str(args, "ss:rename", rename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001100}
1101
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001102
1103static char posix_rmdir__doc__[] =
1104"rmdir(path) -> None\n\
1105Remove a directory.";
1106
Barry Warsaw53699e91996-12-10 23:23:01 +00001107static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001108posix_rmdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001109 PyObject *self;
1110 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001111{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001112 return posix_1str(args, "s:rmdir", rmdir);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001113}
1114
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001115
1116static char posix_stat__doc__[] =
1117"stat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
1118Perform a stat system call on the given path.";
1119
Barry Warsaw53699e91996-12-10 23:23:01 +00001120static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001121posix_stat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001122 PyObject *self;
1123 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001124{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001125 return posix_do_stat(self, args, "s:stat", stat);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001126}
1127
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001128
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001129#ifdef HAVE_SYSTEM
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001130static char posix_system__doc__[] =
1131"system(command) -> exit_status\n\
1132Execute the command (a string) in a subshell.";
1133
Barry Warsaw53699e91996-12-10 23:23:01 +00001134static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001135posix_system(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001136 PyObject *self;
1137 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001138{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001139 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001140 long sts;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001141 if (!PyArg_ParseTuple(args, "s:system", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001142 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001143 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001144 sts = system(command);
Barry Warsaw53699e91996-12-10 23:23:01 +00001145 Py_END_ALLOW_THREADS
1146 return PyInt_FromLong(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001147}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001148#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001149
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001150
1151static char posix_umask__doc__[] =
1152"umask(new_mask) -> old_mask\n\
1153Set the current numeric umask and return the previous umask.";
1154
Barry Warsaw53699e91996-12-10 23:23:01 +00001155static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001156posix_umask(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001157 PyObject *self;
1158 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001159{
1160 int i;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001161 if (!PyArg_ParseTuple(args, "i:umask", &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001162 return NULL;
1163 i = umask(i);
1164 if (i < 0)
1165 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001166 return PyInt_FromLong((long)i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001167}
1168
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001169
1170static char posix_unlink__doc__[] =
1171"unlink(path) -> None\n\
1172Remove a file (same as remove(path)).";
1173
1174static char posix_remove__doc__[] =
1175"remove(path) -> None\n\
1176Remove a file (same as unlink(path)).";
1177
Barry Warsaw53699e91996-12-10 23:23:01 +00001178static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001179posix_unlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001180 PyObject *self;
1181 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001182{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001183 return posix_1str(args, "s:remove", unlink);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001184}
1185
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001186
Guido van Rossumb6775db1994-08-01 11:34:53 +00001187#ifdef HAVE_UNAME
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001188static char posix_uname__doc__[] =
1189"uname() -> (sysname, nodename, release, version, machine)\n\
1190Return a tuple identifying the current operating system.";
1191
Barry Warsaw53699e91996-12-10 23:23:01 +00001192static PyObject *
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001193posix_uname(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001194 PyObject *self;
1195 PyObject *args;
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001196{
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001197 struct utsname u;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001198 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001199 if (!PyArg_ParseTuple(args, ":uname"))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001200 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001201 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001202 res = uname(&u);
Barry Warsaw53699e91996-12-10 23:23:01 +00001203 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001204 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001205 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001206 return Py_BuildValue("(sssss)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00001207 u.sysname,
1208 u.nodename,
1209 u.release,
1210 u.version,
1211 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001212}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001213#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001214
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001215
1216static char posix_utime__doc__[] =
1217"utime(path, (atime, utime)) -> None\n\
1218Set the access and modified time of the file to the given values.";
1219
Barry Warsaw53699e91996-12-10 23:23:01 +00001220static PyObject *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001221posix_utime(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001222 PyObject *self;
1223 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001224{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001225 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +00001226 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001227 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001228
Guido van Rossum6d8841c1997-08-14 19:57:39 +00001229/* XXX should define struct utimbuf instead, above */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001230#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001231 struct utimbuf buf;
1232#define ATIME buf.actime
1233#define MTIME buf.modtime
1234#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001235#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001236 time_t buf[2];
1237#define ATIME buf[0]
1238#define MTIME buf[1]
1239#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001240#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001241
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001242 if (!PyArg_ParseTuple(args, "s(ll):utime", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001243 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +00001244 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +00001245 MTIME = mtime;
Barry Warsaw53699e91996-12-10 23:23:01 +00001246 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001247 res = utime(path, UTIME_ARG);
Barry Warsaw53699e91996-12-10 23:23:01 +00001248 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001249 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00001250 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00001251 Py_INCREF(Py_None);
1252 return Py_None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001253#undef UTIME_ARG
1254#undef ATIME
1255#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001256}
1257
Guido van Rossum85e3b011991-06-03 12:42:10 +00001258
Guido van Rossum3b066191991-06-04 19:40:25 +00001259/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001260
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001261static char posix__exit__doc__[] =
1262"_exit(status)\n\
1263Exit to the system with specified status, without normal exit processing.";
1264
Barry Warsaw53699e91996-12-10 23:23:01 +00001265static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001266posix__exit(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001267 PyObject *self;
1268 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001269{
1270 int sts;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001271 if (!PyArg_ParseTuple(args, "i:_exit", &sts))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001272 return NULL;
1273 _exit(sts);
Guido van Rossuma376cc51996-12-05 23:43:35 +00001274 return NULL; /* Make gcc -Wall happy */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001275}
1276
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001277
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001278#ifdef HAVE_EXECV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001279static char posix_execv__doc__[] =
1280"execv(path, args)\n\
1281Execute an executable path with arguments, replacing current process.\n\
1282\n\
1283 path: path of executable file\n\
1284 args: tuple or list of strings";
1285
Barry Warsaw53699e91996-12-10 23:23:01 +00001286static PyObject *
Guido van Rossum89b33251993-10-22 14:26:06 +00001287posix_execv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001288 PyObject *self;
1289 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001290{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001291 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00001292 PyObject *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001293 char **argvlist;
1294 int i, argc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001295 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossum85e3b011991-06-03 12:42:10 +00001296
Guido van Rossum89b33251993-10-22 14:26:06 +00001297 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +00001298 argv is a list or tuple of strings. */
1299
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001300 if (!PyArg_ParseTuple(args, "sO:execv", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001301 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001302 if (PyList_Check(argv)) {
1303 argc = PyList_Size(argv);
1304 getitem = PyList_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001305 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001306 else if (PyTuple_Check(argv)) {
1307 argc = PyTuple_Size(argv);
1308 getitem = PyTuple_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001309 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001310 else {
1311 badarg:
Barry Warsaw53699e91996-12-10 23:23:01 +00001312 PyErr_BadArgument();
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001313 return NULL;
1314 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00001315
Barry Warsaw53699e91996-12-10 23:23:01 +00001316 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001317 if (argvlist == NULL)
1318 return NULL;
1319 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001320 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
1321 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001322 goto badarg;
1323 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00001324 }
1325 argvlist[argc] = NULL;
1326
Guido van Rossumb6775db1994-08-01 11:34:53 +00001327#ifdef BAD_EXEC_PROTOTYPES
1328 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001329#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001330 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001331#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001332
Guido van Rossum85e3b011991-06-03 12:42:10 +00001333 /* If we get here it's definitely an error */
1334
Barry Warsaw53699e91996-12-10 23:23:01 +00001335 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001336 return posix_error();
1337}
1338
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001339
1340static char posix_execve__doc__[] =
1341"execve(path, args, env)\n\
1342Execute a path with arguments and environment, replacing current process.\n\
1343\n\
1344 path: path of executable file\n\
1345 args: tuple or list of arguments\n\
1346 env: dictonary of strings mapping to strings";
1347
Barry Warsaw53699e91996-12-10 23:23:01 +00001348static PyObject *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001349posix_execve(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001350 PyObject *self;
1351 PyObject *args;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001352{
1353 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00001354 PyObject *argv, *env;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001355 char **argvlist;
1356 char **envlist;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001357 PyObject *key, *val, *keys=NULL, *vals=NULL;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001358 int i, pos, argc, envc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001359 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001360
1361 /* execve has three arguments: (path, argv, env), where
1362 argv is a list or tuple of strings and env is a dictionary
1363 like posix.environ. */
1364
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001365 if (!PyArg_ParseTuple(args, "sOO:execve", &path, &argv, &env))
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001366 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001367 if (PyList_Check(argv)) {
1368 argc = PyList_Size(argv);
1369 getitem = PyList_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001370 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001371 else if (PyTuple_Check(argv)) {
1372 argc = PyTuple_Size(argv);
1373 getitem = PyTuple_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001374 }
1375 else {
Barry Warsaw53699e91996-12-10 23:23:01 +00001376 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001377 return NULL;
1378 }
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001379 if (!PyMapping_Check(env)) {
1380 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001381 return NULL;
1382 }
1383
Barry Warsaw53699e91996-12-10 23:23:01 +00001384 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001385 if (argvlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001386 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001387 return NULL;
1388 }
1389 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001390 if (!PyArg_Parse((*getitem)(argv, i),
Barry Warsaw43d68b81996-12-19 22:10:44 +00001391 "s;argv must be list of strings",
1392 &argvlist[i]))
1393 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001394 goto fail_1;
1395 }
1396 }
1397 argvlist[argc] = NULL;
1398
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001399 i = PyMapping_Length(env);
Barry Warsaw53699e91996-12-10 23:23:01 +00001400 envlist = PyMem_NEW(char *, i + 1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001401 if (envlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001402 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001403 goto fail_1;
1404 }
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001405 envc = 0;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001406 keys = PyMapping_Keys(env);
1407 vals = PyMapping_Values(env);
1408 if (!keys || !vals)
1409 goto fail_2;
1410
1411 for (pos = 0; pos < i; pos++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001412 char *p, *k, *v;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001413
1414 key = PyList_GetItem(keys, pos);
1415 val = PyList_GetItem(vals, pos);
1416 if (!key || !val)
1417 goto fail_2;
1418
Barry Warsaw53699e91996-12-10 23:23:01 +00001419 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
Barry Warsaw43d68b81996-12-19 22:10:44 +00001420 !PyArg_Parse(val, "s;non-string value in env", &v))
1421 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001422 goto fail_2;
1423 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00001424
1425#if defined(PYOS_OS2)
1426 /* Omit Pseudo-Env Vars that Would Confuse Programs if Passed On */
1427 if (stricmp(k, "BEGINLIBPATH") != 0 && stricmp(k, "ENDLIBPATH") != 0) {
1428#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001429 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001430 if (p == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001431 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001432 goto fail_2;
1433 }
1434 sprintf(p, "%s=%s", k, v);
1435 envlist[envc++] = p;
Guido van Rossumd48f2521997-12-05 22:19:34 +00001436#if defined(PYOS_OS2)
1437 }
1438#endif
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001439 }
1440 envlist[envc] = 0;
1441
Guido van Rossumb6775db1994-08-01 11:34:53 +00001442
1443#ifdef BAD_EXEC_PROTOTYPES
1444 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001445#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001446 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001447#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001448
1449 /* If we get here it's definitely an error */
1450
1451 (void) posix_error();
1452
1453 fail_2:
1454 while (--envc >= 0)
Barry Warsaw53699e91996-12-10 23:23:01 +00001455 PyMem_DEL(envlist[envc]);
1456 PyMem_DEL(envlist);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001457 fail_1:
Barry Warsaw53699e91996-12-10 23:23:01 +00001458 PyMem_DEL(argvlist);
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001459 Py_XDECREF(vals);
1460 Py_XDECREF(keys);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001461 return NULL;
1462}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001463#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001464
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001465
Guido van Rossuma1065681999-01-25 23:20:23 +00001466#ifdef HAVE_SPAWNV
1467static char posix_spawnv__doc__[] =
Fred Drakea6dff3e1999-02-01 22:24:40 +00001468"spawnv(mode, path, args)\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001469Execute an executable path with arguments, replacing current process.\n\
1470\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00001471 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001472 path: path of executable file\n\
1473 args: tuple or list of strings";
1474
1475static PyObject *
1476posix_spawnv(self, args)
1477 PyObject *self;
1478 PyObject *args;
1479{
1480 char *path;
1481 PyObject *argv;
1482 char **argvlist;
1483 int mode, i, argc;
1484 PyObject *(*getitem) Py_PROTO((PyObject *, int));
1485
1486 /* spawnv has three arguments: (mode, path, argv), where
1487 argv is a list or tuple of strings. */
1488
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001489 if (!PyArg_ParseTuple(args, "isO:spawnv", &mode, &path, &argv))
Guido van Rossuma1065681999-01-25 23:20:23 +00001490 return NULL;
1491 if (PyList_Check(argv)) {
1492 argc = PyList_Size(argv);
1493 getitem = PyList_GetItem;
1494 }
1495 else if (PyTuple_Check(argv)) {
1496 argc = PyTuple_Size(argv);
1497 getitem = PyTuple_GetItem;
1498 }
1499 else {
1500 badarg:
1501 PyErr_BadArgument();
1502 return NULL;
1503 }
1504
1505 argvlist = PyMem_NEW(char *, argc+1);
1506 if (argvlist == NULL)
1507 return NULL;
1508 for (i = 0; i < argc; i++) {
1509 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
1510 PyMem_DEL(argvlist);
1511 goto badarg;
1512 }
1513 }
1514 argvlist[argc] = NULL;
1515
Guido van Rossum246bc171999-02-01 23:54:31 +00001516 if (mode == _OLD_P_OVERLAY)
1517 mode = _P_OVERLAY;
Guido van Rossuma1065681999-01-25 23:20:23 +00001518 i = _spawnv(mode, path, argvlist);
1519
1520 PyMem_DEL(argvlist);
1521
1522 if (i == -1)
1523 return posix_error();
1524 else
1525 return Py_BuildValue("i", i);
1526}
1527
1528
1529static char posix_spawnve__doc__[] =
Fred Drakea6dff3e1999-02-01 22:24:40 +00001530"spawnve(mode, path, args, env)\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001531Execute a path with arguments and environment, replacing current process.\n\
1532\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00001533 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001534 path: path of executable file\n\
1535 args: tuple or list of arguments\n\
1536 env: dictonary of strings mapping to strings";
1537
1538static PyObject *
1539posix_spawnve(self, args)
1540 PyObject *self;
1541 PyObject *args;
1542{
1543 char *path;
1544 PyObject *argv, *env;
1545 char **argvlist;
1546 char **envlist;
1547 PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL;
1548 int mode, i, pos, argc, envc;
1549 PyObject *(*getitem) Py_PROTO((PyObject *, int));
1550
1551 /* spawnve has four arguments: (mode, path, argv, env), where
1552 argv is a list or tuple of strings and env is a dictionary
1553 like posix.environ. */
1554
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001555 if (!PyArg_ParseTuple(args, "isOO:spawnve", &mode, &path, &argv, &env))
Guido van Rossuma1065681999-01-25 23:20:23 +00001556 return NULL;
1557 if (PyList_Check(argv)) {
1558 argc = PyList_Size(argv);
1559 getitem = PyList_GetItem;
1560 }
1561 else if (PyTuple_Check(argv)) {
1562 argc = PyTuple_Size(argv);
1563 getitem = PyTuple_GetItem;
1564 }
1565 else {
1566 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
1567 return NULL;
1568 }
1569 if (!PyMapping_Check(env)) {
1570 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
1571 return NULL;
1572 }
1573
1574 argvlist = PyMem_NEW(char *, argc+1);
1575 if (argvlist == NULL) {
1576 PyErr_NoMemory();
1577 return NULL;
1578 }
1579 for (i = 0; i < argc; i++) {
1580 if (!PyArg_Parse((*getitem)(argv, i),
1581 "s;argv must be list of strings",
1582 &argvlist[i]))
1583 {
1584 goto fail_1;
1585 }
1586 }
1587 argvlist[argc] = NULL;
1588
1589 i = PyMapping_Length(env);
1590 envlist = PyMem_NEW(char *, i + 1);
1591 if (envlist == NULL) {
1592 PyErr_NoMemory();
1593 goto fail_1;
1594 }
1595 envc = 0;
1596 keys = PyMapping_Keys(env);
1597 vals = PyMapping_Values(env);
1598 if (!keys || !vals)
1599 goto fail_2;
1600
1601 for (pos = 0; pos < i; pos++) {
1602 char *p, *k, *v;
1603
1604 key = PyList_GetItem(keys, pos);
1605 val = PyList_GetItem(vals, pos);
1606 if (!key || !val)
1607 goto fail_2;
1608
1609 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
1610 !PyArg_Parse(val, "s;non-string value in env", &v))
1611 {
1612 goto fail_2;
1613 }
1614 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
1615 if (p == NULL) {
1616 PyErr_NoMemory();
1617 goto fail_2;
1618 }
1619 sprintf(p, "%s=%s", k, v);
1620 envlist[envc++] = p;
1621 }
1622 envlist[envc] = 0;
1623
Guido van Rossum246bc171999-02-01 23:54:31 +00001624 if (mode == _OLD_P_OVERLAY)
1625 mode = _P_OVERLAY;
Guido van Rossuma1065681999-01-25 23:20:23 +00001626 i = _spawnve(mode, path, argvlist, envlist);
1627 if (i == -1)
1628 (void) posix_error();
1629 else
1630 res = Py_BuildValue("i", i);
1631
1632 fail_2:
1633 while (--envc >= 0)
1634 PyMem_DEL(envlist[envc]);
1635 PyMem_DEL(envlist);
1636 fail_1:
1637 PyMem_DEL(argvlist);
1638 Py_XDECREF(vals);
1639 Py_XDECREF(keys);
1640 return res;
1641}
1642#endif /* HAVE_SPAWNV */
1643
1644
Guido van Rossumad0ee831995-03-01 10:34:45 +00001645#ifdef HAVE_FORK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001646static char posix_fork__doc__[] =
1647"fork() -> pid\n\
1648Fork a child process.\n\
1649\n\
1650Return 0 to child process and PID of child to parent process.";
1651
Barry Warsaw53699e91996-12-10 23:23:01 +00001652static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001653posix_fork(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001654 PyObject *self;
1655 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001656{
1657 int pid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001658 if (!PyArg_ParseTuple(args, ":fork"))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001659 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001660 pid = fork();
1661 if (pid == -1)
1662 return posix_error();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001663 PyOS_AfterFork();
Barry Warsaw53699e91996-12-10 23:23:01 +00001664 return PyInt_FromLong((long)pid);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001665}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001666#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001667
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001668
Guido van Rossumad0ee831995-03-01 10:34:45 +00001669#ifdef HAVE_GETEGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001670static char posix_getegid__doc__[] =
1671"getegid() -> egid\n\
1672Return the current process's effective group id.";
1673
Barry Warsaw53699e91996-12-10 23:23:01 +00001674static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001675posix_getegid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001676 PyObject *self;
1677 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001678{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001679 if (!PyArg_ParseTuple(args, ":getegid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001680 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001681 return PyInt_FromLong((long)getegid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001682}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001683#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001684
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001685
Guido van Rossumad0ee831995-03-01 10:34:45 +00001686#ifdef HAVE_GETEUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001687static char posix_geteuid__doc__[] =
1688"geteuid() -> euid\n\
1689Return the current process's effective user id.";
1690
Barry Warsaw53699e91996-12-10 23:23:01 +00001691static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001692posix_geteuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001693 PyObject *self;
1694 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001695{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001696 if (!PyArg_ParseTuple(args, ":geteuid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001697 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001698 return PyInt_FromLong((long)geteuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001699}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001700#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001701
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001702
Guido van Rossumad0ee831995-03-01 10:34:45 +00001703#ifdef HAVE_GETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001704static char posix_getgid__doc__[] =
1705"getgid() -> gid\n\
1706Return the current process's group id.";
1707
Barry Warsaw53699e91996-12-10 23:23:01 +00001708static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001709posix_getgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001710 PyObject *self;
1711 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001712{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001713 if (!PyArg_ParseTuple(args, ":getgid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001714 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001715 return PyInt_FromLong((long)getgid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001716}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001717#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001718
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001719
1720static char posix_getpid__doc__[] =
1721"getpid() -> pid\n\
1722Return the current process id";
1723
Barry Warsaw53699e91996-12-10 23:23:01 +00001724static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001725posix_getpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001726 PyObject *self;
1727 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001728{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001729 if (!PyArg_ParseTuple(args, ":getpid"))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001730 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001731 return PyInt_FromLong((long)getpid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001732}
1733
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001734
Fred Drakec9680921999-12-13 16:37:25 +00001735#ifdef HAVE_GETGROUPS
1736static char posix_getgroups__doc__[] = "\
1737getgroups() -> list of group IDs\n\
1738Return list of supplemental group IDs for the process.";
1739
1740static PyObject *
1741posix_getgroups(self, args)
1742 PyObject *self;
1743 PyObject *args;
1744{
1745 PyObject *result = NULL;
1746
1747 if (PyArg_ParseTuple(args, ":getgroups")) {
1748#ifdef NGROUPS_MAX
1749#define MAX_GROUPS NGROUPS_MAX
1750#else
1751 /* defined to be 16 on Solaris7, so this should be a small number */
1752#define MAX_GROUPS 64
1753#endif
1754 gid_t grouplist[MAX_GROUPS];
1755 int n;
1756
1757 n = getgroups(MAX_GROUPS, grouplist);
1758 if (n < 0)
1759 posix_error();
1760 else {
1761 result = PyList_New(n);
1762 if (result != NULL) {
1763 PyObject *o;
1764 int i;
1765 for (i = 0; i < n; ++i) {
1766 o = PyInt_FromLong((long)grouplist[i]);
1767 if (o == NULL) {
1768 Py_DECREF(result);
1769 result = NULL;
1770 break;
1771 }
1772 PyList_SET_ITEM(result, i, o);
1773 }
1774 }
1775 }
1776 }
1777 return result;
1778}
1779#endif
1780
Guido van Rossumb6775db1994-08-01 11:34:53 +00001781#ifdef HAVE_GETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001782static char posix_getpgrp__doc__[] =
1783"getpgrp() -> pgrp\n\
1784Return the current process group id.";
1785
Barry Warsaw53699e91996-12-10 23:23:01 +00001786static PyObject *
Guido van Rossum04814471991-06-04 20:23:49 +00001787posix_getpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001788 PyObject *self;
1789 PyObject *args;
Guido van Rossum04814471991-06-04 20:23:49 +00001790{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001791 if (!PyArg_ParseTuple(args, ":getpgrp"))
Guido van Rossum04814471991-06-04 20:23:49 +00001792 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001793#ifdef GETPGRP_HAVE_ARG
Barry Warsaw53699e91996-12-10 23:23:01 +00001794 return PyInt_FromLong((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001795#else /* GETPGRP_HAVE_ARG */
Barry Warsaw53699e91996-12-10 23:23:01 +00001796 return PyInt_FromLong((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001797#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001798}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001799#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001800
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001801
Guido van Rossumb6775db1994-08-01 11:34:53 +00001802#ifdef HAVE_SETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001803static char posix_setpgrp__doc__[] =
1804"setpgrp() -> None\n\
1805Make this process a session leader.";
1806
Barry Warsaw53699e91996-12-10 23:23:01 +00001807static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001808posix_setpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001809 PyObject *self;
1810 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001811{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001812 if (!PyArg_ParseTuple(args, ":setpgrp"))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001813 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001814#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001815 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001816#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001817 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001818#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001819 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001820 Py_INCREF(Py_None);
1821 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001822}
1823
Guido van Rossumb6775db1994-08-01 11:34:53 +00001824#endif /* HAVE_SETPGRP */
1825
Guido van Rossumad0ee831995-03-01 10:34:45 +00001826#ifdef HAVE_GETPPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001827static char posix_getppid__doc__[] =
1828"getppid() -> ppid\n\
1829Return the parent's process id.";
1830
Barry Warsaw53699e91996-12-10 23:23:01 +00001831static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001832posix_getppid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001833 PyObject *self;
1834 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001835{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001836 if (!PyArg_ParseTuple(args, ":getppid"))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001837 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001838 return PyInt_FromLong((long)getppid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001839}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001840#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001841
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001842
Fred Drake12c6e2d1999-12-14 21:25:03 +00001843#ifdef HAVE_GETLOGIN
1844static char posix_getlogin__doc__[] = "\
1845getlogin() -> string\n\
1846Return the actual login name.";
1847
1848static PyObject *
1849posix_getlogin(self, args)
1850 PyObject *self;
1851 PyObject *args;
1852{
1853 PyObject *result = NULL;
1854
1855 if (PyArg_ParseTuple(args, ":getlogin")) {
1856 char *name = getlogin();
1857
1858 if (name == NULL)
1859 posix_error();
1860 else
1861 result = PyString_FromString(name);
1862 }
1863 return result;
1864}
1865#endif
1866
Guido van Rossumad0ee831995-03-01 10:34:45 +00001867#ifdef HAVE_GETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001868static char posix_getuid__doc__[] =
1869"getuid() -> uid\n\
1870Return the current process's user id.";
1871
Barry Warsaw53699e91996-12-10 23:23:01 +00001872static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001873posix_getuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001874 PyObject *self;
1875 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001876{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001877 if (!PyArg_ParseTuple(args, ":getuid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001878 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001879 return PyInt_FromLong((long)getuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001880}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001881#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001882
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001883
Guido van Rossumad0ee831995-03-01 10:34:45 +00001884#ifdef HAVE_KILL
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001885static char posix_kill__doc__[] =
1886"kill(pid, sig) -> None\n\
1887Kill a process with a signal.";
1888
Barry Warsaw53699e91996-12-10 23:23:01 +00001889static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001890posix_kill(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001891 PyObject *self;
1892 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001893{
1894 int pid, sig;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001895 if (!PyArg_ParseTuple(args, "ii:kill", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001896 return NULL;
Guido van Rossumd48f2521997-12-05 22:19:34 +00001897#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001898 if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
1899 APIRET rc;
1900 if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00001901 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001902
1903 } else if (sig == XCPT_SIGNAL_KILLPROC) {
1904 APIRET rc;
1905 if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00001906 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001907
1908 } else
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001909 return NULL; /* Unrecognized Signal Requested */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001910#else
Guido van Rossum85e3b011991-06-03 12:42:10 +00001911 if (kill(pid, sig) == -1)
1912 return posix_error();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001913#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001914 Py_INCREF(Py_None);
1915 return Py_None;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001916}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001917#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001918
Guido van Rossumc0125471996-06-28 18:55:32 +00001919#ifdef HAVE_PLOCK
1920
1921#ifdef HAVE_SYS_LOCK_H
1922#include <sys/lock.h>
1923#endif
1924
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001925static char posix_plock__doc__[] =
1926"plock(op) -> None\n\
1927Lock program segments into memory.";
1928
Barry Warsaw53699e91996-12-10 23:23:01 +00001929static PyObject *
Guido van Rossumc0125471996-06-28 18:55:32 +00001930posix_plock(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001931 PyObject *self;
1932 PyObject *args;
Guido van Rossumc0125471996-06-28 18:55:32 +00001933{
1934 int op;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001935 if (!PyArg_ParseTuple(args, "i:plock", &op))
Guido van Rossumc0125471996-06-28 18:55:32 +00001936 return NULL;
1937 if (plock(op) == -1)
1938 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001939 Py_INCREF(Py_None);
1940 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00001941}
1942#endif
1943
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001944
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001945#ifdef HAVE_POPEN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001946static char posix_popen__doc__[] =
1947"popen(command [, mode='r' [, bufsize]]) -> pipe\n\
1948Open a pipe to/from a command returning a file object.";
1949
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001950#if defined(PYOS_OS2)
Guido van Rossumd48f2521997-12-05 22:19:34 +00001951static int
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001952async_system(const char *command)
1953{
1954 char *p, errormsg[256], args[1024];
1955 RESULTCODES rcodes;
1956 APIRET rc;
1957 char *shell = getenv("COMSPEC");
1958 if (!shell)
1959 shell = "cmd";
1960
1961 strcpy(args, shell);
1962 p = &args[ strlen(args)+1 ];
1963 strcpy(p, "/c ");
1964 strcat(p, command);
1965 p += strlen(p) + 1;
1966 *p = '\0';
1967
1968 rc = DosExecPgm(errormsg, sizeof(errormsg),
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001969 EXEC_ASYNC, /* Execute Async w/o Wait for Results */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001970 args,
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001971 NULL, /* Inherit Parent's Environment */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001972 &rcodes, shell);
1973 return rc;
1974}
1975
Guido van Rossumd48f2521997-12-05 22:19:34 +00001976static FILE *
1977popen(const char *command, const char *mode, int pipesize, int *err)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001978{
1979 HFILE rhan, whan;
1980 FILE *retfd = NULL;
1981 APIRET rc = DosCreatePipe(&rhan, &whan, pipesize);
1982
Guido van Rossumd48f2521997-12-05 22:19:34 +00001983 if (rc != NO_ERROR) {
1984 *err = rc;
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001985 return NULL; /* ERROR - Unable to Create Anon Pipe */
Guido van Rossumd48f2521997-12-05 22:19:34 +00001986 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001987
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001988 if (strchr(mode, 'r') != NULL) { /* Treat Command as a Data Source */
1989 int oldfd = dup(1); /* Save STDOUT Handle in Another Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001990
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001991 DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
1992 close(1); /* Make STDOUT Available for Reallocation */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001993
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001994 if (dup2(whan, 1) == 0) { /* Connect STDOUT to Pipe Write Side */
1995 DosClose(whan); /* Close Now-Unused Pipe Write Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001996
1997 if (async_system(command) == NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00001998 retfd = fdopen(rhan, mode); /* And Return Pipe Read Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001999 }
2000
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002001 dup2(oldfd, 1); /* Reconnect STDOUT to Original Handle */
2002 DosExitCritSec(); /* Now Allow Other Threads to Run */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002003
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002004 close(oldfd); /* And Close Saved STDOUT Handle */
2005 return retfd; /* Return fd of Pipe or NULL if Error */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002006
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002007 } else if (strchr(mode, 'w')) { /* Treat Command as a Data Sink */
2008 int oldfd = dup(0); /* Save STDIN Handle in Another Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002009
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002010 DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
2011 close(0); /* Make STDIN Available for Reallocation */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002012
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002013 if (dup2(rhan, 0) == 0) { /* Connect STDIN to Pipe Read Side */
2014 DosClose(rhan); /* Close Now-Unused Pipe Read Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002015
2016 if (async_system(command) == NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002017 retfd = fdopen(whan, mode); /* And Return Pipe Write Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002018 }
2019
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002020 dup2(oldfd, 0); /* Reconnect STDIN to Original Handle */
2021 DosExitCritSec(); /* Now Allow Other Threads to Run */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002022
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002023 close(oldfd); /* And Close Saved STDIN Handle */
2024 return retfd; /* Return fd of Pipe or NULL if Error */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002025
Guido van Rossumd48f2521997-12-05 22:19:34 +00002026 } else {
2027 *err = ERROR_INVALID_ACCESS;
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002028 return NULL; /* ERROR - Invalid Mode (Neither Read nor Write) */
Guido van Rossumd48f2521997-12-05 22:19:34 +00002029 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002030}
2031
2032static PyObject *
2033posix_popen(self, args)
2034 PyObject *self;
2035 PyObject *args;
2036{
2037 char *name;
2038 char *mode = "r";
Guido van Rossumd48f2521997-12-05 22:19:34 +00002039 int err, bufsize = -1;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002040 FILE *fp;
2041 PyObject *f;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002042 if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002043 return NULL;
2044 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd48f2521997-12-05 22:19:34 +00002045 fp = popen(name, mode, (bufsize > 0) ? bufsize : 4096, &err);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002046 Py_END_ALLOW_THREADS
2047 if (fp == NULL)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002048 return os2_error(err);
2049
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002050 f = PyFile_FromFile(fp, name, mode, fclose);
2051 if (f != NULL)
2052 PyFile_SetBufSize(f, bufsize);
2053 return f;
2054}
2055
2056#else
Barry Warsaw53699e91996-12-10 23:23:01 +00002057static PyObject *
Guido van Rossum3b066191991-06-04 19:40:25 +00002058posix_popen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002059 PyObject *self;
2060 PyObject *args;
Guido van Rossum3b066191991-06-04 19:40:25 +00002061{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002062 char *name;
2063 char *mode = "r";
2064 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00002065 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002066 PyObject *f;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002067 if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00002068 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002069 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002070 fp = popen(name, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002071 Py_END_ALLOW_THREADS
Guido van Rossum3b066191991-06-04 19:40:25 +00002072 if (fp == NULL)
2073 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002074 f = PyFile_FromFile(fp, name, mode, pclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002075 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002076 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002077 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00002078}
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002079#endif
2080
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002081#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00002082
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002083
Guido van Rossumb6775db1994-08-01 11:34:53 +00002084#ifdef HAVE_SETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002085static char posix_setuid__doc__[] =
2086"setuid(uid) -> None\n\
2087Set the current process's user id.";
Barry Warsaw53699e91996-12-10 23:23:01 +00002088static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002089posix_setuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002090 PyObject *self;
2091 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002092{
2093 int uid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002094 if (!PyArg_ParseTuple(args, "i:setuid", &uid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002095 return NULL;
2096 if (setuid(uid) < 0)
2097 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002098 Py_INCREF(Py_None);
2099 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002100}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002101#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002102
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002103
Guido van Rossumb6775db1994-08-01 11:34:53 +00002104#ifdef HAVE_SETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002105static char posix_setgid__doc__[] =
2106"setgid(gid) -> None\n\
2107Set the current process's group id.";
2108
Barry Warsaw53699e91996-12-10 23:23:01 +00002109static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002110posix_setgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002111 PyObject *self;
2112 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002113{
2114 int gid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002115 if (!PyArg_ParseTuple(args, "i:setgid", &gid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002116 return NULL;
2117 if (setgid(gid) < 0)
2118 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002119 Py_INCREF(Py_None);
2120 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002121}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002122#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002123
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002124
Guido van Rossumb6775db1994-08-01 11:34:53 +00002125#ifdef HAVE_WAITPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002126static char posix_waitpid__doc__[] =
2127"waitpid(pid, options) -> (pid, status)\n\
2128Wait for completion of a give child process.";
2129
Barry Warsaw53699e91996-12-10 23:23:01 +00002130static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00002131posix_waitpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002132 PyObject *self;
2133 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00002134{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002135 int pid, options;
2136#ifdef UNION_WAIT
2137 union wait status;
2138#define status_i (status.w_status)
2139#else
2140 int status;
2141#define status_i status
2142#endif
2143 status_i = 0;
2144
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002145 if (!PyArg_ParseTuple(args, "ii:waitpid", &pid, &options))
Guido van Rossum21803b81992-08-09 12:55:27 +00002146 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002147 Py_BEGIN_ALLOW_THREADS
Guido van Rossume6a3aa61999-02-01 16:15:30 +00002148#ifdef NeXT
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002149 pid = wait4(pid, &status, options, NULL);
Guido van Rossume6a3aa61999-02-01 16:15:30 +00002150#else
2151 pid = waitpid(pid, &status, options);
2152#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002153 Py_END_ALLOW_THREADS
Guido van Rossum85e3b011991-06-03 12:42:10 +00002154 if (pid == -1)
2155 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00002156 else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002157 return Py_BuildValue("ii", pid, status_i);
Guido van Rossum21803b81992-08-09 12:55:27 +00002158}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002159#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00002160
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002161
Guido van Rossumad0ee831995-03-01 10:34:45 +00002162#ifdef HAVE_WAIT
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002163static char posix_wait__doc__[] =
2164"wait() -> (pid, status)\n\
2165Wait for completion of a child process.";
2166
Barry Warsaw53699e91996-12-10 23:23:01 +00002167static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00002168posix_wait(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002169 PyObject *self;
2170 PyObject *args;
Guido van Rossum21803b81992-08-09 12:55:27 +00002171{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002172 int pid;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002173#ifdef UNION_WAIT
2174 union wait status;
2175#define status_i (status.w_status)
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002176#else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002177 int status;
2178#define status_i status
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002179#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002180 if (!PyArg_ParseTuple(args, ":wait"))
2181 return NULL;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002182 status_i = 0;
2183 Py_BEGIN_ALLOW_THREADS
2184 pid = wait(&status);
Barry Warsaw53699e91996-12-10 23:23:01 +00002185 Py_END_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00002186 if (pid == -1)
2187 return posix_error();
2188 else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002189 return Py_BuildValue("ii", pid, status_i);
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002190#undef status_i
Guido van Rossum85e3b011991-06-03 12:42:10 +00002191}
Guido van Rossumad0ee831995-03-01 10:34:45 +00002192#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00002193
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002194
2195static char posix_lstat__doc__[] =
2196"lstat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
2197Like stat(path), but do not follow symbolic links.";
2198
Barry Warsaw53699e91996-12-10 23:23:01 +00002199static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002200posix_lstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002201 PyObject *self;
2202 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002203{
Guido van Rossumb6775db1994-08-01 11:34:53 +00002204#ifdef HAVE_LSTAT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002205 return posix_do_stat(self, args, "s:lstat", lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002206#else /* !HAVE_LSTAT */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002207 return posix_do_stat(self, args, "s:lstat", stat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002208#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002209}
2210
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002211
Guido van Rossumb6775db1994-08-01 11:34:53 +00002212#ifdef HAVE_READLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002213static char posix_readlink__doc__[] =
2214"readlink(path) -> path\n\
2215Return a string representing the path to which the symbolic link points.";
2216
Barry Warsaw53699e91996-12-10 23:23:01 +00002217static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002218posix_readlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002219 PyObject *self;
2220 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002221{
Guido van Rossumb6775db1994-08-01 11:34:53 +00002222 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002223 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002224 int n;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002225 if (!PyArg_ParseTuple(args, "s:readlink", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002226 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002227 Py_BEGIN_ALLOW_THREADS
Guido van Rossum50e61dc1992-03-27 17:22:31 +00002228 n = readlink(path, buf, (int) sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +00002229 Py_END_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002230 if (n < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00002231 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00002232 return PyString_FromStringAndSize(buf, n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002233}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002234#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002235
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002236
Guido van Rossumb6775db1994-08-01 11:34:53 +00002237#ifdef HAVE_SYMLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002238static char posix_symlink__doc__[] =
2239"symlink(src, dst) -> None\n\
2240Create a symbolic link.";
2241
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002242static PyObject *
2243posix_symlink(self, args)
2244 PyObject *self;
2245 PyObject *args;
2246{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002247 return posix_2str(args, "ss:symlink", symlink);
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002248}
2249#endif /* HAVE_SYMLINK */
2250
2251
2252#ifdef HAVE_TIMES
2253#ifndef HZ
2254#define HZ 60 /* Universal constant :-) */
2255#endif /* HZ */
2256
Guido van Rossumd48f2521997-12-05 22:19:34 +00002257#if defined(PYCC_VACPP) && defined(PYOS_OS2)
2258static long
2259system_uptime()
2260{
2261 ULONG value = 0;
2262
2263 Py_BEGIN_ALLOW_THREADS
2264 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &value, sizeof(value));
2265 Py_END_ALLOW_THREADS
2266
2267 return value;
2268}
2269
2270static PyObject *
2271posix_times(self, args)
2272 PyObject *self;
2273 PyObject *args;
2274{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002275 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossumd48f2521997-12-05 22:19:34 +00002276 return NULL;
2277
2278 /* Currently Only Uptime is Provided -- Others Later */
2279 return Py_BuildValue("ddddd",
2280 (double)0 /* t.tms_utime / HZ */,
2281 (double)0 /* t.tms_stime / HZ */,
2282 (double)0 /* t.tms_cutime / HZ */,
2283 (double)0 /* t.tms_cstime / HZ */,
2284 (double)system_uptime() / 1000);
2285}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002286#else /* not OS2 */
Barry Warsaw53699e91996-12-10 23:23:01 +00002287static PyObject *
Guido van Rossum22db57e1992-04-05 14:25:30 +00002288posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002289 PyObject *self;
2290 PyObject *args;
Guido van Rossum22db57e1992-04-05 14:25:30 +00002291{
2292 struct tms t;
2293 clock_t c;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002294 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossum22db57e1992-04-05 14:25:30 +00002295 return NULL;
2296 errno = 0;
2297 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00002298 if (c == (clock_t) -1)
2299 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002300 return Py_BuildValue("ddddd",
Barry Warsaw43d68b81996-12-19 22:10:44 +00002301 (double)t.tms_utime / HZ,
2302 (double)t.tms_stime / HZ,
2303 (double)t.tms_cutime / HZ,
2304 (double)t.tms_cstime / HZ,
2305 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00002306}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002307#endif /* not OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002308#endif /* HAVE_TIMES */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002309
2310
Guido van Rossum87755a21996-09-07 00:59:43 +00002311#ifdef MS_WIN32
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002312#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00002313static PyObject *
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002314posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002315 PyObject *self;
2316 PyObject *args;
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002317{
2318 FILETIME create, exit, kernel, user;
2319 HANDLE hProc;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002320 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002321 return NULL;
2322 hProc = GetCurrentProcess();
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00002323 GetProcessTimes(hProc, &create, &exit, &kernel, &user);
2324 /* The fields of a FILETIME structure are the hi and lo part
2325 of a 64-bit value expressed in 100 nanosecond units.
2326 1e7 is one second in such units; 1e-7 the inverse.
2327 429.4967296 is 2**32 / 1e7 or 2**32 * 1e-7.
2328 */
Barry Warsaw53699e91996-12-10 23:23:01 +00002329 return Py_BuildValue(
2330 "ddddd",
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00002331 (double)(kernel.dwHighDateTime*429.4967296 +
2332 kernel.dwLowDateTime*1e-7),
2333 (double)(user.dwHighDateTime*429.4967296 +
2334 user.dwLowDateTime*1e-7),
Barry Warsaw53699e91996-12-10 23:23:01 +00002335 (double)0,
2336 (double)0,
2337 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002338}
Guido van Rossum8d665e61996-06-26 18:22:49 +00002339#endif /* MS_WIN32 */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002340
2341#ifdef HAVE_TIMES
Roger E. Masse0318fd61997-06-05 22:07:58 +00002342static char posix_times__doc__[] =
2343"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\
2344Return a tuple of floating point numbers indicating process times.";
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002345#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002346
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002347
Guido van Rossumb6775db1994-08-01 11:34:53 +00002348#ifdef HAVE_SETSID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002349static char posix_setsid__doc__[] =
2350"setsid() -> None\n\
2351Call the system call setsid().";
2352
Barry Warsaw53699e91996-12-10 23:23:01 +00002353static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00002354posix_setsid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002355 PyObject *self;
2356 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002357{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002358 if (!PyArg_ParseTuple(args, ":setsid"))
Guido van Rossumc2670a01992-09-13 20:07:29 +00002359 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002360 if (setsid() < 0)
2361 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002362 Py_INCREF(Py_None);
2363 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002364}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002365#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00002366
Guido van Rossumb6775db1994-08-01 11:34:53 +00002367#ifdef HAVE_SETPGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002368static char posix_setpgid__doc__[] =
2369"setpgid(pid, pgrp) -> None\n\
2370Call the system call setpgid().";
2371
Barry Warsaw53699e91996-12-10 23:23:01 +00002372static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00002373posix_setpgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002374 PyObject *self;
2375 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002376{
2377 int pid, pgrp;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002378 if (!PyArg_ParseTuple(args, "ii:setpgid", &pid, &pgrp))
Guido van Rossumc2670a01992-09-13 20:07:29 +00002379 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002380 if (setpgid(pid, pgrp) < 0)
2381 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002382 Py_INCREF(Py_None);
2383 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002384}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002385#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00002386
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002387
Guido van Rossumb6775db1994-08-01 11:34:53 +00002388#ifdef HAVE_TCGETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002389static char posix_tcgetpgrp__doc__[] =
2390"tcgetpgrp(fd) -> pgid\n\
2391Return the process group associated with the terminal given by a fd.";
2392
Barry Warsaw53699e91996-12-10 23:23:01 +00002393static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00002394posix_tcgetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002395 PyObject *self;
2396 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002397{
2398 int fd, pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002399 if (!PyArg_ParseTuple(args, "i:tcgetpgrp", &fd))
Guido van Rossum7066dd71992-09-17 17:54:56 +00002400 return NULL;
2401 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002402 if (pgid < 0)
2403 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002404 return PyInt_FromLong((long)pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00002405}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002406#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00002407
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002408
Guido van Rossumb6775db1994-08-01 11:34:53 +00002409#ifdef HAVE_TCSETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002410static char posix_tcsetpgrp__doc__[] =
2411"tcsetpgrp(fd, pgid) -> None\n\
2412Set the process group associated with the terminal given by a fd.";
2413
Barry Warsaw53699e91996-12-10 23:23:01 +00002414static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00002415posix_tcsetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002416 PyObject *self;
2417 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002418{
2419 int fd, pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002420 if (!PyArg_ParseTuple(args, "ii:tcsetpgrp", &fd, &pgid))
Guido van Rossum7066dd71992-09-17 17:54:56 +00002421 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002422 if (tcsetpgrp(fd, pgid) < 0)
2423 return posix_error();
Barry Warsaw43d68b81996-12-19 22:10:44 +00002424 Py_INCREF(Py_None);
Barry Warsaw53699e91996-12-10 23:23:01 +00002425 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002426}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002427#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00002428
Guido van Rossum687dd131993-05-17 08:34:16 +00002429/* Functions acting on file descriptors */
2430
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002431static char posix_open__doc__[] =
2432"open(filename, flag [, mode=0777]) -> fd\n\
2433Open a file (for low level IO).";
2434
Barry Warsaw53699e91996-12-10 23:23:01 +00002435static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002436posix_open(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002437 PyObject *self;
2438 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002439{
2440 char *file;
2441 int flag;
2442 int mode = 0777;
2443 int fd;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002444 if (!PyArg_ParseTuple(args, "si|i", &file, &flag, &mode))
2445 return NULL;
2446
Barry Warsaw53699e91996-12-10 23:23:01 +00002447 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002448 fd = open(file, flag, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002449 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002450 if (fd < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00002451 return posix_error_with_filename(file);
Barry Warsaw53699e91996-12-10 23:23:01 +00002452 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002453}
2454
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002455
2456static char posix_close__doc__[] =
2457"close(fd) -> None\n\
2458Close a file descriptor (for low level IO).";
2459
Barry Warsaw53699e91996-12-10 23:23:01 +00002460static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002461posix_close(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002462 PyObject *self;
2463 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002464{
2465 int fd, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002466 if (!PyArg_ParseTuple(args, "i:close", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002467 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002468 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002469 res = close(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00002470 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002471 if (res < 0)
2472 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002473 Py_INCREF(Py_None);
2474 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00002475}
2476
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002477
2478static char posix_dup__doc__[] =
2479"dup(fd) -> fd2\n\
2480Return a duplicate of a file descriptor.";
2481
Barry Warsaw53699e91996-12-10 23:23:01 +00002482static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002483posix_dup(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002484 PyObject *self;
2485 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002486{
2487 int fd;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002488 if (!PyArg_ParseTuple(args, "i:dup", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002489 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002490 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002491 fd = dup(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00002492 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002493 if (fd < 0)
2494 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002495 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002496}
2497
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002498
2499static char posix_dup2__doc__[] =
2500"dup2(fd, fd2) -> None\n\
2501Duplicate file descriptor.";
2502
Barry Warsaw53699e91996-12-10 23:23:01 +00002503static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002504posix_dup2(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002505 PyObject *self;
2506 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002507{
2508 int fd, fd2, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002509 if (!PyArg_ParseTuple(args, "ii:dup2", &fd, &fd2))
Guido van Rossum687dd131993-05-17 08:34:16 +00002510 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002511 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002512 res = dup2(fd, fd2);
Barry Warsaw53699e91996-12-10 23:23:01 +00002513 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002514 if (res < 0)
2515 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002516 Py_INCREF(Py_None);
2517 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00002518}
2519
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002520
2521static char posix_lseek__doc__[] =
2522"lseek(fd, pos, how) -> newpos\n\
2523Set the current position of a file descriptor.";
2524
Barry Warsaw53699e91996-12-10 23:23:01 +00002525static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002526posix_lseek(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002527 PyObject *self;
2528 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002529{
2530 int fd, how;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002531 off_t pos, res;
2532 PyObject *posobj;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002533 if (!PyArg_ParseTuple(args, "iOi:lseek", &fd, &posobj, &how))
Guido van Rossum687dd131993-05-17 08:34:16 +00002534 return NULL;
2535#ifdef SEEK_SET
2536 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
2537 switch (how) {
2538 case 0: how = SEEK_SET; break;
2539 case 1: how = SEEK_CUR; break;
2540 case 2: how = SEEK_END; break;
2541 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002542#endif /* SEEK_END */
Guido van Rossum94f6f721999-01-06 18:42:14 +00002543
2544#if !defined(HAVE_LARGEFILE_SUPPORT)
2545 pos = PyInt_AsLong(posobj);
2546#else
2547 pos = PyLong_Check(posobj) ?
2548 PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj);
2549#endif
2550 if (PyErr_Occurred())
2551 return NULL;
2552
Barry Warsaw53699e91996-12-10 23:23:01 +00002553 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002554 res = lseek(fd, pos, how);
Barry Warsaw53699e91996-12-10 23:23:01 +00002555 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002556 if (res < 0)
2557 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00002558
2559#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +00002560 return PyInt_FromLong(res);
Guido van Rossum94f6f721999-01-06 18:42:14 +00002561#else
2562 return PyLong_FromLongLong(res);
2563#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002564}
2565
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002566
2567static char posix_read__doc__[] =
2568"read(fd, buffersize) -> string\n\
2569Read a file descriptor.";
2570
Barry Warsaw53699e91996-12-10 23:23:01 +00002571static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002572posix_read(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002573 PyObject *self;
2574 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002575{
Guido van Rossum8bac5461996-06-11 18:38:48 +00002576 int fd, size, n;
Barry Warsaw53699e91996-12-10 23:23:01 +00002577 PyObject *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002578 if (!PyArg_ParseTuple(args, "ii:read", &fd, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00002579 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002580 buffer = PyString_FromStringAndSize((char *)NULL, size);
Guido van Rossum687dd131993-05-17 08:34:16 +00002581 if (buffer == NULL)
2582 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002583 Py_BEGIN_ALLOW_THREADS
2584 n = read(fd, PyString_AsString(buffer), size);
2585 Py_END_ALLOW_THREADS
Guido van Rossum8bac5461996-06-11 18:38:48 +00002586 if (n < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002587 Py_DECREF(buffer);
Guido van Rossum687dd131993-05-17 08:34:16 +00002588 return posix_error();
2589 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00002590 if (n != size)
Barry Warsaw53699e91996-12-10 23:23:01 +00002591 _PyString_Resize(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00002592 return buffer;
2593}
2594
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002595
2596static char posix_write__doc__[] =
2597"write(fd, string) -> byteswritten\n\
2598Write a string to a file descriptor.";
2599
Barry Warsaw53699e91996-12-10 23:23:01 +00002600static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002601posix_write(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002602 PyObject *self;
2603 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002604{
2605 int fd, size;
2606 char *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002607 if (!PyArg_ParseTuple(args, "is#:write", &fd, &buffer, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00002608 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002609 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002610 size = write(fd, buffer, size);
Barry Warsaw53699e91996-12-10 23:23:01 +00002611 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002612 if (size < 0)
2613 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002614 return PyInt_FromLong((long)size);
Guido van Rossum687dd131993-05-17 08:34:16 +00002615}
2616
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002617
2618static char posix_fstat__doc__[]=
2619"fstat(fd) -> (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\
2620Like stat(), but for an open file descriptor.";
2621
Barry Warsaw53699e91996-12-10 23:23:01 +00002622static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002623posix_fstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002624 PyObject *self;
2625 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002626{
2627 int fd;
2628 struct stat st;
2629 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002630 if (!PyArg_ParseTuple(args, "i:fstat", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002631 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002632 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002633 res = fstat(fd, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00002634 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002635 if (res != 0)
2636 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00002637#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +00002638 return Py_BuildValue("(llllllllll)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00002639 (long)st.st_mode,
2640 (long)st.st_ino,
2641 (long)st.st_dev,
2642 (long)st.st_nlink,
2643 (long)st.st_uid,
2644 (long)st.st_gid,
2645 (long)st.st_size,
2646 (long)st.st_atime,
2647 (long)st.st_mtime,
2648 (long)st.st_ctime);
Guido van Rossum94f6f721999-01-06 18:42:14 +00002649#else
2650 return Py_BuildValue("(lLllllLlll)",
2651 (long)st.st_mode,
2652 (LONG_LONG)st.st_ino,
2653 (long)st.st_dev,
2654 (long)st.st_nlink,
2655 (long)st.st_uid,
2656 (long)st.st_gid,
2657 (LONG_LONG)st.st_size,
2658 (long)st.st_atime,
2659 (long)st.st_mtime,
2660 (long)st.st_ctime);
2661#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002662}
2663
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002664
2665static char posix_fdopen__doc__[] =
2666"fdopen(fd, [, mode='r' [, bufsize]]) -> file_object\n\
2667Return an open file object connected to a file descriptor.";
2668
Barry Warsaw53699e91996-12-10 23:23:01 +00002669static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002670posix_fdopen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002671 PyObject *self;
2672 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002673{
Barry Warsaw53699e91996-12-10 23:23:01 +00002674 extern int fclose Py_PROTO((FILE *));
Guido van Rossum687dd131993-05-17 08:34:16 +00002675 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002676 char *mode = "r";
2677 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00002678 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002679 PyObject *f;
2680 if (!PyArg_ParseTuple(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00002681 return NULL;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002682
Barry Warsaw53699e91996-12-10 23:23:01 +00002683 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002684 fp = fdopen(fd, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002685 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002686 if (fp == NULL)
2687 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002688 f = PyFile_FromFile(fp, "(fdopen)", mode, fclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002689 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002690 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002691 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00002692}
2693
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002694
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002695#ifdef HAVE_PIPE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002696static char posix_pipe__doc__[] =
2697"pipe() -> (read_end, write_end)\n\
2698Create a pipe.";
2699
Barry Warsaw53699e91996-12-10 23:23:01 +00002700static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002701posix_pipe(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002702 PyObject *self;
2703 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002704{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002705#if defined(PYOS_OS2)
2706 HFILE read, write;
2707 APIRET rc;
2708
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002709 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002710 return NULL;
2711
2712 Py_BEGIN_ALLOW_THREADS
2713 rc = DosCreatePipe( &read, &write, 4096);
2714 Py_END_ALLOW_THREADS
2715 if (rc != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002716 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002717
2718 return Py_BuildValue("(ii)", read, write);
2719#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002720#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00002721 int fds[2];
2722 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002723 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum687dd131993-05-17 08:34:16 +00002724 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002725 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002726 res = pipe(fds);
Barry Warsaw53699e91996-12-10 23:23:01 +00002727 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002728 if (res != 0)
2729 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002730 return Py_BuildValue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002731#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00002732 HANDLE read, write;
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002733 int read_fd, write_fd;
Guido van Rossum794d8131994-08-23 13:48:48 +00002734 BOOL ok;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002735 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum794d8131994-08-23 13:48:48 +00002736 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002737 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002738 ok = CreatePipe(&read, &write, NULL, 0);
Barry Warsaw53699e91996-12-10 23:23:01 +00002739 Py_END_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00002740 if (!ok)
2741 return posix_error();
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002742 read_fd = _open_osfhandle((long)read, 0);
2743 write_fd = _open_osfhandle((long)write, 1);
2744 return Py_BuildValue("(ii)", read_fd, write_fd);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002745#endif /* MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002746#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002747}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002748#endif /* HAVE_PIPE */
2749
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002750
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002751#ifdef HAVE_MKFIFO
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002752static char posix_mkfifo__doc__[] =
2753"mkfifo(file, [, mode=0666]) -> None\n\
2754Create a FIFO (a POSIX named pipe).";
2755
Barry Warsaw53699e91996-12-10 23:23:01 +00002756static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002757posix_mkfifo(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002758 PyObject *self;
2759 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002760{
2761 char *file;
2762 int mode = 0666;
2763 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002764 if (!PyArg_ParseTuple(args, "s|i:mkfifo", &file, &mode))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002765 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002766 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002767 res = mkfifo(file, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002768 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002769 if (res < 0)
2770 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002771 Py_INCREF(Py_None);
2772 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002773}
2774#endif
2775
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002776
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002777#ifdef HAVE_FTRUNCATE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002778static char posix_ftruncate__doc__[] =
2779"ftruncate(fd, length) -> None\n\
2780Truncate a file to a specified length.";
2781
Barry Warsaw53699e91996-12-10 23:23:01 +00002782static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002783posix_ftruncate(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002784 PyObject *self; /* Not used */
2785 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002786{
2787 int fd;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002788 off_t length;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002789 int res;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002790 PyObject *lenobj;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002791
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002792 if (!PyArg_ParseTuple(args, "iO:ftruncate", &fd, &lenobj))
Guido van Rossum94f6f721999-01-06 18:42:14 +00002793 return NULL;
2794
2795#if !defined(HAVE_LARGEFILE_SUPPORT)
2796 length = PyInt_AsLong(lenobj);
2797#else
2798 length = PyLong_Check(lenobj) ?
2799 PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj);
2800#endif
2801 if (PyErr_Occurred())
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002802 return NULL;
2803
Barry Warsaw53699e91996-12-10 23:23:01 +00002804 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002805 res = ftruncate(fd, length);
Barry Warsaw53699e91996-12-10 23:23:01 +00002806 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002807 if (res < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002808 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002809 return NULL;
2810 }
Barry Warsaw53699e91996-12-10 23:23:01 +00002811 Py_INCREF(Py_None);
2812 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002813}
2814#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002815
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002816#ifdef NeXT
2817#define HAVE_PUTENV
2818/* Steve Spicklemire got this putenv from NeXTAnswers */
2819static int
2820putenv(char *newval)
2821{
2822 extern char **environ;
2823
2824 static int firstTime = 1;
2825 char **ep;
2826 char *cp;
2827 int esiz;
2828 char *np;
2829
2830 if (!(np = strchr(newval, '=')))
2831 return 1;
2832 *np = '\0';
2833
2834 /* look it up */
2835 for (ep=environ ; *ep ; ep++)
2836 {
2837 /* this should always be true... */
2838 if (cp = strchr(*ep, '='))
2839 {
2840 *cp = '\0';
2841 if (!strcmp(*ep, newval))
2842 {
2843 /* got it! */
2844 *cp = '=';
2845 break;
2846 }
2847 *cp = '=';
2848 }
2849 else
2850 {
2851 *np = '=';
2852 return 1;
2853 }
2854 }
2855
2856 *np = '=';
2857 if (*ep)
2858 {
2859 /* the string was already there:
2860 just replace it with the new one */
2861 *ep = newval;
2862 return 0;
2863 }
2864
2865 /* expand environ by one */
2866 for (esiz=2, ep=environ ; *ep ; ep++)
2867 esiz++;
2868 if (firstTime)
2869 {
2870 char **epp;
2871 char **newenv;
2872 if (!(newenv = malloc(esiz * sizeof(char *))))
2873 return 1;
2874
2875 for (ep=environ, epp=newenv ; *ep ;)
2876 *epp++ = *ep++;
2877 *epp++ = newval;
2878 *epp = (char *) 0;
2879 environ = newenv;
2880 }
2881 else
2882 {
2883 if (!(environ = realloc(environ, esiz * sizeof(char *))))
2884 return 1;
2885 environ[esiz - 2] = newval;
2886 environ[esiz - 1] = (char *) 0;
2887 firstTime = 0;
2888 }
2889
2890 return 0;
2891}
Guido van Rossumc6ef2041997-08-21 02:30:45 +00002892#endif /* NeXT */
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002893
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002894
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002895#ifdef HAVE_PUTENV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002896static char posix_putenv__doc__[] =
2897"putenv(key, value) -> None\n\
2898Change or add an environment variable.";
2899
Guido van Rossumbcc20741998-08-04 22:53:56 +00002900#ifdef __BEOS__
2901/* We have putenv(), but not in the headers (as of PR2). - [cjh] */
2902int putenv( const char *str );
2903#endif
2904
Fred Drake762e2061999-08-26 17:23:54 +00002905/* Save putenv() parameters as values here, so we can collect them when they
2906 * get re-set with another call for the same key. */
2907static PyObject *posix_putenv_garbage;
2908
Barry Warsaw53699e91996-12-10 23:23:01 +00002909static PyObject *
Guido van Rossumb6a47161997-09-15 22:54:34 +00002910posix_putenv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002911 PyObject *self;
2912 PyObject *args;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002913{
2914 char *s1, *s2;
2915 char *new;
Fred Drake762e2061999-08-26 17:23:54 +00002916 PyObject *newstr;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002917
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002918 if (!PyArg_ParseTuple(args, "ss:putenv", &s1, &s2))
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002919 return NULL;
Guido van Rossumd48f2521997-12-05 22:19:34 +00002920
2921#if defined(PYOS_OS2)
2922 if (stricmp(s1, "BEGINLIBPATH") == 0) {
2923 APIRET rc;
2924
2925 if (strlen(s2) == 0) /* If New Value is an Empty String */
2926 s2 = NULL; /* Then OS/2 API Wants a NULL to Undefine It */
2927
2928 rc = DosSetExtLIBPATH(s2, BEGIN_LIBPATH);
2929 if (rc != NO_ERROR)
2930 return os2_error(rc);
2931
2932 } else if (stricmp(s1, "ENDLIBPATH") == 0) {
2933 APIRET rc;
2934
2935 if (strlen(s2) == 0) /* If New Value is an Empty String */
2936 s2 = NULL; /* Then OS/2 API Wants a NULL to Undefine It */
2937
2938 rc = DosSetExtLIBPATH(s2, END_LIBPATH);
2939 if (rc != NO_ERROR)
2940 return os2_error(rc);
2941 } else {
2942#endif
2943
Fred Drake762e2061999-08-26 17:23:54 +00002944 /* XXX This can leak memory -- not easy to fix :-( */
2945 newstr = PyString_FromStringAndSize(NULL, strlen(s1) + strlen(s2) + 2);
2946 if (newstr == NULL)
2947 return PyErr_NoMemory();
2948 new = PyString_AS_STRING(newstr);
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002949 (void) sprintf(new, "%s=%s", s1, s2);
2950 if (putenv(new)) {
2951 posix_error();
2952 return NULL;
2953 }
Fred Drake762e2061999-08-26 17:23:54 +00002954 /* Install the first arg and newstr in posix_putenv_garbage;
2955 * this will cause previous value to be collected. This has to
2956 * happen after the real putenv() call because the old value
2957 * was still accessible until then. */
2958 if (PyDict_SetItem(posix_putenv_garbage,
2959 PyTuple_GET_ITEM(args, 0), newstr)) {
2960 /* really not much we can do; just leak */
2961 PyErr_Clear();
2962 }
2963 else {
2964 Py_DECREF(newstr);
2965 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00002966
2967#if defined(PYOS_OS2)
2968 }
2969#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002970 Py_INCREF(Py_None);
2971 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002972}
Guido van Rossumb6a47161997-09-15 22:54:34 +00002973#endif /* putenv */
2974
2975#ifdef HAVE_STRERROR
2976static char posix_strerror__doc__[] =
2977"strerror(code) -> string\n\
2978Translate an error code to a message string.";
2979
2980PyObject *
2981posix_strerror(self, args)
2982 PyObject *self;
2983 PyObject *args;
2984{
2985 int code;
2986 char *message;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002987 if (!PyArg_ParseTuple(args, "i:strerror", &code))
Guido van Rossumb6a47161997-09-15 22:54:34 +00002988 return NULL;
2989 message = strerror(code);
2990 if (message == NULL) {
2991 PyErr_SetString(PyExc_ValueError,
2992 "strerror code out of range");
2993 return NULL;
2994 }
2995 return PyString_FromString(message);
2996}
2997#endif /* strerror */
2998
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002999
Guido van Rossumc9641791998-08-04 15:26:23 +00003000#ifdef HAVE_SYS_WAIT_H
3001
3002#ifdef WIFSTOPPED
3003static char posix_WIFSTOPPED__doc__[] =
3004"WIFSTOPPED(status) -> Boolean\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003005Return true if the process returning 'status' was stopped.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003006
3007static PyObject *
3008posix_WIFSTOPPED(self, args)
3009 PyObject *self;
3010 PyObject *args;
3011{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003012#ifdef UNION_WAIT
3013 union wait status;
3014#define status_i (status.w_status)
3015#else
3016 int status;
3017#define status_i status
3018#endif
3019 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003020
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003021 if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003022 {
3023 return NULL;
3024 }
3025
3026 return Py_BuildValue("i", WIFSTOPPED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003027#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003028}
3029#endif /* WIFSTOPPED */
3030
3031#ifdef WIFSIGNALED
3032static char posix_WIFSIGNALED__doc__[] =
3033"WIFSIGNALED(status) -> Boolean\n\
Guido van Rossum3366d1c1999-02-23 18:34:43 +00003034Return true if the process returning 'status' was terminated by a signal.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003035
3036static PyObject *
3037posix_WIFSIGNALED(self, args)
3038 PyObject *self;
3039 PyObject *args;
3040{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003041#ifdef UNION_WAIT
3042 union wait status;
3043#define status_i (status.w_status)
3044#else
3045 int status;
3046#define status_i status
3047#endif
3048 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003049
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003050 if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003051 {
3052 return NULL;
3053 }
3054
3055 return Py_BuildValue("i", WIFSIGNALED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003056#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003057}
3058#endif /* WIFSIGNALED */
3059
3060#ifdef WIFEXITED
3061static char posix_WIFEXITED__doc__[] =
3062"WIFEXITED(status) -> Boolean\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003063Return true if the process returning 'status' exited using the exit()\n\
3064system call.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003065
3066static PyObject *
3067posix_WIFEXITED(self, args)
3068 PyObject *self;
3069 PyObject *args;
3070{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003071#ifdef UNION_WAIT
3072 union wait status;
3073#define status_i (status.w_status)
3074#else
3075 int status;
3076#define status_i status
3077#endif
3078 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003079
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003080 if (!PyArg_ParseTuple(args, "i:WIFEXITED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003081 {
3082 return NULL;
3083 }
3084
3085 return Py_BuildValue("i", WIFEXITED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003086#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003087}
3088#endif /* WIFEXITED */
3089
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003090#ifdef WEXITSTATUS
Guido van Rossumc9641791998-08-04 15:26:23 +00003091static char posix_WEXITSTATUS__doc__[] =
3092"WEXITSTATUS(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003093Return the process return code from 'status'.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003094
3095static PyObject *
3096posix_WEXITSTATUS(self, args)
3097 PyObject *self;
3098 PyObject *args;
3099{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003100#ifdef UNION_WAIT
3101 union wait status;
3102#define status_i (status.w_status)
3103#else
3104 int status;
3105#define status_i status
3106#endif
3107 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003108
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003109 if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003110 {
3111 return NULL;
3112 }
3113
3114 return Py_BuildValue("i", WEXITSTATUS(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003115#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003116}
3117#endif /* WEXITSTATUS */
3118
3119#ifdef WTERMSIG
3120static char posix_WTERMSIG__doc__[] =
3121"WTERMSIG(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003122Return the signal that terminated the process that provided the 'status'\n\
3123value.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003124
3125static PyObject *
3126posix_WTERMSIG(self, args)
3127 PyObject *self;
3128 PyObject *args;
3129{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003130#ifdef UNION_WAIT
3131 union wait status;
3132#define status_i (status.w_status)
3133#else
3134 int status;
3135#define status_i status
3136#endif
3137 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003138
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003139 if (!PyArg_ParseTuple(args, "i:WTERMSIG", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003140 {
3141 return NULL;
3142 }
3143
3144 return Py_BuildValue("i", WTERMSIG(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003145#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003146}
3147#endif /* WTERMSIG */
3148
3149#ifdef WSTOPSIG
3150static char posix_WSTOPSIG__doc__[] =
3151"WSTOPSIG(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003152Return the signal that stopped the process that provided the 'status' value.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003153
3154static PyObject *
3155posix_WSTOPSIG(self, args)
3156 PyObject *self;
3157 PyObject *args;
3158{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003159#ifdef UNION_WAIT
3160 union wait status;
3161#define status_i (status.w_status)
3162#else
3163 int status;
3164#define status_i status
3165#endif
3166 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003167
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003168 if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003169 {
3170 return NULL;
3171 }
3172
3173 return Py_BuildValue("i", WSTOPSIG(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003174#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003175}
3176#endif /* WSTOPSIG */
3177
3178#endif /* HAVE_SYS_WAIT_H */
3179
3180
Guido van Rossum94f6f721999-01-06 18:42:14 +00003181#if defined(HAVE_FSTATVFS)
Guido van Rossumd5753e11999-10-19 13:29:23 +00003182#ifdef _SCO_DS
3183/* SCO OpenServer 5.0 and later requires _SVID3 before it reveals the
3184 needed definitions in sys/statvfs.h */
3185#define _SVID3
3186#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00003187#include <sys/statvfs.h>
3188
3189static char posix_fstatvfs__doc__[] =
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003190"fstatvfs(fd) -> \n\
3191 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +00003192Perform an fstatvfs system call on the given fd.";
3193
3194static PyObject *
3195posix_fstatvfs(self, args)
3196 PyObject *self;
3197 PyObject *args;
3198{
3199 int fd, res;
3200 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003201 if (!PyArg_ParseTuple(args, "i:fstatvfs", &fd))
Guido van Rossum94f6f721999-01-06 18:42:14 +00003202 return NULL;
3203 Py_BEGIN_ALLOW_THREADS
3204 res = fstatvfs(fd, &st);
3205 Py_END_ALLOW_THREADS
3206 if (res != 0)
3207 return posix_error();
3208#if !defined(HAVE_LARGEFILE_SUPPORT)
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003209 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003210 (long) st.f_bsize,
3211 (long) st.f_frsize,
3212 (long) st.f_blocks,
3213 (long) st.f_bfree,
3214 (long) st.f_bavail,
3215 (long) st.f_files,
3216 (long) st.f_ffree,
3217 (long) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003218 (long) st.f_flag,
3219 (long) st.f_namemax);
3220#else
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003221 return Py_BuildValue("(llLLLLLLll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003222 (long) st.f_bsize,
3223 (long) st.f_frsize,
3224 (LONG_LONG) st.f_blocks,
3225 (LONG_LONG) st.f_bfree,
3226 (LONG_LONG) st.f_bavail,
3227 (LONG_LONG) st.f_files,
3228 (LONG_LONG) st.f_ffree,
3229 (LONG_LONG) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003230 (long) st.f_flag,
3231 (long) st.f_namemax);
3232#endif
3233}
3234#endif /* HAVE_FSTATVFS */
3235
3236
3237#if defined(HAVE_STATVFS)
3238#include <sys/statvfs.h>
3239
3240static char posix_statvfs__doc__[] =
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003241"statvfs(path) -> \n\
3242 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +00003243Perform a statvfs system call on the given path.";
3244
3245static PyObject *
3246posix_statvfs(self, args)
3247 PyObject *self;
3248 PyObject *args;
3249{
3250 char *path;
3251 int res;
3252 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003253 if (!PyArg_ParseTuple(args, "s:statvfs", &path))
Guido van Rossum94f6f721999-01-06 18:42:14 +00003254 return NULL;
3255 Py_BEGIN_ALLOW_THREADS
3256 res = statvfs(path, &st);
3257 Py_END_ALLOW_THREADS
3258 if (res != 0)
3259 return posix_error_with_filename(path);
3260#if !defined(HAVE_LARGEFILE_SUPPORT)
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003261 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003262 (long) st.f_bsize,
3263 (long) st.f_frsize,
3264 (long) st.f_blocks,
3265 (long) st.f_bfree,
3266 (long) st.f_bavail,
3267 (long) st.f_files,
3268 (long) st.f_ffree,
3269 (long) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003270 (long) st.f_flag,
3271 (long) st.f_namemax);
3272#else /* HAVE_LARGEFILE_SUPPORT */
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003273 return Py_BuildValue("(llLLLLLLll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003274 (long) st.f_bsize,
3275 (long) st.f_frsize,
3276 (LONG_LONG) st.f_blocks,
3277 (LONG_LONG) st.f_bfree,
3278 (LONG_LONG) st.f_bavail,
3279 (LONG_LONG) st.f_files,
3280 (LONG_LONG) st.f_ffree,
3281 (LONG_LONG) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003282 (long) st.f_flag,
3283 (long) st.f_namemax);
3284#endif
3285}
3286#endif /* HAVE_STATVFS */
3287
3288
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003289#ifdef HAVE_TEMPNAM
3290static char posix_tempnam__doc__[] = "\
3291tempnam([dir[, prefix]]) -> string\n\
3292Return a unique name for a temporary file.\n\
3293The directory and a short may be specified as strings; they may be omitted\n\
3294or None if not needed.";
3295
3296static PyObject *
3297posix_tempnam(self, args)
3298 PyObject *self;
3299 PyObject *args;
3300{
3301 PyObject *result = NULL;
3302 char *dir = NULL;
3303 char *pfx = NULL;
3304 char *name;
3305
3306 if (!PyArg_ParseTuple(args, "|zz:tempnam", &dir, &pfx))
3307 return NULL;
3308 name = tempnam(dir, pfx);
3309 if (name == NULL)
3310 return PyErr_NoMemory();
3311 result = PyString_FromString(name);
3312 free(name);
3313 return result;
3314}
Guido van Rossumd371ff11999-01-25 16:12:23 +00003315#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003316
3317
3318#ifdef HAVE_TMPFILE
3319static char posix_tmpfile__doc__[] = "\
3320tmpfile() -> file object\n\
3321Create a temporary file with no directory entries.";
3322
3323static PyObject *
3324posix_tmpfile(self, args)
3325 PyObject *self;
3326 PyObject *args;
3327{
3328 FILE *fp;
3329
3330 if (!PyArg_ParseTuple(args, ":tmpfile"))
3331 return NULL;
3332 fp = tmpfile();
3333 if (fp == NULL)
3334 return posix_error();
3335 return PyFile_FromFile(fp, "<tmpfile>", "w+", fclose);
3336}
3337#endif
3338
3339
3340#ifdef HAVE_TMPNAM
3341static char posix_tmpnam__doc__[] = "\
3342tmpnam() -> string\n\
3343Return a unique name for a temporary file.";
3344
3345static PyObject *
3346posix_tmpnam(self, args)
3347 PyObject *self;
3348 PyObject *args;
3349{
3350 char buffer[L_tmpnam];
3351 char *name;
3352
3353 if (!PyArg_ParseTuple(args, ":tmpnam"))
3354 return NULL;
Greg Wardb48bc172000-03-01 21:51:56 +00003355#ifdef USE_TMPNAM_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003356 name = tmpnam_r(buffer);
3357#else
3358 name = tmpnam(buffer);
3359#endif
3360 if (name == NULL) {
3361 PyErr_SetObject(PyExc_OSError,
3362 Py_BuildValue("is", 0,
Greg Wardb48bc172000-03-01 21:51:56 +00003363#ifdef USE_TMPNAM_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003364 "unexpected NULL from tmpnam_r"
3365#else
3366 "unexpected NULL from tmpnam"
3367#endif
3368 ));
3369 return NULL;
3370 }
3371 return PyString_FromString(buffer);
3372}
3373#endif
3374
3375
Fred Drakec9680921999-12-13 16:37:25 +00003376/* This is used for fpathconf(), pathconf(), confstr() and sysconf().
3377 * It maps strings representing configuration variable names to
3378 * integer values, allowing those functions to be called with the
3379 * magic names instead of poluting the module's namespace with tons of
Fred Drake12c6e2d1999-12-14 21:25:03 +00003380 * rarely-used constants. There are three separate tables that use
3381 * these definitions.
Fred Drakebec628d1999-12-15 18:31:10 +00003382 *
3383 * This code is always included, even if none of the interfaces that
3384 * need it are included. The #if hackery needed to avoid it would be
3385 * sufficiently pervasive that it's not worth the loss of readability.
Fred Drakec9680921999-12-13 16:37:25 +00003386 */
3387struct constdef {
3388 char *name;
3389 long value;
3390};
3391
Fred Drake12c6e2d1999-12-14 21:25:03 +00003392static int
3393conv_confname(arg, valuep, table, tablesize)
3394 PyObject *arg;
3395 int *valuep;
3396 struct constdef *table;
3397 size_t tablesize;
3398{
3399 if (PyInt_Check(arg)) {
3400 *valuep = PyInt_AS_LONG(arg);
3401 return 1;
3402 }
3403 if (PyString_Check(arg)) {
3404 /* look up the value in the table using a binary search */
3405 int lo = 0;
3406 int hi = tablesize;
3407 int cmp, mid;
3408 char *confname = PyString_AS_STRING(arg);
3409 while (lo < hi) {
3410 mid = (lo + hi) / 2;
3411 cmp = strcmp(confname, table[mid].name);
3412 if (cmp < 0)
3413 hi = mid;
3414 else if (cmp > 0)
3415 lo = mid + 1;
3416 else {
3417 *valuep = table[mid].value;
3418 return 1;
3419 }
3420 }
3421 PyErr_SetString(PyExc_ValueError, "unrecognized configuration name");
3422 }
3423 else
3424 PyErr_SetString(PyExc_TypeError,
3425 "configuration names must be strings or integers");
3426 return 0;
3427}
3428
3429
3430#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
3431static struct constdef posix_constants_pathconf[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003432#ifdef _PC_ABI_AIO_XFER_MAX
3433 {"PC_ABI_AIO_XFER_MAX", _PC_ABI_AIO_XFER_MAX},
3434#endif
3435#ifdef _PC_ABI_ASYNC_IO
3436 {"PC_ABI_ASYNC_IO", _PC_ABI_ASYNC_IO},
3437#endif
Fred Drakec9680921999-12-13 16:37:25 +00003438#ifdef _PC_ASYNC_IO
3439 {"PC_ASYNC_IO", _PC_ASYNC_IO},
3440#endif
3441#ifdef _PC_CHOWN_RESTRICTED
3442 {"PC_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED},
3443#endif
3444#ifdef _PC_FILESIZEBITS
3445 {"PC_FILESIZEBITS", _PC_FILESIZEBITS},
3446#endif
3447#ifdef _PC_LAST
3448 {"PC_LAST", _PC_LAST},
3449#endif
3450#ifdef _PC_LINK_MAX
3451 {"PC_LINK_MAX", _PC_LINK_MAX},
3452#endif
3453#ifdef _PC_MAX_CANON
3454 {"PC_MAX_CANON", _PC_MAX_CANON},
3455#endif
3456#ifdef _PC_MAX_INPUT
3457 {"PC_MAX_INPUT", _PC_MAX_INPUT},
3458#endif
3459#ifdef _PC_NAME_MAX
3460 {"PC_NAME_MAX", _PC_NAME_MAX},
3461#endif
3462#ifdef _PC_NO_TRUNC
3463 {"PC_NO_TRUNC", _PC_NO_TRUNC},
3464#endif
3465#ifdef _PC_PATH_MAX
3466 {"PC_PATH_MAX", _PC_PATH_MAX},
3467#endif
3468#ifdef _PC_PIPE_BUF
3469 {"PC_PIPE_BUF", _PC_PIPE_BUF},
3470#endif
3471#ifdef _PC_PRIO_IO
3472 {"PC_PRIO_IO", _PC_PRIO_IO},
3473#endif
3474#ifdef _PC_SOCK_MAXBUF
3475 {"PC_SOCK_MAXBUF", _PC_SOCK_MAXBUF},
3476#endif
3477#ifdef _PC_SYNC_IO
3478 {"PC_SYNC_IO", _PC_SYNC_IO},
3479#endif
3480#ifdef _PC_VDISABLE
3481 {"PC_VDISABLE", _PC_VDISABLE},
3482#endif
3483};
3484
Fred Drakec9680921999-12-13 16:37:25 +00003485static int
3486conv_path_confname(arg, valuep)
3487 PyObject *arg;
3488 int *valuep;
3489{
3490 return conv_confname(arg, valuep, posix_constants_pathconf,
3491 sizeof(posix_constants_pathconf)
3492 / sizeof(struct constdef));
3493}
3494#endif
3495
3496#ifdef HAVE_FPATHCONF
3497static char posix_fpathconf__doc__[] = "\
3498fpathconf(fd, name) -> integer\n\
3499Return the configuration limit name for the file descriptor fd.\n\
3500If there is no limit, return -1.";
3501
3502static PyObject *
3503posix_fpathconf(self, args)
3504 PyObject *self;
3505 PyObject *args;
3506{
3507 PyObject *result = NULL;
3508 int name, fd;
3509
Fred Drake12c6e2d1999-12-14 21:25:03 +00003510 if (PyArg_ParseTuple(args, "iO&:fpathconf", &fd,
3511 conv_path_confname, &name)) {
Fred Drakec9680921999-12-13 16:37:25 +00003512 long limit;
3513
3514 errno = 0;
3515 limit = fpathconf(fd, name);
3516 if (limit == -1 && errno != 0)
3517 posix_error();
3518 else
3519 result = PyInt_FromLong(limit);
3520 }
3521 return result;
3522}
3523#endif
3524
3525
3526#ifdef HAVE_PATHCONF
3527static char posix_pathconf__doc__[] = "\
3528pathconf(path, name) -> integer\n\
3529Return the configuration limit name for the file or directory path.\n\
3530If there is no limit, return -1.";
3531
3532static PyObject *
3533posix_pathconf(self, args)
3534 PyObject *self;
3535 PyObject *args;
3536{
3537 PyObject *result = NULL;
3538 int name;
3539 char *path;
3540
3541 if (PyArg_ParseTuple(args, "sO&:pathconf", &path,
3542 conv_path_confname, &name)) {
3543 long limit;
3544
3545 errno = 0;
3546 limit = pathconf(path, name);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003547 if (limit == -1 && errno != 0) {
Fred Drakec9680921999-12-13 16:37:25 +00003548 if (errno == EINVAL)
3549 /* could be a path or name problem */
3550 posix_error();
3551 else
3552 posix_error_with_filename(path);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003553 }
Fred Drakec9680921999-12-13 16:37:25 +00003554 else
3555 result = PyInt_FromLong(limit);
3556 }
3557 return result;
3558}
3559#endif
3560
3561#ifdef HAVE_CONFSTR
3562static struct constdef posix_constants_confstr[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003563#ifdef _CS_ARCHITECTURE
3564 {"CS_ARCHITECTURE", _CS_ARCHITECTURE},
3565#endif
3566#ifdef _CS_HOSTNAME
3567 {"CS_HOSTNAME", _CS_HOSTNAME},
3568#endif
3569#ifdef _CS_HW_PROVIDER
3570 {"CS_HW_PROVIDER", _CS_HW_PROVIDER},
3571#endif
3572#ifdef _CS_HW_SERIAL
3573 {"CS_HW_SERIAL", _CS_HW_SERIAL},
3574#endif
3575#ifdef _CS_INITTAB_NAME
3576 {"CS_INITTAB_NAME", _CS_INITTAB_NAME},
3577#endif
Fred Drakec9680921999-12-13 16:37:25 +00003578#ifdef _CS_LFS64_CFLAGS
3579 {"CS_LFS64_CFLAGS", _CS_LFS64_CFLAGS},
3580#endif
3581#ifdef _CS_LFS64_LDFLAGS
3582 {"CS_LFS64_LDFLAGS", _CS_LFS64_LDFLAGS},
3583#endif
3584#ifdef _CS_LFS64_LIBS
3585 {"CS_LFS64_LIBS", _CS_LFS64_LIBS},
3586#endif
3587#ifdef _CS_LFS64_LINTFLAGS
3588 {"CS_LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS},
3589#endif
3590#ifdef _CS_LFS_CFLAGS
3591 {"CS_LFS_CFLAGS", _CS_LFS_CFLAGS},
3592#endif
3593#ifdef _CS_LFS_LDFLAGS
3594 {"CS_LFS_LDFLAGS", _CS_LFS_LDFLAGS},
3595#endif
3596#ifdef _CS_LFS_LIBS
3597 {"CS_LFS_LIBS", _CS_LFS_LIBS},
3598#endif
3599#ifdef _CS_LFS_LINTFLAGS
3600 {"CS_LFS_LINTFLAGS", _CS_LFS_LINTFLAGS},
3601#endif
Fred Draked86ed291999-12-15 15:34:33 +00003602#ifdef _CS_MACHINE
3603 {"CS_MACHINE", _CS_MACHINE},
3604#endif
Fred Drakec9680921999-12-13 16:37:25 +00003605#ifdef _CS_PATH
3606 {"CS_PATH", _CS_PATH},
3607#endif
Fred Draked86ed291999-12-15 15:34:33 +00003608#ifdef _CS_RELEASE
3609 {"CS_RELEASE", _CS_RELEASE},
3610#endif
3611#ifdef _CS_SRPC_DOMAIN
3612 {"CS_SRPC_DOMAIN", _CS_SRPC_DOMAIN},
3613#endif
3614#ifdef _CS_SYSNAME
3615 {"CS_SYSNAME", _CS_SYSNAME},
3616#endif
3617#ifdef _CS_VERSION
3618 {"CS_VERSION", _CS_VERSION},
3619#endif
Fred Drakec9680921999-12-13 16:37:25 +00003620#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS
3621 {"CS_XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS},
3622#endif
3623#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS
3624 {"CS_XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS},
3625#endif
3626#ifdef _CS_XBS5_ILP32_OFF32_LIBS
3627 {"CS_XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS},
3628#endif
3629#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS
3630 {"CS_XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS},
3631#endif
3632#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS
3633 {"CS_XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS},
3634#endif
3635#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS
3636 {"CS_XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS},
3637#endif
3638#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS
3639 {"CS_XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS},
3640#endif
3641#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
3642 {"CS_XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS},
3643#endif
3644#ifdef _CS_XBS5_LP64_OFF64_CFLAGS
3645 {"CS_XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS},
3646#endif
3647#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS
3648 {"CS_XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS},
3649#endif
3650#ifdef _CS_XBS5_LP64_OFF64_LIBS
3651 {"CS_XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS},
3652#endif
3653#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS
3654 {"CS_XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS},
3655#endif
3656#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS
3657 {"CS_XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS},
3658#endif
3659#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
3660 {"CS_XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS},
3661#endif
3662#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS
3663 {"CS_XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS},
3664#endif
3665#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
3666 {"CS_XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS},
3667#endif
Fred Draked86ed291999-12-15 15:34:33 +00003668#ifdef _MIPS_CS_AVAIL_PROCESSORS
3669 {"MIPS_CS_AVAIL_PROCESSORS", _MIPS_CS_AVAIL_PROCESSORS},
3670#endif
3671#ifdef _MIPS_CS_BASE
3672 {"MIPS_CS_BASE", _MIPS_CS_BASE},
3673#endif
3674#ifdef _MIPS_CS_HOSTID
3675 {"MIPS_CS_HOSTID", _MIPS_CS_HOSTID},
3676#endif
3677#ifdef _MIPS_CS_HW_NAME
3678 {"MIPS_CS_HW_NAME", _MIPS_CS_HW_NAME},
3679#endif
3680#ifdef _MIPS_CS_NUM_PROCESSORS
3681 {"MIPS_CS_NUM_PROCESSORS", _MIPS_CS_NUM_PROCESSORS},
3682#endif
3683#ifdef _MIPS_CS_OSREL_MAJ
3684 {"MIPS_CS_OSREL_MAJ", _MIPS_CS_OSREL_MAJ},
3685#endif
3686#ifdef _MIPS_CS_OSREL_MIN
3687 {"MIPS_CS_OSREL_MIN", _MIPS_CS_OSREL_MIN},
3688#endif
3689#ifdef _MIPS_CS_OSREL_PATCH
3690 {"MIPS_CS_OSREL_PATCH", _MIPS_CS_OSREL_PATCH},
3691#endif
3692#ifdef _MIPS_CS_OS_NAME
3693 {"MIPS_CS_OS_NAME", _MIPS_CS_OS_NAME},
3694#endif
3695#ifdef _MIPS_CS_OS_PROVIDER
3696 {"MIPS_CS_OS_PROVIDER", _MIPS_CS_OS_PROVIDER},
3697#endif
3698#ifdef _MIPS_CS_PROCESSORS
3699 {"MIPS_CS_PROCESSORS", _MIPS_CS_PROCESSORS},
3700#endif
3701#ifdef _MIPS_CS_SERIAL
3702 {"MIPS_CS_SERIAL", _MIPS_CS_SERIAL},
3703#endif
3704#ifdef _MIPS_CS_VENDOR
3705 {"MIPS_CS_VENDOR", _MIPS_CS_VENDOR},
3706#endif
Fred Drakec9680921999-12-13 16:37:25 +00003707};
3708
3709static int
3710conv_confstr_confname(arg, valuep)
3711 PyObject *arg;
3712 int *valuep;
3713{
3714 return conv_confname(arg, valuep, posix_constants_confstr,
3715 sizeof(posix_constants_confstr)
3716 / sizeof(struct constdef));
3717}
3718
3719static char posix_confstr__doc__[] = "\
3720confstr(name) -> string\n\
3721Return a string-valued system configuration variable.";
3722
3723static PyObject *
3724posix_confstr(self, args)
3725 PyObject *self;
3726 PyObject *args;
3727{
3728 PyObject *result = NULL;
3729 int name;
3730 char buffer[64];
3731
3732 if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) {
3733 int len = confstr(name, buffer, sizeof(buffer));
3734
Fred Drakec9680921999-12-13 16:37:25 +00003735 errno = 0;
3736 if (len == 0) {
3737 if (errno != 0)
3738 posix_error();
3739 else
3740 result = PyString_FromString("");
3741 }
3742 else {
3743 if (len >= sizeof(buffer)) {
3744 result = PyString_FromStringAndSize(NULL, len);
3745 if (result != NULL)
3746 confstr(name, PyString_AS_STRING(result), len+1);
3747 }
3748 else
3749 result = PyString_FromString(buffer);
3750 }
3751 }
3752 return result;
3753}
3754#endif
3755
3756
3757#ifdef HAVE_SYSCONF
3758static struct constdef posix_constants_sysconf[] = {
3759#ifdef _SC_2_CHAR_TERM
3760 {"SC_2_CHAR_TERM", _SC_2_CHAR_TERM},
3761#endif
3762#ifdef _SC_2_C_BIND
3763 {"SC_2_C_BIND", _SC_2_C_BIND},
3764#endif
3765#ifdef _SC_2_C_DEV
3766 {"SC_2_C_DEV", _SC_2_C_DEV},
3767#endif
3768#ifdef _SC_2_C_VERSION
3769 {"SC_2_C_VERSION", _SC_2_C_VERSION},
3770#endif
3771#ifdef _SC_2_FORT_DEV
3772 {"SC_2_FORT_DEV", _SC_2_FORT_DEV},
3773#endif
3774#ifdef _SC_2_FORT_RUN
3775 {"SC_2_FORT_RUN", _SC_2_FORT_RUN},
3776#endif
3777#ifdef _SC_2_LOCALEDEF
3778 {"SC_2_LOCALEDEF", _SC_2_LOCALEDEF},
3779#endif
3780#ifdef _SC_2_SW_DEV
3781 {"SC_2_SW_DEV", _SC_2_SW_DEV},
3782#endif
3783#ifdef _SC_2_UPE
3784 {"SC_2_UPE", _SC_2_UPE},
3785#endif
3786#ifdef _SC_2_VERSION
3787 {"SC_2_VERSION", _SC_2_VERSION},
3788#endif
Fred Draked86ed291999-12-15 15:34:33 +00003789#ifdef _SC_ABI_ASYNCHRONOUS_IO
3790 {"SC_ABI_ASYNCHRONOUS_IO", _SC_ABI_ASYNCHRONOUS_IO},
3791#endif
3792#ifdef _SC_ACL
3793 {"SC_ACL", _SC_ACL},
3794#endif
Fred Drakec9680921999-12-13 16:37:25 +00003795#ifdef _SC_AIO_LISTIO_MAX
3796 {"SC_AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX},
3797#endif
Fred Drakec9680921999-12-13 16:37:25 +00003798#ifdef _SC_AIO_MAX
3799 {"SC_AIO_MAX", _SC_AIO_MAX},
3800#endif
3801#ifdef _SC_AIO_PRIO_DELTA_MAX
3802 {"SC_AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX},
3803#endif
3804#ifdef _SC_ARG_MAX
3805 {"SC_ARG_MAX", _SC_ARG_MAX},
3806#endif
3807#ifdef _SC_ASYNCHRONOUS_IO
3808 {"SC_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO},
3809#endif
3810#ifdef _SC_ATEXIT_MAX
3811 {"SC_ATEXIT_MAX", _SC_ATEXIT_MAX},
3812#endif
Fred Draked86ed291999-12-15 15:34:33 +00003813#ifdef _SC_AUDIT
3814 {"SC_AUDIT", _SC_AUDIT},
3815#endif
Fred Drakec9680921999-12-13 16:37:25 +00003816#ifdef _SC_AVPHYS_PAGES
3817 {"SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES},
3818#endif
3819#ifdef _SC_BC_BASE_MAX
3820 {"SC_BC_BASE_MAX", _SC_BC_BASE_MAX},
3821#endif
3822#ifdef _SC_BC_DIM_MAX
3823 {"SC_BC_DIM_MAX", _SC_BC_DIM_MAX},
3824#endif
3825#ifdef _SC_BC_SCALE_MAX
3826 {"SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX},
3827#endif
3828#ifdef _SC_BC_STRING_MAX
3829 {"SC_BC_STRING_MAX", _SC_BC_STRING_MAX},
3830#endif
Fred Draked86ed291999-12-15 15:34:33 +00003831#ifdef _SC_CAP
3832 {"SC_CAP", _SC_CAP},
3833#endif
Fred Drakec9680921999-12-13 16:37:25 +00003834#ifdef _SC_CHARCLASS_NAME_MAX
3835 {"SC_CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX},
3836#endif
3837#ifdef _SC_CHAR_BIT
3838 {"SC_CHAR_BIT", _SC_CHAR_BIT},
3839#endif
3840#ifdef _SC_CHAR_MAX
3841 {"SC_CHAR_MAX", _SC_CHAR_MAX},
3842#endif
3843#ifdef _SC_CHAR_MIN
3844 {"SC_CHAR_MIN", _SC_CHAR_MIN},
3845#endif
3846#ifdef _SC_CHILD_MAX
3847 {"SC_CHILD_MAX", _SC_CHILD_MAX},
3848#endif
3849#ifdef _SC_CLK_TCK
3850 {"SC_CLK_TCK", _SC_CLK_TCK},
3851#endif
3852#ifdef _SC_COHER_BLKSZ
3853 {"SC_COHER_BLKSZ", _SC_COHER_BLKSZ},
3854#endif
3855#ifdef _SC_COLL_WEIGHTS_MAX
3856 {"SC_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX},
3857#endif
3858#ifdef _SC_DCACHE_ASSOC
3859 {"SC_DCACHE_ASSOC", _SC_DCACHE_ASSOC},
3860#endif
3861#ifdef _SC_DCACHE_BLKSZ
3862 {"SC_DCACHE_BLKSZ", _SC_DCACHE_BLKSZ},
3863#endif
3864#ifdef _SC_DCACHE_LINESZ
3865 {"SC_DCACHE_LINESZ", _SC_DCACHE_LINESZ},
3866#endif
3867#ifdef _SC_DCACHE_SZ
3868 {"SC_DCACHE_SZ", _SC_DCACHE_SZ},
3869#endif
3870#ifdef _SC_DCACHE_TBLKSZ
3871 {"SC_DCACHE_TBLKSZ", _SC_DCACHE_TBLKSZ},
3872#endif
3873#ifdef _SC_DELAYTIMER_MAX
3874 {"SC_DELAYTIMER_MAX", _SC_DELAYTIMER_MAX},
3875#endif
3876#ifdef _SC_EQUIV_CLASS_MAX
3877 {"SC_EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX},
3878#endif
3879#ifdef _SC_EXPR_NEST_MAX
3880 {"SC_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX},
3881#endif
3882#ifdef _SC_FSYNC
3883 {"SC_FSYNC", _SC_FSYNC},
3884#endif
3885#ifdef _SC_GETGR_R_SIZE_MAX
3886 {"SC_GETGR_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX},
3887#endif
3888#ifdef _SC_GETPW_R_SIZE_MAX
3889 {"SC_GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX},
3890#endif
3891#ifdef _SC_ICACHE_ASSOC
3892 {"SC_ICACHE_ASSOC", _SC_ICACHE_ASSOC},
3893#endif
3894#ifdef _SC_ICACHE_BLKSZ
3895 {"SC_ICACHE_BLKSZ", _SC_ICACHE_BLKSZ},
3896#endif
3897#ifdef _SC_ICACHE_LINESZ
3898 {"SC_ICACHE_LINESZ", _SC_ICACHE_LINESZ},
3899#endif
3900#ifdef _SC_ICACHE_SZ
3901 {"SC_ICACHE_SZ", _SC_ICACHE_SZ},
3902#endif
Fred Draked86ed291999-12-15 15:34:33 +00003903#ifdef _SC_INF
3904 {"SC_INF", _SC_INF},
3905#endif
Fred Drakec9680921999-12-13 16:37:25 +00003906#ifdef _SC_INT_MAX
3907 {"SC_INT_MAX", _SC_INT_MAX},
3908#endif
3909#ifdef _SC_INT_MIN
3910 {"SC_INT_MIN", _SC_INT_MIN},
3911#endif
3912#ifdef _SC_IOV_MAX
3913 {"SC_IOV_MAX", _SC_IOV_MAX},
3914#endif
Fred Draked86ed291999-12-15 15:34:33 +00003915#ifdef _SC_IP_SECOPTS
3916 {"SC_IP_SECOPTS", _SC_IP_SECOPTS},
3917#endif
Fred Drakec9680921999-12-13 16:37:25 +00003918#ifdef _SC_JOB_CONTROL
3919 {"SC_JOB_CONTROL", _SC_JOB_CONTROL},
3920#endif
Fred Draked86ed291999-12-15 15:34:33 +00003921#ifdef _SC_KERN_POINTERS
3922 {"SC_KERN_POINTERS", _SC_KERN_POINTERS},
3923#endif
3924#ifdef _SC_KERN_SIM
3925 {"SC_KERN_SIM", _SC_KERN_SIM},
3926#endif
Fred Drakec9680921999-12-13 16:37:25 +00003927#ifdef _SC_LINE_MAX
3928 {"SC_LINE_MAX", _SC_LINE_MAX},
3929#endif
3930#ifdef _SC_LOGIN_NAME_MAX
3931 {"SC_LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX},
3932#endif
3933#ifdef _SC_LOGNAME_MAX
3934 {"SC_LOGNAME_MAX", _SC_LOGNAME_MAX},
3935#endif
3936#ifdef _SC_LONG_BIT
3937 {"SC_LONG_BIT", _SC_LONG_BIT},
3938#endif
Fred Draked86ed291999-12-15 15:34:33 +00003939#ifdef _SC_MAC
3940 {"SC_MAC", _SC_MAC},
3941#endif
Fred Drakec9680921999-12-13 16:37:25 +00003942#ifdef _SC_MAPPED_FILES
3943 {"SC_MAPPED_FILES", _SC_MAPPED_FILES},
3944#endif
3945#ifdef _SC_MAXPID
3946 {"SC_MAXPID", _SC_MAXPID},
3947#endif
3948#ifdef _SC_MB_LEN_MAX
3949 {"SC_MB_LEN_MAX", _SC_MB_LEN_MAX},
3950#endif
3951#ifdef _SC_MEMLOCK
3952 {"SC_MEMLOCK", _SC_MEMLOCK},
3953#endif
3954#ifdef _SC_MEMLOCK_RANGE
3955 {"SC_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE},
3956#endif
3957#ifdef _SC_MEMORY_PROTECTION
3958 {"SC_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION},
3959#endif
3960#ifdef _SC_MESSAGE_PASSING
3961 {"SC_MESSAGE_PASSING", _SC_MESSAGE_PASSING},
3962#endif
Fred Draked86ed291999-12-15 15:34:33 +00003963#ifdef _SC_MMAP_FIXED_ALIGNMENT
3964 {"SC_MMAP_FIXED_ALIGNMENT", _SC_MMAP_FIXED_ALIGNMENT},
3965#endif
Fred Drakec9680921999-12-13 16:37:25 +00003966#ifdef _SC_MQ_OPEN_MAX
3967 {"SC_MQ_OPEN_MAX", _SC_MQ_OPEN_MAX},
3968#endif
3969#ifdef _SC_MQ_PRIO_MAX
3970 {"SC_MQ_PRIO_MAX", _SC_MQ_PRIO_MAX},
3971#endif
Fred Draked86ed291999-12-15 15:34:33 +00003972#ifdef _SC_NACLS_MAX
3973 {"SC_NACLS_MAX", _SC_NACLS_MAX},
3974#endif
Fred Drakec9680921999-12-13 16:37:25 +00003975#ifdef _SC_NGROUPS_MAX
3976 {"SC_NGROUPS_MAX", _SC_NGROUPS_MAX},
3977#endif
3978#ifdef _SC_NL_ARGMAX
3979 {"SC_NL_ARGMAX", _SC_NL_ARGMAX},
3980#endif
3981#ifdef _SC_NL_LANGMAX
3982 {"SC_NL_LANGMAX", _SC_NL_LANGMAX},
3983#endif
3984#ifdef _SC_NL_MSGMAX
3985 {"SC_NL_MSGMAX", _SC_NL_MSGMAX},
3986#endif
3987#ifdef _SC_NL_NMAX
3988 {"SC_NL_NMAX", _SC_NL_NMAX},
3989#endif
3990#ifdef _SC_NL_SETMAX
3991 {"SC_NL_SETMAX", _SC_NL_SETMAX},
3992#endif
3993#ifdef _SC_NL_TEXTMAX
3994 {"SC_NL_TEXTMAX", _SC_NL_TEXTMAX},
3995#endif
3996#ifdef _SC_NPROCESSORS_CONF
3997 {"SC_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF},
3998#endif
3999#ifdef _SC_NPROCESSORS_ONLN
4000 {"SC_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN},
4001#endif
Fred Draked86ed291999-12-15 15:34:33 +00004002#ifdef _SC_NPROC_CONF
4003 {"SC_NPROC_CONF", _SC_NPROC_CONF},
4004#endif
4005#ifdef _SC_NPROC_ONLN
4006 {"SC_NPROC_ONLN", _SC_NPROC_ONLN},
4007#endif
Fred Drakec9680921999-12-13 16:37:25 +00004008#ifdef _SC_NZERO
4009 {"SC_NZERO", _SC_NZERO},
4010#endif
4011#ifdef _SC_OPEN_MAX
4012 {"SC_OPEN_MAX", _SC_OPEN_MAX},
4013#endif
4014#ifdef _SC_PAGESIZE
4015 {"SC_PAGESIZE", _SC_PAGESIZE},
4016#endif
4017#ifdef _SC_PAGE_SIZE
4018 {"SC_PAGE_SIZE", _SC_PAGE_SIZE},
4019#endif
4020#ifdef _SC_PASS_MAX
4021 {"SC_PASS_MAX", _SC_PASS_MAX},
4022#endif
4023#ifdef _SC_PHYS_PAGES
4024 {"SC_PHYS_PAGES", _SC_PHYS_PAGES},
4025#endif
4026#ifdef _SC_PII
4027 {"SC_PII", _SC_PII},
4028#endif
4029#ifdef _SC_PII_INTERNET
4030 {"SC_PII_INTERNET", _SC_PII_INTERNET},
4031#endif
4032#ifdef _SC_PII_INTERNET_DGRAM
4033 {"SC_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM},
4034#endif
4035#ifdef _SC_PII_INTERNET_STREAM
4036 {"SC_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM},
4037#endif
4038#ifdef _SC_PII_OSI
4039 {"SC_PII_OSI", _SC_PII_OSI},
4040#endif
4041#ifdef _SC_PII_OSI_CLTS
4042 {"SC_PII_OSI_CLTS", _SC_PII_OSI_CLTS},
4043#endif
4044#ifdef _SC_PII_OSI_COTS
4045 {"SC_PII_OSI_COTS", _SC_PII_OSI_COTS},
4046#endif
4047#ifdef _SC_PII_OSI_M
4048 {"SC_PII_OSI_M", _SC_PII_OSI_M},
4049#endif
4050#ifdef _SC_PII_SOCKET
4051 {"SC_PII_SOCKET", _SC_PII_SOCKET},
4052#endif
4053#ifdef _SC_PII_XTI
4054 {"SC_PII_XTI", _SC_PII_XTI},
4055#endif
4056#ifdef _SC_POLL
4057 {"SC_POLL", _SC_POLL},
4058#endif
4059#ifdef _SC_PRIORITIZED_IO
4060 {"SC_PRIORITIZED_IO", _SC_PRIORITIZED_IO},
4061#endif
4062#ifdef _SC_PRIORITY_SCHEDULING
4063 {"SC_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING},
4064#endif
4065#ifdef _SC_REALTIME_SIGNALS
4066 {"SC_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS},
4067#endif
4068#ifdef _SC_RE_DUP_MAX
4069 {"SC_RE_DUP_MAX", _SC_RE_DUP_MAX},
4070#endif
4071#ifdef _SC_RTSIG_MAX
4072 {"SC_RTSIG_MAX", _SC_RTSIG_MAX},
4073#endif
4074#ifdef _SC_SAVED_IDS
4075 {"SC_SAVED_IDS", _SC_SAVED_IDS},
4076#endif
4077#ifdef _SC_SCHAR_MAX
4078 {"SC_SCHAR_MAX", _SC_SCHAR_MAX},
4079#endif
4080#ifdef _SC_SCHAR_MIN
4081 {"SC_SCHAR_MIN", _SC_SCHAR_MIN},
4082#endif
4083#ifdef _SC_SELECT
4084 {"SC_SELECT", _SC_SELECT},
4085#endif
4086#ifdef _SC_SEMAPHORES
4087 {"SC_SEMAPHORES", _SC_SEMAPHORES},
4088#endif
4089#ifdef _SC_SEM_NSEMS_MAX
4090 {"SC_SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX},
4091#endif
4092#ifdef _SC_SEM_VALUE_MAX
4093 {"SC_SEM_VALUE_MAX", _SC_SEM_VALUE_MAX},
4094#endif
4095#ifdef _SC_SHARED_MEMORY_OBJECTS
4096 {"SC_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS},
4097#endif
4098#ifdef _SC_SHRT_MAX
4099 {"SC_SHRT_MAX", _SC_SHRT_MAX},
4100#endif
4101#ifdef _SC_SHRT_MIN
4102 {"SC_SHRT_MIN", _SC_SHRT_MIN},
4103#endif
4104#ifdef _SC_SIGQUEUE_MAX
4105 {"SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX},
4106#endif
4107#ifdef _SC_SIGRT_MAX
4108 {"SC_SIGRT_MAX", _SC_SIGRT_MAX},
4109#endif
4110#ifdef _SC_SIGRT_MIN
4111 {"SC_SIGRT_MIN", _SC_SIGRT_MIN},
4112#endif
Fred Draked86ed291999-12-15 15:34:33 +00004113#ifdef _SC_SOFTPOWER
4114 {"SC_SOFTPOWER", _SC_SOFTPOWER},
4115#endif
Fred Drakec9680921999-12-13 16:37:25 +00004116#ifdef _SC_SPLIT_CACHE
4117 {"SC_SPLIT_CACHE", _SC_SPLIT_CACHE},
4118#endif
4119#ifdef _SC_SSIZE_MAX
4120 {"SC_SSIZE_MAX", _SC_SSIZE_MAX},
4121#endif
4122#ifdef _SC_STACK_PROT
4123 {"SC_STACK_PROT", _SC_STACK_PROT},
4124#endif
4125#ifdef _SC_STREAM_MAX
4126 {"SC_STREAM_MAX", _SC_STREAM_MAX},
4127#endif
4128#ifdef _SC_SYNCHRONIZED_IO
4129 {"SC_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO},
4130#endif
4131#ifdef _SC_THREADS
4132 {"SC_THREADS", _SC_THREADS},
4133#endif
4134#ifdef _SC_THREAD_ATTR_STACKADDR
4135 {"SC_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR},
4136#endif
4137#ifdef _SC_THREAD_ATTR_STACKSIZE
4138 {"SC_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE},
4139#endif
4140#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS
4141 {"SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS},
4142#endif
4143#ifdef _SC_THREAD_KEYS_MAX
4144 {"SC_THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX},
4145#endif
4146#ifdef _SC_THREAD_PRIORITY_SCHEDULING
4147 {"SC_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING},
4148#endif
4149#ifdef _SC_THREAD_PRIO_INHERIT
4150 {"SC_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT},
4151#endif
4152#ifdef _SC_THREAD_PRIO_PROTECT
4153 {"SC_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT},
4154#endif
4155#ifdef _SC_THREAD_PROCESS_SHARED
4156 {"SC_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED},
4157#endif
4158#ifdef _SC_THREAD_SAFE_FUNCTIONS
4159 {"SC_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS},
4160#endif
4161#ifdef _SC_THREAD_STACK_MIN
4162 {"SC_THREAD_STACK_MIN", _SC_THREAD_STACK_MIN},
4163#endif
4164#ifdef _SC_THREAD_THREADS_MAX
4165 {"SC_THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX},
4166#endif
4167#ifdef _SC_TIMERS
4168 {"SC_TIMERS", _SC_TIMERS},
4169#endif
4170#ifdef _SC_TIMER_MAX
4171 {"SC_TIMER_MAX", _SC_TIMER_MAX},
4172#endif
4173#ifdef _SC_TTY_NAME_MAX
4174 {"SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX},
4175#endif
4176#ifdef _SC_TZNAME_MAX
4177 {"SC_TZNAME_MAX", _SC_TZNAME_MAX},
4178#endif
4179#ifdef _SC_T_IOV_MAX
4180 {"SC_T_IOV_MAX", _SC_T_IOV_MAX},
4181#endif
4182#ifdef _SC_UCHAR_MAX
4183 {"SC_UCHAR_MAX", _SC_UCHAR_MAX},
4184#endif
4185#ifdef _SC_UINT_MAX
4186 {"SC_UINT_MAX", _SC_UINT_MAX},
4187#endif
4188#ifdef _SC_UIO_MAXIOV
4189 {"SC_UIO_MAXIOV", _SC_UIO_MAXIOV},
4190#endif
4191#ifdef _SC_ULONG_MAX
4192 {"SC_ULONG_MAX", _SC_ULONG_MAX},
4193#endif
4194#ifdef _SC_USHRT_MAX
4195 {"SC_USHRT_MAX", _SC_USHRT_MAX},
4196#endif
4197#ifdef _SC_VERSION
4198 {"SC_VERSION", _SC_VERSION},
4199#endif
4200#ifdef _SC_WORD_BIT
4201 {"SC_WORD_BIT", _SC_WORD_BIT},
4202#endif
4203#ifdef _SC_XBS5_ILP32_OFF32
4204 {"SC_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32},
4205#endif
4206#ifdef _SC_XBS5_ILP32_OFFBIG
4207 {"SC_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG},
4208#endif
4209#ifdef _SC_XBS5_LP64_OFF64
4210 {"SC_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64},
4211#endif
4212#ifdef _SC_XBS5_LPBIG_OFFBIG
4213 {"SC_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG},
4214#endif
4215#ifdef _SC_XOPEN_CRYPT
4216 {"SC_XOPEN_CRYPT", _SC_XOPEN_CRYPT},
4217#endif
4218#ifdef _SC_XOPEN_ENH_I18N
4219 {"SC_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N},
4220#endif
4221#ifdef _SC_XOPEN_LEGACY
4222 {"SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY},
4223#endif
4224#ifdef _SC_XOPEN_REALTIME
4225 {"SC_XOPEN_REALTIME", _SC_XOPEN_REALTIME},
4226#endif
4227#ifdef _SC_XOPEN_REALTIME_THREADS
4228 {"SC_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS},
4229#endif
4230#ifdef _SC_XOPEN_SHM
4231 {"SC_XOPEN_SHM", _SC_XOPEN_SHM},
4232#endif
4233#ifdef _SC_XOPEN_UNIX
4234 {"SC_XOPEN_UNIX", _SC_XOPEN_UNIX},
4235#endif
4236#ifdef _SC_XOPEN_VERSION
4237 {"SC_XOPEN_VERSION", _SC_XOPEN_VERSION},
4238#endif
4239#ifdef _SC_XOPEN_XCU_VERSION
4240 {"SC_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION},
4241#endif
4242#ifdef _SC_XOPEN_XPG2
4243 {"SC_XOPEN_XPG2", _SC_XOPEN_XPG2},
4244#endif
4245#ifdef _SC_XOPEN_XPG3
4246 {"SC_XOPEN_XPG3", _SC_XOPEN_XPG3},
4247#endif
4248#ifdef _SC_XOPEN_XPG4
4249 {"SC_XOPEN_XPG4", _SC_XOPEN_XPG4},
4250#endif
4251};
4252
4253static int
4254conv_sysconf_confname(arg, valuep)
4255 PyObject *arg;
4256 int *valuep;
4257{
4258 return conv_confname(arg, valuep, posix_constants_sysconf,
4259 sizeof(posix_constants_sysconf)
4260 / sizeof(struct constdef));
4261}
4262
4263static char posix_sysconf__doc__[] = "\
4264sysconf(name) -> integer\n\
4265Return an integer-valued system configuration variable.";
4266
4267static PyObject *
4268posix_sysconf(self, args)
4269 PyObject *self;
4270 PyObject *args;
4271{
4272 PyObject *result = NULL;
4273 int name;
4274
4275 if (PyArg_ParseTuple(args, "O&:sysconf", conv_sysconf_confname, &name)) {
4276 int value;
4277
4278 errno = 0;
4279 value = sysconf(name);
4280 if (value == -1 && errno != 0)
4281 posix_error();
4282 else
4283 result = PyInt_FromLong(value);
4284 }
4285 return result;
4286}
4287#endif
4288
4289
Fred Drakebec628d1999-12-15 18:31:10 +00004290/* This code is used to ensure that the tables of configuration value names
4291 * are in sorted order as required by conv_confname(), and also to build the
4292 * the exported dictionaries that are used to publish information about the
4293 * names available on the host platform.
4294 *
4295 * Sorting the table at runtime ensures that the table is properly ordered
4296 * when used, even for platforms we're not able to test on. It also makes
4297 * it easier to add additional entries to the tables.
Fred Draked86ed291999-12-15 15:34:33 +00004298 */
Fred Drakebec628d1999-12-15 18:31:10 +00004299
4300static int
4301cmp_constdefs(v1, v2)
4302 const void *v1;
4303 const void *v2;
4304{
4305 const struct constdef *c1 =
4306 (const struct constdef *) v1;
4307 const struct constdef *c2 =
4308 (const struct constdef *) v2;
4309
4310 return strcmp(c1->name, c2->name);
4311}
4312
4313static int
4314setup_confname_table(table, tablesize, tablename, moddict)
Fred Draked86ed291999-12-15 15:34:33 +00004315 struct constdef *table;
4316 size_t tablesize;
Fred Drakebec628d1999-12-15 18:31:10 +00004317 char * tablename;
4318 PyObject *moddict;
Fred Draked86ed291999-12-15 15:34:33 +00004319{
Fred Drakebec628d1999-12-15 18:31:10 +00004320 PyObject *d = NULL;
4321
4322 qsort(table, tablesize, sizeof(struct constdef), cmp_constdefs);
4323 d = PyDict_New();
4324 if (d != NULL) {
4325 PyObject *o;
Fred Drakee1a79b91999-12-30 18:05:43 +00004326 size_t i = 0;
Fred Draked86ed291999-12-15 15:34:33 +00004327
Fred Drakebec628d1999-12-15 18:31:10 +00004328 for (; i < tablesize; ++i) {
4329 o = PyInt_FromLong(table[i].value);
4330 if (o == NULL
4331 || PyDict_SetItemString(d, table[i].name, o) == -1) {
4332 Py_DECREF(d);
4333 d = NULL;
4334 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004335 }
4336 }
Fred Drakebec628d1999-12-15 18:31:10 +00004337 if (PyDict_SetItemString(moddict, tablename, d) == -1)
4338 return -1;
4339 return 0;
Fred Draked86ed291999-12-15 15:34:33 +00004340 }
Fred Drakebec628d1999-12-15 18:31:10 +00004341 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004342}
4343
Fred Drakebec628d1999-12-15 18:31:10 +00004344/* Return -1 on failure, 0 on success. */
4345static int
4346setup_confname_tables(moddict)
4347 PyObject *moddict;
Fred Draked86ed291999-12-15 15:34:33 +00004348{
4349#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
Fred Drakebec628d1999-12-15 18:31:10 +00004350 if (setup_confname_table(posix_constants_pathconf,
Fred Draked86ed291999-12-15 15:34:33 +00004351 sizeof(posix_constants_pathconf)
4352 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004353 "pathconf_names", moddict))
4354 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004355#endif
4356#ifdef HAVE_CONFSTR
Fred Drakebec628d1999-12-15 18:31:10 +00004357 if (setup_confname_table(posix_constants_confstr,
Fred Draked86ed291999-12-15 15:34:33 +00004358 sizeof(posix_constants_confstr)
4359 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004360 "confstr_names", moddict))
4361 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004362#endif
4363#ifdef HAVE_SYSCONF
Fred Drakebec628d1999-12-15 18:31:10 +00004364 if (setup_confname_table(posix_constants_sysconf,
Fred Draked86ed291999-12-15 15:34:33 +00004365 sizeof(posix_constants_sysconf)
4366 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004367 "sysconf_names", moddict))
4368 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004369#endif
Fred Drakebec628d1999-12-15 18:31:10 +00004370 return 0;
Fred Draked86ed291999-12-15 15:34:33 +00004371}
Fred Draked86ed291999-12-15 15:34:33 +00004372
4373
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004374static char posix_abort__doc__[] = "\
4375abort() -> does not return!\n\
4376Abort the interpreter immediately. This 'dumps core' or otherwise fails\n\
4377in the hardest way possible on the hosting operating system.";
4378
4379static PyObject *
4380posix_abort(self, args)
4381 PyObject *self;
4382 PyObject *args;
4383{
4384 if (!PyArg_ParseTuple(args, ":abort"))
4385 return NULL;
4386 abort();
4387 /*NOTREACHED*/
4388 Py_FatalError("abort() called from Python code didn't abort!");
4389 return NULL;
4390}
Fred Drakebec628d1999-12-15 18:31:10 +00004391
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004392
4393static PyMethodDef posix_methods[] = {
4394 {"access", posix_access, METH_VARARGS, posix_access__doc__},
4395#ifdef HAVE_TTYNAME
4396 {"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__},
4397#endif
4398 {"chdir", posix_chdir, METH_VARARGS, posix_chdir__doc__},
4399 {"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004400#ifdef HAVE_CHOWN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004401 {"chown", posix_chown, METH_VARARGS, posix_chown__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004402#endif /* HAVE_CHOWN */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004403#ifdef HAVE_CTERMID
4404 {"ctermid", posix_ctermid, METH_VARARGS, posix_ctermid__doc__},
4405#endif
Guido van Rossum36bc6801995-06-14 22:54:23 +00004406#ifdef HAVE_GETCWD
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004407 {"getcwd", posix_getcwd, METH_VARARGS, posix_getcwd__doc__},
Guido van Rossum36bc6801995-06-14 22:54:23 +00004408#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004409#ifdef HAVE_LINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004410 {"link", posix_link, METH_VARARGS, posix_link__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004411#endif /* HAVE_LINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004412 {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__},
4413 {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__},
4414 {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004415#ifdef HAVE_NICE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004416 {"nice", posix_nice, METH_VARARGS, posix_nice__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004417#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004418#ifdef HAVE_READLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004419 {"readlink", posix_readlink, METH_VARARGS, posix_readlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004420#endif /* HAVE_READLINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004421 {"rename", posix_rename, METH_VARARGS, posix_rename__doc__},
4422 {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__},
4423 {"stat", posix_stat, METH_VARARGS, posix_stat__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004424#ifdef HAVE_SYMLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004425 {"symlink", posix_symlink, METH_VARARGS, posix_symlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004426#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004427#ifdef HAVE_SYSTEM
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004428 {"system", posix_system, METH_VARARGS, posix_system__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004429#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004430 {"umask", posix_umask, METH_VARARGS, posix_umask__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004431#ifdef HAVE_UNAME
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004432 {"uname", posix_uname, METH_VARARGS, posix_uname__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004433#endif /* HAVE_UNAME */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004434 {"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__},
4435 {"remove", posix_unlink, METH_VARARGS, posix_remove__doc__},
4436 {"utime", posix_utime, METH_VARARGS, posix_utime__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004437#ifdef HAVE_TIMES
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004438 {"times", posix_times, METH_VARARGS, posix_times__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004439#endif /* HAVE_TIMES */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004440 {"_exit", posix__exit, METH_VARARGS, posix__exit__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004441#ifdef HAVE_EXECV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004442 {"execv", posix_execv, METH_VARARGS, posix_execv__doc__},
4443 {"execve", posix_execve, METH_VARARGS, posix_execve__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004444#endif /* HAVE_EXECV */
Guido van Rossuma1065681999-01-25 23:20:23 +00004445#ifdef HAVE_SPAWNV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004446 {"spawnv", posix_spawnv, METH_VARARGS, posix_spawnv__doc__},
4447 {"spawnve", posix_spawnve, METH_VARARGS, posix_spawnve__doc__},
Guido van Rossuma1065681999-01-25 23:20:23 +00004448#endif /* HAVE_SPAWNV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004449#ifdef HAVE_FORK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004450 {"fork", posix_fork, METH_VARARGS, posix_fork__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004451#endif /* HAVE_FORK */
4452#ifdef HAVE_GETEGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004453 {"getegid", posix_getegid, METH_VARARGS, posix_getegid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004454#endif /* HAVE_GETEGID */
4455#ifdef HAVE_GETEUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004456 {"geteuid", posix_geteuid, METH_VARARGS, posix_geteuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004457#endif /* HAVE_GETEUID */
4458#ifdef HAVE_GETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004459 {"getgid", posix_getgid, METH_VARARGS, posix_getgid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004460#endif /* HAVE_GETGID */
Fred Drakec9680921999-12-13 16:37:25 +00004461#ifdef HAVE_GETGROUPS
4462 {"getgroups", posix_getgroups, METH_VARARGS, posix_getgroups__doc__},
4463#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004464 {"getpid", posix_getpid, METH_VARARGS, posix_getpid__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004465#ifdef HAVE_GETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004466 {"getpgrp", posix_getpgrp, METH_VARARGS, posix_getpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004467#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004468#ifdef HAVE_GETPPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004469 {"getppid", posix_getppid, METH_VARARGS, posix_getppid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004470#endif /* HAVE_GETPPID */
4471#ifdef HAVE_GETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004472 {"getuid", posix_getuid, METH_VARARGS, posix_getuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004473#endif /* HAVE_GETUID */
Fred Drake12c6e2d1999-12-14 21:25:03 +00004474#ifdef HAVE_GETLOGIN
4475 {"getlogin", posix_getlogin, METH_VARARGS, posix_getlogin__doc__},
4476#endif
Guido van Rossumad0ee831995-03-01 10:34:45 +00004477#ifdef HAVE_KILL
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004478 {"kill", posix_kill, METH_VARARGS, posix_kill__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004479#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00004480#ifdef HAVE_PLOCK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004481 {"plock", posix_plock, METH_VARARGS, posix_plock__doc__},
Guido van Rossumc0125471996-06-28 18:55:32 +00004482#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004483#ifdef HAVE_POPEN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004484 {"popen", posix_popen, METH_VARARGS, posix_popen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004485#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004486#ifdef HAVE_SETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004487 {"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004488#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004489#ifdef HAVE_SETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004490 {"setgid", posix_setgid, METH_VARARGS, posix_setgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004491#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004492#ifdef HAVE_SETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004493 {"setpgrp", posix_setpgrp, METH_VARARGS, posix_setpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004494#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004495#ifdef HAVE_WAIT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004496 {"wait", posix_wait, METH_VARARGS, posix_wait__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004497#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004498#ifdef HAVE_WAITPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004499 {"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004500#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004501#ifdef HAVE_SETSID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004502 {"setsid", posix_setsid, METH_VARARGS, posix_setsid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004503#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004504#ifdef HAVE_SETPGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004505 {"setpgid", posix_setpgid, METH_VARARGS, posix_setpgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004506#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004507#ifdef HAVE_TCGETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004508 {"tcgetpgrp", posix_tcgetpgrp, METH_VARARGS, posix_tcgetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004509#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004510#ifdef HAVE_TCSETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004511 {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004512#endif /* HAVE_TCSETPGRP */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004513 {"open", posix_open, METH_VARARGS, posix_open__doc__},
4514 {"close", posix_close, METH_VARARGS, posix_close__doc__},
4515 {"dup", posix_dup, METH_VARARGS, posix_dup__doc__},
4516 {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__},
4517 {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},
4518 {"read", posix_read, METH_VARARGS, posix_read__doc__},
4519 {"write", posix_write, METH_VARARGS, posix_write__doc__},
4520 {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__},
4521 {"fdopen", posix_fdopen, METH_VARARGS, posix_fdopen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004522#ifdef HAVE_PIPE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004523 {"pipe", posix_pipe, METH_VARARGS, posix_pipe__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004524#endif
4525#ifdef HAVE_MKFIFO
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004526 {"mkfifo", posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004527#endif
4528#ifdef HAVE_FTRUNCATE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004529 {"ftruncate", posix_ftruncate, METH_VARARGS, posix_ftruncate__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004530#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004531#ifdef HAVE_PUTENV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004532 {"putenv", posix_putenv, METH_VARARGS, posix_putenv__doc__},
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004533#endif
Guido van Rossumb6a47161997-09-15 22:54:34 +00004534#ifdef HAVE_STRERROR
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004535 {"strerror", posix_strerror, METH_VARARGS, posix_strerror__doc__},
Guido van Rossumb6a47161997-09-15 22:54:34 +00004536#endif
Guido van Rossum21142a01999-01-08 21:05:37 +00004537#ifdef HAVE_FSYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004538 {"fsync", posix_fsync, METH_VARARGS, posix_fsync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004539#endif
4540#ifdef HAVE_FDATASYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004541 {"fdatasync", posix_fdatasync, METH_VARARGS, posix_fdatasync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004542#endif
Guido van Rossumc9641791998-08-04 15:26:23 +00004543#ifdef HAVE_SYS_WAIT_H
4544#ifdef WIFSTOPPED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004545 {"WIFSTOPPED", posix_WIFSTOPPED, METH_VARARGS, posix_WIFSTOPPED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004546#endif /* WIFSTOPPED */
4547#ifdef WIFSIGNALED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004548 {"WIFSIGNALED", posix_WIFSIGNALED, METH_VARARGS, posix_WIFSIGNALED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004549#endif /* WIFSIGNALED */
4550#ifdef WIFEXITED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004551 {"WIFEXITED", posix_WIFEXITED, METH_VARARGS, posix_WIFEXITED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004552#endif /* WIFEXITED */
4553#ifdef WEXITSTATUS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004554 {"WEXITSTATUS", posix_WEXITSTATUS, METH_VARARGS, posix_WEXITSTATUS__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004555#endif /* WEXITSTATUS */
4556#ifdef WTERMSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004557 {"WTERMSIG", posix_WTERMSIG, METH_VARARGS, posix_WTERMSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004558#endif /* WTERMSIG */
4559#ifdef WSTOPSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004560 {"WSTOPSIG", posix_WSTOPSIG, METH_VARARGS, posix_WSTOPSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004561#endif /* WSTOPSIG */
4562#endif /* HAVE_SYS_WAIT_H */
Guido van Rossum94f6f721999-01-06 18:42:14 +00004563#ifdef HAVE_FSTATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004564 {"fstatvfs", posix_fstatvfs, METH_VARARGS, posix_fstatvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004565#endif
4566#ifdef HAVE_STATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004567 {"statvfs", posix_statvfs, METH_VARARGS, posix_statvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004568#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004569#ifdef HAVE_TMPNAM
4570 {"tmpfile", posix_tmpfile, METH_VARARGS, posix_tmpfile__doc__},
4571#endif
4572#ifdef HAVE_TEMPNAM
4573 {"tempnam", posix_tempnam, METH_VARARGS, posix_tempnam__doc__},
4574#endif
4575#ifdef HAVE_TMPNAM
4576 {"tmpnam", posix_tmpnam, METH_VARARGS, posix_tmpnam__doc__},
4577#endif
Fred Drakec9680921999-12-13 16:37:25 +00004578#ifdef HAVE_CONFSTR
4579 {"confstr", posix_confstr, METH_VARARGS, posix_confstr__doc__},
4580#endif
4581#ifdef HAVE_SYSCONF
4582 {"sysconf", posix_sysconf, METH_VARARGS, posix_sysconf__doc__},
4583#endif
4584#ifdef HAVE_FPATHCONF
4585 {"fpathconf", posix_fpathconf, METH_VARARGS, posix_fpathconf__doc__},
4586#endif
4587#ifdef HAVE_PATHCONF
4588 {"pathconf", posix_pathconf, METH_VARARGS, posix_pathconf__doc__},
4589#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004590 {"abort", posix_abort, METH_VARARGS, posix_abort__doc__},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004591 {NULL, NULL} /* Sentinel */
4592};
4593
4594
Barry Warsaw4a342091996-12-19 23:50:02 +00004595static int
4596ins(d, symbol, value)
4597 PyObject* d;
4598 char* symbol;
4599 long value;
4600{
4601 PyObject* v = PyInt_FromLong(value);
4602 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
4603 return -1; /* triggers fatal error */
4604
4605 Py_DECREF(v);
4606 return 0;
4607}
4608
Guido van Rossumd48f2521997-12-05 22:19:34 +00004609#if defined(PYOS_OS2)
4610/* Insert Platform-Specific Constant Values (Strings & Numbers) of Common Use */
4611static int insertvalues(PyObject *d)
4612{
4613 APIRET rc;
4614 ULONG values[QSV_MAX+1];
4615 PyObject *v;
4616 char *ver, tmp[10];
4617
4618 Py_BEGIN_ALLOW_THREADS
4619 rc = DosQuerySysInfo(1, QSV_MAX, &values[1], sizeof(values));
4620 Py_END_ALLOW_THREADS
4621
4622 if (rc != NO_ERROR) {
4623 os2_error(rc);
4624 return -1;
4625 }
4626
4627 if (ins(d, "meminstalled", values[QSV_TOTPHYSMEM])) return -1;
4628 if (ins(d, "memkernel", values[QSV_TOTRESMEM])) return -1;
4629 if (ins(d, "memvirtual", values[QSV_TOTAVAILMEM])) return -1;
4630 if (ins(d, "maxpathlen", values[QSV_MAX_PATH_LENGTH])) return -1;
4631 if (ins(d, "maxnamelen", values[QSV_MAX_COMP_LENGTH])) return -1;
4632 if (ins(d, "revision", values[QSV_VERSION_REVISION])) return -1;
4633 if (ins(d, "timeslice", values[QSV_MIN_SLICE])) return -1;
4634
4635 switch (values[QSV_VERSION_MINOR]) {
4636 case 0: ver = "2.00"; break;
4637 case 10: ver = "2.10"; break;
4638 case 11: ver = "2.11"; break;
4639 case 30: ver = "3.00"; break;
4640 case 40: ver = "4.00"; break;
4641 case 50: ver = "5.00"; break;
4642 default:
4643 sprintf(tmp, "%d-%d", values[QSV_VERSION_MAJOR],
4644 values[QSV_VERSION_MINOR]);
4645 ver = &tmp[0];
4646 }
4647
4648 /* Add Indicator of the Version of the Operating System */
4649 v = PyString_FromString(ver);
4650 if (!v || PyDict_SetItemString(d, "version", v) < 0)
4651 return -1;
4652 Py_DECREF(v);
4653
4654 /* Add Indicator of Which Drive was Used to Boot the System */
4655 tmp[0] = 'A' + values[QSV_BOOT_DRIVE] - 1;
4656 tmp[1] = ':';
4657 tmp[2] = '\0';
4658
4659 v = PyString_FromString(tmp);
4660 if (!v || PyDict_SetItemString(d, "bootdrive", v) < 0)
4661 return -1;
4662 Py_DECREF(v);
4663
4664 return 0;
4665}
4666#endif
4667
Barry Warsaw4a342091996-12-19 23:50:02 +00004668static int
4669all_ins(d)
4670 PyObject* d;
4671{
Guido van Rossum94f6f721999-01-06 18:42:14 +00004672#ifdef F_OK
4673 if (ins(d, "F_OK", (long)F_OK)) return -1;
4674#endif
4675#ifdef R_OK
4676 if (ins(d, "R_OK", (long)R_OK)) return -1;
4677#endif
4678#ifdef W_OK
4679 if (ins(d, "W_OK", (long)W_OK)) return -1;
4680#endif
4681#ifdef X_OK
4682 if (ins(d, "X_OK", (long)X_OK)) return -1;
4683#endif
Fred Drakec9680921999-12-13 16:37:25 +00004684#ifdef NGROUPS_MAX
4685 if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1;
4686#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004687#ifdef TMP_MAX
4688 if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1;
4689#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004690#ifdef WNOHANG
4691 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
4692#endif
4693#ifdef O_RDONLY
4694 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
4695#endif
4696#ifdef O_WRONLY
4697 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
4698#endif
4699#ifdef O_RDWR
4700 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
4701#endif
4702#ifdef O_NDELAY
4703 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
4704#endif
4705#ifdef O_NONBLOCK
4706 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
4707#endif
4708#ifdef O_APPEND
4709 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
4710#endif
4711#ifdef O_DSYNC
4712 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
4713#endif
4714#ifdef O_RSYNC
4715 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
4716#endif
4717#ifdef O_SYNC
4718 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
4719#endif
4720#ifdef O_NOCTTY
4721 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
4722#endif
4723#ifdef O_CREAT
4724 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
4725#endif
4726#ifdef O_EXCL
4727 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
4728#endif
4729#ifdef O_TRUNC
4730 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
4731#endif
Guido van Rossum98d9d091997-08-08 21:48:51 +00004732#ifdef O_BINARY
4733 if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
4734#endif
4735#ifdef O_TEXT
4736 if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
4737#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +00004738
Guido van Rossum246bc171999-02-01 23:54:31 +00004739#ifdef HAVE_SPAWNV
Guido van Rossum7d385291999-02-16 19:38:04 +00004740 if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1;
4741 if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1;
4742 if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1;
4743 if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1;
4744 if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1;
Guido van Rossum246bc171999-02-01 23:54:31 +00004745#endif
4746
Guido van Rossumd48f2521997-12-05 22:19:34 +00004747#if defined(PYOS_OS2)
4748 if (insertvalues(d)) return -1;
4749#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004750 return 0;
4751}
4752
4753
Guido van Rossumc5a0f531997-12-02 20:36:02 +00004754#if ( defined(_MSC_VER) || defined(__WATCOMC__) ) && !defined(__QNX__)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004755#define INITFUNC initnt
4756#define MODNAME "nt"
4757#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004758#if defined(PYOS_OS2)
4759#define INITFUNC initos2
4760#define MODNAME "os2"
4761#else
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004762#define INITFUNC initposix
4763#define MODNAME "posix"
4764#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004765#endif
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004766
Guido van Rossum3886bb61998-12-04 18:50:17 +00004767DL_EXPORT(void)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004768INITFUNC()
Guido van Rossumb6775db1994-08-01 11:34:53 +00004769{
Barry Warsaw53699e91996-12-10 23:23:01 +00004770 PyObject *m, *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00004771
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004772 m = Py_InitModule4(MODNAME,
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004773 posix_methods,
4774 posix__doc__,
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004775 (PyObject *)NULL,
4776 PYTHON_API_VERSION);
Barry Warsaw53699e91996-12-10 23:23:01 +00004777 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004778
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004779 /* Initialize environ dictionary */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004780 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00004781 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004782 return;
Barry Warsaw53699e91996-12-10 23:23:01 +00004783 Py_DECREF(v);
Fred Drakec9680921999-12-13 16:37:25 +00004784
Barry Warsaw4a342091996-12-19 23:50:02 +00004785 if (all_ins(d))
Barry Warsaw4a342091996-12-19 23:50:02 +00004786 return;
4787
Fred Drakebec628d1999-12-15 18:31:10 +00004788 if (setup_confname_tables(d))
4789 return;
4790
Barry Warsawca74da41999-02-09 19:31:45 +00004791 PyDict_SetItemString(d, "error", PyExc_OSError);
Fred Drake762e2061999-08-26 17:23:54 +00004792
Guido van Rossumb3d39562000-01-31 18:41:26 +00004793#ifdef HAVE_PUTENV
Fred Drake762e2061999-08-26 17:23:54 +00004794 posix_putenv_garbage = PyDict_New();
Guido van Rossumb3d39562000-01-31 18:41:26 +00004795#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004796}