blob: 7736ac39465ac31a3b9b87f827b68a18fef4612e [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
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277/* Return a dictionary corresponding to the POSIX environment table */
278
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000279#if !defined(_MSC_VER) && ( !defined(__WATCOMC__) || defined(__QNX__) )
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000280extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000281#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282
Barry Warsaw53699e91996-12-10 23:23:01 +0000283static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284convertenviron()
285{
Barry Warsaw53699e91996-12-10 23:23:01 +0000286 PyObject *d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287 char **e;
Barry Warsaw53699e91996-12-10 23:23:01 +0000288 d = PyDict_New();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289 if (d == NULL)
290 return NULL;
291 if (environ == NULL)
292 return d;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000293 /* This part ignores errors */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 for (e = environ; *e != NULL; e++) {
Guido van Rossum6a619f41999-08-03 19:41:10 +0000295 PyObject *k;
Barry Warsaw53699e91996-12-10 23:23:01 +0000296 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000297 char *p = strchr(*e, '=');
298 if (p == NULL)
299 continue;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000300 k = PyString_FromStringAndSize(*e, (int)(p-*e));
301 if (k == NULL) {
302 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303 continue;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000304 }
305 v = PyString_FromString(p+1);
306 if (v == NULL) {
307 PyErr_Clear();
308 Py_DECREF(k);
309 continue;
310 }
311 if (PyDict_GetItem(d, k) == NULL) {
312 if (PyDict_SetItem(d, k, v) != 0)
313 PyErr_Clear();
314 }
315 Py_DECREF(k);
Barry Warsaw53699e91996-12-10 23:23:01 +0000316 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317 }
Guido van Rossumd48f2521997-12-05 22:19:34 +0000318#if defined(PYOS_OS2)
319 {
320 APIRET rc;
321 char buffer[1024]; /* OS/2 Provides a Documented Max of 1024 Chars */
322
323 rc = DosQueryExtLIBPATH(buffer, BEGIN_LIBPATH);
324 if (rc == NO_ERROR) { /* (not a type, envname is NOT 'BEGIN_LIBPATH') */
325 PyObject *v = PyString_FromString(buffer);
326 PyDict_SetItemString(d, "BEGINLIBPATH", v);
327 Py_DECREF(v);
328 }
329 rc = DosQueryExtLIBPATH(buffer, END_LIBPATH);
330 if (rc == NO_ERROR) { /* (not a typo, envname is NOT 'END_LIBPATH') */
331 PyObject *v = PyString_FromString(buffer);
332 PyDict_SetItemString(d, "ENDLIBPATH", v);
333 Py_DECREF(v);
334 }
335 }
336#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000337 return d;
338}
339
340
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341/* Set a POSIX-specific error from errno, and return NULL */
342
Barry Warsawd58d7641998-07-23 16:14:40 +0000343static PyObject *
344posix_error()
Guido van Rossumad0ee831995-03-01 10:34:45 +0000345{
Barry Warsawca74da41999-02-09 19:31:45 +0000346 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347}
Barry Warsawd58d7641998-07-23 16:14:40 +0000348static PyObject *
349posix_error_with_filename(name)
350 char* name;
351{
Barry Warsawca74da41999-02-09 19:31:45 +0000352 return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);
Barry Warsawd58d7641998-07-23 16:14:40 +0000353}
354
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355
Guido van Rossumd48f2521997-12-05 22:19:34 +0000356#if defined(PYOS_OS2)
357/**********************************************************************
358 * Helper Function to Trim and Format OS/2 Messages
359 **********************************************************************/
360 static void
361os2_formatmsg(char *msgbuf, int msglen, char *reason)
362{
363 msgbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
364
365 if (strlen(msgbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
366 char *lastc = &msgbuf[ strlen(msgbuf)-1 ];
367
368 while (lastc > msgbuf && isspace(*lastc))
369 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
370 }
371
372 /* Add Optional Reason Text */
373 if (reason) {
374 strcat(msgbuf, " : ");
375 strcat(msgbuf, reason);
376 }
377}
378
379/**********************************************************************
380 * Decode an OS/2 Operating System Error Code
381 *
382 * A convenience function to lookup an OS/2 error code and return a
383 * text message we can use to raise a Python exception.
384 *
385 * Notes:
386 * The messages for errors returned from the OS/2 kernel reside in
387 * the file OSO001.MSG in the \OS2 directory hierarchy.
388 *
389 **********************************************************************/
390 static char *
391os2_strerror(char *msgbuf, int msgbuflen, int errorcode, char *reason)
392{
393 APIRET rc;
394 ULONG msglen;
395
396 /* Retrieve Kernel-Related Error Message from OSO001.MSG File */
397 Py_BEGIN_ALLOW_THREADS
398 rc = DosGetMessage(NULL, 0, msgbuf, msgbuflen,
399 errorcode, "oso001.msg", &msglen);
400 Py_END_ALLOW_THREADS
401
402 if (rc == NO_ERROR)
403 os2_formatmsg(msgbuf, msglen, reason);
404 else
405 sprintf(msgbuf, "unknown OS error #%d", errorcode);
406
407 return msgbuf;
408}
409
410/* Set an OS/2-specific error and return NULL. OS/2 kernel
411 errors are not in a global variable e.g. 'errno' nor are
412 they congruent with posix error numbers. */
413
414static PyObject * os2_error(int code)
415{
416 char text[1024];
417 PyObject *v;
418
419 os2_strerror(text, sizeof(text), code, "");
420
421 v = Py_BuildValue("(is)", code, text);
422 if (v != NULL) {
Barry Warsawca74da41999-02-09 19:31:45 +0000423 PyErr_SetObject(PyExc_OSError, v);
Guido van Rossumd48f2521997-12-05 22:19:34 +0000424 Py_DECREF(v);
425 }
426 return NULL; /* Signal to Python that an Exception is Pending */
427}
428
429#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430
431/* POSIX generic methods */
432
Barry Warsaw53699e91996-12-10 23:23:01 +0000433static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000434posix_int(args, format, func)
Guido van Rossum21142a01999-01-08 21:05:37 +0000435 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000436 char *format;
Guido van Rossum21142a01999-01-08 21:05:37 +0000437 int (*func) Py_FPROTO((int));
438{
439 int fd;
440 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000441 if (!PyArg_ParseTuple(args, format, &fd))
Guido van Rossum21142a01999-01-08 21:05:37 +0000442 return NULL;
443 Py_BEGIN_ALLOW_THREADS
444 res = (*func)(fd);
445 Py_END_ALLOW_THREADS
446 if (res < 0)
447 return posix_error();
448 Py_INCREF(Py_None);
449 return Py_None;
450}
451
452
453static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000454posix_1str(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000455 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000456 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000457 int (*func) Py_FPROTO((const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000459 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000460 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000461 if (!PyArg_ParseTuple(args, format, &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000462 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000463 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000464 res = (*func)(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000465 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000466 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000467 return posix_error_with_filename(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000468 Py_INCREF(Py_None);
469 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000470}
471
Barry Warsaw53699e91996-12-10 23:23:01 +0000472static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000473posix_2str(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000474 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000475 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000476 int (*func) Py_FPROTO((const char *, const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000477{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000478 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000479 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000480 if (!PyArg_ParseTuple(args, format, &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000481 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000482 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000483 res = (*func)(path1, path2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000484 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000485 if (res != 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000486 /* XXX how to report both path1 and path2??? */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000488 Py_INCREF(Py_None);
489 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490}
491
Barry Warsaw53699e91996-12-10 23:23:01 +0000492static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000493posix_strint(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000494 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000495 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000496 int (*func) Py_FPROTO((const char *, int));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000497{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000498 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000499 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000500 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000501 if (!PyArg_ParseTuple(args, format, &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000502 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000503 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000504 res = (*func)(path, i);
Barry Warsaw53699e91996-12-10 23:23:01 +0000505 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000506 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000507 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +0000508 Py_INCREF(Py_None);
509 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000510}
511
Barry Warsaw53699e91996-12-10 23:23:01 +0000512static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000513posix_strintint(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000514 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000515 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000516 int (*func) Py_FPROTO((const char *, int, int));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000517{
518 char *path;
519 int i,i2;
520 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000521 if (!PyArg_ParseTuple(args, format, &path, &i, &i2))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000522 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000523 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000524 res = (*func)(path, i, i2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000525 Py_END_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000526 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000527 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +0000528 Py_INCREF(Py_None);
529 return Py_None;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000530}
531
Barry Warsaw53699e91996-12-10 23:23:01 +0000532static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000533posix_do_stat(self, args, format, statfunc)
Barry Warsaw53699e91996-12-10 23:23:01 +0000534 PyObject *self;
535 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000536 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000537 int (*statfunc) Py_FPROTO((const char *, struct stat *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000538{
539 struct stat st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000540 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000541 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000542 if (!PyArg_ParseTuple(args, format, &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000543 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000544 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000545 res = (*statfunc)(path, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +0000546 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000547 if (res != 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000548 return posix_error_with_filename(path);
Guido van Rossum94f6f721999-01-06 18:42:14 +0000549#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +0000550 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +0000551 (long)st.st_mode,
552 (long)st.st_ino,
553 (long)st.st_dev,
554 (long)st.st_nlink,
555 (long)st.st_uid,
556 (long)st.st_gid,
557 (long)st.st_size,
558 (long)st.st_atime,
559 (long)st.st_mtime,
560 (long)st.st_ctime);
561#else
562 return Py_BuildValue("(lLllllLlll)",
563 (long)st.st_mode,
564 (LONG_LONG)st.st_ino,
565 (long)st.st_dev,
566 (long)st.st_nlink,
567 (long)st.st_uid,
568 (long)st.st_gid,
569 (LONG_LONG)st.st_size,
570 (long)st.st_atime,
571 (long)st.st_mtime,
572 (long)st.st_ctime);
573#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000574}
575
576
577/* POSIX methods */
578
Guido van Rossum94f6f721999-01-06 18:42:14 +0000579static char posix_access__doc__[] =
Guido van Rossum015f22a1999-01-06 22:52:38 +0000580"access(path, mode) -> 1 if granted, 0 otherwise\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +0000581Test for access to a file.";
582
583static PyObject *
584posix_access(self, args)
585 PyObject *self;
586 PyObject *args;
587{
Guido van Rossum015f22a1999-01-06 22:52:38 +0000588 char *path;
589 int mode;
590 int res;
591
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000592 if (!PyArg_ParseTuple(args, "si:access", &path, &mode))
Guido van Rossum015f22a1999-01-06 22:52:38 +0000593 return NULL;
594 Py_BEGIN_ALLOW_THREADS
595 res = access(path, mode);
596 Py_END_ALLOW_THREADS
597 return(PyInt_FromLong(res == 0 ? 1L : 0L));
Guido van Rossum94f6f721999-01-06 18:42:14 +0000598}
599
Guido van Rossumd371ff11999-01-25 16:12:23 +0000600#ifndef F_OK
601#define F_OK 0
602#endif
603#ifndef R_OK
604#define R_OK 4
605#endif
606#ifndef W_OK
607#define W_OK 2
608#endif
609#ifndef X_OK
610#define X_OK 1
611#endif
612
613#ifdef HAVE_TTYNAME
Guido van Rossum94f6f721999-01-06 18:42:14 +0000614static char posix_ttyname__doc__[] =
Guido van Rossum61eeb041999-02-22 15:29:15 +0000615"ttyname(fd) -> String\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +0000616Return the name of the terminal device connected to 'fd'.";
617
618static PyObject *
619posix_ttyname(self, args)
620 PyObject *self;
621 PyObject *args;
622{
Guido van Rossum94f6f721999-01-06 18:42:14 +0000623 int id;
624 char *ret;
625
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000626 if (!PyArg_ParseTuple(args, "i:ttyname", &id))
Guido van Rossum94f6f721999-01-06 18:42:14 +0000627 return NULL;
628
Guido van Rossum94f6f721999-01-06 18:42:14 +0000629 ret = ttyname(id);
630 if (ret == NULL)
631 return(posix_error());
632 return(PyString_FromString(ret));
633}
Guido van Rossumd371ff11999-01-25 16:12:23 +0000634#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +0000635
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000636#ifdef HAVE_CTERMID
637static char posix_ctermid__doc__[] =
638"ctermid() -> String\n\
639Return the name of the controlling terminal for this process.";
640
641static PyObject *
642posix_ctermid(self, args)
643 PyObject *self;
644 PyObject *args;
645{
646 char *ret;
647 char buffer[L_ctermid];
648
649 if (!PyArg_ParseTuple(args, ":ctermid"))
650 return NULL;
651
652#ifdef HAVE_CTERMID_R
653 ret = ctermid_r(buffer);
654#else
655 ret = ctermid(buffer);
656#endif
657 if (ret == NULL)
658 return(posix_error());
659 return(PyString_FromString(buffer));
660}
661#endif
662
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000663static char posix_chdir__doc__[] =
664"chdir(path) -> None\n\
665Change the current working directory to the specified path.";
666
Barry Warsaw53699e91996-12-10 23:23:01 +0000667static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000668posix_chdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000669 PyObject *self;
670 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000671{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000672 return posix_1str(args, "s:chdir", chdir);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000673}
674
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000675
676static char posix_chmod__doc__[] =
677"chmod(path, mode) -> None\n\
678Change the access permissions of a file.";
679
Barry Warsaw53699e91996-12-10 23:23:01 +0000680static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000681posix_chmod(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000682 PyObject *self;
683 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000684{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000685 return posix_strint(args, "si:chmod", chmod);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000686}
687
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000688
Guido van Rossum21142a01999-01-08 21:05:37 +0000689#ifdef HAVE_FSYNC
690static char posix_fsync__doc__[] =
691"fsync(fildes) -> None\n\
692force write of file with filedescriptor to disk.";
693
694static PyObject *
695posix_fsync(self, args)
696 PyObject *self;
697 PyObject *args;
698{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000699 return posix_int(args, "i:fsync", fsync);
Guido van Rossum21142a01999-01-08 21:05:37 +0000700}
701#endif /* HAVE_FSYNC */
702
703#ifdef HAVE_FDATASYNC
704static char posix_fdatasync__doc__[] =
705"fdatasync(fildes) -> None\n\
706force write of file with filedescriptor to disk.\n\
707 does not force update of metadata.";
708
Guido van Rossum5d00b6d1999-01-08 21:28:05 +0000709extern int fdatasync(int); /* Prototype just in case */
710
Guido van Rossum21142a01999-01-08 21:05:37 +0000711static PyObject *
712posix_fdatasync(self, args)
713 PyObject *self;
714 PyObject *args;
715{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000716 return posix_int(args, "i:fdatasync", fdatasync);
Guido van Rossum21142a01999-01-08 21:05:37 +0000717}
718#endif /* HAVE_FDATASYNC */
719
720
Guido van Rossumb6775db1994-08-01 11:34:53 +0000721#ifdef HAVE_CHOWN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000722static char posix_chown__doc__[] =
723"chown(path, uid, gid) -> None\n\
724Change the owner and group id of path to the numeric uid and gid.";
725
Barry Warsaw53699e91996-12-10 23:23:01 +0000726static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000727posix_chown(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000728 PyObject *self;
729 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000730{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000731 return posix_strintint(args, "sii:chown", chown);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000732}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000733#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000734
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000735
Guido van Rossum36bc6801995-06-14 22:54:23 +0000736#ifdef HAVE_GETCWD
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000737static char posix_getcwd__doc__[] =
738"getcwd() -> path\n\
739Return a string representing the current working directory.";
740
Barry Warsaw53699e91996-12-10 23:23:01 +0000741static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000742posix_getcwd(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000743 PyObject *self;
744 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000745{
746 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000747 char *res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000748 if (!PyArg_ParseTuple(args, ":getcwd"))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000749 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000750 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000751 res = getcwd(buf, sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +0000752 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000753 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000754 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000755 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000756}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000757#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000758
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000759
Guido van Rossumb6775db1994-08-01 11:34:53 +0000760#ifdef HAVE_LINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000761static char posix_link__doc__[] =
762"link(src, dst) -> None\n\
763Create a hard link to a file.";
764
Barry Warsaw53699e91996-12-10 23:23:01 +0000765static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000766posix_link(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000767 PyObject *self;
768 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000769{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000770 return posix_2str(args, "ss:link", link);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000771}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000772#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000773
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000774
775static char posix_listdir__doc__[] =
776"listdir(path) -> list_of_strings\n\
777Return a list containing the names of the entries in the directory.\n\
778\n\
779 path: path of directory to list\n\
780\n\
781The list is in arbitrary order. It does not include the special\n\
782entries '.' and '..' even if they are present in the directory.";
783
Barry Warsaw53699e91996-12-10 23:23:01 +0000784static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000785posix_listdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000786 PyObject *self;
787 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000788{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000789 /* XXX Should redo this putting the (now four) versions of opendir
Guido van Rossum6d8841c1997-08-14 19:57:39 +0000790 in separate files instead of having them all here... */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000791#if defined(MS_WIN32) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000792
Guido van Rossumb6775db1994-08-01 11:34:53 +0000793 char *name;
794 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000795 PyObject *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000796 HANDLE hFindFile;
797 WIN32_FIND_DATA FileData;
798 char namebuf[MAX_PATH+5];
799
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000800 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000801 return NULL;
802 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000803 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000804 return NULL;
805 }
806 strcpy(namebuf, name);
807 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
808 namebuf[len++] = '/';
809 strcpy(namebuf + len, "*.*");
810
Barry Warsaw53699e91996-12-10 23:23:01 +0000811 if ((d = PyList_New(0)) == NULL)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000812 return NULL;
813
814 hFindFile = FindFirstFile(namebuf, &FileData);
815 if (hFindFile == INVALID_HANDLE_VALUE) {
816 errno = GetLastError();
Guido van Rossum617bc191998-08-06 03:23:32 +0000817 if (errno == ERROR_FILE_NOT_FOUND)
818 return PyList_New(0);
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000819 return posix_error_with_filename(name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000820 }
821 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000822 if (FileData.cFileName[0] == '.' &&
823 (FileData.cFileName[1] == '\0' ||
824 FileData.cFileName[1] == '.' &&
825 FileData.cFileName[2] == '\0'))
826 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000827 v = PyString_FromString(FileData.cFileName);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000828 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000829 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000830 d = NULL;
831 break;
832 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000833 if (PyList_Append(d, v) != 0) {
834 Py_DECREF(v);
835 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000836 d = NULL;
837 break;
838 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000839 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000840 } while (FindNextFile(hFindFile, &FileData) == TRUE);
841
842 if (FindClose(hFindFile) == FALSE) {
843 errno = GetLastError();
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000844 return posix_error_with_filename(&name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000845 }
846
847 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000848
Guido van Rossum8d665e61996-06-26 18:22:49 +0000849#else /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000850#ifdef _MSC_VER /* 16-bit Windows */
851
852#ifndef MAX_PATH
853#define MAX_PATH 250
854#endif
855 char *name, *pt;
856 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000857 PyObject *d, *v;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000858 char namebuf[MAX_PATH+5];
859 struct _find_t ep;
860
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000861 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000862 return NULL;
863 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000864 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000865 return NULL;
866 }
867 strcpy(namebuf, name);
868 for (pt = namebuf; *pt; pt++)
869 if (*pt == '/')
870 *pt = '\\';
871 if (namebuf[len-1] != '\\')
872 namebuf[len++] = '\\';
873 strcpy(namebuf + len, "*.*");
874
Barry Warsaw53699e91996-12-10 23:23:01 +0000875 if ((d = PyList_New(0)) == NULL)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000876 return NULL;
877
878 if (_dos_findfirst(namebuf, _A_RDONLY |
Barry Warsaw43d68b81996-12-19 22:10:44 +0000879 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0)
880 {
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000881 errno = ENOENT;
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000882 return posix_error_with_filename(name);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000883 }
884 do {
885 if (ep.name[0] == '.' &&
886 (ep.name[1] == '\0' ||
887 ep.name[1] == '.' &&
888 ep.name[2] == '\0'))
889 continue;
890 strcpy(namebuf, ep.name);
891 for (pt = namebuf; *pt; pt++)
892 if (isupper(*pt))
893 *pt = tolower(*pt);
Barry Warsaw53699e91996-12-10 23:23:01 +0000894 v = PyString_FromString(namebuf);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000895 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000896 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000897 d = NULL;
898 break;
899 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000900 if (PyList_Append(d, v) != 0) {
901 Py_DECREF(v);
902 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000903 d = NULL;
904 break;
905 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000906 Py_DECREF(v);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000907 } while (_dos_findnext(&ep) == 0);
908
909 return d;
910
911#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000912#if defined(PYOS_OS2)
913
914#ifndef MAX_PATH
915#define MAX_PATH CCHMAXPATH
916#endif
917 char *name, *pt;
918 int len;
919 PyObject *d, *v;
920 char namebuf[MAX_PATH+5];
921 HDIR hdir = 1;
922 ULONG srchcnt = 1;
923 FILEFINDBUF3 ep;
924 APIRET rc;
925
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000926 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000927 return NULL;
928 if (len >= MAX_PATH) {
929 PyErr_SetString(PyExc_ValueError, "path too long");
930 return NULL;
931 }
932 strcpy(namebuf, name);
933 for (pt = namebuf; *pt; pt++)
934 if (*pt == '/')
935 *pt = '\\';
936 if (namebuf[len-1] != '\\')
937 namebuf[len++] = '\\';
938 strcpy(namebuf + len, "*.*");
939
940 if ((d = PyList_New(0)) == NULL)
941 return NULL;
942
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000943 rc = DosFindFirst(namebuf, /* Wildcard Pattern to Match */
944 &hdir, /* Handle to Use While Search Directory */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000945 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000946 &ep, sizeof(ep), /* Structure to Receive Directory Entry */
947 &srchcnt, /* Max and Actual Count of Entries Per Iteration */
948 FIL_STANDARD); /* Format of Entry (EAs or Not) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000949
950 if (rc != NO_ERROR) {
951 errno = ENOENT;
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000952 return posix_error_with_filename(name);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000953 }
954
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000955 if (srchcnt > 0) { /* If Directory is NOT Totally Empty, */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000956 do {
957 if (ep.achName[0] == '.'
958 && (ep.achName[1] == '\0' || ep.achName[1] == '.' && ep.achName[2] == '\0'))
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000959 continue; /* Skip Over "." and ".." Names */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000960
961 strcpy(namebuf, ep.achName);
962
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000963 /* Leave Case of Name Alone -- In Native Form */
964 /* (Removed Forced Lowercasing Code) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000965
966 v = PyString_FromString(namebuf);
967 if (v == NULL) {
968 Py_DECREF(d);
969 d = NULL;
970 break;
971 }
972 if (PyList_Append(d, v) != 0) {
973 Py_DECREF(v);
974 Py_DECREF(d);
975 d = NULL;
976 break;
977 }
978 Py_DECREF(v);
979 } while (DosFindNext(hdir, &ep, sizeof(ep), &srchcnt) == NO_ERROR && srchcnt > 0);
980 }
981
982 return d;
983#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000984
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000985 char *name;
Barry Warsaw53699e91996-12-10 23:23:01 +0000986 PyObject *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000987 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000988 struct dirent *ep;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000989 if (!PyArg_ParseTuple(args, "s:listdir", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000990 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000991 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000992 if ((dirp = opendir(name)) == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000993 Py_BLOCK_THREADS
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000994 return posix_error_with_filename(name);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000995 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000996 if ((d = PyList_New(0)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000997 closedir(dirp);
Barry Warsaw53699e91996-12-10 23:23:01 +0000998 Py_BLOCK_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000999 return NULL;
1000 }
1001 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +00001002 if (ep->d_name[0] == '.' &&
1003 (NAMLEN(ep) == 1 ||
Guido van Rossuma376cc51996-12-05 23:43:35 +00001004 (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
Guido van Rossum24f42ac1995-07-18 18:16:52 +00001005 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +00001006 v = PyString_FromStringAndSize(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001007 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001008 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001009 d = NULL;
1010 break;
1011 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001012 if (PyList_Append(d, v) != 0) {
1013 Py_DECREF(v);
1014 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001015 d = NULL;
1016 break;
1017 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001018 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001019 }
1020 closedir(dirp);
Barry Warsaw53699e91996-12-10 23:23:01 +00001021 Py_END_ALLOW_THREADS
Guido van Rossum0ee42cd1991-04-08 21:01:03 +00001022
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001023 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001024
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001025#endif /* !PYOS_OS2 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001026#endif /* !_MSC_VER */
Guido van Rossum8d665e61996-06-26 18:22:49 +00001027#endif /* !MS_WIN32 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001028}
1029
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001030static char posix_mkdir__doc__[] =
1031"mkdir(path [, mode=0777]) -> None\n\
1032Create a directory.";
1033
Barry Warsaw53699e91996-12-10 23:23:01 +00001034static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001035posix_mkdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001036 PyObject *self;
1037 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001038{
Guido van Rossumb0824db1996-02-25 04:50:32 +00001039 int res;
1040 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001041 int mode = 0777;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001042 if (!PyArg_ParseTuple(args, "s|i:mkdir", &path, &mode))
Guido van Rossumb0824db1996-02-25 04:50:32 +00001043 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001044 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001045#if ( defined(__WATCOMC__) || defined(_MSC_VER) || defined(PYCC_VACPP) ) && !defined(__QNX__)
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001046 res = mkdir(path);
1047#else
Guido van Rossumb0824db1996-02-25 04:50:32 +00001048 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001049#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001050 Py_END_ALLOW_THREADS
Guido van Rossumb0824db1996-02-25 04:50:32 +00001051 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00001052 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00001053 Py_INCREF(Py_None);
1054 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001055}
1056
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001057
Guido van Rossumb6775db1994-08-01 11:34:53 +00001058#ifdef HAVE_NICE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001059static char posix_nice__doc__[] =
1060"nice(inc) -> new_priority\n\
1061Decrease the priority of process and return new priority.";
1062
Barry Warsaw53699e91996-12-10 23:23:01 +00001063static PyObject *
Guido van Rossum775f4da1993-01-09 17:18:52 +00001064posix_nice(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001065 PyObject *self;
1066 PyObject *args;
Guido van Rossum775f4da1993-01-09 17:18:52 +00001067{
1068 int increment, value;
1069
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001070 if (!PyArg_ParseTuple(args, "i:nice", &increment))
Guido van Rossum775f4da1993-01-09 17:18:52 +00001071 return NULL;
1072 value = nice(increment);
1073 if (value == -1)
1074 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001075 return PyInt_FromLong((long) value);
Guido van Rossum775f4da1993-01-09 17:18:52 +00001076}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001077#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001078
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001079
1080static char posix_rename__doc__[] =
1081"rename(old, new) -> None\n\
1082Rename a file or directory.";
1083
Barry Warsaw53699e91996-12-10 23:23:01 +00001084static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001085posix_rename(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001086 PyObject *self;
1087 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001088{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001089 return posix_2str(args, "ss:rename", rename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001090}
1091
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001092
1093static char posix_rmdir__doc__[] =
1094"rmdir(path) -> None\n\
1095Remove a directory.";
1096
Barry Warsaw53699e91996-12-10 23:23:01 +00001097static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001098posix_rmdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001099 PyObject *self;
1100 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001101{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001102 return posix_1str(args, "s:rmdir", rmdir);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001103}
1104
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001105
1106static char posix_stat__doc__[] =
1107"stat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
1108Perform a stat system call on the given path.";
1109
Barry Warsaw53699e91996-12-10 23:23:01 +00001110static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001111posix_stat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001112 PyObject *self;
1113 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001114{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001115 return posix_do_stat(self, args, "s:stat", stat);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001116}
1117
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001118
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001119#ifdef HAVE_SYSTEM
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001120static char posix_system__doc__[] =
1121"system(command) -> exit_status\n\
1122Execute the command (a string) in a subshell.";
1123
Barry Warsaw53699e91996-12-10 23:23:01 +00001124static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001125posix_system(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001126 PyObject *self;
1127 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001128{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001129 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001130 long sts;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001131 if (!PyArg_ParseTuple(args, "s:system", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001132 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001133 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001134 sts = system(command);
Barry Warsaw53699e91996-12-10 23:23:01 +00001135 Py_END_ALLOW_THREADS
1136 return PyInt_FromLong(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001137}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001138#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001139
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001140
1141static char posix_umask__doc__[] =
1142"umask(new_mask) -> old_mask\n\
1143Set the current numeric umask and return the previous umask.";
1144
Barry Warsaw53699e91996-12-10 23:23:01 +00001145static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001146posix_umask(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001147 PyObject *self;
1148 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001149{
1150 int i;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001151 if (!PyArg_ParseTuple(args, "i:umask", &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001152 return NULL;
1153 i = umask(i);
1154 if (i < 0)
1155 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001156 return PyInt_FromLong((long)i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001157}
1158
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001159
1160static char posix_unlink__doc__[] =
1161"unlink(path) -> None\n\
1162Remove a file (same as remove(path)).";
1163
1164static char posix_remove__doc__[] =
1165"remove(path) -> None\n\
1166Remove a file (same as unlink(path)).";
1167
Barry Warsaw53699e91996-12-10 23:23:01 +00001168static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001169posix_unlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001170 PyObject *self;
1171 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001172{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001173 return posix_1str(args, "s:remove", unlink);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001174}
1175
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001176
Guido van Rossumb6775db1994-08-01 11:34:53 +00001177#ifdef HAVE_UNAME
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001178static char posix_uname__doc__[] =
1179"uname() -> (sysname, nodename, release, version, machine)\n\
1180Return a tuple identifying the current operating system.";
1181
Barry Warsaw53699e91996-12-10 23:23:01 +00001182static PyObject *
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001183posix_uname(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001184 PyObject *self;
1185 PyObject *args;
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001186{
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001187 struct utsname u;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001188 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001189 if (!PyArg_ParseTuple(args, ":uname"))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001190 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001191 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001192 res = uname(&u);
Barry Warsaw53699e91996-12-10 23:23:01 +00001193 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001194 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001195 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001196 return Py_BuildValue("(sssss)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00001197 u.sysname,
1198 u.nodename,
1199 u.release,
1200 u.version,
1201 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001202}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001203#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001204
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001205
1206static char posix_utime__doc__[] =
1207"utime(path, (atime, utime)) -> None\n\
1208Set the access and modified time of the file to the given values.";
1209
Barry Warsaw53699e91996-12-10 23:23:01 +00001210static PyObject *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001211posix_utime(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001212 PyObject *self;
1213 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001214{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001215 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +00001216 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001217 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001218
Guido van Rossum6d8841c1997-08-14 19:57:39 +00001219/* XXX should define struct utimbuf instead, above */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001220#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001221 struct utimbuf buf;
1222#define ATIME buf.actime
1223#define MTIME buf.modtime
1224#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001225#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001226 time_t buf[2];
1227#define ATIME buf[0]
1228#define MTIME buf[1]
1229#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001230#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001231
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001232 if (!PyArg_ParseTuple(args, "s(ll):utime", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001233 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +00001234 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +00001235 MTIME = mtime;
Barry Warsaw53699e91996-12-10 23:23:01 +00001236 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001237 res = utime(path, UTIME_ARG);
Barry Warsaw53699e91996-12-10 23:23:01 +00001238 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001239 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00001240 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00001241 Py_INCREF(Py_None);
1242 return Py_None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001243#undef UTIME_ARG
1244#undef ATIME
1245#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001246}
1247
Guido van Rossum85e3b011991-06-03 12:42:10 +00001248
Guido van Rossum3b066191991-06-04 19:40:25 +00001249/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001250
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001251static char posix__exit__doc__[] =
1252"_exit(status)\n\
1253Exit to the system with specified status, without normal exit processing.";
1254
Barry Warsaw53699e91996-12-10 23:23:01 +00001255static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001256posix__exit(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001257 PyObject *self;
1258 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001259{
1260 int sts;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001261 if (!PyArg_ParseTuple(args, "i:_exit", &sts))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001262 return NULL;
1263 _exit(sts);
Guido van Rossuma376cc51996-12-05 23:43:35 +00001264 return NULL; /* Make gcc -Wall happy */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001265}
1266
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001267
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001268#ifdef HAVE_EXECV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001269static char posix_execv__doc__[] =
1270"execv(path, args)\n\
1271Execute an executable path with arguments, replacing current process.\n\
1272\n\
1273 path: path of executable file\n\
1274 args: tuple or list of strings";
1275
Barry Warsaw53699e91996-12-10 23:23:01 +00001276static PyObject *
Guido van Rossum89b33251993-10-22 14:26:06 +00001277posix_execv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001278 PyObject *self;
1279 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001280{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001281 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00001282 PyObject *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001283 char **argvlist;
1284 int i, argc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001285 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossum85e3b011991-06-03 12:42:10 +00001286
Guido van Rossum89b33251993-10-22 14:26:06 +00001287 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +00001288 argv is a list or tuple of strings. */
1289
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001290 if (!PyArg_ParseTuple(args, "sO:execv", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001291 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001292 if (PyList_Check(argv)) {
1293 argc = PyList_Size(argv);
1294 getitem = PyList_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001295 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001296 else if (PyTuple_Check(argv)) {
1297 argc = PyTuple_Size(argv);
1298 getitem = PyTuple_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001299 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001300 else {
1301 badarg:
Barry Warsaw53699e91996-12-10 23:23:01 +00001302 PyErr_BadArgument();
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001303 return NULL;
1304 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00001305
Barry Warsaw53699e91996-12-10 23:23:01 +00001306 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001307 if (argvlist == NULL)
1308 return NULL;
1309 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001310 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
1311 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001312 goto badarg;
1313 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00001314 }
1315 argvlist[argc] = NULL;
1316
Guido van Rossumb6775db1994-08-01 11:34:53 +00001317#ifdef BAD_EXEC_PROTOTYPES
1318 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001319#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001320 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001321#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001322
Guido van Rossum85e3b011991-06-03 12:42:10 +00001323 /* If we get here it's definitely an error */
1324
Barry Warsaw53699e91996-12-10 23:23:01 +00001325 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001326 return posix_error();
1327}
1328
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001329
1330static char posix_execve__doc__[] =
1331"execve(path, args, env)\n\
1332Execute a path with arguments and environment, replacing current process.\n\
1333\n\
1334 path: path of executable file\n\
1335 args: tuple or list of arguments\n\
1336 env: dictonary of strings mapping to strings";
1337
Barry Warsaw53699e91996-12-10 23:23:01 +00001338static PyObject *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001339posix_execve(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001340 PyObject *self;
1341 PyObject *args;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001342{
1343 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00001344 PyObject *argv, *env;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001345 char **argvlist;
1346 char **envlist;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001347 PyObject *key, *val, *keys=NULL, *vals=NULL;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001348 int i, pos, argc, envc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001349 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001350
1351 /* execve has three arguments: (path, argv, env), where
1352 argv is a list or tuple of strings and env is a dictionary
1353 like posix.environ. */
1354
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001355 if (!PyArg_ParseTuple(args, "sOO:execve", &path, &argv, &env))
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001356 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001357 if (PyList_Check(argv)) {
1358 argc = PyList_Size(argv);
1359 getitem = PyList_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001360 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001361 else if (PyTuple_Check(argv)) {
1362 argc = PyTuple_Size(argv);
1363 getitem = PyTuple_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001364 }
1365 else {
Barry Warsaw53699e91996-12-10 23:23:01 +00001366 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001367 return NULL;
1368 }
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001369 if (!PyMapping_Check(env)) {
1370 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001371 return NULL;
1372 }
1373
Barry Warsaw53699e91996-12-10 23:23:01 +00001374 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001375 if (argvlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001376 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001377 return NULL;
1378 }
1379 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001380 if (!PyArg_Parse((*getitem)(argv, i),
Barry Warsaw43d68b81996-12-19 22:10:44 +00001381 "s;argv must be list of strings",
1382 &argvlist[i]))
1383 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001384 goto fail_1;
1385 }
1386 }
1387 argvlist[argc] = NULL;
1388
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001389 i = PyMapping_Length(env);
Barry Warsaw53699e91996-12-10 23:23:01 +00001390 envlist = PyMem_NEW(char *, i + 1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001391 if (envlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001392 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001393 goto fail_1;
1394 }
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001395 envc = 0;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001396 keys = PyMapping_Keys(env);
1397 vals = PyMapping_Values(env);
1398 if (!keys || !vals)
1399 goto fail_2;
1400
1401 for (pos = 0; pos < i; pos++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001402 char *p, *k, *v;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001403
1404 key = PyList_GetItem(keys, pos);
1405 val = PyList_GetItem(vals, pos);
1406 if (!key || !val)
1407 goto fail_2;
1408
Barry Warsaw53699e91996-12-10 23:23:01 +00001409 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
Barry Warsaw43d68b81996-12-19 22:10:44 +00001410 !PyArg_Parse(val, "s;non-string value in env", &v))
1411 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001412 goto fail_2;
1413 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00001414
1415#if defined(PYOS_OS2)
1416 /* Omit Pseudo-Env Vars that Would Confuse Programs if Passed On */
1417 if (stricmp(k, "BEGINLIBPATH") != 0 && stricmp(k, "ENDLIBPATH") != 0) {
1418#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001419 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001420 if (p == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001421 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001422 goto fail_2;
1423 }
1424 sprintf(p, "%s=%s", k, v);
1425 envlist[envc++] = p;
Guido van Rossumd48f2521997-12-05 22:19:34 +00001426#if defined(PYOS_OS2)
1427 }
1428#endif
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001429 }
1430 envlist[envc] = 0;
1431
Guido van Rossumb6775db1994-08-01 11:34:53 +00001432
1433#ifdef BAD_EXEC_PROTOTYPES
1434 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001435#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001436 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001437#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001438
1439 /* If we get here it's definitely an error */
1440
1441 (void) posix_error();
1442
1443 fail_2:
1444 while (--envc >= 0)
Barry Warsaw53699e91996-12-10 23:23:01 +00001445 PyMem_DEL(envlist[envc]);
1446 PyMem_DEL(envlist);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001447 fail_1:
Barry Warsaw53699e91996-12-10 23:23:01 +00001448 PyMem_DEL(argvlist);
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001449 Py_XDECREF(vals);
1450 Py_XDECREF(keys);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001451 return NULL;
1452}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001453#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001454
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001455
Guido van Rossuma1065681999-01-25 23:20:23 +00001456#ifdef HAVE_SPAWNV
1457static char posix_spawnv__doc__[] =
Fred Drakea6dff3e1999-02-01 22:24:40 +00001458"spawnv(mode, path, args)\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001459Execute an executable path with arguments, replacing current process.\n\
1460\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00001461 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001462 path: path of executable file\n\
1463 args: tuple or list of strings";
1464
1465static PyObject *
1466posix_spawnv(self, args)
1467 PyObject *self;
1468 PyObject *args;
1469{
1470 char *path;
1471 PyObject *argv;
1472 char **argvlist;
1473 int mode, i, argc;
1474 PyObject *(*getitem) Py_PROTO((PyObject *, int));
1475
1476 /* spawnv has three arguments: (mode, path, argv), where
1477 argv is a list or tuple of strings. */
1478
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001479 if (!PyArg_ParseTuple(args, "isO:spawnv", &mode, &path, &argv))
Guido van Rossuma1065681999-01-25 23:20:23 +00001480 return NULL;
1481 if (PyList_Check(argv)) {
1482 argc = PyList_Size(argv);
1483 getitem = PyList_GetItem;
1484 }
1485 else if (PyTuple_Check(argv)) {
1486 argc = PyTuple_Size(argv);
1487 getitem = PyTuple_GetItem;
1488 }
1489 else {
1490 badarg:
1491 PyErr_BadArgument();
1492 return NULL;
1493 }
1494
1495 argvlist = PyMem_NEW(char *, argc+1);
1496 if (argvlist == NULL)
1497 return NULL;
1498 for (i = 0; i < argc; i++) {
1499 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
1500 PyMem_DEL(argvlist);
1501 goto badarg;
1502 }
1503 }
1504 argvlist[argc] = NULL;
1505
Guido van Rossum246bc171999-02-01 23:54:31 +00001506 if (mode == _OLD_P_OVERLAY)
1507 mode = _P_OVERLAY;
Guido van Rossuma1065681999-01-25 23:20:23 +00001508 i = _spawnv(mode, path, argvlist);
1509
1510 PyMem_DEL(argvlist);
1511
1512 if (i == -1)
1513 return posix_error();
1514 else
1515 return Py_BuildValue("i", i);
1516}
1517
1518
1519static char posix_spawnve__doc__[] =
Fred Drakea6dff3e1999-02-01 22:24:40 +00001520"spawnve(mode, path, args, env)\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001521Execute a path with arguments and environment, replacing current process.\n\
1522\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00001523 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001524 path: path of executable file\n\
1525 args: tuple or list of arguments\n\
1526 env: dictonary of strings mapping to strings";
1527
1528static PyObject *
1529posix_spawnve(self, args)
1530 PyObject *self;
1531 PyObject *args;
1532{
1533 char *path;
1534 PyObject *argv, *env;
1535 char **argvlist;
1536 char **envlist;
1537 PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL;
1538 int mode, i, pos, argc, envc;
1539 PyObject *(*getitem) Py_PROTO((PyObject *, int));
1540
1541 /* spawnve has four arguments: (mode, path, argv, env), where
1542 argv is a list or tuple of strings and env is a dictionary
1543 like posix.environ. */
1544
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001545 if (!PyArg_ParseTuple(args, "isOO:spawnve", &mode, &path, &argv, &env))
Guido van Rossuma1065681999-01-25 23:20:23 +00001546 return NULL;
1547 if (PyList_Check(argv)) {
1548 argc = PyList_Size(argv);
1549 getitem = PyList_GetItem;
1550 }
1551 else if (PyTuple_Check(argv)) {
1552 argc = PyTuple_Size(argv);
1553 getitem = PyTuple_GetItem;
1554 }
1555 else {
1556 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
1557 return NULL;
1558 }
1559 if (!PyMapping_Check(env)) {
1560 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
1561 return NULL;
1562 }
1563
1564 argvlist = PyMem_NEW(char *, argc+1);
1565 if (argvlist == NULL) {
1566 PyErr_NoMemory();
1567 return NULL;
1568 }
1569 for (i = 0; i < argc; i++) {
1570 if (!PyArg_Parse((*getitem)(argv, i),
1571 "s;argv must be list of strings",
1572 &argvlist[i]))
1573 {
1574 goto fail_1;
1575 }
1576 }
1577 argvlist[argc] = NULL;
1578
1579 i = PyMapping_Length(env);
1580 envlist = PyMem_NEW(char *, i + 1);
1581 if (envlist == NULL) {
1582 PyErr_NoMemory();
1583 goto fail_1;
1584 }
1585 envc = 0;
1586 keys = PyMapping_Keys(env);
1587 vals = PyMapping_Values(env);
1588 if (!keys || !vals)
1589 goto fail_2;
1590
1591 for (pos = 0; pos < i; pos++) {
1592 char *p, *k, *v;
1593
1594 key = PyList_GetItem(keys, pos);
1595 val = PyList_GetItem(vals, pos);
1596 if (!key || !val)
1597 goto fail_2;
1598
1599 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
1600 !PyArg_Parse(val, "s;non-string value in env", &v))
1601 {
1602 goto fail_2;
1603 }
1604 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
1605 if (p == NULL) {
1606 PyErr_NoMemory();
1607 goto fail_2;
1608 }
1609 sprintf(p, "%s=%s", k, v);
1610 envlist[envc++] = p;
1611 }
1612 envlist[envc] = 0;
1613
Guido van Rossum246bc171999-02-01 23:54:31 +00001614 if (mode == _OLD_P_OVERLAY)
1615 mode = _P_OVERLAY;
Guido van Rossuma1065681999-01-25 23:20:23 +00001616 i = _spawnve(mode, path, argvlist, envlist);
1617 if (i == -1)
1618 (void) posix_error();
1619 else
1620 res = Py_BuildValue("i", i);
1621
1622 fail_2:
1623 while (--envc >= 0)
1624 PyMem_DEL(envlist[envc]);
1625 PyMem_DEL(envlist);
1626 fail_1:
1627 PyMem_DEL(argvlist);
1628 Py_XDECREF(vals);
1629 Py_XDECREF(keys);
1630 return res;
1631}
1632#endif /* HAVE_SPAWNV */
1633
1634
Guido van Rossumad0ee831995-03-01 10:34:45 +00001635#ifdef HAVE_FORK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001636static char posix_fork__doc__[] =
1637"fork() -> pid\n\
1638Fork a child process.\n\
1639\n\
1640Return 0 to child process and PID of child to parent process.";
1641
Barry Warsaw53699e91996-12-10 23:23:01 +00001642static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001643posix_fork(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001644 PyObject *self;
1645 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001646{
1647 int pid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001648 if (!PyArg_ParseTuple(args, ":fork"))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001649 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001650 pid = fork();
1651 if (pid == -1)
1652 return posix_error();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001653 PyOS_AfterFork();
Barry Warsaw53699e91996-12-10 23:23:01 +00001654 return PyInt_FromLong((long)pid);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001655}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001656#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001657
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001658
Guido van Rossumad0ee831995-03-01 10:34:45 +00001659#ifdef HAVE_GETEGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001660static char posix_getegid__doc__[] =
1661"getegid() -> egid\n\
1662Return the current process's effective group id.";
1663
Barry Warsaw53699e91996-12-10 23:23:01 +00001664static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001665posix_getegid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001666 PyObject *self;
1667 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001668{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001669 if (!PyArg_ParseTuple(args, ":getegid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001670 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001671 return PyInt_FromLong((long)getegid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001672}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001673#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001674
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001675
Guido van Rossumad0ee831995-03-01 10:34:45 +00001676#ifdef HAVE_GETEUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001677static char posix_geteuid__doc__[] =
1678"geteuid() -> euid\n\
1679Return the current process's effective user id.";
1680
Barry Warsaw53699e91996-12-10 23:23:01 +00001681static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001682posix_geteuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001683 PyObject *self;
1684 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001685{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001686 if (!PyArg_ParseTuple(args, ":geteuid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001687 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001688 return PyInt_FromLong((long)geteuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001689}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001690#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001691
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001692
Guido van Rossumad0ee831995-03-01 10:34:45 +00001693#ifdef HAVE_GETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001694static char posix_getgid__doc__[] =
1695"getgid() -> gid\n\
1696Return the current process's group id.";
1697
Barry Warsaw53699e91996-12-10 23:23:01 +00001698static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001699posix_getgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001700 PyObject *self;
1701 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001702{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001703 if (!PyArg_ParseTuple(args, ":getgid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001704 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001705 return PyInt_FromLong((long)getgid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001706}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001707#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001708
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001709
1710static char posix_getpid__doc__[] =
1711"getpid() -> pid\n\
1712Return the current process id";
1713
Barry Warsaw53699e91996-12-10 23:23:01 +00001714static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001715posix_getpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001716 PyObject *self;
1717 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001718{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001719 if (!PyArg_ParseTuple(args, ":getpid"))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001720 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001721 return PyInt_FromLong((long)getpid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001722}
1723
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001724
Fred Drakec9680921999-12-13 16:37:25 +00001725#ifdef HAVE_GETGROUPS
1726static char posix_getgroups__doc__[] = "\
1727getgroups() -> list of group IDs\n\
1728Return list of supplemental group IDs for the process.";
1729
1730static PyObject *
1731posix_getgroups(self, args)
1732 PyObject *self;
1733 PyObject *args;
1734{
1735 PyObject *result = NULL;
1736
1737 if (PyArg_ParseTuple(args, ":getgroups")) {
1738#ifdef NGROUPS_MAX
1739#define MAX_GROUPS NGROUPS_MAX
1740#else
1741 /* defined to be 16 on Solaris7, so this should be a small number */
1742#define MAX_GROUPS 64
1743#endif
1744 gid_t grouplist[MAX_GROUPS];
1745 int n;
1746
1747 n = getgroups(MAX_GROUPS, grouplist);
1748 if (n < 0)
1749 posix_error();
1750 else {
1751 result = PyList_New(n);
1752 if (result != NULL) {
1753 PyObject *o;
1754 int i;
1755 for (i = 0; i < n; ++i) {
1756 o = PyInt_FromLong((long)grouplist[i]);
1757 if (o == NULL) {
1758 Py_DECREF(result);
1759 result = NULL;
1760 break;
1761 }
1762 PyList_SET_ITEM(result, i, o);
1763 }
1764 }
1765 }
1766 }
1767 return result;
1768}
1769#endif
1770
Guido van Rossumb6775db1994-08-01 11:34:53 +00001771#ifdef HAVE_GETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001772static char posix_getpgrp__doc__[] =
1773"getpgrp() -> pgrp\n\
1774Return the current process group id.";
1775
Barry Warsaw53699e91996-12-10 23:23:01 +00001776static PyObject *
Guido van Rossum04814471991-06-04 20:23:49 +00001777posix_getpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001778 PyObject *self;
1779 PyObject *args;
Guido van Rossum04814471991-06-04 20:23:49 +00001780{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001781 if (!PyArg_ParseTuple(args, ":getpgrp"))
Guido van Rossum04814471991-06-04 20:23:49 +00001782 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001783#ifdef GETPGRP_HAVE_ARG
Barry Warsaw53699e91996-12-10 23:23:01 +00001784 return PyInt_FromLong((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001785#else /* GETPGRP_HAVE_ARG */
Barry Warsaw53699e91996-12-10 23:23:01 +00001786 return PyInt_FromLong((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001787#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001788}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001789#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001790
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001791
Guido van Rossumb6775db1994-08-01 11:34:53 +00001792#ifdef HAVE_SETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001793static char posix_setpgrp__doc__[] =
1794"setpgrp() -> None\n\
1795Make this process a session leader.";
1796
Barry Warsaw53699e91996-12-10 23:23:01 +00001797static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001798posix_setpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001799 PyObject *self;
1800 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001801{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001802 if (!PyArg_ParseTuple(args, ":setpgrp"))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001803 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001804#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001805 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001806#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001807 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001808#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001809 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001810 Py_INCREF(Py_None);
1811 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001812}
1813
Guido van Rossumb6775db1994-08-01 11:34:53 +00001814#endif /* HAVE_SETPGRP */
1815
Guido van Rossumad0ee831995-03-01 10:34:45 +00001816#ifdef HAVE_GETPPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001817static char posix_getppid__doc__[] =
1818"getppid() -> ppid\n\
1819Return the parent's process id.";
1820
Barry Warsaw53699e91996-12-10 23:23:01 +00001821static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001822posix_getppid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001823 PyObject *self;
1824 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001825{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001826 if (!PyArg_ParseTuple(args, ":getppid"))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001827 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001828 return PyInt_FromLong((long)getppid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001829}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001830#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001831
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001832
Fred Drake12c6e2d1999-12-14 21:25:03 +00001833#ifdef HAVE_GETLOGIN
1834static char posix_getlogin__doc__[] = "\
1835getlogin() -> string\n\
1836Return the actual login name.";
1837
1838static PyObject *
1839posix_getlogin(self, args)
1840 PyObject *self;
1841 PyObject *args;
1842{
1843 PyObject *result = NULL;
1844
1845 if (PyArg_ParseTuple(args, ":getlogin")) {
1846 char *name = getlogin();
1847
1848 if (name == NULL)
1849 posix_error();
1850 else
1851 result = PyString_FromString(name);
1852 }
1853 return result;
1854}
1855#endif
1856
Guido van Rossumad0ee831995-03-01 10:34:45 +00001857#ifdef HAVE_GETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001858static char posix_getuid__doc__[] =
1859"getuid() -> uid\n\
1860Return the current process's user id.";
1861
Barry Warsaw53699e91996-12-10 23:23:01 +00001862static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001863posix_getuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001864 PyObject *self;
1865 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001866{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001867 if (!PyArg_ParseTuple(args, ":getuid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001868 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001869 return PyInt_FromLong((long)getuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001870}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001871#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001872
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001873
Guido van Rossumad0ee831995-03-01 10:34:45 +00001874#ifdef HAVE_KILL
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001875static char posix_kill__doc__[] =
1876"kill(pid, sig) -> None\n\
1877Kill a process with a signal.";
1878
Barry Warsaw53699e91996-12-10 23:23:01 +00001879static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001880posix_kill(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001881 PyObject *self;
1882 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001883{
1884 int pid, sig;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001885 if (!PyArg_ParseTuple(args, "ii:kill", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001886 return NULL;
Guido van Rossumd48f2521997-12-05 22:19:34 +00001887#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001888 if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
1889 APIRET rc;
1890 if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00001891 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001892
1893 } else if (sig == XCPT_SIGNAL_KILLPROC) {
1894 APIRET rc;
1895 if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00001896 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001897
1898 } else
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001899 return NULL; /* Unrecognized Signal Requested */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001900#else
Guido van Rossum85e3b011991-06-03 12:42:10 +00001901 if (kill(pid, sig) == -1)
1902 return posix_error();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001903#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001904 Py_INCREF(Py_None);
1905 return Py_None;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001906}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001907#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001908
Guido van Rossumc0125471996-06-28 18:55:32 +00001909#ifdef HAVE_PLOCK
1910
1911#ifdef HAVE_SYS_LOCK_H
1912#include <sys/lock.h>
1913#endif
1914
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001915static char posix_plock__doc__[] =
1916"plock(op) -> None\n\
1917Lock program segments into memory.";
1918
Barry Warsaw53699e91996-12-10 23:23:01 +00001919static PyObject *
Guido van Rossumc0125471996-06-28 18:55:32 +00001920posix_plock(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001921 PyObject *self;
1922 PyObject *args;
Guido van Rossumc0125471996-06-28 18:55:32 +00001923{
1924 int op;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001925 if (!PyArg_ParseTuple(args, "i:plock", &op))
Guido van Rossumc0125471996-06-28 18:55:32 +00001926 return NULL;
1927 if (plock(op) == -1)
1928 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001929 Py_INCREF(Py_None);
1930 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00001931}
1932#endif
1933
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001934
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001935#ifdef HAVE_POPEN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001936static char posix_popen__doc__[] =
1937"popen(command [, mode='r' [, bufsize]]) -> pipe\n\
1938Open a pipe to/from a command returning a file object.";
1939
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001940#if defined(PYOS_OS2)
Guido van Rossumd48f2521997-12-05 22:19:34 +00001941static int
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001942async_system(const char *command)
1943{
1944 char *p, errormsg[256], args[1024];
1945 RESULTCODES rcodes;
1946 APIRET rc;
1947 char *shell = getenv("COMSPEC");
1948 if (!shell)
1949 shell = "cmd";
1950
1951 strcpy(args, shell);
1952 p = &args[ strlen(args)+1 ];
1953 strcpy(p, "/c ");
1954 strcat(p, command);
1955 p += strlen(p) + 1;
1956 *p = '\0';
1957
1958 rc = DosExecPgm(errormsg, sizeof(errormsg),
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001959 EXEC_ASYNC, /* Execute Async w/o Wait for Results */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001960 args,
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001961 NULL, /* Inherit Parent's Environment */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001962 &rcodes, shell);
1963 return rc;
1964}
1965
Guido van Rossumd48f2521997-12-05 22:19:34 +00001966static FILE *
1967popen(const char *command, const char *mode, int pipesize, int *err)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001968{
1969 HFILE rhan, whan;
1970 FILE *retfd = NULL;
1971 APIRET rc = DosCreatePipe(&rhan, &whan, pipesize);
1972
Guido van Rossumd48f2521997-12-05 22:19:34 +00001973 if (rc != NO_ERROR) {
1974 *err = rc;
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001975 return NULL; /* ERROR - Unable to Create Anon Pipe */
Guido van Rossumd48f2521997-12-05 22:19:34 +00001976 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001977
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001978 if (strchr(mode, 'r') != NULL) { /* Treat Command as a Data Source */
1979 int oldfd = dup(1); /* Save STDOUT Handle in Another Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001980
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001981 DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
1982 close(1); /* Make STDOUT Available for Reallocation */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001983
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001984 if (dup2(whan, 1) == 0) { /* Connect STDOUT to Pipe Write Side */
1985 DosClose(whan); /* Close Now-Unused Pipe Write Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001986
1987 if (async_system(command) == NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00001988 retfd = fdopen(rhan, mode); /* And Return Pipe Read Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001989 }
1990
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001991 dup2(oldfd, 1); /* Reconnect STDOUT to Original Handle */
1992 DosExitCritSec(); /* Now Allow Other Threads to Run */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001993
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001994 close(oldfd); /* And Close Saved STDOUT Handle */
1995 return retfd; /* Return fd of Pipe or NULL if Error */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001996
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001997 } else if (strchr(mode, 'w')) { /* Treat Command as a Data Sink */
1998 int oldfd = dup(0); /* Save STDIN Handle in Another Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001999
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002000 DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
2001 close(0); /* Make STDIN Available for Reallocation */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002002
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002003 if (dup2(rhan, 0) == 0) { /* Connect STDIN to Pipe Read Side */
2004 DosClose(rhan); /* Close Now-Unused Pipe Read Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002005
2006 if (async_system(command) == NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002007 retfd = fdopen(whan, mode); /* And Return Pipe Write Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002008 }
2009
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002010 dup2(oldfd, 0); /* Reconnect STDIN to Original Handle */
2011 DosExitCritSec(); /* Now Allow Other Threads to Run */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002012
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002013 close(oldfd); /* And Close Saved STDIN Handle */
2014 return retfd; /* Return fd of Pipe or NULL if Error */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002015
Guido van Rossumd48f2521997-12-05 22:19:34 +00002016 } else {
2017 *err = ERROR_INVALID_ACCESS;
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002018 return NULL; /* ERROR - Invalid Mode (Neither Read nor Write) */
Guido van Rossumd48f2521997-12-05 22:19:34 +00002019 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002020}
2021
2022static PyObject *
2023posix_popen(self, args)
2024 PyObject *self;
2025 PyObject *args;
2026{
2027 char *name;
2028 char *mode = "r";
Guido van Rossumd48f2521997-12-05 22:19:34 +00002029 int err, bufsize = -1;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002030 FILE *fp;
2031 PyObject *f;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002032 if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002033 return NULL;
2034 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd48f2521997-12-05 22:19:34 +00002035 fp = popen(name, mode, (bufsize > 0) ? bufsize : 4096, &err);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002036 Py_END_ALLOW_THREADS
2037 if (fp == NULL)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002038 return os2_error(err);
2039
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002040 f = PyFile_FromFile(fp, name, mode, fclose);
2041 if (f != NULL)
2042 PyFile_SetBufSize(f, bufsize);
2043 return f;
2044}
2045
2046#else
Barry Warsaw53699e91996-12-10 23:23:01 +00002047static PyObject *
Guido van Rossum3b066191991-06-04 19:40:25 +00002048posix_popen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002049 PyObject *self;
2050 PyObject *args;
Guido van Rossum3b066191991-06-04 19:40:25 +00002051{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002052 char *name;
2053 char *mode = "r";
2054 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00002055 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002056 PyObject *f;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002057 if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00002058 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002059 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002060 fp = popen(name, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002061 Py_END_ALLOW_THREADS
Guido van Rossum3b066191991-06-04 19:40:25 +00002062 if (fp == NULL)
2063 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002064 f = PyFile_FromFile(fp, name, mode, pclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002065 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002066 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002067 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00002068}
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002069#endif
2070
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002071#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00002072
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002073
Guido van Rossumb6775db1994-08-01 11:34:53 +00002074#ifdef HAVE_SETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002075static char posix_setuid__doc__[] =
2076"setuid(uid) -> None\n\
2077Set the current process's user id.";
Barry Warsaw53699e91996-12-10 23:23:01 +00002078static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002079posix_setuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002080 PyObject *self;
2081 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002082{
2083 int uid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002084 if (!PyArg_ParseTuple(args, "i:setuid", &uid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002085 return NULL;
2086 if (setuid(uid) < 0)
2087 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002088 Py_INCREF(Py_None);
2089 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002090}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002091#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002092
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002093
Guido van Rossumb6775db1994-08-01 11:34:53 +00002094#ifdef HAVE_SETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002095static char posix_setgid__doc__[] =
2096"setgid(gid) -> None\n\
2097Set the current process's group id.";
2098
Barry Warsaw53699e91996-12-10 23:23:01 +00002099static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002100posix_setgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002101 PyObject *self;
2102 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002103{
2104 int gid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002105 if (!PyArg_ParseTuple(args, "i:setgid", &gid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002106 return NULL;
2107 if (setgid(gid) < 0)
2108 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002109 Py_INCREF(Py_None);
2110 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002111}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002112#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002113
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002114
Guido van Rossumb6775db1994-08-01 11:34:53 +00002115#ifdef HAVE_WAITPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002116static char posix_waitpid__doc__[] =
2117"waitpid(pid, options) -> (pid, status)\n\
2118Wait for completion of a give child process.";
2119
Barry Warsaw53699e91996-12-10 23:23:01 +00002120static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00002121posix_waitpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002122 PyObject *self;
2123 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00002124{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002125 int pid, options;
2126#ifdef UNION_WAIT
2127 union wait status;
2128#define status_i (status.w_status)
2129#else
2130 int status;
2131#define status_i status
2132#endif
2133 status_i = 0;
2134
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002135 if (!PyArg_ParseTuple(args, "ii:waitpid", &pid, &options))
Guido van Rossum21803b81992-08-09 12:55:27 +00002136 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002137 Py_BEGIN_ALLOW_THREADS
Guido van Rossume6a3aa61999-02-01 16:15:30 +00002138#ifdef NeXT
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002139 pid = wait4(pid, &status, options, NULL);
Guido van Rossume6a3aa61999-02-01 16:15:30 +00002140#else
2141 pid = waitpid(pid, &status, options);
2142#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002143 Py_END_ALLOW_THREADS
Guido van Rossum85e3b011991-06-03 12:42:10 +00002144 if (pid == -1)
2145 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00002146 else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002147 return Py_BuildValue("ii", pid, status_i);
Guido van Rossum21803b81992-08-09 12:55:27 +00002148}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002149#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00002150
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002151
Guido van Rossumad0ee831995-03-01 10:34:45 +00002152#ifdef HAVE_WAIT
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002153static char posix_wait__doc__[] =
2154"wait() -> (pid, status)\n\
2155Wait for completion of a child process.";
2156
Barry Warsaw53699e91996-12-10 23:23:01 +00002157static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00002158posix_wait(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002159 PyObject *self;
2160 PyObject *args;
Guido van Rossum21803b81992-08-09 12:55:27 +00002161{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002162 int pid;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002163#ifdef UNION_WAIT
2164 union wait status;
2165#define status_i (status.w_status)
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002166#else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002167 int status;
2168#define status_i status
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002169#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002170 if (!PyArg_ParseTuple(args, ":wait"))
2171 return NULL;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002172 status_i = 0;
2173 Py_BEGIN_ALLOW_THREADS
2174 pid = wait(&status);
Barry Warsaw53699e91996-12-10 23:23:01 +00002175 Py_END_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00002176 if (pid == -1)
2177 return posix_error();
2178 else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002179 return Py_BuildValue("ii", pid, status_i);
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002180#undef status_i
Guido van Rossum85e3b011991-06-03 12:42:10 +00002181}
Guido van Rossumad0ee831995-03-01 10:34:45 +00002182#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00002183
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002184
2185static char posix_lstat__doc__[] =
2186"lstat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
2187Like stat(path), but do not follow symbolic links.";
2188
Barry Warsaw53699e91996-12-10 23:23:01 +00002189static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002190posix_lstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002191 PyObject *self;
2192 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002193{
Guido van Rossumb6775db1994-08-01 11:34:53 +00002194#ifdef HAVE_LSTAT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002195 return posix_do_stat(self, args, "s:lstat", lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002196#else /* !HAVE_LSTAT */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002197 return posix_do_stat(self, args, "s:lstat", stat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002198#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002199}
2200
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002201
Guido van Rossumb6775db1994-08-01 11:34:53 +00002202#ifdef HAVE_READLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002203static char posix_readlink__doc__[] =
2204"readlink(path) -> path\n\
2205Return a string representing the path to which the symbolic link points.";
2206
Barry Warsaw53699e91996-12-10 23:23:01 +00002207static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002208posix_readlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002209 PyObject *self;
2210 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002211{
Guido van Rossumb6775db1994-08-01 11:34:53 +00002212 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002213 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002214 int n;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002215 if (!PyArg_ParseTuple(args, "s:readlink", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002216 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002217 Py_BEGIN_ALLOW_THREADS
Guido van Rossum50e61dc1992-03-27 17:22:31 +00002218 n = readlink(path, buf, (int) sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +00002219 Py_END_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002220 if (n < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00002221 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00002222 return PyString_FromStringAndSize(buf, n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002223}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002224#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002225
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002226
Guido van Rossumb6775db1994-08-01 11:34:53 +00002227#ifdef HAVE_SYMLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002228static char posix_symlink__doc__[] =
2229"symlink(src, dst) -> None\n\
2230Create a symbolic link.";
2231
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002232static PyObject *
2233posix_symlink(self, args)
2234 PyObject *self;
2235 PyObject *args;
2236{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002237 return posix_2str(args, "ss:symlink", symlink);
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002238}
2239#endif /* HAVE_SYMLINK */
2240
2241
2242#ifdef HAVE_TIMES
2243#ifndef HZ
2244#define HZ 60 /* Universal constant :-) */
2245#endif /* HZ */
2246
Guido van Rossumd48f2521997-12-05 22:19:34 +00002247#if defined(PYCC_VACPP) && defined(PYOS_OS2)
2248static long
2249system_uptime()
2250{
2251 ULONG value = 0;
2252
2253 Py_BEGIN_ALLOW_THREADS
2254 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &value, sizeof(value));
2255 Py_END_ALLOW_THREADS
2256
2257 return value;
2258}
2259
2260static PyObject *
2261posix_times(self, args)
2262 PyObject *self;
2263 PyObject *args;
2264{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002265 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossumd48f2521997-12-05 22:19:34 +00002266 return NULL;
2267
2268 /* Currently Only Uptime is Provided -- Others Later */
2269 return Py_BuildValue("ddddd",
2270 (double)0 /* t.tms_utime / HZ */,
2271 (double)0 /* t.tms_stime / HZ */,
2272 (double)0 /* t.tms_cutime / HZ */,
2273 (double)0 /* t.tms_cstime / HZ */,
2274 (double)system_uptime() / 1000);
2275}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002276#else /* not OS2 */
Barry Warsaw53699e91996-12-10 23:23:01 +00002277static PyObject *
Guido van Rossum22db57e1992-04-05 14:25:30 +00002278posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002279 PyObject *self;
2280 PyObject *args;
Guido van Rossum22db57e1992-04-05 14:25:30 +00002281{
2282 struct tms t;
2283 clock_t c;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002284 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossum22db57e1992-04-05 14:25:30 +00002285 return NULL;
2286 errno = 0;
2287 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00002288 if (c == (clock_t) -1)
2289 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002290 return Py_BuildValue("ddddd",
Barry Warsaw43d68b81996-12-19 22:10:44 +00002291 (double)t.tms_utime / HZ,
2292 (double)t.tms_stime / HZ,
2293 (double)t.tms_cutime / HZ,
2294 (double)t.tms_cstime / HZ,
2295 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00002296}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002297#endif /* not OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002298#endif /* HAVE_TIMES */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002299
2300
Guido van Rossum87755a21996-09-07 00:59:43 +00002301#ifdef MS_WIN32
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002302#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00002303static PyObject *
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002304posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002305 PyObject *self;
2306 PyObject *args;
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002307{
2308 FILETIME create, exit, kernel, user;
2309 HANDLE hProc;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002310 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002311 return NULL;
2312 hProc = GetCurrentProcess();
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00002313 GetProcessTimes(hProc, &create, &exit, &kernel, &user);
2314 /* The fields of a FILETIME structure are the hi and lo part
2315 of a 64-bit value expressed in 100 nanosecond units.
2316 1e7 is one second in such units; 1e-7 the inverse.
2317 429.4967296 is 2**32 / 1e7 or 2**32 * 1e-7.
2318 */
Barry Warsaw53699e91996-12-10 23:23:01 +00002319 return Py_BuildValue(
2320 "ddddd",
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00002321 (double)(kernel.dwHighDateTime*429.4967296 +
2322 kernel.dwLowDateTime*1e-7),
2323 (double)(user.dwHighDateTime*429.4967296 +
2324 user.dwLowDateTime*1e-7),
Barry Warsaw53699e91996-12-10 23:23:01 +00002325 (double)0,
2326 (double)0,
2327 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002328}
Guido van Rossum8d665e61996-06-26 18:22:49 +00002329#endif /* MS_WIN32 */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002330
2331#ifdef HAVE_TIMES
Roger E. Masse0318fd61997-06-05 22:07:58 +00002332static char posix_times__doc__[] =
2333"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\
2334Return a tuple of floating point numbers indicating process times.";
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002335#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002336
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002337
Guido van Rossumb6775db1994-08-01 11:34:53 +00002338#ifdef HAVE_SETSID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002339static char posix_setsid__doc__[] =
2340"setsid() -> None\n\
2341Call the system call setsid().";
2342
Barry Warsaw53699e91996-12-10 23:23:01 +00002343static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00002344posix_setsid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002345 PyObject *self;
2346 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002347{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002348 if (!PyArg_ParseTuple(args, ":setsid"))
Guido van Rossumc2670a01992-09-13 20:07:29 +00002349 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002350 if (setsid() < 0)
2351 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002352 Py_INCREF(Py_None);
2353 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002354}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002355#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00002356
Guido van Rossumb6775db1994-08-01 11:34:53 +00002357#ifdef HAVE_SETPGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002358static char posix_setpgid__doc__[] =
2359"setpgid(pid, pgrp) -> None\n\
2360Call the system call setpgid().";
2361
Barry Warsaw53699e91996-12-10 23:23:01 +00002362static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00002363posix_setpgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002364 PyObject *self;
2365 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002366{
2367 int pid, pgrp;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002368 if (!PyArg_ParseTuple(args, "ii:setpgid", &pid, &pgrp))
Guido van Rossumc2670a01992-09-13 20:07:29 +00002369 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002370 if (setpgid(pid, pgrp) < 0)
2371 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002372 Py_INCREF(Py_None);
2373 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002374}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002375#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00002376
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002377
Guido van Rossumb6775db1994-08-01 11:34:53 +00002378#ifdef HAVE_TCGETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002379static char posix_tcgetpgrp__doc__[] =
2380"tcgetpgrp(fd) -> pgid\n\
2381Return the process group associated with the terminal given by a fd.";
2382
Barry Warsaw53699e91996-12-10 23:23:01 +00002383static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00002384posix_tcgetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002385 PyObject *self;
2386 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002387{
2388 int fd, pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002389 if (!PyArg_ParseTuple(args, "i:tcgetpgrp", &fd))
Guido van Rossum7066dd71992-09-17 17:54:56 +00002390 return NULL;
2391 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002392 if (pgid < 0)
2393 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002394 return PyInt_FromLong((long)pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00002395}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002396#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00002397
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002398
Guido van Rossumb6775db1994-08-01 11:34:53 +00002399#ifdef HAVE_TCSETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002400static char posix_tcsetpgrp__doc__[] =
2401"tcsetpgrp(fd, pgid) -> None\n\
2402Set the process group associated with the terminal given by a fd.";
2403
Barry Warsaw53699e91996-12-10 23:23:01 +00002404static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00002405posix_tcsetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002406 PyObject *self;
2407 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002408{
2409 int fd, pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002410 if (!PyArg_ParseTuple(args, "ii:tcsetpgrp", &fd, &pgid))
Guido van Rossum7066dd71992-09-17 17:54:56 +00002411 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002412 if (tcsetpgrp(fd, pgid) < 0)
2413 return posix_error();
Barry Warsaw43d68b81996-12-19 22:10:44 +00002414 Py_INCREF(Py_None);
Barry Warsaw53699e91996-12-10 23:23:01 +00002415 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002416}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002417#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00002418
Guido van Rossum687dd131993-05-17 08:34:16 +00002419/* Functions acting on file descriptors */
2420
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002421static char posix_open__doc__[] =
2422"open(filename, flag [, mode=0777]) -> fd\n\
2423Open a file (for low level IO).";
2424
Barry Warsaw53699e91996-12-10 23:23:01 +00002425static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002426posix_open(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002427 PyObject *self;
2428 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002429{
2430 char *file;
2431 int flag;
2432 int mode = 0777;
2433 int fd;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002434 if (!PyArg_ParseTuple(args, "si|i", &file, &flag, &mode))
2435 return NULL;
2436
Barry Warsaw53699e91996-12-10 23:23:01 +00002437 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002438 fd = open(file, flag, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002439 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002440 if (fd < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00002441 return posix_error_with_filename(file);
Barry Warsaw53699e91996-12-10 23:23:01 +00002442 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002443}
2444
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002445
2446static char posix_close__doc__[] =
2447"close(fd) -> None\n\
2448Close a file descriptor (for low level IO).";
2449
Barry Warsaw53699e91996-12-10 23:23:01 +00002450static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002451posix_close(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002452 PyObject *self;
2453 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002454{
2455 int fd, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002456 if (!PyArg_ParseTuple(args, "i:close", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002457 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002458 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002459 res = close(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00002460 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002461 if (res < 0)
2462 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002463 Py_INCREF(Py_None);
2464 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00002465}
2466
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002467
2468static char posix_dup__doc__[] =
2469"dup(fd) -> fd2\n\
2470Return a duplicate of a file descriptor.";
2471
Barry Warsaw53699e91996-12-10 23:23:01 +00002472static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002473posix_dup(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002474 PyObject *self;
2475 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002476{
2477 int fd;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002478 if (!PyArg_ParseTuple(args, "i:dup", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002479 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002480 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002481 fd = dup(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00002482 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002483 if (fd < 0)
2484 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002485 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002486}
2487
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002488
2489static char posix_dup2__doc__[] =
2490"dup2(fd, fd2) -> None\n\
2491Duplicate file descriptor.";
2492
Barry Warsaw53699e91996-12-10 23:23:01 +00002493static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002494posix_dup2(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002495 PyObject *self;
2496 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002497{
2498 int fd, fd2, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002499 if (!PyArg_ParseTuple(args, "ii:dup2", &fd, &fd2))
Guido van Rossum687dd131993-05-17 08:34:16 +00002500 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002501 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002502 res = dup2(fd, fd2);
Barry Warsaw53699e91996-12-10 23:23:01 +00002503 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002504 if (res < 0)
2505 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002506 Py_INCREF(Py_None);
2507 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00002508}
2509
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002510
2511static char posix_lseek__doc__[] =
2512"lseek(fd, pos, how) -> newpos\n\
2513Set the current position of a file descriptor.";
2514
Barry Warsaw53699e91996-12-10 23:23:01 +00002515static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002516posix_lseek(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002517 PyObject *self;
2518 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002519{
2520 int fd, how;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002521 off_t pos, res;
2522 PyObject *posobj;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002523 if (!PyArg_ParseTuple(args, "iOi:lseek", &fd, &posobj, &how))
Guido van Rossum687dd131993-05-17 08:34:16 +00002524 return NULL;
2525#ifdef SEEK_SET
2526 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
2527 switch (how) {
2528 case 0: how = SEEK_SET; break;
2529 case 1: how = SEEK_CUR; break;
2530 case 2: how = SEEK_END; break;
2531 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002532#endif /* SEEK_END */
Guido van Rossum94f6f721999-01-06 18:42:14 +00002533
2534#if !defined(HAVE_LARGEFILE_SUPPORT)
2535 pos = PyInt_AsLong(posobj);
2536#else
2537 pos = PyLong_Check(posobj) ?
2538 PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj);
2539#endif
2540 if (PyErr_Occurred())
2541 return NULL;
2542
Barry Warsaw53699e91996-12-10 23:23:01 +00002543 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002544 res = lseek(fd, pos, how);
Barry Warsaw53699e91996-12-10 23:23:01 +00002545 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002546 if (res < 0)
2547 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00002548
2549#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +00002550 return PyInt_FromLong(res);
Guido van Rossum94f6f721999-01-06 18:42:14 +00002551#else
2552 return PyLong_FromLongLong(res);
2553#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002554}
2555
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002556
2557static char posix_read__doc__[] =
2558"read(fd, buffersize) -> string\n\
2559Read a file descriptor.";
2560
Barry Warsaw53699e91996-12-10 23:23:01 +00002561static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002562posix_read(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002563 PyObject *self;
2564 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002565{
Guido van Rossum8bac5461996-06-11 18:38:48 +00002566 int fd, size, n;
Barry Warsaw53699e91996-12-10 23:23:01 +00002567 PyObject *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002568 if (!PyArg_ParseTuple(args, "ii:read", &fd, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00002569 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002570 buffer = PyString_FromStringAndSize((char *)NULL, size);
Guido van Rossum687dd131993-05-17 08:34:16 +00002571 if (buffer == NULL)
2572 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002573 Py_BEGIN_ALLOW_THREADS
2574 n = read(fd, PyString_AsString(buffer), size);
2575 Py_END_ALLOW_THREADS
Guido van Rossum8bac5461996-06-11 18:38:48 +00002576 if (n < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002577 Py_DECREF(buffer);
Guido van Rossum687dd131993-05-17 08:34:16 +00002578 return posix_error();
2579 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00002580 if (n != size)
Barry Warsaw53699e91996-12-10 23:23:01 +00002581 _PyString_Resize(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00002582 return buffer;
2583}
2584
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002585
2586static char posix_write__doc__[] =
2587"write(fd, string) -> byteswritten\n\
2588Write a string to a file descriptor.";
2589
Barry Warsaw53699e91996-12-10 23:23:01 +00002590static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002591posix_write(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002592 PyObject *self;
2593 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002594{
2595 int fd, size;
2596 char *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002597 if (!PyArg_ParseTuple(args, "is#:write", &fd, &buffer, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00002598 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002599 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002600 size = write(fd, buffer, size);
Barry Warsaw53699e91996-12-10 23:23:01 +00002601 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002602 if (size < 0)
2603 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002604 return PyInt_FromLong((long)size);
Guido van Rossum687dd131993-05-17 08:34:16 +00002605}
2606
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002607
2608static char posix_fstat__doc__[]=
2609"fstat(fd) -> (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\
2610Like stat(), but for an open file descriptor.";
2611
Barry Warsaw53699e91996-12-10 23:23:01 +00002612static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002613posix_fstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002614 PyObject *self;
2615 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002616{
2617 int fd;
2618 struct stat st;
2619 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002620 if (!PyArg_ParseTuple(args, "i:fstat", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002621 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002622 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002623 res = fstat(fd, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00002624 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002625 if (res != 0)
2626 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00002627#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +00002628 return Py_BuildValue("(llllllllll)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00002629 (long)st.st_mode,
2630 (long)st.st_ino,
2631 (long)st.st_dev,
2632 (long)st.st_nlink,
2633 (long)st.st_uid,
2634 (long)st.st_gid,
2635 (long)st.st_size,
2636 (long)st.st_atime,
2637 (long)st.st_mtime,
2638 (long)st.st_ctime);
Guido van Rossum94f6f721999-01-06 18:42:14 +00002639#else
2640 return Py_BuildValue("(lLllllLlll)",
2641 (long)st.st_mode,
2642 (LONG_LONG)st.st_ino,
2643 (long)st.st_dev,
2644 (long)st.st_nlink,
2645 (long)st.st_uid,
2646 (long)st.st_gid,
2647 (LONG_LONG)st.st_size,
2648 (long)st.st_atime,
2649 (long)st.st_mtime,
2650 (long)st.st_ctime);
2651#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002652}
2653
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002654
2655static char posix_fdopen__doc__[] =
2656"fdopen(fd, [, mode='r' [, bufsize]]) -> file_object\n\
2657Return an open file object connected to a file descriptor.";
2658
Barry Warsaw53699e91996-12-10 23:23:01 +00002659static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002660posix_fdopen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002661 PyObject *self;
2662 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002663{
Barry Warsaw53699e91996-12-10 23:23:01 +00002664 extern int fclose Py_PROTO((FILE *));
Guido van Rossum687dd131993-05-17 08:34:16 +00002665 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002666 char *mode = "r";
2667 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00002668 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002669 PyObject *f;
2670 if (!PyArg_ParseTuple(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00002671 return NULL;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002672
Barry Warsaw53699e91996-12-10 23:23:01 +00002673 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002674 fp = fdopen(fd, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002675 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002676 if (fp == NULL)
2677 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002678 f = PyFile_FromFile(fp, "(fdopen)", mode, fclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002679 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002680 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002681 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00002682}
2683
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002684
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002685#ifdef HAVE_PIPE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002686static char posix_pipe__doc__[] =
2687"pipe() -> (read_end, write_end)\n\
2688Create a pipe.";
2689
Barry Warsaw53699e91996-12-10 23:23:01 +00002690static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002691posix_pipe(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002692 PyObject *self;
2693 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002694{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002695#if defined(PYOS_OS2)
2696 HFILE read, write;
2697 APIRET rc;
2698
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002699 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002700 return NULL;
2701
2702 Py_BEGIN_ALLOW_THREADS
2703 rc = DosCreatePipe( &read, &write, 4096);
2704 Py_END_ALLOW_THREADS
2705 if (rc != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002706 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002707
2708 return Py_BuildValue("(ii)", read, write);
2709#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002710#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00002711 int fds[2];
2712 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002713 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum687dd131993-05-17 08:34:16 +00002714 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002715 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002716 res = pipe(fds);
Barry Warsaw53699e91996-12-10 23:23:01 +00002717 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002718 if (res != 0)
2719 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002720 return Py_BuildValue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002721#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00002722 HANDLE read, write;
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002723 int read_fd, write_fd;
Guido van Rossum794d8131994-08-23 13:48:48 +00002724 BOOL ok;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002725 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum794d8131994-08-23 13:48:48 +00002726 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002727 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002728 ok = CreatePipe(&read, &write, NULL, 0);
Barry Warsaw53699e91996-12-10 23:23:01 +00002729 Py_END_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00002730 if (!ok)
2731 return posix_error();
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002732 read_fd = _open_osfhandle((long)read, 0);
2733 write_fd = _open_osfhandle((long)write, 1);
2734 return Py_BuildValue("(ii)", read_fd, write_fd);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002735#endif /* MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002736#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002737}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002738#endif /* HAVE_PIPE */
2739
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002740
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002741#ifdef HAVE_MKFIFO
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002742static char posix_mkfifo__doc__[] =
2743"mkfifo(file, [, mode=0666]) -> None\n\
2744Create a FIFO (a POSIX named pipe).";
2745
Barry Warsaw53699e91996-12-10 23:23:01 +00002746static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002747posix_mkfifo(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002748 PyObject *self;
2749 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002750{
2751 char *file;
2752 int mode = 0666;
2753 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002754 if (!PyArg_ParseTuple(args, "s|i:mkfifo", &file, &mode))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002755 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002756 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002757 res = mkfifo(file, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002758 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002759 if (res < 0)
2760 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002761 Py_INCREF(Py_None);
2762 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002763}
2764#endif
2765
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002766
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002767#ifdef HAVE_FTRUNCATE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002768static char posix_ftruncate__doc__[] =
2769"ftruncate(fd, length) -> None\n\
2770Truncate a file to a specified length.";
2771
Barry Warsaw53699e91996-12-10 23:23:01 +00002772static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002773posix_ftruncate(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002774 PyObject *self; /* Not used */
2775 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002776{
2777 int fd;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002778 off_t length;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002779 int res;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002780 PyObject *lenobj;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002781
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002782 if (!PyArg_ParseTuple(args, "iO:ftruncate", &fd, &lenobj))
Guido van Rossum94f6f721999-01-06 18:42:14 +00002783 return NULL;
2784
2785#if !defined(HAVE_LARGEFILE_SUPPORT)
2786 length = PyInt_AsLong(lenobj);
2787#else
2788 length = PyLong_Check(lenobj) ?
2789 PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj);
2790#endif
2791 if (PyErr_Occurred())
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002792 return NULL;
2793
Barry Warsaw53699e91996-12-10 23:23:01 +00002794 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002795 res = ftruncate(fd, length);
Barry Warsaw53699e91996-12-10 23:23:01 +00002796 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002797 if (res < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002798 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002799 return NULL;
2800 }
Barry Warsaw53699e91996-12-10 23:23:01 +00002801 Py_INCREF(Py_None);
2802 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002803}
2804#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002805
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002806#ifdef NeXT
2807#define HAVE_PUTENV
2808/* Steve Spicklemire got this putenv from NeXTAnswers */
2809static int
2810putenv(char *newval)
2811{
2812 extern char **environ;
2813
2814 static int firstTime = 1;
2815 char **ep;
2816 char *cp;
2817 int esiz;
2818 char *np;
2819
2820 if (!(np = strchr(newval, '=')))
2821 return 1;
2822 *np = '\0';
2823
2824 /* look it up */
2825 for (ep=environ ; *ep ; ep++)
2826 {
2827 /* this should always be true... */
2828 if (cp = strchr(*ep, '='))
2829 {
2830 *cp = '\0';
2831 if (!strcmp(*ep, newval))
2832 {
2833 /* got it! */
2834 *cp = '=';
2835 break;
2836 }
2837 *cp = '=';
2838 }
2839 else
2840 {
2841 *np = '=';
2842 return 1;
2843 }
2844 }
2845
2846 *np = '=';
2847 if (*ep)
2848 {
2849 /* the string was already there:
2850 just replace it with the new one */
2851 *ep = newval;
2852 return 0;
2853 }
2854
2855 /* expand environ by one */
2856 for (esiz=2, ep=environ ; *ep ; ep++)
2857 esiz++;
2858 if (firstTime)
2859 {
2860 char **epp;
2861 char **newenv;
2862 if (!(newenv = malloc(esiz * sizeof(char *))))
2863 return 1;
2864
2865 for (ep=environ, epp=newenv ; *ep ;)
2866 *epp++ = *ep++;
2867 *epp++ = newval;
2868 *epp = (char *) 0;
2869 environ = newenv;
2870 }
2871 else
2872 {
2873 if (!(environ = realloc(environ, esiz * sizeof(char *))))
2874 return 1;
2875 environ[esiz - 2] = newval;
2876 environ[esiz - 1] = (char *) 0;
2877 firstTime = 0;
2878 }
2879
2880 return 0;
2881}
Guido van Rossumc6ef2041997-08-21 02:30:45 +00002882#endif /* NeXT */
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002883
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002884
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002885#ifdef HAVE_PUTENV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002886static char posix_putenv__doc__[] =
2887"putenv(key, value) -> None\n\
2888Change or add an environment variable.";
2889
Guido van Rossumbcc20741998-08-04 22:53:56 +00002890#ifdef __BEOS__
2891/* We have putenv(), but not in the headers (as of PR2). - [cjh] */
2892int putenv( const char *str );
2893#endif
2894
Fred Drake762e2061999-08-26 17:23:54 +00002895/* Save putenv() parameters as values here, so we can collect them when they
2896 * get re-set with another call for the same key. */
2897static PyObject *posix_putenv_garbage;
2898
Barry Warsaw53699e91996-12-10 23:23:01 +00002899static PyObject *
Guido van Rossumb6a47161997-09-15 22:54:34 +00002900posix_putenv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002901 PyObject *self;
2902 PyObject *args;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002903{
2904 char *s1, *s2;
2905 char *new;
Fred Drake762e2061999-08-26 17:23:54 +00002906 PyObject *newstr;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002907
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002908 if (!PyArg_ParseTuple(args, "ss:putenv", &s1, &s2))
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002909 return NULL;
Guido van Rossumd48f2521997-12-05 22:19:34 +00002910
2911#if defined(PYOS_OS2)
2912 if (stricmp(s1, "BEGINLIBPATH") == 0) {
2913 APIRET rc;
2914
2915 if (strlen(s2) == 0) /* If New Value is an Empty String */
2916 s2 = NULL; /* Then OS/2 API Wants a NULL to Undefine It */
2917
2918 rc = DosSetExtLIBPATH(s2, BEGIN_LIBPATH);
2919 if (rc != NO_ERROR)
2920 return os2_error(rc);
2921
2922 } else if (stricmp(s1, "ENDLIBPATH") == 0) {
2923 APIRET rc;
2924
2925 if (strlen(s2) == 0) /* If New Value is an Empty String */
2926 s2 = NULL; /* Then OS/2 API Wants a NULL to Undefine It */
2927
2928 rc = DosSetExtLIBPATH(s2, END_LIBPATH);
2929 if (rc != NO_ERROR)
2930 return os2_error(rc);
2931 } else {
2932#endif
2933
Fred Drake762e2061999-08-26 17:23:54 +00002934 /* XXX This can leak memory -- not easy to fix :-( */
2935 newstr = PyString_FromStringAndSize(NULL, strlen(s1) + strlen(s2) + 2);
2936 if (newstr == NULL)
2937 return PyErr_NoMemory();
2938 new = PyString_AS_STRING(newstr);
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002939 (void) sprintf(new, "%s=%s", s1, s2);
2940 if (putenv(new)) {
2941 posix_error();
2942 return NULL;
2943 }
Fred Drake762e2061999-08-26 17:23:54 +00002944 /* Install the first arg and newstr in posix_putenv_garbage;
2945 * this will cause previous value to be collected. This has to
2946 * happen after the real putenv() call because the old value
2947 * was still accessible until then. */
2948 if (PyDict_SetItem(posix_putenv_garbage,
2949 PyTuple_GET_ITEM(args, 0), newstr)) {
2950 /* really not much we can do; just leak */
2951 PyErr_Clear();
2952 }
2953 else {
2954 Py_DECREF(newstr);
2955 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00002956
2957#if defined(PYOS_OS2)
2958 }
2959#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002960 Py_INCREF(Py_None);
2961 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002962}
Guido van Rossumb6a47161997-09-15 22:54:34 +00002963#endif /* putenv */
2964
2965#ifdef HAVE_STRERROR
2966static char posix_strerror__doc__[] =
2967"strerror(code) -> string\n\
2968Translate an error code to a message string.";
2969
2970PyObject *
2971posix_strerror(self, args)
2972 PyObject *self;
2973 PyObject *args;
2974{
2975 int code;
2976 char *message;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002977 if (!PyArg_ParseTuple(args, "i:strerror", &code))
Guido van Rossumb6a47161997-09-15 22:54:34 +00002978 return NULL;
2979 message = strerror(code);
2980 if (message == NULL) {
2981 PyErr_SetString(PyExc_ValueError,
2982 "strerror code out of range");
2983 return NULL;
2984 }
2985 return PyString_FromString(message);
2986}
2987#endif /* strerror */
2988
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002989
Guido van Rossumc9641791998-08-04 15:26:23 +00002990#ifdef HAVE_SYS_WAIT_H
2991
2992#ifdef WIFSTOPPED
2993static char posix_WIFSTOPPED__doc__[] =
2994"WIFSTOPPED(status) -> Boolean\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00002995Return true if the process returning 'status' was stopped.";
Guido van Rossumc9641791998-08-04 15:26:23 +00002996
2997static PyObject *
2998posix_WIFSTOPPED(self, args)
2999 PyObject *self;
3000 PyObject *args;
3001{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003002#ifdef UNION_WAIT
3003 union wait status;
3004#define status_i (status.w_status)
3005#else
3006 int status;
3007#define status_i status
3008#endif
3009 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003010
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003011 if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003012 {
3013 return NULL;
3014 }
3015
3016 return Py_BuildValue("i", WIFSTOPPED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003017#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003018}
3019#endif /* WIFSTOPPED */
3020
3021#ifdef WIFSIGNALED
3022static char posix_WIFSIGNALED__doc__[] =
3023"WIFSIGNALED(status) -> Boolean\n\
Guido van Rossum3366d1c1999-02-23 18:34:43 +00003024Return true if the process returning 'status' was terminated by a signal.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003025
3026static PyObject *
3027posix_WIFSIGNALED(self, args)
3028 PyObject *self;
3029 PyObject *args;
3030{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003031#ifdef UNION_WAIT
3032 union wait status;
3033#define status_i (status.w_status)
3034#else
3035 int status;
3036#define status_i status
3037#endif
3038 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003039
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003040 if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003041 {
3042 return NULL;
3043 }
3044
3045 return Py_BuildValue("i", WIFSIGNALED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003046#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003047}
3048#endif /* WIFSIGNALED */
3049
3050#ifdef WIFEXITED
3051static char posix_WIFEXITED__doc__[] =
3052"WIFEXITED(status) -> Boolean\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003053Return true if the process returning 'status' exited using the exit()\n\
3054system call.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003055
3056static PyObject *
3057posix_WIFEXITED(self, args)
3058 PyObject *self;
3059 PyObject *args;
3060{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003061#ifdef UNION_WAIT
3062 union wait status;
3063#define status_i (status.w_status)
3064#else
3065 int status;
3066#define status_i status
3067#endif
3068 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003069
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003070 if (!PyArg_ParseTuple(args, "i:WIFEXITED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003071 {
3072 return NULL;
3073 }
3074
3075 return Py_BuildValue("i", WIFEXITED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003076#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003077}
3078#endif /* WIFEXITED */
3079
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003080#ifdef WEXITSTATUS
Guido van Rossumc9641791998-08-04 15:26:23 +00003081static char posix_WEXITSTATUS__doc__[] =
3082"WEXITSTATUS(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003083Return the process return code from 'status'.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003084
3085static PyObject *
3086posix_WEXITSTATUS(self, args)
3087 PyObject *self;
3088 PyObject *args;
3089{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003090#ifdef UNION_WAIT
3091 union wait status;
3092#define status_i (status.w_status)
3093#else
3094 int status;
3095#define status_i status
3096#endif
3097 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003098
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003099 if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003100 {
3101 return NULL;
3102 }
3103
3104 return Py_BuildValue("i", WEXITSTATUS(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003105#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003106}
3107#endif /* WEXITSTATUS */
3108
3109#ifdef WTERMSIG
3110static char posix_WTERMSIG__doc__[] =
3111"WTERMSIG(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003112Return the signal that terminated the process that provided the 'status'\n\
3113value.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003114
3115static PyObject *
3116posix_WTERMSIG(self, args)
3117 PyObject *self;
3118 PyObject *args;
3119{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003120#ifdef UNION_WAIT
3121 union wait status;
3122#define status_i (status.w_status)
3123#else
3124 int status;
3125#define status_i status
3126#endif
3127 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003128
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003129 if (!PyArg_ParseTuple(args, "i:WTERMSIG", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003130 {
3131 return NULL;
3132 }
3133
3134 return Py_BuildValue("i", WTERMSIG(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003135#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003136}
3137#endif /* WTERMSIG */
3138
3139#ifdef WSTOPSIG
3140static char posix_WSTOPSIG__doc__[] =
3141"WSTOPSIG(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003142Return the signal that stopped the process that provided the 'status' value.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003143
3144static PyObject *
3145posix_WSTOPSIG(self, args)
3146 PyObject *self;
3147 PyObject *args;
3148{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003149#ifdef UNION_WAIT
3150 union wait status;
3151#define status_i (status.w_status)
3152#else
3153 int status;
3154#define status_i status
3155#endif
3156 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003157
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003158 if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003159 {
3160 return NULL;
3161 }
3162
3163 return Py_BuildValue("i", WSTOPSIG(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003164#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003165}
3166#endif /* WSTOPSIG */
3167
3168#endif /* HAVE_SYS_WAIT_H */
3169
3170
Guido van Rossum94f6f721999-01-06 18:42:14 +00003171#if defined(HAVE_FSTATVFS)
Guido van Rossumd5753e11999-10-19 13:29:23 +00003172#ifdef _SCO_DS
3173/* SCO OpenServer 5.0 and later requires _SVID3 before it reveals the
3174 needed definitions in sys/statvfs.h */
3175#define _SVID3
3176#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00003177#include <sys/statvfs.h>
3178
3179static char posix_fstatvfs__doc__[] =
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003180"fstatvfs(fd) -> \n\
3181 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +00003182Perform an fstatvfs system call on the given fd.";
3183
3184static PyObject *
3185posix_fstatvfs(self, args)
3186 PyObject *self;
3187 PyObject *args;
3188{
3189 int fd, res;
3190 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003191 if (!PyArg_ParseTuple(args, "i:fstatvfs", &fd))
Guido van Rossum94f6f721999-01-06 18:42:14 +00003192 return NULL;
3193 Py_BEGIN_ALLOW_THREADS
3194 res = fstatvfs(fd, &st);
3195 Py_END_ALLOW_THREADS
3196 if (res != 0)
3197 return posix_error();
3198#if !defined(HAVE_LARGEFILE_SUPPORT)
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003199 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003200 (long) st.f_bsize,
3201 (long) st.f_frsize,
3202 (long) st.f_blocks,
3203 (long) st.f_bfree,
3204 (long) st.f_bavail,
3205 (long) st.f_files,
3206 (long) st.f_ffree,
3207 (long) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003208 (long) st.f_flag,
3209 (long) st.f_namemax);
3210#else
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003211 return Py_BuildValue("(llLLLLLLll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003212 (long) st.f_bsize,
3213 (long) st.f_frsize,
3214 (LONG_LONG) st.f_blocks,
3215 (LONG_LONG) st.f_bfree,
3216 (LONG_LONG) st.f_bavail,
3217 (LONG_LONG) st.f_files,
3218 (LONG_LONG) st.f_ffree,
3219 (LONG_LONG) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003220 (long) st.f_flag,
3221 (long) st.f_namemax);
3222#endif
3223}
3224#endif /* HAVE_FSTATVFS */
3225
3226
3227#if defined(HAVE_STATVFS)
3228#include <sys/statvfs.h>
3229
3230static char posix_statvfs__doc__[] =
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003231"statvfs(path) -> \n\
3232 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +00003233Perform a statvfs system call on the given path.";
3234
3235static PyObject *
3236posix_statvfs(self, args)
3237 PyObject *self;
3238 PyObject *args;
3239{
3240 char *path;
3241 int res;
3242 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003243 if (!PyArg_ParseTuple(args, "s:statvfs", &path))
Guido van Rossum94f6f721999-01-06 18:42:14 +00003244 return NULL;
3245 Py_BEGIN_ALLOW_THREADS
3246 res = statvfs(path, &st);
3247 Py_END_ALLOW_THREADS
3248 if (res != 0)
3249 return posix_error_with_filename(path);
3250#if !defined(HAVE_LARGEFILE_SUPPORT)
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003251 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003252 (long) st.f_bsize,
3253 (long) st.f_frsize,
3254 (long) st.f_blocks,
3255 (long) st.f_bfree,
3256 (long) st.f_bavail,
3257 (long) st.f_files,
3258 (long) st.f_ffree,
3259 (long) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003260 (long) st.f_flag,
3261 (long) st.f_namemax);
3262#else /* HAVE_LARGEFILE_SUPPORT */
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003263 return Py_BuildValue("(llLLLLLLll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003264 (long) st.f_bsize,
3265 (long) st.f_frsize,
3266 (LONG_LONG) st.f_blocks,
3267 (LONG_LONG) st.f_bfree,
3268 (LONG_LONG) st.f_bavail,
3269 (LONG_LONG) st.f_files,
3270 (LONG_LONG) st.f_ffree,
3271 (LONG_LONG) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003272 (long) st.f_flag,
3273 (long) st.f_namemax);
3274#endif
3275}
3276#endif /* HAVE_STATVFS */
3277
3278
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003279#ifdef HAVE_TEMPNAM
3280static char posix_tempnam__doc__[] = "\
3281tempnam([dir[, prefix]]) -> string\n\
3282Return a unique name for a temporary file.\n\
3283The directory and a short may be specified as strings; they may be omitted\n\
3284or None if not needed.";
3285
3286static PyObject *
3287posix_tempnam(self, args)
3288 PyObject *self;
3289 PyObject *args;
3290{
3291 PyObject *result = NULL;
3292 char *dir = NULL;
3293 char *pfx = NULL;
3294 char *name;
3295
3296 if (!PyArg_ParseTuple(args, "|zz:tempnam", &dir, &pfx))
3297 return NULL;
3298 name = tempnam(dir, pfx);
3299 if (name == NULL)
3300 return PyErr_NoMemory();
3301 result = PyString_FromString(name);
3302 free(name);
3303 return result;
3304}
Guido van Rossumd371ff11999-01-25 16:12:23 +00003305#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003306
3307
3308#ifdef HAVE_TMPFILE
3309static char posix_tmpfile__doc__[] = "\
3310tmpfile() -> file object\n\
3311Create a temporary file with no directory entries.";
3312
3313static PyObject *
3314posix_tmpfile(self, args)
3315 PyObject *self;
3316 PyObject *args;
3317{
3318 FILE *fp;
3319
3320 if (!PyArg_ParseTuple(args, ":tmpfile"))
3321 return NULL;
3322 fp = tmpfile();
3323 if (fp == NULL)
3324 return posix_error();
3325 return PyFile_FromFile(fp, "<tmpfile>", "w+", fclose);
3326}
3327#endif
3328
3329
3330#ifdef HAVE_TMPNAM
3331static char posix_tmpnam__doc__[] = "\
3332tmpnam() -> string\n\
3333Return a unique name for a temporary file.";
3334
3335static PyObject *
3336posix_tmpnam(self, args)
3337 PyObject *self;
3338 PyObject *args;
3339{
3340 char buffer[L_tmpnam];
3341 char *name;
3342
3343 if (!PyArg_ParseTuple(args, ":tmpnam"))
3344 return NULL;
3345#ifdef HAVE_TMPNAM_R
3346 name = tmpnam_r(buffer);
3347#else
3348 name = tmpnam(buffer);
3349#endif
3350 if (name == NULL) {
3351 PyErr_SetObject(PyExc_OSError,
3352 Py_BuildValue("is", 0,
3353#ifdef HAVE_TMPNAM_R
3354 "unexpected NULL from tmpnam_r"
3355#else
3356 "unexpected NULL from tmpnam"
3357#endif
3358 ));
3359 return NULL;
3360 }
3361 return PyString_FromString(buffer);
3362}
3363#endif
3364
3365
Fred Drakec9680921999-12-13 16:37:25 +00003366/* This is used for fpathconf(), pathconf(), confstr() and sysconf().
3367 * It maps strings representing configuration variable names to
3368 * integer values, allowing those functions to be called with the
3369 * magic names instead of poluting the module's namespace with tons of
Fred Drake12c6e2d1999-12-14 21:25:03 +00003370 * rarely-used constants. There are three separate tables that use
3371 * these definitions.
Fred Drakebec628d1999-12-15 18:31:10 +00003372 *
3373 * This code is always included, even if none of the interfaces that
3374 * need it are included. The #if hackery needed to avoid it would be
3375 * sufficiently pervasive that it's not worth the loss of readability.
Fred Drakec9680921999-12-13 16:37:25 +00003376 */
3377struct constdef {
3378 char *name;
3379 long value;
3380};
3381
Fred Drake12c6e2d1999-12-14 21:25:03 +00003382static int
3383conv_confname(arg, valuep, table, tablesize)
3384 PyObject *arg;
3385 int *valuep;
3386 struct constdef *table;
3387 size_t tablesize;
3388{
3389 if (PyInt_Check(arg)) {
3390 *valuep = PyInt_AS_LONG(arg);
3391 return 1;
3392 }
3393 if (PyString_Check(arg)) {
3394 /* look up the value in the table using a binary search */
3395 int lo = 0;
3396 int hi = tablesize;
3397 int cmp, mid;
3398 char *confname = PyString_AS_STRING(arg);
3399 while (lo < hi) {
3400 mid = (lo + hi) / 2;
3401 cmp = strcmp(confname, table[mid].name);
3402 if (cmp < 0)
3403 hi = mid;
3404 else if (cmp > 0)
3405 lo = mid + 1;
3406 else {
3407 *valuep = table[mid].value;
3408 return 1;
3409 }
3410 }
3411 PyErr_SetString(PyExc_ValueError, "unrecognized configuration name");
3412 }
3413 else
3414 PyErr_SetString(PyExc_TypeError,
3415 "configuration names must be strings or integers");
3416 return 0;
3417}
3418
3419
3420#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
3421static struct constdef posix_constants_pathconf[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003422#ifdef _PC_ABI_AIO_XFER_MAX
3423 {"PC_ABI_AIO_XFER_MAX", _PC_ABI_AIO_XFER_MAX},
3424#endif
3425#ifdef _PC_ABI_ASYNC_IO
3426 {"PC_ABI_ASYNC_IO", _PC_ABI_ASYNC_IO},
3427#endif
Fred Drakec9680921999-12-13 16:37:25 +00003428#ifdef _PC_ASYNC_IO
3429 {"PC_ASYNC_IO", _PC_ASYNC_IO},
3430#endif
3431#ifdef _PC_CHOWN_RESTRICTED
3432 {"PC_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED},
3433#endif
3434#ifdef _PC_FILESIZEBITS
3435 {"PC_FILESIZEBITS", _PC_FILESIZEBITS},
3436#endif
3437#ifdef _PC_LAST
3438 {"PC_LAST", _PC_LAST},
3439#endif
3440#ifdef _PC_LINK_MAX
3441 {"PC_LINK_MAX", _PC_LINK_MAX},
3442#endif
3443#ifdef _PC_MAX_CANON
3444 {"PC_MAX_CANON", _PC_MAX_CANON},
3445#endif
3446#ifdef _PC_MAX_INPUT
3447 {"PC_MAX_INPUT", _PC_MAX_INPUT},
3448#endif
3449#ifdef _PC_NAME_MAX
3450 {"PC_NAME_MAX", _PC_NAME_MAX},
3451#endif
3452#ifdef _PC_NO_TRUNC
3453 {"PC_NO_TRUNC", _PC_NO_TRUNC},
3454#endif
3455#ifdef _PC_PATH_MAX
3456 {"PC_PATH_MAX", _PC_PATH_MAX},
3457#endif
3458#ifdef _PC_PIPE_BUF
3459 {"PC_PIPE_BUF", _PC_PIPE_BUF},
3460#endif
3461#ifdef _PC_PRIO_IO
3462 {"PC_PRIO_IO", _PC_PRIO_IO},
3463#endif
3464#ifdef _PC_SOCK_MAXBUF
3465 {"PC_SOCK_MAXBUF", _PC_SOCK_MAXBUF},
3466#endif
3467#ifdef _PC_SYNC_IO
3468 {"PC_SYNC_IO", _PC_SYNC_IO},
3469#endif
3470#ifdef _PC_VDISABLE
3471 {"PC_VDISABLE", _PC_VDISABLE},
3472#endif
3473};
3474
Fred Drakec9680921999-12-13 16:37:25 +00003475static int
3476conv_path_confname(arg, valuep)
3477 PyObject *arg;
3478 int *valuep;
3479{
3480 return conv_confname(arg, valuep, posix_constants_pathconf,
3481 sizeof(posix_constants_pathconf)
3482 / sizeof(struct constdef));
3483}
3484#endif
3485
3486#ifdef HAVE_FPATHCONF
3487static char posix_fpathconf__doc__[] = "\
3488fpathconf(fd, name) -> integer\n\
3489Return the configuration limit name for the file descriptor fd.\n\
3490If there is no limit, return -1.";
3491
3492static PyObject *
3493posix_fpathconf(self, args)
3494 PyObject *self;
3495 PyObject *args;
3496{
3497 PyObject *result = NULL;
3498 int name, fd;
3499
Fred Drake12c6e2d1999-12-14 21:25:03 +00003500 if (PyArg_ParseTuple(args, "iO&:fpathconf", &fd,
3501 conv_path_confname, &name)) {
Fred Drakec9680921999-12-13 16:37:25 +00003502 long limit;
3503
3504 errno = 0;
3505 limit = fpathconf(fd, name);
3506 if (limit == -1 && errno != 0)
3507 posix_error();
3508 else
3509 result = PyInt_FromLong(limit);
3510 }
3511 return result;
3512}
3513#endif
3514
3515
3516#ifdef HAVE_PATHCONF
3517static char posix_pathconf__doc__[] = "\
3518pathconf(path, name) -> integer\n\
3519Return the configuration limit name for the file or directory path.\n\
3520If there is no limit, return -1.";
3521
3522static PyObject *
3523posix_pathconf(self, args)
3524 PyObject *self;
3525 PyObject *args;
3526{
3527 PyObject *result = NULL;
3528 int name;
3529 char *path;
3530
3531 if (PyArg_ParseTuple(args, "sO&:pathconf", &path,
3532 conv_path_confname, &name)) {
3533 long limit;
3534
3535 errno = 0;
3536 limit = pathconf(path, name);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003537 if (limit == -1 && errno != 0) {
Fred Drakec9680921999-12-13 16:37:25 +00003538 if (errno == EINVAL)
3539 /* could be a path or name problem */
3540 posix_error();
3541 else
3542 posix_error_with_filename(path);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003543 }
Fred Drakec9680921999-12-13 16:37:25 +00003544 else
3545 result = PyInt_FromLong(limit);
3546 }
3547 return result;
3548}
3549#endif
3550
3551#ifdef HAVE_CONFSTR
3552static struct constdef posix_constants_confstr[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003553#ifdef _CS_ARCHITECTURE
3554 {"CS_ARCHITECTURE", _CS_ARCHITECTURE},
3555#endif
3556#ifdef _CS_HOSTNAME
3557 {"CS_HOSTNAME", _CS_HOSTNAME},
3558#endif
3559#ifdef _CS_HW_PROVIDER
3560 {"CS_HW_PROVIDER", _CS_HW_PROVIDER},
3561#endif
3562#ifdef _CS_HW_SERIAL
3563 {"CS_HW_SERIAL", _CS_HW_SERIAL},
3564#endif
3565#ifdef _CS_INITTAB_NAME
3566 {"CS_INITTAB_NAME", _CS_INITTAB_NAME},
3567#endif
Fred Drakec9680921999-12-13 16:37:25 +00003568#ifdef _CS_LFS64_CFLAGS
3569 {"CS_LFS64_CFLAGS", _CS_LFS64_CFLAGS},
3570#endif
3571#ifdef _CS_LFS64_LDFLAGS
3572 {"CS_LFS64_LDFLAGS", _CS_LFS64_LDFLAGS},
3573#endif
3574#ifdef _CS_LFS64_LIBS
3575 {"CS_LFS64_LIBS", _CS_LFS64_LIBS},
3576#endif
3577#ifdef _CS_LFS64_LINTFLAGS
3578 {"CS_LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS},
3579#endif
3580#ifdef _CS_LFS_CFLAGS
3581 {"CS_LFS_CFLAGS", _CS_LFS_CFLAGS},
3582#endif
3583#ifdef _CS_LFS_LDFLAGS
3584 {"CS_LFS_LDFLAGS", _CS_LFS_LDFLAGS},
3585#endif
3586#ifdef _CS_LFS_LIBS
3587 {"CS_LFS_LIBS", _CS_LFS_LIBS},
3588#endif
3589#ifdef _CS_LFS_LINTFLAGS
3590 {"CS_LFS_LINTFLAGS", _CS_LFS_LINTFLAGS},
3591#endif
Fred Draked86ed291999-12-15 15:34:33 +00003592#ifdef _CS_MACHINE
3593 {"CS_MACHINE", _CS_MACHINE},
3594#endif
Fred Drakec9680921999-12-13 16:37:25 +00003595#ifdef _CS_PATH
3596 {"CS_PATH", _CS_PATH},
3597#endif
Fred Draked86ed291999-12-15 15:34:33 +00003598#ifdef _CS_RELEASE
3599 {"CS_RELEASE", _CS_RELEASE},
3600#endif
3601#ifdef _CS_SRPC_DOMAIN
3602 {"CS_SRPC_DOMAIN", _CS_SRPC_DOMAIN},
3603#endif
3604#ifdef _CS_SYSNAME
3605 {"CS_SYSNAME", _CS_SYSNAME},
3606#endif
3607#ifdef _CS_VERSION
3608 {"CS_VERSION", _CS_VERSION},
3609#endif
Fred Drakec9680921999-12-13 16:37:25 +00003610#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS
3611 {"CS_XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS},
3612#endif
3613#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS
3614 {"CS_XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS},
3615#endif
3616#ifdef _CS_XBS5_ILP32_OFF32_LIBS
3617 {"CS_XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS},
3618#endif
3619#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS
3620 {"CS_XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS},
3621#endif
3622#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS
3623 {"CS_XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS},
3624#endif
3625#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS
3626 {"CS_XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS},
3627#endif
3628#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS
3629 {"CS_XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS},
3630#endif
3631#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
3632 {"CS_XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS},
3633#endif
3634#ifdef _CS_XBS5_LP64_OFF64_CFLAGS
3635 {"CS_XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS},
3636#endif
3637#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS
3638 {"CS_XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS},
3639#endif
3640#ifdef _CS_XBS5_LP64_OFF64_LIBS
3641 {"CS_XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS},
3642#endif
3643#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS
3644 {"CS_XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS},
3645#endif
3646#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS
3647 {"CS_XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS},
3648#endif
3649#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
3650 {"CS_XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS},
3651#endif
3652#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS
3653 {"CS_XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS},
3654#endif
3655#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
3656 {"CS_XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS},
3657#endif
Fred Draked86ed291999-12-15 15:34:33 +00003658#ifdef _MIPS_CS_AVAIL_PROCESSORS
3659 {"MIPS_CS_AVAIL_PROCESSORS", _MIPS_CS_AVAIL_PROCESSORS},
3660#endif
3661#ifdef _MIPS_CS_BASE
3662 {"MIPS_CS_BASE", _MIPS_CS_BASE},
3663#endif
3664#ifdef _MIPS_CS_HOSTID
3665 {"MIPS_CS_HOSTID", _MIPS_CS_HOSTID},
3666#endif
3667#ifdef _MIPS_CS_HW_NAME
3668 {"MIPS_CS_HW_NAME", _MIPS_CS_HW_NAME},
3669#endif
3670#ifdef _MIPS_CS_NUM_PROCESSORS
3671 {"MIPS_CS_NUM_PROCESSORS", _MIPS_CS_NUM_PROCESSORS},
3672#endif
3673#ifdef _MIPS_CS_OSREL_MAJ
3674 {"MIPS_CS_OSREL_MAJ", _MIPS_CS_OSREL_MAJ},
3675#endif
3676#ifdef _MIPS_CS_OSREL_MIN
3677 {"MIPS_CS_OSREL_MIN", _MIPS_CS_OSREL_MIN},
3678#endif
3679#ifdef _MIPS_CS_OSREL_PATCH
3680 {"MIPS_CS_OSREL_PATCH", _MIPS_CS_OSREL_PATCH},
3681#endif
3682#ifdef _MIPS_CS_OS_NAME
3683 {"MIPS_CS_OS_NAME", _MIPS_CS_OS_NAME},
3684#endif
3685#ifdef _MIPS_CS_OS_PROVIDER
3686 {"MIPS_CS_OS_PROVIDER", _MIPS_CS_OS_PROVIDER},
3687#endif
3688#ifdef _MIPS_CS_PROCESSORS
3689 {"MIPS_CS_PROCESSORS", _MIPS_CS_PROCESSORS},
3690#endif
3691#ifdef _MIPS_CS_SERIAL
3692 {"MIPS_CS_SERIAL", _MIPS_CS_SERIAL},
3693#endif
3694#ifdef _MIPS_CS_VENDOR
3695 {"MIPS_CS_VENDOR", _MIPS_CS_VENDOR},
3696#endif
Fred Drakec9680921999-12-13 16:37:25 +00003697};
3698
3699static int
3700conv_confstr_confname(arg, valuep)
3701 PyObject *arg;
3702 int *valuep;
3703{
3704 return conv_confname(arg, valuep, posix_constants_confstr,
3705 sizeof(posix_constants_confstr)
3706 / sizeof(struct constdef));
3707}
3708
3709static char posix_confstr__doc__[] = "\
3710confstr(name) -> string\n\
3711Return a string-valued system configuration variable.";
3712
3713static PyObject *
3714posix_confstr(self, args)
3715 PyObject *self;
3716 PyObject *args;
3717{
3718 PyObject *result = NULL;
3719 int name;
3720 char buffer[64];
3721
3722 if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) {
3723 int len = confstr(name, buffer, sizeof(buffer));
3724
Fred Drakec9680921999-12-13 16:37:25 +00003725 errno = 0;
3726 if (len == 0) {
3727 if (errno != 0)
3728 posix_error();
3729 else
3730 result = PyString_FromString("");
3731 }
3732 else {
3733 if (len >= sizeof(buffer)) {
3734 result = PyString_FromStringAndSize(NULL, len);
3735 if (result != NULL)
3736 confstr(name, PyString_AS_STRING(result), len+1);
3737 }
3738 else
3739 result = PyString_FromString(buffer);
3740 }
3741 }
3742 return result;
3743}
3744#endif
3745
3746
3747#ifdef HAVE_SYSCONF
3748static struct constdef posix_constants_sysconf[] = {
3749#ifdef _SC_2_CHAR_TERM
3750 {"SC_2_CHAR_TERM", _SC_2_CHAR_TERM},
3751#endif
3752#ifdef _SC_2_C_BIND
3753 {"SC_2_C_BIND", _SC_2_C_BIND},
3754#endif
3755#ifdef _SC_2_C_DEV
3756 {"SC_2_C_DEV", _SC_2_C_DEV},
3757#endif
3758#ifdef _SC_2_C_VERSION
3759 {"SC_2_C_VERSION", _SC_2_C_VERSION},
3760#endif
3761#ifdef _SC_2_FORT_DEV
3762 {"SC_2_FORT_DEV", _SC_2_FORT_DEV},
3763#endif
3764#ifdef _SC_2_FORT_RUN
3765 {"SC_2_FORT_RUN", _SC_2_FORT_RUN},
3766#endif
3767#ifdef _SC_2_LOCALEDEF
3768 {"SC_2_LOCALEDEF", _SC_2_LOCALEDEF},
3769#endif
3770#ifdef _SC_2_SW_DEV
3771 {"SC_2_SW_DEV", _SC_2_SW_DEV},
3772#endif
3773#ifdef _SC_2_UPE
3774 {"SC_2_UPE", _SC_2_UPE},
3775#endif
3776#ifdef _SC_2_VERSION
3777 {"SC_2_VERSION", _SC_2_VERSION},
3778#endif
Fred Draked86ed291999-12-15 15:34:33 +00003779#ifdef _SC_ABI_ASYNCHRONOUS_IO
3780 {"SC_ABI_ASYNCHRONOUS_IO", _SC_ABI_ASYNCHRONOUS_IO},
3781#endif
3782#ifdef _SC_ACL
3783 {"SC_ACL", _SC_ACL},
3784#endif
Fred Drakec9680921999-12-13 16:37:25 +00003785#ifdef _SC_AIO_LISTIO_MAX
3786 {"SC_AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX},
3787#endif
3788#ifdef _SC_AIO_LIST_MAX
3789 {"SC_AIO_LIST_MAX", _SC_AIO_LIST_MAX},
3790#endif
3791#ifdef _SC_AIO_MAX
3792 {"SC_AIO_MAX", _SC_AIO_MAX},
3793#endif
3794#ifdef _SC_AIO_PRIO_DELTA_MAX
3795 {"SC_AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX},
3796#endif
3797#ifdef _SC_ARG_MAX
3798 {"SC_ARG_MAX", _SC_ARG_MAX},
3799#endif
3800#ifdef _SC_ASYNCHRONOUS_IO
3801 {"SC_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO},
3802#endif
3803#ifdef _SC_ATEXIT_MAX
3804 {"SC_ATEXIT_MAX", _SC_ATEXIT_MAX},
3805#endif
Fred Draked86ed291999-12-15 15:34:33 +00003806#ifdef _SC_AUDIT
3807 {"SC_AUDIT", _SC_AUDIT},
3808#endif
Fred Drakec9680921999-12-13 16:37:25 +00003809#ifdef _SC_AVPHYS_PAGES
3810 {"SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES},
3811#endif
3812#ifdef _SC_BC_BASE_MAX
3813 {"SC_BC_BASE_MAX", _SC_BC_BASE_MAX},
3814#endif
3815#ifdef _SC_BC_DIM_MAX
3816 {"SC_BC_DIM_MAX", _SC_BC_DIM_MAX},
3817#endif
3818#ifdef _SC_BC_SCALE_MAX
3819 {"SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX},
3820#endif
3821#ifdef _SC_BC_STRING_MAX
3822 {"SC_BC_STRING_MAX", _SC_BC_STRING_MAX},
3823#endif
Fred Draked86ed291999-12-15 15:34:33 +00003824#ifdef _SC_CAP
3825 {"SC_CAP", _SC_CAP},
3826#endif
Fred Drakec9680921999-12-13 16:37:25 +00003827#ifdef _SC_CHARCLASS_NAME_MAX
3828 {"SC_CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX},
3829#endif
3830#ifdef _SC_CHAR_BIT
3831 {"SC_CHAR_BIT", _SC_CHAR_BIT},
3832#endif
3833#ifdef _SC_CHAR_MAX
3834 {"SC_CHAR_MAX", _SC_CHAR_MAX},
3835#endif
3836#ifdef _SC_CHAR_MIN
3837 {"SC_CHAR_MIN", _SC_CHAR_MIN},
3838#endif
3839#ifdef _SC_CHILD_MAX
3840 {"SC_CHILD_MAX", _SC_CHILD_MAX},
3841#endif
3842#ifdef _SC_CLK_TCK
3843 {"SC_CLK_TCK", _SC_CLK_TCK},
3844#endif
3845#ifdef _SC_COHER_BLKSZ
3846 {"SC_COHER_BLKSZ", _SC_COHER_BLKSZ},
3847#endif
3848#ifdef _SC_COLL_WEIGHTS_MAX
3849 {"SC_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX},
3850#endif
3851#ifdef _SC_DCACHE_ASSOC
3852 {"SC_DCACHE_ASSOC", _SC_DCACHE_ASSOC},
3853#endif
3854#ifdef _SC_DCACHE_BLKSZ
3855 {"SC_DCACHE_BLKSZ", _SC_DCACHE_BLKSZ},
3856#endif
3857#ifdef _SC_DCACHE_LINESZ
3858 {"SC_DCACHE_LINESZ", _SC_DCACHE_LINESZ},
3859#endif
3860#ifdef _SC_DCACHE_SZ
3861 {"SC_DCACHE_SZ", _SC_DCACHE_SZ},
3862#endif
3863#ifdef _SC_DCACHE_TBLKSZ
3864 {"SC_DCACHE_TBLKSZ", _SC_DCACHE_TBLKSZ},
3865#endif
3866#ifdef _SC_DELAYTIMER_MAX
3867 {"SC_DELAYTIMER_MAX", _SC_DELAYTIMER_MAX},
3868#endif
3869#ifdef _SC_EQUIV_CLASS_MAX
3870 {"SC_EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX},
3871#endif
3872#ifdef _SC_EXPR_NEST_MAX
3873 {"SC_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX},
3874#endif
3875#ifdef _SC_FSYNC
3876 {"SC_FSYNC", _SC_FSYNC},
3877#endif
3878#ifdef _SC_GETGR_R_SIZE_MAX
3879 {"SC_GETGR_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX},
3880#endif
3881#ifdef _SC_GETPW_R_SIZE_MAX
3882 {"SC_GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX},
3883#endif
3884#ifdef _SC_ICACHE_ASSOC
3885 {"SC_ICACHE_ASSOC", _SC_ICACHE_ASSOC},
3886#endif
3887#ifdef _SC_ICACHE_BLKSZ
3888 {"SC_ICACHE_BLKSZ", _SC_ICACHE_BLKSZ},
3889#endif
3890#ifdef _SC_ICACHE_LINESZ
3891 {"SC_ICACHE_LINESZ", _SC_ICACHE_LINESZ},
3892#endif
3893#ifdef _SC_ICACHE_SZ
3894 {"SC_ICACHE_SZ", _SC_ICACHE_SZ},
3895#endif
Fred Draked86ed291999-12-15 15:34:33 +00003896#ifdef _SC_INF
3897 {"SC_INF", _SC_INF},
3898#endif
Fred Drakec9680921999-12-13 16:37:25 +00003899#ifdef _SC_INT_MAX
3900 {"SC_INT_MAX", _SC_INT_MAX},
3901#endif
3902#ifdef _SC_INT_MIN
3903 {"SC_INT_MIN", _SC_INT_MIN},
3904#endif
3905#ifdef _SC_IOV_MAX
3906 {"SC_IOV_MAX", _SC_IOV_MAX},
3907#endif
Fred Draked86ed291999-12-15 15:34:33 +00003908#ifdef _SC_IP_SECOPTS
3909 {"SC_IP_SECOPTS", _SC_IP_SECOPTS},
3910#endif
Fred Drakec9680921999-12-13 16:37:25 +00003911#ifdef _SC_JOB_CONTROL
3912 {"SC_JOB_CONTROL", _SC_JOB_CONTROL},
3913#endif
Fred Draked86ed291999-12-15 15:34:33 +00003914#ifdef _SC_KERN_POINTERS
3915 {"SC_KERN_POINTERS", _SC_KERN_POINTERS},
3916#endif
3917#ifdef _SC_KERN_SIM
3918 {"SC_KERN_SIM", _SC_KERN_SIM},
3919#endif
Fred Drakec9680921999-12-13 16:37:25 +00003920#ifdef _SC_LINE_MAX
3921 {"SC_LINE_MAX", _SC_LINE_MAX},
3922#endif
3923#ifdef _SC_LOGIN_NAME_MAX
3924 {"SC_LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX},
3925#endif
3926#ifdef _SC_LOGNAME_MAX
3927 {"SC_LOGNAME_MAX", _SC_LOGNAME_MAX},
3928#endif
3929#ifdef _SC_LONG_BIT
3930 {"SC_LONG_BIT", _SC_LONG_BIT},
3931#endif
Fred Draked86ed291999-12-15 15:34:33 +00003932#ifdef _SC_MAC
3933 {"SC_MAC", _SC_MAC},
3934#endif
Fred Drakec9680921999-12-13 16:37:25 +00003935#ifdef _SC_MAPPED_FILES
3936 {"SC_MAPPED_FILES", _SC_MAPPED_FILES},
3937#endif
3938#ifdef _SC_MAXPID
3939 {"SC_MAXPID", _SC_MAXPID},
3940#endif
3941#ifdef _SC_MB_LEN_MAX
3942 {"SC_MB_LEN_MAX", _SC_MB_LEN_MAX},
3943#endif
3944#ifdef _SC_MEMLOCK
3945 {"SC_MEMLOCK", _SC_MEMLOCK},
3946#endif
3947#ifdef _SC_MEMLOCK_RANGE
3948 {"SC_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE},
3949#endif
3950#ifdef _SC_MEMORY_PROTECTION
3951 {"SC_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION},
3952#endif
3953#ifdef _SC_MESSAGE_PASSING
3954 {"SC_MESSAGE_PASSING", _SC_MESSAGE_PASSING},
3955#endif
Fred Draked86ed291999-12-15 15:34:33 +00003956#ifdef _SC_MMAP_FIXED_ALIGNMENT
3957 {"SC_MMAP_FIXED_ALIGNMENT", _SC_MMAP_FIXED_ALIGNMENT},
3958#endif
Fred Drakec9680921999-12-13 16:37:25 +00003959#ifdef _SC_MQ_OPEN_MAX
3960 {"SC_MQ_OPEN_MAX", _SC_MQ_OPEN_MAX},
3961#endif
3962#ifdef _SC_MQ_PRIO_MAX
3963 {"SC_MQ_PRIO_MAX", _SC_MQ_PRIO_MAX},
3964#endif
Fred Draked86ed291999-12-15 15:34:33 +00003965#ifdef _SC_NACLS_MAX
3966 {"SC_NACLS_MAX", _SC_NACLS_MAX},
3967#endif
Fred Drakec9680921999-12-13 16:37:25 +00003968#ifdef _SC_NGROUPS_MAX
3969 {"SC_NGROUPS_MAX", _SC_NGROUPS_MAX},
3970#endif
3971#ifdef _SC_NL_ARGMAX
3972 {"SC_NL_ARGMAX", _SC_NL_ARGMAX},
3973#endif
3974#ifdef _SC_NL_LANGMAX
3975 {"SC_NL_LANGMAX", _SC_NL_LANGMAX},
3976#endif
3977#ifdef _SC_NL_MSGMAX
3978 {"SC_NL_MSGMAX", _SC_NL_MSGMAX},
3979#endif
3980#ifdef _SC_NL_NMAX
3981 {"SC_NL_NMAX", _SC_NL_NMAX},
3982#endif
3983#ifdef _SC_NL_SETMAX
3984 {"SC_NL_SETMAX", _SC_NL_SETMAX},
3985#endif
3986#ifdef _SC_NL_TEXTMAX
3987 {"SC_NL_TEXTMAX", _SC_NL_TEXTMAX},
3988#endif
3989#ifdef _SC_NPROCESSORS_CONF
3990 {"SC_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF},
3991#endif
3992#ifdef _SC_NPROCESSORS_ONLN
3993 {"SC_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN},
3994#endif
Fred Draked86ed291999-12-15 15:34:33 +00003995#ifdef _SC_NPROC_CONF
3996 {"SC_NPROC_CONF", _SC_NPROC_CONF},
3997#endif
3998#ifdef _SC_NPROC_ONLN
3999 {"SC_NPROC_ONLN", _SC_NPROC_ONLN},
4000#endif
Fred Drakec9680921999-12-13 16:37:25 +00004001#ifdef _SC_NZERO
4002 {"SC_NZERO", _SC_NZERO},
4003#endif
4004#ifdef _SC_OPEN_MAX
4005 {"SC_OPEN_MAX", _SC_OPEN_MAX},
4006#endif
4007#ifdef _SC_PAGESIZE
4008 {"SC_PAGESIZE", _SC_PAGESIZE},
4009#endif
4010#ifdef _SC_PAGE_SIZE
4011 {"SC_PAGE_SIZE", _SC_PAGE_SIZE},
4012#endif
4013#ifdef _SC_PASS_MAX
4014 {"SC_PASS_MAX", _SC_PASS_MAX},
4015#endif
4016#ifdef _SC_PHYS_PAGES
4017 {"SC_PHYS_PAGES", _SC_PHYS_PAGES},
4018#endif
4019#ifdef _SC_PII
4020 {"SC_PII", _SC_PII},
4021#endif
4022#ifdef _SC_PII_INTERNET
4023 {"SC_PII_INTERNET", _SC_PII_INTERNET},
4024#endif
4025#ifdef _SC_PII_INTERNET_DGRAM
4026 {"SC_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM},
4027#endif
4028#ifdef _SC_PII_INTERNET_STREAM
4029 {"SC_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM},
4030#endif
4031#ifdef _SC_PII_OSI
4032 {"SC_PII_OSI", _SC_PII_OSI},
4033#endif
4034#ifdef _SC_PII_OSI_CLTS
4035 {"SC_PII_OSI_CLTS", _SC_PII_OSI_CLTS},
4036#endif
4037#ifdef _SC_PII_OSI_COTS
4038 {"SC_PII_OSI_COTS", _SC_PII_OSI_COTS},
4039#endif
4040#ifdef _SC_PII_OSI_M
4041 {"SC_PII_OSI_M", _SC_PII_OSI_M},
4042#endif
4043#ifdef _SC_PII_SOCKET
4044 {"SC_PII_SOCKET", _SC_PII_SOCKET},
4045#endif
4046#ifdef _SC_PII_XTI
4047 {"SC_PII_XTI", _SC_PII_XTI},
4048#endif
4049#ifdef _SC_POLL
4050 {"SC_POLL", _SC_POLL},
4051#endif
4052#ifdef _SC_PRIORITIZED_IO
4053 {"SC_PRIORITIZED_IO", _SC_PRIORITIZED_IO},
4054#endif
4055#ifdef _SC_PRIORITY_SCHEDULING
4056 {"SC_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING},
4057#endif
4058#ifdef _SC_REALTIME_SIGNALS
4059 {"SC_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS},
4060#endif
4061#ifdef _SC_RE_DUP_MAX
4062 {"SC_RE_DUP_MAX", _SC_RE_DUP_MAX},
4063#endif
4064#ifdef _SC_RTSIG_MAX
4065 {"SC_RTSIG_MAX", _SC_RTSIG_MAX},
4066#endif
4067#ifdef _SC_SAVED_IDS
4068 {"SC_SAVED_IDS", _SC_SAVED_IDS},
4069#endif
4070#ifdef _SC_SCHAR_MAX
4071 {"SC_SCHAR_MAX", _SC_SCHAR_MAX},
4072#endif
4073#ifdef _SC_SCHAR_MIN
4074 {"SC_SCHAR_MIN", _SC_SCHAR_MIN},
4075#endif
4076#ifdef _SC_SELECT
4077 {"SC_SELECT", _SC_SELECT},
4078#endif
4079#ifdef _SC_SEMAPHORES
4080 {"SC_SEMAPHORES", _SC_SEMAPHORES},
4081#endif
4082#ifdef _SC_SEM_NSEMS_MAX
4083 {"SC_SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX},
4084#endif
4085#ifdef _SC_SEM_VALUE_MAX
4086 {"SC_SEM_VALUE_MAX", _SC_SEM_VALUE_MAX},
4087#endif
4088#ifdef _SC_SHARED_MEMORY_OBJECTS
4089 {"SC_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS},
4090#endif
4091#ifdef _SC_SHRT_MAX
4092 {"SC_SHRT_MAX", _SC_SHRT_MAX},
4093#endif
4094#ifdef _SC_SHRT_MIN
4095 {"SC_SHRT_MIN", _SC_SHRT_MIN},
4096#endif
4097#ifdef _SC_SIGQUEUE_MAX
4098 {"SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX},
4099#endif
4100#ifdef _SC_SIGRT_MAX
4101 {"SC_SIGRT_MAX", _SC_SIGRT_MAX},
4102#endif
4103#ifdef _SC_SIGRT_MIN
4104 {"SC_SIGRT_MIN", _SC_SIGRT_MIN},
4105#endif
Fred Draked86ed291999-12-15 15:34:33 +00004106#ifdef _SC_SOFTPOWER
4107 {"SC_SOFTPOWER", _SC_SOFTPOWER},
4108#endif
Fred Drakec9680921999-12-13 16:37:25 +00004109#ifdef _SC_SPLIT_CACHE
4110 {"SC_SPLIT_CACHE", _SC_SPLIT_CACHE},
4111#endif
4112#ifdef _SC_SSIZE_MAX
4113 {"SC_SSIZE_MAX", _SC_SSIZE_MAX},
4114#endif
4115#ifdef _SC_STACK_PROT
4116 {"SC_STACK_PROT", _SC_STACK_PROT},
4117#endif
4118#ifdef _SC_STREAM_MAX
4119 {"SC_STREAM_MAX", _SC_STREAM_MAX},
4120#endif
4121#ifdef _SC_SYNCHRONIZED_IO
4122 {"SC_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO},
4123#endif
4124#ifdef _SC_THREADS
4125 {"SC_THREADS", _SC_THREADS},
4126#endif
4127#ifdef _SC_THREAD_ATTR_STACKADDR
4128 {"SC_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR},
4129#endif
4130#ifdef _SC_THREAD_ATTR_STACKSIZE
4131 {"SC_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE},
4132#endif
4133#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS
4134 {"SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS},
4135#endif
4136#ifdef _SC_THREAD_KEYS_MAX
4137 {"SC_THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX},
4138#endif
4139#ifdef _SC_THREAD_PRIORITY_SCHEDULING
4140 {"SC_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING},
4141#endif
4142#ifdef _SC_THREAD_PRIO_INHERIT
4143 {"SC_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT},
4144#endif
4145#ifdef _SC_THREAD_PRIO_PROTECT
4146 {"SC_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT},
4147#endif
4148#ifdef _SC_THREAD_PROCESS_SHARED
4149 {"SC_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED},
4150#endif
4151#ifdef _SC_THREAD_SAFE_FUNCTIONS
4152 {"SC_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS},
4153#endif
4154#ifdef _SC_THREAD_STACK_MIN
4155 {"SC_THREAD_STACK_MIN", _SC_THREAD_STACK_MIN},
4156#endif
4157#ifdef _SC_THREAD_THREADS_MAX
4158 {"SC_THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX},
4159#endif
4160#ifdef _SC_TIMERS
4161 {"SC_TIMERS", _SC_TIMERS},
4162#endif
4163#ifdef _SC_TIMER_MAX
4164 {"SC_TIMER_MAX", _SC_TIMER_MAX},
4165#endif
4166#ifdef _SC_TTY_NAME_MAX
4167 {"SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX},
4168#endif
4169#ifdef _SC_TZNAME_MAX
4170 {"SC_TZNAME_MAX", _SC_TZNAME_MAX},
4171#endif
4172#ifdef _SC_T_IOV_MAX
4173 {"SC_T_IOV_MAX", _SC_T_IOV_MAX},
4174#endif
4175#ifdef _SC_UCHAR_MAX
4176 {"SC_UCHAR_MAX", _SC_UCHAR_MAX},
4177#endif
4178#ifdef _SC_UINT_MAX
4179 {"SC_UINT_MAX", _SC_UINT_MAX},
4180#endif
4181#ifdef _SC_UIO_MAXIOV
4182 {"SC_UIO_MAXIOV", _SC_UIO_MAXIOV},
4183#endif
4184#ifdef _SC_ULONG_MAX
4185 {"SC_ULONG_MAX", _SC_ULONG_MAX},
4186#endif
4187#ifdef _SC_USHRT_MAX
4188 {"SC_USHRT_MAX", _SC_USHRT_MAX},
4189#endif
4190#ifdef _SC_VERSION
4191 {"SC_VERSION", _SC_VERSION},
4192#endif
4193#ifdef _SC_WORD_BIT
4194 {"SC_WORD_BIT", _SC_WORD_BIT},
4195#endif
4196#ifdef _SC_XBS5_ILP32_OFF32
4197 {"SC_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32},
4198#endif
4199#ifdef _SC_XBS5_ILP32_OFFBIG
4200 {"SC_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG},
4201#endif
4202#ifdef _SC_XBS5_LP64_OFF64
4203 {"SC_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64},
4204#endif
4205#ifdef _SC_XBS5_LPBIG_OFFBIG
4206 {"SC_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG},
4207#endif
4208#ifdef _SC_XOPEN_CRYPT
4209 {"SC_XOPEN_CRYPT", _SC_XOPEN_CRYPT},
4210#endif
4211#ifdef _SC_XOPEN_ENH_I18N
4212 {"SC_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N},
4213#endif
4214#ifdef _SC_XOPEN_LEGACY
4215 {"SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY},
4216#endif
4217#ifdef _SC_XOPEN_REALTIME
4218 {"SC_XOPEN_REALTIME", _SC_XOPEN_REALTIME},
4219#endif
4220#ifdef _SC_XOPEN_REALTIME_THREADS
4221 {"SC_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS},
4222#endif
4223#ifdef _SC_XOPEN_SHM
4224 {"SC_XOPEN_SHM", _SC_XOPEN_SHM},
4225#endif
4226#ifdef _SC_XOPEN_UNIX
4227 {"SC_XOPEN_UNIX", _SC_XOPEN_UNIX},
4228#endif
4229#ifdef _SC_XOPEN_VERSION
4230 {"SC_XOPEN_VERSION", _SC_XOPEN_VERSION},
4231#endif
4232#ifdef _SC_XOPEN_XCU_VERSION
4233 {"SC_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION},
4234#endif
4235#ifdef _SC_XOPEN_XPG2
4236 {"SC_XOPEN_XPG2", _SC_XOPEN_XPG2},
4237#endif
4238#ifdef _SC_XOPEN_XPG3
4239 {"SC_XOPEN_XPG3", _SC_XOPEN_XPG3},
4240#endif
4241#ifdef _SC_XOPEN_XPG4
4242 {"SC_XOPEN_XPG4", _SC_XOPEN_XPG4},
4243#endif
4244};
4245
4246static int
4247conv_sysconf_confname(arg, valuep)
4248 PyObject *arg;
4249 int *valuep;
4250{
4251 return conv_confname(arg, valuep, posix_constants_sysconf,
4252 sizeof(posix_constants_sysconf)
4253 / sizeof(struct constdef));
4254}
4255
4256static char posix_sysconf__doc__[] = "\
4257sysconf(name) -> integer\n\
4258Return an integer-valued system configuration variable.";
4259
4260static PyObject *
4261posix_sysconf(self, args)
4262 PyObject *self;
4263 PyObject *args;
4264{
4265 PyObject *result = NULL;
4266 int name;
4267
4268 if (PyArg_ParseTuple(args, "O&:sysconf", conv_sysconf_confname, &name)) {
4269 int value;
4270
4271 errno = 0;
4272 value = sysconf(name);
4273 if (value == -1 && errno != 0)
4274 posix_error();
4275 else
4276 result = PyInt_FromLong(value);
4277 }
4278 return result;
4279}
4280#endif
4281
4282
Fred Drakebec628d1999-12-15 18:31:10 +00004283/* This code is used to ensure that the tables of configuration value names
4284 * are in sorted order as required by conv_confname(), and also to build the
4285 * the exported dictionaries that are used to publish information about the
4286 * names available on the host platform.
4287 *
4288 * Sorting the table at runtime ensures that the table is properly ordered
4289 * when used, even for platforms we're not able to test on. It also makes
4290 * it easier to add additional entries to the tables.
Fred Draked86ed291999-12-15 15:34:33 +00004291 */
Fred Drakebec628d1999-12-15 18:31:10 +00004292
4293static int
4294cmp_constdefs(v1, v2)
4295 const void *v1;
4296 const void *v2;
4297{
4298 const struct constdef *c1 =
4299 (const struct constdef *) v1;
4300 const struct constdef *c2 =
4301 (const struct constdef *) v2;
4302
4303 return strcmp(c1->name, c2->name);
4304}
4305
4306static int
4307setup_confname_table(table, tablesize, tablename, moddict)
Fred Draked86ed291999-12-15 15:34:33 +00004308 struct constdef *table;
4309 size_t tablesize;
Fred Drakebec628d1999-12-15 18:31:10 +00004310 char * tablename;
4311 PyObject *moddict;
Fred Draked86ed291999-12-15 15:34:33 +00004312{
Fred Drakebec628d1999-12-15 18:31:10 +00004313 PyObject *d = NULL;
4314
4315 qsort(table, tablesize, sizeof(struct constdef), cmp_constdefs);
4316 d = PyDict_New();
4317 if (d != NULL) {
4318 PyObject *o;
Fred Drakee1a79b91999-12-30 18:05:43 +00004319 size_t i = 0;
Fred Draked86ed291999-12-15 15:34:33 +00004320
Fred Drakebec628d1999-12-15 18:31:10 +00004321 for (; i < tablesize; ++i) {
4322 o = PyInt_FromLong(table[i].value);
4323 if (o == NULL
4324 || PyDict_SetItemString(d, table[i].name, o) == -1) {
4325 Py_DECREF(d);
4326 d = NULL;
4327 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004328 }
4329 }
Fred Drakebec628d1999-12-15 18:31:10 +00004330 if (PyDict_SetItemString(moddict, tablename, d) == -1)
4331 return -1;
4332 return 0;
Fred Draked86ed291999-12-15 15:34:33 +00004333 }
Fred Drakebec628d1999-12-15 18:31:10 +00004334 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004335}
4336
Fred Drakebec628d1999-12-15 18:31:10 +00004337/* Return -1 on failure, 0 on success. */
4338static int
4339setup_confname_tables(moddict)
4340 PyObject *moddict;
Fred Draked86ed291999-12-15 15:34:33 +00004341{
4342#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
Fred Drakebec628d1999-12-15 18:31:10 +00004343 if (setup_confname_table(posix_constants_pathconf,
Fred Draked86ed291999-12-15 15:34:33 +00004344 sizeof(posix_constants_pathconf)
4345 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004346 "pathconf_names", moddict))
4347 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004348#endif
4349#ifdef HAVE_CONFSTR
Fred Drakebec628d1999-12-15 18:31:10 +00004350 if (setup_confname_table(posix_constants_confstr,
Fred Draked86ed291999-12-15 15:34:33 +00004351 sizeof(posix_constants_confstr)
4352 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004353 "confstr_names", moddict))
4354 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004355#endif
4356#ifdef HAVE_SYSCONF
Fred Drakebec628d1999-12-15 18:31:10 +00004357 if (setup_confname_table(posix_constants_sysconf,
Fred Draked86ed291999-12-15 15:34:33 +00004358 sizeof(posix_constants_sysconf)
4359 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004360 "sysconf_names", moddict))
4361 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004362#endif
Fred Drakebec628d1999-12-15 18:31:10 +00004363 return 0;
Fred Draked86ed291999-12-15 15:34:33 +00004364}
Fred Draked86ed291999-12-15 15:34:33 +00004365
4366
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004367static char posix_abort__doc__[] = "\
4368abort() -> does not return!\n\
4369Abort the interpreter immediately. This 'dumps core' or otherwise fails\n\
4370in the hardest way possible on the hosting operating system.";
4371
4372static PyObject *
4373posix_abort(self, args)
4374 PyObject *self;
4375 PyObject *args;
4376{
4377 if (!PyArg_ParseTuple(args, ":abort"))
4378 return NULL;
4379 abort();
4380 /*NOTREACHED*/
4381 Py_FatalError("abort() called from Python code didn't abort!");
4382 return NULL;
4383}
Fred Drakebec628d1999-12-15 18:31:10 +00004384
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004385
4386static PyMethodDef posix_methods[] = {
4387 {"access", posix_access, METH_VARARGS, posix_access__doc__},
4388#ifdef HAVE_TTYNAME
4389 {"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__},
4390#endif
4391 {"chdir", posix_chdir, METH_VARARGS, posix_chdir__doc__},
4392 {"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004393#ifdef HAVE_CHOWN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004394 {"chown", posix_chown, METH_VARARGS, posix_chown__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004395#endif /* HAVE_CHOWN */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004396#ifdef HAVE_CTERMID
4397 {"ctermid", posix_ctermid, METH_VARARGS, posix_ctermid__doc__},
4398#endif
Guido van Rossum36bc6801995-06-14 22:54:23 +00004399#ifdef HAVE_GETCWD
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004400 {"getcwd", posix_getcwd, METH_VARARGS, posix_getcwd__doc__},
Guido van Rossum36bc6801995-06-14 22:54:23 +00004401#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004402#ifdef HAVE_LINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004403 {"link", posix_link, METH_VARARGS, posix_link__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004404#endif /* HAVE_LINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004405 {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__},
4406 {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__},
4407 {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004408#ifdef HAVE_NICE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004409 {"nice", posix_nice, METH_VARARGS, posix_nice__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004410#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004411#ifdef HAVE_READLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004412 {"readlink", posix_readlink, METH_VARARGS, posix_readlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004413#endif /* HAVE_READLINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004414 {"rename", posix_rename, METH_VARARGS, posix_rename__doc__},
4415 {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__},
4416 {"stat", posix_stat, METH_VARARGS, posix_stat__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004417#ifdef HAVE_SYMLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004418 {"symlink", posix_symlink, METH_VARARGS, posix_symlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004419#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004420#ifdef HAVE_SYSTEM
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004421 {"system", posix_system, METH_VARARGS, posix_system__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004422#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004423 {"umask", posix_umask, METH_VARARGS, posix_umask__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004424#ifdef HAVE_UNAME
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004425 {"uname", posix_uname, METH_VARARGS, posix_uname__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004426#endif /* HAVE_UNAME */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004427 {"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__},
4428 {"remove", posix_unlink, METH_VARARGS, posix_remove__doc__},
4429 {"utime", posix_utime, METH_VARARGS, posix_utime__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004430#ifdef HAVE_TIMES
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004431 {"times", posix_times, METH_VARARGS, posix_times__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004432#endif /* HAVE_TIMES */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004433 {"_exit", posix__exit, METH_VARARGS, posix__exit__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004434#ifdef HAVE_EXECV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004435 {"execv", posix_execv, METH_VARARGS, posix_execv__doc__},
4436 {"execve", posix_execve, METH_VARARGS, posix_execve__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004437#endif /* HAVE_EXECV */
Guido van Rossuma1065681999-01-25 23:20:23 +00004438#ifdef HAVE_SPAWNV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004439 {"spawnv", posix_spawnv, METH_VARARGS, posix_spawnv__doc__},
4440 {"spawnve", posix_spawnve, METH_VARARGS, posix_spawnve__doc__},
Guido van Rossuma1065681999-01-25 23:20:23 +00004441#endif /* HAVE_SPAWNV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004442#ifdef HAVE_FORK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004443 {"fork", posix_fork, METH_VARARGS, posix_fork__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004444#endif /* HAVE_FORK */
4445#ifdef HAVE_GETEGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004446 {"getegid", posix_getegid, METH_VARARGS, posix_getegid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004447#endif /* HAVE_GETEGID */
4448#ifdef HAVE_GETEUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004449 {"geteuid", posix_geteuid, METH_VARARGS, posix_geteuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004450#endif /* HAVE_GETEUID */
4451#ifdef HAVE_GETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004452 {"getgid", posix_getgid, METH_VARARGS, posix_getgid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004453#endif /* HAVE_GETGID */
Fred Drakec9680921999-12-13 16:37:25 +00004454#ifdef HAVE_GETGROUPS
4455 {"getgroups", posix_getgroups, METH_VARARGS, posix_getgroups__doc__},
4456#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004457 {"getpid", posix_getpid, METH_VARARGS, posix_getpid__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004458#ifdef HAVE_GETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004459 {"getpgrp", posix_getpgrp, METH_VARARGS, posix_getpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004460#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004461#ifdef HAVE_GETPPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004462 {"getppid", posix_getppid, METH_VARARGS, posix_getppid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004463#endif /* HAVE_GETPPID */
4464#ifdef HAVE_GETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004465 {"getuid", posix_getuid, METH_VARARGS, posix_getuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004466#endif /* HAVE_GETUID */
Fred Drake12c6e2d1999-12-14 21:25:03 +00004467#ifdef HAVE_GETLOGIN
4468 {"getlogin", posix_getlogin, METH_VARARGS, posix_getlogin__doc__},
4469#endif
Guido van Rossumad0ee831995-03-01 10:34:45 +00004470#ifdef HAVE_KILL
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004471 {"kill", posix_kill, METH_VARARGS, posix_kill__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004472#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00004473#ifdef HAVE_PLOCK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004474 {"plock", posix_plock, METH_VARARGS, posix_plock__doc__},
Guido van Rossumc0125471996-06-28 18:55:32 +00004475#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004476#ifdef HAVE_POPEN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004477 {"popen", posix_popen, METH_VARARGS, posix_popen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004478#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004479#ifdef HAVE_SETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004480 {"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004481#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004482#ifdef HAVE_SETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004483 {"setgid", posix_setgid, METH_VARARGS, posix_setgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004484#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004485#ifdef HAVE_SETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004486 {"setpgrp", posix_setpgrp, METH_VARARGS, posix_setpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004487#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004488#ifdef HAVE_WAIT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004489 {"wait", posix_wait, METH_VARARGS, posix_wait__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004490#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004491#ifdef HAVE_WAITPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004492 {"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004493#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004494#ifdef HAVE_SETSID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004495 {"setsid", posix_setsid, METH_VARARGS, posix_setsid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004496#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004497#ifdef HAVE_SETPGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004498 {"setpgid", posix_setpgid, METH_VARARGS, posix_setpgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004499#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004500#ifdef HAVE_TCGETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004501 {"tcgetpgrp", posix_tcgetpgrp, METH_VARARGS, posix_tcgetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004502#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004503#ifdef HAVE_TCSETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004504 {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004505#endif /* HAVE_TCSETPGRP */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004506 {"open", posix_open, METH_VARARGS, posix_open__doc__},
4507 {"close", posix_close, METH_VARARGS, posix_close__doc__},
4508 {"dup", posix_dup, METH_VARARGS, posix_dup__doc__},
4509 {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__},
4510 {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},
4511 {"read", posix_read, METH_VARARGS, posix_read__doc__},
4512 {"write", posix_write, METH_VARARGS, posix_write__doc__},
4513 {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__},
4514 {"fdopen", posix_fdopen, METH_VARARGS, posix_fdopen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004515#ifdef HAVE_PIPE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004516 {"pipe", posix_pipe, METH_VARARGS, posix_pipe__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004517#endif
4518#ifdef HAVE_MKFIFO
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004519 {"mkfifo", posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004520#endif
4521#ifdef HAVE_FTRUNCATE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004522 {"ftruncate", posix_ftruncate, METH_VARARGS, posix_ftruncate__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004523#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004524#ifdef HAVE_PUTENV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004525 {"putenv", posix_putenv, METH_VARARGS, posix_putenv__doc__},
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004526#endif
Guido van Rossumb6a47161997-09-15 22:54:34 +00004527#ifdef HAVE_STRERROR
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004528 {"strerror", posix_strerror, METH_VARARGS, posix_strerror__doc__},
Guido van Rossumb6a47161997-09-15 22:54:34 +00004529#endif
Guido van Rossum21142a01999-01-08 21:05:37 +00004530#ifdef HAVE_FSYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004531 {"fsync", posix_fsync, METH_VARARGS, posix_fsync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004532#endif
4533#ifdef HAVE_FDATASYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004534 {"fdatasync", posix_fdatasync, METH_VARARGS, posix_fdatasync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004535#endif
Guido van Rossumc9641791998-08-04 15:26:23 +00004536#ifdef HAVE_SYS_WAIT_H
4537#ifdef WIFSTOPPED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004538 {"WIFSTOPPED", posix_WIFSTOPPED, METH_VARARGS, posix_WIFSTOPPED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004539#endif /* WIFSTOPPED */
4540#ifdef WIFSIGNALED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004541 {"WIFSIGNALED", posix_WIFSIGNALED, METH_VARARGS, posix_WIFSIGNALED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004542#endif /* WIFSIGNALED */
4543#ifdef WIFEXITED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004544 {"WIFEXITED", posix_WIFEXITED, METH_VARARGS, posix_WIFEXITED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004545#endif /* WIFEXITED */
4546#ifdef WEXITSTATUS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004547 {"WEXITSTATUS", posix_WEXITSTATUS, METH_VARARGS, posix_WEXITSTATUS__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004548#endif /* WEXITSTATUS */
4549#ifdef WTERMSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004550 {"WTERMSIG", posix_WTERMSIG, METH_VARARGS, posix_WTERMSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004551#endif /* WTERMSIG */
4552#ifdef WSTOPSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004553 {"WSTOPSIG", posix_WSTOPSIG, METH_VARARGS, posix_WSTOPSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004554#endif /* WSTOPSIG */
4555#endif /* HAVE_SYS_WAIT_H */
Guido van Rossum94f6f721999-01-06 18:42:14 +00004556#ifdef HAVE_FSTATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004557 {"fstatvfs", posix_fstatvfs, METH_VARARGS, posix_fstatvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004558#endif
4559#ifdef HAVE_STATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004560 {"statvfs", posix_statvfs, METH_VARARGS, posix_statvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004561#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004562#ifdef HAVE_TMPNAM
4563 {"tmpfile", posix_tmpfile, METH_VARARGS, posix_tmpfile__doc__},
4564#endif
4565#ifdef HAVE_TEMPNAM
4566 {"tempnam", posix_tempnam, METH_VARARGS, posix_tempnam__doc__},
4567#endif
4568#ifdef HAVE_TMPNAM
4569 {"tmpnam", posix_tmpnam, METH_VARARGS, posix_tmpnam__doc__},
4570#endif
Fred Drakec9680921999-12-13 16:37:25 +00004571#ifdef HAVE_CONFSTR
4572 {"confstr", posix_confstr, METH_VARARGS, posix_confstr__doc__},
4573#endif
4574#ifdef HAVE_SYSCONF
4575 {"sysconf", posix_sysconf, METH_VARARGS, posix_sysconf__doc__},
4576#endif
4577#ifdef HAVE_FPATHCONF
4578 {"fpathconf", posix_fpathconf, METH_VARARGS, posix_fpathconf__doc__},
4579#endif
4580#ifdef HAVE_PATHCONF
4581 {"pathconf", posix_pathconf, METH_VARARGS, posix_pathconf__doc__},
4582#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004583 {"abort", posix_abort, METH_VARARGS, posix_abort__doc__},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004584 {NULL, NULL} /* Sentinel */
4585};
4586
4587
Barry Warsaw4a342091996-12-19 23:50:02 +00004588static int
4589ins(d, symbol, value)
4590 PyObject* d;
4591 char* symbol;
4592 long value;
4593{
4594 PyObject* v = PyInt_FromLong(value);
4595 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
4596 return -1; /* triggers fatal error */
4597
4598 Py_DECREF(v);
4599 return 0;
4600}
4601
Guido van Rossumd48f2521997-12-05 22:19:34 +00004602#if defined(PYOS_OS2)
4603/* Insert Platform-Specific Constant Values (Strings & Numbers) of Common Use */
4604static int insertvalues(PyObject *d)
4605{
4606 APIRET rc;
4607 ULONG values[QSV_MAX+1];
4608 PyObject *v;
4609 char *ver, tmp[10];
4610
4611 Py_BEGIN_ALLOW_THREADS
4612 rc = DosQuerySysInfo(1, QSV_MAX, &values[1], sizeof(values));
4613 Py_END_ALLOW_THREADS
4614
4615 if (rc != NO_ERROR) {
4616 os2_error(rc);
4617 return -1;
4618 }
4619
4620 if (ins(d, "meminstalled", values[QSV_TOTPHYSMEM])) return -1;
4621 if (ins(d, "memkernel", values[QSV_TOTRESMEM])) return -1;
4622 if (ins(d, "memvirtual", values[QSV_TOTAVAILMEM])) return -1;
4623 if (ins(d, "maxpathlen", values[QSV_MAX_PATH_LENGTH])) return -1;
4624 if (ins(d, "maxnamelen", values[QSV_MAX_COMP_LENGTH])) return -1;
4625 if (ins(d, "revision", values[QSV_VERSION_REVISION])) return -1;
4626 if (ins(d, "timeslice", values[QSV_MIN_SLICE])) return -1;
4627
4628 switch (values[QSV_VERSION_MINOR]) {
4629 case 0: ver = "2.00"; break;
4630 case 10: ver = "2.10"; break;
4631 case 11: ver = "2.11"; break;
4632 case 30: ver = "3.00"; break;
4633 case 40: ver = "4.00"; break;
4634 case 50: ver = "5.00"; break;
4635 default:
4636 sprintf(tmp, "%d-%d", values[QSV_VERSION_MAJOR],
4637 values[QSV_VERSION_MINOR]);
4638 ver = &tmp[0];
4639 }
4640
4641 /* Add Indicator of the Version of the Operating System */
4642 v = PyString_FromString(ver);
4643 if (!v || PyDict_SetItemString(d, "version", v) < 0)
4644 return -1;
4645 Py_DECREF(v);
4646
4647 /* Add Indicator of Which Drive was Used to Boot the System */
4648 tmp[0] = 'A' + values[QSV_BOOT_DRIVE] - 1;
4649 tmp[1] = ':';
4650 tmp[2] = '\0';
4651
4652 v = PyString_FromString(tmp);
4653 if (!v || PyDict_SetItemString(d, "bootdrive", v) < 0)
4654 return -1;
4655 Py_DECREF(v);
4656
4657 return 0;
4658}
4659#endif
4660
Barry Warsaw4a342091996-12-19 23:50:02 +00004661static int
4662all_ins(d)
4663 PyObject* d;
4664{
Guido van Rossum94f6f721999-01-06 18:42:14 +00004665#ifdef F_OK
4666 if (ins(d, "F_OK", (long)F_OK)) return -1;
4667#endif
4668#ifdef R_OK
4669 if (ins(d, "R_OK", (long)R_OK)) return -1;
4670#endif
4671#ifdef W_OK
4672 if (ins(d, "W_OK", (long)W_OK)) return -1;
4673#endif
4674#ifdef X_OK
4675 if (ins(d, "X_OK", (long)X_OK)) return -1;
4676#endif
Fred Drakec9680921999-12-13 16:37:25 +00004677#ifdef NGROUPS_MAX
4678 if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1;
4679#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004680#ifdef TMP_MAX
4681 if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1;
4682#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004683#ifdef WNOHANG
4684 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
4685#endif
4686#ifdef O_RDONLY
4687 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
4688#endif
4689#ifdef O_WRONLY
4690 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
4691#endif
4692#ifdef O_RDWR
4693 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
4694#endif
4695#ifdef O_NDELAY
4696 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
4697#endif
4698#ifdef O_NONBLOCK
4699 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
4700#endif
4701#ifdef O_APPEND
4702 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
4703#endif
4704#ifdef O_DSYNC
4705 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
4706#endif
4707#ifdef O_RSYNC
4708 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
4709#endif
4710#ifdef O_SYNC
4711 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
4712#endif
4713#ifdef O_NOCTTY
4714 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
4715#endif
4716#ifdef O_CREAT
4717 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
4718#endif
4719#ifdef O_EXCL
4720 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
4721#endif
4722#ifdef O_TRUNC
4723 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
4724#endif
Guido van Rossum98d9d091997-08-08 21:48:51 +00004725#ifdef O_BINARY
4726 if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
4727#endif
4728#ifdef O_TEXT
4729 if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
4730#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +00004731
Guido van Rossum246bc171999-02-01 23:54:31 +00004732#ifdef HAVE_SPAWNV
Guido van Rossum7d385291999-02-16 19:38:04 +00004733 if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1;
4734 if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1;
4735 if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1;
4736 if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1;
4737 if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1;
Guido van Rossum246bc171999-02-01 23:54:31 +00004738#endif
4739
Guido van Rossumd48f2521997-12-05 22:19:34 +00004740#if defined(PYOS_OS2)
4741 if (insertvalues(d)) return -1;
4742#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004743 return 0;
4744}
4745
4746
Guido van Rossumc5a0f531997-12-02 20:36:02 +00004747#if ( defined(_MSC_VER) || defined(__WATCOMC__) ) && !defined(__QNX__)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004748#define INITFUNC initnt
4749#define MODNAME "nt"
4750#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004751#if defined(PYOS_OS2)
4752#define INITFUNC initos2
4753#define MODNAME "os2"
4754#else
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004755#define INITFUNC initposix
4756#define MODNAME "posix"
4757#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004758#endif
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004759
Guido van Rossum3886bb61998-12-04 18:50:17 +00004760DL_EXPORT(void)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004761INITFUNC()
Guido van Rossumb6775db1994-08-01 11:34:53 +00004762{
Barry Warsaw53699e91996-12-10 23:23:01 +00004763 PyObject *m, *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00004764
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004765 m = Py_InitModule4(MODNAME,
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004766 posix_methods,
4767 posix__doc__,
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004768 (PyObject *)NULL,
4769 PYTHON_API_VERSION);
Barry Warsaw53699e91996-12-10 23:23:01 +00004770 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004771
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004772 /* Initialize environ dictionary */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004773 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00004774 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004775 return;
Barry Warsaw53699e91996-12-10 23:23:01 +00004776 Py_DECREF(v);
Fred Drakec9680921999-12-13 16:37:25 +00004777
Barry Warsaw4a342091996-12-19 23:50:02 +00004778 if (all_ins(d))
Barry Warsaw4a342091996-12-19 23:50:02 +00004779 return;
4780
Fred Drakebec628d1999-12-15 18:31:10 +00004781 if (setup_confname_tables(d))
4782 return;
4783
Barry Warsawca74da41999-02-09 19:31:45 +00004784 PyDict_SetItemString(d, "error", PyExc_OSError);
Fred Drake762e2061999-08-26 17:23:54 +00004785
4786 posix_putenv_garbage = PyDict_New();
Guido van Rossumb6775db1994-08-01 11:34:53 +00004787}