blob: 809c24aa2b2f6ef5435f347c487f111efaee7954 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* POSIX module implementation */
33
Guido van Rossuma4916fa1996-05-23 22:58:55 +000034/* This file is also used for Windows NT and MS-Win. In that case the module
Guido van Rossumad0ee831995-03-01 10:34:45 +000035 actually calls itself 'nt', not 'posix', and a few functions are
36 either unimplemented or implemented differently. The source
Guido van Rossum8d665e61996-06-26 18:22:49 +000037 assumes that for Windows NT, the macro 'MS_WIN32' is defined independent
Guido van Rossumad0ee831995-03-01 10:34:45 +000038 of the compiler used. Different compilers define their own feature
Guido van Rossuma4916fa1996-05-23 22:58:55 +000039 test macro, e.g. '__BORLANDC__' or '_MSC_VER'. */
Guido van Rossumad0ee831995-03-01 10:34:45 +000040
Guido van Rossuma4916fa1996-05-23 22:58:55 +000041/* See also ../Dos/dosmodule.c */
Guido van Rossumad0ee831995-03-01 10:34:45 +000042
Guido van Rossumec4f4ac1997-06-02 22:20:51 +000043static char posix__doc__ [] =
44"This module provides access to operating system functionality that is\n\
45standardized by the C Standard and the POSIX standard (a thinly\n\
46disguised Unix interface). Refer to the library manual and\n\
47corresponding Unix manual entries for more information on calls.";
48
Barry Warsaw53699e91996-12-10 23:23:01 +000049#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000051#if defined(PYOS_OS2)
52#define INCL_DOS
53#define INCL_DOSERRORS
54#define INCL_DOSPROCESS
55#define INCL_NOPMAPI
56#include <os2.h>
57#endif
58
Guido van Rossumb6775db1994-08-01 11:34:53 +000059#include <sys/types.h>
60#include <sys/stat.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +000061#ifdef HAVE_SYS_WAIT_H
62#include <sys/wait.h> /* For WNOHANG */
63#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000064
Guido van Rossuma376cc51996-12-05 23:43:35 +000065#ifdef HAVE_SIGNAL_H
66#include <signal.h>
67#endif
68
Guido van Rossumb6775db1994-08-01 11:34:53 +000069#include "mytime.h" /* For clock_t on some systems */
70
71#ifdef HAVE_FCNTL_H
72#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000073#endif /* HAVE_FCNTL_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +000074
Guido van Rossuma4916fa1996-05-23 22:58:55 +000075/* Various compilers have only certain posix functions */
Guido van Rossum6d8841c1997-08-14 19:57:39 +000076/* XXX Gosh I wish these were all moved into config.h */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000077#if defined(PYCC_VACPP) && defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000078#include <process.h>
79#else
Guido van Rossumc5a0f531997-12-02 20:36:02 +000080#if defined(__WATCOMC__) && !defined(__QNX__) /* Watcom compiler */
Guido van Rossuma4916fa1996-05-23 22:58:55 +000081#define HAVE_GETCWD 1
82#define HAVE_OPENDIR 1
83#define HAVE_SYSTEM 1
84#if defined(__OS2__)
85#define HAVE_EXECV 1
86#define HAVE_WAIT 1
Guido van Rossumad0ee831995-03-01 10:34:45 +000087#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +000088#include <process.h>
89#else
90#ifdef __BORLANDC__ /* Borland compiler */
91#define HAVE_EXECV 1
92#define HAVE_GETCWD 1
93#define HAVE_GETEGID 1
94#define HAVE_GETEUID 1
95#define HAVE_GETGID 1
96#define HAVE_GETPPID 1
97#define HAVE_GETUID 1
98#define HAVE_KILL 1
99#define HAVE_OPENDIR 1
100#define HAVE_PIPE 1
101#define HAVE_POPEN 1
102#define HAVE_SYSTEM 1
103#define HAVE_WAIT 1
104#else
105#ifdef _MSC_VER /* Microsoft compiler */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000106#define HAVE_GETCWD 1
107#ifdef MS_WIN32
Guido van Rossuma1065681999-01-25 23:20:23 +0000108#define HAVE_SPAWNV 1
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000109#define HAVE_EXECV 1
110#define HAVE_PIPE 1
111#define HAVE_POPEN 1
112#define HAVE_SYSTEM 1
113#else /* 16-bit Windows */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000114#endif /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000115#else /* all other compilers */
116/* Unix functions that the configure script doesn't check for */
117#define HAVE_EXECV 1
118#define HAVE_FORK 1
119#define HAVE_GETCWD 1
120#define HAVE_GETEGID 1
121#define HAVE_GETEUID 1
122#define HAVE_GETGID 1
123#define HAVE_GETPPID 1
124#define HAVE_GETUID 1
125#define HAVE_KILL 1
126#define HAVE_OPENDIR 1
127#define HAVE_PIPE 1
128#define HAVE_POPEN 1
129#define HAVE_SYSTEM 1
130#define HAVE_WAIT 1
Guido van Rossumd371ff11999-01-25 16:12:23 +0000131#define HAVE_TTYNAME 1
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000132#endif /* _MSC_VER */
133#endif /* __BORLANDC__ */
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000134#endif /* ! __WATCOMC__ || __QNX__ */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000135#endif /* ! __IBMC__ */
Guido van Rossumad0ee831995-03-01 10:34:45 +0000136
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000137#ifndef _MSC_VER
Guido van Rossum36bc6801995-06-14 22:54:23 +0000138
Guido van Rossumb6775db1994-08-01 11:34:53 +0000139#ifdef HAVE_UNISTD_H
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000140#include <unistd.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +0000141#endif
142
143#ifdef NeXT
144/* NeXT's <unistd.h> and <utime.h> aren't worth much */
145#undef HAVE_UNISTD_H
146#undef HAVE_UTIME_H
Guido van Rossumb9f866c1997-05-22 15:12:39 +0000147#define HAVE_WAITPID
Guido van Rossum36bc6801995-06-14 22:54:23 +0000148/* #undef HAVE_GETCWD */
Guido van Rossum54ecc3d1999-01-27 17:53:11 +0000149#define UNION_WAIT /* This should really be checked for by autoconf */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000150#endif
151
152#ifdef HAVE_UNISTD_H
Guido van Rossumad0ee831995-03-01 10:34:45 +0000153/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
154extern int rename();
155extern int pclose();
156extern int lstat();
157extern int symlink();
Guido van Rossum8c67e4e1999-04-07 15:49:41 +0000158extern int fsync();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000159#else /* !HAVE_UNISTD_H */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000160#if defined(PYCC_VACPP)
161extern int mkdir Py_PROTO((char *));
162#else
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000163#if ( defined(__WATCOMC__) || defined(_MSC_VER) ) && !defined(__QNX__)
Barry Warsaw53699e91996-12-10 23:23:01 +0000164extern int mkdir Py_PROTO((const char *));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000165#else
Barry Warsaw53699e91996-12-10 23:23:01 +0000166extern int mkdir Py_PROTO((const char *, mode_t));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000167#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000168#endif
169#if defined(__IBMC__) || defined(__IBMCPP__)
170extern int chdir Py_PROTO((char *));
171extern int rmdir Py_PROTO((char *));
172#else
Barry Warsaw53699e91996-12-10 23:23:01 +0000173extern int chdir Py_PROTO((const char *));
174extern int rmdir Py_PROTO((const char *));
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000175#endif
Barry Warsaw53699e91996-12-10 23:23:01 +0000176extern int chmod Py_PROTO((const char *, mode_t));
177extern int chown Py_PROTO((const char *, uid_t, gid_t));
178extern char *getcwd Py_PROTO((char *, int));
179extern char *strerror Py_PROTO((int));
180extern int link Py_PROTO((const char *, const char *));
181extern int rename Py_PROTO((const char *, const char *));
182extern int stat Py_PROTO((const char *, struct stat *));
183extern int unlink Py_PROTO((const char *));
184extern int pclose Py_PROTO((FILE *));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000185#ifdef HAVE_SYMLINK
Barry Warsaw53699e91996-12-10 23:23:01 +0000186extern int symlink Py_PROTO((const char *, const char *));
Guido van Rossuma38a5031995-02-17 15:11:36 +0000187#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000188#ifdef HAVE_LSTAT
Barry Warsaw53699e91996-12-10 23:23:01 +0000189extern int lstat Py_PROTO((const char *, struct stat *));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000190#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000191#endif /* !HAVE_UNISTD_H */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000192
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000193#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000194
Guido van Rossumb6775db1994-08-01 11:34:53 +0000195#ifdef HAVE_UTIME_H
196#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000197#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000198
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000199#ifdef HAVE_SYS_UTIME_H
200#include <sys/utime.h>
201#define HAVE_UTIME_H /* pretend we do for the rest of this file */
202#endif /* HAVE_SYS_UTIME_H */
203
Guido van Rossumb6775db1994-08-01 11:34:53 +0000204#ifdef HAVE_SYS_TIMES_H
205#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000206#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000207
208#ifdef HAVE_SYS_PARAM_H
209#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000210#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000211
212#ifdef HAVE_SYS_UTSNAME_H
213#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000214#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000215
216#ifndef MAXPATHLEN
217#define MAXPATHLEN 1024
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000218#endif /* MAXPATHLEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000219
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000220#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000221#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000222#define NAMLEN(dirent) strlen((dirent)->d_name)
223#else
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000224#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000225#include <direct.h>
226#define NAMLEN(dirent) strlen((dirent)->d_name)
227#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000228#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000229#define NAMLEN(dirent) (dirent)->d_namlen
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000230#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000231#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000232#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000233#endif
234#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000235#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000236#endif
237#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000238#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000239#endif
240#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000241
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000242#ifdef _MSC_VER
Guido van Rossumb6775db1994-08-01 11:34:53 +0000243#include <direct.h>
244#include <io.h>
245#include <process.h>
246#include <windows.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000247#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000248#define popen _popen
Guido van Rossum794d8131994-08-23 13:48:48 +0000249#define pclose _pclose
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000250#else /* 16-bit Windows */
251#include <dos.h>
252#include <ctype.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000253#endif /* MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000254#endif /* _MSC_VER */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000255
Guido van Rossumd48f2521997-12-05 22:19:34 +0000256#if defined(PYCC_VACPP) && defined(PYOS_OS2)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000257#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000258#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259
Guido van Rossum54ecc3d1999-01-27 17:53:11 +0000260#ifdef UNION_WAIT
261/* Emulate some macros on systems that have a union instead of macros */
262
263#ifndef WIFEXITED
264#define WIFEXITED(u_wait) (!(u_wait).w_termsig && !(u_wait).w_coredump)
265#endif
266
267#ifndef WEXITSTATUS
268#define WEXITSTATUS(u_wait) (WIFEXITED(u_wait)?((u_wait).w_retcode):-1)
269#endif
270
271#ifndef WTERMSIG
272#define WTERMSIG(u_wait) ((u_wait).w_termsig)
273#endif
274
275#endif /* UNION_WAIT */
276
Greg Wardb48bc172000-03-01 21:51:56 +0000277/* Don't use the "_r" form if we don't need it (also, won't have a
278 prototype for it, at least on Solaris -- maybe others as well?). */
279#if defined(HAVE_CTERMID_R) && defined(WITH_THREAD)
280#define USE_CTERMID_R
281#endif
282
283#if defined(HAVE_TMPNAM_R) && defined(WITH_THREAD)
284#define USE_TMPNAM_R
285#endif
286
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287/* Return a dictionary corresponding to the POSIX environment table */
288
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000289#if !defined(_MSC_VER) && ( !defined(__WATCOMC__) || defined(__QNX__) )
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000291#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292
Barry Warsaw53699e91996-12-10 23:23:01 +0000293static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294convertenviron()
295{
Barry Warsaw53699e91996-12-10 23:23:01 +0000296 PyObject *d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000297 char **e;
Barry Warsaw53699e91996-12-10 23:23:01 +0000298 d = PyDict_New();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299 if (d == NULL)
300 return NULL;
301 if (environ == NULL)
302 return d;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000303 /* This part ignores errors */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304 for (e = environ; *e != NULL; e++) {
Guido van Rossum6a619f41999-08-03 19:41:10 +0000305 PyObject *k;
Barry Warsaw53699e91996-12-10 23:23:01 +0000306 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307 char *p = strchr(*e, '=');
308 if (p == NULL)
309 continue;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000310 k = PyString_FromStringAndSize(*e, (int)(p-*e));
311 if (k == NULL) {
312 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313 continue;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000314 }
315 v = PyString_FromString(p+1);
316 if (v == NULL) {
317 PyErr_Clear();
318 Py_DECREF(k);
319 continue;
320 }
321 if (PyDict_GetItem(d, k) == NULL) {
322 if (PyDict_SetItem(d, k, v) != 0)
323 PyErr_Clear();
324 }
325 Py_DECREF(k);
Barry Warsaw53699e91996-12-10 23:23:01 +0000326 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000327 }
Guido van Rossumd48f2521997-12-05 22:19:34 +0000328#if defined(PYOS_OS2)
329 {
330 APIRET rc;
331 char buffer[1024]; /* OS/2 Provides a Documented Max of 1024 Chars */
332
333 rc = DosQueryExtLIBPATH(buffer, BEGIN_LIBPATH);
334 if (rc == NO_ERROR) { /* (not a type, envname is NOT 'BEGIN_LIBPATH') */
335 PyObject *v = PyString_FromString(buffer);
336 PyDict_SetItemString(d, "BEGINLIBPATH", v);
337 Py_DECREF(v);
338 }
339 rc = DosQueryExtLIBPATH(buffer, END_LIBPATH);
340 if (rc == NO_ERROR) { /* (not a typo, envname is NOT 'END_LIBPATH') */
341 PyObject *v = PyString_FromString(buffer);
342 PyDict_SetItemString(d, "ENDLIBPATH", v);
343 Py_DECREF(v);
344 }
345 }
346#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347 return d;
348}
349
350
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000351/* Set a POSIX-specific error from errno, and return NULL */
352
Barry Warsawd58d7641998-07-23 16:14:40 +0000353static PyObject *
354posix_error()
Guido van Rossumad0ee831995-03-01 10:34:45 +0000355{
Barry Warsawca74da41999-02-09 19:31:45 +0000356 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000357}
Barry Warsawd58d7641998-07-23 16:14:40 +0000358static PyObject *
359posix_error_with_filename(name)
360 char* name;
361{
Barry Warsawca74da41999-02-09 19:31:45 +0000362 return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);
Barry Warsawd58d7641998-07-23 16:14:40 +0000363}
364
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365
Guido van Rossumd48f2521997-12-05 22:19:34 +0000366#if defined(PYOS_OS2)
367/**********************************************************************
368 * Helper Function to Trim and Format OS/2 Messages
369 **********************************************************************/
370 static void
371os2_formatmsg(char *msgbuf, int msglen, char *reason)
372{
373 msgbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
374
375 if (strlen(msgbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
376 char *lastc = &msgbuf[ strlen(msgbuf)-1 ];
377
378 while (lastc > msgbuf && isspace(*lastc))
379 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
380 }
381
382 /* Add Optional Reason Text */
383 if (reason) {
384 strcat(msgbuf, " : ");
385 strcat(msgbuf, reason);
386 }
387}
388
389/**********************************************************************
390 * Decode an OS/2 Operating System Error Code
391 *
392 * A convenience function to lookup an OS/2 error code and return a
393 * text message we can use to raise a Python exception.
394 *
395 * Notes:
396 * The messages for errors returned from the OS/2 kernel reside in
397 * the file OSO001.MSG in the \OS2 directory hierarchy.
398 *
399 **********************************************************************/
400 static char *
401os2_strerror(char *msgbuf, int msgbuflen, int errorcode, char *reason)
402{
403 APIRET rc;
404 ULONG msglen;
405
406 /* Retrieve Kernel-Related Error Message from OSO001.MSG File */
407 Py_BEGIN_ALLOW_THREADS
408 rc = DosGetMessage(NULL, 0, msgbuf, msgbuflen,
409 errorcode, "oso001.msg", &msglen);
410 Py_END_ALLOW_THREADS
411
412 if (rc == NO_ERROR)
413 os2_formatmsg(msgbuf, msglen, reason);
414 else
415 sprintf(msgbuf, "unknown OS error #%d", errorcode);
416
417 return msgbuf;
418}
419
420/* Set an OS/2-specific error and return NULL. OS/2 kernel
421 errors are not in a global variable e.g. 'errno' nor are
422 they congruent with posix error numbers. */
423
424static PyObject * os2_error(int code)
425{
426 char text[1024];
427 PyObject *v;
428
429 os2_strerror(text, sizeof(text), code, "");
430
431 v = Py_BuildValue("(is)", code, text);
432 if (v != NULL) {
Barry Warsawca74da41999-02-09 19:31:45 +0000433 PyErr_SetObject(PyExc_OSError, v);
Guido van Rossumd48f2521997-12-05 22:19:34 +0000434 Py_DECREF(v);
435 }
436 return NULL; /* Signal to Python that an Exception is Pending */
437}
438
439#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440
441/* POSIX generic methods */
442
Barry Warsaw53699e91996-12-10 23:23:01 +0000443static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000444posix_int(args, format, func)
Guido van Rossum21142a01999-01-08 21:05:37 +0000445 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000446 char *format;
Guido van Rossum21142a01999-01-08 21:05:37 +0000447 int (*func) Py_FPROTO((int));
448{
449 int fd;
450 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000451 if (!PyArg_ParseTuple(args, format, &fd))
Guido van Rossum21142a01999-01-08 21:05:37 +0000452 return NULL;
453 Py_BEGIN_ALLOW_THREADS
454 res = (*func)(fd);
455 Py_END_ALLOW_THREADS
456 if (res < 0)
457 return posix_error();
458 Py_INCREF(Py_None);
459 return Py_None;
460}
461
462
463static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000464posix_1str(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000465 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000466 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000467 int (*func) Py_FPROTO((const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000468{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000469 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000470 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000471 if (!PyArg_ParseTuple(args, format, &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000473 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000474 res = (*func)(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000475 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000476 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000477 return posix_error_with_filename(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000478 Py_INCREF(Py_None);
479 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000480}
481
Barry Warsaw53699e91996-12-10 23:23:01 +0000482static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000483posix_2str(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000484 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000485 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000486 int (*func) Py_FPROTO((const char *, const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000488 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000489 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000490 if (!PyArg_ParseTuple(args, format, &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000491 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000492 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000493 res = (*func)(path1, path2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000494 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000495 if (res != 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000496 /* XXX how to report both path1 and path2??? */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000497 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000498 Py_INCREF(Py_None);
499 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000500}
501
Barry Warsaw53699e91996-12-10 23:23:01 +0000502static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000503posix_strint(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000504 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000505 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000506 int (*func) Py_FPROTO((const char *, int));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000507{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000508 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000509 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000510 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000511 if (!PyArg_ParseTuple(args, format, &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000512 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000513 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000514 res = (*func)(path, i);
Barry Warsaw53699e91996-12-10 23:23:01 +0000515 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000516 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000517 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +0000518 Py_INCREF(Py_None);
519 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000520}
521
Barry Warsaw53699e91996-12-10 23:23:01 +0000522static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000523posix_strintint(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000524 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000525 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000526 int (*func) Py_FPROTO((const char *, int, int));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000527{
528 char *path;
529 int i,i2;
530 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000531 if (!PyArg_ParseTuple(args, format, &path, &i, &i2))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000532 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000533 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000534 res = (*func)(path, i, i2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000535 Py_END_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000536 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000537 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +0000538 Py_INCREF(Py_None);
539 return Py_None;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000540}
541
Barry Warsaw53699e91996-12-10 23:23:01 +0000542static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000543posix_do_stat(self, args, format, statfunc)
Barry Warsaw53699e91996-12-10 23:23:01 +0000544 PyObject *self;
545 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000546 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000547 int (*statfunc) Py_FPROTO((const char *, struct stat *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000548{
549 struct stat st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000550 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000551 int res;
Guido van Rossumace88ae2000-04-21 18:54:45 +0000552
553#ifdef MS_WIN32
554 int pathlen;
555 char pathcopy[MAX_PATH];
556#endif /* MS_WIN32 */
557
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000558 if (!PyArg_ParseTuple(args, format, &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000559 return NULL;
Guido van Rossumace88ae2000-04-21 18:54:45 +0000560
561#ifdef MS_WIN32
562 pathlen = strlen(path);
563 /* the library call can blow up if the file name is too long! */
564 if (pathlen > MAX_PATH) {
565 errno = ENAMETOOLONG;
566 return posix_error();
567 }
568
569 if ((pathlen > 0) && (path[pathlen-1] == '\\' || path[pathlen-1] == '/')) {
Guido van Rossum19dde102000-05-03 02:44:55 +0000570 /* exception for specific or current drive root */
571 if (!((pathlen == 1) ||
572 ((pathlen == 3) &&
Guido van Rossumace88ae2000-04-21 18:54:45 +0000573 (path[1] == ':') &&
Guido van Rossum19dde102000-05-03 02:44:55 +0000574 (path[2] == '\\' || path[2] == '/'))))
Guido van Rossumace88ae2000-04-21 18:54:45 +0000575 {
576 strncpy(pathcopy, path, pathlen);
577 pathcopy[pathlen-1] = '\0'; /* nuke the trailing backslash */
578 path = pathcopy;
579 }
580 }
581#endif /* MS_WIN32 */
582
Barry Warsaw53699e91996-12-10 23:23:01 +0000583 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000584 res = (*statfunc)(path, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +0000585 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000586 if (res != 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000587 return posix_error_with_filename(path);
Guido van Rossum94f6f721999-01-06 18:42:14 +0000588#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +0000589 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +0000590 (long)st.st_mode,
591 (long)st.st_ino,
592 (long)st.st_dev,
593 (long)st.st_nlink,
594 (long)st.st_uid,
595 (long)st.st_gid,
596 (long)st.st_size,
597 (long)st.st_atime,
598 (long)st.st_mtime,
599 (long)st.st_ctime);
600#else
601 return Py_BuildValue("(lLllllLlll)",
602 (long)st.st_mode,
603 (LONG_LONG)st.st_ino,
604 (long)st.st_dev,
605 (long)st.st_nlink,
606 (long)st.st_uid,
607 (long)st.st_gid,
608 (LONG_LONG)st.st_size,
609 (long)st.st_atime,
610 (long)st.st_mtime,
611 (long)st.st_ctime);
612#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000613}
614
615
616/* POSIX methods */
617
Guido van Rossum94f6f721999-01-06 18:42:14 +0000618static char posix_access__doc__[] =
Guido van Rossum015f22a1999-01-06 22:52:38 +0000619"access(path, mode) -> 1 if granted, 0 otherwise\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +0000620Test for access to a file.";
621
622static PyObject *
623posix_access(self, args)
624 PyObject *self;
625 PyObject *args;
626{
Guido van Rossum015f22a1999-01-06 22:52:38 +0000627 char *path;
628 int mode;
629 int res;
630
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000631 if (!PyArg_ParseTuple(args, "si:access", &path, &mode))
Guido van Rossum015f22a1999-01-06 22:52:38 +0000632 return NULL;
633 Py_BEGIN_ALLOW_THREADS
634 res = access(path, mode);
635 Py_END_ALLOW_THREADS
636 return(PyInt_FromLong(res == 0 ? 1L : 0L));
Guido van Rossum94f6f721999-01-06 18:42:14 +0000637}
638
Guido van Rossumd371ff11999-01-25 16:12:23 +0000639#ifndef F_OK
640#define F_OK 0
641#endif
642#ifndef R_OK
643#define R_OK 4
644#endif
645#ifndef W_OK
646#define W_OK 2
647#endif
648#ifndef X_OK
649#define X_OK 1
650#endif
651
652#ifdef HAVE_TTYNAME
Guido van Rossum94f6f721999-01-06 18:42:14 +0000653static char posix_ttyname__doc__[] =
Guido van Rossum61eeb041999-02-22 15:29:15 +0000654"ttyname(fd) -> String\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +0000655Return the name of the terminal device connected to 'fd'.";
656
657static PyObject *
658posix_ttyname(self, args)
659 PyObject *self;
660 PyObject *args;
661{
Guido van Rossum94f6f721999-01-06 18:42:14 +0000662 int id;
663 char *ret;
664
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000665 if (!PyArg_ParseTuple(args, "i:ttyname", &id))
Guido van Rossum94f6f721999-01-06 18:42:14 +0000666 return NULL;
667
Guido van Rossum94f6f721999-01-06 18:42:14 +0000668 ret = ttyname(id);
669 if (ret == NULL)
670 return(posix_error());
671 return(PyString_FromString(ret));
672}
Guido van Rossumd371ff11999-01-25 16:12:23 +0000673#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +0000674
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000675#ifdef HAVE_CTERMID
676static char posix_ctermid__doc__[] =
677"ctermid() -> String\n\
678Return the name of the controlling terminal for this process.";
679
680static PyObject *
681posix_ctermid(self, args)
682 PyObject *self;
683 PyObject *args;
684{
685 char *ret;
686 char buffer[L_ctermid];
687
688 if (!PyArg_ParseTuple(args, ":ctermid"))
689 return NULL;
690
Greg Wardb48bc172000-03-01 21:51:56 +0000691#ifdef USE_CTERMID_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000692 ret = ctermid_r(buffer);
693#else
694 ret = ctermid(buffer);
695#endif
696 if (ret == NULL)
697 return(posix_error());
698 return(PyString_FromString(buffer));
699}
700#endif
701
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000702static char posix_chdir__doc__[] =
703"chdir(path) -> None\n\
704Change the current working directory to the specified path.";
705
Barry Warsaw53699e91996-12-10 23:23:01 +0000706static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000707posix_chdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000708 PyObject *self;
709 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000710{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000711 return posix_1str(args, "s:chdir", chdir);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000712}
713
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000714
715static char posix_chmod__doc__[] =
716"chmod(path, mode) -> None\n\
717Change the access permissions of a file.";
718
Barry Warsaw53699e91996-12-10 23:23:01 +0000719static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000720posix_chmod(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000721 PyObject *self;
722 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000723{
Guido van Rossumffd15f52000-03-31 00:47:28 +0000724 char *path;
725 int i;
726 int res;
Guido van Rossum49679b42000-03-31 00:48:21 +0000727 if (!PyArg_ParseTuple(args, "si", &path, &i))
Guido van Rossumffd15f52000-03-31 00:47:28 +0000728 return NULL;
729 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef40e772000-03-31 01:26:23 +0000730 res = chmod(path, i);
Guido van Rossumffd15f52000-03-31 00:47:28 +0000731 Py_END_ALLOW_THREADS
732 if (res < 0)
733 return posix_error_with_filename(path);
734 Py_INCREF(Py_None);
735 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000736}
737
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000738
Guido van Rossum21142a01999-01-08 21:05:37 +0000739#ifdef HAVE_FSYNC
740static char posix_fsync__doc__[] =
741"fsync(fildes) -> None\n\
742force write of file with filedescriptor to disk.";
743
744static PyObject *
745posix_fsync(self, args)
746 PyObject *self;
747 PyObject *args;
748{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000749 return posix_int(args, "i:fsync", fsync);
Guido van Rossum21142a01999-01-08 21:05:37 +0000750}
751#endif /* HAVE_FSYNC */
752
753#ifdef HAVE_FDATASYNC
754static char posix_fdatasync__doc__[] =
755"fdatasync(fildes) -> None\n\
756force write of file with filedescriptor to disk.\n\
757 does not force update of metadata.";
758
Guido van Rossum5d00b6d1999-01-08 21:28:05 +0000759extern int fdatasync(int); /* Prototype just in case */
760
Guido van Rossum21142a01999-01-08 21:05:37 +0000761static PyObject *
762posix_fdatasync(self, args)
763 PyObject *self;
764 PyObject *args;
765{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000766 return posix_int(args, "i:fdatasync", fdatasync);
Guido van Rossum21142a01999-01-08 21:05:37 +0000767}
768#endif /* HAVE_FDATASYNC */
769
770
Guido van Rossumb6775db1994-08-01 11:34:53 +0000771#ifdef HAVE_CHOWN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000772static char posix_chown__doc__[] =
773"chown(path, uid, gid) -> None\n\
774Change the owner and group id of path to the numeric uid and gid.";
775
Barry Warsaw53699e91996-12-10 23:23:01 +0000776static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000777posix_chown(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000778 PyObject *self;
779 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000780{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000781 return posix_strintint(args, "sii:chown", chown);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000782}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000783#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000784
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000785
Guido van Rossum36bc6801995-06-14 22:54:23 +0000786#ifdef HAVE_GETCWD
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000787static char posix_getcwd__doc__[] =
788"getcwd() -> path\n\
789Return a string representing the current working directory.";
790
Barry Warsaw53699e91996-12-10 23:23:01 +0000791static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000792posix_getcwd(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000793 PyObject *self;
794 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000795{
796 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000797 char *res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000798 if (!PyArg_ParseTuple(args, ":getcwd"))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000799 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000800 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000801 res = getcwd(buf, sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +0000802 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000803 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000804 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000805 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000806}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000807#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000808
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000809
Guido van Rossumb6775db1994-08-01 11:34:53 +0000810#ifdef HAVE_LINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000811static char posix_link__doc__[] =
812"link(src, dst) -> None\n\
813Create a hard link to a file.";
814
Barry Warsaw53699e91996-12-10 23:23:01 +0000815static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000816posix_link(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000817 PyObject *self;
818 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000819{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000820 return posix_2str(args, "ss:link", link);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000821}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000822#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000823
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000824
825static char posix_listdir__doc__[] =
826"listdir(path) -> list_of_strings\n\
827Return a list containing the names of the entries in the directory.\n\
828\n\
829 path: path of directory to list\n\
830\n\
831The list is in arbitrary order. It does not include the special\n\
832entries '.' and '..' even if they are present in the directory.";
833
Barry Warsaw53699e91996-12-10 23:23:01 +0000834static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000835posix_listdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000836 PyObject *self;
837 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000838{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000839 /* XXX Should redo this putting the (now four) versions of opendir
Guido van Rossum6d8841c1997-08-14 19:57:39 +0000840 in separate files instead of having them all here... */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000841#if defined(MS_WIN32) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000842
Guido van Rossumb6775db1994-08-01 11:34:53 +0000843 char *name;
844 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000845 PyObject *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000846 HANDLE hFindFile;
847 WIN32_FIND_DATA FileData;
848 char namebuf[MAX_PATH+5];
849
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000850 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000851 return NULL;
852 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000853 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000854 return NULL;
855 }
856 strcpy(namebuf, name);
857 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
858 namebuf[len++] = '/';
859 strcpy(namebuf + len, "*.*");
860
Barry Warsaw53699e91996-12-10 23:23:01 +0000861 if ((d = PyList_New(0)) == NULL)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000862 return NULL;
863
864 hFindFile = FindFirstFile(namebuf, &FileData);
865 if (hFindFile == INVALID_HANDLE_VALUE) {
866 errno = GetLastError();
Guido van Rossum617bc191998-08-06 03:23:32 +0000867 if (errno == ERROR_FILE_NOT_FOUND)
868 return PyList_New(0);
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000869 return posix_error_with_filename(name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000870 }
871 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000872 if (FileData.cFileName[0] == '.' &&
873 (FileData.cFileName[1] == '\0' ||
874 FileData.cFileName[1] == '.' &&
875 FileData.cFileName[2] == '\0'))
876 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000877 v = PyString_FromString(FileData.cFileName);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000878 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000879 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000880 d = NULL;
881 break;
882 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000883 if (PyList_Append(d, v) != 0) {
884 Py_DECREF(v);
885 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000886 d = NULL;
887 break;
888 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000889 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000890 } while (FindNextFile(hFindFile, &FileData) == TRUE);
891
892 if (FindClose(hFindFile) == FALSE) {
893 errno = GetLastError();
Andrew M. Kuchling54c8dc22000-06-06 20:52:17 +0000894 return posix_error_with_filename(name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000895 }
896
897 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000898
Guido van Rossum8d665e61996-06-26 18:22:49 +0000899#else /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000900#ifdef _MSC_VER /* 16-bit Windows */
901
902#ifndef MAX_PATH
903#define MAX_PATH 250
904#endif
905 char *name, *pt;
906 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000907 PyObject *d, *v;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000908 char namebuf[MAX_PATH+5];
909 struct _find_t ep;
910
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000911 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000912 return NULL;
913 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000914 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000915 return NULL;
916 }
917 strcpy(namebuf, name);
918 for (pt = namebuf; *pt; pt++)
919 if (*pt == '/')
920 *pt = '\\';
921 if (namebuf[len-1] != '\\')
922 namebuf[len++] = '\\';
923 strcpy(namebuf + len, "*.*");
924
Barry Warsaw53699e91996-12-10 23:23:01 +0000925 if ((d = PyList_New(0)) == NULL)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000926 return NULL;
927
928 if (_dos_findfirst(namebuf, _A_RDONLY |
Barry Warsaw43d68b81996-12-19 22:10:44 +0000929 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0)
930 {
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000931 errno = ENOENT;
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000932 return posix_error_with_filename(name);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000933 }
934 do {
935 if (ep.name[0] == '.' &&
936 (ep.name[1] == '\0' ||
937 ep.name[1] == '.' &&
938 ep.name[2] == '\0'))
939 continue;
940 strcpy(namebuf, ep.name);
941 for (pt = namebuf; *pt; pt++)
942 if (isupper(*pt))
943 *pt = tolower(*pt);
Barry Warsaw53699e91996-12-10 23:23:01 +0000944 v = PyString_FromString(namebuf);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000945 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000946 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000947 d = NULL;
948 break;
949 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000950 if (PyList_Append(d, v) != 0) {
951 Py_DECREF(v);
952 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000953 d = NULL;
954 break;
955 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000956 Py_DECREF(v);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000957 } while (_dos_findnext(&ep) == 0);
958
959 return d;
960
961#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000962#if defined(PYOS_OS2)
963
964#ifndef MAX_PATH
965#define MAX_PATH CCHMAXPATH
966#endif
967 char *name, *pt;
968 int len;
969 PyObject *d, *v;
970 char namebuf[MAX_PATH+5];
971 HDIR hdir = 1;
972 ULONG srchcnt = 1;
973 FILEFINDBUF3 ep;
974 APIRET rc;
975
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000976 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000977 return NULL;
978 if (len >= MAX_PATH) {
979 PyErr_SetString(PyExc_ValueError, "path too long");
980 return NULL;
981 }
982 strcpy(namebuf, name);
983 for (pt = namebuf; *pt; pt++)
984 if (*pt == '/')
985 *pt = '\\';
986 if (namebuf[len-1] != '\\')
987 namebuf[len++] = '\\';
988 strcpy(namebuf + len, "*.*");
989
990 if ((d = PyList_New(0)) == NULL)
991 return NULL;
992
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000993 rc = DosFindFirst(namebuf, /* Wildcard Pattern to Match */
994 &hdir, /* Handle to Use While Search Directory */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000995 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000996 &ep, sizeof(ep), /* Structure to Receive Directory Entry */
997 &srchcnt, /* Max and Actual Count of Entries Per Iteration */
998 FIL_STANDARD); /* Format of Entry (EAs or Not) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000999
1000 if (rc != NO_ERROR) {
1001 errno = ENOENT;
Barry Warsawf63b8cc1999-05-27 23:13:21 +00001002 return posix_error_with_filename(name);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001003 }
1004
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001005 if (srchcnt > 0) { /* If Directory is NOT Totally Empty, */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001006 do {
1007 if (ep.achName[0] == '.'
1008 && (ep.achName[1] == '\0' || ep.achName[1] == '.' && ep.achName[2] == '\0'))
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001009 continue; /* Skip Over "." and ".." Names */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001010
1011 strcpy(namebuf, ep.achName);
1012
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001013 /* Leave Case of Name Alone -- In Native Form */
1014 /* (Removed Forced Lowercasing Code) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001015
1016 v = PyString_FromString(namebuf);
1017 if (v == NULL) {
1018 Py_DECREF(d);
1019 d = NULL;
1020 break;
1021 }
1022 if (PyList_Append(d, v) != 0) {
1023 Py_DECREF(v);
1024 Py_DECREF(d);
1025 d = NULL;
1026 break;
1027 }
1028 Py_DECREF(v);
1029 } while (DosFindNext(hdir, &ep, sizeof(ep), &srchcnt) == NO_ERROR && srchcnt > 0);
1030 }
1031
1032 return d;
1033#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001034
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001035 char *name;
Barry Warsaw53699e91996-12-10 23:23:01 +00001036 PyObject *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001037 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001038 struct dirent *ep;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001039 if (!PyArg_ParseTuple(args, "s:listdir", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001040 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001041 if ((dirp = opendir(name)) == NULL) {
Barry Warsawf63b8cc1999-05-27 23:13:21 +00001042 return posix_error_with_filename(name);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001043 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001044 if ((d = PyList_New(0)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001045 closedir(dirp);
1046 return NULL;
1047 }
1048 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +00001049 if (ep->d_name[0] == '.' &&
1050 (NAMLEN(ep) == 1 ||
Guido van Rossuma376cc51996-12-05 23:43:35 +00001051 (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
Guido van Rossum24f42ac1995-07-18 18:16:52 +00001052 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +00001053 v = PyString_FromStringAndSize(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001054 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001055 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001056 d = NULL;
1057 break;
1058 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001059 if (PyList_Append(d, v) != 0) {
1060 Py_DECREF(v);
1061 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001062 d = NULL;
1063 break;
1064 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001065 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001066 }
1067 closedir(dirp);
Guido van Rossum0ee42cd1991-04-08 21:01:03 +00001068
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001069 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001070
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001071#endif /* !PYOS_OS2 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001072#endif /* !_MSC_VER */
Guido van Rossum8d665e61996-06-26 18:22:49 +00001073#endif /* !MS_WIN32 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001074}
1075
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001076static char posix_mkdir__doc__[] =
1077"mkdir(path [, mode=0777]) -> None\n\
1078Create a directory.";
1079
Barry Warsaw53699e91996-12-10 23:23:01 +00001080static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001081posix_mkdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001082 PyObject *self;
1083 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001084{
Guido van Rossumb0824db1996-02-25 04:50:32 +00001085 int res;
1086 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001087 int mode = 0777;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001088 if (!PyArg_ParseTuple(args, "s|i:mkdir", &path, &mode))
Guido van Rossumb0824db1996-02-25 04:50:32 +00001089 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001090 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001091#if ( defined(__WATCOMC__) || defined(_MSC_VER) || defined(PYCC_VACPP) ) && !defined(__QNX__)
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001092 res = mkdir(path);
1093#else
Guido van Rossumb0824db1996-02-25 04:50:32 +00001094 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001095#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001096 Py_END_ALLOW_THREADS
Guido van Rossumb0824db1996-02-25 04:50:32 +00001097 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00001098 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00001099 Py_INCREF(Py_None);
1100 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001101}
1102
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001103
Guido van Rossumb6775db1994-08-01 11:34:53 +00001104#ifdef HAVE_NICE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001105static char posix_nice__doc__[] =
1106"nice(inc) -> new_priority\n\
1107Decrease the priority of process and return new priority.";
1108
Barry Warsaw53699e91996-12-10 23:23:01 +00001109static PyObject *
Guido van Rossum775f4da1993-01-09 17:18:52 +00001110posix_nice(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001111 PyObject *self;
1112 PyObject *args;
Guido van Rossum775f4da1993-01-09 17:18:52 +00001113{
1114 int increment, value;
1115
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001116 if (!PyArg_ParseTuple(args, "i:nice", &increment))
Guido van Rossum775f4da1993-01-09 17:18:52 +00001117 return NULL;
1118 value = nice(increment);
1119 if (value == -1)
1120 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001121 return PyInt_FromLong((long) value);
Guido van Rossum775f4da1993-01-09 17:18:52 +00001122}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001123#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001124
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001125
1126static char posix_rename__doc__[] =
1127"rename(old, new) -> None\n\
1128Rename a file or directory.";
1129
Barry Warsaw53699e91996-12-10 23:23:01 +00001130static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001131posix_rename(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001132 PyObject *self;
1133 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001134{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001135 return posix_2str(args, "ss:rename", rename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001136}
1137
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001138
1139static char posix_rmdir__doc__[] =
1140"rmdir(path) -> None\n\
1141Remove a directory.";
1142
Barry Warsaw53699e91996-12-10 23:23:01 +00001143static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001144posix_rmdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001145 PyObject *self;
1146 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001147{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001148 return posix_1str(args, "s:rmdir", rmdir);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001149}
1150
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001151
1152static char posix_stat__doc__[] =
1153"stat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
1154Perform a stat system call on the given path.";
1155
Barry Warsaw53699e91996-12-10 23:23:01 +00001156static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001157posix_stat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001158 PyObject *self;
1159 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001160{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001161 return posix_do_stat(self, args, "s:stat", stat);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001162}
1163
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001164
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001165#ifdef HAVE_SYSTEM
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001166static char posix_system__doc__[] =
1167"system(command) -> exit_status\n\
1168Execute the command (a string) in a subshell.";
1169
Barry Warsaw53699e91996-12-10 23:23:01 +00001170static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001171posix_system(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001172 PyObject *self;
1173 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001174{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001175 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001176 long sts;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001177 if (!PyArg_ParseTuple(args, "s:system", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001178 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001179 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001180 sts = system(command);
Barry Warsaw53699e91996-12-10 23:23:01 +00001181 Py_END_ALLOW_THREADS
1182 return PyInt_FromLong(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001183}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001184#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001185
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001186
1187static char posix_umask__doc__[] =
1188"umask(new_mask) -> old_mask\n\
1189Set the current numeric umask and return the previous umask.";
1190
Barry Warsaw53699e91996-12-10 23:23:01 +00001191static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001192posix_umask(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001193 PyObject *self;
1194 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001195{
1196 int i;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001197 if (!PyArg_ParseTuple(args, "i:umask", &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001198 return NULL;
1199 i = umask(i);
1200 if (i < 0)
1201 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001202 return PyInt_FromLong((long)i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001203}
1204
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001205
1206static char posix_unlink__doc__[] =
1207"unlink(path) -> None\n\
1208Remove a file (same as remove(path)).";
1209
1210static char posix_remove__doc__[] =
1211"remove(path) -> None\n\
1212Remove a file (same as unlink(path)).";
1213
Barry Warsaw53699e91996-12-10 23:23:01 +00001214static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001215posix_unlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001216 PyObject *self;
1217 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001218{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001219 return posix_1str(args, "s:remove", unlink);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001220}
1221
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001222
Guido van Rossumb6775db1994-08-01 11:34:53 +00001223#ifdef HAVE_UNAME
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001224static char posix_uname__doc__[] =
1225"uname() -> (sysname, nodename, release, version, machine)\n\
1226Return a tuple identifying the current operating system.";
1227
Barry Warsaw53699e91996-12-10 23:23:01 +00001228static PyObject *
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001229posix_uname(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001230 PyObject *self;
1231 PyObject *args;
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001232{
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001233 struct utsname u;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001234 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001235 if (!PyArg_ParseTuple(args, ":uname"))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001236 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001237 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001238 res = uname(&u);
Barry Warsaw53699e91996-12-10 23:23:01 +00001239 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001240 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001241 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001242 return Py_BuildValue("(sssss)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00001243 u.sysname,
1244 u.nodename,
1245 u.release,
1246 u.version,
1247 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001248}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001249#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001250
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001251
1252static char posix_utime__doc__[] =
1253"utime(path, (atime, utime)) -> None\n\
Barry Warsaw3cef8562000-05-01 16:17:24 +00001254utime(path, None) -> None\n\
1255Set the access and modified time of the file to the given values. If the\n\
1256second form is used, set the access and modified times to the current time.";
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001257
Barry Warsaw53699e91996-12-10 23:23:01 +00001258static PyObject *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001259posix_utime(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001260 PyObject *self;
1261 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001262{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001263 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +00001264 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001265 int res;
Barry Warsaw3cef8562000-05-01 16:17:24 +00001266 PyObject* arg;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001267
Guido van Rossum6d8841c1997-08-14 19:57:39 +00001268/* XXX should define struct utimbuf instead, above */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001269#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001270 struct utimbuf buf;
1271#define ATIME buf.actime
1272#define MTIME buf.modtime
1273#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001274#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001275 time_t buf[2];
1276#define ATIME buf[0]
1277#define MTIME buf[1]
1278#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001279#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001280
Barry Warsaw3cef8562000-05-01 16:17:24 +00001281 if (!PyArg_ParseTuple(args, "sO:utime", &path, &arg))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001282 return NULL;
Barry Warsaw3cef8562000-05-01 16:17:24 +00001283 if (arg == Py_None) {
1284 /* optional time values not given */
1285 Py_BEGIN_ALLOW_THREADS
1286 res = utime(path, NULL);
1287 Py_END_ALLOW_THREADS
1288 }
1289 else if (!PyArg_Parse(arg, "(ll)", &atime, &mtime)) {
1290 PyErr_SetString(PyExc_TypeError,
1291 "Second argument must be a 2-tuple of numbers.");
1292 return NULL;
1293 }
1294 else {
1295 ATIME = atime;
1296 MTIME = mtime;
1297 Py_BEGIN_ALLOW_THREADS
1298 res = utime(path, UTIME_ARG);
1299 Py_END_ALLOW_THREADS
1300 }
Guido van Rossumff4949e1992-08-05 19:58:53 +00001301 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00001302 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00001303 Py_INCREF(Py_None);
1304 return Py_None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001305#undef UTIME_ARG
1306#undef ATIME
1307#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001308}
1309
Guido van Rossum85e3b011991-06-03 12:42:10 +00001310
Guido van Rossum3b066191991-06-04 19:40:25 +00001311/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001312
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001313static char posix__exit__doc__[] =
1314"_exit(status)\n\
1315Exit to the system with specified status, without normal exit processing.";
1316
Barry Warsaw53699e91996-12-10 23:23:01 +00001317static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001318posix__exit(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001319 PyObject *self;
1320 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001321{
1322 int sts;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001323 if (!PyArg_ParseTuple(args, "i:_exit", &sts))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001324 return NULL;
1325 _exit(sts);
Guido van Rossuma376cc51996-12-05 23:43:35 +00001326 return NULL; /* Make gcc -Wall happy */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001327}
1328
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001329
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001330#ifdef HAVE_EXECV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001331static char posix_execv__doc__[] =
1332"execv(path, args)\n\
1333Execute an executable path with arguments, replacing current process.\n\
1334\n\
1335 path: path of executable file\n\
1336 args: tuple or list of strings";
1337
Barry Warsaw53699e91996-12-10 23:23:01 +00001338static PyObject *
Guido van Rossum89b33251993-10-22 14:26:06 +00001339posix_execv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001340 PyObject *self;
1341 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001342{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001343 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00001344 PyObject *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001345 char **argvlist;
1346 int i, argc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001347 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossum85e3b011991-06-03 12:42:10 +00001348
Guido van Rossum89b33251993-10-22 14:26:06 +00001349 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +00001350 argv is a list or tuple of strings. */
1351
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001352 if (!PyArg_ParseTuple(args, "sO:execv", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001353 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001354 if (PyList_Check(argv)) {
1355 argc = PyList_Size(argv);
1356 getitem = PyList_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001357 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001358 else if (PyTuple_Check(argv)) {
1359 argc = PyTuple_Size(argv);
1360 getitem = PyTuple_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001361 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001362 else {
Guido van Rossum50422b42000-04-26 20:34:28 +00001363 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
1364 return NULL;
1365 }
1366
1367 if (argc == 0) {
1368 PyErr_SetString(PyExc_ValueError, "empty argument list");
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001369 return NULL;
1370 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00001371
Barry Warsaw53699e91996-12-10 23:23:01 +00001372 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001373 if (argvlist == NULL)
1374 return NULL;
1375 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001376 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
1377 PyMem_DEL(argvlist);
Guido van Rossum50422b42000-04-26 20:34:28 +00001378 PyErr_SetString(PyExc_TypeError,
1379 "all arguments must be strings");
1380 return NULL;
1381
Guido van Rossum85e3b011991-06-03 12:42:10 +00001382 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00001383 }
1384 argvlist[argc] = NULL;
1385
Guido van Rossumb6775db1994-08-01 11:34:53 +00001386#ifdef BAD_EXEC_PROTOTYPES
1387 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001388#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001389 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001390#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001391
Guido van Rossum85e3b011991-06-03 12:42:10 +00001392 /* If we get here it's definitely an error */
1393
Barry Warsaw53699e91996-12-10 23:23:01 +00001394 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001395 return posix_error();
1396}
1397
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001398
1399static char posix_execve__doc__[] =
1400"execve(path, args, env)\n\
1401Execute a path with arguments and environment, replacing current process.\n\
1402\n\
1403 path: path of executable file\n\
1404 args: tuple or list of arguments\n\
1405 env: dictonary of strings mapping to strings";
1406
Barry Warsaw53699e91996-12-10 23:23:01 +00001407static PyObject *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001408posix_execve(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001409 PyObject *self;
1410 PyObject *args;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001411{
1412 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00001413 PyObject *argv, *env;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001414 char **argvlist;
1415 char **envlist;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001416 PyObject *key, *val, *keys=NULL, *vals=NULL;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001417 int i, pos, argc, envc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001418 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001419
1420 /* execve has three arguments: (path, argv, env), where
1421 argv is a list or tuple of strings and env is a dictionary
1422 like posix.environ. */
1423
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001424 if (!PyArg_ParseTuple(args, "sOO:execve", &path, &argv, &env))
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001425 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001426 if (PyList_Check(argv)) {
1427 argc = PyList_Size(argv);
1428 getitem = PyList_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001429 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001430 else if (PyTuple_Check(argv)) {
1431 argc = PyTuple_Size(argv);
1432 getitem = PyTuple_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001433 }
1434 else {
Barry Warsaw53699e91996-12-10 23:23:01 +00001435 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001436 return NULL;
1437 }
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001438 if (!PyMapping_Check(env)) {
1439 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001440 return NULL;
1441 }
1442
Guido van Rossum50422b42000-04-26 20:34:28 +00001443 if (argc == 0) {
1444 PyErr_SetString(PyExc_ValueError,
1445 "empty argument list");
1446 return NULL;
1447 }
1448
Barry Warsaw53699e91996-12-10 23:23:01 +00001449 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001450 if (argvlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001451 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001452 return NULL;
1453 }
1454 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001455 if (!PyArg_Parse((*getitem)(argv, i),
Barry Warsaw43d68b81996-12-19 22:10:44 +00001456 "s;argv must be list of strings",
1457 &argvlist[i]))
1458 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001459 goto fail_1;
1460 }
1461 }
1462 argvlist[argc] = NULL;
1463
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001464 i = PyMapping_Length(env);
Barry Warsaw53699e91996-12-10 23:23:01 +00001465 envlist = PyMem_NEW(char *, i + 1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001466 if (envlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001467 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001468 goto fail_1;
1469 }
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001470 envc = 0;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001471 keys = PyMapping_Keys(env);
1472 vals = PyMapping_Values(env);
1473 if (!keys || !vals)
1474 goto fail_2;
1475
1476 for (pos = 0; pos < i; pos++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001477 char *p, *k, *v;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001478
1479 key = PyList_GetItem(keys, pos);
1480 val = PyList_GetItem(vals, pos);
1481 if (!key || !val)
1482 goto fail_2;
1483
Barry Warsaw53699e91996-12-10 23:23:01 +00001484 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
Barry Warsaw43d68b81996-12-19 22:10:44 +00001485 !PyArg_Parse(val, "s;non-string value in env", &v))
1486 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001487 goto fail_2;
1488 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00001489
1490#if defined(PYOS_OS2)
1491 /* Omit Pseudo-Env Vars that Would Confuse Programs if Passed On */
1492 if (stricmp(k, "BEGINLIBPATH") != 0 && stricmp(k, "ENDLIBPATH") != 0) {
1493#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001494 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001495 if (p == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001496 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001497 goto fail_2;
1498 }
1499 sprintf(p, "%s=%s", k, v);
1500 envlist[envc++] = p;
Guido van Rossumd48f2521997-12-05 22:19:34 +00001501#if defined(PYOS_OS2)
1502 }
1503#endif
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001504 }
1505 envlist[envc] = 0;
1506
Guido van Rossumb6775db1994-08-01 11:34:53 +00001507
1508#ifdef BAD_EXEC_PROTOTYPES
1509 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001510#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001511 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001512#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001513
1514 /* If we get here it's definitely an error */
1515
1516 (void) posix_error();
1517
1518 fail_2:
1519 while (--envc >= 0)
Barry Warsaw53699e91996-12-10 23:23:01 +00001520 PyMem_DEL(envlist[envc]);
1521 PyMem_DEL(envlist);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001522 fail_1:
Barry Warsaw53699e91996-12-10 23:23:01 +00001523 PyMem_DEL(argvlist);
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001524 Py_XDECREF(vals);
1525 Py_XDECREF(keys);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001526 return NULL;
1527}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001528#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001529
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001530
Guido van Rossuma1065681999-01-25 23:20:23 +00001531#ifdef HAVE_SPAWNV
1532static char posix_spawnv__doc__[] =
Fred Drakea6dff3e1999-02-01 22:24:40 +00001533"spawnv(mode, path, args)\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001534Execute an executable path with arguments, replacing current process.\n\
1535\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00001536 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001537 path: path of executable file\n\
1538 args: tuple or list of strings";
1539
1540static PyObject *
1541posix_spawnv(self, args)
1542 PyObject *self;
1543 PyObject *args;
1544{
1545 char *path;
1546 PyObject *argv;
1547 char **argvlist;
1548 int mode, i, argc;
1549 PyObject *(*getitem) Py_PROTO((PyObject *, int));
1550
1551 /* spawnv has three arguments: (mode, path, argv), where
1552 argv is a list or tuple of strings. */
1553
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001554 if (!PyArg_ParseTuple(args, "isO:spawnv", &mode, &path, &argv))
Guido van Rossuma1065681999-01-25 23:20:23 +00001555 return NULL;
1556 if (PyList_Check(argv)) {
1557 argc = PyList_Size(argv);
1558 getitem = PyList_GetItem;
1559 }
1560 else if (PyTuple_Check(argv)) {
1561 argc = PyTuple_Size(argv);
1562 getitem = PyTuple_GetItem;
1563 }
1564 else {
Fred Drake137507e2000-06-01 02:02:46 +00001565 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossuma1065681999-01-25 23:20:23 +00001566 return NULL;
1567 }
1568
1569 argvlist = PyMem_NEW(char *, argc+1);
1570 if (argvlist == NULL)
1571 return NULL;
1572 for (i = 0; i < argc; i++) {
1573 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
1574 PyMem_DEL(argvlist);
Fred Drake137507e2000-06-01 02:02:46 +00001575 PyErr_SetString(PyExc_TypeError,
1576 "all arguments must be strings");
1577 return NULL;
Guido van Rossuma1065681999-01-25 23:20:23 +00001578 }
1579 }
1580 argvlist[argc] = NULL;
1581
Guido van Rossum246bc171999-02-01 23:54:31 +00001582 if (mode == _OLD_P_OVERLAY)
1583 mode = _P_OVERLAY;
Guido van Rossuma1065681999-01-25 23:20:23 +00001584 i = _spawnv(mode, path, argvlist);
1585
1586 PyMem_DEL(argvlist);
1587
1588 if (i == -1)
1589 return posix_error();
1590 else
1591 return Py_BuildValue("i", i);
1592}
1593
1594
1595static char posix_spawnve__doc__[] =
Fred Drakea6dff3e1999-02-01 22:24:40 +00001596"spawnve(mode, path, args, env)\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001597Execute a path with arguments and environment, replacing current process.\n\
1598\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00001599 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001600 path: path of executable file\n\
1601 args: tuple or list of arguments\n\
1602 env: dictonary of strings mapping to strings";
1603
1604static PyObject *
1605posix_spawnve(self, args)
1606 PyObject *self;
1607 PyObject *args;
1608{
1609 char *path;
1610 PyObject *argv, *env;
1611 char **argvlist;
1612 char **envlist;
1613 PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL;
1614 int mode, i, pos, argc, envc;
1615 PyObject *(*getitem) Py_PROTO((PyObject *, int));
1616
1617 /* spawnve has four arguments: (mode, path, argv, env), where
1618 argv is a list or tuple of strings and env is a dictionary
1619 like posix.environ. */
1620
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001621 if (!PyArg_ParseTuple(args, "isOO:spawnve", &mode, &path, &argv, &env))
Guido van Rossuma1065681999-01-25 23:20:23 +00001622 return NULL;
1623 if (PyList_Check(argv)) {
1624 argc = PyList_Size(argv);
1625 getitem = PyList_GetItem;
1626 }
1627 else if (PyTuple_Check(argv)) {
1628 argc = PyTuple_Size(argv);
1629 getitem = PyTuple_GetItem;
1630 }
1631 else {
1632 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
1633 return NULL;
1634 }
1635 if (!PyMapping_Check(env)) {
1636 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
1637 return NULL;
1638 }
1639
1640 argvlist = PyMem_NEW(char *, argc+1);
1641 if (argvlist == NULL) {
1642 PyErr_NoMemory();
1643 return NULL;
1644 }
1645 for (i = 0; i < argc; i++) {
1646 if (!PyArg_Parse((*getitem)(argv, i),
1647 "s;argv must be list of strings",
1648 &argvlist[i]))
1649 {
1650 goto fail_1;
1651 }
1652 }
1653 argvlist[argc] = NULL;
1654
1655 i = PyMapping_Length(env);
1656 envlist = PyMem_NEW(char *, i + 1);
1657 if (envlist == NULL) {
1658 PyErr_NoMemory();
1659 goto fail_1;
1660 }
1661 envc = 0;
1662 keys = PyMapping_Keys(env);
1663 vals = PyMapping_Values(env);
1664 if (!keys || !vals)
1665 goto fail_2;
1666
1667 for (pos = 0; pos < i; pos++) {
1668 char *p, *k, *v;
1669
1670 key = PyList_GetItem(keys, pos);
1671 val = PyList_GetItem(vals, pos);
1672 if (!key || !val)
1673 goto fail_2;
1674
1675 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
1676 !PyArg_Parse(val, "s;non-string value in env", &v))
1677 {
1678 goto fail_2;
1679 }
1680 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
1681 if (p == NULL) {
1682 PyErr_NoMemory();
1683 goto fail_2;
1684 }
1685 sprintf(p, "%s=%s", k, v);
1686 envlist[envc++] = p;
1687 }
1688 envlist[envc] = 0;
1689
Guido van Rossum246bc171999-02-01 23:54:31 +00001690 if (mode == _OLD_P_OVERLAY)
1691 mode = _P_OVERLAY;
Guido van Rossuma1065681999-01-25 23:20:23 +00001692 i = _spawnve(mode, path, argvlist, envlist);
1693 if (i == -1)
1694 (void) posix_error();
1695 else
1696 res = Py_BuildValue("i", i);
1697
1698 fail_2:
1699 while (--envc >= 0)
1700 PyMem_DEL(envlist[envc]);
1701 PyMem_DEL(envlist);
1702 fail_1:
1703 PyMem_DEL(argvlist);
1704 Py_XDECREF(vals);
1705 Py_XDECREF(keys);
1706 return res;
1707}
1708#endif /* HAVE_SPAWNV */
1709
1710
Guido van Rossumad0ee831995-03-01 10:34:45 +00001711#ifdef HAVE_FORK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001712static char posix_fork__doc__[] =
1713"fork() -> pid\n\
1714Fork a child process.\n\
1715\n\
1716Return 0 to child process and PID of child to parent process.";
1717
Barry Warsaw53699e91996-12-10 23:23:01 +00001718static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001719posix_fork(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001720 PyObject *self;
1721 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001722{
1723 int pid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001724 if (!PyArg_ParseTuple(args, ":fork"))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001725 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001726 pid = fork();
1727 if (pid == -1)
1728 return posix_error();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001729 PyOS_AfterFork();
Barry Warsaw53699e91996-12-10 23:23:01 +00001730 return PyInt_FromLong((long)pid);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001731}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001732#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001733
Fred Drake8cef4cf2000-06-28 16:40:38 +00001734#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY)
1735#ifdef HAVE_PTY_H
1736#include <pty.h>
1737#else
1738#ifdef HAVE_LIBUTIL_H
1739#include <libutil.h>
1740#else
1741/* BSDI does not supply a prototype for the 'openpty' and 'forkpty'
1742 functions, eventhough they are included in libutil. */
1743#include <termios.h>
1744extern int openpty(int *, int *, char *, struct termios *, struct winsize *);
1745extern int forkpty(int *, char *, struct termios *, struct winsize *);
1746#endif /* HAVE_LIBUTIL_H */
1747#endif /* HAVE_PTY_H */
1748#endif /* defined(HAVE_OPENPTY) or defined(HAVE_FORKPTY) */
1749
1750#ifdef HAVE_OPENPTY
1751static char posix_openpty__doc__[] =
1752"openpty() -> (master_fd, slave_fd)\n\
1753Open a pseudo-terminal, returning open fd's for both master and slave end.\n";
1754
1755static PyObject *
1756posix_openpty(self, args)
1757 PyObject *self;
1758 PyObject *args;
1759{
1760 int master_fd, slave_fd;
1761 if (!PyArg_ParseTuple(args, ":openpty"))
1762 return NULL;
1763 if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) != 0)
1764 return posix_error();
1765 return Py_BuildValue("(ii)", master_fd, slave_fd);
1766}
1767#endif
1768
1769#ifdef HAVE_FORKPTY
1770static char posix_forkpty__doc__[] =
1771"forkpty() -> (pid, master_fd)\n\
1772Fork a new process with a new pseudo-terminal as controlling tty.\n\n\
1773Like fork(), return 0 as pid to child process, and PID of child to parent.\n\
1774To both, return fd of newly opened pseudo-terminal.\n";
1775
1776static PyObject *
1777posix_forkpty(self, args)
1778 PyObject *self;
1779 PyObject *args;
1780{
1781 int master_fd, pid;
1782
1783 if (!PyArg_ParseTuple(args, ":forkpty"))
1784 return NULL;
1785 pid = forkpty(&master_fd, NULL, NULL, NULL);
1786 if (pid == -1)
1787 return posix_error();
1788 PyOS_AfterFork();
1789 return Py_BuildValue("(ii)", pid, master_fd);
1790}
1791#endif
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001792
Guido van Rossumad0ee831995-03-01 10:34:45 +00001793#ifdef HAVE_GETEGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001794static char posix_getegid__doc__[] =
1795"getegid() -> egid\n\
1796Return the current process's effective group id.";
1797
Barry Warsaw53699e91996-12-10 23:23:01 +00001798static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001799posix_getegid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001800 PyObject *self;
1801 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001802{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001803 if (!PyArg_ParseTuple(args, ":getegid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001804 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001805 return PyInt_FromLong((long)getegid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001806}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001807#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001808
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001809
Guido van Rossumad0ee831995-03-01 10:34:45 +00001810#ifdef HAVE_GETEUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001811static char posix_geteuid__doc__[] =
1812"geteuid() -> euid\n\
1813Return the current process's effective user id.";
1814
Barry Warsaw53699e91996-12-10 23:23:01 +00001815static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001816posix_geteuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001817 PyObject *self;
1818 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001819{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001820 if (!PyArg_ParseTuple(args, ":geteuid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001821 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001822 return PyInt_FromLong((long)geteuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001823}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001824#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001825
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001826
Guido van Rossumad0ee831995-03-01 10:34:45 +00001827#ifdef HAVE_GETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001828static char posix_getgid__doc__[] =
1829"getgid() -> gid\n\
1830Return the current process's group id.";
1831
Barry Warsaw53699e91996-12-10 23:23:01 +00001832static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001833posix_getgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001834 PyObject *self;
1835 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001836{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001837 if (!PyArg_ParseTuple(args, ":getgid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001838 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001839 return PyInt_FromLong((long)getgid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001840}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001841#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001842
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001843
1844static char posix_getpid__doc__[] =
1845"getpid() -> pid\n\
1846Return the current process id";
1847
Barry Warsaw53699e91996-12-10 23:23:01 +00001848static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001849posix_getpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001850 PyObject *self;
1851 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001852{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001853 if (!PyArg_ParseTuple(args, ":getpid"))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001854 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001855 return PyInt_FromLong((long)getpid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001856}
1857
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001858
Fred Drakec9680921999-12-13 16:37:25 +00001859#ifdef HAVE_GETGROUPS
1860static char posix_getgroups__doc__[] = "\
1861getgroups() -> list of group IDs\n\
1862Return list of supplemental group IDs for the process.";
1863
1864static PyObject *
1865posix_getgroups(self, args)
1866 PyObject *self;
1867 PyObject *args;
1868{
1869 PyObject *result = NULL;
1870
1871 if (PyArg_ParseTuple(args, ":getgroups")) {
1872#ifdef NGROUPS_MAX
1873#define MAX_GROUPS NGROUPS_MAX
1874#else
1875 /* defined to be 16 on Solaris7, so this should be a small number */
1876#define MAX_GROUPS 64
1877#endif
1878 gid_t grouplist[MAX_GROUPS];
1879 int n;
1880
1881 n = getgroups(MAX_GROUPS, grouplist);
1882 if (n < 0)
1883 posix_error();
1884 else {
1885 result = PyList_New(n);
1886 if (result != NULL) {
1887 PyObject *o;
1888 int i;
1889 for (i = 0; i < n; ++i) {
1890 o = PyInt_FromLong((long)grouplist[i]);
1891 if (o == NULL) {
1892 Py_DECREF(result);
1893 result = NULL;
1894 break;
1895 }
1896 PyList_SET_ITEM(result, i, o);
1897 }
1898 }
1899 }
1900 }
1901 return result;
1902}
1903#endif
1904
Guido van Rossumb6775db1994-08-01 11:34:53 +00001905#ifdef HAVE_GETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001906static char posix_getpgrp__doc__[] =
1907"getpgrp() -> pgrp\n\
1908Return the current process group id.";
1909
Barry Warsaw53699e91996-12-10 23:23:01 +00001910static PyObject *
Guido van Rossum04814471991-06-04 20:23:49 +00001911posix_getpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001912 PyObject *self;
1913 PyObject *args;
Guido van Rossum04814471991-06-04 20:23:49 +00001914{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001915 if (!PyArg_ParseTuple(args, ":getpgrp"))
Guido van Rossum04814471991-06-04 20:23:49 +00001916 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001917#ifdef GETPGRP_HAVE_ARG
Barry Warsaw53699e91996-12-10 23:23:01 +00001918 return PyInt_FromLong((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001919#else /* GETPGRP_HAVE_ARG */
Barry Warsaw53699e91996-12-10 23:23:01 +00001920 return PyInt_FromLong((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001921#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001922}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001923#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001924
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001925
Guido van Rossumb6775db1994-08-01 11:34:53 +00001926#ifdef HAVE_SETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001927static char posix_setpgrp__doc__[] =
1928"setpgrp() -> None\n\
1929Make this process a session leader.";
1930
Barry Warsaw53699e91996-12-10 23:23:01 +00001931static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001932posix_setpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001933 PyObject *self;
1934 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001935{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001936 if (!PyArg_ParseTuple(args, ":setpgrp"))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001937 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001938#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001939 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001940#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001941 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001942#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001943 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001944 Py_INCREF(Py_None);
1945 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001946}
1947
Guido van Rossumb6775db1994-08-01 11:34:53 +00001948#endif /* HAVE_SETPGRP */
1949
Guido van Rossumad0ee831995-03-01 10:34:45 +00001950#ifdef HAVE_GETPPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001951static char posix_getppid__doc__[] =
1952"getppid() -> ppid\n\
1953Return the parent's process id.";
1954
Barry Warsaw53699e91996-12-10 23:23:01 +00001955static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001956posix_getppid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001957 PyObject *self;
1958 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001959{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001960 if (!PyArg_ParseTuple(args, ":getppid"))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001961 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001962 return PyInt_FromLong((long)getppid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001963}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001964#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001965
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001966
Fred Drake12c6e2d1999-12-14 21:25:03 +00001967#ifdef HAVE_GETLOGIN
1968static char posix_getlogin__doc__[] = "\
1969getlogin() -> string\n\
1970Return the actual login name.";
1971
1972static PyObject *
1973posix_getlogin(self, args)
1974 PyObject *self;
1975 PyObject *args;
1976{
1977 PyObject *result = NULL;
1978
1979 if (PyArg_ParseTuple(args, ":getlogin")) {
1980 char *name = getlogin();
1981
1982 if (name == NULL)
1983 posix_error();
1984 else
1985 result = PyString_FromString(name);
1986 }
1987 return result;
1988}
1989#endif
1990
Guido van Rossumad0ee831995-03-01 10:34:45 +00001991#ifdef HAVE_GETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001992static char posix_getuid__doc__[] =
1993"getuid() -> uid\n\
1994Return the current process's user id.";
1995
Barry Warsaw53699e91996-12-10 23:23:01 +00001996static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001997posix_getuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001998 PyObject *self;
1999 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00002000{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002001 if (!PyArg_ParseTuple(args, ":getuid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00002002 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002003 return PyInt_FromLong((long)getuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00002004}
Guido van Rossumad0ee831995-03-01 10:34:45 +00002005#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00002006
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002007
Guido van Rossumad0ee831995-03-01 10:34:45 +00002008#ifdef HAVE_KILL
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002009static char posix_kill__doc__[] =
2010"kill(pid, sig) -> None\n\
2011Kill a process with a signal.";
2012
Barry Warsaw53699e91996-12-10 23:23:01 +00002013static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00002014posix_kill(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002015 PyObject *self;
2016 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00002017{
2018 int pid, sig;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002019 if (!PyArg_ParseTuple(args, "ii:kill", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00002020 return NULL;
Guido van Rossumd48f2521997-12-05 22:19:34 +00002021#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002022 if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
2023 APIRET rc;
2024 if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002025 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002026
2027 } else if (sig == XCPT_SIGNAL_KILLPROC) {
2028 APIRET rc;
2029 if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002030 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002031
2032 } else
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002033 return NULL; /* Unrecognized Signal Requested */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002034#else
Guido van Rossum85e3b011991-06-03 12:42:10 +00002035 if (kill(pid, sig) == -1)
2036 return posix_error();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002037#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002038 Py_INCREF(Py_None);
2039 return Py_None;
Guido van Rossum85e3b011991-06-03 12:42:10 +00002040}
Guido van Rossumad0ee831995-03-01 10:34:45 +00002041#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00002042
Guido van Rossumc0125471996-06-28 18:55:32 +00002043#ifdef HAVE_PLOCK
2044
2045#ifdef HAVE_SYS_LOCK_H
2046#include <sys/lock.h>
2047#endif
2048
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002049static char posix_plock__doc__[] =
2050"plock(op) -> None\n\
2051Lock program segments into memory.";
2052
Barry Warsaw53699e91996-12-10 23:23:01 +00002053static PyObject *
Guido van Rossumc0125471996-06-28 18:55:32 +00002054posix_plock(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002055 PyObject *self;
2056 PyObject *args;
Guido van Rossumc0125471996-06-28 18:55:32 +00002057{
2058 int op;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002059 if (!PyArg_ParseTuple(args, "i:plock", &op))
Guido van Rossumc0125471996-06-28 18:55:32 +00002060 return NULL;
2061 if (plock(op) == -1)
2062 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002063 Py_INCREF(Py_None);
2064 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00002065}
2066#endif
2067
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002068
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002069#ifdef HAVE_POPEN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002070static char posix_popen__doc__[] =
2071"popen(command [, mode='r' [, bufsize]]) -> pipe\n\
2072Open a pipe to/from a command returning a file object.";
2073
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002074#if defined(PYOS_OS2)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002075static int
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002076async_system(const char *command)
2077{
2078 char *p, errormsg[256], args[1024];
2079 RESULTCODES rcodes;
2080 APIRET rc;
2081 char *shell = getenv("COMSPEC");
2082 if (!shell)
2083 shell = "cmd";
2084
2085 strcpy(args, shell);
2086 p = &args[ strlen(args)+1 ];
2087 strcpy(p, "/c ");
2088 strcat(p, command);
2089 p += strlen(p) + 1;
2090 *p = '\0';
2091
2092 rc = DosExecPgm(errormsg, sizeof(errormsg),
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002093 EXEC_ASYNC, /* Execute Async w/o Wait for Results */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002094 args,
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002095 NULL, /* Inherit Parent's Environment */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002096 &rcodes, shell);
2097 return rc;
2098}
2099
Guido van Rossumd48f2521997-12-05 22:19:34 +00002100static FILE *
2101popen(const char *command, const char *mode, int pipesize, int *err)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002102{
2103 HFILE rhan, whan;
2104 FILE *retfd = NULL;
2105 APIRET rc = DosCreatePipe(&rhan, &whan, pipesize);
2106
Guido van Rossumd48f2521997-12-05 22:19:34 +00002107 if (rc != NO_ERROR) {
2108 *err = rc;
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002109 return NULL; /* ERROR - Unable to Create Anon Pipe */
Guido van Rossumd48f2521997-12-05 22:19:34 +00002110 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002111
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002112 if (strchr(mode, 'r') != NULL) { /* Treat Command as a Data Source */
2113 int oldfd = dup(1); /* Save STDOUT Handle in Another Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002114
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002115 DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
2116 close(1); /* Make STDOUT Available for Reallocation */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002117
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002118 if (dup2(whan, 1) == 0) { /* Connect STDOUT to Pipe Write Side */
2119 DosClose(whan); /* Close Now-Unused Pipe Write Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002120
2121 if (async_system(command) == NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002122 retfd = fdopen(rhan, mode); /* And Return Pipe Read Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002123 }
2124
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002125 dup2(oldfd, 1); /* Reconnect STDOUT to Original Handle */
2126 DosExitCritSec(); /* Now Allow Other Threads to Run */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002127
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002128 close(oldfd); /* And Close Saved STDOUT Handle */
2129 return retfd; /* Return fd of Pipe or NULL if Error */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002130
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002131 } else if (strchr(mode, 'w')) { /* Treat Command as a Data Sink */
2132 int oldfd = dup(0); /* Save STDIN Handle in Another Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002133
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002134 DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
2135 close(0); /* Make STDIN Available for Reallocation */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002136
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002137 if (dup2(rhan, 0) == 0) { /* Connect STDIN to Pipe Read Side */
2138 DosClose(rhan); /* Close Now-Unused Pipe Read Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002139
2140 if (async_system(command) == NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002141 retfd = fdopen(whan, mode); /* And Return Pipe Write Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002142 }
2143
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002144 dup2(oldfd, 0); /* Reconnect STDIN to Original Handle */
2145 DosExitCritSec(); /* Now Allow Other Threads to Run */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002146
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002147 close(oldfd); /* And Close Saved STDIN Handle */
2148 return retfd; /* Return fd of Pipe or NULL if Error */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002149
Guido van Rossumd48f2521997-12-05 22:19:34 +00002150 } else {
2151 *err = ERROR_INVALID_ACCESS;
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002152 return NULL; /* ERROR - Invalid Mode (Neither Read nor Write) */
Guido van Rossumd48f2521997-12-05 22:19:34 +00002153 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002154}
2155
2156static PyObject *
2157posix_popen(self, args)
2158 PyObject *self;
2159 PyObject *args;
2160{
2161 char *name;
2162 char *mode = "r";
Guido van Rossumd48f2521997-12-05 22:19:34 +00002163 int err, bufsize = -1;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002164 FILE *fp;
2165 PyObject *f;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002166 if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002167 return NULL;
2168 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd48f2521997-12-05 22:19:34 +00002169 fp = popen(name, mode, (bufsize > 0) ? bufsize : 4096, &err);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002170 Py_END_ALLOW_THREADS
2171 if (fp == NULL)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002172 return os2_error(err);
2173
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002174 f = PyFile_FromFile(fp, name, mode, fclose);
2175 if (f != NULL)
2176 PyFile_SetBufSize(f, bufsize);
2177 return f;
2178}
2179
2180#else
Barry Warsaw53699e91996-12-10 23:23:01 +00002181static PyObject *
Guido van Rossum3b066191991-06-04 19:40:25 +00002182posix_popen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002183 PyObject *self;
2184 PyObject *args;
Guido van Rossum3b066191991-06-04 19:40:25 +00002185{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002186 char *name;
2187 char *mode = "r";
2188 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00002189 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002190 PyObject *f;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002191 if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00002192 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002193 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002194 fp = popen(name, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002195 Py_END_ALLOW_THREADS
Guido van Rossum3b066191991-06-04 19:40:25 +00002196 if (fp == NULL)
2197 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002198 f = PyFile_FromFile(fp, name, mode, pclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002199 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002200 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002201 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00002202}
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002203#endif
2204
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002205#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00002206
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002207
Guido van Rossumb6775db1994-08-01 11:34:53 +00002208#ifdef HAVE_SETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002209static char posix_setuid__doc__[] =
2210"setuid(uid) -> None\n\
2211Set the current process's user id.";
Barry Warsaw53699e91996-12-10 23:23:01 +00002212static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002213posix_setuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002214 PyObject *self;
2215 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002216{
2217 int uid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002218 if (!PyArg_ParseTuple(args, "i:setuid", &uid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002219 return NULL;
2220 if (setuid(uid) < 0)
2221 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002222 Py_INCREF(Py_None);
2223 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002224}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002225#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002226
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002227
Guido van Rossumb6775db1994-08-01 11:34:53 +00002228#ifdef HAVE_SETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002229static char posix_setgid__doc__[] =
2230"setgid(gid) -> None\n\
2231Set the current process's group id.";
2232
Barry Warsaw53699e91996-12-10 23:23:01 +00002233static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002234posix_setgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002235 PyObject *self;
2236 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002237{
2238 int gid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002239 if (!PyArg_ParseTuple(args, "i:setgid", &gid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002240 return NULL;
2241 if (setgid(gid) < 0)
2242 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002243 Py_INCREF(Py_None);
2244 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002245}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002246#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002247
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002248
Guido van Rossumb6775db1994-08-01 11:34:53 +00002249#ifdef HAVE_WAITPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002250static char posix_waitpid__doc__[] =
2251"waitpid(pid, options) -> (pid, status)\n\
2252Wait for completion of a give child process.";
2253
Barry Warsaw53699e91996-12-10 23:23:01 +00002254static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00002255posix_waitpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002256 PyObject *self;
2257 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00002258{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002259 int pid, options;
2260#ifdef UNION_WAIT
2261 union wait status;
2262#define status_i (status.w_status)
2263#else
2264 int status;
2265#define status_i status
2266#endif
2267 status_i = 0;
2268
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002269 if (!PyArg_ParseTuple(args, "ii:waitpid", &pid, &options))
Guido van Rossum21803b81992-08-09 12:55:27 +00002270 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002271 Py_BEGIN_ALLOW_THREADS
Guido van Rossume6a3aa61999-02-01 16:15:30 +00002272#ifdef NeXT
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002273 pid = wait4(pid, &status, options, NULL);
Guido van Rossume6a3aa61999-02-01 16:15:30 +00002274#else
2275 pid = waitpid(pid, &status, options);
2276#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002277 Py_END_ALLOW_THREADS
Guido van Rossum85e3b011991-06-03 12:42:10 +00002278 if (pid == -1)
2279 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00002280 else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002281 return Py_BuildValue("ii", pid, status_i);
Guido van Rossum21803b81992-08-09 12:55:27 +00002282}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002283#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00002284
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002285
Guido van Rossumad0ee831995-03-01 10:34:45 +00002286#ifdef HAVE_WAIT
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002287static char posix_wait__doc__[] =
2288"wait() -> (pid, status)\n\
2289Wait for completion of a child process.";
2290
Barry Warsaw53699e91996-12-10 23:23:01 +00002291static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00002292posix_wait(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002293 PyObject *self;
2294 PyObject *args;
Guido van Rossum21803b81992-08-09 12:55:27 +00002295{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002296 int pid;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002297#ifdef UNION_WAIT
2298 union wait status;
2299#define status_i (status.w_status)
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002300#else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002301 int status;
2302#define status_i status
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002303#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002304 if (!PyArg_ParseTuple(args, ":wait"))
2305 return NULL;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002306 status_i = 0;
2307 Py_BEGIN_ALLOW_THREADS
2308 pid = wait(&status);
Barry Warsaw53699e91996-12-10 23:23:01 +00002309 Py_END_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00002310 if (pid == -1)
2311 return posix_error();
2312 else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002313 return Py_BuildValue("ii", pid, status_i);
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002314#undef status_i
Guido van Rossum85e3b011991-06-03 12:42:10 +00002315}
Guido van Rossumad0ee831995-03-01 10:34:45 +00002316#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00002317
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002318
2319static char posix_lstat__doc__[] =
2320"lstat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
2321Like stat(path), but do not follow symbolic links.";
2322
Barry Warsaw53699e91996-12-10 23:23:01 +00002323static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002324posix_lstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002325 PyObject *self;
2326 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002327{
Guido van Rossumb6775db1994-08-01 11:34:53 +00002328#ifdef HAVE_LSTAT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002329 return posix_do_stat(self, args, "s:lstat", lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002330#else /* !HAVE_LSTAT */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002331 return posix_do_stat(self, args, "s:lstat", stat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002332#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002333}
2334
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002335
Guido van Rossumb6775db1994-08-01 11:34:53 +00002336#ifdef HAVE_READLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002337static char posix_readlink__doc__[] =
2338"readlink(path) -> path\n\
2339Return a string representing the path to which the symbolic link points.";
2340
Barry Warsaw53699e91996-12-10 23:23:01 +00002341static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002342posix_readlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002343 PyObject *self;
2344 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002345{
Guido van Rossumb6775db1994-08-01 11:34:53 +00002346 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002347 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002348 int n;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002349 if (!PyArg_ParseTuple(args, "s:readlink", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002350 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002351 Py_BEGIN_ALLOW_THREADS
Guido van Rossum50e61dc1992-03-27 17:22:31 +00002352 n = readlink(path, buf, (int) sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +00002353 Py_END_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002354 if (n < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00002355 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00002356 return PyString_FromStringAndSize(buf, n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002357}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002358#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002359
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002360
Guido van Rossumb6775db1994-08-01 11:34:53 +00002361#ifdef HAVE_SYMLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002362static char posix_symlink__doc__[] =
2363"symlink(src, dst) -> None\n\
2364Create a symbolic link.";
2365
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002366static PyObject *
2367posix_symlink(self, args)
2368 PyObject *self;
2369 PyObject *args;
2370{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002371 return posix_2str(args, "ss:symlink", symlink);
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002372}
2373#endif /* HAVE_SYMLINK */
2374
2375
2376#ifdef HAVE_TIMES
2377#ifndef HZ
2378#define HZ 60 /* Universal constant :-) */
2379#endif /* HZ */
2380
Guido van Rossumd48f2521997-12-05 22:19:34 +00002381#if defined(PYCC_VACPP) && defined(PYOS_OS2)
2382static long
2383system_uptime()
2384{
2385 ULONG value = 0;
2386
2387 Py_BEGIN_ALLOW_THREADS
2388 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &value, sizeof(value));
2389 Py_END_ALLOW_THREADS
2390
2391 return value;
2392}
2393
2394static PyObject *
2395posix_times(self, args)
2396 PyObject *self;
2397 PyObject *args;
2398{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002399 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossumd48f2521997-12-05 22:19:34 +00002400 return NULL;
2401
2402 /* Currently Only Uptime is Provided -- Others Later */
2403 return Py_BuildValue("ddddd",
2404 (double)0 /* t.tms_utime / HZ */,
2405 (double)0 /* t.tms_stime / HZ */,
2406 (double)0 /* t.tms_cutime / HZ */,
2407 (double)0 /* t.tms_cstime / HZ */,
2408 (double)system_uptime() / 1000);
2409}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002410#else /* not OS2 */
Barry Warsaw53699e91996-12-10 23:23:01 +00002411static PyObject *
Guido van Rossum22db57e1992-04-05 14:25:30 +00002412posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002413 PyObject *self;
2414 PyObject *args;
Guido van Rossum22db57e1992-04-05 14:25:30 +00002415{
2416 struct tms t;
2417 clock_t c;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002418 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossum22db57e1992-04-05 14:25:30 +00002419 return NULL;
2420 errno = 0;
2421 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00002422 if (c == (clock_t) -1)
2423 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002424 return Py_BuildValue("ddddd",
Barry Warsaw43d68b81996-12-19 22:10:44 +00002425 (double)t.tms_utime / HZ,
2426 (double)t.tms_stime / HZ,
2427 (double)t.tms_cutime / HZ,
2428 (double)t.tms_cstime / HZ,
2429 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00002430}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002431#endif /* not OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002432#endif /* HAVE_TIMES */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002433
2434
Guido van Rossum87755a21996-09-07 00:59:43 +00002435#ifdef MS_WIN32
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002436#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00002437static PyObject *
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002438posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002439 PyObject *self;
2440 PyObject *args;
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002441{
2442 FILETIME create, exit, kernel, user;
2443 HANDLE hProc;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002444 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002445 return NULL;
2446 hProc = GetCurrentProcess();
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00002447 GetProcessTimes(hProc, &create, &exit, &kernel, &user);
2448 /* The fields of a FILETIME structure are the hi and lo part
2449 of a 64-bit value expressed in 100 nanosecond units.
2450 1e7 is one second in such units; 1e-7 the inverse.
2451 429.4967296 is 2**32 / 1e7 or 2**32 * 1e-7.
2452 */
Barry Warsaw53699e91996-12-10 23:23:01 +00002453 return Py_BuildValue(
2454 "ddddd",
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00002455 (double)(kernel.dwHighDateTime*429.4967296 +
2456 kernel.dwLowDateTime*1e-7),
2457 (double)(user.dwHighDateTime*429.4967296 +
2458 user.dwLowDateTime*1e-7),
Barry Warsaw53699e91996-12-10 23:23:01 +00002459 (double)0,
2460 (double)0,
2461 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002462}
Guido van Rossum8d665e61996-06-26 18:22:49 +00002463#endif /* MS_WIN32 */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002464
2465#ifdef HAVE_TIMES
Roger E. Masse0318fd61997-06-05 22:07:58 +00002466static char posix_times__doc__[] =
2467"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\
2468Return a tuple of floating point numbers indicating process times.";
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002469#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002470
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002471
Guido van Rossumb6775db1994-08-01 11:34:53 +00002472#ifdef HAVE_SETSID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002473static char posix_setsid__doc__[] =
2474"setsid() -> None\n\
2475Call the system call setsid().";
2476
Barry Warsaw53699e91996-12-10 23:23:01 +00002477static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00002478posix_setsid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002479 PyObject *self;
2480 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002481{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002482 if (!PyArg_ParseTuple(args, ":setsid"))
Guido van Rossumc2670a01992-09-13 20:07:29 +00002483 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002484 if (setsid() < 0)
2485 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002486 Py_INCREF(Py_None);
2487 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002488}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002489#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00002490
Guido van Rossumb6775db1994-08-01 11:34:53 +00002491#ifdef HAVE_SETPGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002492static char posix_setpgid__doc__[] =
2493"setpgid(pid, pgrp) -> None\n\
2494Call the system call setpgid().";
2495
Barry Warsaw53699e91996-12-10 23:23:01 +00002496static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00002497posix_setpgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002498 PyObject *self;
2499 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002500{
2501 int pid, pgrp;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002502 if (!PyArg_ParseTuple(args, "ii:setpgid", &pid, &pgrp))
Guido van Rossumc2670a01992-09-13 20:07:29 +00002503 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002504 if (setpgid(pid, pgrp) < 0)
2505 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002506 Py_INCREF(Py_None);
2507 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002508}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002509#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00002510
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002511
Guido van Rossumb6775db1994-08-01 11:34:53 +00002512#ifdef HAVE_TCGETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002513static char posix_tcgetpgrp__doc__[] =
2514"tcgetpgrp(fd) -> pgid\n\
2515Return the process group associated with the terminal given by a fd.";
2516
Barry Warsaw53699e91996-12-10 23:23:01 +00002517static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00002518posix_tcgetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002519 PyObject *self;
2520 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002521{
2522 int fd, pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002523 if (!PyArg_ParseTuple(args, "i:tcgetpgrp", &fd))
Guido van Rossum7066dd71992-09-17 17:54:56 +00002524 return NULL;
2525 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002526 if (pgid < 0)
2527 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002528 return PyInt_FromLong((long)pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00002529}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002530#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00002531
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002532
Guido van Rossumb6775db1994-08-01 11:34:53 +00002533#ifdef HAVE_TCSETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002534static char posix_tcsetpgrp__doc__[] =
2535"tcsetpgrp(fd, pgid) -> None\n\
2536Set the process group associated with the terminal given by a fd.";
2537
Barry Warsaw53699e91996-12-10 23:23:01 +00002538static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00002539posix_tcsetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002540 PyObject *self;
2541 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002542{
2543 int fd, pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002544 if (!PyArg_ParseTuple(args, "ii:tcsetpgrp", &fd, &pgid))
Guido van Rossum7066dd71992-09-17 17:54:56 +00002545 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002546 if (tcsetpgrp(fd, pgid) < 0)
2547 return posix_error();
Barry Warsaw43d68b81996-12-19 22:10:44 +00002548 Py_INCREF(Py_None);
Barry Warsaw53699e91996-12-10 23:23:01 +00002549 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002550}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002551#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00002552
Guido van Rossum687dd131993-05-17 08:34:16 +00002553/* Functions acting on file descriptors */
2554
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002555static char posix_open__doc__[] =
2556"open(filename, flag [, mode=0777]) -> fd\n\
2557Open a file (for low level IO).";
2558
Barry Warsaw53699e91996-12-10 23:23:01 +00002559static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002560posix_open(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002561 PyObject *self;
2562 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002563{
2564 char *file;
2565 int flag;
2566 int mode = 0777;
2567 int fd;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002568 if (!PyArg_ParseTuple(args, "si|i", &file, &flag, &mode))
2569 return NULL;
2570
Barry Warsaw53699e91996-12-10 23:23:01 +00002571 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002572 fd = open(file, flag, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002573 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002574 if (fd < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00002575 return posix_error_with_filename(file);
Barry Warsaw53699e91996-12-10 23:23:01 +00002576 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002577}
2578
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002579
2580static char posix_close__doc__[] =
2581"close(fd) -> None\n\
2582Close a file descriptor (for low level IO).";
2583
Barry Warsaw53699e91996-12-10 23:23:01 +00002584static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002585posix_close(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002586 PyObject *self;
2587 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002588{
2589 int fd, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002590 if (!PyArg_ParseTuple(args, "i:close", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002591 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002592 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002593 res = close(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00002594 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002595 if (res < 0)
2596 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002597 Py_INCREF(Py_None);
2598 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00002599}
2600
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002601
2602static char posix_dup__doc__[] =
2603"dup(fd) -> fd2\n\
2604Return a duplicate of a file descriptor.";
2605
Barry Warsaw53699e91996-12-10 23:23:01 +00002606static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002607posix_dup(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002608 PyObject *self;
2609 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002610{
2611 int fd;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002612 if (!PyArg_ParseTuple(args, "i:dup", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002613 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002614 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002615 fd = dup(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00002616 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002617 if (fd < 0)
2618 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002619 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002620}
2621
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002622
2623static char posix_dup2__doc__[] =
2624"dup2(fd, fd2) -> None\n\
2625Duplicate file descriptor.";
2626
Barry Warsaw53699e91996-12-10 23:23:01 +00002627static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002628posix_dup2(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002629 PyObject *self;
2630 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002631{
2632 int fd, fd2, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002633 if (!PyArg_ParseTuple(args, "ii:dup2", &fd, &fd2))
Guido van Rossum687dd131993-05-17 08:34:16 +00002634 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002635 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002636 res = dup2(fd, fd2);
Barry Warsaw53699e91996-12-10 23:23:01 +00002637 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002638 if (res < 0)
2639 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002640 Py_INCREF(Py_None);
2641 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00002642}
2643
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002644
2645static char posix_lseek__doc__[] =
2646"lseek(fd, pos, how) -> newpos\n\
2647Set the current position of a file descriptor.";
2648
Barry Warsaw53699e91996-12-10 23:23:01 +00002649static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002650posix_lseek(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002651 PyObject *self;
2652 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002653{
2654 int fd, how;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002655 off_t pos, res;
2656 PyObject *posobj;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002657 if (!PyArg_ParseTuple(args, "iOi:lseek", &fd, &posobj, &how))
Guido van Rossum687dd131993-05-17 08:34:16 +00002658 return NULL;
2659#ifdef SEEK_SET
2660 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
2661 switch (how) {
2662 case 0: how = SEEK_SET; break;
2663 case 1: how = SEEK_CUR; break;
2664 case 2: how = SEEK_END; break;
2665 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002666#endif /* SEEK_END */
Guido van Rossum94f6f721999-01-06 18:42:14 +00002667
2668#if !defined(HAVE_LARGEFILE_SUPPORT)
2669 pos = PyInt_AsLong(posobj);
2670#else
2671 pos = PyLong_Check(posobj) ?
2672 PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj);
2673#endif
2674 if (PyErr_Occurred())
2675 return NULL;
2676
Barry Warsaw53699e91996-12-10 23:23:01 +00002677 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002678 res = lseek(fd, pos, how);
Barry Warsaw53699e91996-12-10 23:23:01 +00002679 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002680 if (res < 0)
2681 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00002682
2683#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +00002684 return PyInt_FromLong(res);
Guido van Rossum94f6f721999-01-06 18:42:14 +00002685#else
2686 return PyLong_FromLongLong(res);
2687#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002688}
2689
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002690
2691static char posix_read__doc__[] =
2692"read(fd, buffersize) -> string\n\
2693Read a file descriptor.";
2694
Barry Warsaw53699e91996-12-10 23:23:01 +00002695static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002696posix_read(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002697 PyObject *self;
2698 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002699{
Guido van Rossum8bac5461996-06-11 18:38:48 +00002700 int fd, size, n;
Barry Warsaw53699e91996-12-10 23:23:01 +00002701 PyObject *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002702 if (!PyArg_ParseTuple(args, "ii:read", &fd, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00002703 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002704 buffer = PyString_FromStringAndSize((char *)NULL, size);
Guido van Rossum687dd131993-05-17 08:34:16 +00002705 if (buffer == NULL)
2706 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002707 Py_BEGIN_ALLOW_THREADS
2708 n = read(fd, PyString_AsString(buffer), size);
2709 Py_END_ALLOW_THREADS
Guido van Rossum8bac5461996-06-11 18:38:48 +00002710 if (n < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002711 Py_DECREF(buffer);
Guido van Rossum687dd131993-05-17 08:34:16 +00002712 return posix_error();
2713 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00002714 if (n != size)
Barry Warsaw53699e91996-12-10 23:23:01 +00002715 _PyString_Resize(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00002716 return buffer;
2717}
2718
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002719
2720static char posix_write__doc__[] =
2721"write(fd, string) -> byteswritten\n\
2722Write a string to a file descriptor.";
2723
Barry Warsaw53699e91996-12-10 23:23:01 +00002724static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002725posix_write(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002726 PyObject *self;
2727 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002728{
2729 int fd, size;
2730 char *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002731 if (!PyArg_ParseTuple(args, "is#:write", &fd, &buffer, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00002732 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002733 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002734 size = write(fd, buffer, size);
Barry Warsaw53699e91996-12-10 23:23:01 +00002735 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002736 if (size < 0)
2737 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002738 return PyInt_FromLong((long)size);
Guido van Rossum687dd131993-05-17 08:34:16 +00002739}
2740
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002741
2742static char posix_fstat__doc__[]=
2743"fstat(fd) -> (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\
2744Like stat(), but for an open file descriptor.";
2745
Barry Warsaw53699e91996-12-10 23:23:01 +00002746static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002747posix_fstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002748 PyObject *self;
2749 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002750{
2751 int fd;
2752 struct stat st;
2753 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002754 if (!PyArg_ParseTuple(args, "i:fstat", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002755 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002756 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002757 res = fstat(fd, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00002758 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002759 if (res != 0)
2760 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00002761#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +00002762 return Py_BuildValue("(llllllllll)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00002763 (long)st.st_mode,
2764 (long)st.st_ino,
2765 (long)st.st_dev,
2766 (long)st.st_nlink,
2767 (long)st.st_uid,
2768 (long)st.st_gid,
2769 (long)st.st_size,
2770 (long)st.st_atime,
2771 (long)st.st_mtime,
2772 (long)st.st_ctime);
Guido van Rossum94f6f721999-01-06 18:42:14 +00002773#else
2774 return Py_BuildValue("(lLllllLlll)",
2775 (long)st.st_mode,
2776 (LONG_LONG)st.st_ino,
2777 (long)st.st_dev,
2778 (long)st.st_nlink,
2779 (long)st.st_uid,
2780 (long)st.st_gid,
2781 (LONG_LONG)st.st_size,
2782 (long)st.st_atime,
2783 (long)st.st_mtime,
2784 (long)st.st_ctime);
2785#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002786}
2787
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002788
2789static char posix_fdopen__doc__[] =
2790"fdopen(fd, [, mode='r' [, bufsize]]) -> file_object\n\
2791Return an open file object connected to a file descriptor.";
2792
Barry Warsaw53699e91996-12-10 23:23:01 +00002793static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002794posix_fdopen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002795 PyObject *self;
2796 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002797{
Barry Warsaw53699e91996-12-10 23:23:01 +00002798 extern int fclose Py_PROTO((FILE *));
Guido van Rossum687dd131993-05-17 08:34:16 +00002799 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002800 char *mode = "r";
2801 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00002802 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002803 PyObject *f;
2804 if (!PyArg_ParseTuple(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00002805 return NULL;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002806
Barry Warsaw53699e91996-12-10 23:23:01 +00002807 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002808 fp = fdopen(fd, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002809 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002810 if (fp == NULL)
2811 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002812 f = PyFile_FromFile(fp, "(fdopen)", mode, fclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002813 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002814 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002815 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00002816}
2817
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002818
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002819#ifdef HAVE_PIPE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002820static char posix_pipe__doc__[] =
2821"pipe() -> (read_end, write_end)\n\
2822Create a pipe.";
2823
Barry Warsaw53699e91996-12-10 23:23:01 +00002824static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002825posix_pipe(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002826 PyObject *self;
2827 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002828{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002829#if defined(PYOS_OS2)
2830 HFILE read, write;
2831 APIRET rc;
2832
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002833 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002834 return NULL;
2835
2836 Py_BEGIN_ALLOW_THREADS
2837 rc = DosCreatePipe( &read, &write, 4096);
2838 Py_END_ALLOW_THREADS
2839 if (rc != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002840 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002841
2842 return Py_BuildValue("(ii)", read, write);
2843#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002844#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00002845 int fds[2];
2846 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002847 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum687dd131993-05-17 08:34:16 +00002848 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002849 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002850 res = pipe(fds);
Barry Warsaw53699e91996-12-10 23:23:01 +00002851 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002852 if (res != 0)
2853 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002854 return Py_BuildValue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002855#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00002856 HANDLE read, write;
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002857 int read_fd, write_fd;
Guido van Rossum794d8131994-08-23 13:48:48 +00002858 BOOL ok;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002859 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum794d8131994-08-23 13:48:48 +00002860 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002861 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002862 ok = CreatePipe(&read, &write, NULL, 0);
Barry Warsaw53699e91996-12-10 23:23:01 +00002863 Py_END_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00002864 if (!ok)
2865 return posix_error();
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002866 read_fd = _open_osfhandle((long)read, 0);
2867 write_fd = _open_osfhandle((long)write, 1);
2868 return Py_BuildValue("(ii)", read_fd, write_fd);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002869#endif /* MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002870#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002871}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002872#endif /* HAVE_PIPE */
2873
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002874
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002875#ifdef HAVE_MKFIFO
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002876static char posix_mkfifo__doc__[] =
2877"mkfifo(file, [, mode=0666]) -> None\n\
2878Create a FIFO (a POSIX named pipe).";
2879
Barry Warsaw53699e91996-12-10 23:23:01 +00002880static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002881posix_mkfifo(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002882 PyObject *self;
2883 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002884{
2885 char *file;
2886 int mode = 0666;
2887 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002888 if (!PyArg_ParseTuple(args, "s|i:mkfifo", &file, &mode))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002889 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002890 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002891 res = mkfifo(file, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002892 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002893 if (res < 0)
2894 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002895 Py_INCREF(Py_None);
2896 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002897}
2898#endif
2899
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002900
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002901#ifdef HAVE_FTRUNCATE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002902static char posix_ftruncate__doc__[] =
2903"ftruncate(fd, length) -> None\n\
2904Truncate a file to a specified length.";
2905
Barry Warsaw53699e91996-12-10 23:23:01 +00002906static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002907posix_ftruncate(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002908 PyObject *self; /* Not used */
2909 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002910{
2911 int fd;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002912 off_t length;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002913 int res;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002914 PyObject *lenobj;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002915
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002916 if (!PyArg_ParseTuple(args, "iO:ftruncate", &fd, &lenobj))
Guido van Rossum94f6f721999-01-06 18:42:14 +00002917 return NULL;
2918
2919#if !defined(HAVE_LARGEFILE_SUPPORT)
2920 length = PyInt_AsLong(lenobj);
2921#else
2922 length = PyLong_Check(lenobj) ?
2923 PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj);
2924#endif
2925 if (PyErr_Occurred())
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002926 return NULL;
2927
Barry Warsaw53699e91996-12-10 23:23:01 +00002928 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002929 res = ftruncate(fd, length);
Barry Warsaw53699e91996-12-10 23:23:01 +00002930 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002931 if (res < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002932 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002933 return NULL;
2934 }
Barry Warsaw53699e91996-12-10 23:23:01 +00002935 Py_INCREF(Py_None);
2936 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002937}
2938#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002939
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002940#ifdef NeXT
2941#define HAVE_PUTENV
2942/* Steve Spicklemire got this putenv from NeXTAnswers */
2943static int
2944putenv(char *newval)
2945{
2946 extern char **environ;
2947
2948 static int firstTime = 1;
2949 char **ep;
2950 char *cp;
2951 int esiz;
2952 char *np;
2953
2954 if (!(np = strchr(newval, '=')))
2955 return 1;
2956 *np = '\0';
2957
2958 /* look it up */
2959 for (ep=environ ; *ep ; ep++)
2960 {
2961 /* this should always be true... */
2962 if (cp = strchr(*ep, '='))
2963 {
2964 *cp = '\0';
2965 if (!strcmp(*ep, newval))
2966 {
2967 /* got it! */
2968 *cp = '=';
2969 break;
2970 }
2971 *cp = '=';
2972 }
2973 else
2974 {
2975 *np = '=';
2976 return 1;
2977 }
2978 }
2979
2980 *np = '=';
2981 if (*ep)
2982 {
2983 /* the string was already there:
2984 just replace it with the new one */
2985 *ep = newval;
2986 return 0;
2987 }
2988
2989 /* expand environ by one */
2990 for (esiz=2, ep=environ ; *ep ; ep++)
2991 esiz++;
2992 if (firstTime)
2993 {
2994 char **epp;
2995 char **newenv;
2996 if (!(newenv = malloc(esiz * sizeof(char *))))
2997 return 1;
2998
2999 for (ep=environ, epp=newenv ; *ep ;)
3000 *epp++ = *ep++;
3001 *epp++ = newval;
3002 *epp = (char *) 0;
3003 environ = newenv;
3004 }
3005 else
3006 {
3007 if (!(environ = realloc(environ, esiz * sizeof(char *))))
3008 return 1;
3009 environ[esiz - 2] = newval;
3010 environ[esiz - 1] = (char *) 0;
3011 firstTime = 0;
3012 }
3013
3014 return 0;
3015}
Guido van Rossumc6ef2041997-08-21 02:30:45 +00003016#endif /* NeXT */
Guido van Rossumb9f866c1997-05-22 15:12:39 +00003017
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003018
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003019#ifdef HAVE_PUTENV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003020static char posix_putenv__doc__[] =
3021"putenv(key, value) -> None\n\
3022Change or add an environment variable.";
3023
Guido van Rossumbcc20741998-08-04 22:53:56 +00003024#ifdef __BEOS__
3025/* We have putenv(), but not in the headers (as of PR2). - [cjh] */
3026int putenv( const char *str );
3027#endif
3028
Fred Drake762e2061999-08-26 17:23:54 +00003029/* Save putenv() parameters as values here, so we can collect them when they
3030 * get re-set with another call for the same key. */
3031static PyObject *posix_putenv_garbage;
3032
Barry Warsaw53699e91996-12-10 23:23:01 +00003033static PyObject *
Guido van Rossumb6a47161997-09-15 22:54:34 +00003034posix_putenv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00003035 PyObject *self;
3036 PyObject *args;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003037{
3038 char *s1, *s2;
3039 char *new;
Fred Drake762e2061999-08-26 17:23:54 +00003040 PyObject *newstr;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003041
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003042 if (!PyArg_ParseTuple(args, "ss:putenv", &s1, &s2))
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003043 return NULL;
Guido van Rossumd48f2521997-12-05 22:19:34 +00003044
3045#if defined(PYOS_OS2)
3046 if (stricmp(s1, "BEGINLIBPATH") == 0) {
3047 APIRET rc;
3048
3049 if (strlen(s2) == 0) /* If New Value is an Empty String */
3050 s2 = NULL; /* Then OS/2 API Wants a NULL to Undefine It */
3051
3052 rc = DosSetExtLIBPATH(s2, BEGIN_LIBPATH);
3053 if (rc != NO_ERROR)
3054 return os2_error(rc);
3055
3056 } else if (stricmp(s1, "ENDLIBPATH") == 0) {
3057 APIRET rc;
3058
3059 if (strlen(s2) == 0) /* If New Value is an Empty String */
3060 s2 = NULL; /* Then OS/2 API Wants a NULL to Undefine It */
3061
3062 rc = DosSetExtLIBPATH(s2, END_LIBPATH);
3063 if (rc != NO_ERROR)
3064 return os2_error(rc);
3065 } else {
3066#endif
3067
Fred Drake762e2061999-08-26 17:23:54 +00003068 /* XXX This can leak memory -- not easy to fix :-( */
3069 newstr = PyString_FromStringAndSize(NULL, strlen(s1) + strlen(s2) + 2);
3070 if (newstr == NULL)
3071 return PyErr_NoMemory();
3072 new = PyString_AS_STRING(newstr);
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003073 (void) sprintf(new, "%s=%s", s1, s2);
3074 if (putenv(new)) {
3075 posix_error();
3076 return NULL;
3077 }
Fred Drake762e2061999-08-26 17:23:54 +00003078 /* Install the first arg and newstr in posix_putenv_garbage;
3079 * this will cause previous value to be collected. This has to
3080 * happen after the real putenv() call because the old value
3081 * was still accessible until then. */
3082 if (PyDict_SetItem(posix_putenv_garbage,
3083 PyTuple_GET_ITEM(args, 0), newstr)) {
3084 /* really not much we can do; just leak */
3085 PyErr_Clear();
3086 }
3087 else {
3088 Py_DECREF(newstr);
3089 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00003090
3091#if defined(PYOS_OS2)
3092 }
3093#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00003094 Py_INCREF(Py_None);
3095 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003096}
Guido van Rossumb6a47161997-09-15 22:54:34 +00003097#endif /* putenv */
3098
3099#ifdef HAVE_STRERROR
3100static char posix_strerror__doc__[] =
3101"strerror(code) -> string\n\
3102Translate an error code to a message string.";
3103
3104PyObject *
3105posix_strerror(self, args)
3106 PyObject *self;
3107 PyObject *args;
3108{
3109 int code;
3110 char *message;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003111 if (!PyArg_ParseTuple(args, "i:strerror", &code))
Guido van Rossumb6a47161997-09-15 22:54:34 +00003112 return NULL;
3113 message = strerror(code);
3114 if (message == NULL) {
3115 PyErr_SetString(PyExc_ValueError,
3116 "strerror code out of range");
3117 return NULL;
3118 }
3119 return PyString_FromString(message);
3120}
3121#endif /* strerror */
3122
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003123
Guido van Rossumc9641791998-08-04 15:26:23 +00003124#ifdef HAVE_SYS_WAIT_H
3125
3126#ifdef WIFSTOPPED
3127static char posix_WIFSTOPPED__doc__[] =
3128"WIFSTOPPED(status) -> Boolean\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003129Return true if the process returning 'status' was stopped.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003130
3131static PyObject *
3132posix_WIFSTOPPED(self, args)
3133 PyObject *self;
3134 PyObject *args;
3135{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003136#ifdef UNION_WAIT
3137 union wait status;
3138#define status_i (status.w_status)
3139#else
3140 int status;
3141#define status_i status
3142#endif
3143 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003144
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003145 if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003146 {
3147 return NULL;
3148 }
3149
3150 return Py_BuildValue("i", WIFSTOPPED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003151#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003152}
3153#endif /* WIFSTOPPED */
3154
3155#ifdef WIFSIGNALED
3156static char posix_WIFSIGNALED__doc__[] =
3157"WIFSIGNALED(status) -> Boolean\n\
Guido van Rossum3366d1c1999-02-23 18:34:43 +00003158Return true if the process returning 'status' was terminated by a signal.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003159
3160static PyObject *
3161posix_WIFSIGNALED(self, args)
3162 PyObject *self;
3163 PyObject *args;
3164{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003165#ifdef UNION_WAIT
3166 union wait status;
3167#define status_i (status.w_status)
3168#else
3169 int status;
3170#define status_i status
3171#endif
3172 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003173
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003174 if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003175 {
3176 return NULL;
3177 }
3178
3179 return Py_BuildValue("i", WIFSIGNALED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003180#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003181}
3182#endif /* WIFSIGNALED */
3183
3184#ifdef WIFEXITED
3185static char posix_WIFEXITED__doc__[] =
3186"WIFEXITED(status) -> Boolean\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003187Return true if the process returning 'status' exited using the exit()\n\
3188system call.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003189
3190static PyObject *
3191posix_WIFEXITED(self, args)
3192 PyObject *self;
3193 PyObject *args;
3194{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003195#ifdef UNION_WAIT
3196 union wait status;
3197#define status_i (status.w_status)
3198#else
3199 int status;
3200#define status_i status
3201#endif
3202 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003203
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003204 if (!PyArg_ParseTuple(args, "i:WIFEXITED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003205 {
3206 return NULL;
3207 }
3208
3209 return Py_BuildValue("i", WIFEXITED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003210#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003211}
3212#endif /* WIFEXITED */
3213
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003214#ifdef WEXITSTATUS
Guido van Rossumc9641791998-08-04 15:26:23 +00003215static char posix_WEXITSTATUS__doc__[] =
3216"WEXITSTATUS(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003217Return the process return code from 'status'.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003218
3219static PyObject *
3220posix_WEXITSTATUS(self, args)
3221 PyObject *self;
3222 PyObject *args;
3223{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003224#ifdef UNION_WAIT
3225 union wait status;
3226#define status_i (status.w_status)
3227#else
3228 int status;
3229#define status_i status
3230#endif
3231 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003232
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003233 if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003234 {
3235 return NULL;
3236 }
3237
3238 return Py_BuildValue("i", WEXITSTATUS(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003239#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003240}
3241#endif /* WEXITSTATUS */
3242
3243#ifdef WTERMSIG
3244static char posix_WTERMSIG__doc__[] =
3245"WTERMSIG(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003246Return the signal that terminated the process that provided the 'status'\n\
3247value.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003248
3249static PyObject *
3250posix_WTERMSIG(self, args)
3251 PyObject *self;
3252 PyObject *args;
3253{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003254#ifdef UNION_WAIT
3255 union wait status;
3256#define status_i (status.w_status)
3257#else
3258 int status;
3259#define status_i status
3260#endif
3261 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003262
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003263 if (!PyArg_ParseTuple(args, "i:WTERMSIG", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003264 {
3265 return NULL;
3266 }
3267
3268 return Py_BuildValue("i", WTERMSIG(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003269#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003270}
3271#endif /* WTERMSIG */
3272
3273#ifdef WSTOPSIG
3274static char posix_WSTOPSIG__doc__[] =
3275"WSTOPSIG(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003276Return the signal that stopped the process that provided the 'status' value.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003277
3278static PyObject *
3279posix_WSTOPSIG(self, args)
3280 PyObject *self;
3281 PyObject *args;
3282{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003283#ifdef UNION_WAIT
3284 union wait status;
3285#define status_i (status.w_status)
3286#else
3287 int status;
3288#define status_i status
3289#endif
3290 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003291
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003292 if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003293 {
3294 return NULL;
3295 }
3296
3297 return Py_BuildValue("i", WSTOPSIG(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003298#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003299}
3300#endif /* WSTOPSIG */
3301
3302#endif /* HAVE_SYS_WAIT_H */
3303
3304
Guido van Rossum94f6f721999-01-06 18:42:14 +00003305#if defined(HAVE_FSTATVFS)
Guido van Rossumd5753e11999-10-19 13:29:23 +00003306#ifdef _SCO_DS
3307/* SCO OpenServer 5.0 and later requires _SVID3 before it reveals the
3308 needed definitions in sys/statvfs.h */
3309#define _SVID3
3310#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00003311#include <sys/statvfs.h>
3312
3313static char posix_fstatvfs__doc__[] =
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003314"fstatvfs(fd) -> \n\
3315 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +00003316Perform an fstatvfs system call on the given fd.";
3317
3318static PyObject *
3319posix_fstatvfs(self, args)
3320 PyObject *self;
3321 PyObject *args;
3322{
3323 int fd, res;
3324 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003325 if (!PyArg_ParseTuple(args, "i:fstatvfs", &fd))
Guido van Rossum94f6f721999-01-06 18:42:14 +00003326 return NULL;
3327 Py_BEGIN_ALLOW_THREADS
3328 res = fstatvfs(fd, &st);
3329 Py_END_ALLOW_THREADS
3330 if (res != 0)
3331 return posix_error();
3332#if !defined(HAVE_LARGEFILE_SUPPORT)
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003333 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003334 (long) st.f_bsize,
3335 (long) st.f_frsize,
3336 (long) st.f_blocks,
3337 (long) st.f_bfree,
3338 (long) st.f_bavail,
3339 (long) st.f_files,
3340 (long) st.f_ffree,
3341 (long) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003342 (long) st.f_flag,
3343 (long) st.f_namemax);
3344#else
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003345 return Py_BuildValue("(llLLLLLLll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003346 (long) st.f_bsize,
3347 (long) st.f_frsize,
3348 (LONG_LONG) st.f_blocks,
3349 (LONG_LONG) st.f_bfree,
3350 (LONG_LONG) st.f_bavail,
3351 (LONG_LONG) st.f_files,
3352 (LONG_LONG) st.f_ffree,
3353 (LONG_LONG) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003354 (long) st.f_flag,
3355 (long) st.f_namemax);
3356#endif
3357}
3358#endif /* HAVE_FSTATVFS */
3359
3360
3361#if defined(HAVE_STATVFS)
3362#include <sys/statvfs.h>
3363
3364static char posix_statvfs__doc__[] =
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003365"statvfs(path) -> \n\
3366 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +00003367Perform a statvfs system call on the given path.";
3368
3369static PyObject *
3370posix_statvfs(self, args)
3371 PyObject *self;
3372 PyObject *args;
3373{
3374 char *path;
3375 int res;
3376 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003377 if (!PyArg_ParseTuple(args, "s:statvfs", &path))
Guido van Rossum94f6f721999-01-06 18:42:14 +00003378 return NULL;
3379 Py_BEGIN_ALLOW_THREADS
3380 res = statvfs(path, &st);
3381 Py_END_ALLOW_THREADS
3382 if (res != 0)
3383 return posix_error_with_filename(path);
3384#if !defined(HAVE_LARGEFILE_SUPPORT)
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003385 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003386 (long) st.f_bsize,
3387 (long) st.f_frsize,
3388 (long) st.f_blocks,
3389 (long) st.f_bfree,
3390 (long) st.f_bavail,
3391 (long) st.f_files,
3392 (long) st.f_ffree,
3393 (long) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003394 (long) st.f_flag,
3395 (long) st.f_namemax);
3396#else /* HAVE_LARGEFILE_SUPPORT */
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003397 return Py_BuildValue("(llLLLLLLll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003398 (long) st.f_bsize,
3399 (long) st.f_frsize,
3400 (LONG_LONG) st.f_blocks,
3401 (LONG_LONG) st.f_bfree,
3402 (LONG_LONG) st.f_bavail,
3403 (LONG_LONG) st.f_files,
3404 (LONG_LONG) st.f_ffree,
3405 (LONG_LONG) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003406 (long) st.f_flag,
3407 (long) st.f_namemax);
3408#endif
3409}
3410#endif /* HAVE_STATVFS */
3411
3412
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003413#ifdef HAVE_TEMPNAM
3414static char posix_tempnam__doc__[] = "\
3415tempnam([dir[, prefix]]) -> string\n\
3416Return a unique name for a temporary file.\n\
3417The directory and a short may be specified as strings; they may be omitted\n\
3418or None if not needed.";
3419
3420static PyObject *
3421posix_tempnam(self, args)
3422 PyObject *self;
3423 PyObject *args;
3424{
3425 PyObject *result = NULL;
3426 char *dir = NULL;
3427 char *pfx = NULL;
3428 char *name;
3429
3430 if (!PyArg_ParseTuple(args, "|zz:tempnam", &dir, &pfx))
3431 return NULL;
3432 name = tempnam(dir, pfx);
3433 if (name == NULL)
3434 return PyErr_NoMemory();
3435 result = PyString_FromString(name);
3436 free(name);
3437 return result;
3438}
Guido van Rossumd371ff11999-01-25 16:12:23 +00003439#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003440
3441
3442#ifdef HAVE_TMPFILE
3443static char posix_tmpfile__doc__[] = "\
3444tmpfile() -> file object\n\
3445Create a temporary file with no directory entries.";
3446
3447static PyObject *
3448posix_tmpfile(self, args)
3449 PyObject *self;
3450 PyObject *args;
3451{
3452 FILE *fp;
3453
3454 if (!PyArg_ParseTuple(args, ":tmpfile"))
3455 return NULL;
3456 fp = tmpfile();
3457 if (fp == NULL)
3458 return posix_error();
3459 return PyFile_FromFile(fp, "<tmpfile>", "w+", fclose);
3460}
3461#endif
3462
3463
3464#ifdef HAVE_TMPNAM
3465static char posix_tmpnam__doc__[] = "\
3466tmpnam() -> string\n\
3467Return a unique name for a temporary file.";
3468
3469static PyObject *
3470posix_tmpnam(self, args)
3471 PyObject *self;
3472 PyObject *args;
3473{
3474 char buffer[L_tmpnam];
3475 char *name;
3476
3477 if (!PyArg_ParseTuple(args, ":tmpnam"))
3478 return NULL;
Greg Wardb48bc172000-03-01 21:51:56 +00003479#ifdef USE_TMPNAM_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003480 name = tmpnam_r(buffer);
3481#else
3482 name = tmpnam(buffer);
3483#endif
3484 if (name == NULL) {
3485 PyErr_SetObject(PyExc_OSError,
3486 Py_BuildValue("is", 0,
Greg Wardb48bc172000-03-01 21:51:56 +00003487#ifdef USE_TMPNAM_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003488 "unexpected NULL from tmpnam_r"
3489#else
3490 "unexpected NULL from tmpnam"
3491#endif
3492 ));
3493 return NULL;
3494 }
3495 return PyString_FromString(buffer);
3496}
3497#endif
3498
3499
Fred Drakec9680921999-12-13 16:37:25 +00003500/* This is used for fpathconf(), pathconf(), confstr() and sysconf().
3501 * It maps strings representing configuration variable names to
3502 * integer values, allowing those functions to be called with the
3503 * magic names instead of poluting the module's namespace with tons of
Fred Drake12c6e2d1999-12-14 21:25:03 +00003504 * rarely-used constants. There are three separate tables that use
3505 * these definitions.
Fred Drakebec628d1999-12-15 18:31:10 +00003506 *
3507 * This code is always included, even if none of the interfaces that
3508 * need it are included. The #if hackery needed to avoid it would be
3509 * sufficiently pervasive that it's not worth the loss of readability.
Fred Drakec9680921999-12-13 16:37:25 +00003510 */
3511struct constdef {
3512 char *name;
3513 long value;
3514};
3515
Fred Drake12c6e2d1999-12-14 21:25:03 +00003516static int
3517conv_confname(arg, valuep, table, tablesize)
3518 PyObject *arg;
3519 int *valuep;
3520 struct constdef *table;
3521 size_t tablesize;
3522{
3523 if (PyInt_Check(arg)) {
3524 *valuep = PyInt_AS_LONG(arg);
3525 return 1;
3526 }
3527 if (PyString_Check(arg)) {
3528 /* look up the value in the table using a binary search */
3529 int lo = 0;
3530 int hi = tablesize;
3531 int cmp, mid;
3532 char *confname = PyString_AS_STRING(arg);
3533 while (lo < hi) {
3534 mid = (lo + hi) / 2;
3535 cmp = strcmp(confname, table[mid].name);
3536 if (cmp < 0)
3537 hi = mid;
3538 else if (cmp > 0)
3539 lo = mid + 1;
3540 else {
3541 *valuep = table[mid].value;
3542 return 1;
3543 }
3544 }
3545 PyErr_SetString(PyExc_ValueError, "unrecognized configuration name");
3546 }
3547 else
3548 PyErr_SetString(PyExc_TypeError,
3549 "configuration names must be strings or integers");
3550 return 0;
3551}
3552
3553
3554#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
3555static struct constdef posix_constants_pathconf[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003556#ifdef _PC_ABI_AIO_XFER_MAX
3557 {"PC_ABI_AIO_XFER_MAX", _PC_ABI_AIO_XFER_MAX},
3558#endif
3559#ifdef _PC_ABI_ASYNC_IO
3560 {"PC_ABI_ASYNC_IO", _PC_ABI_ASYNC_IO},
3561#endif
Fred Drakec9680921999-12-13 16:37:25 +00003562#ifdef _PC_ASYNC_IO
3563 {"PC_ASYNC_IO", _PC_ASYNC_IO},
3564#endif
3565#ifdef _PC_CHOWN_RESTRICTED
3566 {"PC_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED},
3567#endif
3568#ifdef _PC_FILESIZEBITS
3569 {"PC_FILESIZEBITS", _PC_FILESIZEBITS},
3570#endif
3571#ifdef _PC_LAST
3572 {"PC_LAST", _PC_LAST},
3573#endif
3574#ifdef _PC_LINK_MAX
3575 {"PC_LINK_MAX", _PC_LINK_MAX},
3576#endif
3577#ifdef _PC_MAX_CANON
3578 {"PC_MAX_CANON", _PC_MAX_CANON},
3579#endif
3580#ifdef _PC_MAX_INPUT
3581 {"PC_MAX_INPUT", _PC_MAX_INPUT},
3582#endif
3583#ifdef _PC_NAME_MAX
3584 {"PC_NAME_MAX", _PC_NAME_MAX},
3585#endif
3586#ifdef _PC_NO_TRUNC
3587 {"PC_NO_TRUNC", _PC_NO_TRUNC},
3588#endif
3589#ifdef _PC_PATH_MAX
3590 {"PC_PATH_MAX", _PC_PATH_MAX},
3591#endif
3592#ifdef _PC_PIPE_BUF
3593 {"PC_PIPE_BUF", _PC_PIPE_BUF},
3594#endif
3595#ifdef _PC_PRIO_IO
3596 {"PC_PRIO_IO", _PC_PRIO_IO},
3597#endif
3598#ifdef _PC_SOCK_MAXBUF
3599 {"PC_SOCK_MAXBUF", _PC_SOCK_MAXBUF},
3600#endif
3601#ifdef _PC_SYNC_IO
3602 {"PC_SYNC_IO", _PC_SYNC_IO},
3603#endif
3604#ifdef _PC_VDISABLE
3605 {"PC_VDISABLE", _PC_VDISABLE},
3606#endif
3607};
3608
Fred Drakec9680921999-12-13 16:37:25 +00003609static int
3610conv_path_confname(arg, valuep)
3611 PyObject *arg;
3612 int *valuep;
3613{
3614 return conv_confname(arg, valuep, posix_constants_pathconf,
3615 sizeof(posix_constants_pathconf)
3616 / sizeof(struct constdef));
3617}
3618#endif
3619
3620#ifdef HAVE_FPATHCONF
3621static char posix_fpathconf__doc__[] = "\
3622fpathconf(fd, name) -> integer\n\
3623Return the configuration limit name for the file descriptor fd.\n\
3624If there is no limit, return -1.";
3625
3626static PyObject *
3627posix_fpathconf(self, args)
3628 PyObject *self;
3629 PyObject *args;
3630{
3631 PyObject *result = NULL;
3632 int name, fd;
3633
Fred Drake12c6e2d1999-12-14 21:25:03 +00003634 if (PyArg_ParseTuple(args, "iO&:fpathconf", &fd,
3635 conv_path_confname, &name)) {
Fred Drakec9680921999-12-13 16:37:25 +00003636 long limit;
3637
3638 errno = 0;
3639 limit = fpathconf(fd, name);
3640 if (limit == -1 && errno != 0)
3641 posix_error();
3642 else
3643 result = PyInt_FromLong(limit);
3644 }
3645 return result;
3646}
3647#endif
3648
3649
3650#ifdef HAVE_PATHCONF
3651static char posix_pathconf__doc__[] = "\
3652pathconf(path, name) -> integer\n\
3653Return the configuration limit name for the file or directory path.\n\
3654If there is no limit, return -1.";
3655
3656static PyObject *
3657posix_pathconf(self, args)
3658 PyObject *self;
3659 PyObject *args;
3660{
3661 PyObject *result = NULL;
3662 int name;
3663 char *path;
3664
3665 if (PyArg_ParseTuple(args, "sO&:pathconf", &path,
3666 conv_path_confname, &name)) {
3667 long limit;
3668
3669 errno = 0;
3670 limit = pathconf(path, name);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003671 if (limit == -1 && errno != 0) {
Fred Drakec9680921999-12-13 16:37:25 +00003672 if (errno == EINVAL)
3673 /* could be a path or name problem */
3674 posix_error();
3675 else
3676 posix_error_with_filename(path);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003677 }
Fred Drakec9680921999-12-13 16:37:25 +00003678 else
3679 result = PyInt_FromLong(limit);
3680 }
3681 return result;
3682}
3683#endif
3684
3685#ifdef HAVE_CONFSTR
3686static struct constdef posix_constants_confstr[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003687#ifdef _CS_ARCHITECTURE
3688 {"CS_ARCHITECTURE", _CS_ARCHITECTURE},
3689#endif
3690#ifdef _CS_HOSTNAME
3691 {"CS_HOSTNAME", _CS_HOSTNAME},
3692#endif
3693#ifdef _CS_HW_PROVIDER
3694 {"CS_HW_PROVIDER", _CS_HW_PROVIDER},
3695#endif
3696#ifdef _CS_HW_SERIAL
3697 {"CS_HW_SERIAL", _CS_HW_SERIAL},
3698#endif
3699#ifdef _CS_INITTAB_NAME
3700 {"CS_INITTAB_NAME", _CS_INITTAB_NAME},
3701#endif
Fred Drakec9680921999-12-13 16:37:25 +00003702#ifdef _CS_LFS64_CFLAGS
3703 {"CS_LFS64_CFLAGS", _CS_LFS64_CFLAGS},
3704#endif
3705#ifdef _CS_LFS64_LDFLAGS
3706 {"CS_LFS64_LDFLAGS", _CS_LFS64_LDFLAGS},
3707#endif
3708#ifdef _CS_LFS64_LIBS
3709 {"CS_LFS64_LIBS", _CS_LFS64_LIBS},
3710#endif
3711#ifdef _CS_LFS64_LINTFLAGS
3712 {"CS_LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS},
3713#endif
3714#ifdef _CS_LFS_CFLAGS
3715 {"CS_LFS_CFLAGS", _CS_LFS_CFLAGS},
3716#endif
3717#ifdef _CS_LFS_LDFLAGS
3718 {"CS_LFS_LDFLAGS", _CS_LFS_LDFLAGS},
3719#endif
3720#ifdef _CS_LFS_LIBS
3721 {"CS_LFS_LIBS", _CS_LFS_LIBS},
3722#endif
3723#ifdef _CS_LFS_LINTFLAGS
3724 {"CS_LFS_LINTFLAGS", _CS_LFS_LINTFLAGS},
3725#endif
Fred Draked86ed291999-12-15 15:34:33 +00003726#ifdef _CS_MACHINE
3727 {"CS_MACHINE", _CS_MACHINE},
3728#endif
Fred Drakec9680921999-12-13 16:37:25 +00003729#ifdef _CS_PATH
3730 {"CS_PATH", _CS_PATH},
3731#endif
Fred Draked86ed291999-12-15 15:34:33 +00003732#ifdef _CS_RELEASE
3733 {"CS_RELEASE", _CS_RELEASE},
3734#endif
3735#ifdef _CS_SRPC_DOMAIN
3736 {"CS_SRPC_DOMAIN", _CS_SRPC_DOMAIN},
3737#endif
3738#ifdef _CS_SYSNAME
3739 {"CS_SYSNAME", _CS_SYSNAME},
3740#endif
3741#ifdef _CS_VERSION
3742 {"CS_VERSION", _CS_VERSION},
3743#endif
Fred Drakec9680921999-12-13 16:37:25 +00003744#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS
3745 {"CS_XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS},
3746#endif
3747#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS
3748 {"CS_XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS},
3749#endif
3750#ifdef _CS_XBS5_ILP32_OFF32_LIBS
3751 {"CS_XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS},
3752#endif
3753#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS
3754 {"CS_XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS},
3755#endif
3756#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS
3757 {"CS_XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS},
3758#endif
3759#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS
3760 {"CS_XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS},
3761#endif
3762#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS
3763 {"CS_XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS},
3764#endif
3765#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
3766 {"CS_XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS},
3767#endif
3768#ifdef _CS_XBS5_LP64_OFF64_CFLAGS
3769 {"CS_XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS},
3770#endif
3771#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS
3772 {"CS_XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS},
3773#endif
3774#ifdef _CS_XBS5_LP64_OFF64_LIBS
3775 {"CS_XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS},
3776#endif
3777#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS
3778 {"CS_XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS},
3779#endif
3780#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS
3781 {"CS_XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS},
3782#endif
3783#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
3784 {"CS_XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS},
3785#endif
3786#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS
3787 {"CS_XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS},
3788#endif
3789#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
3790 {"CS_XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS},
3791#endif
Fred Draked86ed291999-12-15 15:34:33 +00003792#ifdef _MIPS_CS_AVAIL_PROCESSORS
3793 {"MIPS_CS_AVAIL_PROCESSORS", _MIPS_CS_AVAIL_PROCESSORS},
3794#endif
3795#ifdef _MIPS_CS_BASE
3796 {"MIPS_CS_BASE", _MIPS_CS_BASE},
3797#endif
3798#ifdef _MIPS_CS_HOSTID
3799 {"MIPS_CS_HOSTID", _MIPS_CS_HOSTID},
3800#endif
3801#ifdef _MIPS_CS_HW_NAME
3802 {"MIPS_CS_HW_NAME", _MIPS_CS_HW_NAME},
3803#endif
3804#ifdef _MIPS_CS_NUM_PROCESSORS
3805 {"MIPS_CS_NUM_PROCESSORS", _MIPS_CS_NUM_PROCESSORS},
3806#endif
3807#ifdef _MIPS_CS_OSREL_MAJ
3808 {"MIPS_CS_OSREL_MAJ", _MIPS_CS_OSREL_MAJ},
3809#endif
3810#ifdef _MIPS_CS_OSREL_MIN
3811 {"MIPS_CS_OSREL_MIN", _MIPS_CS_OSREL_MIN},
3812#endif
3813#ifdef _MIPS_CS_OSREL_PATCH
3814 {"MIPS_CS_OSREL_PATCH", _MIPS_CS_OSREL_PATCH},
3815#endif
3816#ifdef _MIPS_CS_OS_NAME
3817 {"MIPS_CS_OS_NAME", _MIPS_CS_OS_NAME},
3818#endif
3819#ifdef _MIPS_CS_OS_PROVIDER
3820 {"MIPS_CS_OS_PROVIDER", _MIPS_CS_OS_PROVIDER},
3821#endif
3822#ifdef _MIPS_CS_PROCESSORS
3823 {"MIPS_CS_PROCESSORS", _MIPS_CS_PROCESSORS},
3824#endif
3825#ifdef _MIPS_CS_SERIAL
3826 {"MIPS_CS_SERIAL", _MIPS_CS_SERIAL},
3827#endif
3828#ifdef _MIPS_CS_VENDOR
3829 {"MIPS_CS_VENDOR", _MIPS_CS_VENDOR},
3830#endif
Fred Drakec9680921999-12-13 16:37:25 +00003831};
3832
3833static int
3834conv_confstr_confname(arg, valuep)
3835 PyObject *arg;
3836 int *valuep;
3837{
3838 return conv_confname(arg, valuep, posix_constants_confstr,
3839 sizeof(posix_constants_confstr)
3840 / sizeof(struct constdef));
3841}
3842
3843static char posix_confstr__doc__[] = "\
3844confstr(name) -> string\n\
3845Return a string-valued system configuration variable.";
3846
3847static PyObject *
3848posix_confstr(self, args)
3849 PyObject *self;
3850 PyObject *args;
3851{
3852 PyObject *result = NULL;
3853 int name;
3854 char buffer[64];
3855
3856 if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) {
3857 int len = confstr(name, buffer, sizeof(buffer));
3858
Fred Drakec9680921999-12-13 16:37:25 +00003859 errno = 0;
3860 if (len == 0) {
3861 if (errno != 0)
3862 posix_error();
3863 else
3864 result = PyString_FromString("");
3865 }
3866 else {
3867 if (len >= sizeof(buffer)) {
3868 result = PyString_FromStringAndSize(NULL, len);
3869 if (result != NULL)
3870 confstr(name, PyString_AS_STRING(result), len+1);
3871 }
3872 else
3873 result = PyString_FromString(buffer);
3874 }
3875 }
3876 return result;
3877}
3878#endif
3879
3880
3881#ifdef HAVE_SYSCONF
3882static struct constdef posix_constants_sysconf[] = {
3883#ifdef _SC_2_CHAR_TERM
3884 {"SC_2_CHAR_TERM", _SC_2_CHAR_TERM},
3885#endif
3886#ifdef _SC_2_C_BIND
3887 {"SC_2_C_BIND", _SC_2_C_BIND},
3888#endif
3889#ifdef _SC_2_C_DEV
3890 {"SC_2_C_DEV", _SC_2_C_DEV},
3891#endif
3892#ifdef _SC_2_C_VERSION
3893 {"SC_2_C_VERSION", _SC_2_C_VERSION},
3894#endif
3895#ifdef _SC_2_FORT_DEV
3896 {"SC_2_FORT_DEV", _SC_2_FORT_DEV},
3897#endif
3898#ifdef _SC_2_FORT_RUN
3899 {"SC_2_FORT_RUN", _SC_2_FORT_RUN},
3900#endif
3901#ifdef _SC_2_LOCALEDEF
3902 {"SC_2_LOCALEDEF", _SC_2_LOCALEDEF},
3903#endif
3904#ifdef _SC_2_SW_DEV
3905 {"SC_2_SW_DEV", _SC_2_SW_DEV},
3906#endif
3907#ifdef _SC_2_UPE
3908 {"SC_2_UPE", _SC_2_UPE},
3909#endif
3910#ifdef _SC_2_VERSION
3911 {"SC_2_VERSION", _SC_2_VERSION},
3912#endif
Fred Draked86ed291999-12-15 15:34:33 +00003913#ifdef _SC_ABI_ASYNCHRONOUS_IO
3914 {"SC_ABI_ASYNCHRONOUS_IO", _SC_ABI_ASYNCHRONOUS_IO},
3915#endif
3916#ifdef _SC_ACL
3917 {"SC_ACL", _SC_ACL},
3918#endif
Fred Drakec9680921999-12-13 16:37:25 +00003919#ifdef _SC_AIO_LISTIO_MAX
3920 {"SC_AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX},
3921#endif
Fred Drakec9680921999-12-13 16:37:25 +00003922#ifdef _SC_AIO_MAX
3923 {"SC_AIO_MAX", _SC_AIO_MAX},
3924#endif
3925#ifdef _SC_AIO_PRIO_DELTA_MAX
3926 {"SC_AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX},
3927#endif
3928#ifdef _SC_ARG_MAX
3929 {"SC_ARG_MAX", _SC_ARG_MAX},
3930#endif
3931#ifdef _SC_ASYNCHRONOUS_IO
3932 {"SC_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO},
3933#endif
3934#ifdef _SC_ATEXIT_MAX
3935 {"SC_ATEXIT_MAX", _SC_ATEXIT_MAX},
3936#endif
Fred Draked86ed291999-12-15 15:34:33 +00003937#ifdef _SC_AUDIT
3938 {"SC_AUDIT", _SC_AUDIT},
3939#endif
Fred Drakec9680921999-12-13 16:37:25 +00003940#ifdef _SC_AVPHYS_PAGES
3941 {"SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES},
3942#endif
3943#ifdef _SC_BC_BASE_MAX
3944 {"SC_BC_BASE_MAX", _SC_BC_BASE_MAX},
3945#endif
3946#ifdef _SC_BC_DIM_MAX
3947 {"SC_BC_DIM_MAX", _SC_BC_DIM_MAX},
3948#endif
3949#ifdef _SC_BC_SCALE_MAX
3950 {"SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX},
3951#endif
3952#ifdef _SC_BC_STRING_MAX
3953 {"SC_BC_STRING_MAX", _SC_BC_STRING_MAX},
3954#endif
Fred Draked86ed291999-12-15 15:34:33 +00003955#ifdef _SC_CAP
3956 {"SC_CAP", _SC_CAP},
3957#endif
Fred Drakec9680921999-12-13 16:37:25 +00003958#ifdef _SC_CHARCLASS_NAME_MAX
3959 {"SC_CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX},
3960#endif
3961#ifdef _SC_CHAR_BIT
3962 {"SC_CHAR_BIT", _SC_CHAR_BIT},
3963#endif
3964#ifdef _SC_CHAR_MAX
3965 {"SC_CHAR_MAX", _SC_CHAR_MAX},
3966#endif
3967#ifdef _SC_CHAR_MIN
3968 {"SC_CHAR_MIN", _SC_CHAR_MIN},
3969#endif
3970#ifdef _SC_CHILD_MAX
3971 {"SC_CHILD_MAX", _SC_CHILD_MAX},
3972#endif
3973#ifdef _SC_CLK_TCK
3974 {"SC_CLK_TCK", _SC_CLK_TCK},
3975#endif
3976#ifdef _SC_COHER_BLKSZ
3977 {"SC_COHER_BLKSZ", _SC_COHER_BLKSZ},
3978#endif
3979#ifdef _SC_COLL_WEIGHTS_MAX
3980 {"SC_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX},
3981#endif
3982#ifdef _SC_DCACHE_ASSOC
3983 {"SC_DCACHE_ASSOC", _SC_DCACHE_ASSOC},
3984#endif
3985#ifdef _SC_DCACHE_BLKSZ
3986 {"SC_DCACHE_BLKSZ", _SC_DCACHE_BLKSZ},
3987#endif
3988#ifdef _SC_DCACHE_LINESZ
3989 {"SC_DCACHE_LINESZ", _SC_DCACHE_LINESZ},
3990#endif
3991#ifdef _SC_DCACHE_SZ
3992 {"SC_DCACHE_SZ", _SC_DCACHE_SZ},
3993#endif
3994#ifdef _SC_DCACHE_TBLKSZ
3995 {"SC_DCACHE_TBLKSZ", _SC_DCACHE_TBLKSZ},
3996#endif
3997#ifdef _SC_DELAYTIMER_MAX
3998 {"SC_DELAYTIMER_MAX", _SC_DELAYTIMER_MAX},
3999#endif
4000#ifdef _SC_EQUIV_CLASS_MAX
4001 {"SC_EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX},
4002#endif
4003#ifdef _SC_EXPR_NEST_MAX
4004 {"SC_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX},
4005#endif
4006#ifdef _SC_FSYNC
4007 {"SC_FSYNC", _SC_FSYNC},
4008#endif
4009#ifdef _SC_GETGR_R_SIZE_MAX
4010 {"SC_GETGR_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX},
4011#endif
4012#ifdef _SC_GETPW_R_SIZE_MAX
4013 {"SC_GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX},
4014#endif
4015#ifdef _SC_ICACHE_ASSOC
4016 {"SC_ICACHE_ASSOC", _SC_ICACHE_ASSOC},
4017#endif
4018#ifdef _SC_ICACHE_BLKSZ
4019 {"SC_ICACHE_BLKSZ", _SC_ICACHE_BLKSZ},
4020#endif
4021#ifdef _SC_ICACHE_LINESZ
4022 {"SC_ICACHE_LINESZ", _SC_ICACHE_LINESZ},
4023#endif
4024#ifdef _SC_ICACHE_SZ
4025 {"SC_ICACHE_SZ", _SC_ICACHE_SZ},
4026#endif
Fred Draked86ed291999-12-15 15:34:33 +00004027#ifdef _SC_INF
4028 {"SC_INF", _SC_INF},
4029#endif
Fred Drakec9680921999-12-13 16:37:25 +00004030#ifdef _SC_INT_MAX
4031 {"SC_INT_MAX", _SC_INT_MAX},
4032#endif
4033#ifdef _SC_INT_MIN
4034 {"SC_INT_MIN", _SC_INT_MIN},
4035#endif
4036#ifdef _SC_IOV_MAX
4037 {"SC_IOV_MAX", _SC_IOV_MAX},
4038#endif
Fred Draked86ed291999-12-15 15:34:33 +00004039#ifdef _SC_IP_SECOPTS
4040 {"SC_IP_SECOPTS", _SC_IP_SECOPTS},
4041#endif
Fred Drakec9680921999-12-13 16:37:25 +00004042#ifdef _SC_JOB_CONTROL
4043 {"SC_JOB_CONTROL", _SC_JOB_CONTROL},
4044#endif
Fred Draked86ed291999-12-15 15:34:33 +00004045#ifdef _SC_KERN_POINTERS
4046 {"SC_KERN_POINTERS", _SC_KERN_POINTERS},
4047#endif
4048#ifdef _SC_KERN_SIM
4049 {"SC_KERN_SIM", _SC_KERN_SIM},
4050#endif
Fred Drakec9680921999-12-13 16:37:25 +00004051#ifdef _SC_LINE_MAX
4052 {"SC_LINE_MAX", _SC_LINE_MAX},
4053#endif
4054#ifdef _SC_LOGIN_NAME_MAX
4055 {"SC_LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX},
4056#endif
4057#ifdef _SC_LOGNAME_MAX
4058 {"SC_LOGNAME_MAX", _SC_LOGNAME_MAX},
4059#endif
4060#ifdef _SC_LONG_BIT
4061 {"SC_LONG_BIT", _SC_LONG_BIT},
4062#endif
Fred Draked86ed291999-12-15 15:34:33 +00004063#ifdef _SC_MAC
4064 {"SC_MAC", _SC_MAC},
4065#endif
Fred Drakec9680921999-12-13 16:37:25 +00004066#ifdef _SC_MAPPED_FILES
4067 {"SC_MAPPED_FILES", _SC_MAPPED_FILES},
4068#endif
4069#ifdef _SC_MAXPID
4070 {"SC_MAXPID", _SC_MAXPID},
4071#endif
4072#ifdef _SC_MB_LEN_MAX
4073 {"SC_MB_LEN_MAX", _SC_MB_LEN_MAX},
4074#endif
4075#ifdef _SC_MEMLOCK
4076 {"SC_MEMLOCK", _SC_MEMLOCK},
4077#endif
4078#ifdef _SC_MEMLOCK_RANGE
4079 {"SC_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE},
4080#endif
4081#ifdef _SC_MEMORY_PROTECTION
4082 {"SC_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION},
4083#endif
4084#ifdef _SC_MESSAGE_PASSING
4085 {"SC_MESSAGE_PASSING", _SC_MESSAGE_PASSING},
4086#endif
Fred Draked86ed291999-12-15 15:34:33 +00004087#ifdef _SC_MMAP_FIXED_ALIGNMENT
4088 {"SC_MMAP_FIXED_ALIGNMENT", _SC_MMAP_FIXED_ALIGNMENT},
4089#endif
Fred Drakec9680921999-12-13 16:37:25 +00004090#ifdef _SC_MQ_OPEN_MAX
4091 {"SC_MQ_OPEN_MAX", _SC_MQ_OPEN_MAX},
4092#endif
4093#ifdef _SC_MQ_PRIO_MAX
4094 {"SC_MQ_PRIO_MAX", _SC_MQ_PRIO_MAX},
4095#endif
Fred Draked86ed291999-12-15 15:34:33 +00004096#ifdef _SC_NACLS_MAX
4097 {"SC_NACLS_MAX", _SC_NACLS_MAX},
4098#endif
Fred Drakec9680921999-12-13 16:37:25 +00004099#ifdef _SC_NGROUPS_MAX
4100 {"SC_NGROUPS_MAX", _SC_NGROUPS_MAX},
4101#endif
4102#ifdef _SC_NL_ARGMAX
4103 {"SC_NL_ARGMAX", _SC_NL_ARGMAX},
4104#endif
4105#ifdef _SC_NL_LANGMAX
4106 {"SC_NL_LANGMAX", _SC_NL_LANGMAX},
4107#endif
4108#ifdef _SC_NL_MSGMAX
4109 {"SC_NL_MSGMAX", _SC_NL_MSGMAX},
4110#endif
4111#ifdef _SC_NL_NMAX
4112 {"SC_NL_NMAX", _SC_NL_NMAX},
4113#endif
4114#ifdef _SC_NL_SETMAX
4115 {"SC_NL_SETMAX", _SC_NL_SETMAX},
4116#endif
4117#ifdef _SC_NL_TEXTMAX
4118 {"SC_NL_TEXTMAX", _SC_NL_TEXTMAX},
4119#endif
4120#ifdef _SC_NPROCESSORS_CONF
4121 {"SC_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF},
4122#endif
4123#ifdef _SC_NPROCESSORS_ONLN
4124 {"SC_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN},
4125#endif
Fred Draked86ed291999-12-15 15:34:33 +00004126#ifdef _SC_NPROC_CONF
4127 {"SC_NPROC_CONF", _SC_NPROC_CONF},
4128#endif
4129#ifdef _SC_NPROC_ONLN
4130 {"SC_NPROC_ONLN", _SC_NPROC_ONLN},
4131#endif
Fred Drakec9680921999-12-13 16:37:25 +00004132#ifdef _SC_NZERO
4133 {"SC_NZERO", _SC_NZERO},
4134#endif
4135#ifdef _SC_OPEN_MAX
4136 {"SC_OPEN_MAX", _SC_OPEN_MAX},
4137#endif
4138#ifdef _SC_PAGESIZE
4139 {"SC_PAGESIZE", _SC_PAGESIZE},
4140#endif
4141#ifdef _SC_PAGE_SIZE
4142 {"SC_PAGE_SIZE", _SC_PAGE_SIZE},
4143#endif
4144#ifdef _SC_PASS_MAX
4145 {"SC_PASS_MAX", _SC_PASS_MAX},
4146#endif
4147#ifdef _SC_PHYS_PAGES
4148 {"SC_PHYS_PAGES", _SC_PHYS_PAGES},
4149#endif
4150#ifdef _SC_PII
4151 {"SC_PII", _SC_PII},
4152#endif
4153#ifdef _SC_PII_INTERNET
4154 {"SC_PII_INTERNET", _SC_PII_INTERNET},
4155#endif
4156#ifdef _SC_PII_INTERNET_DGRAM
4157 {"SC_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM},
4158#endif
4159#ifdef _SC_PII_INTERNET_STREAM
4160 {"SC_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM},
4161#endif
4162#ifdef _SC_PII_OSI
4163 {"SC_PII_OSI", _SC_PII_OSI},
4164#endif
4165#ifdef _SC_PII_OSI_CLTS
4166 {"SC_PII_OSI_CLTS", _SC_PII_OSI_CLTS},
4167#endif
4168#ifdef _SC_PII_OSI_COTS
4169 {"SC_PII_OSI_COTS", _SC_PII_OSI_COTS},
4170#endif
4171#ifdef _SC_PII_OSI_M
4172 {"SC_PII_OSI_M", _SC_PII_OSI_M},
4173#endif
4174#ifdef _SC_PII_SOCKET
4175 {"SC_PII_SOCKET", _SC_PII_SOCKET},
4176#endif
4177#ifdef _SC_PII_XTI
4178 {"SC_PII_XTI", _SC_PII_XTI},
4179#endif
4180#ifdef _SC_POLL
4181 {"SC_POLL", _SC_POLL},
4182#endif
4183#ifdef _SC_PRIORITIZED_IO
4184 {"SC_PRIORITIZED_IO", _SC_PRIORITIZED_IO},
4185#endif
4186#ifdef _SC_PRIORITY_SCHEDULING
4187 {"SC_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING},
4188#endif
4189#ifdef _SC_REALTIME_SIGNALS
4190 {"SC_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS},
4191#endif
4192#ifdef _SC_RE_DUP_MAX
4193 {"SC_RE_DUP_MAX", _SC_RE_DUP_MAX},
4194#endif
4195#ifdef _SC_RTSIG_MAX
4196 {"SC_RTSIG_MAX", _SC_RTSIG_MAX},
4197#endif
4198#ifdef _SC_SAVED_IDS
4199 {"SC_SAVED_IDS", _SC_SAVED_IDS},
4200#endif
4201#ifdef _SC_SCHAR_MAX
4202 {"SC_SCHAR_MAX", _SC_SCHAR_MAX},
4203#endif
4204#ifdef _SC_SCHAR_MIN
4205 {"SC_SCHAR_MIN", _SC_SCHAR_MIN},
4206#endif
4207#ifdef _SC_SELECT
4208 {"SC_SELECT", _SC_SELECT},
4209#endif
4210#ifdef _SC_SEMAPHORES
4211 {"SC_SEMAPHORES", _SC_SEMAPHORES},
4212#endif
4213#ifdef _SC_SEM_NSEMS_MAX
4214 {"SC_SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX},
4215#endif
4216#ifdef _SC_SEM_VALUE_MAX
4217 {"SC_SEM_VALUE_MAX", _SC_SEM_VALUE_MAX},
4218#endif
4219#ifdef _SC_SHARED_MEMORY_OBJECTS
4220 {"SC_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS},
4221#endif
4222#ifdef _SC_SHRT_MAX
4223 {"SC_SHRT_MAX", _SC_SHRT_MAX},
4224#endif
4225#ifdef _SC_SHRT_MIN
4226 {"SC_SHRT_MIN", _SC_SHRT_MIN},
4227#endif
4228#ifdef _SC_SIGQUEUE_MAX
4229 {"SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX},
4230#endif
4231#ifdef _SC_SIGRT_MAX
4232 {"SC_SIGRT_MAX", _SC_SIGRT_MAX},
4233#endif
4234#ifdef _SC_SIGRT_MIN
4235 {"SC_SIGRT_MIN", _SC_SIGRT_MIN},
4236#endif
Fred Draked86ed291999-12-15 15:34:33 +00004237#ifdef _SC_SOFTPOWER
4238 {"SC_SOFTPOWER", _SC_SOFTPOWER},
4239#endif
Fred Drakec9680921999-12-13 16:37:25 +00004240#ifdef _SC_SPLIT_CACHE
4241 {"SC_SPLIT_CACHE", _SC_SPLIT_CACHE},
4242#endif
4243#ifdef _SC_SSIZE_MAX
4244 {"SC_SSIZE_MAX", _SC_SSIZE_MAX},
4245#endif
4246#ifdef _SC_STACK_PROT
4247 {"SC_STACK_PROT", _SC_STACK_PROT},
4248#endif
4249#ifdef _SC_STREAM_MAX
4250 {"SC_STREAM_MAX", _SC_STREAM_MAX},
4251#endif
4252#ifdef _SC_SYNCHRONIZED_IO
4253 {"SC_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO},
4254#endif
4255#ifdef _SC_THREADS
4256 {"SC_THREADS", _SC_THREADS},
4257#endif
4258#ifdef _SC_THREAD_ATTR_STACKADDR
4259 {"SC_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR},
4260#endif
4261#ifdef _SC_THREAD_ATTR_STACKSIZE
4262 {"SC_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE},
4263#endif
4264#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS
4265 {"SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS},
4266#endif
4267#ifdef _SC_THREAD_KEYS_MAX
4268 {"SC_THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX},
4269#endif
4270#ifdef _SC_THREAD_PRIORITY_SCHEDULING
4271 {"SC_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING},
4272#endif
4273#ifdef _SC_THREAD_PRIO_INHERIT
4274 {"SC_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT},
4275#endif
4276#ifdef _SC_THREAD_PRIO_PROTECT
4277 {"SC_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT},
4278#endif
4279#ifdef _SC_THREAD_PROCESS_SHARED
4280 {"SC_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED},
4281#endif
4282#ifdef _SC_THREAD_SAFE_FUNCTIONS
4283 {"SC_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS},
4284#endif
4285#ifdef _SC_THREAD_STACK_MIN
4286 {"SC_THREAD_STACK_MIN", _SC_THREAD_STACK_MIN},
4287#endif
4288#ifdef _SC_THREAD_THREADS_MAX
4289 {"SC_THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX},
4290#endif
4291#ifdef _SC_TIMERS
4292 {"SC_TIMERS", _SC_TIMERS},
4293#endif
4294#ifdef _SC_TIMER_MAX
4295 {"SC_TIMER_MAX", _SC_TIMER_MAX},
4296#endif
4297#ifdef _SC_TTY_NAME_MAX
4298 {"SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX},
4299#endif
4300#ifdef _SC_TZNAME_MAX
4301 {"SC_TZNAME_MAX", _SC_TZNAME_MAX},
4302#endif
4303#ifdef _SC_T_IOV_MAX
4304 {"SC_T_IOV_MAX", _SC_T_IOV_MAX},
4305#endif
4306#ifdef _SC_UCHAR_MAX
4307 {"SC_UCHAR_MAX", _SC_UCHAR_MAX},
4308#endif
4309#ifdef _SC_UINT_MAX
4310 {"SC_UINT_MAX", _SC_UINT_MAX},
4311#endif
4312#ifdef _SC_UIO_MAXIOV
4313 {"SC_UIO_MAXIOV", _SC_UIO_MAXIOV},
4314#endif
4315#ifdef _SC_ULONG_MAX
4316 {"SC_ULONG_MAX", _SC_ULONG_MAX},
4317#endif
4318#ifdef _SC_USHRT_MAX
4319 {"SC_USHRT_MAX", _SC_USHRT_MAX},
4320#endif
4321#ifdef _SC_VERSION
4322 {"SC_VERSION", _SC_VERSION},
4323#endif
4324#ifdef _SC_WORD_BIT
4325 {"SC_WORD_BIT", _SC_WORD_BIT},
4326#endif
4327#ifdef _SC_XBS5_ILP32_OFF32
4328 {"SC_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32},
4329#endif
4330#ifdef _SC_XBS5_ILP32_OFFBIG
4331 {"SC_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG},
4332#endif
4333#ifdef _SC_XBS5_LP64_OFF64
4334 {"SC_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64},
4335#endif
4336#ifdef _SC_XBS5_LPBIG_OFFBIG
4337 {"SC_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG},
4338#endif
4339#ifdef _SC_XOPEN_CRYPT
4340 {"SC_XOPEN_CRYPT", _SC_XOPEN_CRYPT},
4341#endif
4342#ifdef _SC_XOPEN_ENH_I18N
4343 {"SC_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N},
4344#endif
4345#ifdef _SC_XOPEN_LEGACY
4346 {"SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY},
4347#endif
4348#ifdef _SC_XOPEN_REALTIME
4349 {"SC_XOPEN_REALTIME", _SC_XOPEN_REALTIME},
4350#endif
4351#ifdef _SC_XOPEN_REALTIME_THREADS
4352 {"SC_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS},
4353#endif
4354#ifdef _SC_XOPEN_SHM
4355 {"SC_XOPEN_SHM", _SC_XOPEN_SHM},
4356#endif
4357#ifdef _SC_XOPEN_UNIX
4358 {"SC_XOPEN_UNIX", _SC_XOPEN_UNIX},
4359#endif
4360#ifdef _SC_XOPEN_VERSION
4361 {"SC_XOPEN_VERSION", _SC_XOPEN_VERSION},
4362#endif
4363#ifdef _SC_XOPEN_XCU_VERSION
4364 {"SC_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION},
4365#endif
4366#ifdef _SC_XOPEN_XPG2
4367 {"SC_XOPEN_XPG2", _SC_XOPEN_XPG2},
4368#endif
4369#ifdef _SC_XOPEN_XPG3
4370 {"SC_XOPEN_XPG3", _SC_XOPEN_XPG3},
4371#endif
4372#ifdef _SC_XOPEN_XPG4
4373 {"SC_XOPEN_XPG4", _SC_XOPEN_XPG4},
4374#endif
4375};
4376
4377static int
4378conv_sysconf_confname(arg, valuep)
4379 PyObject *arg;
4380 int *valuep;
4381{
4382 return conv_confname(arg, valuep, posix_constants_sysconf,
4383 sizeof(posix_constants_sysconf)
4384 / sizeof(struct constdef));
4385}
4386
4387static char posix_sysconf__doc__[] = "\
4388sysconf(name) -> integer\n\
4389Return an integer-valued system configuration variable.";
4390
4391static PyObject *
4392posix_sysconf(self, args)
4393 PyObject *self;
4394 PyObject *args;
4395{
4396 PyObject *result = NULL;
4397 int name;
4398
4399 if (PyArg_ParseTuple(args, "O&:sysconf", conv_sysconf_confname, &name)) {
4400 int value;
4401
4402 errno = 0;
4403 value = sysconf(name);
4404 if (value == -1 && errno != 0)
4405 posix_error();
4406 else
4407 result = PyInt_FromLong(value);
4408 }
4409 return result;
4410}
4411#endif
4412
4413
Fred Drakebec628d1999-12-15 18:31:10 +00004414/* This code is used to ensure that the tables of configuration value names
4415 * are in sorted order as required by conv_confname(), and also to build the
4416 * the exported dictionaries that are used to publish information about the
4417 * names available on the host platform.
4418 *
4419 * Sorting the table at runtime ensures that the table is properly ordered
4420 * when used, even for platforms we're not able to test on. It also makes
4421 * it easier to add additional entries to the tables.
Fred Draked86ed291999-12-15 15:34:33 +00004422 */
Fred Drakebec628d1999-12-15 18:31:10 +00004423
4424static int
4425cmp_constdefs(v1, v2)
4426 const void *v1;
4427 const void *v2;
4428{
4429 const struct constdef *c1 =
4430 (const struct constdef *) v1;
4431 const struct constdef *c2 =
4432 (const struct constdef *) v2;
4433
4434 return strcmp(c1->name, c2->name);
4435}
4436
4437static int
4438setup_confname_table(table, tablesize, tablename, moddict)
Fred Draked86ed291999-12-15 15:34:33 +00004439 struct constdef *table;
4440 size_t tablesize;
Fred Drakebec628d1999-12-15 18:31:10 +00004441 char * tablename;
4442 PyObject *moddict;
Fred Draked86ed291999-12-15 15:34:33 +00004443{
Fred Drakebec628d1999-12-15 18:31:10 +00004444 PyObject *d = NULL;
Barry Warsaw3155db32000-04-13 15:20:40 +00004445 size_t i;
4446 int status;
Fred Drakebec628d1999-12-15 18:31:10 +00004447
4448 qsort(table, tablesize, sizeof(struct constdef), cmp_constdefs);
4449 d = PyDict_New();
Barry Warsaw3155db32000-04-13 15:20:40 +00004450 if (d == NULL)
4451 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004452
Barry Warsaw3155db32000-04-13 15:20:40 +00004453 for (i=0; i < tablesize; ++i) {
4454 PyObject *o = PyInt_FromLong(table[i].value);
4455 if (o == NULL || PyDict_SetItemString(d, table[i].name, o) == -1) {
4456 Py_XDECREF(o);
4457 Py_DECREF(d);
4458 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004459 }
Barry Warsaw3155db32000-04-13 15:20:40 +00004460 Py_DECREF(o);
Fred Draked86ed291999-12-15 15:34:33 +00004461 }
Barry Warsaw3155db32000-04-13 15:20:40 +00004462 status = PyDict_SetItemString(moddict, tablename, d);
4463 Py_DECREF(d);
4464 return status;
Fred Draked86ed291999-12-15 15:34:33 +00004465}
4466
Fred Drakebec628d1999-12-15 18:31:10 +00004467/* Return -1 on failure, 0 on success. */
4468static int
4469setup_confname_tables(moddict)
4470 PyObject *moddict;
Fred Draked86ed291999-12-15 15:34:33 +00004471{
4472#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
Fred Drakebec628d1999-12-15 18:31:10 +00004473 if (setup_confname_table(posix_constants_pathconf,
Fred Draked86ed291999-12-15 15:34:33 +00004474 sizeof(posix_constants_pathconf)
4475 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004476 "pathconf_names", moddict))
4477 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004478#endif
4479#ifdef HAVE_CONFSTR
Fred Drakebec628d1999-12-15 18:31:10 +00004480 if (setup_confname_table(posix_constants_confstr,
Fred Draked86ed291999-12-15 15:34:33 +00004481 sizeof(posix_constants_confstr)
4482 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004483 "confstr_names", moddict))
4484 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004485#endif
4486#ifdef HAVE_SYSCONF
Fred Drakebec628d1999-12-15 18:31:10 +00004487 if (setup_confname_table(posix_constants_sysconf,
Fred Draked86ed291999-12-15 15:34:33 +00004488 sizeof(posix_constants_sysconf)
4489 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004490 "sysconf_names", moddict))
4491 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004492#endif
Fred Drakebec628d1999-12-15 18:31:10 +00004493 return 0;
Fred Draked86ed291999-12-15 15:34:33 +00004494}
Fred Draked86ed291999-12-15 15:34:33 +00004495
4496
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004497static char posix_abort__doc__[] = "\
4498abort() -> does not return!\n\
4499Abort the interpreter immediately. This 'dumps core' or otherwise fails\n\
4500in the hardest way possible on the hosting operating system.";
4501
4502static PyObject *
4503posix_abort(self, args)
4504 PyObject *self;
4505 PyObject *args;
4506{
4507 if (!PyArg_ParseTuple(args, ":abort"))
4508 return NULL;
4509 abort();
4510 /*NOTREACHED*/
4511 Py_FatalError("abort() called from Python code didn't abort!");
4512 return NULL;
4513}
Fred Drakebec628d1999-12-15 18:31:10 +00004514
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004515
4516static PyMethodDef posix_methods[] = {
4517 {"access", posix_access, METH_VARARGS, posix_access__doc__},
4518#ifdef HAVE_TTYNAME
4519 {"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__},
4520#endif
4521 {"chdir", posix_chdir, METH_VARARGS, posix_chdir__doc__},
4522 {"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004523#ifdef HAVE_CHOWN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004524 {"chown", posix_chown, METH_VARARGS, posix_chown__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004525#endif /* HAVE_CHOWN */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004526#ifdef HAVE_CTERMID
4527 {"ctermid", posix_ctermid, METH_VARARGS, posix_ctermid__doc__},
4528#endif
Guido van Rossum36bc6801995-06-14 22:54:23 +00004529#ifdef HAVE_GETCWD
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004530 {"getcwd", posix_getcwd, METH_VARARGS, posix_getcwd__doc__},
Guido van Rossum36bc6801995-06-14 22:54:23 +00004531#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004532#ifdef HAVE_LINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004533 {"link", posix_link, METH_VARARGS, posix_link__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004534#endif /* HAVE_LINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004535 {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__},
4536 {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__},
4537 {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004538#ifdef HAVE_NICE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004539 {"nice", posix_nice, METH_VARARGS, posix_nice__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004540#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004541#ifdef HAVE_READLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004542 {"readlink", posix_readlink, METH_VARARGS, posix_readlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004543#endif /* HAVE_READLINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004544 {"rename", posix_rename, METH_VARARGS, posix_rename__doc__},
4545 {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__},
4546 {"stat", posix_stat, METH_VARARGS, posix_stat__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004547#ifdef HAVE_SYMLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004548 {"symlink", posix_symlink, METH_VARARGS, posix_symlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004549#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004550#ifdef HAVE_SYSTEM
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004551 {"system", posix_system, METH_VARARGS, posix_system__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004552#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004553 {"umask", posix_umask, METH_VARARGS, posix_umask__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004554#ifdef HAVE_UNAME
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004555 {"uname", posix_uname, METH_VARARGS, posix_uname__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004556#endif /* HAVE_UNAME */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004557 {"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__},
4558 {"remove", posix_unlink, METH_VARARGS, posix_remove__doc__},
4559 {"utime", posix_utime, METH_VARARGS, posix_utime__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004560#ifdef HAVE_TIMES
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004561 {"times", posix_times, METH_VARARGS, posix_times__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004562#endif /* HAVE_TIMES */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004563 {"_exit", posix__exit, METH_VARARGS, posix__exit__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004564#ifdef HAVE_EXECV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004565 {"execv", posix_execv, METH_VARARGS, posix_execv__doc__},
4566 {"execve", posix_execve, METH_VARARGS, posix_execve__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004567#endif /* HAVE_EXECV */
Guido van Rossuma1065681999-01-25 23:20:23 +00004568#ifdef HAVE_SPAWNV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004569 {"spawnv", posix_spawnv, METH_VARARGS, posix_spawnv__doc__},
4570 {"spawnve", posix_spawnve, METH_VARARGS, posix_spawnve__doc__},
Guido van Rossuma1065681999-01-25 23:20:23 +00004571#endif /* HAVE_SPAWNV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004572#ifdef HAVE_FORK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004573 {"fork", posix_fork, METH_VARARGS, posix_fork__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004574#endif /* HAVE_FORK */
Fred Drake8cef4cf2000-06-28 16:40:38 +00004575#ifdef HAVE_OPENPTY
4576 {"openpty", posix_openpty, METH_VARARGS, posix_openpty__doc__},
4577#endif /* HAVE_OPENPTY */
4578#ifdef HAVE_FORKPTY
4579 {"forkpty", posix_forkpty, METH_VARARGS, posix_forkpty__doc__},
4580#endif /* HAVE_FORKPTY */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004581#ifdef HAVE_GETEGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004582 {"getegid", posix_getegid, METH_VARARGS, posix_getegid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004583#endif /* HAVE_GETEGID */
4584#ifdef HAVE_GETEUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004585 {"geteuid", posix_geteuid, METH_VARARGS, posix_geteuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004586#endif /* HAVE_GETEUID */
4587#ifdef HAVE_GETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004588 {"getgid", posix_getgid, METH_VARARGS, posix_getgid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004589#endif /* HAVE_GETGID */
Fred Drakec9680921999-12-13 16:37:25 +00004590#ifdef HAVE_GETGROUPS
4591 {"getgroups", posix_getgroups, METH_VARARGS, posix_getgroups__doc__},
4592#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004593 {"getpid", posix_getpid, METH_VARARGS, posix_getpid__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004594#ifdef HAVE_GETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004595 {"getpgrp", posix_getpgrp, METH_VARARGS, posix_getpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004596#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004597#ifdef HAVE_GETPPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004598 {"getppid", posix_getppid, METH_VARARGS, posix_getppid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004599#endif /* HAVE_GETPPID */
4600#ifdef HAVE_GETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004601 {"getuid", posix_getuid, METH_VARARGS, posix_getuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004602#endif /* HAVE_GETUID */
Fred Drake12c6e2d1999-12-14 21:25:03 +00004603#ifdef HAVE_GETLOGIN
4604 {"getlogin", posix_getlogin, METH_VARARGS, posix_getlogin__doc__},
4605#endif
Guido van Rossumad0ee831995-03-01 10:34:45 +00004606#ifdef HAVE_KILL
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004607 {"kill", posix_kill, METH_VARARGS, posix_kill__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004608#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00004609#ifdef HAVE_PLOCK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004610 {"plock", posix_plock, METH_VARARGS, posix_plock__doc__},
Guido van Rossumc0125471996-06-28 18:55:32 +00004611#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004612#ifdef HAVE_POPEN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004613 {"popen", posix_popen, METH_VARARGS, posix_popen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004614#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004615#ifdef HAVE_SETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004616 {"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004617#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004618#ifdef HAVE_SETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004619 {"setgid", posix_setgid, METH_VARARGS, posix_setgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004620#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004621#ifdef HAVE_SETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004622 {"setpgrp", posix_setpgrp, METH_VARARGS, posix_setpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004623#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004624#ifdef HAVE_WAIT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004625 {"wait", posix_wait, METH_VARARGS, posix_wait__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004626#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004627#ifdef HAVE_WAITPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004628 {"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004629#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004630#ifdef HAVE_SETSID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004631 {"setsid", posix_setsid, METH_VARARGS, posix_setsid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004632#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004633#ifdef HAVE_SETPGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004634 {"setpgid", posix_setpgid, METH_VARARGS, posix_setpgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004635#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004636#ifdef HAVE_TCGETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004637 {"tcgetpgrp", posix_tcgetpgrp, METH_VARARGS, posix_tcgetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004638#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004639#ifdef HAVE_TCSETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004640 {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004641#endif /* HAVE_TCSETPGRP */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004642 {"open", posix_open, METH_VARARGS, posix_open__doc__},
4643 {"close", posix_close, METH_VARARGS, posix_close__doc__},
4644 {"dup", posix_dup, METH_VARARGS, posix_dup__doc__},
4645 {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__},
4646 {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},
4647 {"read", posix_read, METH_VARARGS, posix_read__doc__},
4648 {"write", posix_write, METH_VARARGS, posix_write__doc__},
4649 {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__},
4650 {"fdopen", posix_fdopen, METH_VARARGS, posix_fdopen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004651#ifdef HAVE_PIPE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004652 {"pipe", posix_pipe, METH_VARARGS, posix_pipe__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004653#endif
4654#ifdef HAVE_MKFIFO
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004655 {"mkfifo", posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004656#endif
4657#ifdef HAVE_FTRUNCATE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004658 {"ftruncate", posix_ftruncate, METH_VARARGS, posix_ftruncate__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004659#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004660#ifdef HAVE_PUTENV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004661 {"putenv", posix_putenv, METH_VARARGS, posix_putenv__doc__},
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004662#endif
Guido van Rossumb6a47161997-09-15 22:54:34 +00004663#ifdef HAVE_STRERROR
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004664 {"strerror", posix_strerror, METH_VARARGS, posix_strerror__doc__},
Guido van Rossumb6a47161997-09-15 22:54:34 +00004665#endif
Guido van Rossum21142a01999-01-08 21:05:37 +00004666#ifdef HAVE_FSYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004667 {"fsync", posix_fsync, METH_VARARGS, posix_fsync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004668#endif
4669#ifdef HAVE_FDATASYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004670 {"fdatasync", posix_fdatasync, METH_VARARGS, posix_fdatasync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004671#endif
Guido van Rossumc9641791998-08-04 15:26:23 +00004672#ifdef HAVE_SYS_WAIT_H
4673#ifdef WIFSTOPPED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004674 {"WIFSTOPPED", posix_WIFSTOPPED, METH_VARARGS, posix_WIFSTOPPED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004675#endif /* WIFSTOPPED */
4676#ifdef WIFSIGNALED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004677 {"WIFSIGNALED", posix_WIFSIGNALED, METH_VARARGS, posix_WIFSIGNALED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004678#endif /* WIFSIGNALED */
4679#ifdef WIFEXITED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004680 {"WIFEXITED", posix_WIFEXITED, METH_VARARGS, posix_WIFEXITED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004681#endif /* WIFEXITED */
4682#ifdef WEXITSTATUS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004683 {"WEXITSTATUS", posix_WEXITSTATUS, METH_VARARGS, posix_WEXITSTATUS__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004684#endif /* WEXITSTATUS */
4685#ifdef WTERMSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004686 {"WTERMSIG", posix_WTERMSIG, METH_VARARGS, posix_WTERMSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004687#endif /* WTERMSIG */
4688#ifdef WSTOPSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004689 {"WSTOPSIG", posix_WSTOPSIG, METH_VARARGS, posix_WSTOPSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004690#endif /* WSTOPSIG */
4691#endif /* HAVE_SYS_WAIT_H */
Guido van Rossum94f6f721999-01-06 18:42:14 +00004692#ifdef HAVE_FSTATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004693 {"fstatvfs", posix_fstatvfs, METH_VARARGS, posix_fstatvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004694#endif
4695#ifdef HAVE_STATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004696 {"statvfs", posix_statvfs, METH_VARARGS, posix_statvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004697#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004698#ifdef HAVE_TMPNAM
4699 {"tmpfile", posix_tmpfile, METH_VARARGS, posix_tmpfile__doc__},
4700#endif
4701#ifdef HAVE_TEMPNAM
4702 {"tempnam", posix_tempnam, METH_VARARGS, posix_tempnam__doc__},
4703#endif
4704#ifdef HAVE_TMPNAM
4705 {"tmpnam", posix_tmpnam, METH_VARARGS, posix_tmpnam__doc__},
4706#endif
Fred Drakec9680921999-12-13 16:37:25 +00004707#ifdef HAVE_CONFSTR
4708 {"confstr", posix_confstr, METH_VARARGS, posix_confstr__doc__},
4709#endif
4710#ifdef HAVE_SYSCONF
4711 {"sysconf", posix_sysconf, METH_VARARGS, posix_sysconf__doc__},
4712#endif
4713#ifdef HAVE_FPATHCONF
4714 {"fpathconf", posix_fpathconf, METH_VARARGS, posix_fpathconf__doc__},
4715#endif
4716#ifdef HAVE_PATHCONF
4717 {"pathconf", posix_pathconf, METH_VARARGS, posix_pathconf__doc__},
4718#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004719 {"abort", posix_abort, METH_VARARGS, posix_abort__doc__},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004720 {NULL, NULL} /* Sentinel */
4721};
4722
4723
Barry Warsaw4a342091996-12-19 23:50:02 +00004724static int
4725ins(d, symbol, value)
4726 PyObject* d;
4727 char* symbol;
4728 long value;
4729{
4730 PyObject* v = PyInt_FromLong(value);
4731 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
4732 return -1; /* triggers fatal error */
4733
4734 Py_DECREF(v);
4735 return 0;
4736}
4737
Guido van Rossumd48f2521997-12-05 22:19:34 +00004738#if defined(PYOS_OS2)
4739/* Insert Platform-Specific Constant Values (Strings & Numbers) of Common Use */
4740static int insertvalues(PyObject *d)
4741{
4742 APIRET rc;
4743 ULONG values[QSV_MAX+1];
4744 PyObject *v;
4745 char *ver, tmp[10];
4746
4747 Py_BEGIN_ALLOW_THREADS
4748 rc = DosQuerySysInfo(1, QSV_MAX, &values[1], sizeof(values));
4749 Py_END_ALLOW_THREADS
4750
4751 if (rc != NO_ERROR) {
4752 os2_error(rc);
4753 return -1;
4754 }
4755
4756 if (ins(d, "meminstalled", values[QSV_TOTPHYSMEM])) return -1;
4757 if (ins(d, "memkernel", values[QSV_TOTRESMEM])) return -1;
4758 if (ins(d, "memvirtual", values[QSV_TOTAVAILMEM])) return -1;
4759 if (ins(d, "maxpathlen", values[QSV_MAX_PATH_LENGTH])) return -1;
4760 if (ins(d, "maxnamelen", values[QSV_MAX_COMP_LENGTH])) return -1;
4761 if (ins(d, "revision", values[QSV_VERSION_REVISION])) return -1;
4762 if (ins(d, "timeslice", values[QSV_MIN_SLICE])) return -1;
4763
4764 switch (values[QSV_VERSION_MINOR]) {
4765 case 0: ver = "2.00"; break;
4766 case 10: ver = "2.10"; break;
4767 case 11: ver = "2.11"; break;
4768 case 30: ver = "3.00"; break;
4769 case 40: ver = "4.00"; break;
4770 case 50: ver = "5.00"; break;
4771 default:
4772 sprintf(tmp, "%d-%d", values[QSV_VERSION_MAJOR],
4773 values[QSV_VERSION_MINOR]);
4774 ver = &tmp[0];
4775 }
4776
4777 /* Add Indicator of the Version of the Operating System */
4778 v = PyString_FromString(ver);
4779 if (!v || PyDict_SetItemString(d, "version", v) < 0)
4780 return -1;
4781 Py_DECREF(v);
4782
4783 /* Add Indicator of Which Drive was Used to Boot the System */
4784 tmp[0] = 'A' + values[QSV_BOOT_DRIVE] - 1;
4785 tmp[1] = ':';
4786 tmp[2] = '\0';
4787
4788 v = PyString_FromString(tmp);
4789 if (!v || PyDict_SetItemString(d, "bootdrive", v) < 0)
4790 return -1;
4791 Py_DECREF(v);
4792
4793 return 0;
4794}
4795#endif
4796
Barry Warsaw4a342091996-12-19 23:50:02 +00004797static int
4798all_ins(d)
4799 PyObject* d;
4800{
Guido van Rossum94f6f721999-01-06 18:42:14 +00004801#ifdef F_OK
4802 if (ins(d, "F_OK", (long)F_OK)) return -1;
4803#endif
4804#ifdef R_OK
4805 if (ins(d, "R_OK", (long)R_OK)) return -1;
4806#endif
4807#ifdef W_OK
4808 if (ins(d, "W_OK", (long)W_OK)) return -1;
4809#endif
4810#ifdef X_OK
4811 if (ins(d, "X_OK", (long)X_OK)) return -1;
4812#endif
Fred Drakec9680921999-12-13 16:37:25 +00004813#ifdef NGROUPS_MAX
4814 if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1;
4815#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004816#ifdef TMP_MAX
4817 if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1;
4818#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004819#ifdef WNOHANG
4820 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
4821#endif
4822#ifdef O_RDONLY
4823 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
4824#endif
4825#ifdef O_WRONLY
4826 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
4827#endif
4828#ifdef O_RDWR
4829 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
4830#endif
4831#ifdef O_NDELAY
4832 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
4833#endif
4834#ifdef O_NONBLOCK
4835 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
4836#endif
4837#ifdef O_APPEND
4838 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
4839#endif
4840#ifdef O_DSYNC
4841 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
4842#endif
4843#ifdef O_RSYNC
4844 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
4845#endif
4846#ifdef O_SYNC
4847 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
4848#endif
4849#ifdef O_NOCTTY
4850 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
4851#endif
4852#ifdef O_CREAT
4853 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
4854#endif
4855#ifdef O_EXCL
4856 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
4857#endif
4858#ifdef O_TRUNC
4859 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
4860#endif
Guido van Rossum98d9d091997-08-08 21:48:51 +00004861#ifdef O_BINARY
4862 if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
4863#endif
4864#ifdef O_TEXT
4865 if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
4866#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +00004867
Guido van Rossum246bc171999-02-01 23:54:31 +00004868#ifdef HAVE_SPAWNV
Guido van Rossum7d385291999-02-16 19:38:04 +00004869 if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1;
4870 if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1;
4871 if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1;
4872 if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1;
4873 if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1;
Guido van Rossum246bc171999-02-01 23:54:31 +00004874#endif
4875
Guido van Rossumd48f2521997-12-05 22:19:34 +00004876#if defined(PYOS_OS2)
4877 if (insertvalues(d)) return -1;
4878#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004879 return 0;
4880}
4881
4882
Guido van Rossumc5a0f531997-12-02 20:36:02 +00004883#if ( defined(_MSC_VER) || defined(__WATCOMC__) ) && !defined(__QNX__)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004884#define INITFUNC initnt
4885#define MODNAME "nt"
4886#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004887#if defined(PYOS_OS2)
4888#define INITFUNC initos2
4889#define MODNAME "os2"
4890#else
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004891#define INITFUNC initposix
4892#define MODNAME "posix"
4893#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004894#endif
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004895
Guido van Rossum3886bb61998-12-04 18:50:17 +00004896DL_EXPORT(void)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004897INITFUNC()
Guido van Rossumb6775db1994-08-01 11:34:53 +00004898{
Barry Warsaw53699e91996-12-10 23:23:01 +00004899 PyObject *m, *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00004900
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004901 m = Py_InitModule4(MODNAME,
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004902 posix_methods,
4903 posix__doc__,
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004904 (PyObject *)NULL,
4905 PYTHON_API_VERSION);
Barry Warsaw53699e91996-12-10 23:23:01 +00004906 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004907
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004908 /* Initialize environ dictionary */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004909 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00004910 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004911 return;
Barry Warsaw53699e91996-12-10 23:23:01 +00004912 Py_DECREF(v);
Fred Drakec9680921999-12-13 16:37:25 +00004913
Barry Warsaw4a342091996-12-19 23:50:02 +00004914 if (all_ins(d))
Barry Warsaw4a342091996-12-19 23:50:02 +00004915 return;
4916
Fred Drakebec628d1999-12-15 18:31:10 +00004917 if (setup_confname_tables(d))
4918 return;
4919
Barry Warsawca74da41999-02-09 19:31:45 +00004920 PyDict_SetItemString(d, "error", PyExc_OSError);
Fred Drake762e2061999-08-26 17:23:54 +00004921
Guido van Rossumb3d39562000-01-31 18:41:26 +00004922#ifdef HAVE_PUTENV
Fred Drake762e2061999-08-26 17:23:54 +00004923 posix_putenv_garbage = PyDict_New();
Guido van Rossumb3d39562000-01-31 18:41:26 +00004924#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004925}