blob: 67096c315767ba4b262c46b69aad548aa34c523e [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();
Andrew M. Kuchling54c8dc22000-06-06 20:52:17 +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 {
Fred Drake137507e2000-06-01 02:02:46 +00001565 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossuma1065681999-01-25 23:20:23 +00001566 return NULL;
1567 }
1568
1569 argvlist = PyMem_NEW(char *, argc+1);
1570 if (argvlist == NULL)
1571 return NULL;
1572 for (i = 0; i < argc; i++) {
1573 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
1574 PyMem_DEL(argvlist);
Fred Drake137507e2000-06-01 02:02:46 +00001575 PyErr_SetString(PyExc_TypeError,
1576 "all arguments must be strings");
1577 return NULL;
Guido van Rossuma1065681999-01-25 23:20:23 +00001578 }
1579 }
1580 argvlist[argc] = NULL;
1581
Guido van Rossum246bc171999-02-01 23:54:31 +00001582 if (mode == _OLD_P_OVERLAY)
1583 mode = _P_OVERLAY;
Guido van Rossuma1065681999-01-25 23:20:23 +00001584 i = _spawnv(mode, path, argvlist);
1585
1586 PyMem_DEL(argvlist);
1587
1588 if (i == -1)
1589 return posix_error();
1590 else
1591 return Py_BuildValue("i", i);
1592}
1593
1594
1595static char posix_spawnve__doc__[] =
Fred Drakea6dff3e1999-02-01 22:24:40 +00001596"spawnve(mode, path, args, env)\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001597Execute a path with arguments and environment, replacing current process.\n\
1598\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00001599 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001600 path: path of executable file\n\
1601 args: tuple or list of arguments\n\
1602 env: dictonary of strings mapping to strings";
1603
1604static PyObject *
1605posix_spawnve(self, args)
1606 PyObject *self;
1607 PyObject *args;
1608{
1609 char *path;
1610 PyObject *argv, *env;
1611 char **argvlist;
1612 char **envlist;
1613 PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL;
1614 int mode, i, pos, argc, envc;
1615 PyObject *(*getitem) Py_PROTO((PyObject *, int));
1616
1617 /* spawnve has four arguments: (mode, path, argv, env), where
1618 argv is a list or tuple of strings and env is a dictionary
1619 like posix.environ. */
1620
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001621 if (!PyArg_ParseTuple(args, "isOO:spawnve", &mode, &path, &argv, &env))
Guido van Rossuma1065681999-01-25 23:20:23 +00001622 return NULL;
1623 if (PyList_Check(argv)) {
1624 argc = PyList_Size(argv);
1625 getitem = PyList_GetItem;
1626 }
1627 else if (PyTuple_Check(argv)) {
1628 argc = PyTuple_Size(argv);
1629 getitem = PyTuple_GetItem;
1630 }
1631 else {
1632 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
1633 return NULL;
1634 }
1635 if (!PyMapping_Check(env)) {
1636 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
1637 return NULL;
1638 }
1639
1640 argvlist = PyMem_NEW(char *, argc+1);
1641 if (argvlist == NULL) {
1642 PyErr_NoMemory();
1643 return NULL;
1644 }
1645 for (i = 0; i < argc; i++) {
1646 if (!PyArg_Parse((*getitem)(argv, i),
1647 "s;argv must be list of strings",
1648 &argvlist[i]))
1649 {
1650 goto fail_1;
1651 }
1652 }
1653 argvlist[argc] = NULL;
1654
1655 i = PyMapping_Length(env);
1656 envlist = PyMem_NEW(char *, i + 1);
1657 if (envlist == NULL) {
1658 PyErr_NoMemory();
1659 goto fail_1;
1660 }
1661 envc = 0;
1662 keys = PyMapping_Keys(env);
1663 vals = PyMapping_Values(env);
1664 if (!keys || !vals)
1665 goto fail_2;
1666
1667 for (pos = 0; pos < i; pos++) {
1668 char *p, *k, *v;
1669
1670 key = PyList_GetItem(keys, pos);
1671 val = PyList_GetItem(vals, pos);
1672 if (!key || !val)
1673 goto fail_2;
1674
1675 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
1676 !PyArg_Parse(val, "s;non-string value in env", &v))
1677 {
1678 goto fail_2;
1679 }
1680 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
1681 if (p == NULL) {
1682 PyErr_NoMemory();
1683 goto fail_2;
1684 }
1685 sprintf(p, "%s=%s", k, v);
1686 envlist[envc++] = p;
1687 }
1688 envlist[envc] = 0;
1689
Guido van Rossum246bc171999-02-01 23:54:31 +00001690 if (mode == _OLD_P_OVERLAY)
1691 mode = _P_OVERLAY;
Guido van Rossuma1065681999-01-25 23:20:23 +00001692 i = _spawnve(mode, path, argvlist, envlist);
1693 if (i == -1)
1694 (void) posix_error();
1695 else
1696 res = Py_BuildValue("i", i);
1697
1698 fail_2:
1699 while (--envc >= 0)
1700 PyMem_DEL(envlist[envc]);
1701 PyMem_DEL(envlist);
1702 fail_1:
1703 PyMem_DEL(argvlist);
1704 Py_XDECREF(vals);
1705 Py_XDECREF(keys);
1706 return res;
1707}
1708#endif /* HAVE_SPAWNV */
1709
1710
Guido van Rossumad0ee831995-03-01 10:34:45 +00001711#ifdef HAVE_FORK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001712static char posix_fork__doc__[] =
1713"fork() -> pid\n\
1714Fork a child process.\n\
1715\n\
1716Return 0 to child process and PID of child to parent process.";
1717
Barry Warsaw53699e91996-12-10 23:23:01 +00001718static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001719posix_fork(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001720 PyObject *self;
1721 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001722{
1723 int pid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001724 if (!PyArg_ParseTuple(args, ":fork"))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001725 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001726 pid = fork();
1727 if (pid == -1)
1728 return posix_error();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001729 PyOS_AfterFork();
Barry Warsaw53699e91996-12-10 23:23:01 +00001730 return PyInt_FromLong((long)pid);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001731}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001732#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001733
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001734
Guido van Rossumad0ee831995-03-01 10:34:45 +00001735#ifdef HAVE_GETEGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001736static char posix_getegid__doc__[] =
1737"getegid() -> egid\n\
1738Return the current process's effective group id.";
1739
Barry Warsaw53699e91996-12-10 23:23:01 +00001740static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001741posix_getegid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001742 PyObject *self;
1743 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001744{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001745 if (!PyArg_ParseTuple(args, ":getegid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001746 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001747 return PyInt_FromLong((long)getegid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001748}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001749#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001750
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001751
Guido van Rossumad0ee831995-03-01 10:34:45 +00001752#ifdef HAVE_GETEUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001753static char posix_geteuid__doc__[] =
1754"geteuid() -> euid\n\
1755Return the current process's effective user id.";
1756
Barry Warsaw53699e91996-12-10 23:23:01 +00001757static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001758posix_geteuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001759 PyObject *self;
1760 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001761{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001762 if (!PyArg_ParseTuple(args, ":geteuid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001763 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001764 return PyInt_FromLong((long)geteuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001765}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001766#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001767
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001768
Guido van Rossumad0ee831995-03-01 10:34:45 +00001769#ifdef HAVE_GETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001770static char posix_getgid__doc__[] =
1771"getgid() -> gid\n\
1772Return the current process's group id.";
1773
Barry Warsaw53699e91996-12-10 23:23:01 +00001774static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001775posix_getgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001776 PyObject *self;
1777 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001778{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001779 if (!PyArg_ParseTuple(args, ":getgid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001780 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001781 return PyInt_FromLong((long)getgid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001782}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001783#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001784
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001785
1786static char posix_getpid__doc__[] =
1787"getpid() -> pid\n\
1788Return the current process id";
1789
Barry Warsaw53699e91996-12-10 23:23:01 +00001790static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001791posix_getpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001792 PyObject *self;
1793 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001794{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001795 if (!PyArg_ParseTuple(args, ":getpid"))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001796 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001797 return PyInt_FromLong((long)getpid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001798}
1799
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001800
Fred Drakec9680921999-12-13 16:37:25 +00001801#ifdef HAVE_GETGROUPS
1802static char posix_getgroups__doc__[] = "\
1803getgroups() -> list of group IDs\n\
1804Return list of supplemental group IDs for the process.";
1805
1806static PyObject *
1807posix_getgroups(self, args)
1808 PyObject *self;
1809 PyObject *args;
1810{
1811 PyObject *result = NULL;
1812
1813 if (PyArg_ParseTuple(args, ":getgroups")) {
1814#ifdef NGROUPS_MAX
1815#define MAX_GROUPS NGROUPS_MAX
1816#else
1817 /* defined to be 16 on Solaris7, so this should be a small number */
1818#define MAX_GROUPS 64
1819#endif
1820 gid_t grouplist[MAX_GROUPS];
1821 int n;
1822
1823 n = getgroups(MAX_GROUPS, grouplist);
1824 if (n < 0)
1825 posix_error();
1826 else {
1827 result = PyList_New(n);
1828 if (result != NULL) {
1829 PyObject *o;
1830 int i;
1831 for (i = 0; i < n; ++i) {
1832 o = PyInt_FromLong((long)grouplist[i]);
1833 if (o == NULL) {
1834 Py_DECREF(result);
1835 result = NULL;
1836 break;
1837 }
1838 PyList_SET_ITEM(result, i, o);
1839 }
1840 }
1841 }
1842 }
1843 return result;
1844}
1845#endif
1846
Guido van Rossumb6775db1994-08-01 11:34:53 +00001847#ifdef HAVE_GETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001848static char posix_getpgrp__doc__[] =
1849"getpgrp() -> pgrp\n\
1850Return the current process group id.";
1851
Barry Warsaw53699e91996-12-10 23:23:01 +00001852static PyObject *
Guido van Rossum04814471991-06-04 20:23:49 +00001853posix_getpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001854 PyObject *self;
1855 PyObject *args;
Guido van Rossum04814471991-06-04 20:23:49 +00001856{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001857 if (!PyArg_ParseTuple(args, ":getpgrp"))
Guido van Rossum04814471991-06-04 20:23:49 +00001858 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001859#ifdef GETPGRP_HAVE_ARG
Barry Warsaw53699e91996-12-10 23:23:01 +00001860 return PyInt_FromLong((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001861#else /* GETPGRP_HAVE_ARG */
Barry Warsaw53699e91996-12-10 23:23:01 +00001862 return PyInt_FromLong((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001863#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001864}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001865#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001866
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001867
Guido van Rossumb6775db1994-08-01 11:34:53 +00001868#ifdef HAVE_SETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001869static char posix_setpgrp__doc__[] =
1870"setpgrp() -> None\n\
1871Make this process a session leader.";
1872
Barry Warsaw53699e91996-12-10 23:23:01 +00001873static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001874posix_setpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001875 PyObject *self;
1876 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001877{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001878 if (!PyArg_ParseTuple(args, ":setpgrp"))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001879 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001880#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001881 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001882#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001883 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001884#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001885 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001886 Py_INCREF(Py_None);
1887 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001888}
1889
Guido van Rossumb6775db1994-08-01 11:34:53 +00001890#endif /* HAVE_SETPGRP */
1891
Guido van Rossumad0ee831995-03-01 10:34:45 +00001892#ifdef HAVE_GETPPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001893static char posix_getppid__doc__[] =
1894"getppid() -> ppid\n\
1895Return the parent's process id.";
1896
Barry Warsaw53699e91996-12-10 23:23:01 +00001897static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001898posix_getppid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001899 PyObject *self;
1900 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001901{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001902 if (!PyArg_ParseTuple(args, ":getppid"))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001903 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001904 return PyInt_FromLong((long)getppid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001905}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001906#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001907
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001908
Fred Drake12c6e2d1999-12-14 21:25:03 +00001909#ifdef HAVE_GETLOGIN
1910static char posix_getlogin__doc__[] = "\
1911getlogin() -> string\n\
1912Return the actual login name.";
1913
1914static PyObject *
1915posix_getlogin(self, args)
1916 PyObject *self;
1917 PyObject *args;
1918{
1919 PyObject *result = NULL;
1920
1921 if (PyArg_ParseTuple(args, ":getlogin")) {
1922 char *name = getlogin();
1923
1924 if (name == NULL)
1925 posix_error();
1926 else
1927 result = PyString_FromString(name);
1928 }
1929 return result;
1930}
1931#endif
1932
Guido van Rossumad0ee831995-03-01 10:34:45 +00001933#ifdef HAVE_GETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001934static char posix_getuid__doc__[] =
1935"getuid() -> uid\n\
1936Return the current process's user id.";
1937
Barry Warsaw53699e91996-12-10 23:23:01 +00001938static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001939posix_getuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001940 PyObject *self;
1941 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001942{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001943 if (!PyArg_ParseTuple(args, ":getuid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001944 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001945 return PyInt_FromLong((long)getuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001946}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001947#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001948
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001949
Guido van Rossumad0ee831995-03-01 10:34:45 +00001950#ifdef HAVE_KILL
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001951static char posix_kill__doc__[] =
1952"kill(pid, sig) -> None\n\
1953Kill a process with a signal.";
1954
Barry Warsaw53699e91996-12-10 23:23:01 +00001955static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001956posix_kill(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001957 PyObject *self;
1958 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001959{
1960 int pid, sig;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001961 if (!PyArg_ParseTuple(args, "ii:kill", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001962 return NULL;
Guido van Rossumd48f2521997-12-05 22:19:34 +00001963#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001964 if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
1965 APIRET rc;
1966 if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00001967 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001968
1969 } else if (sig == XCPT_SIGNAL_KILLPROC) {
1970 APIRET rc;
1971 if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00001972 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001973
1974 } else
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001975 return NULL; /* Unrecognized Signal Requested */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001976#else
Guido van Rossum85e3b011991-06-03 12:42:10 +00001977 if (kill(pid, sig) == -1)
1978 return posix_error();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001979#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001980 Py_INCREF(Py_None);
1981 return Py_None;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001982}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001983#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001984
Guido van Rossumc0125471996-06-28 18:55:32 +00001985#ifdef HAVE_PLOCK
1986
1987#ifdef HAVE_SYS_LOCK_H
1988#include <sys/lock.h>
1989#endif
1990
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001991static char posix_plock__doc__[] =
1992"plock(op) -> None\n\
1993Lock program segments into memory.";
1994
Barry Warsaw53699e91996-12-10 23:23:01 +00001995static PyObject *
Guido van Rossumc0125471996-06-28 18:55:32 +00001996posix_plock(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001997 PyObject *self;
1998 PyObject *args;
Guido van Rossumc0125471996-06-28 18:55:32 +00001999{
2000 int op;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002001 if (!PyArg_ParseTuple(args, "i:plock", &op))
Guido van Rossumc0125471996-06-28 18:55:32 +00002002 return NULL;
2003 if (plock(op) == -1)
2004 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002005 Py_INCREF(Py_None);
2006 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00002007}
2008#endif
2009
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002010
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002011#ifdef HAVE_POPEN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002012static char posix_popen__doc__[] =
2013"popen(command [, mode='r' [, bufsize]]) -> pipe\n\
2014Open a pipe to/from a command returning a file object.";
2015
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002016#if defined(PYOS_OS2)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002017static int
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002018async_system(const char *command)
2019{
2020 char *p, errormsg[256], args[1024];
2021 RESULTCODES rcodes;
2022 APIRET rc;
2023 char *shell = getenv("COMSPEC");
2024 if (!shell)
2025 shell = "cmd";
2026
2027 strcpy(args, shell);
2028 p = &args[ strlen(args)+1 ];
2029 strcpy(p, "/c ");
2030 strcat(p, command);
2031 p += strlen(p) + 1;
2032 *p = '\0';
2033
2034 rc = DosExecPgm(errormsg, sizeof(errormsg),
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002035 EXEC_ASYNC, /* Execute Async w/o Wait for Results */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002036 args,
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002037 NULL, /* Inherit Parent's Environment */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002038 &rcodes, shell);
2039 return rc;
2040}
2041
Guido van Rossumd48f2521997-12-05 22:19:34 +00002042static FILE *
2043popen(const char *command, const char *mode, int pipesize, int *err)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002044{
2045 HFILE rhan, whan;
2046 FILE *retfd = NULL;
2047 APIRET rc = DosCreatePipe(&rhan, &whan, pipesize);
2048
Guido van Rossumd48f2521997-12-05 22:19:34 +00002049 if (rc != NO_ERROR) {
2050 *err = rc;
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002051 return NULL; /* ERROR - Unable to Create Anon Pipe */
Guido van Rossumd48f2521997-12-05 22:19:34 +00002052 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002053
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002054 if (strchr(mode, 'r') != NULL) { /* Treat Command as a Data Source */
2055 int oldfd = dup(1); /* Save STDOUT Handle in Another Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002056
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002057 DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
2058 close(1); /* Make STDOUT Available for Reallocation */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002059
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002060 if (dup2(whan, 1) == 0) { /* Connect STDOUT to Pipe Write Side */
2061 DosClose(whan); /* Close Now-Unused Pipe Write Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002062
2063 if (async_system(command) == NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002064 retfd = fdopen(rhan, mode); /* And Return Pipe Read Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002065 }
2066
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002067 dup2(oldfd, 1); /* Reconnect STDOUT to Original Handle */
2068 DosExitCritSec(); /* Now Allow Other Threads to Run */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002069
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002070 close(oldfd); /* And Close Saved STDOUT Handle */
2071 return retfd; /* Return fd of Pipe or NULL if Error */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002072
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002073 } else if (strchr(mode, 'w')) { /* Treat Command as a Data Sink */
2074 int oldfd = dup(0); /* Save STDIN Handle in Another Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002075
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002076 DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
2077 close(0); /* Make STDIN Available for Reallocation */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002078
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002079 if (dup2(rhan, 0) == 0) { /* Connect STDIN to Pipe Read Side */
2080 DosClose(rhan); /* Close Now-Unused Pipe Read Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002081
2082 if (async_system(command) == NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002083 retfd = fdopen(whan, mode); /* And Return Pipe Write Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002084 }
2085
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002086 dup2(oldfd, 0); /* Reconnect STDIN to Original Handle */
2087 DosExitCritSec(); /* Now Allow Other Threads to Run */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002088
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002089 close(oldfd); /* And Close Saved STDIN Handle */
2090 return retfd; /* Return fd of Pipe or NULL if Error */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002091
Guido van Rossumd48f2521997-12-05 22:19:34 +00002092 } else {
2093 *err = ERROR_INVALID_ACCESS;
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002094 return NULL; /* ERROR - Invalid Mode (Neither Read nor Write) */
Guido van Rossumd48f2521997-12-05 22:19:34 +00002095 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002096}
2097
2098static PyObject *
2099posix_popen(self, args)
2100 PyObject *self;
2101 PyObject *args;
2102{
2103 char *name;
2104 char *mode = "r";
Guido van Rossumd48f2521997-12-05 22:19:34 +00002105 int err, bufsize = -1;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002106 FILE *fp;
2107 PyObject *f;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002108 if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002109 return NULL;
2110 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd48f2521997-12-05 22:19:34 +00002111 fp = popen(name, mode, (bufsize > 0) ? bufsize : 4096, &err);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002112 Py_END_ALLOW_THREADS
2113 if (fp == NULL)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002114 return os2_error(err);
2115
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002116 f = PyFile_FromFile(fp, name, mode, fclose);
2117 if (f != NULL)
2118 PyFile_SetBufSize(f, bufsize);
2119 return f;
2120}
2121
2122#else
Barry Warsaw53699e91996-12-10 23:23:01 +00002123static PyObject *
Guido van Rossum3b066191991-06-04 19:40:25 +00002124posix_popen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002125 PyObject *self;
2126 PyObject *args;
Guido van Rossum3b066191991-06-04 19:40:25 +00002127{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002128 char *name;
2129 char *mode = "r";
2130 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00002131 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002132 PyObject *f;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002133 if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00002134 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002135 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002136 fp = popen(name, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002137 Py_END_ALLOW_THREADS
Guido van Rossum3b066191991-06-04 19:40:25 +00002138 if (fp == NULL)
2139 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002140 f = PyFile_FromFile(fp, name, mode, pclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002141 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002142 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002143 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00002144}
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002145#endif
2146
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002147#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00002148
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002149
Guido van Rossumb6775db1994-08-01 11:34:53 +00002150#ifdef HAVE_SETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002151static char posix_setuid__doc__[] =
2152"setuid(uid) -> None\n\
2153Set the current process's user id.";
Barry Warsaw53699e91996-12-10 23:23:01 +00002154static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002155posix_setuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002156 PyObject *self;
2157 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002158{
2159 int uid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002160 if (!PyArg_ParseTuple(args, "i:setuid", &uid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002161 return NULL;
2162 if (setuid(uid) < 0)
2163 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002164 Py_INCREF(Py_None);
2165 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002166}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002167#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002168
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002169
Guido van Rossumb6775db1994-08-01 11:34:53 +00002170#ifdef HAVE_SETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002171static char posix_setgid__doc__[] =
2172"setgid(gid) -> None\n\
2173Set the current process's group id.";
2174
Barry Warsaw53699e91996-12-10 23:23:01 +00002175static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002176posix_setgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002177 PyObject *self;
2178 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002179{
2180 int gid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002181 if (!PyArg_ParseTuple(args, "i:setgid", &gid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002182 return NULL;
2183 if (setgid(gid) < 0)
2184 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002185 Py_INCREF(Py_None);
2186 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002187}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002188#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002189
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002190
Guido van Rossumb6775db1994-08-01 11:34:53 +00002191#ifdef HAVE_WAITPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002192static char posix_waitpid__doc__[] =
2193"waitpid(pid, options) -> (pid, status)\n\
2194Wait for completion of a give child process.";
2195
Barry Warsaw53699e91996-12-10 23:23:01 +00002196static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00002197posix_waitpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002198 PyObject *self;
2199 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00002200{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002201 int pid, options;
2202#ifdef UNION_WAIT
2203 union wait status;
2204#define status_i (status.w_status)
2205#else
2206 int status;
2207#define status_i status
2208#endif
2209 status_i = 0;
2210
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002211 if (!PyArg_ParseTuple(args, "ii:waitpid", &pid, &options))
Guido van Rossum21803b81992-08-09 12:55:27 +00002212 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002213 Py_BEGIN_ALLOW_THREADS
Guido van Rossume6a3aa61999-02-01 16:15:30 +00002214#ifdef NeXT
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002215 pid = wait4(pid, &status, options, NULL);
Guido van Rossume6a3aa61999-02-01 16:15:30 +00002216#else
2217 pid = waitpid(pid, &status, options);
2218#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002219 Py_END_ALLOW_THREADS
Guido van Rossum85e3b011991-06-03 12:42:10 +00002220 if (pid == -1)
2221 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00002222 else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002223 return Py_BuildValue("ii", pid, status_i);
Guido van Rossum21803b81992-08-09 12:55:27 +00002224}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002225#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00002226
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002227
Guido van Rossumad0ee831995-03-01 10:34:45 +00002228#ifdef HAVE_WAIT
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002229static char posix_wait__doc__[] =
2230"wait() -> (pid, status)\n\
2231Wait for completion of a child process.";
2232
Barry Warsaw53699e91996-12-10 23:23:01 +00002233static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00002234posix_wait(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002235 PyObject *self;
2236 PyObject *args;
Guido van Rossum21803b81992-08-09 12:55:27 +00002237{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002238 int pid;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002239#ifdef UNION_WAIT
2240 union wait status;
2241#define status_i (status.w_status)
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002242#else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002243 int status;
2244#define status_i status
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002245#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002246 if (!PyArg_ParseTuple(args, ":wait"))
2247 return NULL;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002248 status_i = 0;
2249 Py_BEGIN_ALLOW_THREADS
2250 pid = wait(&status);
Barry Warsaw53699e91996-12-10 23:23:01 +00002251 Py_END_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00002252 if (pid == -1)
2253 return posix_error();
2254 else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002255 return Py_BuildValue("ii", pid, status_i);
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002256#undef status_i
Guido van Rossum85e3b011991-06-03 12:42:10 +00002257}
Guido van Rossumad0ee831995-03-01 10:34:45 +00002258#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00002259
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002260
2261static char posix_lstat__doc__[] =
2262"lstat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
2263Like stat(path), but do not follow symbolic links.";
2264
Barry Warsaw53699e91996-12-10 23:23:01 +00002265static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002266posix_lstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002267 PyObject *self;
2268 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002269{
Guido van Rossumb6775db1994-08-01 11:34:53 +00002270#ifdef HAVE_LSTAT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002271 return posix_do_stat(self, args, "s:lstat", lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002272#else /* !HAVE_LSTAT */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002273 return posix_do_stat(self, args, "s:lstat", stat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002274#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002275}
2276
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002277
Guido van Rossumb6775db1994-08-01 11:34:53 +00002278#ifdef HAVE_READLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002279static char posix_readlink__doc__[] =
2280"readlink(path) -> path\n\
2281Return a string representing the path to which the symbolic link points.";
2282
Barry Warsaw53699e91996-12-10 23:23:01 +00002283static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002284posix_readlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002285 PyObject *self;
2286 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002287{
Guido van Rossumb6775db1994-08-01 11:34:53 +00002288 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002289 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002290 int n;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002291 if (!PyArg_ParseTuple(args, "s:readlink", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002292 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002293 Py_BEGIN_ALLOW_THREADS
Guido van Rossum50e61dc1992-03-27 17:22:31 +00002294 n = readlink(path, buf, (int) sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +00002295 Py_END_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002296 if (n < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00002297 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00002298 return PyString_FromStringAndSize(buf, n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002299}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002300#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002301
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002302
Guido van Rossumb6775db1994-08-01 11:34:53 +00002303#ifdef HAVE_SYMLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002304static char posix_symlink__doc__[] =
2305"symlink(src, dst) -> None\n\
2306Create a symbolic link.";
2307
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002308static PyObject *
2309posix_symlink(self, args)
2310 PyObject *self;
2311 PyObject *args;
2312{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002313 return posix_2str(args, "ss:symlink", symlink);
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002314}
2315#endif /* HAVE_SYMLINK */
2316
2317
2318#ifdef HAVE_TIMES
2319#ifndef HZ
2320#define HZ 60 /* Universal constant :-) */
2321#endif /* HZ */
2322
Guido van Rossumd48f2521997-12-05 22:19:34 +00002323#if defined(PYCC_VACPP) && defined(PYOS_OS2)
2324static long
2325system_uptime()
2326{
2327 ULONG value = 0;
2328
2329 Py_BEGIN_ALLOW_THREADS
2330 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &value, sizeof(value));
2331 Py_END_ALLOW_THREADS
2332
2333 return value;
2334}
2335
2336static PyObject *
2337posix_times(self, args)
2338 PyObject *self;
2339 PyObject *args;
2340{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002341 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossumd48f2521997-12-05 22:19:34 +00002342 return NULL;
2343
2344 /* Currently Only Uptime is Provided -- Others Later */
2345 return Py_BuildValue("ddddd",
2346 (double)0 /* t.tms_utime / HZ */,
2347 (double)0 /* t.tms_stime / HZ */,
2348 (double)0 /* t.tms_cutime / HZ */,
2349 (double)0 /* t.tms_cstime / HZ */,
2350 (double)system_uptime() / 1000);
2351}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002352#else /* not OS2 */
Barry Warsaw53699e91996-12-10 23:23:01 +00002353static PyObject *
Guido van Rossum22db57e1992-04-05 14:25:30 +00002354posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002355 PyObject *self;
2356 PyObject *args;
Guido van Rossum22db57e1992-04-05 14:25:30 +00002357{
2358 struct tms t;
2359 clock_t c;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002360 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossum22db57e1992-04-05 14:25:30 +00002361 return NULL;
2362 errno = 0;
2363 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00002364 if (c == (clock_t) -1)
2365 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002366 return Py_BuildValue("ddddd",
Barry Warsaw43d68b81996-12-19 22:10:44 +00002367 (double)t.tms_utime / HZ,
2368 (double)t.tms_stime / HZ,
2369 (double)t.tms_cutime / HZ,
2370 (double)t.tms_cstime / HZ,
2371 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00002372}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002373#endif /* not OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002374#endif /* HAVE_TIMES */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002375
2376
Guido van Rossum87755a21996-09-07 00:59:43 +00002377#ifdef MS_WIN32
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002378#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00002379static PyObject *
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002380posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002381 PyObject *self;
2382 PyObject *args;
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002383{
2384 FILETIME create, exit, kernel, user;
2385 HANDLE hProc;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002386 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002387 return NULL;
2388 hProc = GetCurrentProcess();
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00002389 GetProcessTimes(hProc, &create, &exit, &kernel, &user);
2390 /* The fields of a FILETIME structure are the hi and lo part
2391 of a 64-bit value expressed in 100 nanosecond units.
2392 1e7 is one second in such units; 1e-7 the inverse.
2393 429.4967296 is 2**32 / 1e7 or 2**32 * 1e-7.
2394 */
Barry Warsaw53699e91996-12-10 23:23:01 +00002395 return Py_BuildValue(
2396 "ddddd",
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00002397 (double)(kernel.dwHighDateTime*429.4967296 +
2398 kernel.dwLowDateTime*1e-7),
2399 (double)(user.dwHighDateTime*429.4967296 +
2400 user.dwLowDateTime*1e-7),
Barry Warsaw53699e91996-12-10 23:23:01 +00002401 (double)0,
2402 (double)0,
2403 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002404}
Guido van Rossum8d665e61996-06-26 18:22:49 +00002405#endif /* MS_WIN32 */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002406
2407#ifdef HAVE_TIMES
Roger E. Masse0318fd61997-06-05 22:07:58 +00002408static char posix_times__doc__[] =
2409"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\
2410Return a tuple of floating point numbers indicating process times.";
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002411#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002412
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002413
Guido van Rossumb6775db1994-08-01 11:34:53 +00002414#ifdef HAVE_SETSID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002415static char posix_setsid__doc__[] =
2416"setsid() -> None\n\
2417Call the system call setsid().";
2418
Barry Warsaw53699e91996-12-10 23:23:01 +00002419static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00002420posix_setsid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002421 PyObject *self;
2422 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002423{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002424 if (!PyArg_ParseTuple(args, ":setsid"))
Guido van Rossumc2670a01992-09-13 20:07:29 +00002425 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002426 if (setsid() < 0)
2427 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002428 Py_INCREF(Py_None);
2429 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002430}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002431#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00002432
Guido van Rossumb6775db1994-08-01 11:34:53 +00002433#ifdef HAVE_SETPGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002434static char posix_setpgid__doc__[] =
2435"setpgid(pid, pgrp) -> None\n\
2436Call the system call setpgid().";
2437
Barry Warsaw53699e91996-12-10 23:23:01 +00002438static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00002439posix_setpgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002440 PyObject *self;
2441 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002442{
2443 int pid, pgrp;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002444 if (!PyArg_ParseTuple(args, "ii:setpgid", &pid, &pgrp))
Guido van Rossumc2670a01992-09-13 20:07:29 +00002445 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002446 if (setpgid(pid, pgrp) < 0)
2447 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002448 Py_INCREF(Py_None);
2449 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002450}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002451#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00002452
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002453
Guido van Rossumb6775db1994-08-01 11:34:53 +00002454#ifdef HAVE_TCGETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002455static char posix_tcgetpgrp__doc__[] =
2456"tcgetpgrp(fd) -> pgid\n\
2457Return the process group associated with the terminal given by a fd.";
2458
Barry Warsaw53699e91996-12-10 23:23:01 +00002459static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00002460posix_tcgetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002461 PyObject *self;
2462 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002463{
2464 int fd, pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002465 if (!PyArg_ParseTuple(args, "i:tcgetpgrp", &fd))
Guido van Rossum7066dd71992-09-17 17:54:56 +00002466 return NULL;
2467 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002468 if (pgid < 0)
2469 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002470 return PyInt_FromLong((long)pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00002471}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002472#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00002473
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002474
Guido van Rossumb6775db1994-08-01 11:34:53 +00002475#ifdef HAVE_TCSETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002476static char posix_tcsetpgrp__doc__[] =
2477"tcsetpgrp(fd, pgid) -> None\n\
2478Set the process group associated with the terminal given by a fd.";
2479
Barry Warsaw53699e91996-12-10 23:23:01 +00002480static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00002481posix_tcsetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002482 PyObject *self;
2483 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002484{
2485 int fd, pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002486 if (!PyArg_ParseTuple(args, "ii:tcsetpgrp", &fd, &pgid))
Guido van Rossum7066dd71992-09-17 17:54:56 +00002487 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002488 if (tcsetpgrp(fd, pgid) < 0)
2489 return posix_error();
Barry Warsaw43d68b81996-12-19 22:10:44 +00002490 Py_INCREF(Py_None);
Barry Warsaw53699e91996-12-10 23:23:01 +00002491 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002492}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002493#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00002494
Guido van Rossum687dd131993-05-17 08:34:16 +00002495/* Functions acting on file descriptors */
2496
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002497static char posix_open__doc__[] =
2498"open(filename, flag [, mode=0777]) -> fd\n\
2499Open a file (for low level IO).";
2500
Barry Warsaw53699e91996-12-10 23:23:01 +00002501static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002502posix_open(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002503 PyObject *self;
2504 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002505{
2506 char *file;
2507 int flag;
2508 int mode = 0777;
2509 int fd;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002510 if (!PyArg_ParseTuple(args, "si|i", &file, &flag, &mode))
2511 return NULL;
2512
Barry Warsaw53699e91996-12-10 23:23:01 +00002513 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002514 fd = open(file, flag, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002515 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002516 if (fd < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00002517 return posix_error_with_filename(file);
Barry Warsaw53699e91996-12-10 23:23:01 +00002518 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002519}
2520
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002521
2522static char posix_close__doc__[] =
2523"close(fd) -> None\n\
2524Close a file descriptor (for low level IO).";
2525
Barry Warsaw53699e91996-12-10 23:23:01 +00002526static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002527posix_close(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002528 PyObject *self;
2529 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002530{
2531 int fd, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002532 if (!PyArg_ParseTuple(args, "i:close", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002533 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002534 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002535 res = close(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00002536 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002537 if (res < 0)
2538 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002539 Py_INCREF(Py_None);
2540 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00002541}
2542
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002543
2544static char posix_dup__doc__[] =
2545"dup(fd) -> fd2\n\
2546Return a duplicate of a file descriptor.";
2547
Barry Warsaw53699e91996-12-10 23:23:01 +00002548static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002549posix_dup(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002550 PyObject *self;
2551 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002552{
2553 int fd;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002554 if (!PyArg_ParseTuple(args, "i:dup", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002555 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002556 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002557 fd = dup(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00002558 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002559 if (fd < 0)
2560 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002561 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002562}
2563
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002564
2565static char posix_dup2__doc__[] =
2566"dup2(fd, fd2) -> None\n\
2567Duplicate file descriptor.";
2568
Barry Warsaw53699e91996-12-10 23:23:01 +00002569static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002570posix_dup2(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002571 PyObject *self;
2572 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002573{
2574 int fd, fd2, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002575 if (!PyArg_ParseTuple(args, "ii:dup2", &fd, &fd2))
Guido van Rossum687dd131993-05-17 08:34:16 +00002576 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002577 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002578 res = dup2(fd, fd2);
Barry Warsaw53699e91996-12-10 23:23:01 +00002579 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002580 if (res < 0)
2581 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002582 Py_INCREF(Py_None);
2583 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00002584}
2585
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002586
2587static char posix_lseek__doc__[] =
2588"lseek(fd, pos, how) -> newpos\n\
2589Set the current position of a file descriptor.";
2590
Barry Warsaw53699e91996-12-10 23:23:01 +00002591static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002592posix_lseek(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002593 PyObject *self;
2594 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002595{
2596 int fd, how;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002597 off_t pos, res;
2598 PyObject *posobj;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002599 if (!PyArg_ParseTuple(args, "iOi:lseek", &fd, &posobj, &how))
Guido van Rossum687dd131993-05-17 08:34:16 +00002600 return NULL;
2601#ifdef SEEK_SET
2602 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
2603 switch (how) {
2604 case 0: how = SEEK_SET; break;
2605 case 1: how = SEEK_CUR; break;
2606 case 2: how = SEEK_END; break;
2607 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002608#endif /* SEEK_END */
Guido van Rossum94f6f721999-01-06 18:42:14 +00002609
2610#if !defined(HAVE_LARGEFILE_SUPPORT)
2611 pos = PyInt_AsLong(posobj);
2612#else
2613 pos = PyLong_Check(posobj) ?
2614 PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj);
2615#endif
2616 if (PyErr_Occurred())
2617 return NULL;
2618
Barry Warsaw53699e91996-12-10 23:23:01 +00002619 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002620 res = lseek(fd, pos, how);
Barry Warsaw53699e91996-12-10 23:23:01 +00002621 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002622 if (res < 0)
2623 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00002624
2625#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +00002626 return PyInt_FromLong(res);
Guido van Rossum94f6f721999-01-06 18:42:14 +00002627#else
2628 return PyLong_FromLongLong(res);
2629#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002630}
2631
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002632
2633static char posix_read__doc__[] =
2634"read(fd, buffersize) -> string\n\
2635Read a file descriptor.";
2636
Barry Warsaw53699e91996-12-10 23:23:01 +00002637static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002638posix_read(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002639 PyObject *self;
2640 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002641{
Guido van Rossum8bac5461996-06-11 18:38:48 +00002642 int fd, size, n;
Barry Warsaw53699e91996-12-10 23:23:01 +00002643 PyObject *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002644 if (!PyArg_ParseTuple(args, "ii:read", &fd, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00002645 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002646 buffer = PyString_FromStringAndSize((char *)NULL, size);
Guido van Rossum687dd131993-05-17 08:34:16 +00002647 if (buffer == NULL)
2648 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002649 Py_BEGIN_ALLOW_THREADS
2650 n = read(fd, PyString_AsString(buffer), size);
2651 Py_END_ALLOW_THREADS
Guido van Rossum8bac5461996-06-11 18:38:48 +00002652 if (n < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002653 Py_DECREF(buffer);
Guido van Rossum687dd131993-05-17 08:34:16 +00002654 return posix_error();
2655 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00002656 if (n != size)
Barry Warsaw53699e91996-12-10 23:23:01 +00002657 _PyString_Resize(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00002658 return buffer;
2659}
2660
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002661
2662static char posix_write__doc__[] =
2663"write(fd, string) -> byteswritten\n\
2664Write a string to a file descriptor.";
2665
Barry Warsaw53699e91996-12-10 23:23:01 +00002666static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002667posix_write(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002668 PyObject *self;
2669 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002670{
2671 int fd, size;
2672 char *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002673 if (!PyArg_ParseTuple(args, "is#:write", &fd, &buffer, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00002674 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002675 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002676 size = write(fd, buffer, size);
Barry Warsaw53699e91996-12-10 23:23:01 +00002677 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002678 if (size < 0)
2679 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002680 return PyInt_FromLong((long)size);
Guido van Rossum687dd131993-05-17 08:34:16 +00002681}
2682
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002683
2684static char posix_fstat__doc__[]=
2685"fstat(fd) -> (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\
2686Like stat(), but for an open file descriptor.";
2687
Barry Warsaw53699e91996-12-10 23:23:01 +00002688static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002689posix_fstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002690 PyObject *self;
2691 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002692{
2693 int fd;
2694 struct stat st;
2695 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002696 if (!PyArg_ParseTuple(args, "i:fstat", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002697 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002698 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002699 res = fstat(fd, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00002700 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002701 if (res != 0)
2702 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00002703#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +00002704 return Py_BuildValue("(llllllllll)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00002705 (long)st.st_mode,
2706 (long)st.st_ino,
2707 (long)st.st_dev,
2708 (long)st.st_nlink,
2709 (long)st.st_uid,
2710 (long)st.st_gid,
2711 (long)st.st_size,
2712 (long)st.st_atime,
2713 (long)st.st_mtime,
2714 (long)st.st_ctime);
Guido van Rossum94f6f721999-01-06 18:42:14 +00002715#else
2716 return Py_BuildValue("(lLllllLlll)",
2717 (long)st.st_mode,
2718 (LONG_LONG)st.st_ino,
2719 (long)st.st_dev,
2720 (long)st.st_nlink,
2721 (long)st.st_uid,
2722 (long)st.st_gid,
2723 (LONG_LONG)st.st_size,
2724 (long)st.st_atime,
2725 (long)st.st_mtime,
2726 (long)st.st_ctime);
2727#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002728}
2729
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002730
2731static char posix_fdopen__doc__[] =
2732"fdopen(fd, [, mode='r' [, bufsize]]) -> file_object\n\
2733Return an open file object connected to a file descriptor.";
2734
Barry Warsaw53699e91996-12-10 23:23:01 +00002735static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002736posix_fdopen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002737 PyObject *self;
2738 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002739{
Barry Warsaw53699e91996-12-10 23:23:01 +00002740 extern int fclose Py_PROTO((FILE *));
Guido van Rossum687dd131993-05-17 08:34:16 +00002741 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002742 char *mode = "r";
2743 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00002744 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002745 PyObject *f;
2746 if (!PyArg_ParseTuple(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00002747 return NULL;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002748
Barry Warsaw53699e91996-12-10 23:23:01 +00002749 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002750 fp = fdopen(fd, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002751 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002752 if (fp == NULL)
2753 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002754 f = PyFile_FromFile(fp, "(fdopen)", mode, fclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002755 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002756 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002757 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00002758}
2759
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002760
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002761#ifdef HAVE_PIPE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002762static char posix_pipe__doc__[] =
2763"pipe() -> (read_end, write_end)\n\
2764Create a pipe.";
2765
Barry Warsaw53699e91996-12-10 23:23:01 +00002766static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002767posix_pipe(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002768 PyObject *self;
2769 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002770{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002771#if defined(PYOS_OS2)
2772 HFILE read, write;
2773 APIRET rc;
2774
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002775 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002776 return NULL;
2777
2778 Py_BEGIN_ALLOW_THREADS
2779 rc = DosCreatePipe( &read, &write, 4096);
2780 Py_END_ALLOW_THREADS
2781 if (rc != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002782 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002783
2784 return Py_BuildValue("(ii)", read, write);
2785#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002786#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00002787 int fds[2];
2788 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002789 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum687dd131993-05-17 08:34:16 +00002790 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002791 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002792 res = pipe(fds);
Barry Warsaw53699e91996-12-10 23:23:01 +00002793 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002794 if (res != 0)
2795 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002796 return Py_BuildValue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002797#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00002798 HANDLE read, write;
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002799 int read_fd, write_fd;
Guido van Rossum794d8131994-08-23 13:48:48 +00002800 BOOL ok;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002801 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum794d8131994-08-23 13:48:48 +00002802 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002803 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002804 ok = CreatePipe(&read, &write, NULL, 0);
Barry Warsaw53699e91996-12-10 23:23:01 +00002805 Py_END_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00002806 if (!ok)
2807 return posix_error();
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002808 read_fd = _open_osfhandle((long)read, 0);
2809 write_fd = _open_osfhandle((long)write, 1);
2810 return Py_BuildValue("(ii)", read_fd, write_fd);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002811#endif /* MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002812#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002813}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002814#endif /* HAVE_PIPE */
2815
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002816
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002817#ifdef HAVE_MKFIFO
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002818static char posix_mkfifo__doc__[] =
2819"mkfifo(file, [, mode=0666]) -> None\n\
2820Create a FIFO (a POSIX named pipe).";
2821
Barry Warsaw53699e91996-12-10 23:23:01 +00002822static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002823posix_mkfifo(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002824 PyObject *self;
2825 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002826{
2827 char *file;
2828 int mode = 0666;
2829 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002830 if (!PyArg_ParseTuple(args, "s|i:mkfifo", &file, &mode))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002831 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002832 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002833 res = mkfifo(file, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002834 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002835 if (res < 0)
2836 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002837 Py_INCREF(Py_None);
2838 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002839}
2840#endif
2841
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002842
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002843#ifdef HAVE_FTRUNCATE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002844static char posix_ftruncate__doc__[] =
2845"ftruncate(fd, length) -> None\n\
2846Truncate a file to a specified length.";
2847
Barry Warsaw53699e91996-12-10 23:23:01 +00002848static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002849posix_ftruncate(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002850 PyObject *self; /* Not used */
2851 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002852{
2853 int fd;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002854 off_t length;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002855 int res;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002856 PyObject *lenobj;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002857
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002858 if (!PyArg_ParseTuple(args, "iO:ftruncate", &fd, &lenobj))
Guido van Rossum94f6f721999-01-06 18:42:14 +00002859 return NULL;
2860
2861#if !defined(HAVE_LARGEFILE_SUPPORT)
2862 length = PyInt_AsLong(lenobj);
2863#else
2864 length = PyLong_Check(lenobj) ?
2865 PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj);
2866#endif
2867 if (PyErr_Occurred())
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002868 return NULL;
2869
Barry Warsaw53699e91996-12-10 23:23:01 +00002870 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002871 res = ftruncate(fd, length);
Barry Warsaw53699e91996-12-10 23:23:01 +00002872 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002873 if (res < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002874 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002875 return NULL;
2876 }
Barry Warsaw53699e91996-12-10 23:23:01 +00002877 Py_INCREF(Py_None);
2878 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002879}
2880#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002881
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002882#ifdef NeXT
2883#define HAVE_PUTENV
2884/* Steve Spicklemire got this putenv from NeXTAnswers */
2885static int
2886putenv(char *newval)
2887{
2888 extern char **environ;
2889
2890 static int firstTime = 1;
2891 char **ep;
2892 char *cp;
2893 int esiz;
2894 char *np;
2895
2896 if (!(np = strchr(newval, '=')))
2897 return 1;
2898 *np = '\0';
2899
2900 /* look it up */
2901 for (ep=environ ; *ep ; ep++)
2902 {
2903 /* this should always be true... */
2904 if (cp = strchr(*ep, '='))
2905 {
2906 *cp = '\0';
2907 if (!strcmp(*ep, newval))
2908 {
2909 /* got it! */
2910 *cp = '=';
2911 break;
2912 }
2913 *cp = '=';
2914 }
2915 else
2916 {
2917 *np = '=';
2918 return 1;
2919 }
2920 }
2921
2922 *np = '=';
2923 if (*ep)
2924 {
2925 /* the string was already there:
2926 just replace it with the new one */
2927 *ep = newval;
2928 return 0;
2929 }
2930
2931 /* expand environ by one */
2932 for (esiz=2, ep=environ ; *ep ; ep++)
2933 esiz++;
2934 if (firstTime)
2935 {
2936 char **epp;
2937 char **newenv;
2938 if (!(newenv = malloc(esiz * sizeof(char *))))
2939 return 1;
2940
2941 for (ep=environ, epp=newenv ; *ep ;)
2942 *epp++ = *ep++;
2943 *epp++ = newval;
2944 *epp = (char *) 0;
2945 environ = newenv;
2946 }
2947 else
2948 {
2949 if (!(environ = realloc(environ, esiz * sizeof(char *))))
2950 return 1;
2951 environ[esiz - 2] = newval;
2952 environ[esiz - 1] = (char *) 0;
2953 firstTime = 0;
2954 }
2955
2956 return 0;
2957}
Guido van Rossumc6ef2041997-08-21 02:30:45 +00002958#endif /* NeXT */
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002959
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002960
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002961#ifdef HAVE_PUTENV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002962static char posix_putenv__doc__[] =
2963"putenv(key, value) -> None\n\
2964Change or add an environment variable.";
2965
Guido van Rossumbcc20741998-08-04 22:53:56 +00002966#ifdef __BEOS__
2967/* We have putenv(), but not in the headers (as of PR2). - [cjh] */
2968int putenv( const char *str );
2969#endif
2970
Fred Drake762e2061999-08-26 17:23:54 +00002971/* Save putenv() parameters as values here, so we can collect them when they
2972 * get re-set with another call for the same key. */
2973static PyObject *posix_putenv_garbage;
2974
Barry Warsaw53699e91996-12-10 23:23:01 +00002975static PyObject *
Guido van Rossumb6a47161997-09-15 22:54:34 +00002976posix_putenv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002977 PyObject *self;
2978 PyObject *args;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002979{
2980 char *s1, *s2;
2981 char *new;
Fred Drake762e2061999-08-26 17:23:54 +00002982 PyObject *newstr;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002983
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002984 if (!PyArg_ParseTuple(args, "ss:putenv", &s1, &s2))
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002985 return NULL;
Guido van Rossumd48f2521997-12-05 22:19:34 +00002986
2987#if defined(PYOS_OS2)
2988 if (stricmp(s1, "BEGINLIBPATH") == 0) {
2989 APIRET rc;
2990
2991 if (strlen(s2) == 0) /* If New Value is an Empty String */
2992 s2 = NULL; /* Then OS/2 API Wants a NULL to Undefine It */
2993
2994 rc = DosSetExtLIBPATH(s2, BEGIN_LIBPATH);
2995 if (rc != NO_ERROR)
2996 return os2_error(rc);
2997
2998 } else if (stricmp(s1, "ENDLIBPATH") == 0) {
2999 APIRET rc;
3000
3001 if (strlen(s2) == 0) /* If New Value is an Empty String */
3002 s2 = NULL; /* Then OS/2 API Wants a NULL to Undefine It */
3003
3004 rc = DosSetExtLIBPATH(s2, END_LIBPATH);
3005 if (rc != NO_ERROR)
3006 return os2_error(rc);
3007 } else {
3008#endif
3009
Fred Drake762e2061999-08-26 17:23:54 +00003010 /* XXX This can leak memory -- not easy to fix :-( */
3011 newstr = PyString_FromStringAndSize(NULL, strlen(s1) + strlen(s2) + 2);
3012 if (newstr == NULL)
3013 return PyErr_NoMemory();
3014 new = PyString_AS_STRING(newstr);
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003015 (void) sprintf(new, "%s=%s", s1, s2);
3016 if (putenv(new)) {
3017 posix_error();
3018 return NULL;
3019 }
Fred Drake762e2061999-08-26 17:23:54 +00003020 /* Install the first arg and newstr in posix_putenv_garbage;
3021 * this will cause previous value to be collected. This has to
3022 * happen after the real putenv() call because the old value
3023 * was still accessible until then. */
3024 if (PyDict_SetItem(posix_putenv_garbage,
3025 PyTuple_GET_ITEM(args, 0), newstr)) {
3026 /* really not much we can do; just leak */
3027 PyErr_Clear();
3028 }
3029 else {
3030 Py_DECREF(newstr);
3031 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00003032
3033#if defined(PYOS_OS2)
3034 }
3035#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00003036 Py_INCREF(Py_None);
3037 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003038}
Guido van Rossumb6a47161997-09-15 22:54:34 +00003039#endif /* putenv */
3040
3041#ifdef HAVE_STRERROR
3042static char posix_strerror__doc__[] =
3043"strerror(code) -> string\n\
3044Translate an error code to a message string.";
3045
3046PyObject *
3047posix_strerror(self, args)
3048 PyObject *self;
3049 PyObject *args;
3050{
3051 int code;
3052 char *message;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003053 if (!PyArg_ParseTuple(args, "i:strerror", &code))
Guido van Rossumb6a47161997-09-15 22:54:34 +00003054 return NULL;
3055 message = strerror(code);
3056 if (message == NULL) {
3057 PyErr_SetString(PyExc_ValueError,
3058 "strerror code out of range");
3059 return NULL;
3060 }
3061 return PyString_FromString(message);
3062}
3063#endif /* strerror */
3064
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003065
Guido van Rossumc9641791998-08-04 15:26:23 +00003066#ifdef HAVE_SYS_WAIT_H
3067
3068#ifdef WIFSTOPPED
3069static char posix_WIFSTOPPED__doc__[] =
3070"WIFSTOPPED(status) -> Boolean\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003071Return true if the process returning 'status' was stopped.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003072
3073static PyObject *
3074posix_WIFSTOPPED(self, args)
3075 PyObject *self;
3076 PyObject *args;
3077{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003078#ifdef UNION_WAIT
3079 union wait status;
3080#define status_i (status.w_status)
3081#else
3082 int status;
3083#define status_i status
3084#endif
3085 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003086
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003087 if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003088 {
3089 return NULL;
3090 }
3091
3092 return Py_BuildValue("i", WIFSTOPPED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003093#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003094}
3095#endif /* WIFSTOPPED */
3096
3097#ifdef WIFSIGNALED
3098static char posix_WIFSIGNALED__doc__[] =
3099"WIFSIGNALED(status) -> Boolean\n\
Guido van Rossum3366d1c1999-02-23 18:34:43 +00003100Return true if the process returning 'status' was terminated by a signal.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003101
3102static PyObject *
3103posix_WIFSIGNALED(self, args)
3104 PyObject *self;
3105 PyObject *args;
3106{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003107#ifdef UNION_WAIT
3108 union wait status;
3109#define status_i (status.w_status)
3110#else
3111 int status;
3112#define status_i status
3113#endif
3114 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003115
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003116 if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003117 {
3118 return NULL;
3119 }
3120
3121 return Py_BuildValue("i", WIFSIGNALED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003122#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003123}
3124#endif /* WIFSIGNALED */
3125
3126#ifdef WIFEXITED
3127static char posix_WIFEXITED__doc__[] =
3128"WIFEXITED(status) -> Boolean\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003129Return true if the process returning 'status' exited using the exit()\n\
3130system call.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003131
3132static PyObject *
3133posix_WIFEXITED(self, args)
3134 PyObject *self;
3135 PyObject *args;
3136{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003137#ifdef UNION_WAIT
3138 union wait status;
3139#define status_i (status.w_status)
3140#else
3141 int status;
3142#define status_i status
3143#endif
3144 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003145
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003146 if (!PyArg_ParseTuple(args, "i:WIFEXITED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003147 {
3148 return NULL;
3149 }
3150
3151 return Py_BuildValue("i", WIFEXITED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003152#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003153}
3154#endif /* WIFEXITED */
3155
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003156#ifdef WEXITSTATUS
Guido van Rossumc9641791998-08-04 15:26:23 +00003157static char posix_WEXITSTATUS__doc__[] =
3158"WEXITSTATUS(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003159Return the process return code from 'status'.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003160
3161static PyObject *
3162posix_WEXITSTATUS(self, args)
3163 PyObject *self;
3164 PyObject *args;
3165{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003166#ifdef UNION_WAIT
3167 union wait status;
3168#define status_i (status.w_status)
3169#else
3170 int status;
3171#define status_i status
3172#endif
3173 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003174
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003175 if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003176 {
3177 return NULL;
3178 }
3179
3180 return Py_BuildValue("i", WEXITSTATUS(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003181#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003182}
3183#endif /* WEXITSTATUS */
3184
3185#ifdef WTERMSIG
3186static char posix_WTERMSIG__doc__[] =
3187"WTERMSIG(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003188Return the signal that terminated the process that provided the 'status'\n\
3189value.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003190
3191static PyObject *
3192posix_WTERMSIG(self, args)
3193 PyObject *self;
3194 PyObject *args;
3195{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003196#ifdef UNION_WAIT
3197 union wait status;
3198#define status_i (status.w_status)
3199#else
3200 int status;
3201#define status_i status
3202#endif
3203 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003204
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003205 if (!PyArg_ParseTuple(args, "i:WTERMSIG", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003206 {
3207 return NULL;
3208 }
3209
3210 return Py_BuildValue("i", WTERMSIG(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003211#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003212}
3213#endif /* WTERMSIG */
3214
3215#ifdef WSTOPSIG
3216static char posix_WSTOPSIG__doc__[] =
3217"WSTOPSIG(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003218Return the signal that stopped the process that provided the 'status' value.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003219
3220static PyObject *
3221posix_WSTOPSIG(self, args)
3222 PyObject *self;
3223 PyObject *args;
3224{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003225#ifdef UNION_WAIT
3226 union wait status;
3227#define status_i (status.w_status)
3228#else
3229 int status;
3230#define status_i status
3231#endif
3232 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003233
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003234 if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003235 {
3236 return NULL;
3237 }
3238
3239 return Py_BuildValue("i", WSTOPSIG(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003240#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003241}
3242#endif /* WSTOPSIG */
3243
3244#endif /* HAVE_SYS_WAIT_H */
3245
3246
Guido van Rossum94f6f721999-01-06 18:42:14 +00003247#if defined(HAVE_FSTATVFS)
Guido van Rossumd5753e11999-10-19 13:29:23 +00003248#ifdef _SCO_DS
3249/* SCO OpenServer 5.0 and later requires _SVID3 before it reveals the
3250 needed definitions in sys/statvfs.h */
3251#define _SVID3
3252#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00003253#include <sys/statvfs.h>
3254
3255static char posix_fstatvfs__doc__[] =
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003256"fstatvfs(fd) -> \n\
3257 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +00003258Perform an fstatvfs system call on the given fd.";
3259
3260static PyObject *
3261posix_fstatvfs(self, args)
3262 PyObject *self;
3263 PyObject *args;
3264{
3265 int fd, res;
3266 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003267 if (!PyArg_ParseTuple(args, "i:fstatvfs", &fd))
Guido van Rossum94f6f721999-01-06 18:42:14 +00003268 return NULL;
3269 Py_BEGIN_ALLOW_THREADS
3270 res = fstatvfs(fd, &st);
3271 Py_END_ALLOW_THREADS
3272 if (res != 0)
3273 return posix_error();
3274#if !defined(HAVE_LARGEFILE_SUPPORT)
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003275 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003276 (long) st.f_bsize,
3277 (long) st.f_frsize,
3278 (long) st.f_blocks,
3279 (long) st.f_bfree,
3280 (long) st.f_bavail,
3281 (long) st.f_files,
3282 (long) st.f_ffree,
3283 (long) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003284 (long) st.f_flag,
3285 (long) st.f_namemax);
3286#else
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003287 return Py_BuildValue("(llLLLLLLll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003288 (long) st.f_bsize,
3289 (long) st.f_frsize,
3290 (LONG_LONG) st.f_blocks,
3291 (LONG_LONG) st.f_bfree,
3292 (LONG_LONG) st.f_bavail,
3293 (LONG_LONG) st.f_files,
3294 (LONG_LONG) st.f_ffree,
3295 (LONG_LONG) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003296 (long) st.f_flag,
3297 (long) st.f_namemax);
3298#endif
3299}
3300#endif /* HAVE_FSTATVFS */
3301
3302
3303#if defined(HAVE_STATVFS)
3304#include <sys/statvfs.h>
3305
3306static char posix_statvfs__doc__[] =
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003307"statvfs(path) -> \n\
3308 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +00003309Perform a statvfs system call on the given path.";
3310
3311static PyObject *
3312posix_statvfs(self, args)
3313 PyObject *self;
3314 PyObject *args;
3315{
3316 char *path;
3317 int res;
3318 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003319 if (!PyArg_ParseTuple(args, "s:statvfs", &path))
Guido van Rossum94f6f721999-01-06 18:42:14 +00003320 return NULL;
3321 Py_BEGIN_ALLOW_THREADS
3322 res = statvfs(path, &st);
3323 Py_END_ALLOW_THREADS
3324 if (res != 0)
3325 return posix_error_with_filename(path);
3326#if !defined(HAVE_LARGEFILE_SUPPORT)
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003327 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003328 (long) st.f_bsize,
3329 (long) st.f_frsize,
3330 (long) st.f_blocks,
3331 (long) st.f_bfree,
3332 (long) st.f_bavail,
3333 (long) st.f_files,
3334 (long) st.f_ffree,
3335 (long) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003336 (long) st.f_flag,
3337 (long) st.f_namemax);
3338#else /* HAVE_LARGEFILE_SUPPORT */
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003339 return Py_BuildValue("(llLLLLLLll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003340 (long) st.f_bsize,
3341 (long) st.f_frsize,
3342 (LONG_LONG) st.f_blocks,
3343 (LONG_LONG) st.f_bfree,
3344 (LONG_LONG) st.f_bavail,
3345 (LONG_LONG) st.f_files,
3346 (LONG_LONG) st.f_ffree,
3347 (LONG_LONG) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003348 (long) st.f_flag,
3349 (long) st.f_namemax);
3350#endif
3351}
3352#endif /* HAVE_STATVFS */
3353
3354
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003355#ifdef HAVE_TEMPNAM
3356static char posix_tempnam__doc__[] = "\
3357tempnam([dir[, prefix]]) -> string\n\
3358Return a unique name for a temporary file.\n\
3359The directory and a short may be specified as strings; they may be omitted\n\
3360or None if not needed.";
3361
3362static PyObject *
3363posix_tempnam(self, args)
3364 PyObject *self;
3365 PyObject *args;
3366{
3367 PyObject *result = NULL;
3368 char *dir = NULL;
3369 char *pfx = NULL;
3370 char *name;
3371
3372 if (!PyArg_ParseTuple(args, "|zz:tempnam", &dir, &pfx))
3373 return NULL;
3374 name = tempnam(dir, pfx);
3375 if (name == NULL)
3376 return PyErr_NoMemory();
3377 result = PyString_FromString(name);
3378 free(name);
3379 return result;
3380}
Guido van Rossumd371ff11999-01-25 16:12:23 +00003381#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003382
3383
3384#ifdef HAVE_TMPFILE
3385static char posix_tmpfile__doc__[] = "\
3386tmpfile() -> file object\n\
3387Create a temporary file with no directory entries.";
3388
3389static PyObject *
3390posix_tmpfile(self, args)
3391 PyObject *self;
3392 PyObject *args;
3393{
3394 FILE *fp;
3395
3396 if (!PyArg_ParseTuple(args, ":tmpfile"))
3397 return NULL;
3398 fp = tmpfile();
3399 if (fp == NULL)
3400 return posix_error();
3401 return PyFile_FromFile(fp, "<tmpfile>", "w+", fclose);
3402}
3403#endif
3404
3405
3406#ifdef HAVE_TMPNAM
3407static char posix_tmpnam__doc__[] = "\
3408tmpnam() -> string\n\
3409Return a unique name for a temporary file.";
3410
3411static PyObject *
3412posix_tmpnam(self, args)
3413 PyObject *self;
3414 PyObject *args;
3415{
3416 char buffer[L_tmpnam];
3417 char *name;
3418
3419 if (!PyArg_ParseTuple(args, ":tmpnam"))
3420 return NULL;
Greg Wardb48bc172000-03-01 21:51:56 +00003421#ifdef USE_TMPNAM_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003422 name = tmpnam_r(buffer);
3423#else
3424 name = tmpnam(buffer);
3425#endif
3426 if (name == NULL) {
3427 PyErr_SetObject(PyExc_OSError,
3428 Py_BuildValue("is", 0,
Greg Wardb48bc172000-03-01 21:51:56 +00003429#ifdef USE_TMPNAM_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003430 "unexpected NULL from tmpnam_r"
3431#else
3432 "unexpected NULL from tmpnam"
3433#endif
3434 ));
3435 return NULL;
3436 }
3437 return PyString_FromString(buffer);
3438}
3439#endif
3440
3441
Fred Drakec9680921999-12-13 16:37:25 +00003442/* This is used for fpathconf(), pathconf(), confstr() and sysconf().
3443 * It maps strings representing configuration variable names to
3444 * integer values, allowing those functions to be called with the
3445 * magic names instead of poluting the module's namespace with tons of
Fred Drake12c6e2d1999-12-14 21:25:03 +00003446 * rarely-used constants. There are three separate tables that use
3447 * these definitions.
Fred Drakebec628d1999-12-15 18:31:10 +00003448 *
3449 * This code is always included, even if none of the interfaces that
3450 * need it are included. The #if hackery needed to avoid it would be
3451 * sufficiently pervasive that it's not worth the loss of readability.
Fred Drakec9680921999-12-13 16:37:25 +00003452 */
3453struct constdef {
3454 char *name;
3455 long value;
3456};
3457
Fred Drake12c6e2d1999-12-14 21:25:03 +00003458static int
3459conv_confname(arg, valuep, table, tablesize)
3460 PyObject *arg;
3461 int *valuep;
3462 struct constdef *table;
3463 size_t tablesize;
3464{
3465 if (PyInt_Check(arg)) {
3466 *valuep = PyInt_AS_LONG(arg);
3467 return 1;
3468 }
3469 if (PyString_Check(arg)) {
3470 /* look up the value in the table using a binary search */
3471 int lo = 0;
3472 int hi = tablesize;
3473 int cmp, mid;
3474 char *confname = PyString_AS_STRING(arg);
3475 while (lo < hi) {
3476 mid = (lo + hi) / 2;
3477 cmp = strcmp(confname, table[mid].name);
3478 if (cmp < 0)
3479 hi = mid;
3480 else if (cmp > 0)
3481 lo = mid + 1;
3482 else {
3483 *valuep = table[mid].value;
3484 return 1;
3485 }
3486 }
3487 PyErr_SetString(PyExc_ValueError, "unrecognized configuration name");
3488 }
3489 else
3490 PyErr_SetString(PyExc_TypeError,
3491 "configuration names must be strings or integers");
3492 return 0;
3493}
3494
3495
3496#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
3497static struct constdef posix_constants_pathconf[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003498#ifdef _PC_ABI_AIO_XFER_MAX
3499 {"PC_ABI_AIO_XFER_MAX", _PC_ABI_AIO_XFER_MAX},
3500#endif
3501#ifdef _PC_ABI_ASYNC_IO
3502 {"PC_ABI_ASYNC_IO", _PC_ABI_ASYNC_IO},
3503#endif
Fred Drakec9680921999-12-13 16:37:25 +00003504#ifdef _PC_ASYNC_IO
3505 {"PC_ASYNC_IO", _PC_ASYNC_IO},
3506#endif
3507#ifdef _PC_CHOWN_RESTRICTED
3508 {"PC_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED},
3509#endif
3510#ifdef _PC_FILESIZEBITS
3511 {"PC_FILESIZEBITS", _PC_FILESIZEBITS},
3512#endif
3513#ifdef _PC_LAST
3514 {"PC_LAST", _PC_LAST},
3515#endif
3516#ifdef _PC_LINK_MAX
3517 {"PC_LINK_MAX", _PC_LINK_MAX},
3518#endif
3519#ifdef _PC_MAX_CANON
3520 {"PC_MAX_CANON", _PC_MAX_CANON},
3521#endif
3522#ifdef _PC_MAX_INPUT
3523 {"PC_MAX_INPUT", _PC_MAX_INPUT},
3524#endif
3525#ifdef _PC_NAME_MAX
3526 {"PC_NAME_MAX", _PC_NAME_MAX},
3527#endif
3528#ifdef _PC_NO_TRUNC
3529 {"PC_NO_TRUNC", _PC_NO_TRUNC},
3530#endif
3531#ifdef _PC_PATH_MAX
3532 {"PC_PATH_MAX", _PC_PATH_MAX},
3533#endif
3534#ifdef _PC_PIPE_BUF
3535 {"PC_PIPE_BUF", _PC_PIPE_BUF},
3536#endif
3537#ifdef _PC_PRIO_IO
3538 {"PC_PRIO_IO", _PC_PRIO_IO},
3539#endif
3540#ifdef _PC_SOCK_MAXBUF
3541 {"PC_SOCK_MAXBUF", _PC_SOCK_MAXBUF},
3542#endif
3543#ifdef _PC_SYNC_IO
3544 {"PC_SYNC_IO", _PC_SYNC_IO},
3545#endif
3546#ifdef _PC_VDISABLE
3547 {"PC_VDISABLE", _PC_VDISABLE},
3548#endif
3549};
3550
Fred Drakec9680921999-12-13 16:37:25 +00003551static int
3552conv_path_confname(arg, valuep)
3553 PyObject *arg;
3554 int *valuep;
3555{
3556 return conv_confname(arg, valuep, posix_constants_pathconf,
3557 sizeof(posix_constants_pathconf)
3558 / sizeof(struct constdef));
3559}
3560#endif
3561
3562#ifdef HAVE_FPATHCONF
3563static char posix_fpathconf__doc__[] = "\
3564fpathconf(fd, name) -> integer\n\
3565Return the configuration limit name for the file descriptor fd.\n\
3566If there is no limit, return -1.";
3567
3568static PyObject *
3569posix_fpathconf(self, args)
3570 PyObject *self;
3571 PyObject *args;
3572{
3573 PyObject *result = NULL;
3574 int name, fd;
3575
Fred Drake12c6e2d1999-12-14 21:25:03 +00003576 if (PyArg_ParseTuple(args, "iO&:fpathconf", &fd,
3577 conv_path_confname, &name)) {
Fred Drakec9680921999-12-13 16:37:25 +00003578 long limit;
3579
3580 errno = 0;
3581 limit = fpathconf(fd, name);
3582 if (limit == -1 && errno != 0)
3583 posix_error();
3584 else
3585 result = PyInt_FromLong(limit);
3586 }
3587 return result;
3588}
3589#endif
3590
3591
3592#ifdef HAVE_PATHCONF
3593static char posix_pathconf__doc__[] = "\
3594pathconf(path, name) -> integer\n\
3595Return the configuration limit name for the file or directory path.\n\
3596If there is no limit, return -1.";
3597
3598static PyObject *
3599posix_pathconf(self, args)
3600 PyObject *self;
3601 PyObject *args;
3602{
3603 PyObject *result = NULL;
3604 int name;
3605 char *path;
3606
3607 if (PyArg_ParseTuple(args, "sO&:pathconf", &path,
3608 conv_path_confname, &name)) {
3609 long limit;
3610
3611 errno = 0;
3612 limit = pathconf(path, name);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003613 if (limit == -1 && errno != 0) {
Fred Drakec9680921999-12-13 16:37:25 +00003614 if (errno == EINVAL)
3615 /* could be a path or name problem */
3616 posix_error();
3617 else
3618 posix_error_with_filename(path);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003619 }
Fred Drakec9680921999-12-13 16:37:25 +00003620 else
3621 result = PyInt_FromLong(limit);
3622 }
3623 return result;
3624}
3625#endif
3626
3627#ifdef HAVE_CONFSTR
3628static struct constdef posix_constants_confstr[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003629#ifdef _CS_ARCHITECTURE
3630 {"CS_ARCHITECTURE", _CS_ARCHITECTURE},
3631#endif
3632#ifdef _CS_HOSTNAME
3633 {"CS_HOSTNAME", _CS_HOSTNAME},
3634#endif
3635#ifdef _CS_HW_PROVIDER
3636 {"CS_HW_PROVIDER", _CS_HW_PROVIDER},
3637#endif
3638#ifdef _CS_HW_SERIAL
3639 {"CS_HW_SERIAL", _CS_HW_SERIAL},
3640#endif
3641#ifdef _CS_INITTAB_NAME
3642 {"CS_INITTAB_NAME", _CS_INITTAB_NAME},
3643#endif
Fred Drakec9680921999-12-13 16:37:25 +00003644#ifdef _CS_LFS64_CFLAGS
3645 {"CS_LFS64_CFLAGS", _CS_LFS64_CFLAGS},
3646#endif
3647#ifdef _CS_LFS64_LDFLAGS
3648 {"CS_LFS64_LDFLAGS", _CS_LFS64_LDFLAGS},
3649#endif
3650#ifdef _CS_LFS64_LIBS
3651 {"CS_LFS64_LIBS", _CS_LFS64_LIBS},
3652#endif
3653#ifdef _CS_LFS64_LINTFLAGS
3654 {"CS_LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS},
3655#endif
3656#ifdef _CS_LFS_CFLAGS
3657 {"CS_LFS_CFLAGS", _CS_LFS_CFLAGS},
3658#endif
3659#ifdef _CS_LFS_LDFLAGS
3660 {"CS_LFS_LDFLAGS", _CS_LFS_LDFLAGS},
3661#endif
3662#ifdef _CS_LFS_LIBS
3663 {"CS_LFS_LIBS", _CS_LFS_LIBS},
3664#endif
3665#ifdef _CS_LFS_LINTFLAGS
3666 {"CS_LFS_LINTFLAGS", _CS_LFS_LINTFLAGS},
3667#endif
Fred Draked86ed291999-12-15 15:34:33 +00003668#ifdef _CS_MACHINE
3669 {"CS_MACHINE", _CS_MACHINE},
3670#endif
Fred Drakec9680921999-12-13 16:37:25 +00003671#ifdef _CS_PATH
3672 {"CS_PATH", _CS_PATH},
3673#endif
Fred Draked86ed291999-12-15 15:34:33 +00003674#ifdef _CS_RELEASE
3675 {"CS_RELEASE", _CS_RELEASE},
3676#endif
3677#ifdef _CS_SRPC_DOMAIN
3678 {"CS_SRPC_DOMAIN", _CS_SRPC_DOMAIN},
3679#endif
3680#ifdef _CS_SYSNAME
3681 {"CS_SYSNAME", _CS_SYSNAME},
3682#endif
3683#ifdef _CS_VERSION
3684 {"CS_VERSION", _CS_VERSION},
3685#endif
Fred Drakec9680921999-12-13 16:37:25 +00003686#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS
3687 {"CS_XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS},
3688#endif
3689#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS
3690 {"CS_XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS},
3691#endif
3692#ifdef _CS_XBS5_ILP32_OFF32_LIBS
3693 {"CS_XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS},
3694#endif
3695#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS
3696 {"CS_XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS},
3697#endif
3698#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS
3699 {"CS_XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS},
3700#endif
3701#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS
3702 {"CS_XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS},
3703#endif
3704#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS
3705 {"CS_XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS},
3706#endif
3707#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
3708 {"CS_XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS},
3709#endif
3710#ifdef _CS_XBS5_LP64_OFF64_CFLAGS
3711 {"CS_XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS},
3712#endif
3713#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS
3714 {"CS_XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS},
3715#endif
3716#ifdef _CS_XBS5_LP64_OFF64_LIBS
3717 {"CS_XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS},
3718#endif
3719#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS
3720 {"CS_XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS},
3721#endif
3722#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS
3723 {"CS_XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS},
3724#endif
3725#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
3726 {"CS_XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS},
3727#endif
3728#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS
3729 {"CS_XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS},
3730#endif
3731#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
3732 {"CS_XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS},
3733#endif
Fred Draked86ed291999-12-15 15:34:33 +00003734#ifdef _MIPS_CS_AVAIL_PROCESSORS
3735 {"MIPS_CS_AVAIL_PROCESSORS", _MIPS_CS_AVAIL_PROCESSORS},
3736#endif
3737#ifdef _MIPS_CS_BASE
3738 {"MIPS_CS_BASE", _MIPS_CS_BASE},
3739#endif
3740#ifdef _MIPS_CS_HOSTID
3741 {"MIPS_CS_HOSTID", _MIPS_CS_HOSTID},
3742#endif
3743#ifdef _MIPS_CS_HW_NAME
3744 {"MIPS_CS_HW_NAME", _MIPS_CS_HW_NAME},
3745#endif
3746#ifdef _MIPS_CS_NUM_PROCESSORS
3747 {"MIPS_CS_NUM_PROCESSORS", _MIPS_CS_NUM_PROCESSORS},
3748#endif
3749#ifdef _MIPS_CS_OSREL_MAJ
3750 {"MIPS_CS_OSREL_MAJ", _MIPS_CS_OSREL_MAJ},
3751#endif
3752#ifdef _MIPS_CS_OSREL_MIN
3753 {"MIPS_CS_OSREL_MIN", _MIPS_CS_OSREL_MIN},
3754#endif
3755#ifdef _MIPS_CS_OSREL_PATCH
3756 {"MIPS_CS_OSREL_PATCH", _MIPS_CS_OSREL_PATCH},
3757#endif
3758#ifdef _MIPS_CS_OS_NAME
3759 {"MIPS_CS_OS_NAME", _MIPS_CS_OS_NAME},
3760#endif
3761#ifdef _MIPS_CS_OS_PROVIDER
3762 {"MIPS_CS_OS_PROVIDER", _MIPS_CS_OS_PROVIDER},
3763#endif
3764#ifdef _MIPS_CS_PROCESSORS
3765 {"MIPS_CS_PROCESSORS", _MIPS_CS_PROCESSORS},
3766#endif
3767#ifdef _MIPS_CS_SERIAL
3768 {"MIPS_CS_SERIAL", _MIPS_CS_SERIAL},
3769#endif
3770#ifdef _MIPS_CS_VENDOR
3771 {"MIPS_CS_VENDOR", _MIPS_CS_VENDOR},
3772#endif
Fred Drakec9680921999-12-13 16:37:25 +00003773};
3774
3775static int
3776conv_confstr_confname(arg, valuep)
3777 PyObject *arg;
3778 int *valuep;
3779{
3780 return conv_confname(arg, valuep, posix_constants_confstr,
3781 sizeof(posix_constants_confstr)
3782 / sizeof(struct constdef));
3783}
3784
3785static char posix_confstr__doc__[] = "\
3786confstr(name) -> string\n\
3787Return a string-valued system configuration variable.";
3788
3789static PyObject *
3790posix_confstr(self, args)
3791 PyObject *self;
3792 PyObject *args;
3793{
3794 PyObject *result = NULL;
3795 int name;
3796 char buffer[64];
3797
3798 if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) {
3799 int len = confstr(name, buffer, sizeof(buffer));
3800
Fred Drakec9680921999-12-13 16:37:25 +00003801 errno = 0;
3802 if (len == 0) {
3803 if (errno != 0)
3804 posix_error();
3805 else
3806 result = PyString_FromString("");
3807 }
3808 else {
3809 if (len >= sizeof(buffer)) {
3810 result = PyString_FromStringAndSize(NULL, len);
3811 if (result != NULL)
3812 confstr(name, PyString_AS_STRING(result), len+1);
3813 }
3814 else
3815 result = PyString_FromString(buffer);
3816 }
3817 }
3818 return result;
3819}
3820#endif
3821
3822
3823#ifdef HAVE_SYSCONF
3824static struct constdef posix_constants_sysconf[] = {
3825#ifdef _SC_2_CHAR_TERM
3826 {"SC_2_CHAR_TERM", _SC_2_CHAR_TERM},
3827#endif
3828#ifdef _SC_2_C_BIND
3829 {"SC_2_C_BIND", _SC_2_C_BIND},
3830#endif
3831#ifdef _SC_2_C_DEV
3832 {"SC_2_C_DEV", _SC_2_C_DEV},
3833#endif
3834#ifdef _SC_2_C_VERSION
3835 {"SC_2_C_VERSION", _SC_2_C_VERSION},
3836#endif
3837#ifdef _SC_2_FORT_DEV
3838 {"SC_2_FORT_DEV", _SC_2_FORT_DEV},
3839#endif
3840#ifdef _SC_2_FORT_RUN
3841 {"SC_2_FORT_RUN", _SC_2_FORT_RUN},
3842#endif
3843#ifdef _SC_2_LOCALEDEF
3844 {"SC_2_LOCALEDEF", _SC_2_LOCALEDEF},
3845#endif
3846#ifdef _SC_2_SW_DEV
3847 {"SC_2_SW_DEV", _SC_2_SW_DEV},
3848#endif
3849#ifdef _SC_2_UPE
3850 {"SC_2_UPE", _SC_2_UPE},
3851#endif
3852#ifdef _SC_2_VERSION
3853 {"SC_2_VERSION", _SC_2_VERSION},
3854#endif
Fred Draked86ed291999-12-15 15:34:33 +00003855#ifdef _SC_ABI_ASYNCHRONOUS_IO
3856 {"SC_ABI_ASYNCHRONOUS_IO", _SC_ABI_ASYNCHRONOUS_IO},
3857#endif
3858#ifdef _SC_ACL
3859 {"SC_ACL", _SC_ACL},
3860#endif
Fred Drakec9680921999-12-13 16:37:25 +00003861#ifdef _SC_AIO_LISTIO_MAX
3862 {"SC_AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX},
3863#endif
Fred Drakec9680921999-12-13 16:37:25 +00003864#ifdef _SC_AIO_MAX
3865 {"SC_AIO_MAX", _SC_AIO_MAX},
3866#endif
3867#ifdef _SC_AIO_PRIO_DELTA_MAX
3868 {"SC_AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX},
3869#endif
3870#ifdef _SC_ARG_MAX
3871 {"SC_ARG_MAX", _SC_ARG_MAX},
3872#endif
3873#ifdef _SC_ASYNCHRONOUS_IO
3874 {"SC_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO},
3875#endif
3876#ifdef _SC_ATEXIT_MAX
3877 {"SC_ATEXIT_MAX", _SC_ATEXIT_MAX},
3878#endif
Fred Draked86ed291999-12-15 15:34:33 +00003879#ifdef _SC_AUDIT
3880 {"SC_AUDIT", _SC_AUDIT},
3881#endif
Fred Drakec9680921999-12-13 16:37:25 +00003882#ifdef _SC_AVPHYS_PAGES
3883 {"SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES},
3884#endif
3885#ifdef _SC_BC_BASE_MAX
3886 {"SC_BC_BASE_MAX", _SC_BC_BASE_MAX},
3887#endif
3888#ifdef _SC_BC_DIM_MAX
3889 {"SC_BC_DIM_MAX", _SC_BC_DIM_MAX},
3890#endif
3891#ifdef _SC_BC_SCALE_MAX
3892 {"SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX},
3893#endif
3894#ifdef _SC_BC_STRING_MAX
3895 {"SC_BC_STRING_MAX", _SC_BC_STRING_MAX},
3896#endif
Fred Draked86ed291999-12-15 15:34:33 +00003897#ifdef _SC_CAP
3898 {"SC_CAP", _SC_CAP},
3899#endif
Fred Drakec9680921999-12-13 16:37:25 +00003900#ifdef _SC_CHARCLASS_NAME_MAX
3901 {"SC_CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX},
3902#endif
3903#ifdef _SC_CHAR_BIT
3904 {"SC_CHAR_BIT", _SC_CHAR_BIT},
3905#endif
3906#ifdef _SC_CHAR_MAX
3907 {"SC_CHAR_MAX", _SC_CHAR_MAX},
3908#endif
3909#ifdef _SC_CHAR_MIN
3910 {"SC_CHAR_MIN", _SC_CHAR_MIN},
3911#endif
3912#ifdef _SC_CHILD_MAX
3913 {"SC_CHILD_MAX", _SC_CHILD_MAX},
3914#endif
3915#ifdef _SC_CLK_TCK
3916 {"SC_CLK_TCK", _SC_CLK_TCK},
3917#endif
3918#ifdef _SC_COHER_BLKSZ
3919 {"SC_COHER_BLKSZ", _SC_COHER_BLKSZ},
3920#endif
3921#ifdef _SC_COLL_WEIGHTS_MAX
3922 {"SC_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX},
3923#endif
3924#ifdef _SC_DCACHE_ASSOC
3925 {"SC_DCACHE_ASSOC", _SC_DCACHE_ASSOC},
3926#endif
3927#ifdef _SC_DCACHE_BLKSZ
3928 {"SC_DCACHE_BLKSZ", _SC_DCACHE_BLKSZ},
3929#endif
3930#ifdef _SC_DCACHE_LINESZ
3931 {"SC_DCACHE_LINESZ", _SC_DCACHE_LINESZ},
3932#endif
3933#ifdef _SC_DCACHE_SZ
3934 {"SC_DCACHE_SZ", _SC_DCACHE_SZ},
3935#endif
3936#ifdef _SC_DCACHE_TBLKSZ
3937 {"SC_DCACHE_TBLKSZ", _SC_DCACHE_TBLKSZ},
3938#endif
3939#ifdef _SC_DELAYTIMER_MAX
3940 {"SC_DELAYTIMER_MAX", _SC_DELAYTIMER_MAX},
3941#endif
3942#ifdef _SC_EQUIV_CLASS_MAX
3943 {"SC_EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX},
3944#endif
3945#ifdef _SC_EXPR_NEST_MAX
3946 {"SC_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX},
3947#endif
3948#ifdef _SC_FSYNC
3949 {"SC_FSYNC", _SC_FSYNC},
3950#endif
3951#ifdef _SC_GETGR_R_SIZE_MAX
3952 {"SC_GETGR_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX},
3953#endif
3954#ifdef _SC_GETPW_R_SIZE_MAX
3955 {"SC_GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX},
3956#endif
3957#ifdef _SC_ICACHE_ASSOC
3958 {"SC_ICACHE_ASSOC", _SC_ICACHE_ASSOC},
3959#endif
3960#ifdef _SC_ICACHE_BLKSZ
3961 {"SC_ICACHE_BLKSZ", _SC_ICACHE_BLKSZ},
3962#endif
3963#ifdef _SC_ICACHE_LINESZ
3964 {"SC_ICACHE_LINESZ", _SC_ICACHE_LINESZ},
3965#endif
3966#ifdef _SC_ICACHE_SZ
3967 {"SC_ICACHE_SZ", _SC_ICACHE_SZ},
3968#endif
Fred Draked86ed291999-12-15 15:34:33 +00003969#ifdef _SC_INF
3970 {"SC_INF", _SC_INF},
3971#endif
Fred Drakec9680921999-12-13 16:37:25 +00003972#ifdef _SC_INT_MAX
3973 {"SC_INT_MAX", _SC_INT_MAX},
3974#endif
3975#ifdef _SC_INT_MIN
3976 {"SC_INT_MIN", _SC_INT_MIN},
3977#endif
3978#ifdef _SC_IOV_MAX
3979 {"SC_IOV_MAX", _SC_IOV_MAX},
3980#endif
Fred Draked86ed291999-12-15 15:34:33 +00003981#ifdef _SC_IP_SECOPTS
3982 {"SC_IP_SECOPTS", _SC_IP_SECOPTS},
3983#endif
Fred Drakec9680921999-12-13 16:37:25 +00003984#ifdef _SC_JOB_CONTROL
3985 {"SC_JOB_CONTROL", _SC_JOB_CONTROL},
3986#endif
Fred Draked86ed291999-12-15 15:34:33 +00003987#ifdef _SC_KERN_POINTERS
3988 {"SC_KERN_POINTERS", _SC_KERN_POINTERS},
3989#endif
3990#ifdef _SC_KERN_SIM
3991 {"SC_KERN_SIM", _SC_KERN_SIM},
3992#endif
Fred Drakec9680921999-12-13 16:37:25 +00003993#ifdef _SC_LINE_MAX
3994 {"SC_LINE_MAX", _SC_LINE_MAX},
3995#endif
3996#ifdef _SC_LOGIN_NAME_MAX
3997 {"SC_LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX},
3998#endif
3999#ifdef _SC_LOGNAME_MAX
4000 {"SC_LOGNAME_MAX", _SC_LOGNAME_MAX},
4001#endif
4002#ifdef _SC_LONG_BIT
4003 {"SC_LONG_BIT", _SC_LONG_BIT},
4004#endif
Fred Draked86ed291999-12-15 15:34:33 +00004005#ifdef _SC_MAC
4006 {"SC_MAC", _SC_MAC},
4007#endif
Fred Drakec9680921999-12-13 16:37:25 +00004008#ifdef _SC_MAPPED_FILES
4009 {"SC_MAPPED_FILES", _SC_MAPPED_FILES},
4010#endif
4011#ifdef _SC_MAXPID
4012 {"SC_MAXPID", _SC_MAXPID},
4013#endif
4014#ifdef _SC_MB_LEN_MAX
4015 {"SC_MB_LEN_MAX", _SC_MB_LEN_MAX},
4016#endif
4017#ifdef _SC_MEMLOCK
4018 {"SC_MEMLOCK", _SC_MEMLOCK},
4019#endif
4020#ifdef _SC_MEMLOCK_RANGE
4021 {"SC_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE},
4022#endif
4023#ifdef _SC_MEMORY_PROTECTION
4024 {"SC_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION},
4025#endif
4026#ifdef _SC_MESSAGE_PASSING
4027 {"SC_MESSAGE_PASSING", _SC_MESSAGE_PASSING},
4028#endif
Fred Draked86ed291999-12-15 15:34:33 +00004029#ifdef _SC_MMAP_FIXED_ALIGNMENT
4030 {"SC_MMAP_FIXED_ALIGNMENT", _SC_MMAP_FIXED_ALIGNMENT},
4031#endif
Fred Drakec9680921999-12-13 16:37:25 +00004032#ifdef _SC_MQ_OPEN_MAX
4033 {"SC_MQ_OPEN_MAX", _SC_MQ_OPEN_MAX},
4034#endif
4035#ifdef _SC_MQ_PRIO_MAX
4036 {"SC_MQ_PRIO_MAX", _SC_MQ_PRIO_MAX},
4037#endif
Fred Draked86ed291999-12-15 15:34:33 +00004038#ifdef _SC_NACLS_MAX
4039 {"SC_NACLS_MAX", _SC_NACLS_MAX},
4040#endif
Fred Drakec9680921999-12-13 16:37:25 +00004041#ifdef _SC_NGROUPS_MAX
4042 {"SC_NGROUPS_MAX", _SC_NGROUPS_MAX},
4043#endif
4044#ifdef _SC_NL_ARGMAX
4045 {"SC_NL_ARGMAX", _SC_NL_ARGMAX},
4046#endif
4047#ifdef _SC_NL_LANGMAX
4048 {"SC_NL_LANGMAX", _SC_NL_LANGMAX},
4049#endif
4050#ifdef _SC_NL_MSGMAX
4051 {"SC_NL_MSGMAX", _SC_NL_MSGMAX},
4052#endif
4053#ifdef _SC_NL_NMAX
4054 {"SC_NL_NMAX", _SC_NL_NMAX},
4055#endif
4056#ifdef _SC_NL_SETMAX
4057 {"SC_NL_SETMAX", _SC_NL_SETMAX},
4058#endif
4059#ifdef _SC_NL_TEXTMAX
4060 {"SC_NL_TEXTMAX", _SC_NL_TEXTMAX},
4061#endif
4062#ifdef _SC_NPROCESSORS_CONF
4063 {"SC_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF},
4064#endif
4065#ifdef _SC_NPROCESSORS_ONLN
4066 {"SC_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN},
4067#endif
Fred Draked86ed291999-12-15 15:34:33 +00004068#ifdef _SC_NPROC_CONF
4069 {"SC_NPROC_CONF", _SC_NPROC_CONF},
4070#endif
4071#ifdef _SC_NPROC_ONLN
4072 {"SC_NPROC_ONLN", _SC_NPROC_ONLN},
4073#endif
Fred Drakec9680921999-12-13 16:37:25 +00004074#ifdef _SC_NZERO
4075 {"SC_NZERO", _SC_NZERO},
4076#endif
4077#ifdef _SC_OPEN_MAX
4078 {"SC_OPEN_MAX", _SC_OPEN_MAX},
4079#endif
4080#ifdef _SC_PAGESIZE
4081 {"SC_PAGESIZE", _SC_PAGESIZE},
4082#endif
4083#ifdef _SC_PAGE_SIZE
4084 {"SC_PAGE_SIZE", _SC_PAGE_SIZE},
4085#endif
4086#ifdef _SC_PASS_MAX
4087 {"SC_PASS_MAX", _SC_PASS_MAX},
4088#endif
4089#ifdef _SC_PHYS_PAGES
4090 {"SC_PHYS_PAGES", _SC_PHYS_PAGES},
4091#endif
4092#ifdef _SC_PII
4093 {"SC_PII", _SC_PII},
4094#endif
4095#ifdef _SC_PII_INTERNET
4096 {"SC_PII_INTERNET", _SC_PII_INTERNET},
4097#endif
4098#ifdef _SC_PII_INTERNET_DGRAM
4099 {"SC_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM},
4100#endif
4101#ifdef _SC_PII_INTERNET_STREAM
4102 {"SC_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM},
4103#endif
4104#ifdef _SC_PII_OSI
4105 {"SC_PII_OSI", _SC_PII_OSI},
4106#endif
4107#ifdef _SC_PII_OSI_CLTS
4108 {"SC_PII_OSI_CLTS", _SC_PII_OSI_CLTS},
4109#endif
4110#ifdef _SC_PII_OSI_COTS
4111 {"SC_PII_OSI_COTS", _SC_PII_OSI_COTS},
4112#endif
4113#ifdef _SC_PII_OSI_M
4114 {"SC_PII_OSI_M", _SC_PII_OSI_M},
4115#endif
4116#ifdef _SC_PII_SOCKET
4117 {"SC_PII_SOCKET", _SC_PII_SOCKET},
4118#endif
4119#ifdef _SC_PII_XTI
4120 {"SC_PII_XTI", _SC_PII_XTI},
4121#endif
4122#ifdef _SC_POLL
4123 {"SC_POLL", _SC_POLL},
4124#endif
4125#ifdef _SC_PRIORITIZED_IO
4126 {"SC_PRIORITIZED_IO", _SC_PRIORITIZED_IO},
4127#endif
4128#ifdef _SC_PRIORITY_SCHEDULING
4129 {"SC_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING},
4130#endif
4131#ifdef _SC_REALTIME_SIGNALS
4132 {"SC_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS},
4133#endif
4134#ifdef _SC_RE_DUP_MAX
4135 {"SC_RE_DUP_MAX", _SC_RE_DUP_MAX},
4136#endif
4137#ifdef _SC_RTSIG_MAX
4138 {"SC_RTSIG_MAX", _SC_RTSIG_MAX},
4139#endif
4140#ifdef _SC_SAVED_IDS
4141 {"SC_SAVED_IDS", _SC_SAVED_IDS},
4142#endif
4143#ifdef _SC_SCHAR_MAX
4144 {"SC_SCHAR_MAX", _SC_SCHAR_MAX},
4145#endif
4146#ifdef _SC_SCHAR_MIN
4147 {"SC_SCHAR_MIN", _SC_SCHAR_MIN},
4148#endif
4149#ifdef _SC_SELECT
4150 {"SC_SELECT", _SC_SELECT},
4151#endif
4152#ifdef _SC_SEMAPHORES
4153 {"SC_SEMAPHORES", _SC_SEMAPHORES},
4154#endif
4155#ifdef _SC_SEM_NSEMS_MAX
4156 {"SC_SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX},
4157#endif
4158#ifdef _SC_SEM_VALUE_MAX
4159 {"SC_SEM_VALUE_MAX", _SC_SEM_VALUE_MAX},
4160#endif
4161#ifdef _SC_SHARED_MEMORY_OBJECTS
4162 {"SC_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS},
4163#endif
4164#ifdef _SC_SHRT_MAX
4165 {"SC_SHRT_MAX", _SC_SHRT_MAX},
4166#endif
4167#ifdef _SC_SHRT_MIN
4168 {"SC_SHRT_MIN", _SC_SHRT_MIN},
4169#endif
4170#ifdef _SC_SIGQUEUE_MAX
4171 {"SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX},
4172#endif
4173#ifdef _SC_SIGRT_MAX
4174 {"SC_SIGRT_MAX", _SC_SIGRT_MAX},
4175#endif
4176#ifdef _SC_SIGRT_MIN
4177 {"SC_SIGRT_MIN", _SC_SIGRT_MIN},
4178#endif
Fred Draked86ed291999-12-15 15:34:33 +00004179#ifdef _SC_SOFTPOWER
4180 {"SC_SOFTPOWER", _SC_SOFTPOWER},
4181#endif
Fred Drakec9680921999-12-13 16:37:25 +00004182#ifdef _SC_SPLIT_CACHE
4183 {"SC_SPLIT_CACHE", _SC_SPLIT_CACHE},
4184#endif
4185#ifdef _SC_SSIZE_MAX
4186 {"SC_SSIZE_MAX", _SC_SSIZE_MAX},
4187#endif
4188#ifdef _SC_STACK_PROT
4189 {"SC_STACK_PROT", _SC_STACK_PROT},
4190#endif
4191#ifdef _SC_STREAM_MAX
4192 {"SC_STREAM_MAX", _SC_STREAM_MAX},
4193#endif
4194#ifdef _SC_SYNCHRONIZED_IO
4195 {"SC_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO},
4196#endif
4197#ifdef _SC_THREADS
4198 {"SC_THREADS", _SC_THREADS},
4199#endif
4200#ifdef _SC_THREAD_ATTR_STACKADDR
4201 {"SC_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR},
4202#endif
4203#ifdef _SC_THREAD_ATTR_STACKSIZE
4204 {"SC_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE},
4205#endif
4206#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS
4207 {"SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS},
4208#endif
4209#ifdef _SC_THREAD_KEYS_MAX
4210 {"SC_THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX},
4211#endif
4212#ifdef _SC_THREAD_PRIORITY_SCHEDULING
4213 {"SC_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING},
4214#endif
4215#ifdef _SC_THREAD_PRIO_INHERIT
4216 {"SC_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT},
4217#endif
4218#ifdef _SC_THREAD_PRIO_PROTECT
4219 {"SC_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT},
4220#endif
4221#ifdef _SC_THREAD_PROCESS_SHARED
4222 {"SC_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED},
4223#endif
4224#ifdef _SC_THREAD_SAFE_FUNCTIONS
4225 {"SC_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS},
4226#endif
4227#ifdef _SC_THREAD_STACK_MIN
4228 {"SC_THREAD_STACK_MIN", _SC_THREAD_STACK_MIN},
4229#endif
4230#ifdef _SC_THREAD_THREADS_MAX
4231 {"SC_THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX},
4232#endif
4233#ifdef _SC_TIMERS
4234 {"SC_TIMERS", _SC_TIMERS},
4235#endif
4236#ifdef _SC_TIMER_MAX
4237 {"SC_TIMER_MAX", _SC_TIMER_MAX},
4238#endif
4239#ifdef _SC_TTY_NAME_MAX
4240 {"SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX},
4241#endif
4242#ifdef _SC_TZNAME_MAX
4243 {"SC_TZNAME_MAX", _SC_TZNAME_MAX},
4244#endif
4245#ifdef _SC_T_IOV_MAX
4246 {"SC_T_IOV_MAX", _SC_T_IOV_MAX},
4247#endif
4248#ifdef _SC_UCHAR_MAX
4249 {"SC_UCHAR_MAX", _SC_UCHAR_MAX},
4250#endif
4251#ifdef _SC_UINT_MAX
4252 {"SC_UINT_MAX", _SC_UINT_MAX},
4253#endif
4254#ifdef _SC_UIO_MAXIOV
4255 {"SC_UIO_MAXIOV", _SC_UIO_MAXIOV},
4256#endif
4257#ifdef _SC_ULONG_MAX
4258 {"SC_ULONG_MAX", _SC_ULONG_MAX},
4259#endif
4260#ifdef _SC_USHRT_MAX
4261 {"SC_USHRT_MAX", _SC_USHRT_MAX},
4262#endif
4263#ifdef _SC_VERSION
4264 {"SC_VERSION", _SC_VERSION},
4265#endif
4266#ifdef _SC_WORD_BIT
4267 {"SC_WORD_BIT", _SC_WORD_BIT},
4268#endif
4269#ifdef _SC_XBS5_ILP32_OFF32
4270 {"SC_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32},
4271#endif
4272#ifdef _SC_XBS5_ILP32_OFFBIG
4273 {"SC_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG},
4274#endif
4275#ifdef _SC_XBS5_LP64_OFF64
4276 {"SC_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64},
4277#endif
4278#ifdef _SC_XBS5_LPBIG_OFFBIG
4279 {"SC_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG},
4280#endif
4281#ifdef _SC_XOPEN_CRYPT
4282 {"SC_XOPEN_CRYPT", _SC_XOPEN_CRYPT},
4283#endif
4284#ifdef _SC_XOPEN_ENH_I18N
4285 {"SC_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N},
4286#endif
4287#ifdef _SC_XOPEN_LEGACY
4288 {"SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY},
4289#endif
4290#ifdef _SC_XOPEN_REALTIME
4291 {"SC_XOPEN_REALTIME", _SC_XOPEN_REALTIME},
4292#endif
4293#ifdef _SC_XOPEN_REALTIME_THREADS
4294 {"SC_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS},
4295#endif
4296#ifdef _SC_XOPEN_SHM
4297 {"SC_XOPEN_SHM", _SC_XOPEN_SHM},
4298#endif
4299#ifdef _SC_XOPEN_UNIX
4300 {"SC_XOPEN_UNIX", _SC_XOPEN_UNIX},
4301#endif
4302#ifdef _SC_XOPEN_VERSION
4303 {"SC_XOPEN_VERSION", _SC_XOPEN_VERSION},
4304#endif
4305#ifdef _SC_XOPEN_XCU_VERSION
4306 {"SC_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION},
4307#endif
4308#ifdef _SC_XOPEN_XPG2
4309 {"SC_XOPEN_XPG2", _SC_XOPEN_XPG2},
4310#endif
4311#ifdef _SC_XOPEN_XPG3
4312 {"SC_XOPEN_XPG3", _SC_XOPEN_XPG3},
4313#endif
4314#ifdef _SC_XOPEN_XPG4
4315 {"SC_XOPEN_XPG4", _SC_XOPEN_XPG4},
4316#endif
4317};
4318
4319static int
4320conv_sysconf_confname(arg, valuep)
4321 PyObject *arg;
4322 int *valuep;
4323{
4324 return conv_confname(arg, valuep, posix_constants_sysconf,
4325 sizeof(posix_constants_sysconf)
4326 / sizeof(struct constdef));
4327}
4328
4329static char posix_sysconf__doc__[] = "\
4330sysconf(name) -> integer\n\
4331Return an integer-valued system configuration variable.";
4332
4333static PyObject *
4334posix_sysconf(self, args)
4335 PyObject *self;
4336 PyObject *args;
4337{
4338 PyObject *result = NULL;
4339 int name;
4340
4341 if (PyArg_ParseTuple(args, "O&:sysconf", conv_sysconf_confname, &name)) {
4342 int value;
4343
4344 errno = 0;
4345 value = sysconf(name);
4346 if (value == -1 && errno != 0)
4347 posix_error();
4348 else
4349 result = PyInt_FromLong(value);
4350 }
4351 return result;
4352}
4353#endif
4354
4355
Fred Drakebec628d1999-12-15 18:31:10 +00004356/* This code is used to ensure that the tables of configuration value names
4357 * are in sorted order as required by conv_confname(), and also to build the
4358 * the exported dictionaries that are used to publish information about the
4359 * names available on the host platform.
4360 *
4361 * Sorting the table at runtime ensures that the table is properly ordered
4362 * when used, even for platforms we're not able to test on. It also makes
4363 * it easier to add additional entries to the tables.
Fred Draked86ed291999-12-15 15:34:33 +00004364 */
Fred Drakebec628d1999-12-15 18:31:10 +00004365
4366static int
4367cmp_constdefs(v1, v2)
4368 const void *v1;
4369 const void *v2;
4370{
4371 const struct constdef *c1 =
4372 (const struct constdef *) v1;
4373 const struct constdef *c2 =
4374 (const struct constdef *) v2;
4375
4376 return strcmp(c1->name, c2->name);
4377}
4378
4379static int
4380setup_confname_table(table, tablesize, tablename, moddict)
Fred Draked86ed291999-12-15 15:34:33 +00004381 struct constdef *table;
4382 size_t tablesize;
Fred Drakebec628d1999-12-15 18:31:10 +00004383 char * tablename;
4384 PyObject *moddict;
Fred Draked86ed291999-12-15 15:34:33 +00004385{
Fred Drakebec628d1999-12-15 18:31:10 +00004386 PyObject *d = NULL;
Barry Warsaw3155db32000-04-13 15:20:40 +00004387 size_t i;
4388 int status;
Fred Drakebec628d1999-12-15 18:31:10 +00004389
4390 qsort(table, tablesize, sizeof(struct constdef), cmp_constdefs);
4391 d = PyDict_New();
Barry Warsaw3155db32000-04-13 15:20:40 +00004392 if (d == NULL)
4393 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004394
Barry Warsaw3155db32000-04-13 15:20:40 +00004395 for (i=0; i < tablesize; ++i) {
4396 PyObject *o = PyInt_FromLong(table[i].value);
4397 if (o == NULL || PyDict_SetItemString(d, table[i].name, o) == -1) {
4398 Py_XDECREF(o);
4399 Py_DECREF(d);
4400 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004401 }
Barry Warsaw3155db32000-04-13 15:20:40 +00004402 Py_DECREF(o);
Fred Draked86ed291999-12-15 15:34:33 +00004403 }
Barry Warsaw3155db32000-04-13 15:20:40 +00004404 status = PyDict_SetItemString(moddict, tablename, d);
4405 Py_DECREF(d);
4406 return status;
Fred Draked86ed291999-12-15 15:34:33 +00004407}
4408
Fred Drakebec628d1999-12-15 18:31:10 +00004409/* Return -1 on failure, 0 on success. */
4410static int
4411setup_confname_tables(moddict)
4412 PyObject *moddict;
Fred Draked86ed291999-12-15 15:34:33 +00004413{
4414#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
Fred Drakebec628d1999-12-15 18:31:10 +00004415 if (setup_confname_table(posix_constants_pathconf,
Fred Draked86ed291999-12-15 15:34:33 +00004416 sizeof(posix_constants_pathconf)
4417 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004418 "pathconf_names", moddict))
4419 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004420#endif
4421#ifdef HAVE_CONFSTR
Fred Drakebec628d1999-12-15 18:31:10 +00004422 if (setup_confname_table(posix_constants_confstr,
Fred Draked86ed291999-12-15 15:34:33 +00004423 sizeof(posix_constants_confstr)
4424 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004425 "confstr_names", moddict))
4426 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004427#endif
4428#ifdef HAVE_SYSCONF
Fred Drakebec628d1999-12-15 18:31:10 +00004429 if (setup_confname_table(posix_constants_sysconf,
Fred Draked86ed291999-12-15 15:34:33 +00004430 sizeof(posix_constants_sysconf)
4431 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004432 "sysconf_names", moddict))
4433 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004434#endif
Fred Drakebec628d1999-12-15 18:31:10 +00004435 return 0;
Fred Draked86ed291999-12-15 15:34:33 +00004436}
Fred Draked86ed291999-12-15 15:34:33 +00004437
4438
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004439static char posix_abort__doc__[] = "\
4440abort() -> does not return!\n\
4441Abort the interpreter immediately. This 'dumps core' or otherwise fails\n\
4442in the hardest way possible on the hosting operating system.";
4443
4444static PyObject *
4445posix_abort(self, args)
4446 PyObject *self;
4447 PyObject *args;
4448{
4449 if (!PyArg_ParseTuple(args, ":abort"))
4450 return NULL;
4451 abort();
4452 /*NOTREACHED*/
4453 Py_FatalError("abort() called from Python code didn't abort!");
4454 return NULL;
4455}
Fred Drakebec628d1999-12-15 18:31:10 +00004456
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004457
4458static PyMethodDef posix_methods[] = {
4459 {"access", posix_access, METH_VARARGS, posix_access__doc__},
4460#ifdef HAVE_TTYNAME
4461 {"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__},
4462#endif
4463 {"chdir", posix_chdir, METH_VARARGS, posix_chdir__doc__},
4464 {"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004465#ifdef HAVE_CHOWN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004466 {"chown", posix_chown, METH_VARARGS, posix_chown__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004467#endif /* HAVE_CHOWN */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004468#ifdef HAVE_CTERMID
4469 {"ctermid", posix_ctermid, METH_VARARGS, posix_ctermid__doc__},
4470#endif
Guido van Rossum36bc6801995-06-14 22:54:23 +00004471#ifdef HAVE_GETCWD
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004472 {"getcwd", posix_getcwd, METH_VARARGS, posix_getcwd__doc__},
Guido van Rossum36bc6801995-06-14 22:54:23 +00004473#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004474#ifdef HAVE_LINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004475 {"link", posix_link, METH_VARARGS, posix_link__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004476#endif /* HAVE_LINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004477 {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__},
4478 {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__},
4479 {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004480#ifdef HAVE_NICE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004481 {"nice", posix_nice, METH_VARARGS, posix_nice__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004482#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004483#ifdef HAVE_READLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004484 {"readlink", posix_readlink, METH_VARARGS, posix_readlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004485#endif /* HAVE_READLINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004486 {"rename", posix_rename, METH_VARARGS, posix_rename__doc__},
4487 {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__},
4488 {"stat", posix_stat, METH_VARARGS, posix_stat__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004489#ifdef HAVE_SYMLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004490 {"symlink", posix_symlink, METH_VARARGS, posix_symlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004491#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004492#ifdef HAVE_SYSTEM
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004493 {"system", posix_system, METH_VARARGS, posix_system__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004494#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004495 {"umask", posix_umask, METH_VARARGS, posix_umask__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004496#ifdef HAVE_UNAME
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004497 {"uname", posix_uname, METH_VARARGS, posix_uname__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004498#endif /* HAVE_UNAME */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004499 {"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__},
4500 {"remove", posix_unlink, METH_VARARGS, posix_remove__doc__},
4501 {"utime", posix_utime, METH_VARARGS, posix_utime__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004502#ifdef HAVE_TIMES
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004503 {"times", posix_times, METH_VARARGS, posix_times__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004504#endif /* HAVE_TIMES */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004505 {"_exit", posix__exit, METH_VARARGS, posix__exit__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004506#ifdef HAVE_EXECV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004507 {"execv", posix_execv, METH_VARARGS, posix_execv__doc__},
4508 {"execve", posix_execve, METH_VARARGS, posix_execve__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004509#endif /* HAVE_EXECV */
Guido van Rossuma1065681999-01-25 23:20:23 +00004510#ifdef HAVE_SPAWNV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004511 {"spawnv", posix_spawnv, METH_VARARGS, posix_spawnv__doc__},
4512 {"spawnve", posix_spawnve, METH_VARARGS, posix_spawnve__doc__},
Guido van Rossuma1065681999-01-25 23:20:23 +00004513#endif /* HAVE_SPAWNV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004514#ifdef HAVE_FORK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004515 {"fork", posix_fork, METH_VARARGS, posix_fork__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004516#endif /* HAVE_FORK */
4517#ifdef HAVE_GETEGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004518 {"getegid", posix_getegid, METH_VARARGS, posix_getegid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004519#endif /* HAVE_GETEGID */
4520#ifdef HAVE_GETEUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004521 {"geteuid", posix_geteuid, METH_VARARGS, posix_geteuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004522#endif /* HAVE_GETEUID */
4523#ifdef HAVE_GETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004524 {"getgid", posix_getgid, METH_VARARGS, posix_getgid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004525#endif /* HAVE_GETGID */
Fred Drakec9680921999-12-13 16:37:25 +00004526#ifdef HAVE_GETGROUPS
4527 {"getgroups", posix_getgroups, METH_VARARGS, posix_getgroups__doc__},
4528#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004529 {"getpid", posix_getpid, METH_VARARGS, posix_getpid__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004530#ifdef HAVE_GETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004531 {"getpgrp", posix_getpgrp, METH_VARARGS, posix_getpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004532#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004533#ifdef HAVE_GETPPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004534 {"getppid", posix_getppid, METH_VARARGS, posix_getppid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004535#endif /* HAVE_GETPPID */
4536#ifdef HAVE_GETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004537 {"getuid", posix_getuid, METH_VARARGS, posix_getuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004538#endif /* HAVE_GETUID */
Fred Drake12c6e2d1999-12-14 21:25:03 +00004539#ifdef HAVE_GETLOGIN
4540 {"getlogin", posix_getlogin, METH_VARARGS, posix_getlogin__doc__},
4541#endif
Guido van Rossumad0ee831995-03-01 10:34:45 +00004542#ifdef HAVE_KILL
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004543 {"kill", posix_kill, METH_VARARGS, posix_kill__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004544#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00004545#ifdef HAVE_PLOCK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004546 {"plock", posix_plock, METH_VARARGS, posix_plock__doc__},
Guido van Rossumc0125471996-06-28 18:55:32 +00004547#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004548#ifdef HAVE_POPEN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004549 {"popen", posix_popen, METH_VARARGS, posix_popen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004550#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004551#ifdef HAVE_SETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004552 {"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004553#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004554#ifdef HAVE_SETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004555 {"setgid", posix_setgid, METH_VARARGS, posix_setgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004556#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004557#ifdef HAVE_SETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004558 {"setpgrp", posix_setpgrp, METH_VARARGS, posix_setpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004559#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004560#ifdef HAVE_WAIT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004561 {"wait", posix_wait, METH_VARARGS, posix_wait__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004562#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004563#ifdef HAVE_WAITPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004564 {"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004565#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004566#ifdef HAVE_SETSID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004567 {"setsid", posix_setsid, METH_VARARGS, posix_setsid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004568#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004569#ifdef HAVE_SETPGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004570 {"setpgid", posix_setpgid, METH_VARARGS, posix_setpgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004571#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004572#ifdef HAVE_TCGETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004573 {"tcgetpgrp", posix_tcgetpgrp, METH_VARARGS, posix_tcgetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004574#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004575#ifdef HAVE_TCSETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004576 {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004577#endif /* HAVE_TCSETPGRP */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004578 {"open", posix_open, METH_VARARGS, posix_open__doc__},
4579 {"close", posix_close, METH_VARARGS, posix_close__doc__},
4580 {"dup", posix_dup, METH_VARARGS, posix_dup__doc__},
4581 {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__},
4582 {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},
4583 {"read", posix_read, METH_VARARGS, posix_read__doc__},
4584 {"write", posix_write, METH_VARARGS, posix_write__doc__},
4585 {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__},
4586 {"fdopen", posix_fdopen, METH_VARARGS, posix_fdopen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004587#ifdef HAVE_PIPE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004588 {"pipe", posix_pipe, METH_VARARGS, posix_pipe__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004589#endif
4590#ifdef HAVE_MKFIFO
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004591 {"mkfifo", posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004592#endif
4593#ifdef HAVE_FTRUNCATE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004594 {"ftruncate", posix_ftruncate, METH_VARARGS, posix_ftruncate__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004595#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004596#ifdef HAVE_PUTENV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004597 {"putenv", posix_putenv, METH_VARARGS, posix_putenv__doc__},
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004598#endif
Guido van Rossumb6a47161997-09-15 22:54:34 +00004599#ifdef HAVE_STRERROR
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004600 {"strerror", posix_strerror, METH_VARARGS, posix_strerror__doc__},
Guido van Rossumb6a47161997-09-15 22:54:34 +00004601#endif
Guido van Rossum21142a01999-01-08 21:05:37 +00004602#ifdef HAVE_FSYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004603 {"fsync", posix_fsync, METH_VARARGS, posix_fsync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004604#endif
4605#ifdef HAVE_FDATASYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004606 {"fdatasync", posix_fdatasync, METH_VARARGS, posix_fdatasync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004607#endif
Guido van Rossumc9641791998-08-04 15:26:23 +00004608#ifdef HAVE_SYS_WAIT_H
4609#ifdef WIFSTOPPED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004610 {"WIFSTOPPED", posix_WIFSTOPPED, METH_VARARGS, posix_WIFSTOPPED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004611#endif /* WIFSTOPPED */
4612#ifdef WIFSIGNALED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004613 {"WIFSIGNALED", posix_WIFSIGNALED, METH_VARARGS, posix_WIFSIGNALED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004614#endif /* WIFSIGNALED */
4615#ifdef WIFEXITED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004616 {"WIFEXITED", posix_WIFEXITED, METH_VARARGS, posix_WIFEXITED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004617#endif /* WIFEXITED */
4618#ifdef WEXITSTATUS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004619 {"WEXITSTATUS", posix_WEXITSTATUS, METH_VARARGS, posix_WEXITSTATUS__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004620#endif /* WEXITSTATUS */
4621#ifdef WTERMSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004622 {"WTERMSIG", posix_WTERMSIG, METH_VARARGS, posix_WTERMSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004623#endif /* WTERMSIG */
4624#ifdef WSTOPSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004625 {"WSTOPSIG", posix_WSTOPSIG, METH_VARARGS, posix_WSTOPSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004626#endif /* WSTOPSIG */
4627#endif /* HAVE_SYS_WAIT_H */
Guido van Rossum94f6f721999-01-06 18:42:14 +00004628#ifdef HAVE_FSTATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004629 {"fstatvfs", posix_fstatvfs, METH_VARARGS, posix_fstatvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004630#endif
4631#ifdef HAVE_STATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004632 {"statvfs", posix_statvfs, METH_VARARGS, posix_statvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004633#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004634#ifdef HAVE_TMPNAM
4635 {"tmpfile", posix_tmpfile, METH_VARARGS, posix_tmpfile__doc__},
4636#endif
4637#ifdef HAVE_TEMPNAM
4638 {"tempnam", posix_tempnam, METH_VARARGS, posix_tempnam__doc__},
4639#endif
4640#ifdef HAVE_TMPNAM
4641 {"tmpnam", posix_tmpnam, METH_VARARGS, posix_tmpnam__doc__},
4642#endif
Fred Drakec9680921999-12-13 16:37:25 +00004643#ifdef HAVE_CONFSTR
4644 {"confstr", posix_confstr, METH_VARARGS, posix_confstr__doc__},
4645#endif
4646#ifdef HAVE_SYSCONF
4647 {"sysconf", posix_sysconf, METH_VARARGS, posix_sysconf__doc__},
4648#endif
4649#ifdef HAVE_FPATHCONF
4650 {"fpathconf", posix_fpathconf, METH_VARARGS, posix_fpathconf__doc__},
4651#endif
4652#ifdef HAVE_PATHCONF
4653 {"pathconf", posix_pathconf, METH_VARARGS, posix_pathconf__doc__},
4654#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004655 {"abort", posix_abort, METH_VARARGS, posix_abort__doc__},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004656 {NULL, NULL} /* Sentinel */
4657};
4658
4659
Barry Warsaw4a342091996-12-19 23:50:02 +00004660static int
4661ins(d, symbol, value)
4662 PyObject* d;
4663 char* symbol;
4664 long value;
4665{
4666 PyObject* v = PyInt_FromLong(value);
4667 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
4668 return -1; /* triggers fatal error */
4669
4670 Py_DECREF(v);
4671 return 0;
4672}
4673
Guido van Rossumd48f2521997-12-05 22:19:34 +00004674#if defined(PYOS_OS2)
4675/* Insert Platform-Specific Constant Values (Strings & Numbers) of Common Use */
4676static int insertvalues(PyObject *d)
4677{
4678 APIRET rc;
4679 ULONG values[QSV_MAX+1];
4680 PyObject *v;
4681 char *ver, tmp[10];
4682
4683 Py_BEGIN_ALLOW_THREADS
4684 rc = DosQuerySysInfo(1, QSV_MAX, &values[1], sizeof(values));
4685 Py_END_ALLOW_THREADS
4686
4687 if (rc != NO_ERROR) {
4688 os2_error(rc);
4689 return -1;
4690 }
4691
4692 if (ins(d, "meminstalled", values[QSV_TOTPHYSMEM])) return -1;
4693 if (ins(d, "memkernel", values[QSV_TOTRESMEM])) return -1;
4694 if (ins(d, "memvirtual", values[QSV_TOTAVAILMEM])) return -1;
4695 if (ins(d, "maxpathlen", values[QSV_MAX_PATH_LENGTH])) return -1;
4696 if (ins(d, "maxnamelen", values[QSV_MAX_COMP_LENGTH])) return -1;
4697 if (ins(d, "revision", values[QSV_VERSION_REVISION])) return -1;
4698 if (ins(d, "timeslice", values[QSV_MIN_SLICE])) return -1;
4699
4700 switch (values[QSV_VERSION_MINOR]) {
4701 case 0: ver = "2.00"; break;
4702 case 10: ver = "2.10"; break;
4703 case 11: ver = "2.11"; break;
4704 case 30: ver = "3.00"; break;
4705 case 40: ver = "4.00"; break;
4706 case 50: ver = "5.00"; break;
4707 default:
4708 sprintf(tmp, "%d-%d", values[QSV_VERSION_MAJOR],
4709 values[QSV_VERSION_MINOR]);
4710 ver = &tmp[0];
4711 }
4712
4713 /* Add Indicator of the Version of the Operating System */
4714 v = PyString_FromString(ver);
4715 if (!v || PyDict_SetItemString(d, "version", v) < 0)
4716 return -1;
4717 Py_DECREF(v);
4718
4719 /* Add Indicator of Which Drive was Used to Boot the System */
4720 tmp[0] = 'A' + values[QSV_BOOT_DRIVE] - 1;
4721 tmp[1] = ':';
4722 tmp[2] = '\0';
4723
4724 v = PyString_FromString(tmp);
4725 if (!v || PyDict_SetItemString(d, "bootdrive", v) < 0)
4726 return -1;
4727 Py_DECREF(v);
4728
4729 return 0;
4730}
4731#endif
4732
Barry Warsaw4a342091996-12-19 23:50:02 +00004733static int
4734all_ins(d)
4735 PyObject* d;
4736{
Guido van Rossum94f6f721999-01-06 18:42:14 +00004737#ifdef F_OK
4738 if (ins(d, "F_OK", (long)F_OK)) return -1;
4739#endif
4740#ifdef R_OK
4741 if (ins(d, "R_OK", (long)R_OK)) return -1;
4742#endif
4743#ifdef W_OK
4744 if (ins(d, "W_OK", (long)W_OK)) return -1;
4745#endif
4746#ifdef X_OK
4747 if (ins(d, "X_OK", (long)X_OK)) return -1;
4748#endif
Fred Drakec9680921999-12-13 16:37:25 +00004749#ifdef NGROUPS_MAX
4750 if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1;
4751#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004752#ifdef TMP_MAX
4753 if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1;
4754#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004755#ifdef WNOHANG
4756 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
4757#endif
4758#ifdef O_RDONLY
4759 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
4760#endif
4761#ifdef O_WRONLY
4762 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
4763#endif
4764#ifdef O_RDWR
4765 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
4766#endif
4767#ifdef O_NDELAY
4768 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
4769#endif
4770#ifdef O_NONBLOCK
4771 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
4772#endif
4773#ifdef O_APPEND
4774 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
4775#endif
4776#ifdef O_DSYNC
4777 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
4778#endif
4779#ifdef O_RSYNC
4780 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
4781#endif
4782#ifdef O_SYNC
4783 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
4784#endif
4785#ifdef O_NOCTTY
4786 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
4787#endif
4788#ifdef O_CREAT
4789 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
4790#endif
4791#ifdef O_EXCL
4792 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
4793#endif
4794#ifdef O_TRUNC
4795 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
4796#endif
Guido van Rossum98d9d091997-08-08 21:48:51 +00004797#ifdef O_BINARY
4798 if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
4799#endif
4800#ifdef O_TEXT
4801 if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
4802#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +00004803
Guido van Rossum246bc171999-02-01 23:54:31 +00004804#ifdef HAVE_SPAWNV
Guido van Rossum7d385291999-02-16 19:38:04 +00004805 if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1;
4806 if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1;
4807 if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1;
4808 if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1;
4809 if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1;
Guido van Rossum246bc171999-02-01 23:54:31 +00004810#endif
4811
Guido van Rossumd48f2521997-12-05 22:19:34 +00004812#if defined(PYOS_OS2)
4813 if (insertvalues(d)) return -1;
4814#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004815 return 0;
4816}
4817
4818
Guido van Rossumc5a0f531997-12-02 20:36:02 +00004819#if ( defined(_MSC_VER) || defined(__WATCOMC__) ) && !defined(__QNX__)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004820#define INITFUNC initnt
4821#define MODNAME "nt"
4822#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004823#if defined(PYOS_OS2)
4824#define INITFUNC initos2
4825#define MODNAME "os2"
4826#else
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004827#define INITFUNC initposix
4828#define MODNAME "posix"
4829#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004830#endif
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004831
Guido van Rossum3886bb61998-12-04 18:50:17 +00004832DL_EXPORT(void)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004833INITFUNC()
Guido van Rossumb6775db1994-08-01 11:34:53 +00004834{
Barry Warsaw53699e91996-12-10 23:23:01 +00004835 PyObject *m, *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00004836
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004837 m = Py_InitModule4(MODNAME,
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004838 posix_methods,
4839 posix__doc__,
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004840 (PyObject *)NULL,
4841 PYTHON_API_VERSION);
Barry Warsaw53699e91996-12-10 23:23:01 +00004842 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004843
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004844 /* Initialize environ dictionary */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004845 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00004846 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004847 return;
Barry Warsaw53699e91996-12-10 23:23:01 +00004848 Py_DECREF(v);
Fred Drakec9680921999-12-13 16:37:25 +00004849
Barry Warsaw4a342091996-12-19 23:50:02 +00004850 if (all_ins(d))
Barry Warsaw4a342091996-12-19 23:50:02 +00004851 return;
4852
Fred Drakebec628d1999-12-15 18:31:10 +00004853 if (setup_confname_tables(d))
4854 return;
4855
Barry Warsawca74da41999-02-09 19:31:45 +00004856 PyDict_SetItemString(d, "error", PyExc_OSError);
Fred Drake762e2061999-08-26 17:23:54 +00004857
Guido van Rossumb3d39562000-01-31 18:41:26 +00004858#ifdef HAVE_PUTENV
Fred Drake762e2061999-08-26 17:23:54 +00004859 posix_putenv_garbage = PyDict_New();
Guido van Rossumb3d39562000-01-31 18:41:26 +00004860#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004861}