blob: b09cd0597c8748584c4d1e271de6e0b6c52e6b0e [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 Drakec9680921999-12-13 16:37:25 +00003372 */
3373struct constdef {
3374 char *name;
3375 long value;
3376};
3377
Fred Drake12c6e2d1999-12-14 21:25:03 +00003378static int
3379conv_confname(arg, valuep, table, tablesize)
3380 PyObject *arg;
3381 int *valuep;
3382 struct constdef *table;
3383 size_t tablesize;
3384{
3385 if (PyInt_Check(arg)) {
3386 *valuep = PyInt_AS_LONG(arg);
3387 return 1;
3388 }
3389 if (PyString_Check(arg)) {
3390 /* look up the value in the table using a binary search */
3391 int lo = 0;
3392 int hi = tablesize;
3393 int cmp, mid;
3394 char *confname = PyString_AS_STRING(arg);
3395 while (lo < hi) {
3396 mid = (lo + hi) / 2;
3397 cmp = strcmp(confname, table[mid].name);
3398 if (cmp < 0)
3399 hi = mid;
3400 else if (cmp > 0)
3401 lo = mid + 1;
3402 else {
3403 *valuep = table[mid].value;
3404 return 1;
3405 }
3406 }
3407 PyErr_SetString(PyExc_ValueError, "unrecognized configuration name");
3408 }
3409 else
3410 PyErr_SetString(PyExc_TypeError,
3411 "configuration names must be strings or integers");
3412 return 0;
3413}
3414
3415
3416#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
3417static struct constdef posix_constants_pathconf[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003418#ifdef _PC_ABI_AIO_XFER_MAX
3419 {"PC_ABI_AIO_XFER_MAX", _PC_ABI_AIO_XFER_MAX},
3420#endif
3421#ifdef _PC_ABI_ASYNC_IO
3422 {"PC_ABI_ASYNC_IO", _PC_ABI_ASYNC_IO},
3423#endif
Fred Drakec9680921999-12-13 16:37:25 +00003424#ifdef _PC_ASYNC_IO
3425 {"PC_ASYNC_IO", _PC_ASYNC_IO},
3426#endif
3427#ifdef _PC_CHOWN_RESTRICTED
3428 {"PC_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED},
3429#endif
3430#ifdef _PC_FILESIZEBITS
3431 {"PC_FILESIZEBITS", _PC_FILESIZEBITS},
3432#endif
3433#ifdef _PC_LAST
3434 {"PC_LAST", _PC_LAST},
3435#endif
3436#ifdef _PC_LINK_MAX
3437 {"PC_LINK_MAX", _PC_LINK_MAX},
3438#endif
3439#ifdef _PC_MAX_CANON
3440 {"PC_MAX_CANON", _PC_MAX_CANON},
3441#endif
3442#ifdef _PC_MAX_INPUT
3443 {"PC_MAX_INPUT", _PC_MAX_INPUT},
3444#endif
3445#ifdef _PC_NAME_MAX
3446 {"PC_NAME_MAX", _PC_NAME_MAX},
3447#endif
3448#ifdef _PC_NO_TRUNC
3449 {"PC_NO_TRUNC", _PC_NO_TRUNC},
3450#endif
3451#ifdef _PC_PATH_MAX
3452 {"PC_PATH_MAX", _PC_PATH_MAX},
3453#endif
3454#ifdef _PC_PIPE_BUF
3455 {"PC_PIPE_BUF", _PC_PIPE_BUF},
3456#endif
3457#ifdef _PC_PRIO_IO
3458 {"PC_PRIO_IO", _PC_PRIO_IO},
3459#endif
3460#ifdef _PC_SOCK_MAXBUF
3461 {"PC_SOCK_MAXBUF", _PC_SOCK_MAXBUF},
3462#endif
3463#ifdef _PC_SYNC_IO
3464 {"PC_SYNC_IO", _PC_SYNC_IO},
3465#endif
3466#ifdef _PC_VDISABLE
3467 {"PC_VDISABLE", _PC_VDISABLE},
3468#endif
3469};
3470
Fred Drakec9680921999-12-13 16:37:25 +00003471static int
3472conv_path_confname(arg, valuep)
3473 PyObject *arg;
3474 int *valuep;
3475{
3476 return conv_confname(arg, valuep, posix_constants_pathconf,
3477 sizeof(posix_constants_pathconf)
3478 / sizeof(struct constdef));
3479}
3480#endif
3481
3482#ifdef HAVE_FPATHCONF
3483static char posix_fpathconf__doc__[] = "\
3484fpathconf(fd, name) -> integer\n\
3485Return the configuration limit name for the file descriptor fd.\n\
3486If there is no limit, return -1.";
3487
3488static PyObject *
3489posix_fpathconf(self, args)
3490 PyObject *self;
3491 PyObject *args;
3492{
3493 PyObject *result = NULL;
3494 int name, fd;
3495
Fred Drake12c6e2d1999-12-14 21:25:03 +00003496 if (PyArg_ParseTuple(args, "iO&:fpathconf", &fd,
3497 conv_path_confname, &name)) {
Fred Drakec9680921999-12-13 16:37:25 +00003498 long limit;
3499
3500 errno = 0;
3501 limit = fpathconf(fd, name);
3502 if (limit == -1 && errno != 0)
3503 posix_error();
3504 else
3505 result = PyInt_FromLong(limit);
3506 }
3507 return result;
3508}
3509#endif
3510
3511
3512#ifdef HAVE_PATHCONF
3513static char posix_pathconf__doc__[] = "\
3514pathconf(path, name) -> integer\n\
3515Return the configuration limit name for the file or directory path.\n\
3516If there is no limit, return -1.";
3517
3518static PyObject *
3519posix_pathconf(self, args)
3520 PyObject *self;
3521 PyObject *args;
3522{
3523 PyObject *result = NULL;
3524 int name;
3525 char *path;
3526
3527 if (PyArg_ParseTuple(args, "sO&:pathconf", &path,
3528 conv_path_confname, &name)) {
3529 long limit;
3530
3531 errno = 0;
3532 limit = pathconf(path, name);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003533 if (limit == -1 && errno != 0) {
Fred Drakec9680921999-12-13 16:37:25 +00003534 if (errno == EINVAL)
3535 /* could be a path or name problem */
3536 posix_error();
3537 else
3538 posix_error_with_filename(path);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003539 }
Fred Drakec9680921999-12-13 16:37:25 +00003540 else
3541 result = PyInt_FromLong(limit);
3542 }
3543 return result;
3544}
3545#endif
3546
3547#ifdef HAVE_CONFSTR
3548static struct constdef posix_constants_confstr[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003549#ifdef _CS_ARCHITECTURE
3550 {"CS_ARCHITECTURE", _CS_ARCHITECTURE},
3551#endif
3552#ifdef _CS_HOSTNAME
3553 {"CS_HOSTNAME", _CS_HOSTNAME},
3554#endif
3555#ifdef _CS_HW_PROVIDER
3556 {"CS_HW_PROVIDER", _CS_HW_PROVIDER},
3557#endif
3558#ifdef _CS_HW_SERIAL
3559 {"CS_HW_SERIAL", _CS_HW_SERIAL},
3560#endif
3561#ifdef _CS_INITTAB_NAME
3562 {"CS_INITTAB_NAME", _CS_INITTAB_NAME},
3563#endif
Fred Drakec9680921999-12-13 16:37:25 +00003564#ifdef _CS_LFS64_CFLAGS
3565 {"CS_LFS64_CFLAGS", _CS_LFS64_CFLAGS},
3566#endif
3567#ifdef _CS_LFS64_LDFLAGS
3568 {"CS_LFS64_LDFLAGS", _CS_LFS64_LDFLAGS},
3569#endif
3570#ifdef _CS_LFS64_LIBS
3571 {"CS_LFS64_LIBS", _CS_LFS64_LIBS},
3572#endif
3573#ifdef _CS_LFS64_LINTFLAGS
3574 {"CS_LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS},
3575#endif
3576#ifdef _CS_LFS_CFLAGS
3577 {"CS_LFS_CFLAGS", _CS_LFS_CFLAGS},
3578#endif
3579#ifdef _CS_LFS_LDFLAGS
3580 {"CS_LFS_LDFLAGS", _CS_LFS_LDFLAGS},
3581#endif
3582#ifdef _CS_LFS_LIBS
3583 {"CS_LFS_LIBS", _CS_LFS_LIBS},
3584#endif
3585#ifdef _CS_LFS_LINTFLAGS
3586 {"CS_LFS_LINTFLAGS", _CS_LFS_LINTFLAGS},
3587#endif
Fred Draked86ed291999-12-15 15:34:33 +00003588#ifdef _CS_MACHINE
3589 {"CS_MACHINE", _CS_MACHINE},
3590#endif
Fred Drakec9680921999-12-13 16:37:25 +00003591#ifdef _CS_PATH
3592 {"CS_PATH", _CS_PATH},
3593#endif
Fred Draked86ed291999-12-15 15:34:33 +00003594#ifdef _CS_RELEASE
3595 {"CS_RELEASE", _CS_RELEASE},
3596#endif
3597#ifdef _CS_SRPC_DOMAIN
3598 {"CS_SRPC_DOMAIN", _CS_SRPC_DOMAIN},
3599#endif
3600#ifdef _CS_SYSNAME
3601 {"CS_SYSNAME", _CS_SYSNAME},
3602#endif
3603#ifdef _CS_VERSION
3604 {"CS_VERSION", _CS_VERSION},
3605#endif
Fred Drakec9680921999-12-13 16:37:25 +00003606#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS
3607 {"CS_XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS},
3608#endif
3609#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS
3610 {"CS_XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS},
3611#endif
3612#ifdef _CS_XBS5_ILP32_OFF32_LIBS
3613 {"CS_XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS},
3614#endif
3615#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS
3616 {"CS_XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS},
3617#endif
3618#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS
3619 {"CS_XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS},
3620#endif
3621#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS
3622 {"CS_XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS},
3623#endif
3624#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS
3625 {"CS_XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS},
3626#endif
3627#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
3628 {"CS_XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS},
3629#endif
3630#ifdef _CS_XBS5_LP64_OFF64_CFLAGS
3631 {"CS_XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS},
3632#endif
3633#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS
3634 {"CS_XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS},
3635#endif
3636#ifdef _CS_XBS5_LP64_OFF64_LIBS
3637 {"CS_XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS},
3638#endif
3639#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS
3640 {"CS_XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS},
3641#endif
3642#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS
3643 {"CS_XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS},
3644#endif
3645#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
3646 {"CS_XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS},
3647#endif
3648#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS
3649 {"CS_XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS},
3650#endif
3651#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
3652 {"CS_XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS},
3653#endif
Fred Draked86ed291999-12-15 15:34:33 +00003654#ifdef _MIPS_CS_AVAIL_PROCESSORS
3655 {"MIPS_CS_AVAIL_PROCESSORS", _MIPS_CS_AVAIL_PROCESSORS},
3656#endif
3657#ifdef _MIPS_CS_BASE
3658 {"MIPS_CS_BASE", _MIPS_CS_BASE},
3659#endif
3660#ifdef _MIPS_CS_HOSTID
3661 {"MIPS_CS_HOSTID", _MIPS_CS_HOSTID},
3662#endif
3663#ifdef _MIPS_CS_HW_NAME
3664 {"MIPS_CS_HW_NAME", _MIPS_CS_HW_NAME},
3665#endif
3666#ifdef _MIPS_CS_NUM_PROCESSORS
3667 {"MIPS_CS_NUM_PROCESSORS", _MIPS_CS_NUM_PROCESSORS},
3668#endif
3669#ifdef _MIPS_CS_OSREL_MAJ
3670 {"MIPS_CS_OSREL_MAJ", _MIPS_CS_OSREL_MAJ},
3671#endif
3672#ifdef _MIPS_CS_OSREL_MIN
3673 {"MIPS_CS_OSREL_MIN", _MIPS_CS_OSREL_MIN},
3674#endif
3675#ifdef _MIPS_CS_OSREL_PATCH
3676 {"MIPS_CS_OSREL_PATCH", _MIPS_CS_OSREL_PATCH},
3677#endif
3678#ifdef _MIPS_CS_OS_NAME
3679 {"MIPS_CS_OS_NAME", _MIPS_CS_OS_NAME},
3680#endif
3681#ifdef _MIPS_CS_OS_PROVIDER
3682 {"MIPS_CS_OS_PROVIDER", _MIPS_CS_OS_PROVIDER},
3683#endif
3684#ifdef _MIPS_CS_PROCESSORS
3685 {"MIPS_CS_PROCESSORS", _MIPS_CS_PROCESSORS},
3686#endif
3687#ifdef _MIPS_CS_SERIAL
3688 {"MIPS_CS_SERIAL", _MIPS_CS_SERIAL},
3689#endif
3690#ifdef _MIPS_CS_VENDOR
3691 {"MIPS_CS_VENDOR", _MIPS_CS_VENDOR},
3692#endif
Fred Drakec9680921999-12-13 16:37:25 +00003693};
3694
3695static int
3696conv_confstr_confname(arg, valuep)
3697 PyObject *arg;
3698 int *valuep;
3699{
3700 return conv_confname(arg, valuep, posix_constants_confstr,
3701 sizeof(posix_constants_confstr)
3702 / sizeof(struct constdef));
3703}
3704
3705static char posix_confstr__doc__[] = "\
3706confstr(name) -> string\n\
3707Return a string-valued system configuration variable.";
3708
3709static PyObject *
3710posix_confstr(self, args)
3711 PyObject *self;
3712 PyObject *args;
3713{
3714 PyObject *result = NULL;
3715 int name;
3716 char buffer[64];
3717
3718 if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) {
3719 int len = confstr(name, buffer, sizeof(buffer));
3720
Fred Drakec9680921999-12-13 16:37:25 +00003721 errno = 0;
3722 if (len == 0) {
3723 if (errno != 0)
3724 posix_error();
3725 else
3726 result = PyString_FromString("");
3727 }
3728 else {
3729 if (len >= sizeof(buffer)) {
3730 result = PyString_FromStringAndSize(NULL, len);
3731 if (result != NULL)
3732 confstr(name, PyString_AS_STRING(result), len+1);
3733 }
3734 else
3735 result = PyString_FromString(buffer);
3736 }
3737 }
3738 return result;
3739}
3740#endif
3741
3742
3743#ifdef HAVE_SYSCONF
3744static struct constdef posix_constants_sysconf[] = {
3745#ifdef _SC_2_CHAR_TERM
3746 {"SC_2_CHAR_TERM", _SC_2_CHAR_TERM},
3747#endif
3748#ifdef _SC_2_C_BIND
3749 {"SC_2_C_BIND", _SC_2_C_BIND},
3750#endif
3751#ifdef _SC_2_C_DEV
3752 {"SC_2_C_DEV", _SC_2_C_DEV},
3753#endif
3754#ifdef _SC_2_C_VERSION
3755 {"SC_2_C_VERSION", _SC_2_C_VERSION},
3756#endif
3757#ifdef _SC_2_FORT_DEV
3758 {"SC_2_FORT_DEV", _SC_2_FORT_DEV},
3759#endif
3760#ifdef _SC_2_FORT_RUN
3761 {"SC_2_FORT_RUN", _SC_2_FORT_RUN},
3762#endif
3763#ifdef _SC_2_LOCALEDEF
3764 {"SC_2_LOCALEDEF", _SC_2_LOCALEDEF},
3765#endif
3766#ifdef _SC_2_SW_DEV
3767 {"SC_2_SW_DEV", _SC_2_SW_DEV},
3768#endif
3769#ifdef _SC_2_UPE
3770 {"SC_2_UPE", _SC_2_UPE},
3771#endif
3772#ifdef _SC_2_VERSION
3773 {"SC_2_VERSION", _SC_2_VERSION},
3774#endif
Fred Draked86ed291999-12-15 15:34:33 +00003775#ifdef _SC_ABI_ASYNCHRONOUS_IO
3776 {"SC_ABI_ASYNCHRONOUS_IO", _SC_ABI_ASYNCHRONOUS_IO},
3777#endif
3778#ifdef _SC_ACL
3779 {"SC_ACL", _SC_ACL},
3780#endif
Fred Drakec9680921999-12-13 16:37:25 +00003781#ifdef _SC_AIO_LISTIO_MAX
3782 {"SC_AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX},
3783#endif
3784#ifdef _SC_AIO_LIST_MAX
3785 {"SC_AIO_LIST_MAX", _SC_AIO_LIST_MAX},
3786#endif
3787#ifdef _SC_AIO_MAX
3788 {"SC_AIO_MAX", _SC_AIO_MAX},
3789#endif
3790#ifdef _SC_AIO_PRIO_DELTA_MAX
3791 {"SC_AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX},
3792#endif
3793#ifdef _SC_ARG_MAX
3794 {"SC_ARG_MAX", _SC_ARG_MAX},
3795#endif
3796#ifdef _SC_ASYNCHRONOUS_IO
3797 {"SC_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO},
3798#endif
3799#ifdef _SC_ATEXIT_MAX
3800 {"SC_ATEXIT_MAX", _SC_ATEXIT_MAX},
3801#endif
Fred Draked86ed291999-12-15 15:34:33 +00003802#ifdef _SC_AUDIT
3803 {"SC_AUDIT", _SC_AUDIT},
3804#endif
Fred Drakec9680921999-12-13 16:37:25 +00003805#ifdef _SC_AVPHYS_PAGES
3806 {"SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES},
3807#endif
3808#ifdef _SC_BC_BASE_MAX
3809 {"SC_BC_BASE_MAX", _SC_BC_BASE_MAX},
3810#endif
3811#ifdef _SC_BC_DIM_MAX
3812 {"SC_BC_DIM_MAX", _SC_BC_DIM_MAX},
3813#endif
3814#ifdef _SC_BC_SCALE_MAX
3815 {"SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX},
3816#endif
3817#ifdef _SC_BC_STRING_MAX
3818 {"SC_BC_STRING_MAX", _SC_BC_STRING_MAX},
3819#endif
Fred Draked86ed291999-12-15 15:34:33 +00003820#ifdef _SC_CAP
3821 {"SC_CAP", _SC_CAP},
3822#endif
Fred Drakec9680921999-12-13 16:37:25 +00003823#ifdef _SC_CHARCLASS_NAME_MAX
3824 {"SC_CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX},
3825#endif
3826#ifdef _SC_CHAR_BIT
3827 {"SC_CHAR_BIT", _SC_CHAR_BIT},
3828#endif
3829#ifdef _SC_CHAR_MAX
3830 {"SC_CHAR_MAX", _SC_CHAR_MAX},
3831#endif
3832#ifdef _SC_CHAR_MIN
3833 {"SC_CHAR_MIN", _SC_CHAR_MIN},
3834#endif
3835#ifdef _SC_CHILD_MAX
3836 {"SC_CHILD_MAX", _SC_CHILD_MAX},
3837#endif
3838#ifdef _SC_CLK_TCK
3839 {"SC_CLK_TCK", _SC_CLK_TCK},
3840#endif
3841#ifdef _SC_COHER_BLKSZ
3842 {"SC_COHER_BLKSZ", _SC_COHER_BLKSZ},
3843#endif
3844#ifdef _SC_COLL_WEIGHTS_MAX
3845 {"SC_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX},
3846#endif
3847#ifdef _SC_DCACHE_ASSOC
3848 {"SC_DCACHE_ASSOC", _SC_DCACHE_ASSOC},
3849#endif
3850#ifdef _SC_DCACHE_BLKSZ
3851 {"SC_DCACHE_BLKSZ", _SC_DCACHE_BLKSZ},
3852#endif
3853#ifdef _SC_DCACHE_LINESZ
3854 {"SC_DCACHE_LINESZ", _SC_DCACHE_LINESZ},
3855#endif
3856#ifdef _SC_DCACHE_SZ
3857 {"SC_DCACHE_SZ", _SC_DCACHE_SZ},
3858#endif
3859#ifdef _SC_DCACHE_TBLKSZ
3860 {"SC_DCACHE_TBLKSZ", _SC_DCACHE_TBLKSZ},
3861#endif
3862#ifdef _SC_DELAYTIMER_MAX
3863 {"SC_DELAYTIMER_MAX", _SC_DELAYTIMER_MAX},
3864#endif
3865#ifdef _SC_EQUIV_CLASS_MAX
3866 {"SC_EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX},
3867#endif
3868#ifdef _SC_EXPR_NEST_MAX
3869 {"SC_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX},
3870#endif
3871#ifdef _SC_FSYNC
3872 {"SC_FSYNC", _SC_FSYNC},
3873#endif
3874#ifdef _SC_GETGR_R_SIZE_MAX
3875 {"SC_GETGR_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX},
3876#endif
3877#ifdef _SC_GETPW_R_SIZE_MAX
3878 {"SC_GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX},
3879#endif
3880#ifdef _SC_ICACHE_ASSOC
3881 {"SC_ICACHE_ASSOC", _SC_ICACHE_ASSOC},
3882#endif
3883#ifdef _SC_ICACHE_BLKSZ
3884 {"SC_ICACHE_BLKSZ", _SC_ICACHE_BLKSZ},
3885#endif
3886#ifdef _SC_ICACHE_LINESZ
3887 {"SC_ICACHE_LINESZ", _SC_ICACHE_LINESZ},
3888#endif
3889#ifdef _SC_ICACHE_SZ
3890 {"SC_ICACHE_SZ", _SC_ICACHE_SZ},
3891#endif
Fred Draked86ed291999-12-15 15:34:33 +00003892#ifdef _SC_INF
3893 {"SC_INF", _SC_INF},
3894#endif
Fred Drakec9680921999-12-13 16:37:25 +00003895#ifdef _SC_INT_MAX
3896 {"SC_INT_MAX", _SC_INT_MAX},
3897#endif
3898#ifdef _SC_INT_MIN
3899 {"SC_INT_MIN", _SC_INT_MIN},
3900#endif
3901#ifdef _SC_IOV_MAX
3902 {"SC_IOV_MAX", _SC_IOV_MAX},
3903#endif
Fred Draked86ed291999-12-15 15:34:33 +00003904#ifdef _SC_IP_SECOPTS
3905 {"SC_IP_SECOPTS", _SC_IP_SECOPTS},
3906#endif
Fred Drakec9680921999-12-13 16:37:25 +00003907#ifdef _SC_JOB_CONTROL
3908 {"SC_JOB_CONTROL", _SC_JOB_CONTROL},
3909#endif
Fred Draked86ed291999-12-15 15:34:33 +00003910#ifdef _SC_KERN_POINTERS
3911 {"SC_KERN_POINTERS", _SC_KERN_POINTERS},
3912#endif
3913#ifdef _SC_KERN_SIM
3914 {"SC_KERN_SIM", _SC_KERN_SIM},
3915#endif
Fred Drakec9680921999-12-13 16:37:25 +00003916#ifdef _SC_LINE_MAX
3917 {"SC_LINE_MAX", _SC_LINE_MAX},
3918#endif
3919#ifdef _SC_LOGIN_NAME_MAX
3920 {"SC_LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX},
3921#endif
3922#ifdef _SC_LOGNAME_MAX
3923 {"SC_LOGNAME_MAX", _SC_LOGNAME_MAX},
3924#endif
3925#ifdef _SC_LONG_BIT
3926 {"SC_LONG_BIT", _SC_LONG_BIT},
3927#endif
Fred Draked86ed291999-12-15 15:34:33 +00003928#ifdef _SC_MAC
3929 {"SC_MAC", _SC_MAC},
3930#endif
Fred Drakec9680921999-12-13 16:37:25 +00003931#ifdef _SC_MAPPED_FILES
3932 {"SC_MAPPED_FILES", _SC_MAPPED_FILES},
3933#endif
3934#ifdef _SC_MAXPID
3935 {"SC_MAXPID", _SC_MAXPID},
3936#endif
3937#ifdef _SC_MB_LEN_MAX
3938 {"SC_MB_LEN_MAX", _SC_MB_LEN_MAX},
3939#endif
3940#ifdef _SC_MEMLOCK
3941 {"SC_MEMLOCK", _SC_MEMLOCK},
3942#endif
3943#ifdef _SC_MEMLOCK_RANGE
3944 {"SC_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE},
3945#endif
3946#ifdef _SC_MEMORY_PROTECTION
3947 {"SC_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION},
3948#endif
3949#ifdef _SC_MESSAGE_PASSING
3950 {"SC_MESSAGE_PASSING", _SC_MESSAGE_PASSING},
3951#endif
Fred Draked86ed291999-12-15 15:34:33 +00003952#ifdef _SC_MMAP_FIXED_ALIGNMENT
3953 {"SC_MMAP_FIXED_ALIGNMENT", _SC_MMAP_FIXED_ALIGNMENT},
3954#endif
Fred Drakec9680921999-12-13 16:37:25 +00003955#ifdef _SC_MQ_OPEN_MAX
3956 {"SC_MQ_OPEN_MAX", _SC_MQ_OPEN_MAX},
3957#endif
3958#ifdef _SC_MQ_PRIO_MAX
3959 {"SC_MQ_PRIO_MAX", _SC_MQ_PRIO_MAX},
3960#endif
Fred Draked86ed291999-12-15 15:34:33 +00003961#ifdef _SC_NACLS_MAX
3962 {"SC_NACLS_MAX", _SC_NACLS_MAX},
3963#endif
Fred Drakec9680921999-12-13 16:37:25 +00003964#ifdef _SC_NGROUPS_MAX
3965 {"SC_NGROUPS_MAX", _SC_NGROUPS_MAX},
3966#endif
3967#ifdef _SC_NL_ARGMAX
3968 {"SC_NL_ARGMAX", _SC_NL_ARGMAX},
3969#endif
3970#ifdef _SC_NL_LANGMAX
3971 {"SC_NL_LANGMAX", _SC_NL_LANGMAX},
3972#endif
3973#ifdef _SC_NL_MSGMAX
3974 {"SC_NL_MSGMAX", _SC_NL_MSGMAX},
3975#endif
3976#ifdef _SC_NL_NMAX
3977 {"SC_NL_NMAX", _SC_NL_NMAX},
3978#endif
3979#ifdef _SC_NL_SETMAX
3980 {"SC_NL_SETMAX", _SC_NL_SETMAX},
3981#endif
3982#ifdef _SC_NL_TEXTMAX
3983 {"SC_NL_TEXTMAX", _SC_NL_TEXTMAX},
3984#endif
3985#ifdef _SC_NPROCESSORS_CONF
3986 {"SC_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF},
3987#endif
3988#ifdef _SC_NPROCESSORS_ONLN
3989 {"SC_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN},
3990#endif
Fred Draked86ed291999-12-15 15:34:33 +00003991#ifdef _SC_NPROC_CONF
3992 {"SC_NPROC_CONF", _SC_NPROC_CONF},
3993#endif
3994#ifdef _SC_NPROC_ONLN
3995 {"SC_NPROC_ONLN", _SC_NPROC_ONLN},
3996#endif
Fred Drakec9680921999-12-13 16:37:25 +00003997#ifdef _SC_NZERO
3998 {"SC_NZERO", _SC_NZERO},
3999#endif
4000#ifdef _SC_OPEN_MAX
4001 {"SC_OPEN_MAX", _SC_OPEN_MAX},
4002#endif
4003#ifdef _SC_PAGESIZE
4004 {"SC_PAGESIZE", _SC_PAGESIZE},
4005#endif
4006#ifdef _SC_PAGE_SIZE
4007 {"SC_PAGE_SIZE", _SC_PAGE_SIZE},
4008#endif
4009#ifdef _SC_PASS_MAX
4010 {"SC_PASS_MAX", _SC_PASS_MAX},
4011#endif
4012#ifdef _SC_PHYS_PAGES
4013 {"SC_PHYS_PAGES", _SC_PHYS_PAGES},
4014#endif
4015#ifdef _SC_PII
4016 {"SC_PII", _SC_PII},
4017#endif
4018#ifdef _SC_PII_INTERNET
4019 {"SC_PII_INTERNET", _SC_PII_INTERNET},
4020#endif
4021#ifdef _SC_PII_INTERNET_DGRAM
4022 {"SC_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM},
4023#endif
4024#ifdef _SC_PII_INTERNET_STREAM
4025 {"SC_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM},
4026#endif
4027#ifdef _SC_PII_OSI
4028 {"SC_PII_OSI", _SC_PII_OSI},
4029#endif
4030#ifdef _SC_PII_OSI_CLTS
4031 {"SC_PII_OSI_CLTS", _SC_PII_OSI_CLTS},
4032#endif
4033#ifdef _SC_PII_OSI_COTS
4034 {"SC_PII_OSI_COTS", _SC_PII_OSI_COTS},
4035#endif
4036#ifdef _SC_PII_OSI_M
4037 {"SC_PII_OSI_M", _SC_PII_OSI_M},
4038#endif
4039#ifdef _SC_PII_SOCKET
4040 {"SC_PII_SOCKET", _SC_PII_SOCKET},
4041#endif
4042#ifdef _SC_PII_XTI
4043 {"SC_PII_XTI", _SC_PII_XTI},
4044#endif
4045#ifdef _SC_POLL
4046 {"SC_POLL", _SC_POLL},
4047#endif
4048#ifdef _SC_PRIORITIZED_IO
4049 {"SC_PRIORITIZED_IO", _SC_PRIORITIZED_IO},
4050#endif
4051#ifdef _SC_PRIORITY_SCHEDULING
4052 {"SC_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING},
4053#endif
4054#ifdef _SC_REALTIME_SIGNALS
4055 {"SC_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS},
4056#endif
4057#ifdef _SC_RE_DUP_MAX
4058 {"SC_RE_DUP_MAX", _SC_RE_DUP_MAX},
4059#endif
4060#ifdef _SC_RTSIG_MAX
4061 {"SC_RTSIG_MAX", _SC_RTSIG_MAX},
4062#endif
4063#ifdef _SC_SAVED_IDS
4064 {"SC_SAVED_IDS", _SC_SAVED_IDS},
4065#endif
4066#ifdef _SC_SCHAR_MAX
4067 {"SC_SCHAR_MAX", _SC_SCHAR_MAX},
4068#endif
4069#ifdef _SC_SCHAR_MIN
4070 {"SC_SCHAR_MIN", _SC_SCHAR_MIN},
4071#endif
4072#ifdef _SC_SELECT
4073 {"SC_SELECT", _SC_SELECT},
4074#endif
4075#ifdef _SC_SEMAPHORES
4076 {"SC_SEMAPHORES", _SC_SEMAPHORES},
4077#endif
4078#ifdef _SC_SEM_NSEMS_MAX
4079 {"SC_SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX},
4080#endif
4081#ifdef _SC_SEM_VALUE_MAX
4082 {"SC_SEM_VALUE_MAX", _SC_SEM_VALUE_MAX},
4083#endif
4084#ifdef _SC_SHARED_MEMORY_OBJECTS
4085 {"SC_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS},
4086#endif
4087#ifdef _SC_SHRT_MAX
4088 {"SC_SHRT_MAX", _SC_SHRT_MAX},
4089#endif
4090#ifdef _SC_SHRT_MIN
4091 {"SC_SHRT_MIN", _SC_SHRT_MIN},
4092#endif
4093#ifdef _SC_SIGQUEUE_MAX
4094 {"SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX},
4095#endif
4096#ifdef _SC_SIGRT_MAX
4097 {"SC_SIGRT_MAX", _SC_SIGRT_MAX},
4098#endif
4099#ifdef _SC_SIGRT_MIN
4100 {"SC_SIGRT_MIN", _SC_SIGRT_MIN},
4101#endif
Fred Draked86ed291999-12-15 15:34:33 +00004102#ifdef _SC_SOFTPOWER
4103 {"SC_SOFTPOWER", _SC_SOFTPOWER},
4104#endif
Fred Drakec9680921999-12-13 16:37:25 +00004105#ifdef _SC_SPLIT_CACHE
4106 {"SC_SPLIT_CACHE", _SC_SPLIT_CACHE},
4107#endif
4108#ifdef _SC_SSIZE_MAX
4109 {"SC_SSIZE_MAX", _SC_SSIZE_MAX},
4110#endif
4111#ifdef _SC_STACK_PROT
4112 {"SC_STACK_PROT", _SC_STACK_PROT},
4113#endif
4114#ifdef _SC_STREAM_MAX
4115 {"SC_STREAM_MAX", _SC_STREAM_MAX},
4116#endif
4117#ifdef _SC_SYNCHRONIZED_IO
4118 {"SC_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO},
4119#endif
4120#ifdef _SC_THREADS
4121 {"SC_THREADS", _SC_THREADS},
4122#endif
4123#ifdef _SC_THREAD_ATTR_STACKADDR
4124 {"SC_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR},
4125#endif
4126#ifdef _SC_THREAD_ATTR_STACKSIZE
4127 {"SC_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE},
4128#endif
4129#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS
4130 {"SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS},
4131#endif
4132#ifdef _SC_THREAD_KEYS_MAX
4133 {"SC_THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX},
4134#endif
4135#ifdef _SC_THREAD_PRIORITY_SCHEDULING
4136 {"SC_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING},
4137#endif
4138#ifdef _SC_THREAD_PRIO_INHERIT
4139 {"SC_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT},
4140#endif
4141#ifdef _SC_THREAD_PRIO_PROTECT
4142 {"SC_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT},
4143#endif
4144#ifdef _SC_THREAD_PROCESS_SHARED
4145 {"SC_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED},
4146#endif
4147#ifdef _SC_THREAD_SAFE_FUNCTIONS
4148 {"SC_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS},
4149#endif
4150#ifdef _SC_THREAD_STACK_MIN
4151 {"SC_THREAD_STACK_MIN", _SC_THREAD_STACK_MIN},
4152#endif
4153#ifdef _SC_THREAD_THREADS_MAX
4154 {"SC_THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX},
4155#endif
4156#ifdef _SC_TIMERS
4157 {"SC_TIMERS", _SC_TIMERS},
4158#endif
4159#ifdef _SC_TIMER_MAX
4160 {"SC_TIMER_MAX", _SC_TIMER_MAX},
4161#endif
4162#ifdef _SC_TTY_NAME_MAX
4163 {"SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX},
4164#endif
4165#ifdef _SC_TZNAME_MAX
4166 {"SC_TZNAME_MAX", _SC_TZNAME_MAX},
4167#endif
4168#ifdef _SC_T_IOV_MAX
4169 {"SC_T_IOV_MAX", _SC_T_IOV_MAX},
4170#endif
4171#ifdef _SC_UCHAR_MAX
4172 {"SC_UCHAR_MAX", _SC_UCHAR_MAX},
4173#endif
4174#ifdef _SC_UINT_MAX
4175 {"SC_UINT_MAX", _SC_UINT_MAX},
4176#endif
4177#ifdef _SC_UIO_MAXIOV
4178 {"SC_UIO_MAXIOV", _SC_UIO_MAXIOV},
4179#endif
4180#ifdef _SC_ULONG_MAX
4181 {"SC_ULONG_MAX", _SC_ULONG_MAX},
4182#endif
4183#ifdef _SC_USHRT_MAX
4184 {"SC_USHRT_MAX", _SC_USHRT_MAX},
4185#endif
4186#ifdef _SC_VERSION
4187 {"SC_VERSION", _SC_VERSION},
4188#endif
4189#ifdef _SC_WORD_BIT
4190 {"SC_WORD_BIT", _SC_WORD_BIT},
4191#endif
4192#ifdef _SC_XBS5_ILP32_OFF32
4193 {"SC_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32},
4194#endif
4195#ifdef _SC_XBS5_ILP32_OFFBIG
4196 {"SC_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG},
4197#endif
4198#ifdef _SC_XBS5_LP64_OFF64
4199 {"SC_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64},
4200#endif
4201#ifdef _SC_XBS5_LPBIG_OFFBIG
4202 {"SC_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG},
4203#endif
4204#ifdef _SC_XOPEN_CRYPT
4205 {"SC_XOPEN_CRYPT", _SC_XOPEN_CRYPT},
4206#endif
4207#ifdef _SC_XOPEN_ENH_I18N
4208 {"SC_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N},
4209#endif
4210#ifdef _SC_XOPEN_LEGACY
4211 {"SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY},
4212#endif
4213#ifdef _SC_XOPEN_REALTIME
4214 {"SC_XOPEN_REALTIME", _SC_XOPEN_REALTIME},
4215#endif
4216#ifdef _SC_XOPEN_REALTIME_THREADS
4217 {"SC_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS},
4218#endif
4219#ifdef _SC_XOPEN_SHM
4220 {"SC_XOPEN_SHM", _SC_XOPEN_SHM},
4221#endif
4222#ifdef _SC_XOPEN_UNIX
4223 {"SC_XOPEN_UNIX", _SC_XOPEN_UNIX},
4224#endif
4225#ifdef _SC_XOPEN_VERSION
4226 {"SC_XOPEN_VERSION", _SC_XOPEN_VERSION},
4227#endif
4228#ifdef _SC_XOPEN_XCU_VERSION
4229 {"SC_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION},
4230#endif
4231#ifdef _SC_XOPEN_XPG2
4232 {"SC_XOPEN_XPG2", _SC_XOPEN_XPG2},
4233#endif
4234#ifdef _SC_XOPEN_XPG3
4235 {"SC_XOPEN_XPG3", _SC_XOPEN_XPG3},
4236#endif
4237#ifdef _SC_XOPEN_XPG4
4238 {"SC_XOPEN_XPG4", _SC_XOPEN_XPG4},
4239#endif
4240};
4241
4242static int
4243conv_sysconf_confname(arg, valuep)
4244 PyObject *arg;
4245 int *valuep;
4246{
4247 return conv_confname(arg, valuep, posix_constants_sysconf,
4248 sizeof(posix_constants_sysconf)
4249 / sizeof(struct constdef));
4250}
4251
4252static char posix_sysconf__doc__[] = "\
4253sysconf(name) -> integer\n\
4254Return an integer-valued system configuration variable.";
4255
4256static PyObject *
4257posix_sysconf(self, args)
4258 PyObject *self;
4259 PyObject *args;
4260{
4261 PyObject *result = NULL;
4262 int name;
4263
4264 if (PyArg_ParseTuple(args, "O&:sysconf", conv_sysconf_confname, &name)) {
4265 int value;
4266
4267 errno = 0;
4268 value = sysconf(name);
4269 if (value == -1 && errno != 0)
4270 posix_error();
4271 else
4272 result = PyInt_FromLong(value);
4273 }
4274 return result;
4275}
4276#endif
4277
4278
Fred Draked86ed291999-12-15 15:34:33 +00004279#ifdef CHECK_CONFNAME_TABLES
4280/* This code should not be enabled by default; it's only purpose is to
4281 * test the order of constants in the configuration name tables. The
4282 * second function defined here, check_confname_tables(), is called
4283 * during module initialization if CHECK_CONFNAME_TABLES is defined.
4284 * This only needs to be done when changes are made to the tables.
4285 */
4286static void
4287check_confname_table(table, tablesize, tablename)
4288 struct constdef *table;
4289 size_t tablesize;
4290 char *tablename;
4291{
4292 if (tablesize > 1) {
4293 int i = 0;
4294
4295 for (; i < (tablesize - 1); ++i) {
4296 if (strcmp(table[i].name, table[i + 1].name) >= 0) {
4297 char buffer[256];
4298
4299 snprintf(buffer, sizeof(buffer),
4300 "confname table '%s' out of order!\n", tablename);
4301 Py_FatalError(buffer);
4302 }
4303 }
4304 }
4305}
4306
4307static void
4308check_confname_tables()
4309{
4310#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
4311 check_confname_table(posix_constants_pathconf,
4312 sizeof(posix_constants_pathconf)
4313 / sizeof(struct constdef),
4314 "pathconf");
4315#endif
4316#ifdef HAVE_CONFSTR
4317 check_confname_table(posix_constants_confstr,
4318 sizeof(posix_constants_confstr)
4319 / sizeof(struct constdef),
4320 "confstr");
4321#endif
4322#ifdef HAVE_SYSCONF
4323 check_confname_table(posix_constants_sysconf,
4324 sizeof(posix_constants_sysconf)
4325 / sizeof(struct constdef),
4326 "sysconf");
4327#endif
4328}
4329#endif
4330
4331
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004332static char posix_abort__doc__[] = "\
4333abort() -> does not return!\n\
4334Abort the interpreter immediately. This 'dumps core' or otherwise fails\n\
4335in the hardest way possible on the hosting operating system.";
4336
4337static PyObject *
4338posix_abort(self, args)
4339 PyObject *self;
4340 PyObject *args;
4341{
4342 if (!PyArg_ParseTuple(args, ":abort"))
4343 return NULL;
4344 abort();
4345 /*NOTREACHED*/
4346 Py_FatalError("abort() called from Python code didn't abort!");
4347 return NULL;
4348}
4349
4350
4351static PyMethodDef posix_methods[] = {
4352 {"access", posix_access, METH_VARARGS, posix_access__doc__},
4353#ifdef HAVE_TTYNAME
4354 {"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__},
4355#endif
4356 {"chdir", posix_chdir, METH_VARARGS, posix_chdir__doc__},
4357 {"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004358#ifdef HAVE_CHOWN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004359 {"chown", posix_chown, METH_VARARGS, posix_chown__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004360#endif /* HAVE_CHOWN */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004361#ifdef HAVE_CTERMID
4362 {"ctermid", posix_ctermid, METH_VARARGS, posix_ctermid__doc__},
4363#endif
Guido van Rossum36bc6801995-06-14 22:54:23 +00004364#ifdef HAVE_GETCWD
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004365 {"getcwd", posix_getcwd, METH_VARARGS, posix_getcwd__doc__},
Guido van Rossum36bc6801995-06-14 22:54:23 +00004366#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004367#ifdef HAVE_LINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004368 {"link", posix_link, METH_VARARGS, posix_link__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004369#endif /* HAVE_LINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004370 {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__},
4371 {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__},
4372 {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004373#ifdef HAVE_NICE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004374 {"nice", posix_nice, METH_VARARGS, posix_nice__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004375#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004376#ifdef HAVE_READLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004377 {"readlink", posix_readlink, METH_VARARGS, posix_readlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004378#endif /* HAVE_READLINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004379 {"rename", posix_rename, METH_VARARGS, posix_rename__doc__},
4380 {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__},
4381 {"stat", posix_stat, METH_VARARGS, posix_stat__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004382#ifdef HAVE_SYMLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004383 {"symlink", posix_symlink, METH_VARARGS, posix_symlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004384#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004385#ifdef HAVE_SYSTEM
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004386 {"system", posix_system, METH_VARARGS, posix_system__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004387#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004388 {"umask", posix_umask, METH_VARARGS, posix_umask__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004389#ifdef HAVE_UNAME
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004390 {"uname", posix_uname, METH_VARARGS, posix_uname__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004391#endif /* HAVE_UNAME */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004392 {"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__},
4393 {"remove", posix_unlink, METH_VARARGS, posix_remove__doc__},
4394 {"utime", posix_utime, METH_VARARGS, posix_utime__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004395#ifdef HAVE_TIMES
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004396 {"times", posix_times, METH_VARARGS, posix_times__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004397#endif /* HAVE_TIMES */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004398 {"_exit", posix__exit, METH_VARARGS, posix__exit__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004399#ifdef HAVE_EXECV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004400 {"execv", posix_execv, METH_VARARGS, posix_execv__doc__},
4401 {"execve", posix_execve, METH_VARARGS, posix_execve__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004402#endif /* HAVE_EXECV */
Guido van Rossuma1065681999-01-25 23:20:23 +00004403#ifdef HAVE_SPAWNV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004404 {"spawnv", posix_spawnv, METH_VARARGS, posix_spawnv__doc__},
4405 {"spawnve", posix_spawnve, METH_VARARGS, posix_spawnve__doc__},
Guido van Rossuma1065681999-01-25 23:20:23 +00004406#endif /* HAVE_SPAWNV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004407#ifdef HAVE_FORK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004408 {"fork", posix_fork, METH_VARARGS, posix_fork__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004409#endif /* HAVE_FORK */
4410#ifdef HAVE_GETEGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004411 {"getegid", posix_getegid, METH_VARARGS, posix_getegid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004412#endif /* HAVE_GETEGID */
4413#ifdef HAVE_GETEUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004414 {"geteuid", posix_geteuid, METH_VARARGS, posix_geteuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004415#endif /* HAVE_GETEUID */
4416#ifdef HAVE_GETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004417 {"getgid", posix_getgid, METH_VARARGS, posix_getgid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004418#endif /* HAVE_GETGID */
Fred Drakec9680921999-12-13 16:37:25 +00004419#ifdef HAVE_GETGROUPS
4420 {"getgroups", posix_getgroups, METH_VARARGS, posix_getgroups__doc__},
4421#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004422 {"getpid", posix_getpid, METH_VARARGS, posix_getpid__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004423#ifdef HAVE_GETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004424 {"getpgrp", posix_getpgrp, METH_VARARGS, posix_getpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004425#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004426#ifdef HAVE_GETPPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004427 {"getppid", posix_getppid, METH_VARARGS, posix_getppid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004428#endif /* HAVE_GETPPID */
4429#ifdef HAVE_GETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004430 {"getuid", posix_getuid, METH_VARARGS, posix_getuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004431#endif /* HAVE_GETUID */
Fred Drake12c6e2d1999-12-14 21:25:03 +00004432#ifdef HAVE_GETLOGIN
4433 {"getlogin", posix_getlogin, METH_VARARGS, posix_getlogin__doc__},
4434#endif
Guido van Rossumad0ee831995-03-01 10:34:45 +00004435#ifdef HAVE_KILL
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004436 {"kill", posix_kill, METH_VARARGS, posix_kill__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004437#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00004438#ifdef HAVE_PLOCK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004439 {"plock", posix_plock, METH_VARARGS, posix_plock__doc__},
Guido van Rossumc0125471996-06-28 18:55:32 +00004440#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004441#ifdef HAVE_POPEN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004442 {"popen", posix_popen, METH_VARARGS, posix_popen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004443#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004444#ifdef HAVE_SETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004445 {"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004446#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004447#ifdef HAVE_SETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004448 {"setgid", posix_setgid, METH_VARARGS, posix_setgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004449#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004450#ifdef HAVE_SETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004451 {"setpgrp", posix_setpgrp, METH_VARARGS, posix_setpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004452#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004453#ifdef HAVE_WAIT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004454 {"wait", posix_wait, METH_VARARGS, posix_wait__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004455#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004456#ifdef HAVE_WAITPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004457 {"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004458#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004459#ifdef HAVE_SETSID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004460 {"setsid", posix_setsid, METH_VARARGS, posix_setsid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004461#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004462#ifdef HAVE_SETPGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004463 {"setpgid", posix_setpgid, METH_VARARGS, posix_setpgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004464#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004465#ifdef HAVE_TCGETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004466 {"tcgetpgrp", posix_tcgetpgrp, METH_VARARGS, posix_tcgetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004467#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004468#ifdef HAVE_TCSETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004469 {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004470#endif /* HAVE_TCSETPGRP */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004471 {"open", posix_open, METH_VARARGS, posix_open__doc__},
4472 {"close", posix_close, METH_VARARGS, posix_close__doc__},
4473 {"dup", posix_dup, METH_VARARGS, posix_dup__doc__},
4474 {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__},
4475 {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},
4476 {"read", posix_read, METH_VARARGS, posix_read__doc__},
4477 {"write", posix_write, METH_VARARGS, posix_write__doc__},
4478 {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__},
4479 {"fdopen", posix_fdopen, METH_VARARGS, posix_fdopen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004480#ifdef HAVE_PIPE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004481 {"pipe", posix_pipe, METH_VARARGS, posix_pipe__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004482#endif
4483#ifdef HAVE_MKFIFO
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004484 {"mkfifo", posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004485#endif
4486#ifdef HAVE_FTRUNCATE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004487 {"ftruncate", posix_ftruncate, METH_VARARGS, posix_ftruncate__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004488#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004489#ifdef HAVE_PUTENV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004490 {"putenv", posix_putenv, METH_VARARGS, posix_putenv__doc__},
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004491#endif
Guido van Rossumb6a47161997-09-15 22:54:34 +00004492#ifdef HAVE_STRERROR
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004493 {"strerror", posix_strerror, METH_VARARGS, posix_strerror__doc__},
Guido van Rossumb6a47161997-09-15 22:54:34 +00004494#endif
Guido van Rossum21142a01999-01-08 21:05:37 +00004495#ifdef HAVE_FSYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004496 {"fsync", posix_fsync, METH_VARARGS, posix_fsync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004497#endif
4498#ifdef HAVE_FDATASYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004499 {"fdatasync", posix_fdatasync, METH_VARARGS, posix_fdatasync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004500#endif
Guido van Rossumc9641791998-08-04 15:26:23 +00004501#ifdef HAVE_SYS_WAIT_H
4502#ifdef WIFSTOPPED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004503 {"WIFSTOPPED", posix_WIFSTOPPED, METH_VARARGS, posix_WIFSTOPPED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004504#endif /* WIFSTOPPED */
4505#ifdef WIFSIGNALED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004506 {"WIFSIGNALED", posix_WIFSIGNALED, METH_VARARGS, posix_WIFSIGNALED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004507#endif /* WIFSIGNALED */
4508#ifdef WIFEXITED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004509 {"WIFEXITED", posix_WIFEXITED, METH_VARARGS, posix_WIFEXITED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004510#endif /* WIFEXITED */
4511#ifdef WEXITSTATUS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004512 {"WEXITSTATUS", posix_WEXITSTATUS, METH_VARARGS, posix_WEXITSTATUS__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004513#endif /* WEXITSTATUS */
4514#ifdef WTERMSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004515 {"WTERMSIG", posix_WTERMSIG, METH_VARARGS, posix_WTERMSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004516#endif /* WTERMSIG */
4517#ifdef WSTOPSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004518 {"WSTOPSIG", posix_WSTOPSIG, METH_VARARGS, posix_WSTOPSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004519#endif /* WSTOPSIG */
4520#endif /* HAVE_SYS_WAIT_H */
Guido van Rossum94f6f721999-01-06 18:42:14 +00004521#ifdef HAVE_FSTATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004522 {"fstatvfs", posix_fstatvfs, METH_VARARGS, posix_fstatvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004523#endif
4524#ifdef HAVE_STATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004525 {"statvfs", posix_statvfs, METH_VARARGS, posix_statvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004526#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004527#ifdef HAVE_TMPNAM
4528 {"tmpfile", posix_tmpfile, METH_VARARGS, posix_tmpfile__doc__},
4529#endif
4530#ifdef HAVE_TEMPNAM
4531 {"tempnam", posix_tempnam, METH_VARARGS, posix_tempnam__doc__},
4532#endif
4533#ifdef HAVE_TMPNAM
4534 {"tmpnam", posix_tmpnam, METH_VARARGS, posix_tmpnam__doc__},
4535#endif
Fred Drakec9680921999-12-13 16:37:25 +00004536#ifdef HAVE_CONFSTR
4537 {"confstr", posix_confstr, METH_VARARGS, posix_confstr__doc__},
4538#endif
4539#ifdef HAVE_SYSCONF
4540 {"sysconf", posix_sysconf, METH_VARARGS, posix_sysconf__doc__},
4541#endif
4542#ifdef HAVE_FPATHCONF
4543 {"fpathconf", posix_fpathconf, METH_VARARGS, posix_fpathconf__doc__},
4544#endif
4545#ifdef HAVE_PATHCONF
4546 {"pathconf", posix_pathconf, METH_VARARGS, posix_pathconf__doc__},
4547#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004548 {"abort", posix_abort, METH_VARARGS, posix_abort__doc__},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004549 {NULL, NULL} /* Sentinel */
4550};
4551
4552
Barry Warsaw4a342091996-12-19 23:50:02 +00004553static int
4554ins(d, symbol, value)
4555 PyObject* d;
4556 char* symbol;
4557 long value;
4558{
4559 PyObject* v = PyInt_FromLong(value);
4560 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
4561 return -1; /* triggers fatal error */
4562
4563 Py_DECREF(v);
4564 return 0;
4565}
4566
Guido van Rossumd48f2521997-12-05 22:19:34 +00004567#if defined(PYOS_OS2)
4568/* Insert Platform-Specific Constant Values (Strings & Numbers) of Common Use */
4569static int insertvalues(PyObject *d)
4570{
4571 APIRET rc;
4572 ULONG values[QSV_MAX+1];
4573 PyObject *v;
4574 char *ver, tmp[10];
4575
4576 Py_BEGIN_ALLOW_THREADS
4577 rc = DosQuerySysInfo(1, QSV_MAX, &values[1], sizeof(values));
4578 Py_END_ALLOW_THREADS
4579
4580 if (rc != NO_ERROR) {
4581 os2_error(rc);
4582 return -1;
4583 }
4584
4585 if (ins(d, "meminstalled", values[QSV_TOTPHYSMEM])) return -1;
4586 if (ins(d, "memkernel", values[QSV_TOTRESMEM])) return -1;
4587 if (ins(d, "memvirtual", values[QSV_TOTAVAILMEM])) return -1;
4588 if (ins(d, "maxpathlen", values[QSV_MAX_PATH_LENGTH])) return -1;
4589 if (ins(d, "maxnamelen", values[QSV_MAX_COMP_LENGTH])) return -1;
4590 if (ins(d, "revision", values[QSV_VERSION_REVISION])) return -1;
4591 if (ins(d, "timeslice", values[QSV_MIN_SLICE])) return -1;
4592
4593 switch (values[QSV_VERSION_MINOR]) {
4594 case 0: ver = "2.00"; break;
4595 case 10: ver = "2.10"; break;
4596 case 11: ver = "2.11"; break;
4597 case 30: ver = "3.00"; break;
4598 case 40: ver = "4.00"; break;
4599 case 50: ver = "5.00"; break;
4600 default:
4601 sprintf(tmp, "%d-%d", values[QSV_VERSION_MAJOR],
4602 values[QSV_VERSION_MINOR]);
4603 ver = &tmp[0];
4604 }
4605
4606 /* Add Indicator of the Version of the Operating System */
4607 v = PyString_FromString(ver);
4608 if (!v || PyDict_SetItemString(d, "version", v) < 0)
4609 return -1;
4610 Py_DECREF(v);
4611
4612 /* Add Indicator of Which Drive was Used to Boot the System */
4613 tmp[0] = 'A' + values[QSV_BOOT_DRIVE] - 1;
4614 tmp[1] = ':';
4615 tmp[2] = '\0';
4616
4617 v = PyString_FromString(tmp);
4618 if (!v || PyDict_SetItemString(d, "bootdrive", v) < 0)
4619 return -1;
4620 Py_DECREF(v);
4621
4622 return 0;
4623}
4624#endif
4625
Barry Warsaw4a342091996-12-19 23:50:02 +00004626static int
4627all_ins(d)
4628 PyObject* d;
4629{
Guido van Rossum94f6f721999-01-06 18:42:14 +00004630#ifdef F_OK
4631 if (ins(d, "F_OK", (long)F_OK)) return -1;
4632#endif
4633#ifdef R_OK
4634 if (ins(d, "R_OK", (long)R_OK)) return -1;
4635#endif
4636#ifdef W_OK
4637 if (ins(d, "W_OK", (long)W_OK)) return -1;
4638#endif
4639#ifdef X_OK
4640 if (ins(d, "X_OK", (long)X_OK)) return -1;
4641#endif
Fred Drakec9680921999-12-13 16:37:25 +00004642#ifdef NGROUPS_MAX
4643 if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1;
4644#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004645#ifdef TMP_MAX
4646 if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1;
4647#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004648#ifdef WNOHANG
4649 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
4650#endif
4651#ifdef O_RDONLY
4652 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
4653#endif
4654#ifdef O_WRONLY
4655 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
4656#endif
4657#ifdef O_RDWR
4658 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
4659#endif
4660#ifdef O_NDELAY
4661 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
4662#endif
4663#ifdef O_NONBLOCK
4664 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
4665#endif
4666#ifdef O_APPEND
4667 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
4668#endif
4669#ifdef O_DSYNC
4670 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
4671#endif
4672#ifdef O_RSYNC
4673 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
4674#endif
4675#ifdef O_SYNC
4676 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
4677#endif
4678#ifdef O_NOCTTY
4679 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
4680#endif
4681#ifdef O_CREAT
4682 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
4683#endif
4684#ifdef O_EXCL
4685 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
4686#endif
4687#ifdef O_TRUNC
4688 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
4689#endif
Guido van Rossum98d9d091997-08-08 21:48:51 +00004690#ifdef O_BINARY
4691 if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
4692#endif
4693#ifdef O_TEXT
4694 if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
4695#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +00004696
Guido van Rossum246bc171999-02-01 23:54:31 +00004697#ifdef HAVE_SPAWNV
Guido van Rossum7d385291999-02-16 19:38:04 +00004698 if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1;
4699 if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1;
4700 if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1;
4701 if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1;
4702 if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1;
Guido van Rossum246bc171999-02-01 23:54:31 +00004703#endif
4704
Guido van Rossumd48f2521997-12-05 22:19:34 +00004705#if defined(PYOS_OS2)
4706 if (insertvalues(d)) return -1;
4707#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004708 return 0;
4709}
4710
4711
Guido van Rossumc5a0f531997-12-02 20:36:02 +00004712#if ( defined(_MSC_VER) || defined(__WATCOMC__) ) && !defined(__QNX__)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004713#define INITFUNC initnt
4714#define MODNAME "nt"
4715#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004716#if defined(PYOS_OS2)
4717#define INITFUNC initos2
4718#define MODNAME "os2"
4719#else
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004720#define INITFUNC initposix
4721#define MODNAME "posix"
4722#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004723#endif
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004724
Guido van Rossum3886bb61998-12-04 18:50:17 +00004725DL_EXPORT(void)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004726INITFUNC()
Guido van Rossumb6775db1994-08-01 11:34:53 +00004727{
Barry Warsaw53699e91996-12-10 23:23:01 +00004728 PyObject *m, *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00004729
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004730 m = Py_InitModule4(MODNAME,
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004731 posix_methods,
4732 posix__doc__,
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004733 (PyObject *)NULL,
4734 PYTHON_API_VERSION);
Barry Warsaw53699e91996-12-10 23:23:01 +00004735 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004736
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004737 /* Initialize environ dictionary */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004738 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00004739 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004740 return;
Barry Warsaw53699e91996-12-10 23:23:01 +00004741 Py_DECREF(v);
Fred Drakec9680921999-12-13 16:37:25 +00004742
Barry Warsaw4a342091996-12-19 23:50:02 +00004743 if (all_ins(d))
Barry Warsaw4a342091996-12-19 23:50:02 +00004744 return;
4745
Barry Warsawca74da41999-02-09 19:31:45 +00004746 PyDict_SetItemString(d, "error", PyExc_OSError);
Fred Drake762e2061999-08-26 17:23:54 +00004747
4748 posix_putenv_garbage = PyDict_New();
Fred Draked86ed291999-12-15 15:34:33 +00004749
4750#ifdef CHECK_CONFNAME_TABLES
4751 check_confname_tables();
4752#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004753}