blob: 1ca3826d752116f63705ba5593b070be378ddb0a [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;
Guido van Rossumace88ae2000-04-21 18:54:45 +0000552
553#ifdef MS_WIN32
554 int pathlen;
555 char pathcopy[MAX_PATH];
556#endif /* MS_WIN32 */
557
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000558 if (!PyArg_ParseTuple(args, format, &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000559 return NULL;
Guido van Rossumace88ae2000-04-21 18:54:45 +0000560
561#ifdef MS_WIN32
562 pathlen = strlen(path);
563 /* the library call can blow up if the file name is too long! */
564 if (pathlen > MAX_PATH) {
565 errno = ENAMETOOLONG;
566 return posix_error();
567 }
568
569 if ((pathlen > 0) && (path[pathlen-1] == '\\' || path[pathlen-1] == '/')) {
Guido van Rossum19dde102000-05-03 02:44:55 +0000570 /* exception for specific or current drive root */
571 if (!((pathlen == 1) ||
572 ((pathlen == 3) &&
Guido van Rossumace88ae2000-04-21 18:54:45 +0000573 (path[1] == ':') &&
Guido van Rossum19dde102000-05-03 02:44:55 +0000574 (path[2] == '\\' || path[2] == '/'))))
Guido van Rossumace88ae2000-04-21 18:54:45 +0000575 {
576 strncpy(pathcopy, path, pathlen);
577 pathcopy[pathlen-1] = '\0'; /* nuke the trailing backslash */
578 path = pathcopy;
579 }
580 }
581#endif /* MS_WIN32 */
582
Barry Warsaw53699e91996-12-10 23:23:01 +0000583 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000584 res = (*statfunc)(path, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +0000585 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000586 if (res != 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000587 return posix_error_with_filename(path);
Guido van Rossum94f6f721999-01-06 18:42:14 +0000588#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +0000589 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +0000590 (long)st.st_mode,
591 (long)st.st_ino,
592 (long)st.st_dev,
593 (long)st.st_nlink,
594 (long)st.st_uid,
595 (long)st.st_gid,
596 (long)st.st_size,
597 (long)st.st_atime,
598 (long)st.st_mtime,
599 (long)st.st_ctime);
600#else
601 return Py_BuildValue("(lLllllLlll)",
602 (long)st.st_mode,
603 (LONG_LONG)st.st_ino,
604 (long)st.st_dev,
605 (long)st.st_nlink,
606 (long)st.st_uid,
607 (long)st.st_gid,
608 (LONG_LONG)st.st_size,
609 (long)st.st_atime,
610 (long)st.st_mtime,
611 (long)st.st_ctime);
612#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000613}
614
615
616/* POSIX methods */
617
Guido van Rossum94f6f721999-01-06 18:42:14 +0000618static char posix_access__doc__[] =
Guido van Rossum015f22a1999-01-06 22:52:38 +0000619"access(path, mode) -> 1 if granted, 0 otherwise\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +0000620Test for access to a file.";
621
622static PyObject *
623posix_access(self, args)
624 PyObject *self;
625 PyObject *args;
626{
Guido van Rossum015f22a1999-01-06 22:52:38 +0000627 char *path;
628 int mode;
629 int res;
630
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000631 if (!PyArg_ParseTuple(args, "si:access", &path, &mode))
Guido van Rossum015f22a1999-01-06 22:52:38 +0000632 return NULL;
633 Py_BEGIN_ALLOW_THREADS
634 res = access(path, mode);
635 Py_END_ALLOW_THREADS
636 return(PyInt_FromLong(res == 0 ? 1L : 0L));
Guido van Rossum94f6f721999-01-06 18:42:14 +0000637}
638
Guido van Rossumd371ff11999-01-25 16:12:23 +0000639#ifndef F_OK
640#define F_OK 0
641#endif
642#ifndef R_OK
643#define R_OK 4
644#endif
645#ifndef W_OK
646#define W_OK 2
647#endif
648#ifndef X_OK
649#define X_OK 1
650#endif
651
652#ifdef HAVE_TTYNAME
Guido van Rossum94f6f721999-01-06 18:42:14 +0000653static char posix_ttyname__doc__[] =
Guido van Rossum61eeb041999-02-22 15:29:15 +0000654"ttyname(fd) -> String\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +0000655Return the name of the terminal device connected to 'fd'.";
656
657static PyObject *
658posix_ttyname(self, args)
659 PyObject *self;
660 PyObject *args;
661{
Guido van Rossum94f6f721999-01-06 18:42:14 +0000662 int id;
663 char *ret;
664
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000665 if (!PyArg_ParseTuple(args, "i:ttyname", &id))
Guido van Rossum94f6f721999-01-06 18:42:14 +0000666 return NULL;
667
Guido van Rossum94f6f721999-01-06 18:42:14 +0000668 ret = ttyname(id);
669 if (ret == NULL)
670 return(posix_error());
671 return(PyString_FromString(ret));
672}
Guido van Rossumd371ff11999-01-25 16:12:23 +0000673#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +0000674
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000675#ifdef HAVE_CTERMID
676static char posix_ctermid__doc__[] =
677"ctermid() -> String\n\
678Return the name of the controlling terminal for this process.";
679
680static PyObject *
681posix_ctermid(self, args)
682 PyObject *self;
683 PyObject *args;
684{
685 char *ret;
686 char buffer[L_ctermid];
687
688 if (!PyArg_ParseTuple(args, ":ctermid"))
689 return NULL;
690
Greg Wardb48bc172000-03-01 21:51:56 +0000691#ifdef USE_CTERMID_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000692 ret = ctermid_r(buffer);
693#else
694 ret = ctermid(buffer);
695#endif
696 if (ret == NULL)
697 return(posix_error());
698 return(PyString_FromString(buffer));
699}
700#endif
701
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000702static char posix_chdir__doc__[] =
703"chdir(path) -> None\n\
704Change the current working directory to the specified path.";
705
Barry Warsaw53699e91996-12-10 23:23:01 +0000706static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000707posix_chdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000708 PyObject *self;
709 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000710{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000711 return posix_1str(args, "s:chdir", chdir);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000712}
713
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000714
715static char posix_chmod__doc__[] =
716"chmod(path, mode) -> None\n\
717Change the access permissions of a file.";
718
Barry Warsaw53699e91996-12-10 23:23:01 +0000719static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000720posix_chmod(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000721 PyObject *self;
722 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000723{
Guido van Rossumffd15f52000-03-31 00:47:28 +0000724 char *path;
725 int i;
726 int res;
Guido van Rossum49679b42000-03-31 00:48:21 +0000727 if (!PyArg_ParseTuple(args, "si", &path, &i))
Guido van Rossumffd15f52000-03-31 00:47:28 +0000728 return NULL;
729 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef40e772000-03-31 01:26:23 +0000730 res = chmod(path, i);
Guido van Rossumffd15f52000-03-31 00:47:28 +0000731 Py_END_ALLOW_THREADS
732 if (res < 0)
733 return posix_error_with_filename(path);
734 Py_INCREF(Py_None);
735 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000736}
737
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000738
Guido van Rossum21142a01999-01-08 21:05:37 +0000739#ifdef HAVE_FSYNC
740static char posix_fsync__doc__[] =
741"fsync(fildes) -> None\n\
742force write of file with filedescriptor to disk.";
743
744static PyObject *
745posix_fsync(self, args)
746 PyObject *self;
747 PyObject *args;
748{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000749 return posix_int(args, "i:fsync", fsync);
Guido van Rossum21142a01999-01-08 21:05:37 +0000750}
751#endif /* HAVE_FSYNC */
752
753#ifdef HAVE_FDATASYNC
754static char posix_fdatasync__doc__[] =
755"fdatasync(fildes) -> None\n\
756force write of file with filedescriptor to disk.\n\
757 does not force update of metadata.";
758
Guido van Rossum5d00b6d1999-01-08 21:28:05 +0000759extern int fdatasync(int); /* Prototype just in case */
760
Guido van Rossum21142a01999-01-08 21:05:37 +0000761static PyObject *
762posix_fdatasync(self, args)
763 PyObject *self;
764 PyObject *args;
765{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000766 return posix_int(args, "i:fdatasync", fdatasync);
Guido van Rossum21142a01999-01-08 21:05:37 +0000767}
768#endif /* HAVE_FDATASYNC */
769
770
Guido van Rossumb6775db1994-08-01 11:34:53 +0000771#ifdef HAVE_CHOWN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000772static char posix_chown__doc__[] =
773"chown(path, uid, gid) -> None\n\
774Change the owner and group id of path to the numeric uid and gid.";
775
Barry Warsaw53699e91996-12-10 23:23:01 +0000776static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000777posix_chown(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000778 PyObject *self;
779 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000780{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000781 return posix_strintint(args, "sii:chown", chown);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000782}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000783#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000784
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000785
Guido van Rossum36bc6801995-06-14 22:54:23 +0000786#ifdef HAVE_GETCWD
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000787static char posix_getcwd__doc__[] =
788"getcwd() -> path\n\
789Return a string representing the current working directory.";
790
Barry Warsaw53699e91996-12-10 23:23:01 +0000791static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000792posix_getcwd(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000793 PyObject *self;
794 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000795{
796 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000797 char *res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000798 if (!PyArg_ParseTuple(args, ":getcwd"))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000799 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000800 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000801 res = getcwd(buf, sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +0000802 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000803 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000804 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000805 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000806}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000807#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000808
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000809
Guido van Rossumb6775db1994-08-01 11:34:53 +0000810#ifdef HAVE_LINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000811static char posix_link__doc__[] =
812"link(src, dst) -> None\n\
813Create a hard link to a file.";
814
Barry Warsaw53699e91996-12-10 23:23:01 +0000815static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000816posix_link(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000817 PyObject *self;
818 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000819{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000820 return posix_2str(args, "ss:link", link);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000821}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000822#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000823
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000824
825static char posix_listdir__doc__[] =
826"listdir(path) -> list_of_strings\n\
827Return a list containing the names of the entries in the directory.\n\
828\n\
829 path: path of directory to list\n\
830\n\
831The list is in arbitrary order. It does not include the special\n\
832entries '.' and '..' even if they are present in the directory.";
833
Barry Warsaw53699e91996-12-10 23:23:01 +0000834static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000835posix_listdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000836 PyObject *self;
837 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000838{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000839 /* XXX Should redo this putting the (now four) versions of opendir
Guido van Rossum6d8841c1997-08-14 19:57:39 +0000840 in separate files instead of having them all here... */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000841#if defined(MS_WIN32) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000842
Guido van Rossumb6775db1994-08-01 11:34:53 +0000843 char *name;
844 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000845 PyObject *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000846 HANDLE hFindFile;
847 WIN32_FIND_DATA FileData;
848 char namebuf[MAX_PATH+5];
849
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000850 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000851 return NULL;
852 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000853 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000854 return NULL;
855 }
856 strcpy(namebuf, name);
857 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
858 namebuf[len++] = '/';
859 strcpy(namebuf + len, "*.*");
860
Barry Warsaw53699e91996-12-10 23:23:01 +0000861 if ((d = PyList_New(0)) == NULL)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000862 return NULL;
863
864 hFindFile = FindFirstFile(namebuf, &FileData);
865 if (hFindFile == INVALID_HANDLE_VALUE) {
866 errno = GetLastError();
Guido van Rossum617bc191998-08-06 03:23:32 +0000867 if (errno == ERROR_FILE_NOT_FOUND)
868 return PyList_New(0);
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000869 return posix_error_with_filename(name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000870 }
871 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000872 if (FileData.cFileName[0] == '.' &&
873 (FileData.cFileName[1] == '\0' ||
874 FileData.cFileName[1] == '.' &&
875 FileData.cFileName[2] == '\0'))
876 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000877 v = PyString_FromString(FileData.cFileName);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000878 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000879 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000880 d = NULL;
881 break;
882 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000883 if (PyList_Append(d, v) != 0) {
884 Py_DECREF(v);
885 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000886 d = NULL;
887 break;
888 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000889 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000890 } while (FindNextFile(hFindFile, &FileData) == TRUE);
891
892 if (FindClose(hFindFile) == FALSE) {
893 errno = GetLastError();
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000894 return posix_error_with_filename(&name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000895 }
896
897 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000898
Guido van Rossum8d665e61996-06-26 18:22:49 +0000899#else /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000900#ifdef _MSC_VER /* 16-bit Windows */
901
902#ifndef MAX_PATH
903#define MAX_PATH 250
904#endif
905 char *name, *pt;
906 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000907 PyObject *d, *v;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000908 char namebuf[MAX_PATH+5];
909 struct _find_t ep;
910
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000911 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000912 return NULL;
913 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000914 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000915 return NULL;
916 }
917 strcpy(namebuf, name);
918 for (pt = namebuf; *pt; pt++)
919 if (*pt == '/')
920 *pt = '\\';
921 if (namebuf[len-1] != '\\')
922 namebuf[len++] = '\\';
923 strcpy(namebuf + len, "*.*");
924
Barry Warsaw53699e91996-12-10 23:23:01 +0000925 if ((d = PyList_New(0)) == NULL)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000926 return NULL;
927
928 if (_dos_findfirst(namebuf, _A_RDONLY |
Barry Warsaw43d68b81996-12-19 22:10:44 +0000929 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0)
930 {
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000931 errno = ENOENT;
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000932 return posix_error_with_filename(name);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000933 }
934 do {
935 if (ep.name[0] == '.' &&
936 (ep.name[1] == '\0' ||
937 ep.name[1] == '.' &&
938 ep.name[2] == '\0'))
939 continue;
940 strcpy(namebuf, ep.name);
941 for (pt = namebuf; *pt; pt++)
942 if (isupper(*pt))
943 *pt = tolower(*pt);
Barry Warsaw53699e91996-12-10 23:23:01 +0000944 v = PyString_FromString(namebuf);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000945 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000946 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000947 d = NULL;
948 break;
949 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000950 if (PyList_Append(d, v) != 0) {
951 Py_DECREF(v);
952 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000953 d = NULL;
954 break;
955 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000956 Py_DECREF(v);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000957 } while (_dos_findnext(&ep) == 0);
958
959 return d;
960
961#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000962#if defined(PYOS_OS2)
963
964#ifndef MAX_PATH
965#define MAX_PATH CCHMAXPATH
966#endif
967 char *name, *pt;
968 int len;
969 PyObject *d, *v;
970 char namebuf[MAX_PATH+5];
971 HDIR hdir = 1;
972 ULONG srchcnt = 1;
973 FILEFINDBUF3 ep;
974 APIRET rc;
975
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000976 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000977 return NULL;
978 if (len >= MAX_PATH) {
979 PyErr_SetString(PyExc_ValueError, "path too long");
980 return NULL;
981 }
982 strcpy(namebuf, name);
983 for (pt = namebuf; *pt; pt++)
984 if (*pt == '/')
985 *pt = '\\';
986 if (namebuf[len-1] != '\\')
987 namebuf[len++] = '\\';
988 strcpy(namebuf + len, "*.*");
989
990 if ((d = PyList_New(0)) == NULL)
991 return NULL;
992
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000993 rc = DosFindFirst(namebuf, /* Wildcard Pattern to Match */
994 &hdir, /* Handle to Use While Search Directory */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000995 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000996 &ep, sizeof(ep), /* Structure to Receive Directory Entry */
997 &srchcnt, /* Max and Actual Count of Entries Per Iteration */
998 FIL_STANDARD); /* Format of Entry (EAs or Not) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000999
1000 if (rc != NO_ERROR) {
1001 errno = ENOENT;
Barry Warsawf63b8cc1999-05-27 23:13:21 +00001002 return posix_error_with_filename(name);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001003 }
1004
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001005 if (srchcnt > 0) { /* If Directory is NOT Totally Empty, */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001006 do {
1007 if (ep.achName[0] == '.'
1008 && (ep.achName[1] == '\0' || ep.achName[1] == '.' && ep.achName[2] == '\0'))
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001009 continue; /* Skip Over "." and ".." Names */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001010
1011 strcpy(namebuf, ep.achName);
1012
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001013 /* Leave Case of Name Alone -- In Native Form */
1014 /* (Removed Forced Lowercasing Code) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001015
1016 v = PyString_FromString(namebuf);
1017 if (v == NULL) {
1018 Py_DECREF(d);
1019 d = NULL;
1020 break;
1021 }
1022 if (PyList_Append(d, v) != 0) {
1023 Py_DECREF(v);
1024 Py_DECREF(d);
1025 d = NULL;
1026 break;
1027 }
1028 Py_DECREF(v);
1029 } while (DosFindNext(hdir, &ep, sizeof(ep), &srchcnt) == NO_ERROR && srchcnt > 0);
1030 }
1031
1032 return d;
1033#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001034
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001035 char *name;
Barry Warsaw53699e91996-12-10 23:23:01 +00001036 PyObject *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001037 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001038 struct dirent *ep;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001039 if (!PyArg_ParseTuple(args, "s:listdir", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001040 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001041 if ((dirp = opendir(name)) == NULL) {
Barry Warsawf63b8cc1999-05-27 23:13:21 +00001042 return posix_error_with_filename(name);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001043 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001044 if ((d = PyList_New(0)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001045 closedir(dirp);
1046 return NULL;
1047 }
1048 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +00001049 if (ep->d_name[0] == '.' &&
1050 (NAMLEN(ep) == 1 ||
Guido van Rossuma376cc51996-12-05 23:43:35 +00001051 (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
Guido van Rossum24f42ac1995-07-18 18:16:52 +00001052 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +00001053 v = PyString_FromStringAndSize(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001054 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001055 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001056 d = NULL;
1057 break;
1058 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001059 if (PyList_Append(d, v) != 0) {
1060 Py_DECREF(v);
1061 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001062 d = NULL;
1063 break;
1064 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001065 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001066 }
1067 closedir(dirp);
Guido van Rossum0ee42cd1991-04-08 21:01:03 +00001068
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001069 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001070
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001071#endif /* !PYOS_OS2 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001072#endif /* !_MSC_VER */
Guido van Rossum8d665e61996-06-26 18:22:49 +00001073#endif /* !MS_WIN32 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001074}
1075
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001076static char posix_mkdir__doc__[] =
1077"mkdir(path [, mode=0777]) -> None\n\
1078Create a directory.";
1079
Barry Warsaw53699e91996-12-10 23:23:01 +00001080static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001081posix_mkdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001082 PyObject *self;
1083 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001084{
Guido van Rossumb0824db1996-02-25 04:50:32 +00001085 int res;
1086 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001087 int mode = 0777;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001088 if (!PyArg_ParseTuple(args, "s|i:mkdir", &path, &mode))
Guido van Rossumb0824db1996-02-25 04:50:32 +00001089 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001090 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001091#if ( defined(__WATCOMC__) || defined(_MSC_VER) || defined(PYCC_VACPP) ) && !defined(__QNX__)
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001092 res = mkdir(path);
1093#else
Guido van Rossumb0824db1996-02-25 04:50:32 +00001094 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001095#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001096 Py_END_ALLOW_THREADS
Guido van Rossumb0824db1996-02-25 04:50:32 +00001097 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00001098 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00001099 Py_INCREF(Py_None);
1100 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001101}
1102
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001103
Guido van Rossumb6775db1994-08-01 11:34:53 +00001104#ifdef HAVE_NICE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001105static char posix_nice__doc__[] =
1106"nice(inc) -> new_priority\n\
1107Decrease the priority of process and return new priority.";
1108
Barry Warsaw53699e91996-12-10 23:23:01 +00001109static PyObject *
Guido van Rossum775f4da1993-01-09 17:18:52 +00001110posix_nice(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001111 PyObject *self;
1112 PyObject *args;
Guido van Rossum775f4da1993-01-09 17:18:52 +00001113{
1114 int increment, value;
1115
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001116 if (!PyArg_ParseTuple(args, "i:nice", &increment))
Guido van Rossum775f4da1993-01-09 17:18:52 +00001117 return NULL;
1118 value = nice(increment);
1119 if (value == -1)
1120 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001121 return PyInt_FromLong((long) value);
Guido van Rossum775f4da1993-01-09 17:18:52 +00001122}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001123#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001124
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001125
1126static char posix_rename__doc__[] =
1127"rename(old, new) -> None\n\
1128Rename a file or directory.";
1129
Barry Warsaw53699e91996-12-10 23:23:01 +00001130static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001131posix_rename(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001132 PyObject *self;
1133 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001134{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001135 return posix_2str(args, "ss:rename", rename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001136}
1137
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001138
1139static char posix_rmdir__doc__[] =
1140"rmdir(path) -> None\n\
1141Remove a directory.";
1142
Barry Warsaw53699e91996-12-10 23:23:01 +00001143static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001144posix_rmdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001145 PyObject *self;
1146 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001147{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001148 return posix_1str(args, "s:rmdir", rmdir);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001149}
1150
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001151
1152static char posix_stat__doc__[] =
1153"stat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
1154Perform a stat system call on the given path.";
1155
Barry Warsaw53699e91996-12-10 23:23:01 +00001156static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001157posix_stat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001158 PyObject *self;
1159 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001160{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001161 return posix_do_stat(self, args, "s:stat", stat);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001162}
1163
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001164
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001165#ifdef HAVE_SYSTEM
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001166static char posix_system__doc__[] =
1167"system(command) -> exit_status\n\
1168Execute the command (a string) in a subshell.";
1169
Barry Warsaw53699e91996-12-10 23:23:01 +00001170static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001171posix_system(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001172 PyObject *self;
1173 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001174{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001175 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001176 long sts;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001177 if (!PyArg_ParseTuple(args, "s:system", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001178 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001179 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001180 sts = system(command);
Barry Warsaw53699e91996-12-10 23:23:01 +00001181 Py_END_ALLOW_THREADS
1182 return PyInt_FromLong(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001183}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001184#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001185
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001186
1187static char posix_umask__doc__[] =
1188"umask(new_mask) -> old_mask\n\
1189Set the current numeric umask and return the previous umask.";
1190
Barry Warsaw53699e91996-12-10 23:23:01 +00001191static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001192posix_umask(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001193 PyObject *self;
1194 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001195{
1196 int i;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001197 if (!PyArg_ParseTuple(args, "i:umask", &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001198 return NULL;
1199 i = umask(i);
1200 if (i < 0)
1201 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001202 return PyInt_FromLong((long)i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001203}
1204
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001205
1206static char posix_unlink__doc__[] =
1207"unlink(path) -> None\n\
1208Remove a file (same as remove(path)).";
1209
1210static char posix_remove__doc__[] =
1211"remove(path) -> None\n\
1212Remove a file (same as unlink(path)).";
1213
Barry Warsaw53699e91996-12-10 23:23:01 +00001214static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001215posix_unlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001216 PyObject *self;
1217 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001218{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001219 return posix_1str(args, "s:remove", unlink);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001220}
1221
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001222
Guido van Rossumb6775db1994-08-01 11:34:53 +00001223#ifdef HAVE_UNAME
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001224static char posix_uname__doc__[] =
1225"uname() -> (sysname, nodename, release, version, machine)\n\
1226Return a tuple identifying the current operating system.";
1227
Barry Warsaw53699e91996-12-10 23:23:01 +00001228static PyObject *
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001229posix_uname(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001230 PyObject *self;
1231 PyObject *args;
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001232{
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001233 struct utsname u;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001234 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001235 if (!PyArg_ParseTuple(args, ":uname"))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001236 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001237 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001238 res = uname(&u);
Barry Warsaw53699e91996-12-10 23:23:01 +00001239 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001240 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001241 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001242 return Py_BuildValue("(sssss)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00001243 u.sysname,
1244 u.nodename,
1245 u.release,
1246 u.version,
1247 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001248}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001249#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001250
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001251
1252static char posix_utime__doc__[] =
1253"utime(path, (atime, utime)) -> None\n\
Barry Warsaw3cef8562000-05-01 16:17:24 +00001254utime(path, None) -> None\n\
1255Set the access and modified time of the file to the given values. If the\n\
1256second form is used, set the access and modified times to the current time.";
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001257
Barry Warsaw53699e91996-12-10 23:23:01 +00001258static PyObject *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001259posix_utime(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001260 PyObject *self;
1261 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001262{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001263 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +00001264 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001265 int res;
Barry Warsaw3cef8562000-05-01 16:17:24 +00001266 PyObject* arg;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001267
Guido van Rossum6d8841c1997-08-14 19:57:39 +00001268/* XXX should define struct utimbuf instead, above */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001269#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001270 struct utimbuf buf;
1271#define ATIME buf.actime
1272#define MTIME buf.modtime
1273#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001274#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001275 time_t buf[2];
1276#define ATIME buf[0]
1277#define MTIME buf[1]
1278#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001279#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001280
Barry Warsaw3cef8562000-05-01 16:17:24 +00001281 if (!PyArg_ParseTuple(args, "sO:utime", &path, &arg))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001282 return NULL;
Barry Warsaw3cef8562000-05-01 16:17:24 +00001283 if (arg == Py_None) {
1284 /* optional time values not given */
1285 Py_BEGIN_ALLOW_THREADS
1286 res = utime(path, NULL);
1287 Py_END_ALLOW_THREADS
1288 }
1289 else if (!PyArg_Parse(arg, "(ll)", &atime, &mtime)) {
1290 PyErr_SetString(PyExc_TypeError,
1291 "Second argument must be a 2-tuple of numbers.");
1292 return NULL;
1293 }
1294 else {
1295 ATIME = atime;
1296 MTIME = mtime;
1297 Py_BEGIN_ALLOW_THREADS
1298 res = utime(path, UTIME_ARG);
1299 Py_END_ALLOW_THREADS
1300 }
Guido van Rossumff4949e1992-08-05 19:58:53 +00001301 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00001302 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00001303 Py_INCREF(Py_None);
1304 return Py_None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001305#undef UTIME_ARG
1306#undef ATIME
1307#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001308}
1309
Guido van Rossum85e3b011991-06-03 12:42:10 +00001310
Guido van Rossum3b066191991-06-04 19:40:25 +00001311/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001312
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001313static char posix__exit__doc__[] =
1314"_exit(status)\n\
1315Exit to the system with specified status, without normal exit processing.";
1316
Barry Warsaw53699e91996-12-10 23:23:01 +00001317static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001318posix__exit(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001319 PyObject *self;
1320 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001321{
1322 int sts;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001323 if (!PyArg_ParseTuple(args, "i:_exit", &sts))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001324 return NULL;
1325 _exit(sts);
Guido van Rossuma376cc51996-12-05 23:43:35 +00001326 return NULL; /* Make gcc -Wall happy */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001327}
1328
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001329
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001330#ifdef HAVE_EXECV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001331static char posix_execv__doc__[] =
1332"execv(path, args)\n\
1333Execute an executable path with arguments, replacing current process.\n\
1334\n\
1335 path: path of executable file\n\
1336 args: tuple or list of strings";
1337
Barry Warsaw53699e91996-12-10 23:23:01 +00001338static PyObject *
Guido van Rossum89b33251993-10-22 14:26:06 +00001339posix_execv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001340 PyObject *self;
1341 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001342{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001343 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00001344 PyObject *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001345 char **argvlist;
1346 int i, argc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001347 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossum85e3b011991-06-03 12:42:10 +00001348
Guido van Rossum89b33251993-10-22 14:26:06 +00001349 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +00001350 argv is a list or tuple of strings. */
1351
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001352 if (!PyArg_ParseTuple(args, "sO:execv", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001353 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001354 if (PyList_Check(argv)) {
1355 argc = PyList_Size(argv);
1356 getitem = PyList_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001357 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001358 else if (PyTuple_Check(argv)) {
1359 argc = PyTuple_Size(argv);
1360 getitem = PyTuple_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001361 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001362 else {
Guido van Rossum50422b42000-04-26 20:34:28 +00001363 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
1364 return NULL;
1365 }
1366
1367 if (argc == 0) {
1368 PyErr_SetString(PyExc_ValueError, "empty argument list");
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001369 return NULL;
1370 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00001371
Barry Warsaw53699e91996-12-10 23:23:01 +00001372 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001373 if (argvlist == NULL)
1374 return NULL;
1375 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001376 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
1377 PyMem_DEL(argvlist);
Guido van Rossum50422b42000-04-26 20:34:28 +00001378 PyErr_SetString(PyExc_TypeError,
1379 "all arguments must be strings");
1380 return NULL;
1381
Guido van Rossum85e3b011991-06-03 12:42:10 +00001382 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00001383 }
1384 argvlist[argc] = NULL;
1385
Guido van Rossumb6775db1994-08-01 11:34:53 +00001386#ifdef BAD_EXEC_PROTOTYPES
1387 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001388#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001389 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001390#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001391
Guido van Rossum85e3b011991-06-03 12:42:10 +00001392 /* If we get here it's definitely an error */
1393
Barry Warsaw53699e91996-12-10 23:23:01 +00001394 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001395 return posix_error();
1396}
1397
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001398
1399static char posix_execve__doc__[] =
1400"execve(path, args, env)\n\
1401Execute a path with arguments and environment, replacing current process.\n\
1402\n\
1403 path: path of executable file\n\
1404 args: tuple or list of arguments\n\
1405 env: dictonary of strings mapping to strings";
1406
Barry Warsaw53699e91996-12-10 23:23:01 +00001407static PyObject *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001408posix_execve(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001409 PyObject *self;
1410 PyObject *args;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001411{
1412 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00001413 PyObject *argv, *env;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001414 char **argvlist;
1415 char **envlist;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001416 PyObject *key, *val, *keys=NULL, *vals=NULL;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001417 int i, pos, argc, envc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001418 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001419
1420 /* execve has three arguments: (path, argv, env), where
1421 argv is a list or tuple of strings and env is a dictionary
1422 like posix.environ. */
1423
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001424 if (!PyArg_ParseTuple(args, "sOO:execve", &path, &argv, &env))
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001425 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001426 if (PyList_Check(argv)) {
1427 argc = PyList_Size(argv);
1428 getitem = PyList_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001429 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001430 else if (PyTuple_Check(argv)) {
1431 argc = PyTuple_Size(argv);
1432 getitem = PyTuple_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001433 }
1434 else {
Barry Warsaw53699e91996-12-10 23:23:01 +00001435 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001436 return NULL;
1437 }
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001438 if (!PyMapping_Check(env)) {
1439 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001440 return NULL;
1441 }
1442
Guido van Rossum50422b42000-04-26 20:34:28 +00001443 if (argc == 0) {
1444 PyErr_SetString(PyExc_ValueError,
1445 "empty argument list");
1446 return NULL;
1447 }
1448
Barry Warsaw53699e91996-12-10 23:23:01 +00001449 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001450 if (argvlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001451 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001452 return NULL;
1453 }
1454 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001455 if (!PyArg_Parse((*getitem)(argv, i),
Barry Warsaw43d68b81996-12-19 22:10:44 +00001456 "s;argv must be list of strings",
1457 &argvlist[i]))
1458 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001459 goto fail_1;
1460 }
1461 }
1462 argvlist[argc] = NULL;
1463
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001464 i = PyMapping_Length(env);
Barry Warsaw53699e91996-12-10 23:23:01 +00001465 envlist = PyMem_NEW(char *, i + 1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001466 if (envlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001467 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001468 goto fail_1;
1469 }
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001470 envc = 0;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001471 keys = PyMapping_Keys(env);
1472 vals = PyMapping_Values(env);
1473 if (!keys || !vals)
1474 goto fail_2;
1475
1476 for (pos = 0; pos < i; pos++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001477 char *p, *k, *v;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001478
1479 key = PyList_GetItem(keys, pos);
1480 val = PyList_GetItem(vals, pos);
1481 if (!key || !val)
1482 goto fail_2;
1483
Barry Warsaw53699e91996-12-10 23:23:01 +00001484 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
Barry Warsaw43d68b81996-12-19 22:10:44 +00001485 !PyArg_Parse(val, "s;non-string value in env", &v))
1486 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001487 goto fail_2;
1488 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00001489
1490#if defined(PYOS_OS2)
1491 /* Omit Pseudo-Env Vars that Would Confuse Programs if Passed On */
1492 if (stricmp(k, "BEGINLIBPATH") != 0 && stricmp(k, "ENDLIBPATH") != 0) {
1493#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001494 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001495 if (p == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001496 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001497 goto fail_2;
1498 }
1499 sprintf(p, "%s=%s", k, v);
1500 envlist[envc++] = p;
Guido van Rossumd48f2521997-12-05 22:19:34 +00001501#if defined(PYOS_OS2)
1502 }
1503#endif
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001504 }
1505 envlist[envc] = 0;
1506
Guido van Rossumb6775db1994-08-01 11:34:53 +00001507
1508#ifdef BAD_EXEC_PROTOTYPES
1509 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001510#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001511 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001512#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001513
1514 /* If we get here it's definitely an error */
1515
1516 (void) posix_error();
1517
1518 fail_2:
1519 while (--envc >= 0)
Barry Warsaw53699e91996-12-10 23:23:01 +00001520 PyMem_DEL(envlist[envc]);
1521 PyMem_DEL(envlist);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001522 fail_1:
Barry Warsaw53699e91996-12-10 23:23:01 +00001523 PyMem_DEL(argvlist);
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001524 Py_XDECREF(vals);
1525 Py_XDECREF(keys);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001526 return NULL;
1527}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001528#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001529
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001530
Guido van Rossuma1065681999-01-25 23:20:23 +00001531#ifdef HAVE_SPAWNV
1532static char posix_spawnv__doc__[] =
Fred Drakea6dff3e1999-02-01 22:24:40 +00001533"spawnv(mode, path, args)\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001534Execute an executable path with arguments, replacing current process.\n\
1535\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00001536 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001537 path: path of executable file\n\
1538 args: tuple or list of strings";
1539
1540static PyObject *
1541posix_spawnv(self, args)
1542 PyObject *self;
1543 PyObject *args;
1544{
1545 char *path;
1546 PyObject *argv;
1547 char **argvlist;
1548 int mode, i, argc;
1549 PyObject *(*getitem) Py_PROTO((PyObject *, int));
1550
1551 /* spawnv has three arguments: (mode, path, argv), where
1552 argv is a list or tuple of strings. */
1553
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001554 if (!PyArg_ParseTuple(args, "isO:spawnv", &mode, &path, &argv))
Guido van Rossuma1065681999-01-25 23:20:23 +00001555 return NULL;
1556 if (PyList_Check(argv)) {
1557 argc = PyList_Size(argv);
1558 getitem = PyList_GetItem;
1559 }
1560 else if (PyTuple_Check(argv)) {
1561 argc = PyTuple_Size(argv);
1562 getitem = PyTuple_GetItem;
1563 }
1564 else {
1565 badarg:
1566 PyErr_BadArgument();
1567 return NULL;
1568 }
1569
1570 argvlist = PyMem_NEW(char *, argc+1);
1571 if (argvlist == NULL)
1572 return NULL;
1573 for (i = 0; i < argc; i++) {
1574 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
1575 PyMem_DEL(argvlist);
1576 goto badarg;
1577 }
1578 }
1579 argvlist[argc] = NULL;
1580
Guido van Rossum246bc171999-02-01 23:54:31 +00001581 if (mode == _OLD_P_OVERLAY)
1582 mode = _P_OVERLAY;
Guido van Rossuma1065681999-01-25 23:20:23 +00001583 i = _spawnv(mode, path, argvlist);
1584
1585 PyMem_DEL(argvlist);
1586
1587 if (i == -1)
1588 return posix_error();
1589 else
1590 return Py_BuildValue("i", i);
1591}
1592
1593
1594static char posix_spawnve__doc__[] =
Fred Drakea6dff3e1999-02-01 22:24:40 +00001595"spawnve(mode, path, args, env)\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001596Execute a path with arguments and environment, replacing current process.\n\
1597\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00001598 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001599 path: path of executable file\n\
1600 args: tuple or list of arguments\n\
1601 env: dictonary of strings mapping to strings";
1602
1603static PyObject *
1604posix_spawnve(self, args)
1605 PyObject *self;
1606 PyObject *args;
1607{
1608 char *path;
1609 PyObject *argv, *env;
1610 char **argvlist;
1611 char **envlist;
1612 PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL;
1613 int mode, i, pos, argc, envc;
1614 PyObject *(*getitem) Py_PROTO((PyObject *, int));
1615
1616 /* spawnve has four arguments: (mode, path, argv, env), where
1617 argv is a list or tuple of strings and env is a dictionary
1618 like posix.environ. */
1619
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001620 if (!PyArg_ParseTuple(args, "isOO:spawnve", &mode, &path, &argv, &env))
Guido van Rossuma1065681999-01-25 23:20:23 +00001621 return NULL;
1622 if (PyList_Check(argv)) {
1623 argc = PyList_Size(argv);
1624 getitem = PyList_GetItem;
1625 }
1626 else if (PyTuple_Check(argv)) {
1627 argc = PyTuple_Size(argv);
1628 getitem = PyTuple_GetItem;
1629 }
1630 else {
1631 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
1632 return NULL;
1633 }
1634 if (!PyMapping_Check(env)) {
1635 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
1636 return NULL;
1637 }
1638
1639 argvlist = PyMem_NEW(char *, argc+1);
1640 if (argvlist == NULL) {
1641 PyErr_NoMemory();
1642 return NULL;
1643 }
1644 for (i = 0; i < argc; i++) {
1645 if (!PyArg_Parse((*getitem)(argv, i),
1646 "s;argv must be list of strings",
1647 &argvlist[i]))
1648 {
1649 goto fail_1;
1650 }
1651 }
1652 argvlist[argc] = NULL;
1653
1654 i = PyMapping_Length(env);
1655 envlist = PyMem_NEW(char *, i + 1);
1656 if (envlist == NULL) {
1657 PyErr_NoMemory();
1658 goto fail_1;
1659 }
1660 envc = 0;
1661 keys = PyMapping_Keys(env);
1662 vals = PyMapping_Values(env);
1663 if (!keys || !vals)
1664 goto fail_2;
1665
1666 for (pos = 0; pos < i; pos++) {
1667 char *p, *k, *v;
1668
1669 key = PyList_GetItem(keys, pos);
1670 val = PyList_GetItem(vals, pos);
1671 if (!key || !val)
1672 goto fail_2;
1673
1674 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
1675 !PyArg_Parse(val, "s;non-string value in env", &v))
1676 {
1677 goto fail_2;
1678 }
1679 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
1680 if (p == NULL) {
1681 PyErr_NoMemory();
1682 goto fail_2;
1683 }
1684 sprintf(p, "%s=%s", k, v);
1685 envlist[envc++] = p;
1686 }
1687 envlist[envc] = 0;
1688
Guido van Rossum246bc171999-02-01 23:54:31 +00001689 if (mode == _OLD_P_OVERLAY)
1690 mode = _P_OVERLAY;
Guido van Rossuma1065681999-01-25 23:20:23 +00001691 i = _spawnve(mode, path, argvlist, envlist);
1692 if (i == -1)
1693 (void) posix_error();
1694 else
1695 res = Py_BuildValue("i", i);
1696
1697 fail_2:
1698 while (--envc >= 0)
1699 PyMem_DEL(envlist[envc]);
1700 PyMem_DEL(envlist);
1701 fail_1:
1702 PyMem_DEL(argvlist);
1703 Py_XDECREF(vals);
1704 Py_XDECREF(keys);
1705 return res;
1706}
1707#endif /* HAVE_SPAWNV */
1708
1709
Guido van Rossumad0ee831995-03-01 10:34:45 +00001710#ifdef HAVE_FORK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001711static char posix_fork__doc__[] =
1712"fork() -> pid\n\
1713Fork a child process.\n\
1714\n\
1715Return 0 to child process and PID of child to parent process.";
1716
Barry Warsaw53699e91996-12-10 23:23:01 +00001717static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001718posix_fork(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001719 PyObject *self;
1720 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001721{
1722 int pid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001723 if (!PyArg_ParseTuple(args, ":fork"))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001724 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001725 pid = fork();
1726 if (pid == -1)
1727 return posix_error();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001728 PyOS_AfterFork();
Barry Warsaw53699e91996-12-10 23:23:01 +00001729 return PyInt_FromLong((long)pid);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001730}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001731#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001732
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001733
Guido van Rossumad0ee831995-03-01 10:34:45 +00001734#ifdef HAVE_GETEGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001735static char posix_getegid__doc__[] =
1736"getegid() -> egid\n\
1737Return the current process's effective group id.";
1738
Barry Warsaw53699e91996-12-10 23:23:01 +00001739static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001740posix_getegid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001741 PyObject *self;
1742 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001743{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001744 if (!PyArg_ParseTuple(args, ":getegid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001745 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001746 return PyInt_FromLong((long)getegid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001747}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001748#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001749
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001750
Guido van Rossumad0ee831995-03-01 10:34:45 +00001751#ifdef HAVE_GETEUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001752static char posix_geteuid__doc__[] =
1753"geteuid() -> euid\n\
1754Return the current process's effective user id.";
1755
Barry Warsaw53699e91996-12-10 23:23:01 +00001756static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001757posix_geteuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001758 PyObject *self;
1759 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001760{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001761 if (!PyArg_ParseTuple(args, ":geteuid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001762 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001763 return PyInt_FromLong((long)geteuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001764}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001765#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001766
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001767
Guido van Rossumad0ee831995-03-01 10:34:45 +00001768#ifdef HAVE_GETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001769static char posix_getgid__doc__[] =
1770"getgid() -> gid\n\
1771Return the current process's group id.";
1772
Barry Warsaw53699e91996-12-10 23:23:01 +00001773static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001774posix_getgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001775 PyObject *self;
1776 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001777{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001778 if (!PyArg_ParseTuple(args, ":getgid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001779 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001780 return PyInt_FromLong((long)getgid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001781}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001782#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001783
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001784
1785static char posix_getpid__doc__[] =
1786"getpid() -> pid\n\
1787Return the current process id";
1788
Barry Warsaw53699e91996-12-10 23:23:01 +00001789static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001790posix_getpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001791 PyObject *self;
1792 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001793{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001794 if (!PyArg_ParseTuple(args, ":getpid"))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001795 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001796 return PyInt_FromLong((long)getpid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001797}
1798
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001799
Fred Drakec9680921999-12-13 16:37:25 +00001800#ifdef HAVE_GETGROUPS
1801static char posix_getgroups__doc__[] = "\
1802getgroups() -> list of group IDs\n\
1803Return list of supplemental group IDs for the process.";
1804
1805static PyObject *
1806posix_getgroups(self, args)
1807 PyObject *self;
1808 PyObject *args;
1809{
1810 PyObject *result = NULL;
1811
1812 if (PyArg_ParseTuple(args, ":getgroups")) {
1813#ifdef NGROUPS_MAX
1814#define MAX_GROUPS NGROUPS_MAX
1815#else
1816 /* defined to be 16 on Solaris7, so this should be a small number */
1817#define MAX_GROUPS 64
1818#endif
1819 gid_t grouplist[MAX_GROUPS];
1820 int n;
1821
1822 n = getgroups(MAX_GROUPS, grouplist);
1823 if (n < 0)
1824 posix_error();
1825 else {
1826 result = PyList_New(n);
1827 if (result != NULL) {
1828 PyObject *o;
1829 int i;
1830 for (i = 0; i < n; ++i) {
1831 o = PyInt_FromLong((long)grouplist[i]);
1832 if (o == NULL) {
1833 Py_DECREF(result);
1834 result = NULL;
1835 break;
1836 }
1837 PyList_SET_ITEM(result, i, o);
1838 }
1839 }
1840 }
1841 }
1842 return result;
1843}
1844#endif
1845
Guido van Rossumb6775db1994-08-01 11:34:53 +00001846#ifdef HAVE_GETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001847static char posix_getpgrp__doc__[] =
1848"getpgrp() -> pgrp\n\
1849Return the current process group id.";
1850
Barry Warsaw53699e91996-12-10 23:23:01 +00001851static PyObject *
Guido van Rossum04814471991-06-04 20:23:49 +00001852posix_getpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001853 PyObject *self;
1854 PyObject *args;
Guido van Rossum04814471991-06-04 20:23:49 +00001855{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001856 if (!PyArg_ParseTuple(args, ":getpgrp"))
Guido van Rossum04814471991-06-04 20:23:49 +00001857 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001858#ifdef GETPGRP_HAVE_ARG
Barry Warsaw53699e91996-12-10 23:23:01 +00001859 return PyInt_FromLong((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001860#else /* GETPGRP_HAVE_ARG */
Barry Warsaw53699e91996-12-10 23:23:01 +00001861 return PyInt_FromLong((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001862#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001863}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001864#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001865
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001866
Guido van Rossumb6775db1994-08-01 11:34:53 +00001867#ifdef HAVE_SETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001868static char posix_setpgrp__doc__[] =
1869"setpgrp() -> None\n\
1870Make this process a session leader.";
1871
Barry Warsaw53699e91996-12-10 23:23:01 +00001872static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001873posix_setpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001874 PyObject *self;
1875 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001876{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001877 if (!PyArg_ParseTuple(args, ":setpgrp"))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001878 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001879#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001880 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001881#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001882 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001883#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001884 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001885 Py_INCREF(Py_None);
1886 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001887}
1888
Guido van Rossumb6775db1994-08-01 11:34:53 +00001889#endif /* HAVE_SETPGRP */
1890
Guido van Rossumad0ee831995-03-01 10:34:45 +00001891#ifdef HAVE_GETPPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001892static char posix_getppid__doc__[] =
1893"getppid() -> ppid\n\
1894Return the parent's process id.";
1895
Barry Warsaw53699e91996-12-10 23:23:01 +00001896static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001897posix_getppid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001898 PyObject *self;
1899 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001900{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001901 if (!PyArg_ParseTuple(args, ":getppid"))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001902 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001903 return PyInt_FromLong((long)getppid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001904}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001905#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001906
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001907
Fred Drake12c6e2d1999-12-14 21:25:03 +00001908#ifdef HAVE_GETLOGIN
1909static char posix_getlogin__doc__[] = "\
1910getlogin() -> string\n\
1911Return the actual login name.";
1912
1913static PyObject *
1914posix_getlogin(self, args)
1915 PyObject *self;
1916 PyObject *args;
1917{
1918 PyObject *result = NULL;
1919
1920 if (PyArg_ParseTuple(args, ":getlogin")) {
1921 char *name = getlogin();
1922
1923 if (name == NULL)
1924 posix_error();
1925 else
1926 result = PyString_FromString(name);
1927 }
1928 return result;
1929}
1930#endif
1931
Guido van Rossumad0ee831995-03-01 10:34:45 +00001932#ifdef HAVE_GETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001933static char posix_getuid__doc__[] =
1934"getuid() -> uid\n\
1935Return the current process's user id.";
1936
Barry Warsaw53699e91996-12-10 23:23:01 +00001937static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001938posix_getuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001939 PyObject *self;
1940 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001941{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001942 if (!PyArg_ParseTuple(args, ":getuid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001943 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001944 return PyInt_FromLong((long)getuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001945}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001946#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001947
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001948
Guido van Rossumad0ee831995-03-01 10:34:45 +00001949#ifdef HAVE_KILL
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001950static char posix_kill__doc__[] =
1951"kill(pid, sig) -> None\n\
1952Kill a process with a signal.";
1953
Barry Warsaw53699e91996-12-10 23:23:01 +00001954static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001955posix_kill(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001956 PyObject *self;
1957 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001958{
1959 int pid, sig;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001960 if (!PyArg_ParseTuple(args, "ii:kill", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001961 return NULL;
Guido van Rossumd48f2521997-12-05 22:19:34 +00001962#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001963 if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
1964 APIRET rc;
1965 if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00001966 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001967
1968 } else if (sig == XCPT_SIGNAL_KILLPROC) {
1969 APIRET rc;
1970 if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00001971 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001972
1973 } else
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001974 return NULL; /* Unrecognized Signal Requested */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001975#else
Guido van Rossum85e3b011991-06-03 12:42:10 +00001976 if (kill(pid, sig) == -1)
1977 return posix_error();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001978#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001979 Py_INCREF(Py_None);
1980 return Py_None;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001981}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001982#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001983
Guido van Rossumc0125471996-06-28 18:55:32 +00001984#ifdef HAVE_PLOCK
1985
1986#ifdef HAVE_SYS_LOCK_H
1987#include <sys/lock.h>
1988#endif
1989
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001990static char posix_plock__doc__[] =
1991"plock(op) -> None\n\
1992Lock program segments into memory.";
1993
Barry Warsaw53699e91996-12-10 23:23:01 +00001994static PyObject *
Guido van Rossumc0125471996-06-28 18:55:32 +00001995posix_plock(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001996 PyObject *self;
1997 PyObject *args;
Guido van Rossumc0125471996-06-28 18:55:32 +00001998{
1999 int op;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002000 if (!PyArg_ParseTuple(args, "i:plock", &op))
Guido van Rossumc0125471996-06-28 18:55:32 +00002001 return NULL;
2002 if (plock(op) == -1)
2003 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002004 Py_INCREF(Py_None);
2005 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00002006}
2007#endif
2008
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002009
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002010#ifdef HAVE_POPEN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002011static char posix_popen__doc__[] =
2012"popen(command [, mode='r' [, bufsize]]) -> pipe\n\
2013Open a pipe to/from a command returning a file object.";
2014
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002015#if defined(PYOS_OS2)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002016static int
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002017async_system(const char *command)
2018{
2019 char *p, errormsg[256], args[1024];
2020 RESULTCODES rcodes;
2021 APIRET rc;
2022 char *shell = getenv("COMSPEC");
2023 if (!shell)
2024 shell = "cmd";
2025
2026 strcpy(args, shell);
2027 p = &args[ strlen(args)+1 ];
2028 strcpy(p, "/c ");
2029 strcat(p, command);
2030 p += strlen(p) + 1;
2031 *p = '\0';
2032
2033 rc = DosExecPgm(errormsg, sizeof(errormsg),
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002034 EXEC_ASYNC, /* Execute Async w/o Wait for Results */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002035 args,
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002036 NULL, /* Inherit Parent's Environment */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002037 &rcodes, shell);
2038 return rc;
2039}
2040
Guido van Rossumd48f2521997-12-05 22:19:34 +00002041static FILE *
2042popen(const char *command, const char *mode, int pipesize, int *err)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002043{
2044 HFILE rhan, whan;
2045 FILE *retfd = NULL;
2046 APIRET rc = DosCreatePipe(&rhan, &whan, pipesize);
2047
Guido van Rossumd48f2521997-12-05 22:19:34 +00002048 if (rc != NO_ERROR) {
2049 *err = rc;
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002050 return NULL; /* ERROR - Unable to Create Anon Pipe */
Guido van Rossumd48f2521997-12-05 22:19:34 +00002051 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002052
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002053 if (strchr(mode, 'r') != NULL) { /* Treat Command as a Data Source */
2054 int oldfd = dup(1); /* Save STDOUT Handle in Another Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002055
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002056 DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
2057 close(1); /* Make STDOUT Available for Reallocation */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002058
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002059 if (dup2(whan, 1) == 0) { /* Connect STDOUT to Pipe Write Side */
2060 DosClose(whan); /* Close Now-Unused Pipe Write Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002061
2062 if (async_system(command) == NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002063 retfd = fdopen(rhan, mode); /* And Return Pipe Read Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002064 }
2065
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002066 dup2(oldfd, 1); /* Reconnect STDOUT to Original Handle */
2067 DosExitCritSec(); /* Now Allow Other Threads to Run */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002068
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002069 close(oldfd); /* And Close Saved STDOUT Handle */
2070 return retfd; /* Return fd of Pipe or NULL if Error */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002071
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002072 } else if (strchr(mode, 'w')) { /* Treat Command as a Data Sink */
2073 int oldfd = dup(0); /* Save STDIN Handle in Another Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002074
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002075 DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
2076 close(0); /* Make STDIN Available for Reallocation */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002077
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002078 if (dup2(rhan, 0) == 0) { /* Connect STDIN to Pipe Read Side */
2079 DosClose(rhan); /* Close Now-Unused Pipe Read Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002080
2081 if (async_system(command) == NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002082 retfd = fdopen(whan, mode); /* And Return Pipe Write Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002083 }
2084
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002085 dup2(oldfd, 0); /* Reconnect STDIN to Original Handle */
2086 DosExitCritSec(); /* Now Allow Other Threads to Run */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002087
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002088 close(oldfd); /* And Close Saved STDIN Handle */
2089 return retfd; /* Return fd of Pipe or NULL if Error */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002090
Guido van Rossumd48f2521997-12-05 22:19:34 +00002091 } else {
2092 *err = ERROR_INVALID_ACCESS;
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002093 return NULL; /* ERROR - Invalid Mode (Neither Read nor Write) */
Guido van Rossumd48f2521997-12-05 22:19:34 +00002094 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002095}
2096
2097static PyObject *
2098posix_popen(self, args)
2099 PyObject *self;
2100 PyObject *args;
2101{
2102 char *name;
2103 char *mode = "r";
Guido van Rossumd48f2521997-12-05 22:19:34 +00002104 int err, bufsize = -1;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002105 FILE *fp;
2106 PyObject *f;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002107 if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002108 return NULL;
2109 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd48f2521997-12-05 22:19:34 +00002110 fp = popen(name, mode, (bufsize > 0) ? bufsize : 4096, &err);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002111 Py_END_ALLOW_THREADS
2112 if (fp == NULL)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002113 return os2_error(err);
2114
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002115 f = PyFile_FromFile(fp, name, mode, fclose);
2116 if (f != NULL)
2117 PyFile_SetBufSize(f, bufsize);
2118 return f;
2119}
2120
2121#else
Barry Warsaw53699e91996-12-10 23:23:01 +00002122static PyObject *
Guido van Rossum3b066191991-06-04 19:40:25 +00002123posix_popen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002124 PyObject *self;
2125 PyObject *args;
Guido van Rossum3b066191991-06-04 19:40:25 +00002126{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002127 char *name;
2128 char *mode = "r";
2129 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00002130 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002131 PyObject *f;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002132 if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00002133 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002134 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002135 fp = popen(name, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002136 Py_END_ALLOW_THREADS
Guido van Rossum3b066191991-06-04 19:40:25 +00002137 if (fp == NULL)
2138 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002139 f = PyFile_FromFile(fp, name, mode, pclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002140 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002141 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002142 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00002143}
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002144#endif
2145
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002146#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00002147
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002148
Guido van Rossumb6775db1994-08-01 11:34:53 +00002149#ifdef HAVE_SETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002150static char posix_setuid__doc__[] =
2151"setuid(uid) -> None\n\
2152Set the current process's user id.";
Barry Warsaw53699e91996-12-10 23:23:01 +00002153static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002154posix_setuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002155 PyObject *self;
2156 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002157{
2158 int uid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002159 if (!PyArg_ParseTuple(args, "i:setuid", &uid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002160 return NULL;
2161 if (setuid(uid) < 0)
2162 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002163 Py_INCREF(Py_None);
2164 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002165}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002166#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002167
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002168
Guido van Rossumb6775db1994-08-01 11:34:53 +00002169#ifdef HAVE_SETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002170static char posix_setgid__doc__[] =
2171"setgid(gid) -> None\n\
2172Set the current process's group id.";
2173
Barry Warsaw53699e91996-12-10 23:23:01 +00002174static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002175posix_setgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002176 PyObject *self;
2177 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002178{
2179 int gid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002180 if (!PyArg_ParseTuple(args, "i:setgid", &gid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002181 return NULL;
2182 if (setgid(gid) < 0)
2183 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002184 Py_INCREF(Py_None);
2185 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002186}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002187#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002188
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002189
Guido van Rossumb6775db1994-08-01 11:34:53 +00002190#ifdef HAVE_WAITPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002191static char posix_waitpid__doc__[] =
2192"waitpid(pid, options) -> (pid, status)\n\
2193Wait for completion of a give child process.";
2194
Barry Warsaw53699e91996-12-10 23:23:01 +00002195static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00002196posix_waitpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002197 PyObject *self;
2198 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00002199{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002200 int pid, options;
2201#ifdef UNION_WAIT
2202 union wait status;
2203#define status_i (status.w_status)
2204#else
2205 int status;
2206#define status_i status
2207#endif
2208 status_i = 0;
2209
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002210 if (!PyArg_ParseTuple(args, "ii:waitpid", &pid, &options))
Guido van Rossum21803b81992-08-09 12:55:27 +00002211 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002212 Py_BEGIN_ALLOW_THREADS
Guido van Rossume6a3aa61999-02-01 16:15:30 +00002213#ifdef NeXT
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002214 pid = wait4(pid, &status, options, NULL);
Guido van Rossume6a3aa61999-02-01 16:15:30 +00002215#else
2216 pid = waitpid(pid, &status, options);
2217#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002218 Py_END_ALLOW_THREADS
Guido van Rossum85e3b011991-06-03 12:42:10 +00002219 if (pid == -1)
2220 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00002221 else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002222 return Py_BuildValue("ii", pid, status_i);
Guido van Rossum21803b81992-08-09 12:55:27 +00002223}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002224#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00002225
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002226
Guido van Rossumad0ee831995-03-01 10:34:45 +00002227#ifdef HAVE_WAIT
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002228static char posix_wait__doc__[] =
2229"wait() -> (pid, status)\n\
2230Wait for completion of a child process.";
2231
Barry Warsaw53699e91996-12-10 23:23:01 +00002232static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00002233posix_wait(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002234 PyObject *self;
2235 PyObject *args;
Guido van Rossum21803b81992-08-09 12:55:27 +00002236{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002237 int pid;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002238#ifdef UNION_WAIT
2239 union wait status;
2240#define status_i (status.w_status)
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002241#else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002242 int status;
2243#define status_i status
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002244#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002245 if (!PyArg_ParseTuple(args, ":wait"))
2246 return NULL;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002247 status_i = 0;
2248 Py_BEGIN_ALLOW_THREADS
2249 pid = wait(&status);
Barry Warsaw53699e91996-12-10 23:23:01 +00002250 Py_END_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00002251 if (pid == -1)
2252 return posix_error();
2253 else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002254 return Py_BuildValue("ii", pid, status_i);
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002255#undef status_i
Guido van Rossum85e3b011991-06-03 12:42:10 +00002256}
Guido van Rossumad0ee831995-03-01 10:34:45 +00002257#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00002258
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002259
2260static char posix_lstat__doc__[] =
2261"lstat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
2262Like stat(path), but do not follow symbolic links.";
2263
Barry Warsaw53699e91996-12-10 23:23:01 +00002264static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002265posix_lstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002266 PyObject *self;
2267 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002268{
Guido van Rossumb6775db1994-08-01 11:34:53 +00002269#ifdef HAVE_LSTAT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002270 return posix_do_stat(self, args, "s:lstat", lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002271#else /* !HAVE_LSTAT */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002272 return posix_do_stat(self, args, "s:lstat", stat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002273#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002274}
2275
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002276
Guido van Rossumb6775db1994-08-01 11:34:53 +00002277#ifdef HAVE_READLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002278static char posix_readlink__doc__[] =
2279"readlink(path) -> path\n\
2280Return a string representing the path to which the symbolic link points.";
2281
Barry Warsaw53699e91996-12-10 23:23:01 +00002282static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002283posix_readlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002284 PyObject *self;
2285 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002286{
Guido van Rossumb6775db1994-08-01 11:34:53 +00002287 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002288 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002289 int n;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002290 if (!PyArg_ParseTuple(args, "s:readlink", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002291 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002292 Py_BEGIN_ALLOW_THREADS
Guido van Rossum50e61dc1992-03-27 17:22:31 +00002293 n = readlink(path, buf, (int) sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +00002294 Py_END_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002295 if (n < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00002296 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00002297 return PyString_FromStringAndSize(buf, n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002298}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002299#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002300
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002301
Guido van Rossumb6775db1994-08-01 11:34:53 +00002302#ifdef HAVE_SYMLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002303static char posix_symlink__doc__[] =
2304"symlink(src, dst) -> None\n\
2305Create a symbolic link.";
2306
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002307static PyObject *
2308posix_symlink(self, args)
2309 PyObject *self;
2310 PyObject *args;
2311{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002312 return posix_2str(args, "ss:symlink", symlink);
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002313}
2314#endif /* HAVE_SYMLINK */
2315
2316
2317#ifdef HAVE_TIMES
2318#ifndef HZ
2319#define HZ 60 /* Universal constant :-) */
2320#endif /* HZ */
2321
Guido van Rossumd48f2521997-12-05 22:19:34 +00002322#if defined(PYCC_VACPP) && defined(PYOS_OS2)
2323static long
2324system_uptime()
2325{
2326 ULONG value = 0;
2327
2328 Py_BEGIN_ALLOW_THREADS
2329 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &value, sizeof(value));
2330 Py_END_ALLOW_THREADS
2331
2332 return value;
2333}
2334
2335static PyObject *
2336posix_times(self, args)
2337 PyObject *self;
2338 PyObject *args;
2339{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002340 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossumd48f2521997-12-05 22:19:34 +00002341 return NULL;
2342
2343 /* Currently Only Uptime is Provided -- Others Later */
2344 return Py_BuildValue("ddddd",
2345 (double)0 /* t.tms_utime / HZ */,
2346 (double)0 /* t.tms_stime / HZ */,
2347 (double)0 /* t.tms_cutime / HZ */,
2348 (double)0 /* t.tms_cstime / HZ */,
2349 (double)system_uptime() / 1000);
2350}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002351#else /* not OS2 */
Barry Warsaw53699e91996-12-10 23:23:01 +00002352static PyObject *
Guido van Rossum22db57e1992-04-05 14:25:30 +00002353posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002354 PyObject *self;
2355 PyObject *args;
Guido van Rossum22db57e1992-04-05 14:25:30 +00002356{
2357 struct tms t;
2358 clock_t c;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002359 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossum22db57e1992-04-05 14:25:30 +00002360 return NULL;
2361 errno = 0;
2362 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00002363 if (c == (clock_t) -1)
2364 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002365 return Py_BuildValue("ddddd",
Barry Warsaw43d68b81996-12-19 22:10:44 +00002366 (double)t.tms_utime / HZ,
2367 (double)t.tms_stime / HZ,
2368 (double)t.tms_cutime / HZ,
2369 (double)t.tms_cstime / HZ,
2370 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00002371}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002372#endif /* not OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002373#endif /* HAVE_TIMES */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002374
2375
Guido van Rossum87755a21996-09-07 00:59:43 +00002376#ifdef MS_WIN32
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002377#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00002378static PyObject *
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002379posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002380 PyObject *self;
2381 PyObject *args;
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002382{
2383 FILETIME create, exit, kernel, user;
2384 HANDLE hProc;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002385 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002386 return NULL;
2387 hProc = GetCurrentProcess();
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00002388 GetProcessTimes(hProc, &create, &exit, &kernel, &user);
2389 /* The fields of a FILETIME structure are the hi and lo part
2390 of a 64-bit value expressed in 100 nanosecond units.
2391 1e7 is one second in such units; 1e-7 the inverse.
2392 429.4967296 is 2**32 / 1e7 or 2**32 * 1e-7.
2393 */
Barry Warsaw53699e91996-12-10 23:23:01 +00002394 return Py_BuildValue(
2395 "ddddd",
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00002396 (double)(kernel.dwHighDateTime*429.4967296 +
2397 kernel.dwLowDateTime*1e-7),
2398 (double)(user.dwHighDateTime*429.4967296 +
2399 user.dwLowDateTime*1e-7),
Barry Warsaw53699e91996-12-10 23:23:01 +00002400 (double)0,
2401 (double)0,
2402 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002403}
Guido van Rossum8d665e61996-06-26 18:22:49 +00002404#endif /* MS_WIN32 */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002405
2406#ifdef HAVE_TIMES
Roger E. Masse0318fd61997-06-05 22:07:58 +00002407static char posix_times__doc__[] =
2408"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\
2409Return a tuple of floating point numbers indicating process times.";
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002410#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002411
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002412
Guido van Rossumb6775db1994-08-01 11:34:53 +00002413#ifdef HAVE_SETSID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002414static char posix_setsid__doc__[] =
2415"setsid() -> None\n\
2416Call the system call setsid().";
2417
Barry Warsaw53699e91996-12-10 23:23:01 +00002418static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00002419posix_setsid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002420 PyObject *self;
2421 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002422{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002423 if (!PyArg_ParseTuple(args, ":setsid"))
Guido van Rossumc2670a01992-09-13 20:07:29 +00002424 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002425 if (setsid() < 0)
2426 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002427 Py_INCREF(Py_None);
2428 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002429}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002430#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00002431
Guido van Rossumb6775db1994-08-01 11:34:53 +00002432#ifdef HAVE_SETPGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002433static char posix_setpgid__doc__[] =
2434"setpgid(pid, pgrp) -> None\n\
2435Call the system call setpgid().";
2436
Barry Warsaw53699e91996-12-10 23:23:01 +00002437static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00002438posix_setpgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002439 PyObject *self;
2440 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002441{
2442 int pid, pgrp;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002443 if (!PyArg_ParseTuple(args, "ii:setpgid", &pid, &pgrp))
Guido van Rossumc2670a01992-09-13 20:07:29 +00002444 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002445 if (setpgid(pid, pgrp) < 0)
2446 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002447 Py_INCREF(Py_None);
2448 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002449}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002450#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00002451
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002452
Guido van Rossumb6775db1994-08-01 11:34:53 +00002453#ifdef HAVE_TCGETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002454static char posix_tcgetpgrp__doc__[] =
2455"tcgetpgrp(fd) -> pgid\n\
2456Return the process group associated with the terminal given by a fd.";
2457
Barry Warsaw53699e91996-12-10 23:23:01 +00002458static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00002459posix_tcgetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002460 PyObject *self;
2461 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002462{
2463 int fd, pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002464 if (!PyArg_ParseTuple(args, "i:tcgetpgrp", &fd))
Guido van Rossum7066dd71992-09-17 17:54:56 +00002465 return NULL;
2466 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002467 if (pgid < 0)
2468 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002469 return PyInt_FromLong((long)pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00002470}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002471#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00002472
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002473
Guido van Rossumb6775db1994-08-01 11:34:53 +00002474#ifdef HAVE_TCSETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002475static char posix_tcsetpgrp__doc__[] =
2476"tcsetpgrp(fd, pgid) -> None\n\
2477Set the process group associated with the terminal given by a fd.";
2478
Barry Warsaw53699e91996-12-10 23:23:01 +00002479static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00002480posix_tcsetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002481 PyObject *self;
2482 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002483{
2484 int fd, pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002485 if (!PyArg_ParseTuple(args, "ii:tcsetpgrp", &fd, &pgid))
Guido van Rossum7066dd71992-09-17 17:54:56 +00002486 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002487 if (tcsetpgrp(fd, pgid) < 0)
2488 return posix_error();
Barry Warsaw43d68b81996-12-19 22:10:44 +00002489 Py_INCREF(Py_None);
Barry Warsaw53699e91996-12-10 23:23:01 +00002490 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002491}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002492#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00002493
Guido van Rossum687dd131993-05-17 08:34:16 +00002494/* Functions acting on file descriptors */
2495
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002496static char posix_open__doc__[] =
2497"open(filename, flag [, mode=0777]) -> fd\n\
2498Open a file (for low level IO).";
2499
Barry Warsaw53699e91996-12-10 23:23:01 +00002500static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002501posix_open(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002502 PyObject *self;
2503 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002504{
2505 char *file;
2506 int flag;
2507 int mode = 0777;
2508 int fd;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002509 if (!PyArg_ParseTuple(args, "si|i", &file, &flag, &mode))
2510 return NULL;
2511
Barry Warsaw53699e91996-12-10 23:23:01 +00002512 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002513 fd = open(file, flag, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002514 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002515 if (fd < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00002516 return posix_error_with_filename(file);
Barry Warsaw53699e91996-12-10 23:23:01 +00002517 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002518}
2519
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002520
2521static char posix_close__doc__[] =
2522"close(fd) -> None\n\
2523Close a file descriptor (for low level IO).";
2524
Barry Warsaw53699e91996-12-10 23:23:01 +00002525static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002526posix_close(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, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002531 if (!PyArg_ParseTuple(args, "i:close", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002532 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002533 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002534 res = close(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00002535 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002536 if (res < 0)
2537 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002538 Py_INCREF(Py_None);
2539 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00002540}
2541
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002542
2543static char posix_dup__doc__[] =
2544"dup(fd) -> fd2\n\
2545Return a duplicate of a file descriptor.";
2546
Barry Warsaw53699e91996-12-10 23:23:01 +00002547static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002548posix_dup(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002549 PyObject *self;
2550 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002551{
2552 int fd;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002553 if (!PyArg_ParseTuple(args, "i:dup", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002554 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002555 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002556 fd = dup(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00002557 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002558 if (fd < 0)
2559 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002560 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002561}
2562
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002563
2564static char posix_dup2__doc__[] =
2565"dup2(fd, fd2) -> None\n\
2566Duplicate file descriptor.";
2567
Barry Warsaw53699e91996-12-10 23:23:01 +00002568static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002569posix_dup2(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002570 PyObject *self;
2571 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002572{
2573 int fd, fd2, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002574 if (!PyArg_ParseTuple(args, "ii:dup2", &fd, &fd2))
Guido van Rossum687dd131993-05-17 08:34:16 +00002575 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002576 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002577 res = dup2(fd, fd2);
Barry Warsaw53699e91996-12-10 23:23:01 +00002578 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002579 if (res < 0)
2580 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002581 Py_INCREF(Py_None);
2582 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00002583}
2584
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002585
2586static char posix_lseek__doc__[] =
2587"lseek(fd, pos, how) -> newpos\n\
2588Set the current position of a file descriptor.";
2589
Barry Warsaw53699e91996-12-10 23:23:01 +00002590static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002591posix_lseek(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002592 PyObject *self;
2593 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002594{
2595 int fd, how;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002596 off_t pos, res;
2597 PyObject *posobj;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002598 if (!PyArg_ParseTuple(args, "iOi:lseek", &fd, &posobj, &how))
Guido van Rossum687dd131993-05-17 08:34:16 +00002599 return NULL;
2600#ifdef SEEK_SET
2601 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
2602 switch (how) {
2603 case 0: how = SEEK_SET; break;
2604 case 1: how = SEEK_CUR; break;
2605 case 2: how = SEEK_END; break;
2606 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002607#endif /* SEEK_END */
Guido van Rossum94f6f721999-01-06 18:42:14 +00002608
2609#if !defined(HAVE_LARGEFILE_SUPPORT)
2610 pos = PyInt_AsLong(posobj);
2611#else
2612 pos = PyLong_Check(posobj) ?
2613 PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj);
2614#endif
2615 if (PyErr_Occurred())
2616 return NULL;
2617
Barry Warsaw53699e91996-12-10 23:23:01 +00002618 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002619 res = lseek(fd, pos, how);
Barry Warsaw53699e91996-12-10 23:23:01 +00002620 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002621 if (res < 0)
2622 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00002623
2624#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +00002625 return PyInt_FromLong(res);
Guido van Rossum94f6f721999-01-06 18:42:14 +00002626#else
2627 return PyLong_FromLongLong(res);
2628#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002629}
2630
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002631
2632static char posix_read__doc__[] =
2633"read(fd, buffersize) -> string\n\
2634Read a file descriptor.";
2635
Barry Warsaw53699e91996-12-10 23:23:01 +00002636static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002637posix_read(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002638 PyObject *self;
2639 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002640{
Guido van Rossum8bac5461996-06-11 18:38:48 +00002641 int fd, size, n;
Barry Warsaw53699e91996-12-10 23:23:01 +00002642 PyObject *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002643 if (!PyArg_ParseTuple(args, "ii:read", &fd, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00002644 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002645 buffer = PyString_FromStringAndSize((char *)NULL, size);
Guido van Rossum687dd131993-05-17 08:34:16 +00002646 if (buffer == NULL)
2647 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002648 Py_BEGIN_ALLOW_THREADS
2649 n = read(fd, PyString_AsString(buffer), size);
2650 Py_END_ALLOW_THREADS
Guido van Rossum8bac5461996-06-11 18:38:48 +00002651 if (n < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002652 Py_DECREF(buffer);
Guido van Rossum687dd131993-05-17 08:34:16 +00002653 return posix_error();
2654 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00002655 if (n != size)
Barry Warsaw53699e91996-12-10 23:23:01 +00002656 _PyString_Resize(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00002657 return buffer;
2658}
2659
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002660
2661static char posix_write__doc__[] =
2662"write(fd, string) -> byteswritten\n\
2663Write a string to a file descriptor.";
2664
Barry Warsaw53699e91996-12-10 23:23:01 +00002665static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002666posix_write(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002667 PyObject *self;
2668 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002669{
2670 int fd, size;
2671 char *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002672 if (!PyArg_ParseTuple(args, "is#:write", &fd, &buffer, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00002673 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002674 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002675 size = write(fd, buffer, size);
Barry Warsaw53699e91996-12-10 23:23:01 +00002676 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002677 if (size < 0)
2678 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002679 return PyInt_FromLong((long)size);
Guido van Rossum687dd131993-05-17 08:34:16 +00002680}
2681
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002682
2683static char posix_fstat__doc__[]=
2684"fstat(fd) -> (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\
2685Like stat(), but for an open file descriptor.";
2686
Barry Warsaw53699e91996-12-10 23:23:01 +00002687static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002688posix_fstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002689 PyObject *self;
2690 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002691{
2692 int fd;
2693 struct stat st;
2694 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002695 if (!PyArg_ParseTuple(args, "i:fstat", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002696 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002697 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002698 res = fstat(fd, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00002699 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002700 if (res != 0)
2701 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00002702#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +00002703 return Py_BuildValue("(llllllllll)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00002704 (long)st.st_mode,
2705 (long)st.st_ino,
2706 (long)st.st_dev,
2707 (long)st.st_nlink,
2708 (long)st.st_uid,
2709 (long)st.st_gid,
2710 (long)st.st_size,
2711 (long)st.st_atime,
2712 (long)st.st_mtime,
2713 (long)st.st_ctime);
Guido van Rossum94f6f721999-01-06 18:42:14 +00002714#else
2715 return Py_BuildValue("(lLllllLlll)",
2716 (long)st.st_mode,
2717 (LONG_LONG)st.st_ino,
2718 (long)st.st_dev,
2719 (long)st.st_nlink,
2720 (long)st.st_uid,
2721 (long)st.st_gid,
2722 (LONG_LONG)st.st_size,
2723 (long)st.st_atime,
2724 (long)st.st_mtime,
2725 (long)st.st_ctime);
2726#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002727}
2728
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002729
2730static char posix_fdopen__doc__[] =
2731"fdopen(fd, [, mode='r' [, bufsize]]) -> file_object\n\
2732Return an open file object connected to a file descriptor.";
2733
Barry Warsaw53699e91996-12-10 23:23:01 +00002734static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002735posix_fdopen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002736 PyObject *self;
2737 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002738{
Barry Warsaw53699e91996-12-10 23:23:01 +00002739 extern int fclose Py_PROTO((FILE *));
Guido van Rossum687dd131993-05-17 08:34:16 +00002740 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002741 char *mode = "r";
2742 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00002743 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002744 PyObject *f;
2745 if (!PyArg_ParseTuple(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00002746 return NULL;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002747
Barry Warsaw53699e91996-12-10 23:23:01 +00002748 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002749 fp = fdopen(fd, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002750 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002751 if (fp == NULL)
2752 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002753 f = PyFile_FromFile(fp, "(fdopen)", mode, fclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002754 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002755 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002756 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00002757}
2758
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002759
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002760#ifdef HAVE_PIPE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002761static char posix_pipe__doc__[] =
2762"pipe() -> (read_end, write_end)\n\
2763Create a pipe.";
2764
Barry Warsaw53699e91996-12-10 23:23:01 +00002765static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002766posix_pipe(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002767 PyObject *self;
2768 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002769{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002770#if defined(PYOS_OS2)
2771 HFILE read, write;
2772 APIRET rc;
2773
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002774 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002775 return NULL;
2776
2777 Py_BEGIN_ALLOW_THREADS
2778 rc = DosCreatePipe( &read, &write, 4096);
2779 Py_END_ALLOW_THREADS
2780 if (rc != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002781 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002782
2783 return Py_BuildValue("(ii)", read, write);
2784#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002785#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00002786 int fds[2];
2787 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002788 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum687dd131993-05-17 08:34:16 +00002789 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002790 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002791 res = pipe(fds);
Barry Warsaw53699e91996-12-10 23:23:01 +00002792 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002793 if (res != 0)
2794 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002795 return Py_BuildValue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002796#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00002797 HANDLE read, write;
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002798 int read_fd, write_fd;
Guido van Rossum794d8131994-08-23 13:48:48 +00002799 BOOL ok;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002800 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum794d8131994-08-23 13:48:48 +00002801 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002802 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002803 ok = CreatePipe(&read, &write, NULL, 0);
Barry Warsaw53699e91996-12-10 23:23:01 +00002804 Py_END_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00002805 if (!ok)
2806 return posix_error();
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002807 read_fd = _open_osfhandle((long)read, 0);
2808 write_fd = _open_osfhandle((long)write, 1);
2809 return Py_BuildValue("(ii)", read_fd, write_fd);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002810#endif /* MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002811#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002812}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002813#endif /* HAVE_PIPE */
2814
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002815
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002816#ifdef HAVE_MKFIFO
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002817static char posix_mkfifo__doc__[] =
2818"mkfifo(file, [, mode=0666]) -> None\n\
2819Create a FIFO (a POSIX named pipe).";
2820
Barry Warsaw53699e91996-12-10 23:23:01 +00002821static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002822posix_mkfifo(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002823 PyObject *self;
2824 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002825{
2826 char *file;
2827 int mode = 0666;
2828 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002829 if (!PyArg_ParseTuple(args, "s|i:mkfifo", &file, &mode))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002830 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002831 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002832 res = mkfifo(file, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002833 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002834 if (res < 0)
2835 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002836 Py_INCREF(Py_None);
2837 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002838}
2839#endif
2840
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002841
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002842#ifdef HAVE_FTRUNCATE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002843static char posix_ftruncate__doc__[] =
2844"ftruncate(fd, length) -> None\n\
2845Truncate a file to a specified length.";
2846
Barry Warsaw53699e91996-12-10 23:23:01 +00002847static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002848posix_ftruncate(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002849 PyObject *self; /* Not used */
2850 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002851{
2852 int fd;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002853 off_t length;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002854 int res;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002855 PyObject *lenobj;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002856
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002857 if (!PyArg_ParseTuple(args, "iO:ftruncate", &fd, &lenobj))
Guido van Rossum94f6f721999-01-06 18:42:14 +00002858 return NULL;
2859
2860#if !defined(HAVE_LARGEFILE_SUPPORT)
2861 length = PyInt_AsLong(lenobj);
2862#else
2863 length = PyLong_Check(lenobj) ?
2864 PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj);
2865#endif
2866 if (PyErr_Occurred())
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002867 return NULL;
2868
Barry Warsaw53699e91996-12-10 23:23:01 +00002869 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002870 res = ftruncate(fd, length);
Barry Warsaw53699e91996-12-10 23:23:01 +00002871 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002872 if (res < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002873 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002874 return NULL;
2875 }
Barry Warsaw53699e91996-12-10 23:23:01 +00002876 Py_INCREF(Py_None);
2877 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002878}
2879#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002880
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002881#ifdef NeXT
2882#define HAVE_PUTENV
2883/* Steve Spicklemire got this putenv from NeXTAnswers */
2884static int
2885putenv(char *newval)
2886{
2887 extern char **environ;
2888
2889 static int firstTime = 1;
2890 char **ep;
2891 char *cp;
2892 int esiz;
2893 char *np;
2894
2895 if (!(np = strchr(newval, '=')))
2896 return 1;
2897 *np = '\0';
2898
2899 /* look it up */
2900 for (ep=environ ; *ep ; ep++)
2901 {
2902 /* this should always be true... */
2903 if (cp = strchr(*ep, '='))
2904 {
2905 *cp = '\0';
2906 if (!strcmp(*ep, newval))
2907 {
2908 /* got it! */
2909 *cp = '=';
2910 break;
2911 }
2912 *cp = '=';
2913 }
2914 else
2915 {
2916 *np = '=';
2917 return 1;
2918 }
2919 }
2920
2921 *np = '=';
2922 if (*ep)
2923 {
2924 /* the string was already there:
2925 just replace it with the new one */
2926 *ep = newval;
2927 return 0;
2928 }
2929
2930 /* expand environ by one */
2931 for (esiz=2, ep=environ ; *ep ; ep++)
2932 esiz++;
2933 if (firstTime)
2934 {
2935 char **epp;
2936 char **newenv;
2937 if (!(newenv = malloc(esiz * sizeof(char *))))
2938 return 1;
2939
2940 for (ep=environ, epp=newenv ; *ep ;)
2941 *epp++ = *ep++;
2942 *epp++ = newval;
2943 *epp = (char *) 0;
2944 environ = newenv;
2945 }
2946 else
2947 {
2948 if (!(environ = realloc(environ, esiz * sizeof(char *))))
2949 return 1;
2950 environ[esiz - 2] = newval;
2951 environ[esiz - 1] = (char *) 0;
2952 firstTime = 0;
2953 }
2954
2955 return 0;
2956}
Guido van Rossumc6ef2041997-08-21 02:30:45 +00002957#endif /* NeXT */
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002958
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002959
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002960#ifdef HAVE_PUTENV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002961static char posix_putenv__doc__[] =
2962"putenv(key, value) -> None\n\
2963Change or add an environment variable.";
2964
Guido van Rossumbcc20741998-08-04 22:53:56 +00002965#ifdef __BEOS__
2966/* We have putenv(), but not in the headers (as of PR2). - [cjh] */
2967int putenv( const char *str );
2968#endif
2969
Fred Drake762e2061999-08-26 17:23:54 +00002970/* Save putenv() parameters as values here, so we can collect them when they
2971 * get re-set with another call for the same key. */
2972static PyObject *posix_putenv_garbage;
2973
Barry Warsaw53699e91996-12-10 23:23:01 +00002974static PyObject *
Guido van Rossumb6a47161997-09-15 22:54:34 +00002975posix_putenv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002976 PyObject *self;
2977 PyObject *args;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002978{
2979 char *s1, *s2;
2980 char *new;
Fred Drake762e2061999-08-26 17:23:54 +00002981 PyObject *newstr;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002982
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002983 if (!PyArg_ParseTuple(args, "ss:putenv", &s1, &s2))
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002984 return NULL;
Guido van Rossumd48f2521997-12-05 22:19:34 +00002985
2986#if defined(PYOS_OS2)
2987 if (stricmp(s1, "BEGINLIBPATH") == 0) {
2988 APIRET rc;
2989
2990 if (strlen(s2) == 0) /* If New Value is an Empty String */
2991 s2 = NULL; /* Then OS/2 API Wants a NULL to Undefine It */
2992
2993 rc = DosSetExtLIBPATH(s2, BEGIN_LIBPATH);
2994 if (rc != NO_ERROR)
2995 return os2_error(rc);
2996
2997 } else if (stricmp(s1, "ENDLIBPATH") == 0) {
2998 APIRET rc;
2999
3000 if (strlen(s2) == 0) /* If New Value is an Empty String */
3001 s2 = NULL; /* Then OS/2 API Wants a NULL to Undefine It */
3002
3003 rc = DosSetExtLIBPATH(s2, END_LIBPATH);
3004 if (rc != NO_ERROR)
3005 return os2_error(rc);
3006 } else {
3007#endif
3008
Fred Drake762e2061999-08-26 17:23:54 +00003009 /* XXX This can leak memory -- not easy to fix :-( */
3010 newstr = PyString_FromStringAndSize(NULL, strlen(s1) + strlen(s2) + 2);
3011 if (newstr == NULL)
3012 return PyErr_NoMemory();
3013 new = PyString_AS_STRING(newstr);
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003014 (void) sprintf(new, "%s=%s", s1, s2);
3015 if (putenv(new)) {
3016 posix_error();
3017 return NULL;
3018 }
Fred Drake762e2061999-08-26 17:23:54 +00003019 /* Install the first arg and newstr in posix_putenv_garbage;
3020 * this will cause previous value to be collected. This has to
3021 * happen after the real putenv() call because the old value
3022 * was still accessible until then. */
3023 if (PyDict_SetItem(posix_putenv_garbage,
3024 PyTuple_GET_ITEM(args, 0), newstr)) {
3025 /* really not much we can do; just leak */
3026 PyErr_Clear();
3027 }
3028 else {
3029 Py_DECREF(newstr);
3030 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00003031
3032#if defined(PYOS_OS2)
3033 }
3034#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00003035 Py_INCREF(Py_None);
3036 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003037}
Guido van Rossumb6a47161997-09-15 22:54:34 +00003038#endif /* putenv */
3039
3040#ifdef HAVE_STRERROR
3041static char posix_strerror__doc__[] =
3042"strerror(code) -> string\n\
3043Translate an error code to a message string.";
3044
3045PyObject *
3046posix_strerror(self, args)
3047 PyObject *self;
3048 PyObject *args;
3049{
3050 int code;
3051 char *message;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003052 if (!PyArg_ParseTuple(args, "i:strerror", &code))
Guido van Rossumb6a47161997-09-15 22:54:34 +00003053 return NULL;
3054 message = strerror(code);
3055 if (message == NULL) {
3056 PyErr_SetString(PyExc_ValueError,
3057 "strerror code out of range");
3058 return NULL;
3059 }
3060 return PyString_FromString(message);
3061}
3062#endif /* strerror */
3063
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003064
Guido van Rossumc9641791998-08-04 15:26:23 +00003065#ifdef HAVE_SYS_WAIT_H
3066
3067#ifdef WIFSTOPPED
3068static char posix_WIFSTOPPED__doc__[] =
3069"WIFSTOPPED(status) -> Boolean\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003070Return true if the process returning 'status' was stopped.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003071
3072static PyObject *
3073posix_WIFSTOPPED(self, args)
3074 PyObject *self;
3075 PyObject *args;
3076{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003077#ifdef UNION_WAIT
3078 union wait status;
3079#define status_i (status.w_status)
3080#else
3081 int status;
3082#define status_i status
3083#endif
3084 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003085
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003086 if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003087 {
3088 return NULL;
3089 }
3090
3091 return Py_BuildValue("i", WIFSTOPPED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003092#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003093}
3094#endif /* WIFSTOPPED */
3095
3096#ifdef WIFSIGNALED
3097static char posix_WIFSIGNALED__doc__[] =
3098"WIFSIGNALED(status) -> Boolean\n\
Guido van Rossum3366d1c1999-02-23 18:34:43 +00003099Return true if the process returning 'status' was terminated by a signal.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003100
3101static PyObject *
3102posix_WIFSIGNALED(self, args)
3103 PyObject *self;
3104 PyObject *args;
3105{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003106#ifdef UNION_WAIT
3107 union wait status;
3108#define status_i (status.w_status)
3109#else
3110 int status;
3111#define status_i status
3112#endif
3113 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003114
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003115 if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003116 {
3117 return NULL;
3118 }
3119
3120 return Py_BuildValue("i", WIFSIGNALED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003121#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003122}
3123#endif /* WIFSIGNALED */
3124
3125#ifdef WIFEXITED
3126static char posix_WIFEXITED__doc__[] =
3127"WIFEXITED(status) -> Boolean\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003128Return true if the process returning 'status' exited using the exit()\n\
3129system call.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003130
3131static PyObject *
3132posix_WIFEXITED(self, args)
3133 PyObject *self;
3134 PyObject *args;
3135{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003136#ifdef UNION_WAIT
3137 union wait status;
3138#define status_i (status.w_status)
3139#else
3140 int status;
3141#define status_i status
3142#endif
3143 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003144
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003145 if (!PyArg_ParseTuple(args, "i:WIFEXITED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003146 {
3147 return NULL;
3148 }
3149
3150 return Py_BuildValue("i", WIFEXITED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003151#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003152}
3153#endif /* WIFEXITED */
3154
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003155#ifdef WEXITSTATUS
Guido van Rossumc9641791998-08-04 15:26:23 +00003156static char posix_WEXITSTATUS__doc__[] =
3157"WEXITSTATUS(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003158Return the process return code from 'status'.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003159
3160static PyObject *
3161posix_WEXITSTATUS(self, args)
3162 PyObject *self;
3163 PyObject *args;
3164{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003165#ifdef UNION_WAIT
3166 union wait status;
3167#define status_i (status.w_status)
3168#else
3169 int status;
3170#define status_i status
3171#endif
3172 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003173
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003174 if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003175 {
3176 return NULL;
3177 }
3178
3179 return Py_BuildValue("i", WEXITSTATUS(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003180#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003181}
3182#endif /* WEXITSTATUS */
3183
3184#ifdef WTERMSIG
3185static char posix_WTERMSIG__doc__[] =
3186"WTERMSIG(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003187Return the signal that terminated the process that provided the 'status'\n\
3188value.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003189
3190static PyObject *
3191posix_WTERMSIG(self, args)
3192 PyObject *self;
3193 PyObject *args;
3194{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003195#ifdef UNION_WAIT
3196 union wait status;
3197#define status_i (status.w_status)
3198#else
3199 int status;
3200#define status_i status
3201#endif
3202 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003203
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003204 if (!PyArg_ParseTuple(args, "i:WTERMSIG", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003205 {
3206 return NULL;
3207 }
3208
3209 return Py_BuildValue("i", WTERMSIG(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003210#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003211}
3212#endif /* WTERMSIG */
3213
3214#ifdef WSTOPSIG
3215static char posix_WSTOPSIG__doc__[] =
3216"WSTOPSIG(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003217Return the signal that stopped the process that provided the 'status' value.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003218
3219static PyObject *
3220posix_WSTOPSIG(self, args)
3221 PyObject *self;
3222 PyObject *args;
3223{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003224#ifdef UNION_WAIT
3225 union wait status;
3226#define status_i (status.w_status)
3227#else
3228 int status;
3229#define status_i status
3230#endif
3231 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003232
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003233 if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003234 {
3235 return NULL;
3236 }
3237
3238 return Py_BuildValue("i", WSTOPSIG(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003239#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003240}
3241#endif /* WSTOPSIG */
3242
3243#endif /* HAVE_SYS_WAIT_H */
3244
3245
Guido van Rossum94f6f721999-01-06 18:42:14 +00003246#if defined(HAVE_FSTATVFS)
Guido van Rossumd5753e11999-10-19 13:29:23 +00003247#ifdef _SCO_DS
3248/* SCO OpenServer 5.0 and later requires _SVID3 before it reveals the
3249 needed definitions in sys/statvfs.h */
3250#define _SVID3
3251#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00003252#include <sys/statvfs.h>
3253
3254static char posix_fstatvfs__doc__[] =
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003255"fstatvfs(fd) -> \n\
3256 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +00003257Perform an fstatvfs system call on the given fd.";
3258
3259static PyObject *
3260posix_fstatvfs(self, args)
3261 PyObject *self;
3262 PyObject *args;
3263{
3264 int fd, res;
3265 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003266 if (!PyArg_ParseTuple(args, "i:fstatvfs", &fd))
Guido van Rossum94f6f721999-01-06 18:42:14 +00003267 return NULL;
3268 Py_BEGIN_ALLOW_THREADS
3269 res = fstatvfs(fd, &st);
3270 Py_END_ALLOW_THREADS
3271 if (res != 0)
3272 return posix_error();
3273#if !defined(HAVE_LARGEFILE_SUPPORT)
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003274 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003275 (long) st.f_bsize,
3276 (long) st.f_frsize,
3277 (long) st.f_blocks,
3278 (long) st.f_bfree,
3279 (long) st.f_bavail,
3280 (long) st.f_files,
3281 (long) st.f_ffree,
3282 (long) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003283 (long) st.f_flag,
3284 (long) st.f_namemax);
3285#else
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003286 return Py_BuildValue("(llLLLLLLll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003287 (long) st.f_bsize,
3288 (long) st.f_frsize,
3289 (LONG_LONG) st.f_blocks,
3290 (LONG_LONG) st.f_bfree,
3291 (LONG_LONG) st.f_bavail,
3292 (LONG_LONG) st.f_files,
3293 (LONG_LONG) st.f_ffree,
3294 (LONG_LONG) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003295 (long) st.f_flag,
3296 (long) st.f_namemax);
3297#endif
3298}
3299#endif /* HAVE_FSTATVFS */
3300
3301
3302#if defined(HAVE_STATVFS)
3303#include <sys/statvfs.h>
3304
3305static char posix_statvfs__doc__[] =
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003306"statvfs(path) -> \n\
3307 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +00003308Perform a statvfs system call on the given path.";
3309
3310static PyObject *
3311posix_statvfs(self, args)
3312 PyObject *self;
3313 PyObject *args;
3314{
3315 char *path;
3316 int res;
3317 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003318 if (!PyArg_ParseTuple(args, "s:statvfs", &path))
Guido van Rossum94f6f721999-01-06 18:42:14 +00003319 return NULL;
3320 Py_BEGIN_ALLOW_THREADS
3321 res = statvfs(path, &st);
3322 Py_END_ALLOW_THREADS
3323 if (res != 0)
3324 return posix_error_with_filename(path);
3325#if !defined(HAVE_LARGEFILE_SUPPORT)
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003326 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003327 (long) st.f_bsize,
3328 (long) st.f_frsize,
3329 (long) st.f_blocks,
3330 (long) st.f_bfree,
3331 (long) st.f_bavail,
3332 (long) st.f_files,
3333 (long) st.f_ffree,
3334 (long) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003335 (long) st.f_flag,
3336 (long) st.f_namemax);
3337#else /* HAVE_LARGEFILE_SUPPORT */
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003338 return Py_BuildValue("(llLLLLLLll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003339 (long) st.f_bsize,
3340 (long) st.f_frsize,
3341 (LONG_LONG) st.f_blocks,
3342 (LONG_LONG) st.f_bfree,
3343 (LONG_LONG) st.f_bavail,
3344 (LONG_LONG) st.f_files,
3345 (LONG_LONG) st.f_ffree,
3346 (LONG_LONG) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003347 (long) st.f_flag,
3348 (long) st.f_namemax);
3349#endif
3350}
3351#endif /* HAVE_STATVFS */
3352
3353
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003354#ifdef HAVE_TEMPNAM
3355static char posix_tempnam__doc__[] = "\
3356tempnam([dir[, prefix]]) -> string\n\
3357Return a unique name for a temporary file.\n\
3358The directory and a short may be specified as strings; they may be omitted\n\
3359or None if not needed.";
3360
3361static PyObject *
3362posix_tempnam(self, args)
3363 PyObject *self;
3364 PyObject *args;
3365{
3366 PyObject *result = NULL;
3367 char *dir = NULL;
3368 char *pfx = NULL;
3369 char *name;
3370
3371 if (!PyArg_ParseTuple(args, "|zz:tempnam", &dir, &pfx))
3372 return NULL;
3373 name = tempnam(dir, pfx);
3374 if (name == NULL)
3375 return PyErr_NoMemory();
3376 result = PyString_FromString(name);
3377 free(name);
3378 return result;
3379}
Guido van Rossumd371ff11999-01-25 16:12:23 +00003380#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003381
3382
3383#ifdef HAVE_TMPFILE
3384static char posix_tmpfile__doc__[] = "\
3385tmpfile() -> file object\n\
3386Create a temporary file with no directory entries.";
3387
3388static PyObject *
3389posix_tmpfile(self, args)
3390 PyObject *self;
3391 PyObject *args;
3392{
3393 FILE *fp;
3394
3395 if (!PyArg_ParseTuple(args, ":tmpfile"))
3396 return NULL;
3397 fp = tmpfile();
3398 if (fp == NULL)
3399 return posix_error();
3400 return PyFile_FromFile(fp, "<tmpfile>", "w+", fclose);
3401}
3402#endif
3403
3404
3405#ifdef HAVE_TMPNAM
3406static char posix_tmpnam__doc__[] = "\
3407tmpnam() -> string\n\
3408Return a unique name for a temporary file.";
3409
3410static PyObject *
3411posix_tmpnam(self, args)
3412 PyObject *self;
3413 PyObject *args;
3414{
3415 char buffer[L_tmpnam];
3416 char *name;
3417
3418 if (!PyArg_ParseTuple(args, ":tmpnam"))
3419 return NULL;
Greg Wardb48bc172000-03-01 21:51:56 +00003420#ifdef USE_TMPNAM_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003421 name = tmpnam_r(buffer);
3422#else
3423 name = tmpnam(buffer);
3424#endif
3425 if (name == NULL) {
3426 PyErr_SetObject(PyExc_OSError,
3427 Py_BuildValue("is", 0,
Greg Wardb48bc172000-03-01 21:51:56 +00003428#ifdef USE_TMPNAM_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003429 "unexpected NULL from tmpnam_r"
3430#else
3431 "unexpected NULL from tmpnam"
3432#endif
3433 ));
3434 return NULL;
3435 }
3436 return PyString_FromString(buffer);
3437}
3438#endif
3439
3440
Fred Drakec9680921999-12-13 16:37:25 +00003441/* This is used for fpathconf(), pathconf(), confstr() and sysconf().
3442 * It maps strings representing configuration variable names to
3443 * integer values, allowing those functions to be called with the
3444 * magic names instead of poluting the module's namespace with tons of
Fred Drake12c6e2d1999-12-14 21:25:03 +00003445 * rarely-used constants. There are three separate tables that use
3446 * these definitions.
Fred Drakebec628d1999-12-15 18:31:10 +00003447 *
3448 * This code is always included, even if none of the interfaces that
3449 * need it are included. The #if hackery needed to avoid it would be
3450 * sufficiently pervasive that it's not worth the loss of readability.
Fred Drakec9680921999-12-13 16:37:25 +00003451 */
3452struct constdef {
3453 char *name;
3454 long value;
3455};
3456
Fred Drake12c6e2d1999-12-14 21:25:03 +00003457static int
3458conv_confname(arg, valuep, table, tablesize)
3459 PyObject *arg;
3460 int *valuep;
3461 struct constdef *table;
3462 size_t tablesize;
3463{
3464 if (PyInt_Check(arg)) {
3465 *valuep = PyInt_AS_LONG(arg);
3466 return 1;
3467 }
3468 if (PyString_Check(arg)) {
3469 /* look up the value in the table using a binary search */
3470 int lo = 0;
3471 int hi = tablesize;
3472 int cmp, mid;
3473 char *confname = PyString_AS_STRING(arg);
3474 while (lo < hi) {
3475 mid = (lo + hi) / 2;
3476 cmp = strcmp(confname, table[mid].name);
3477 if (cmp < 0)
3478 hi = mid;
3479 else if (cmp > 0)
3480 lo = mid + 1;
3481 else {
3482 *valuep = table[mid].value;
3483 return 1;
3484 }
3485 }
3486 PyErr_SetString(PyExc_ValueError, "unrecognized configuration name");
3487 }
3488 else
3489 PyErr_SetString(PyExc_TypeError,
3490 "configuration names must be strings or integers");
3491 return 0;
3492}
3493
3494
3495#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
3496static struct constdef posix_constants_pathconf[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003497#ifdef _PC_ABI_AIO_XFER_MAX
3498 {"PC_ABI_AIO_XFER_MAX", _PC_ABI_AIO_XFER_MAX},
3499#endif
3500#ifdef _PC_ABI_ASYNC_IO
3501 {"PC_ABI_ASYNC_IO", _PC_ABI_ASYNC_IO},
3502#endif
Fred Drakec9680921999-12-13 16:37:25 +00003503#ifdef _PC_ASYNC_IO
3504 {"PC_ASYNC_IO", _PC_ASYNC_IO},
3505#endif
3506#ifdef _PC_CHOWN_RESTRICTED
3507 {"PC_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED},
3508#endif
3509#ifdef _PC_FILESIZEBITS
3510 {"PC_FILESIZEBITS", _PC_FILESIZEBITS},
3511#endif
3512#ifdef _PC_LAST
3513 {"PC_LAST", _PC_LAST},
3514#endif
3515#ifdef _PC_LINK_MAX
3516 {"PC_LINK_MAX", _PC_LINK_MAX},
3517#endif
3518#ifdef _PC_MAX_CANON
3519 {"PC_MAX_CANON", _PC_MAX_CANON},
3520#endif
3521#ifdef _PC_MAX_INPUT
3522 {"PC_MAX_INPUT", _PC_MAX_INPUT},
3523#endif
3524#ifdef _PC_NAME_MAX
3525 {"PC_NAME_MAX", _PC_NAME_MAX},
3526#endif
3527#ifdef _PC_NO_TRUNC
3528 {"PC_NO_TRUNC", _PC_NO_TRUNC},
3529#endif
3530#ifdef _PC_PATH_MAX
3531 {"PC_PATH_MAX", _PC_PATH_MAX},
3532#endif
3533#ifdef _PC_PIPE_BUF
3534 {"PC_PIPE_BUF", _PC_PIPE_BUF},
3535#endif
3536#ifdef _PC_PRIO_IO
3537 {"PC_PRIO_IO", _PC_PRIO_IO},
3538#endif
3539#ifdef _PC_SOCK_MAXBUF
3540 {"PC_SOCK_MAXBUF", _PC_SOCK_MAXBUF},
3541#endif
3542#ifdef _PC_SYNC_IO
3543 {"PC_SYNC_IO", _PC_SYNC_IO},
3544#endif
3545#ifdef _PC_VDISABLE
3546 {"PC_VDISABLE", _PC_VDISABLE},
3547#endif
3548};
3549
Fred Drakec9680921999-12-13 16:37:25 +00003550static int
3551conv_path_confname(arg, valuep)
3552 PyObject *arg;
3553 int *valuep;
3554{
3555 return conv_confname(arg, valuep, posix_constants_pathconf,
3556 sizeof(posix_constants_pathconf)
3557 / sizeof(struct constdef));
3558}
3559#endif
3560
3561#ifdef HAVE_FPATHCONF
3562static char posix_fpathconf__doc__[] = "\
3563fpathconf(fd, name) -> integer\n\
3564Return the configuration limit name for the file descriptor fd.\n\
3565If there is no limit, return -1.";
3566
3567static PyObject *
3568posix_fpathconf(self, args)
3569 PyObject *self;
3570 PyObject *args;
3571{
3572 PyObject *result = NULL;
3573 int name, fd;
3574
Fred Drake12c6e2d1999-12-14 21:25:03 +00003575 if (PyArg_ParseTuple(args, "iO&:fpathconf", &fd,
3576 conv_path_confname, &name)) {
Fred Drakec9680921999-12-13 16:37:25 +00003577 long limit;
3578
3579 errno = 0;
3580 limit = fpathconf(fd, name);
3581 if (limit == -1 && errno != 0)
3582 posix_error();
3583 else
3584 result = PyInt_FromLong(limit);
3585 }
3586 return result;
3587}
3588#endif
3589
3590
3591#ifdef HAVE_PATHCONF
3592static char posix_pathconf__doc__[] = "\
3593pathconf(path, name) -> integer\n\
3594Return the configuration limit name for the file or directory path.\n\
3595If there is no limit, return -1.";
3596
3597static PyObject *
3598posix_pathconf(self, args)
3599 PyObject *self;
3600 PyObject *args;
3601{
3602 PyObject *result = NULL;
3603 int name;
3604 char *path;
3605
3606 if (PyArg_ParseTuple(args, "sO&:pathconf", &path,
3607 conv_path_confname, &name)) {
3608 long limit;
3609
3610 errno = 0;
3611 limit = pathconf(path, name);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003612 if (limit == -1 && errno != 0) {
Fred Drakec9680921999-12-13 16:37:25 +00003613 if (errno == EINVAL)
3614 /* could be a path or name problem */
3615 posix_error();
3616 else
3617 posix_error_with_filename(path);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003618 }
Fred Drakec9680921999-12-13 16:37:25 +00003619 else
3620 result = PyInt_FromLong(limit);
3621 }
3622 return result;
3623}
3624#endif
3625
3626#ifdef HAVE_CONFSTR
3627static struct constdef posix_constants_confstr[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003628#ifdef _CS_ARCHITECTURE
3629 {"CS_ARCHITECTURE", _CS_ARCHITECTURE},
3630#endif
3631#ifdef _CS_HOSTNAME
3632 {"CS_HOSTNAME", _CS_HOSTNAME},
3633#endif
3634#ifdef _CS_HW_PROVIDER
3635 {"CS_HW_PROVIDER", _CS_HW_PROVIDER},
3636#endif
3637#ifdef _CS_HW_SERIAL
3638 {"CS_HW_SERIAL", _CS_HW_SERIAL},
3639#endif
3640#ifdef _CS_INITTAB_NAME
3641 {"CS_INITTAB_NAME", _CS_INITTAB_NAME},
3642#endif
Fred Drakec9680921999-12-13 16:37:25 +00003643#ifdef _CS_LFS64_CFLAGS
3644 {"CS_LFS64_CFLAGS", _CS_LFS64_CFLAGS},
3645#endif
3646#ifdef _CS_LFS64_LDFLAGS
3647 {"CS_LFS64_LDFLAGS", _CS_LFS64_LDFLAGS},
3648#endif
3649#ifdef _CS_LFS64_LIBS
3650 {"CS_LFS64_LIBS", _CS_LFS64_LIBS},
3651#endif
3652#ifdef _CS_LFS64_LINTFLAGS
3653 {"CS_LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS},
3654#endif
3655#ifdef _CS_LFS_CFLAGS
3656 {"CS_LFS_CFLAGS", _CS_LFS_CFLAGS},
3657#endif
3658#ifdef _CS_LFS_LDFLAGS
3659 {"CS_LFS_LDFLAGS", _CS_LFS_LDFLAGS},
3660#endif
3661#ifdef _CS_LFS_LIBS
3662 {"CS_LFS_LIBS", _CS_LFS_LIBS},
3663#endif
3664#ifdef _CS_LFS_LINTFLAGS
3665 {"CS_LFS_LINTFLAGS", _CS_LFS_LINTFLAGS},
3666#endif
Fred Draked86ed291999-12-15 15:34:33 +00003667#ifdef _CS_MACHINE
3668 {"CS_MACHINE", _CS_MACHINE},
3669#endif
Fred Drakec9680921999-12-13 16:37:25 +00003670#ifdef _CS_PATH
3671 {"CS_PATH", _CS_PATH},
3672#endif
Fred Draked86ed291999-12-15 15:34:33 +00003673#ifdef _CS_RELEASE
3674 {"CS_RELEASE", _CS_RELEASE},
3675#endif
3676#ifdef _CS_SRPC_DOMAIN
3677 {"CS_SRPC_DOMAIN", _CS_SRPC_DOMAIN},
3678#endif
3679#ifdef _CS_SYSNAME
3680 {"CS_SYSNAME", _CS_SYSNAME},
3681#endif
3682#ifdef _CS_VERSION
3683 {"CS_VERSION", _CS_VERSION},
3684#endif
Fred Drakec9680921999-12-13 16:37:25 +00003685#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS
3686 {"CS_XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS},
3687#endif
3688#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS
3689 {"CS_XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS},
3690#endif
3691#ifdef _CS_XBS5_ILP32_OFF32_LIBS
3692 {"CS_XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS},
3693#endif
3694#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS
3695 {"CS_XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS},
3696#endif
3697#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS
3698 {"CS_XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS},
3699#endif
3700#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS
3701 {"CS_XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS},
3702#endif
3703#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS
3704 {"CS_XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS},
3705#endif
3706#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
3707 {"CS_XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS},
3708#endif
3709#ifdef _CS_XBS5_LP64_OFF64_CFLAGS
3710 {"CS_XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS},
3711#endif
3712#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS
3713 {"CS_XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS},
3714#endif
3715#ifdef _CS_XBS5_LP64_OFF64_LIBS
3716 {"CS_XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS},
3717#endif
3718#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS
3719 {"CS_XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS},
3720#endif
3721#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS
3722 {"CS_XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS},
3723#endif
3724#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
3725 {"CS_XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS},
3726#endif
3727#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS
3728 {"CS_XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS},
3729#endif
3730#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
3731 {"CS_XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS},
3732#endif
Fred Draked86ed291999-12-15 15:34:33 +00003733#ifdef _MIPS_CS_AVAIL_PROCESSORS
3734 {"MIPS_CS_AVAIL_PROCESSORS", _MIPS_CS_AVAIL_PROCESSORS},
3735#endif
3736#ifdef _MIPS_CS_BASE
3737 {"MIPS_CS_BASE", _MIPS_CS_BASE},
3738#endif
3739#ifdef _MIPS_CS_HOSTID
3740 {"MIPS_CS_HOSTID", _MIPS_CS_HOSTID},
3741#endif
3742#ifdef _MIPS_CS_HW_NAME
3743 {"MIPS_CS_HW_NAME", _MIPS_CS_HW_NAME},
3744#endif
3745#ifdef _MIPS_CS_NUM_PROCESSORS
3746 {"MIPS_CS_NUM_PROCESSORS", _MIPS_CS_NUM_PROCESSORS},
3747#endif
3748#ifdef _MIPS_CS_OSREL_MAJ
3749 {"MIPS_CS_OSREL_MAJ", _MIPS_CS_OSREL_MAJ},
3750#endif
3751#ifdef _MIPS_CS_OSREL_MIN
3752 {"MIPS_CS_OSREL_MIN", _MIPS_CS_OSREL_MIN},
3753#endif
3754#ifdef _MIPS_CS_OSREL_PATCH
3755 {"MIPS_CS_OSREL_PATCH", _MIPS_CS_OSREL_PATCH},
3756#endif
3757#ifdef _MIPS_CS_OS_NAME
3758 {"MIPS_CS_OS_NAME", _MIPS_CS_OS_NAME},
3759#endif
3760#ifdef _MIPS_CS_OS_PROVIDER
3761 {"MIPS_CS_OS_PROVIDER", _MIPS_CS_OS_PROVIDER},
3762#endif
3763#ifdef _MIPS_CS_PROCESSORS
3764 {"MIPS_CS_PROCESSORS", _MIPS_CS_PROCESSORS},
3765#endif
3766#ifdef _MIPS_CS_SERIAL
3767 {"MIPS_CS_SERIAL", _MIPS_CS_SERIAL},
3768#endif
3769#ifdef _MIPS_CS_VENDOR
3770 {"MIPS_CS_VENDOR", _MIPS_CS_VENDOR},
3771#endif
Fred Drakec9680921999-12-13 16:37:25 +00003772};
3773
3774static int
3775conv_confstr_confname(arg, valuep)
3776 PyObject *arg;
3777 int *valuep;
3778{
3779 return conv_confname(arg, valuep, posix_constants_confstr,
3780 sizeof(posix_constants_confstr)
3781 / sizeof(struct constdef));
3782}
3783
3784static char posix_confstr__doc__[] = "\
3785confstr(name) -> string\n\
3786Return a string-valued system configuration variable.";
3787
3788static PyObject *
3789posix_confstr(self, args)
3790 PyObject *self;
3791 PyObject *args;
3792{
3793 PyObject *result = NULL;
3794 int name;
3795 char buffer[64];
3796
3797 if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) {
3798 int len = confstr(name, buffer, sizeof(buffer));
3799
Fred Drakec9680921999-12-13 16:37:25 +00003800 errno = 0;
3801 if (len == 0) {
3802 if (errno != 0)
3803 posix_error();
3804 else
3805 result = PyString_FromString("");
3806 }
3807 else {
3808 if (len >= sizeof(buffer)) {
3809 result = PyString_FromStringAndSize(NULL, len);
3810 if (result != NULL)
3811 confstr(name, PyString_AS_STRING(result), len+1);
3812 }
3813 else
3814 result = PyString_FromString(buffer);
3815 }
3816 }
3817 return result;
3818}
3819#endif
3820
3821
3822#ifdef HAVE_SYSCONF
3823static struct constdef posix_constants_sysconf[] = {
3824#ifdef _SC_2_CHAR_TERM
3825 {"SC_2_CHAR_TERM", _SC_2_CHAR_TERM},
3826#endif
3827#ifdef _SC_2_C_BIND
3828 {"SC_2_C_BIND", _SC_2_C_BIND},
3829#endif
3830#ifdef _SC_2_C_DEV
3831 {"SC_2_C_DEV", _SC_2_C_DEV},
3832#endif
3833#ifdef _SC_2_C_VERSION
3834 {"SC_2_C_VERSION", _SC_2_C_VERSION},
3835#endif
3836#ifdef _SC_2_FORT_DEV
3837 {"SC_2_FORT_DEV", _SC_2_FORT_DEV},
3838#endif
3839#ifdef _SC_2_FORT_RUN
3840 {"SC_2_FORT_RUN", _SC_2_FORT_RUN},
3841#endif
3842#ifdef _SC_2_LOCALEDEF
3843 {"SC_2_LOCALEDEF", _SC_2_LOCALEDEF},
3844#endif
3845#ifdef _SC_2_SW_DEV
3846 {"SC_2_SW_DEV", _SC_2_SW_DEV},
3847#endif
3848#ifdef _SC_2_UPE
3849 {"SC_2_UPE", _SC_2_UPE},
3850#endif
3851#ifdef _SC_2_VERSION
3852 {"SC_2_VERSION", _SC_2_VERSION},
3853#endif
Fred Draked86ed291999-12-15 15:34:33 +00003854#ifdef _SC_ABI_ASYNCHRONOUS_IO
3855 {"SC_ABI_ASYNCHRONOUS_IO", _SC_ABI_ASYNCHRONOUS_IO},
3856#endif
3857#ifdef _SC_ACL
3858 {"SC_ACL", _SC_ACL},
3859#endif
Fred Drakec9680921999-12-13 16:37:25 +00003860#ifdef _SC_AIO_LISTIO_MAX
3861 {"SC_AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX},
3862#endif
Fred Drakec9680921999-12-13 16:37:25 +00003863#ifdef _SC_AIO_MAX
3864 {"SC_AIO_MAX", _SC_AIO_MAX},
3865#endif
3866#ifdef _SC_AIO_PRIO_DELTA_MAX
3867 {"SC_AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX},
3868#endif
3869#ifdef _SC_ARG_MAX
3870 {"SC_ARG_MAX", _SC_ARG_MAX},
3871#endif
3872#ifdef _SC_ASYNCHRONOUS_IO
3873 {"SC_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO},
3874#endif
3875#ifdef _SC_ATEXIT_MAX
3876 {"SC_ATEXIT_MAX", _SC_ATEXIT_MAX},
3877#endif
Fred Draked86ed291999-12-15 15:34:33 +00003878#ifdef _SC_AUDIT
3879 {"SC_AUDIT", _SC_AUDIT},
3880#endif
Fred Drakec9680921999-12-13 16:37:25 +00003881#ifdef _SC_AVPHYS_PAGES
3882 {"SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES},
3883#endif
3884#ifdef _SC_BC_BASE_MAX
3885 {"SC_BC_BASE_MAX", _SC_BC_BASE_MAX},
3886#endif
3887#ifdef _SC_BC_DIM_MAX
3888 {"SC_BC_DIM_MAX", _SC_BC_DIM_MAX},
3889#endif
3890#ifdef _SC_BC_SCALE_MAX
3891 {"SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX},
3892#endif
3893#ifdef _SC_BC_STRING_MAX
3894 {"SC_BC_STRING_MAX", _SC_BC_STRING_MAX},
3895#endif
Fred Draked86ed291999-12-15 15:34:33 +00003896#ifdef _SC_CAP
3897 {"SC_CAP", _SC_CAP},
3898#endif
Fred Drakec9680921999-12-13 16:37:25 +00003899#ifdef _SC_CHARCLASS_NAME_MAX
3900 {"SC_CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX},
3901#endif
3902#ifdef _SC_CHAR_BIT
3903 {"SC_CHAR_BIT", _SC_CHAR_BIT},
3904#endif
3905#ifdef _SC_CHAR_MAX
3906 {"SC_CHAR_MAX", _SC_CHAR_MAX},
3907#endif
3908#ifdef _SC_CHAR_MIN
3909 {"SC_CHAR_MIN", _SC_CHAR_MIN},
3910#endif
3911#ifdef _SC_CHILD_MAX
3912 {"SC_CHILD_MAX", _SC_CHILD_MAX},
3913#endif
3914#ifdef _SC_CLK_TCK
3915 {"SC_CLK_TCK", _SC_CLK_TCK},
3916#endif
3917#ifdef _SC_COHER_BLKSZ
3918 {"SC_COHER_BLKSZ", _SC_COHER_BLKSZ},
3919#endif
3920#ifdef _SC_COLL_WEIGHTS_MAX
3921 {"SC_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX},
3922#endif
3923#ifdef _SC_DCACHE_ASSOC
3924 {"SC_DCACHE_ASSOC", _SC_DCACHE_ASSOC},
3925#endif
3926#ifdef _SC_DCACHE_BLKSZ
3927 {"SC_DCACHE_BLKSZ", _SC_DCACHE_BLKSZ},
3928#endif
3929#ifdef _SC_DCACHE_LINESZ
3930 {"SC_DCACHE_LINESZ", _SC_DCACHE_LINESZ},
3931#endif
3932#ifdef _SC_DCACHE_SZ
3933 {"SC_DCACHE_SZ", _SC_DCACHE_SZ},
3934#endif
3935#ifdef _SC_DCACHE_TBLKSZ
3936 {"SC_DCACHE_TBLKSZ", _SC_DCACHE_TBLKSZ},
3937#endif
3938#ifdef _SC_DELAYTIMER_MAX
3939 {"SC_DELAYTIMER_MAX", _SC_DELAYTIMER_MAX},
3940#endif
3941#ifdef _SC_EQUIV_CLASS_MAX
3942 {"SC_EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX},
3943#endif
3944#ifdef _SC_EXPR_NEST_MAX
3945 {"SC_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX},
3946#endif
3947#ifdef _SC_FSYNC
3948 {"SC_FSYNC", _SC_FSYNC},
3949#endif
3950#ifdef _SC_GETGR_R_SIZE_MAX
3951 {"SC_GETGR_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX},
3952#endif
3953#ifdef _SC_GETPW_R_SIZE_MAX
3954 {"SC_GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX},
3955#endif
3956#ifdef _SC_ICACHE_ASSOC
3957 {"SC_ICACHE_ASSOC", _SC_ICACHE_ASSOC},
3958#endif
3959#ifdef _SC_ICACHE_BLKSZ
3960 {"SC_ICACHE_BLKSZ", _SC_ICACHE_BLKSZ},
3961#endif
3962#ifdef _SC_ICACHE_LINESZ
3963 {"SC_ICACHE_LINESZ", _SC_ICACHE_LINESZ},
3964#endif
3965#ifdef _SC_ICACHE_SZ
3966 {"SC_ICACHE_SZ", _SC_ICACHE_SZ},
3967#endif
Fred Draked86ed291999-12-15 15:34:33 +00003968#ifdef _SC_INF
3969 {"SC_INF", _SC_INF},
3970#endif
Fred Drakec9680921999-12-13 16:37:25 +00003971#ifdef _SC_INT_MAX
3972 {"SC_INT_MAX", _SC_INT_MAX},
3973#endif
3974#ifdef _SC_INT_MIN
3975 {"SC_INT_MIN", _SC_INT_MIN},
3976#endif
3977#ifdef _SC_IOV_MAX
3978 {"SC_IOV_MAX", _SC_IOV_MAX},
3979#endif
Fred Draked86ed291999-12-15 15:34:33 +00003980#ifdef _SC_IP_SECOPTS
3981 {"SC_IP_SECOPTS", _SC_IP_SECOPTS},
3982#endif
Fred Drakec9680921999-12-13 16:37:25 +00003983#ifdef _SC_JOB_CONTROL
3984 {"SC_JOB_CONTROL", _SC_JOB_CONTROL},
3985#endif
Fred Draked86ed291999-12-15 15:34:33 +00003986#ifdef _SC_KERN_POINTERS
3987 {"SC_KERN_POINTERS", _SC_KERN_POINTERS},
3988#endif
3989#ifdef _SC_KERN_SIM
3990 {"SC_KERN_SIM", _SC_KERN_SIM},
3991#endif
Fred Drakec9680921999-12-13 16:37:25 +00003992#ifdef _SC_LINE_MAX
3993 {"SC_LINE_MAX", _SC_LINE_MAX},
3994#endif
3995#ifdef _SC_LOGIN_NAME_MAX
3996 {"SC_LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX},
3997#endif
3998#ifdef _SC_LOGNAME_MAX
3999 {"SC_LOGNAME_MAX", _SC_LOGNAME_MAX},
4000#endif
4001#ifdef _SC_LONG_BIT
4002 {"SC_LONG_BIT", _SC_LONG_BIT},
4003#endif
Fred Draked86ed291999-12-15 15:34:33 +00004004#ifdef _SC_MAC
4005 {"SC_MAC", _SC_MAC},
4006#endif
Fred Drakec9680921999-12-13 16:37:25 +00004007#ifdef _SC_MAPPED_FILES
4008 {"SC_MAPPED_FILES", _SC_MAPPED_FILES},
4009#endif
4010#ifdef _SC_MAXPID
4011 {"SC_MAXPID", _SC_MAXPID},
4012#endif
4013#ifdef _SC_MB_LEN_MAX
4014 {"SC_MB_LEN_MAX", _SC_MB_LEN_MAX},
4015#endif
4016#ifdef _SC_MEMLOCK
4017 {"SC_MEMLOCK", _SC_MEMLOCK},
4018#endif
4019#ifdef _SC_MEMLOCK_RANGE
4020 {"SC_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE},
4021#endif
4022#ifdef _SC_MEMORY_PROTECTION
4023 {"SC_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION},
4024#endif
4025#ifdef _SC_MESSAGE_PASSING
4026 {"SC_MESSAGE_PASSING", _SC_MESSAGE_PASSING},
4027#endif
Fred Draked86ed291999-12-15 15:34:33 +00004028#ifdef _SC_MMAP_FIXED_ALIGNMENT
4029 {"SC_MMAP_FIXED_ALIGNMENT", _SC_MMAP_FIXED_ALIGNMENT},
4030#endif
Fred Drakec9680921999-12-13 16:37:25 +00004031#ifdef _SC_MQ_OPEN_MAX
4032 {"SC_MQ_OPEN_MAX", _SC_MQ_OPEN_MAX},
4033#endif
4034#ifdef _SC_MQ_PRIO_MAX
4035 {"SC_MQ_PRIO_MAX", _SC_MQ_PRIO_MAX},
4036#endif
Fred Draked86ed291999-12-15 15:34:33 +00004037#ifdef _SC_NACLS_MAX
4038 {"SC_NACLS_MAX", _SC_NACLS_MAX},
4039#endif
Fred Drakec9680921999-12-13 16:37:25 +00004040#ifdef _SC_NGROUPS_MAX
4041 {"SC_NGROUPS_MAX", _SC_NGROUPS_MAX},
4042#endif
4043#ifdef _SC_NL_ARGMAX
4044 {"SC_NL_ARGMAX", _SC_NL_ARGMAX},
4045#endif
4046#ifdef _SC_NL_LANGMAX
4047 {"SC_NL_LANGMAX", _SC_NL_LANGMAX},
4048#endif
4049#ifdef _SC_NL_MSGMAX
4050 {"SC_NL_MSGMAX", _SC_NL_MSGMAX},
4051#endif
4052#ifdef _SC_NL_NMAX
4053 {"SC_NL_NMAX", _SC_NL_NMAX},
4054#endif
4055#ifdef _SC_NL_SETMAX
4056 {"SC_NL_SETMAX", _SC_NL_SETMAX},
4057#endif
4058#ifdef _SC_NL_TEXTMAX
4059 {"SC_NL_TEXTMAX", _SC_NL_TEXTMAX},
4060#endif
4061#ifdef _SC_NPROCESSORS_CONF
4062 {"SC_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF},
4063#endif
4064#ifdef _SC_NPROCESSORS_ONLN
4065 {"SC_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN},
4066#endif
Fred Draked86ed291999-12-15 15:34:33 +00004067#ifdef _SC_NPROC_CONF
4068 {"SC_NPROC_CONF", _SC_NPROC_CONF},
4069#endif
4070#ifdef _SC_NPROC_ONLN
4071 {"SC_NPROC_ONLN", _SC_NPROC_ONLN},
4072#endif
Fred Drakec9680921999-12-13 16:37:25 +00004073#ifdef _SC_NZERO
4074 {"SC_NZERO", _SC_NZERO},
4075#endif
4076#ifdef _SC_OPEN_MAX
4077 {"SC_OPEN_MAX", _SC_OPEN_MAX},
4078#endif
4079#ifdef _SC_PAGESIZE
4080 {"SC_PAGESIZE", _SC_PAGESIZE},
4081#endif
4082#ifdef _SC_PAGE_SIZE
4083 {"SC_PAGE_SIZE", _SC_PAGE_SIZE},
4084#endif
4085#ifdef _SC_PASS_MAX
4086 {"SC_PASS_MAX", _SC_PASS_MAX},
4087#endif
4088#ifdef _SC_PHYS_PAGES
4089 {"SC_PHYS_PAGES", _SC_PHYS_PAGES},
4090#endif
4091#ifdef _SC_PII
4092 {"SC_PII", _SC_PII},
4093#endif
4094#ifdef _SC_PII_INTERNET
4095 {"SC_PII_INTERNET", _SC_PII_INTERNET},
4096#endif
4097#ifdef _SC_PII_INTERNET_DGRAM
4098 {"SC_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM},
4099#endif
4100#ifdef _SC_PII_INTERNET_STREAM
4101 {"SC_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM},
4102#endif
4103#ifdef _SC_PII_OSI
4104 {"SC_PII_OSI", _SC_PII_OSI},
4105#endif
4106#ifdef _SC_PII_OSI_CLTS
4107 {"SC_PII_OSI_CLTS", _SC_PII_OSI_CLTS},
4108#endif
4109#ifdef _SC_PII_OSI_COTS
4110 {"SC_PII_OSI_COTS", _SC_PII_OSI_COTS},
4111#endif
4112#ifdef _SC_PII_OSI_M
4113 {"SC_PII_OSI_M", _SC_PII_OSI_M},
4114#endif
4115#ifdef _SC_PII_SOCKET
4116 {"SC_PII_SOCKET", _SC_PII_SOCKET},
4117#endif
4118#ifdef _SC_PII_XTI
4119 {"SC_PII_XTI", _SC_PII_XTI},
4120#endif
4121#ifdef _SC_POLL
4122 {"SC_POLL", _SC_POLL},
4123#endif
4124#ifdef _SC_PRIORITIZED_IO
4125 {"SC_PRIORITIZED_IO", _SC_PRIORITIZED_IO},
4126#endif
4127#ifdef _SC_PRIORITY_SCHEDULING
4128 {"SC_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING},
4129#endif
4130#ifdef _SC_REALTIME_SIGNALS
4131 {"SC_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS},
4132#endif
4133#ifdef _SC_RE_DUP_MAX
4134 {"SC_RE_DUP_MAX", _SC_RE_DUP_MAX},
4135#endif
4136#ifdef _SC_RTSIG_MAX
4137 {"SC_RTSIG_MAX", _SC_RTSIG_MAX},
4138#endif
4139#ifdef _SC_SAVED_IDS
4140 {"SC_SAVED_IDS", _SC_SAVED_IDS},
4141#endif
4142#ifdef _SC_SCHAR_MAX
4143 {"SC_SCHAR_MAX", _SC_SCHAR_MAX},
4144#endif
4145#ifdef _SC_SCHAR_MIN
4146 {"SC_SCHAR_MIN", _SC_SCHAR_MIN},
4147#endif
4148#ifdef _SC_SELECT
4149 {"SC_SELECT", _SC_SELECT},
4150#endif
4151#ifdef _SC_SEMAPHORES
4152 {"SC_SEMAPHORES", _SC_SEMAPHORES},
4153#endif
4154#ifdef _SC_SEM_NSEMS_MAX
4155 {"SC_SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX},
4156#endif
4157#ifdef _SC_SEM_VALUE_MAX
4158 {"SC_SEM_VALUE_MAX", _SC_SEM_VALUE_MAX},
4159#endif
4160#ifdef _SC_SHARED_MEMORY_OBJECTS
4161 {"SC_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS},
4162#endif
4163#ifdef _SC_SHRT_MAX
4164 {"SC_SHRT_MAX", _SC_SHRT_MAX},
4165#endif
4166#ifdef _SC_SHRT_MIN
4167 {"SC_SHRT_MIN", _SC_SHRT_MIN},
4168#endif
4169#ifdef _SC_SIGQUEUE_MAX
4170 {"SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX},
4171#endif
4172#ifdef _SC_SIGRT_MAX
4173 {"SC_SIGRT_MAX", _SC_SIGRT_MAX},
4174#endif
4175#ifdef _SC_SIGRT_MIN
4176 {"SC_SIGRT_MIN", _SC_SIGRT_MIN},
4177#endif
Fred Draked86ed291999-12-15 15:34:33 +00004178#ifdef _SC_SOFTPOWER
4179 {"SC_SOFTPOWER", _SC_SOFTPOWER},
4180#endif
Fred Drakec9680921999-12-13 16:37:25 +00004181#ifdef _SC_SPLIT_CACHE
4182 {"SC_SPLIT_CACHE", _SC_SPLIT_CACHE},
4183#endif
4184#ifdef _SC_SSIZE_MAX
4185 {"SC_SSIZE_MAX", _SC_SSIZE_MAX},
4186#endif
4187#ifdef _SC_STACK_PROT
4188 {"SC_STACK_PROT", _SC_STACK_PROT},
4189#endif
4190#ifdef _SC_STREAM_MAX
4191 {"SC_STREAM_MAX", _SC_STREAM_MAX},
4192#endif
4193#ifdef _SC_SYNCHRONIZED_IO
4194 {"SC_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO},
4195#endif
4196#ifdef _SC_THREADS
4197 {"SC_THREADS", _SC_THREADS},
4198#endif
4199#ifdef _SC_THREAD_ATTR_STACKADDR
4200 {"SC_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR},
4201#endif
4202#ifdef _SC_THREAD_ATTR_STACKSIZE
4203 {"SC_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE},
4204#endif
4205#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS
4206 {"SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS},
4207#endif
4208#ifdef _SC_THREAD_KEYS_MAX
4209 {"SC_THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX},
4210#endif
4211#ifdef _SC_THREAD_PRIORITY_SCHEDULING
4212 {"SC_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING},
4213#endif
4214#ifdef _SC_THREAD_PRIO_INHERIT
4215 {"SC_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT},
4216#endif
4217#ifdef _SC_THREAD_PRIO_PROTECT
4218 {"SC_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT},
4219#endif
4220#ifdef _SC_THREAD_PROCESS_SHARED
4221 {"SC_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED},
4222#endif
4223#ifdef _SC_THREAD_SAFE_FUNCTIONS
4224 {"SC_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS},
4225#endif
4226#ifdef _SC_THREAD_STACK_MIN
4227 {"SC_THREAD_STACK_MIN", _SC_THREAD_STACK_MIN},
4228#endif
4229#ifdef _SC_THREAD_THREADS_MAX
4230 {"SC_THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX},
4231#endif
4232#ifdef _SC_TIMERS
4233 {"SC_TIMERS", _SC_TIMERS},
4234#endif
4235#ifdef _SC_TIMER_MAX
4236 {"SC_TIMER_MAX", _SC_TIMER_MAX},
4237#endif
4238#ifdef _SC_TTY_NAME_MAX
4239 {"SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX},
4240#endif
4241#ifdef _SC_TZNAME_MAX
4242 {"SC_TZNAME_MAX", _SC_TZNAME_MAX},
4243#endif
4244#ifdef _SC_T_IOV_MAX
4245 {"SC_T_IOV_MAX", _SC_T_IOV_MAX},
4246#endif
4247#ifdef _SC_UCHAR_MAX
4248 {"SC_UCHAR_MAX", _SC_UCHAR_MAX},
4249#endif
4250#ifdef _SC_UINT_MAX
4251 {"SC_UINT_MAX", _SC_UINT_MAX},
4252#endif
4253#ifdef _SC_UIO_MAXIOV
4254 {"SC_UIO_MAXIOV", _SC_UIO_MAXIOV},
4255#endif
4256#ifdef _SC_ULONG_MAX
4257 {"SC_ULONG_MAX", _SC_ULONG_MAX},
4258#endif
4259#ifdef _SC_USHRT_MAX
4260 {"SC_USHRT_MAX", _SC_USHRT_MAX},
4261#endif
4262#ifdef _SC_VERSION
4263 {"SC_VERSION", _SC_VERSION},
4264#endif
4265#ifdef _SC_WORD_BIT
4266 {"SC_WORD_BIT", _SC_WORD_BIT},
4267#endif
4268#ifdef _SC_XBS5_ILP32_OFF32
4269 {"SC_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32},
4270#endif
4271#ifdef _SC_XBS5_ILP32_OFFBIG
4272 {"SC_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG},
4273#endif
4274#ifdef _SC_XBS5_LP64_OFF64
4275 {"SC_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64},
4276#endif
4277#ifdef _SC_XBS5_LPBIG_OFFBIG
4278 {"SC_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG},
4279#endif
4280#ifdef _SC_XOPEN_CRYPT
4281 {"SC_XOPEN_CRYPT", _SC_XOPEN_CRYPT},
4282#endif
4283#ifdef _SC_XOPEN_ENH_I18N
4284 {"SC_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N},
4285#endif
4286#ifdef _SC_XOPEN_LEGACY
4287 {"SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY},
4288#endif
4289#ifdef _SC_XOPEN_REALTIME
4290 {"SC_XOPEN_REALTIME", _SC_XOPEN_REALTIME},
4291#endif
4292#ifdef _SC_XOPEN_REALTIME_THREADS
4293 {"SC_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS},
4294#endif
4295#ifdef _SC_XOPEN_SHM
4296 {"SC_XOPEN_SHM", _SC_XOPEN_SHM},
4297#endif
4298#ifdef _SC_XOPEN_UNIX
4299 {"SC_XOPEN_UNIX", _SC_XOPEN_UNIX},
4300#endif
4301#ifdef _SC_XOPEN_VERSION
4302 {"SC_XOPEN_VERSION", _SC_XOPEN_VERSION},
4303#endif
4304#ifdef _SC_XOPEN_XCU_VERSION
4305 {"SC_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION},
4306#endif
4307#ifdef _SC_XOPEN_XPG2
4308 {"SC_XOPEN_XPG2", _SC_XOPEN_XPG2},
4309#endif
4310#ifdef _SC_XOPEN_XPG3
4311 {"SC_XOPEN_XPG3", _SC_XOPEN_XPG3},
4312#endif
4313#ifdef _SC_XOPEN_XPG4
4314 {"SC_XOPEN_XPG4", _SC_XOPEN_XPG4},
4315#endif
4316};
4317
4318static int
4319conv_sysconf_confname(arg, valuep)
4320 PyObject *arg;
4321 int *valuep;
4322{
4323 return conv_confname(arg, valuep, posix_constants_sysconf,
4324 sizeof(posix_constants_sysconf)
4325 / sizeof(struct constdef));
4326}
4327
4328static char posix_sysconf__doc__[] = "\
4329sysconf(name) -> integer\n\
4330Return an integer-valued system configuration variable.";
4331
4332static PyObject *
4333posix_sysconf(self, args)
4334 PyObject *self;
4335 PyObject *args;
4336{
4337 PyObject *result = NULL;
4338 int name;
4339
4340 if (PyArg_ParseTuple(args, "O&:sysconf", conv_sysconf_confname, &name)) {
4341 int value;
4342
4343 errno = 0;
4344 value = sysconf(name);
4345 if (value == -1 && errno != 0)
4346 posix_error();
4347 else
4348 result = PyInt_FromLong(value);
4349 }
4350 return result;
4351}
4352#endif
4353
4354
Fred Drakebec628d1999-12-15 18:31:10 +00004355/* This code is used to ensure that the tables of configuration value names
4356 * are in sorted order as required by conv_confname(), and also to build the
4357 * the exported dictionaries that are used to publish information about the
4358 * names available on the host platform.
4359 *
4360 * Sorting the table at runtime ensures that the table is properly ordered
4361 * when used, even for platforms we're not able to test on. It also makes
4362 * it easier to add additional entries to the tables.
Fred Draked86ed291999-12-15 15:34:33 +00004363 */
Fred Drakebec628d1999-12-15 18:31:10 +00004364
4365static int
4366cmp_constdefs(v1, v2)
4367 const void *v1;
4368 const void *v2;
4369{
4370 const struct constdef *c1 =
4371 (const struct constdef *) v1;
4372 const struct constdef *c2 =
4373 (const struct constdef *) v2;
4374
4375 return strcmp(c1->name, c2->name);
4376}
4377
4378static int
4379setup_confname_table(table, tablesize, tablename, moddict)
Fred Draked86ed291999-12-15 15:34:33 +00004380 struct constdef *table;
4381 size_t tablesize;
Fred Drakebec628d1999-12-15 18:31:10 +00004382 char * tablename;
4383 PyObject *moddict;
Fred Draked86ed291999-12-15 15:34:33 +00004384{
Fred Drakebec628d1999-12-15 18:31:10 +00004385 PyObject *d = NULL;
Barry Warsaw3155db32000-04-13 15:20:40 +00004386 size_t i;
4387 int status;
Fred Drakebec628d1999-12-15 18:31:10 +00004388
4389 qsort(table, tablesize, sizeof(struct constdef), cmp_constdefs);
4390 d = PyDict_New();
Barry Warsaw3155db32000-04-13 15:20:40 +00004391 if (d == NULL)
4392 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004393
Barry Warsaw3155db32000-04-13 15:20:40 +00004394 for (i=0; i < tablesize; ++i) {
4395 PyObject *o = PyInt_FromLong(table[i].value);
4396 if (o == NULL || PyDict_SetItemString(d, table[i].name, o) == -1) {
4397 Py_XDECREF(o);
4398 Py_DECREF(d);
4399 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004400 }
Barry Warsaw3155db32000-04-13 15:20:40 +00004401 Py_DECREF(o);
Fred Draked86ed291999-12-15 15:34:33 +00004402 }
Barry Warsaw3155db32000-04-13 15:20:40 +00004403 status = PyDict_SetItemString(moddict, tablename, d);
4404 Py_DECREF(d);
4405 return status;
Fred Draked86ed291999-12-15 15:34:33 +00004406}
4407
Fred Drakebec628d1999-12-15 18:31:10 +00004408/* Return -1 on failure, 0 on success. */
4409static int
4410setup_confname_tables(moddict)
4411 PyObject *moddict;
Fred Draked86ed291999-12-15 15:34:33 +00004412{
4413#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
Fred Drakebec628d1999-12-15 18:31:10 +00004414 if (setup_confname_table(posix_constants_pathconf,
Fred Draked86ed291999-12-15 15:34:33 +00004415 sizeof(posix_constants_pathconf)
4416 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004417 "pathconf_names", moddict))
4418 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004419#endif
4420#ifdef HAVE_CONFSTR
Fred Drakebec628d1999-12-15 18:31:10 +00004421 if (setup_confname_table(posix_constants_confstr,
Fred Draked86ed291999-12-15 15:34:33 +00004422 sizeof(posix_constants_confstr)
4423 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004424 "confstr_names", moddict))
4425 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004426#endif
4427#ifdef HAVE_SYSCONF
Fred Drakebec628d1999-12-15 18:31:10 +00004428 if (setup_confname_table(posix_constants_sysconf,
Fred Draked86ed291999-12-15 15:34:33 +00004429 sizeof(posix_constants_sysconf)
4430 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004431 "sysconf_names", moddict))
4432 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004433#endif
Fred Drakebec628d1999-12-15 18:31:10 +00004434 return 0;
Fred Draked86ed291999-12-15 15:34:33 +00004435}
Fred Draked86ed291999-12-15 15:34:33 +00004436
4437
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004438static char posix_abort__doc__[] = "\
4439abort() -> does not return!\n\
4440Abort the interpreter immediately. This 'dumps core' or otherwise fails\n\
4441in the hardest way possible on the hosting operating system.";
4442
4443static PyObject *
4444posix_abort(self, args)
4445 PyObject *self;
4446 PyObject *args;
4447{
4448 if (!PyArg_ParseTuple(args, ":abort"))
4449 return NULL;
4450 abort();
4451 /*NOTREACHED*/
4452 Py_FatalError("abort() called from Python code didn't abort!");
4453 return NULL;
4454}
Fred Drakebec628d1999-12-15 18:31:10 +00004455
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004456
4457static PyMethodDef posix_methods[] = {
4458 {"access", posix_access, METH_VARARGS, posix_access__doc__},
4459#ifdef HAVE_TTYNAME
4460 {"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__},
4461#endif
4462 {"chdir", posix_chdir, METH_VARARGS, posix_chdir__doc__},
4463 {"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004464#ifdef HAVE_CHOWN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004465 {"chown", posix_chown, METH_VARARGS, posix_chown__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004466#endif /* HAVE_CHOWN */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004467#ifdef HAVE_CTERMID
4468 {"ctermid", posix_ctermid, METH_VARARGS, posix_ctermid__doc__},
4469#endif
Guido van Rossum36bc6801995-06-14 22:54:23 +00004470#ifdef HAVE_GETCWD
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004471 {"getcwd", posix_getcwd, METH_VARARGS, posix_getcwd__doc__},
Guido van Rossum36bc6801995-06-14 22:54:23 +00004472#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004473#ifdef HAVE_LINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004474 {"link", posix_link, METH_VARARGS, posix_link__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004475#endif /* HAVE_LINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004476 {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__},
4477 {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__},
4478 {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004479#ifdef HAVE_NICE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004480 {"nice", posix_nice, METH_VARARGS, posix_nice__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004481#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004482#ifdef HAVE_READLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004483 {"readlink", posix_readlink, METH_VARARGS, posix_readlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004484#endif /* HAVE_READLINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004485 {"rename", posix_rename, METH_VARARGS, posix_rename__doc__},
4486 {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__},
4487 {"stat", posix_stat, METH_VARARGS, posix_stat__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004488#ifdef HAVE_SYMLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004489 {"symlink", posix_symlink, METH_VARARGS, posix_symlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004490#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004491#ifdef HAVE_SYSTEM
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004492 {"system", posix_system, METH_VARARGS, posix_system__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004493#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004494 {"umask", posix_umask, METH_VARARGS, posix_umask__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004495#ifdef HAVE_UNAME
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004496 {"uname", posix_uname, METH_VARARGS, posix_uname__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004497#endif /* HAVE_UNAME */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004498 {"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__},
4499 {"remove", posix_unlink, METH_VARARGS, posix_remove__doc__},
4500 {"utime", posix_utime, METH_VARARGS, posix_utime__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004501#ifdef HAVE_TIMES
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004502 {"times", posix_times, METH_VARARGS, posix_times__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004503#endif /* HAVE_TIMES */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004504 {"_exit", posix__exit, METH_VARARGS, posix__exit__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004505#ifdef HAVE_EXECV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004506 {"execv", posix_execv, METH_VARARGS, posix_execv__doc__},
4507 {"execve", posix_execve, METH_VARARGS, posix_execve__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004508#endif /* HAVE_EXECV */
Guido van Rossuma1065681999-01-25 23:20:23 +00004509#ifdef HAVE_SPAWNV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004510 {"spawnv", posix_spawnv, METH_VARARGS, posix_spawnv__doc__},
4511 {"spawnve", posix_spawnve, METH_VARARGS, posix_spawnve__doc__},
Guido van Rossuma1065681999-01-25 23:20:23 +00004512#endif /* HAVE_SPAWNV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004513#ifdef HAVE_FORK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004514 {"fork", posix_fork, METH_VARARGS, posix_fork__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004515#endif /* HAVE_FORK */
4516#ifdef HAVE_GETEGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004517 {"getegid", posix_getegid, METH_VARARGS, posix_getegid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004518#endif /* HAVE_GETEGID */
4519#ifdef HAVE_GETEUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004520 {"geteuid", posix_geteuid, METH_VARARGS, posix_geteuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004521#endif /* HAVE_GETEUID */
4522#ifdef HAVE_GETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004523 {"getgid", posix_getgid, METH_VARARGS, posix_getgid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004524#endif /* HAVE_GETGID */
Fred Drakec9680921999-12-13 16:37:25 +00004525#ifdef HAVE_GETGROUPS
4526 {"getgroups", posix_getgroups, METH_VARARGS, posix_getgroups__doc__},
4527#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004528 {"getpid", posix_getpid, METH_VARARGS, posix_getpid__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004529#ifdef HAVE_GETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004530 {"getpgrp", posix_getpgrp, METH_VARARGS, posix_getpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004531#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004532#ifdef HAVE_GETPPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004533 {"getppid", posix_getppid, METH_VARARGS, posix_getppid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004534#endif /* HAVE_GETPPID */
4535#ifdef HAVE_GETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004536 {"getuid", posix_getuid, METH_VARARGS, posix_getuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004537#endif /* HAVE_GETUID */
Fred Drake12c6e2d1999-12-14 21:25:03 +00004538#ifdef HAVE_GETLOGIN
4539 {"getlogin", posix_getlogin, METH_VARARGS, posix_getlogin__doc__},
4540#endif
Guido van Rossumad0ee831995-03-01 10:34:45 +00004541#ifdef HAVE_KILL
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004542 {"kill", posix_kill, METH_VARARGS, posix_kill__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004543#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00004544#ifdef HAVE_PLOCK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004545 {"plock", posix_plock, METH_VARARGS, posix_plock__doc__},
Guido van Rossumc0125471996-06-28 18:55:32 +00004546#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004547#ifdef HAVE_POPEN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004548 {"popen", posix_popen, METH_VARARGS, posix_popen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004549#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004550#ifdef HAVE_SETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004551 {"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004552#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004553#ifdef HAVE_SETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004554 {"setgid", posix_setgid, METH_VARARGS, posix_setgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004555#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004556#ifdef HAVE_SETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004557 {"setpgrp", posix_setpgrp, METH_VARARGS, posix_setpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004558#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004559#ifdef HAVE_WAIT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004560 {"wait", posix_wait, METH_VARARGS, posix_wait__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004561#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004562#ifdef HAVE_WAITPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004563 {"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004564#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004565#ifdef HAVE_SETSID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004566 {"setsid", posix_setsid, METH_VARARGS, posix_setsid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004567#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004568#ifdef HAVE_SETPGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004569 {"setpgid", posix_setpgid, METH_VARARGS, posix_setpgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004570#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004571#ifdef HAVE_TCGETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004572 {"tcgetpgrp", posix_tcgetpgrp, METH_VARARGS, posix_tcgetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004573#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004574#ifdef HAVE_TCSETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004575 {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004576#endif /* HAVE_TCSETPGRP */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004577 {"open", posix_open, METH_VARARGS, posix_open__doc__},
4578 {"close", posix_close, METH_VARARGS, posix_close__doc__},
4579 {"dup", posix_dup, METH_VARARGS, posix_dup__doc__},
4580 {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__},
4581 {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},
4582 {"read", posix_read, METH_VARARGS, posix_read__doc__},
4583 {"write", posix_write, METH_VARARGS, posix_write__doc__},
4584 {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__},
4585 {"fdopen", posix_fdopen, METH_VARARGS, posix_fdopen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004586#ifdef HAVE_PIPE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004587 {"pipe", posix_pipe, METH_VARARGS, posix_pipe__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004588#endif
4589#ifdef HAVE_MKFIFO
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004590 {"mkfifo", posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004591#endif
4592#ifdef HAVE_FTRUNCATE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004593 {"ftruncate", posix_ftruncate, METH_VARARGS, posix_ftruncate__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004594#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004595#ifdef HAVE_PUTENV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004596 {"putenv", posix_putenv, METH_VARARGS, posix_putenv__doc__},
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004597#endif
Guido van Rossumb6a47161997-09-15 22:54:34 +00004598#ifdef HAVE_STRERROR
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004599 {"strerror", posix_strerror, METH_VARARGS, posix_strerror__doc__},
Guido van Rossumb6a47161997-09-15 22:54:34 +00004600#endif
Guido van Rossum21142a01999-01-08 21:05:37 +00004601#ifdef HAVE_FSYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004602 {"fsync", posix_fsync, METH_VARARGS, posix_fsync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004603#endif
4604#ifdef HAVE_FDATASYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004605 {"fdatasync", posix_fdatasync, METH_VARARGS, posix_fdatasync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004606#endif
Guido van Rossumc9641791998-08-04 15:26:23 +00004607#ifdef HAVE_SYS_WAIT_H
4608#ifdef WIFSTOPPED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004609 {"WIFSTOPPED", posix_WIFSTOPPED, METH_VARARGS, posix_WIFSTOPPED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004610#endif /* WIFSTOPPED */
4611#ifdef WIFSIGNALED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004612 {"WIFSIGNALED", posix_WIFSIGNALED, METH_VARARGS, posix_WIFSIGNALED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004613#endif /* WIFSIGNALED */
4614#ifdef WIFEXITED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004615 {"WIFEXITED", posix_WIFEXITED, METH_VARARGS, posix_WIFEXITED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004616#endif /* WIFEXITED */
4617#ifdef WEXITSTATUS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004618 {"WEXITSTATUS", posix_WEXITSTATUS, METH_VARARGS, posix_WEXITSTATUS__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004619#endif /* WEXITSTATUS */
4620#ifdef WTERMSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004621 {"WTERMSIG", posix_WTERMSIG, METH_VARARGS, posix_WTERMSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004622#endif /* WTERMSIG */
4623#ifdef WSTOPSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004624 {"WSTOPSIG", posix_WSTOPSIG, METH_VARARGS, posix_WSTOPSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004625#endif /* WSTOPSIG */
4626#endif /* HAVE_SYS_WAIT_H */
Guido van Rossum94f6f721999-01-06 18:42:14 +00004627#ifdef HAVE_FSTATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004628 {"fstatvfs", posix_fstatvfs, METH_VARARGS, posix_fstatvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004629#endif
4630#ifdef HAVE_STATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004631 {"statvfs", posix_statvfs, METH_VARARGS, posix_statvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004632#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004633#ifdef HAVE_TMPNAM
4634 {"tmpfile", posix_tmpfile, METH_VARARGS, posix_tmpfile__doc__},
4635#endif
4636#ifdef HAVE_TEMPNAM
4637 {"tempnam", posix_tempnam, METH_VARARGS, posix_tempnam__doc__},
4638#endif
4639#ifdef HAVE_TMPNAM
4640 {"tmpnam", posix_tmpnam, METH_VARARGS, posix_tmpnam__doc__},
4641#endif
Fred Drakec9680921999-12-13 16:37:25 +00004642#ifdef HAVE_CONFSTR
4643 {"confstr", posix_confstr, METH_VARARGS, posix_confstr__doc__},
4644#endif
4645#ifdef HAVE_SYSCONF
4646 {"sysconf", posix_sysconf, METH_VARARGS, posix_sysconf__doc__},
4647#endif
4648#ifdef HAVE_FPATHCONF
4649 {"fpathconf", posix_fpathconf, METH_VARARGS, posix_fpathconf__doc__},
4650#endif
4651#ifdef HAVE_PATHCONF
4652 {"pathconf", posix_pathconf, METH_VARARGS, posix_pathconf__doc__},
4653#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004654 {"abort", posix_abort, METH_VARARGS, posix_abort__doc__},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004655 {NULL, NULL} /* Sentinel */
4656};
4657
4658
Barry Warsaw4a342091996-12-19 23:50:02 +00004659static int
4660ins(d, symbol, value)
4661 PyObject* d;
4662 char* symbol;
4663 long value;
4664{
4665 PyObject* v = PyInt_FromLong(value);
4666 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
4667 return -1; /* triggers fatal error */
4668
4669 Py_DECREF(v);
4670 return 0;
4671}
4672
Guido van Rossumd48f2521997-12-05 22:19:34 +00004673#if defined(PYOS_OS2)
4674/* Insert Platform-Specific Constant Values (Strings & Numbers) of Common Use */
4675static int insertvalues(PyObject *d)
4676{
4677 APIRET rc;
4678 ULONG values[QSV_MAX+1];
4679 PyObject *v;
4680 char *ver, tmp[10];
4681
4682 Py_BEGIN_ALLOW_THREADS
4683 rc = DosQuerySysInfo(1, QSV_MAX, &values[1], sizeof(values));
4684 Py_END_ALLOW_THREADS
4685
4686 if (rc != NO_ERROR) {
4687 os2_error(rc);
4688 return -1;
4689 }
4690
4691 if (ins(d, "meminstalled", values[QSV_TOTPHYSMEM])) return -1;
4692 if (ins(d, "memkernel", values[QSV_TOTRESMEM])) return -1;
4693 if (ins(d, "memvirtual", values[QSV_TOTAVAILMEM])) return -1;
4694 if (ins(d, "maxpathlen", values[QSV_MAX_PATH_LENGTH])) return -1;
4695 if (ins(d, "maxnamelen", values[QSV_MAX_COMP_LENGTH])) return -1;
4696 if (ins(d, "revision", values[QSV_VERSION_REVISION])) return -1;
4697 if (ins(d, "timeslice", values[QSV_MIN_SLICE])) return -1;
4698
4699 switch (values[QSV_VERSION_MINOR]) {
4700 case 0: ver = "2.00"; break;
4701 case 10: ver = "2.10"; break;
4702 case 11: ver = "2.11"; break;
4703 case 30: ver = "3.00"; break;
4704 case 40: ver = "4.00"; break;
4705 case 50: ver = "5.00"; break;
4706 default:
4707 sprintf(tmp, "%d-%d", values[QSV_VERSION_MAJOR],
4708 values[QSV_VERSION_MINOR]);
4709 ver = &tmp[0];
4710 }
4711
4712 /* Add Indicator of the Version of the Operating System */
4713 v = PyString_FromString(ver);
4714 if (!v || PyDict_SetItemString(d, "version", v) < 0)
4715 return -1;
4716 Py_DECREF(v);
4717
4718 /* Add Indicator of Which Drive was Used to Boot the System */
4719 tmp[0] = 'A' + values[QSV_BOOT_DRIVE] - 1;
4720 tmp[1] = ':';
4721 tmp[2] = '\0';
4722
4723 v = PyString_FromString(tmp);
4724 if (!v || PyDict_SetItemString(d, "bootdrive", v) < 0)
4725 return -1;
4726 Py_DECREF(v);
4727
4728 return 0;
4729}
4730#endif
4731
Barry Warsaw4a342091996-12-19 23:50:02 +00004732static int
4733all_ins(d)
4734 PyObject* d;
4735{
Guido van Rossum94f6f721999-01-06 18:42:14 +00004736#ifdef F_OK
4737 if (ins(d, "F_OK", (long)F_OK)) return -1;
4738#endif
4739#ifdef R_OK
4740 if (ins(d, "R_OK", (long)R_OK)) return -1;
4741#endif
4742#ifdef W_OK
4743 if (ins(d, "W_OK", (long)W_OK)) return -1;
4744#endif
4745#ifdef X_OK
4746 if (ins(d, "X_OK", (long)X_OK)) return -1;
4747#endif
Fred Drakec9680921999-12-13 16:37:25 +00004748#ifdef NGROUPS_MAX
4749 if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1;
4750#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004751#ifdef TMP_MAX
4752 if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1;
4753#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004754#ifdef WNOHANG
4755 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
4756#endif
4757#ifdef O_RDONLY
4758 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
4759#endif
4760#ifdef O_WRONLY
4761 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
4762#endif
4763#ifdef O_RDWR
4764 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
4765#endif
4766#ifdef O_NDELAY
4767 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
4768#endif
4769#ifdef O_NONBLOCK
4770 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
4771#endif
4772#ifdef O_APPEND
4773 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
4774#endif
4775#ifdef O_DSYNC
4776 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
4777#endif
4778#ifdef O_RSYNC
4779 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
4780#endif
4781#ifdef O_SYNC
4782 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
4783#endif
4784#ifdef O_NOCTTY
4785 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
4786#endif
4787#ifdef O_CREAT
4788 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
4789#endif
4790#ifdef O_EXCL
4791 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
4792#endif
4793#ifdef O_TRUNC
4794 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
4795#endif
Guido van Rossum98d9d091997-08-08 21:48:51 +00004796#ifdef O_BINARY
4797 if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
4798#endif
4799#ifdef O_TEXT
4800 if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
4801#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +00004802
Guido van Rossum246bc171999-02-01 23:54:31 +00004803#ifdef HAVE_SPAWNV
Guido van Rossum7d385291999-02-16 19:38:04 +00004804 if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1;
4805 if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1;
4806 if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1;
4807 if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1;
4808 if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1;
Guido van Rossum246bc171999-02-01 23:54:31 +00004809#endif
4810
Guido van Rossumd48f2521997-12-05 22:19:34 +00004811#if defined(PYOS_OS2)
4812 if (insertvalues(d)) return -1;
4813#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004814 return 0;
4815}
4816
4817
Guido van Rossumc5a0f531997-12-02 20:36:02 +00004818#if ( defined(_MSC_VER) || defined(__WATCOMC__) ) && !defined(__QNX__)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004819#define INITFUNC initnt
4820#define MODNAME "nt"
4821#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004822#if defined(PYOS_OS2)
4823#define INITFUNC initos2
4824#define MODNAME "os2"
4825#else
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004826#define INITFUNC initposix
4827#define MODNAME "posix"
4828#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004829#endif
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004830
Guido van Rossum3886bb61998-12-04 18:50:17 +00004831DL_EXPORT(void)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004832INITFUNC()
Guido van Rossumb6775db1994-08-01 11:34:53 +00004833{
Barry Warsaw53699e91996-12-10 23:23:01 +00004834 PyObject *m, *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00004835
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004836 m = Py_InitModule4(MODNAME,
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004837 posix_methods,
4838 posix__doc__,
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004839 (PyObject *)NULL,
4840 PYTHON_API_VERSION);
Barry Warsaw53699e91996-12-10 23:23:01 +00004841 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004842
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004843 /* Initialize environ dictionary */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004844 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00004845 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004846 return;
Barry Warsaw53699e91996-12-10 23:23:01 +00004847 Py_DECREF(v);
Fred Drakec9680921999-12-13 16:37:25 +00004848
Barry Warsaw4a342091996-12-19 23:50:02 +00004849 if (all_ins(d))
Barry Warsaw4a342091996-12-19 23:50:02 +00004850 return;
4851
Fred Drakebec628d1999-12-15 18:31:10 +00004852 if (setup_confname_tables(d))
4853 return;
4854
Barry Warsawca74da41999-02-09 19:31:45 +00004855 PyDict_SetItemString(d, "error", PyExc_OSError);
Fred Drake762e2061999-08-26 17:23:54 +00004856
Guido van Rossumb3d39562000-01-31 18:41:26 +00004857#ifdef HAVE_PUTENV
Fred Drake762e2061999-08-26 17:23:54 +00004858 posix_putenv_garbage = PyDict_New();
Guido van Rossumb3d39562000-01-31 18:41:26 +00004859#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004860}