blob: d85b91cc0b49753d1c47cd1f74bb2ff2f70eacd5 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* POSIX module implementation */
12
Guido van Rossuma4916fa1996-05-23 22:58:55 +000013/* This file is also used for Windows NT and MS-Win. In that case the module
Guido van Rossumad0ee831995-03-01 10:34:45 +000014 actually calls itself 'nt', not 'posix', and a few functions are
15 either unimplemented or implemented differently. The source
Guido van Rossum8d665e61996-06-26 18:22:49 +000016 assumes that for Windows NT, the macro 'MS_WIN32' is defined independent
Guido van Rossumad0ee831995-03-01 10:34:45 +000017 of the compiler used. Different compilers define their own feature
Guido van Rossuma4916fa1996-05-23 22:58:55 +000018 test macro, e.g. '__BORLANDC__' or '_MSC_VER'. */
Guido van Rossumad0ee831995-03-01 10:34:45 +000019
Guido van Rossuma4916fa1996-05-23 22:58:55 +000020/* See also ../Dos/dosmodule.c */
Guido van Rossumad0ee831995-03-01 10:34:45 +000021
Guido van Rossumec4f4ac1997-06-02 22:20:51 +000022static char posix__doc__ [] =
23"This module provides access to operating system functionality that is\n\
24standardized by the C Standard and the POSIX standard (a thinly\n\
25disguised Unix interface). Refer to the library manual and\n\
26corresponding Unix manual entries for more information on calls.";
27
Barry Warsaw53699e91996-12-10 23:23:01 +000028#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000029
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000030#if defined(PYOS_OS2)
31#define INCL_DOS
32#define INCL_DOSERRORS
33#define INCL_DOSPROCESS
34#define INCL_NOPMAPI
35#include <os2.h>
36#endif
37
Guido van Rossumb6775db1994-08-01 11:34:53 +000038#include <sys/types.h>
39#include <sys/stat.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +000040#ifdef HAVE_SYS_WAIT_H
41#include <sys/wait.h> /* For WNOHANG */
42#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000043
Guido van Rossuma376cc51996-12-05 23:43:35 +000044#ifdef HAVE_SIGNAL_H
45#include <signal.h>
46#endif
47
Guido van Rossumb6775db1994-08-01 11:34:53 +000048#include "mytime.h" /* For clock_t on some systems */
49
50#ifdef HAVE_FCNTL_H
51#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000052#endif /* HAVE_FCNTL_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +000053
Guido van Rossuma4916fa1996-05-23 22:58:55 +000054/* Various compilers have only certain posix functions */
Guido van Rossum6d8841c1997-08-14 19:57:39 +000055/* XXX Gosh I wish these were all moved into config.h */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000056#if defined(PYCC_VACPP) && defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000057#include <process.h>
58#else
Guido van Rossumc5a0f531997-12-02 20:36:02 +000059#if defined(__WATCOMC__) && !defined(__QNX__) /* Watcom compiler */
Guido van Rossuma4916fa1996-05-23 22:58:55 +000060#define HAVE_GETCWD 1
61#define HAVE_OPENDIR 1
62#define HAVE_SYSTEM 1
63#if defined(__OS2__)
64#define HAVE_EXECV 1
65#define HAVE_WAIT 1
Guido van Rossumad0ee831995-03-01 10:34:45 +000066#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +000067#include <process.h>
68#else
69#ifdef __BORLANDC__ /* Borland compiler */
70#define HAVE_EXECV 1
71#define HAVE_GETCWD 1
72#define HAVE_GETEGID 1
73#define HAVE_GETEUID 1
74#define HAVE_GETGID 1
75#define HAVE_GETPPID 1
76#define HAVE_GETUID 1
77#define HAVE_KILL 1
78#define HAVE_OPENDIR 1
79#define HAVE_PIPE 1
80#define HAVE_POPEN 1
81#define HAVE_SYSTEM 1
82#define HAVE_WAIT 1
83#else
84#ifdef _MSC_VER /* Microsoft compiler */
Guido van Rossum8d665e61996-06-26 18:22:49 +000085#define HAVE_GETCWD 1
86#ifdef MS_WIN32
Guido van Rossuma1065681999-01-25 23:20:23 +000087#define HAVE_SPAWNV 1
Guido van Rossuma4916fa1996-05-23 22:58:55 +000088#define HAVE_EXECV 1
89#define HAVE_PIPE 1
90#define HAVE_POPEN 1
91#define HAVE_SYSTEM 1
92#else /* 16-bit Windows */
Guido van Rossum8d665e61996-06-26 18:22:49 +000093#endif /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +000094#else /* all other compilers */
95/* Unix functions that the configure script doesn't check for */
96#define HAVE_EXECV 1
97#define HAVE_FORK 1
98#define HAVE_GETCWD 1
99#define HAVE_GETEGID 1
100#define HAVE_GETEUID 1
101#define HAVE_GETGID 1
102#define HAVE_GETPPID 1
103#define HAVE_GETUID 1
104#define HAVE_KILL 1
105#define HAVE_OPENDIR 1
106#define HAVE_PIPE 1
107#define HAVE_POPEN 1
108#define HAVE_SYSTEM 1
109#define HAVE_WAIT 1
Guido van Rossumd371ff11999-01-25 16:12:23 +0000110#define HAVE_TTYNAME 1
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000111#endif /* _MSC_VER */
112#endif /* __BORLANDC__ */
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000113#endif /* ! __WATCOMC__ || __QNX__ */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000114#endif /* ! __IBMC__ */
Guido van Rossumad0ee831995-03-01 10:34:45 +0000115
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000116#ifndef _MSC_VER
Guido van Rossum36bc6801995-06-14 22:54:23 +0000117
Guido van Rossumb6775db1994-08-01 11:34:53 +0000118#ifdef HAVE_UNISTD_H
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000119#include <unistd.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +0000120#endif
121
122#ifdef NeXT
123/* NeXT's <unistd.h> and <utime.h> aren't worth much */
124#undef HAVE_UNISTD_H
125#undef HAVE_UTIME_H
Guido van Rossumb9f866c1997-05-22 15:12:39 +0000126#define HAVE_WAITPID
Guido van Rossum36bc6801995-06-14 22:54:23 +0000127/* #undef HAVE_GETCWD */
Guido van Rossum54ecc3d1999-01-27 17:53:11 +0000128#define UNION_WAIT /* This should really be checked for by autoconf */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000129#endif
130
131#ifdef HAVE_UNISTD_H
Guido van Rossumad0ee831995-03-01 10:34:45 +0000132/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
133extern int rename();
134extern int pclose();
135extern int lstat();
136extern int symlink();
Guido van Rossum8c67e4e1999-04-07 15:49:41 +0000137extern int fsync();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000138#else /* !HAVE_UNISTD_H */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000139#if defined(PYCC_VACPP)
140extern int mkdir Py_PROTO((char *));
141#else
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000142#if ( defined(__WATCOMC__) || defined(_MSC_VER) ) && !defined(__QNX__)
Barry Warsaw53699e91996-12-10 23:23:01 +0000143extern int mkdir Py_PROTO((const char *));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000144#else
Barry Warsaw53699e91996-12-10 23:23:01 +0000145extern int mkdir Py_PROTO((const char *, mode_t));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000146#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000147#endif
148#if defined(__IBMC__) || defined(__IBMCPP__)
149extern int chdir Py_PROTO((char *));
150extern int rmdir Py_PROTO((char *));
151#else
Barry Warsaw53699e91996-12-10 23:23:01 +0000152extern int chdir Py_PROTO((const char *));
153extern int rmdir Py_PROTO((const char *));
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000154#endif
Barry Warsaw53699e91996-12-10 23:23:01 +0000155extern int chmod Py_PROTO((const char *, mode_t));
156extern int chown Py_PROTO((const char *, uid_t, gid_t));
157extern char *getcwd Py_PROTO((char *, int));
158extern char *strerror Py_PROTO((int));
159extern int link Py_PROTO((const char *, const char *));
160extern int rename Py_PROTO((const char *, const char *));
161extern int stat Py_PROTO((const char *, struct stat *));
162extern int unlink Py_PROTO((const char *));
163extern int pclose Py_PROTO((FILE *));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000164#ifdef HAVE_SYMLINK
Barry Warsaw53699e91996-12-10 23:23:01 +0000165extern int symlink Py_PROTO((const char *, const char *));
Guido van Rossuma38a5031995-02-17 15:11:36 +0000166#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000167#ifdef HAVE_LSTAT
Barry Warsaw53699e91996-12-10 23:23:01 +0000168extern int lstat Py_PROTO((const char *, struct stat *));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000169#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000170#endif /* !HAVE_UNISTD_H */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000171
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000172#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173
Guido van Rossumb6775db1994-08-01 11:34:53 +0000174#ifdef HAVE_UTIME_H
175#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000176#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000177
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000178#ifdef HAVE_SYS_UTIME_H
179#include <sys/utime.h>
180#define HAVE_UTIME_H /* pretend we do for the rest of this file */
181#endif /* HAVE_SYS_UTIME_H */
182
Guido van Rossumb6775db1994-08-01 11:34:53 +0000183#ifdef HAVE_SYS_TIMES_H
184#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000185#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000186
187#ifdef HAVE_SYS_PARAM_H
188#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000189#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000190
191#ifdef HAVE_SYS_UTSNAME_H
192#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000193#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000194
195#ifndef MAXPATHLEN
196#define MAXPATHLEN 1024
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000197#endif /* MAXPATHLEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000198
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000199#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000200#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000201#define NAMLEN(dirent) strlen((dirent)->d_name)
202#else
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000203#if defined(__WATCOMC__) && !defined(__QNX__)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000204#include <direct.h>
205#define NAMLEN(dirent) strlen((dirent)->d_name)
206#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000207#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000208#define NAMLEN(dirent) (dirent)->d_namlen
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000209#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000210#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000211#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000212#endif
213#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000214#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000215#endif
216#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000217#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000218#endif
219#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000220
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000221#ifdef _MSC_VER
Guido van Rossumb6775db1994-08-01 11:34:53 +0000222#include <direct.h>
223#include <io.h>
224#include <process.h>
225#include <windows.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000226#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000227#define popen _popen
Guido van Rossum794d8131994-08-23 13:48:48 +0000228#define pclose _pclose
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000229#else /* 16-bit Windows */
230#include <dos.h>
231#include <ctype.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000232#endif /* MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000233#endif /* _MSC_VER */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000234
Guido van Rossumd48f2521997-12-05 22:19:34 +0000235#if defined(PYCC_VACPP) && defined(PYOS_OS2)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000236#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000237#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238
Guido van Rossum54ecc3d1999-01-27 17:53:11 +0000239#ifdef UNION_WAIT
240/* Emulate some macros on systems that have a union instead of macros */
241
242#ifndef WIFEXITED
243#define WIFEXITED(u_wait) (!(u_wait).w_termsig && !(u_wait).w_coredump)
244#endif
245
246#ifndef WEXITSTATUS
247#define WEXITSTATUS(u_wait) (WIFEXITED(u_wait)?((u_wait).w_retcode):-1)
248#endif
249
250#ifndef WTERMSIG
251#define WTERMSIG(u_wait) ((u_wait).w_termsig)
252#endif
253
254#endif /* UNION_WAIT */
255
Greg Wardb48bc172000-03-01 21:51:56 +0000256/* Don't use the "_r" form if we don't need it (also, won't have a
257 prototype for it, at least on Solaris -- maybe others as well?). */
258#if defined(HAVE_CTERMID_R) && defined(WITH_THREAD)
259#define USE_CTERMID_R
260#endif
261
262#if defined(HAVE_TMPNAM_R) && defined(WITH_THREAD)
263#define USE_TMPNAM_R
264#endif
265
Fred Drake699f3522000-06-29 21:12:41 +0000266/* choose the appropriate stat and fstat functions and return structs */
Guido van Rossum64529cd2000-06-30 22:45:12 +0000267#undef STAT
Fred Drake699f3522000-06-29 21:12:41 +0000268#ifdef MS_WIN64
269# define STAT _stati64
270# define FSTAT _fstati64
271# define STRUCT_STAT struct _stati64
272#else
273# define STAT stat
274# define FSTAT fstat
275# define STRUCT_STAT struct stat
276#endif
277
278
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279/* Return a dictionary corresponding to the POSIX environment table */
280
Guido van Rossumc5a0f531997-12-02 20:36:02 +0000281#if !defined(_MSC_VER) && ( !defined(__WATCOMC__) || defined(__QNX__) )
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000283#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284
Barry Warsaw53699e91996-12-10 23:23:01 +0000285static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286convertenviron()
287{
Barry Warsaw53699e91996-12-10 23:23:01 +0000288 PyObject *d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289 char **e;
Barry Warsaw53699e91996-12-10 23:23:01 +0000290 d = PyDict_New();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 if (d == NULL)
292 return NULL;
293 if (environ == NULL)
294 return d;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000295 /* This part ignores errors */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296 for (e = environ; *e != NULL; e++) {
Guido van Rossum6a619f41999-08-03 19:41:10 +0000297 PyObject *k;
Barry Warsaw53699e91996-12-10 23:23:01 +0000298 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299 char *p = strchr(*e, '=');
300 if (p == NULL)
301 continue;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000302 k = PyString_FromStringAndSize(*e, (int)(p-*e));
303 if (k == NULL) {
304 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305 continue;
Guido van Rossum6a619f41999-08-03 19:41:10 +0000306 }
307 v = PyString_FromString(p+1);
308 if (v == NULL) {
309 PyErr_Clear();
310 Py_DECREF(k);
311 continue;
312 }
313 if (PyDict_GetItem(d, k) == NULL) {
314 if (PyDict_SetItem(d, k, v) != 0)
315 PyErr_Clear();
316 }
317 Py_DECREF(k);
Barry Warsaw53699e91996-12-10 23:23:01 +0000318 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319 }
Guido van Rossumd48f2521997-12-05 22:19:34 +0000320#if defined(PYOS_OS2)
321 {
322 APIRET rc;
323 char buffer[1024]; /* OS/2 Provides a Documented Max of 1024 Chars */
324
325 rc = DosQueryExtLIBPATH(buffer, BEGIN_LIBPATH);
326 if (rc == NO_ERROR) { /* (not a type, envname is NOT 'BEGIN_LIBPATH') */
327 PyObject *v = PyString_FromString(buffer);
328 PyDict_SetItemString(d, "BEGINLIBPATH", v);
329 Py_DECREF(v);
330 }
331 rc = DosQueryExtLIBPATH(buffer, END_LIBPATH);
332 if (rc == NO_ERROR) { /* (not a typo, envname is NOT 'END_LIBPATH') */
333 PyObject *v = PyString_FromString(buffer);
334 PyDict_SetItemString(d, "ENDLIBPATH", v);
335 Py_DECREF(v);
336 }
337 }
338#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339 return d;
340}
341
342
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343/* Set a POSIX-specific error from errno, and return NULL */
344
Barry Warsawd58d7641998-07-23 16:14:40 +0000345static PyObject *
346posix_error()
Guido van Rossumad0ee831995-03-01 10:34:45 +0000347{
Barry Warsawca74da41999-02-09 19:31:45 +0000348 return PyErr_SetFromErrno(PyExc_OSError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349}
Barry Warsawd58d7641998-07-23 16:14:40 +0000350static PyObject *
351posix_error_with_filename(name)
352 char* name;
353{
Barry Warsawca74da41999-02-09 19:31:45 +0000354 return PyErr_SetFromErrnoWithFilename(PyExc_OSError, name);
Barry Warsawd58d7641998-07-23 16:14:40 +0000355}
356
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000357
Guido van Rossumd48f2521997-12-05 22:19:34 +0000358#if defined(PYOS_OS2)
359/**********************************************************************
360 * Helper Function to Trim and Format OS/2 Messages
361 **********************************************************************/
362 static void
363os2_formatmsg(char *msgbuf, int msglen, char *reason)
364{
365 msgbuf[msglen] = '\0'; /* OS/2 Doesn't Guarantee a Terminator */
366
367 if (strlen(msgbuf) > 0) { /* If Non-Empty Msg, Trim CRLF */
368 char *lastc = &msgbuf[ strlen(msgbuf)-1 ];
369
370 while (lastc > msgbuf && isspace(*lastc))
371 *lastc-- = '\0'; /* Trim Trailing Whitespace (CRLF) */
372 }
373
374 /* Add Optional Reason Text */
375 if (reason) {
376 strcat(msgbuf, " : ");
377 strcat(msgbuf, reason);
378 }
379}
380
381/**********************************************************************
382 * Decode an OS/2 Operating System Error Code
383 *
384 * A convenience function to lookup an OS/2 error code and return a
385 * text message we can use to raise a Python exception.
386 *
387 * Notes:
388 * The messages for errors returned from the OS/2 kernel reside in
389 * the file OSO001.MSG in the \OS2 directory hierarchy.
390 *
391 **********************************************************************/
392 static char *
393os2_strerror(char *msgbuf, int msgbuflen, int errorcode, char *reason)
394{
395 APIRET rc;
396 ULONG msglen;
397
398 /* Retrieve Kernel-Related Error Message from OSO001.MSG File */
399 Py_BEGIN_ALLOW_THREADS
400 rc = DosGetMessage(NULL, 0, msgbuf, msgbuflen,
401 errorcode, "oso001.msg", &msglen);
402 Py_END_ALLOW_THREADS
403
404 if (rc == NO_ERROR)
405 os2_formatmsg(msgbuf, msglen, reason);
406 else
407 sprintf(msgbuf, "unknown OS error #%d", errorcode);
408
409 return msgbuf;
410}
411
412/* Set an OS/2-specific error and return NULL. OS/2 kernel
413 errors are not in a global variable e.g. 'errno' nor are
414 they congruent with posix error numbers. */
415
416static PyObject * os2_error(int code)
417{
418 char text[1024];
419 PyObject *v;
420
421 os2_strerror(text, sizeof(text), code, "");
422
423 v = Py_BuildValue("(is)", code, text);
424 if (v != NULL) {
Barry Warsawca74da41999-02-09 19:31:45 +0000425 PyErr_SetObject(PyExc_OSError, v);
Guido van Rossumd48f2521997-12-05 22:19:34 +0000426 Py_DECREF(v);
427 }
428 return NULL; /* Signal to Python that an Exception is Pending */
429}
430
431#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432
433/* POSIX generic methods */
434
Barry Warsaw53699e91996-12-10 23:23:01 +0000435static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000436posix_int(args, format, func)
Guido van Rossum21142a01999-01-08 21:05:37 +0000437 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000438 char *format;
Guido van Rossum21142a01999-01-08 21:05:37 +0000439 int (*func) Py_FPROTO((int));
440{
441 int fd;
442 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000443 if (!PyArg_ParseTuple(args, format, &fd))
Guido van Rossum21142a01999-01-08 21:05:37 +0000444 return NULL;
445 Py_BEGIN_ALLOW_THREADS
446 res = (*func)(fd);
447 Py_END_ALLOW_THREADS
448 if (res < 0)
449 return posix_error();
450 Py_INCREF(Py_None);
451 return Py_None;
452}
453
454
455static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000456posix_1str(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000457 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000458 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000459 int (*func) Py_FPROTO((const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000461 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000462 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000463 if (!PyArg_ParseTuple(args, format, &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000465 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000466 res = (*func)(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000467 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000468 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000469 return posix_error_with_filename(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000470 Py_INCREF(Py_None);
471 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472}
473
Barry Warsaw53699e91996-12-10 23:23:01 +0000474static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000475posix_2str(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000476 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000477 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000478 int (*func) Py_FPROTO((const char *, const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000479{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000480 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000481 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000482 if (!PyArg_ParseTuple(args, format, &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000483 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000484 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000485 res = (*func)(path1, path2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000486 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000487 if (res != 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000488 /* XXX how to report both path1 and path2??? */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000489 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000490 Py_INCREF(Py_None);
491 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000492}
493
Barry Warsaw53699e91996-12-10 23:23:01 +0000494static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000495posix_strint(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000496 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000497 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000498 int (*func) Py_FPROTO((const char *, int));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000499{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000500 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000501 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000502 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000503 if (!PyArg_ParseTuple(args, format, &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000504 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000505 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000506 res = (*func)(path, i);
Barry Warsaw53699e91996-12-10 23:23:01 +0000507 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000508 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000509 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +0000510 Py_INCREF(Py_None);
511 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000512}
513
Barry Warsaw53699e91996-12-10 23:23:01 +0000514static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000515posix_strintint(args, format, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000516 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000517 char *format;
Barry Warsaw53699e91996-12-10 23:23:01 +0000518 int (*func) Py_FPROTO((const char *, int, int));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000519{
520 char *path;
521 int i,i2;
522 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000523 if (!PyArg_ParseTuple(args, format, &path, &i, &i2))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000524 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000525 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000526 res = (*func)(path, i, i2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000527 Py_END_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000528 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000529 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +0000530 Py_INCREF(Py_None);
531 return Py_None;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000532}
533
Fred Drake699f3522000-06-29 21:12:41 +0000534
535
536/* pack a system stat C structure into the Python stat tuple
537 (used by posix_stat() and posix_fstat()) */
538static PyObject*
539_pystat_fromstructstat(st)
540 STRUCT_STAT st;
541{
542 PyObject *v = PyTuple_New(10);
543 if (v == NULL)
544 return NULL;
545
546 PyTuple_SetItem(v, 0, PyInt_FromLong((long)st.st_mode));
547#ifdef HAVE_LARGEFILE_SUPPORT
548 PyTuple_SetItem(v, 1, PyLong_FromLongLong((LONG_LONG)st.st_ino));
549#else
550 PyTuple_SetItem(v, 1, PyInt_FromLong((long)st.st_ino));
551#endif
552#if defined(HAVE_LONG_LONG) && !defined(MS_WINDOWS)
553 PyTuple_SetItem(v, 2, PyLong_FromLongLong((LONG_LONG)st.st_dev));
554#else
555 PyTuple_SetItem(v, 2, PyInt_FromLong((long)st.st_dev));
556#endif
557 PyTuple_SetItem(v, 3, PyInt_FromLong((long)st.st_nlink));
558 PyTuple_SetItem(v, 4, PyInt_FromLong((long)st.st_uid));
559 PyTuple_SetItem(v, 5, PyInt_FromLong((long)st.st_gid));
560#ifdef HAVE_LARGEFILE_SUPPORT
561 PyTuple_SetItem(v, 6, PyLong_FromLongLong((LONG_LONG)st.st_size));
562#else
563 PyTuple_SetItem(v, 6, PyInt_FromLong(st.st_size));
564#endif
565#if SIZEOF_TIME_T > SIZEOF_LONG
566 PyTuple_SetItem(v, 7, PyLong_FromLongLong((LONG_LONG)st.st_atime));
567 PyTuple_SetItem(v, 8, PyLong_FromLongLong((LONG_LONG)st.st_mtime));
568 PyTuple_SetItem(v, 9, PyLong_FromLongLong((LONG_LONG)st.st_ctime));
569#else
570 PyTuple_SetItem(v, 7, PyInt_FromLong((long)st.st_atime));
571 PyTuple_SetItem(v, 8, PyInt_FromLong((long)st.st_mtime));
572 PyTuple_SetItem(v, 9, PyInt_FromLong((long)st.st_ctime));
573#endif
574
575 if (PyErr_Occurred()) {
576 Py_DECREF(v);
577 return NULL;
578 }
579
580 return v;
581}
582
583
Barry Warsaw53699e91996-12-10 23:23:01 +0000584static PyObject *
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000585posix_do_stat(self, args, format, statfunc)
Barry Warsaw53699e91996-12-10 23:23:01 +0000586 PyObject *self;
587 PyObject *args;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000588 char *format;
Fred Drake699f3522000-06-29 21:12:41 +0000589 int (*statfunc) Py_FPROTO((const char *, STRUCT_STAT *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000590{
Fred Drake699f3522000-06-29 21:12:41 +0000591 STRUCT_STAT st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000592 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000593 int res;
Guido van Rossumace88ae2000-04-21 18:54:45 +0000594
595#ifdef MS_WIN32
596 int pathlen;
597 char pathcopy[MAX_PATH];
598#endif /* MS_WIN32 */
599
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000600 if (!PyArg_ParseTuple(args, format, &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000601 return NULL;
Guido van Rossumace88ae2000-04-21 18:54:45 +0000602
603#ifdef MS_WIN32
604 pathlen = strlen(path);
605 /* the library call can blow up if the file name is too long! */
606 if (pathlen > MAX_PATH) {
607 errno = ENAMETOOLONG;
608 return posix_error();
609 }
610
611 if ((pathlen > 0) && (path[pathlen-1] == '\\' || path[pathlen-1] == '/')) {
Guido van Rossum19dde102000-05-03 02:44:55 +0000612 /* exception for specific or current drive root */
613 if (!((pathlen == 1) ||
614 ((pathlen == 3) &&
Guido van Rossumace88ae2000-04-21 18:54:45 +0000615 (path[1] == ':') &&
Guido van Rossum19dde102000-05-03 02:44:55 +0000616 (path[2] == '\\' || path[2] == '/'))))
Guido van Rossumace88ae2000-04-21 18:54:45 +0000617 {
618 strncpy(pathcopy, path, pathlen);
619 pathcopy[pathlen-1] = '\0'; /* nuke the trailing backslash */
620 path = pathcopy;
621 }
622 }
623#endif /* MS_WIN32 */
624
Barry Warsaw53699e91996-12-10 23:23:01 +0000625 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000626 res = (*statfunc)(path, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +0000627 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000628 if (res != 0)
Barry Warsawd58d7641998-07-23 16:14:40 +0000629 return posix_error_with_filename(path);
Fred Drake699f3522000-06-29 21:12:41 +0000630
631 return _pystat_fromstructstat(st);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000632}
633
634
635/* POSIX methods */
636
Guido van Rossum94f6f721999-01-06 18:42:14 +0000637static char posix_access__doc__[] =
Guido van Rossum015f22a1999-01-06 22:52:38 +0000638"access(path, mode) -> 1 if granted, 0 otherwise\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +0000639Test for access to a file.";
640
641static PyObject *
642posix_access(self, args)
643 PyObject *self;
644 PyObject *args;
645{
Guido van Rossum015f22a1999-01-06 22:52:38 +0000646 char *path;
647 int mode;
648 int res;
649
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000650 if (!PyArg_ParseTuple(args, "si:access", &path, &mode))
Guido van Rossum015f22a1999-01-06 22:52:38 +0000651 return NULL;
652 Py_BEGIN_ALLOW_THREADS
653 res = access(path, mode);
654 Py_END_ALLOW_THREADS
655 return(PyInt_FromLong(res == 0 ? 1L : 0L));
Guido van Rossum94f6f721999-01-06 18:42:14 +0000656}
657
Guido van Rossumd371ff11999-01-25 16:12:23 +0000658#ifndef F_OK
659#define F_OK 0
660#endif
661#ifndef R_OK
662#define R_OK 4
663#endif
664#ifndef W_OK
665#define W_OK 2
666#endif
667#ifndef X_OK
668#define X_OK 1
669#endif
670
671#ifdef HAVE_TTYNAME
Guido van Rossum94f6f721999-01-06 18:42:14 +0000672static char posix_ttyname__doc__[] =
Guido van Rossum61eeb041999-02-22 15:29:15 +0000673"ttyname(fd) -> String\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +0000674Return the name of the terminal device connected to 'fd'.";
675
676static PyObject *
677posix_ttyname(self, args)
678 PyObject *self;
679 PyObject *args;
680{
Guido van Rossum94f6f721999-01-06 18:42:14 +0000681 int id;
682 char *ret;
683
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000684 if (!PyArg_ParseTuple(args, "i:ttyname", &id))
Guido van Rossum94f6f721999-01-06 18:42:14 +0000685 return NULL;
686
Guido van Rossum94f6f721999-01-06 18:42:14 +0000687 ret = ttyname(id);
688 if (ret == NULL)
689 return(posix_error());
690 return(PyString_FromString(ret));
691}
Guido van Rossumd371ff11999-01-25 16:12:23 +0000692#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +0000693
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000694#ifdef HAVE_CTERMID
695static char posix_ctermid__doc__[] =
696"ctermid() -> String\n\
697Return the name of the controlling terminal for this process.";
698
699static PyObject *
700posix_ctermid(self, args)
701 PyObject *self;
702 PyObject *args;
703{
704 char *ret;
705 char buffer[L_ctermid];
706
707 if (!PyArg_ParseTuple(args, ":ctermid"))
708 return NULL;
709
Greg Wardb48bc172000-03-01 21:51:56 +0000710#ifdef USE_CTERMID_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000711 ret = ctermid_r(buffer);
712#else
713 ret = ctermid(buffer);
714#endif
715 if (ret == NULL)
716 return(posix_error());
717 return(PyString_FromString(buffer));
718}
719#endif
720
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000721static char posix_chdir__doc__[] =
722"chdir(path) -> None\n\
723Change the current working directory to the specified path.";
724
Barry Warsaw53699e91996-12-10 23:23:01 +0000725static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000726posix_chdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000727 PyObject *self;
728 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000729{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000730 return posix_1str(args, "s:chdir", chdir);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000731}
732
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000733
734static char posix_chmod__doc__[] =
735"chmod(path, mode) -> None\n\
736Change the access permissions of a file.";
737
Barry Warsaw53699e91996-12-10 23:23:01 +0000738static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000739posix_chmod(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000740 PyObject *self;
741 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000742{
Guido van Rossumffd15f52000-03-31 00:47:28 +0000743 char *path;
744 int i;
745 int res;
Guido van Rossum49679b42000-03-31 00:48:21 +0000746 if (!PyArg_ParseTuple(args, "si", &path, &i))
Guido van Rossumffd15f52000-03-31 00:47:28 +0000747 return NULL;
748 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef40e772000-03-31 01:26:23 +0000749 res = chmod(path, i);
Guido van Rossumffd15f52000-03-31 00:47:28 +0000750 Py_END_ALLOW_THREADS
751 if (res < 0)
752 return posix_error_with_filename(path);
753 Py_INCREF(Py_None);
754 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000755}
756
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000757
Guido van Rossum21142a01999-01-08 21:05:37 +0000758#ifdef HAVE_FSYNC
759static char posix_fsync__doc__[] =
760"fsync(fildes) -> None\n\
761force write of file with filedescriptor to disk.";
762
763static PyObject *
764posix_fsync(self, args)
765 PyObject *self;
766 PyObject *args;
767{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000768 return posix_int(args, "i:fsync", fsync);
Guido van Rossum21142a01999-01-08 21:05:37 +0000769}
770#endif /* HAVE_FSYNC */
771
772#ifdef HAVE_FDATASYNC
773static char posix_fdatasync__doc__[] =
774"fdatasync(fildes) -> None\n\
775force write of file with filedescriptor to disk.\n\
776 does not force update of metadata.";
777
Guido van Rossum5d00b6d1999-01-08 21:28:05 +0000778extern int fdatasync(int); /* Prototype just in case */
779
Guido van Rossum21142a01999-01-08 21:05:37 +0000780static PyObject *
781posix_fdatasync(self, args)
782 PyObject *self;
783 PyObject *args;
784{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000785 return posix_int(args, "i:fdatasync", fdatasync);
Guido van Rossum21142a01999-01-08 21:05:37 +0000786}
787#endif /* HAVE_FDATASYNC */
788
789
Guido van Rossumb6775db1994-08-01 11:34:53 +0000790#ifdef HAVE_CHOWN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000791static char posix_chown__doc__[] =
792"chown(path, uid, gid) -> None\n\
793Change the owner and group id of path to the numeric uid and gid.";
794
Barry Warsaw53699e91996-12-10 23:23:01 +0000795static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000796posix_chown(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000797 PyObject *self;
798 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000799{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000800 return posix_strintint(args, "sii:chown", chown);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000801}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000802#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000803
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000804
Guido van Rossum36bc6801995-06-14 22:54:23 +0000805#ifdef HAVE_GETCWD
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000806static char posix_getcwd__doc__[] =
807"getcwd() -> path\n\
808Return a string representing the current working directory.";
809
Barry Warsaw53699e91996-12-10 23:23:01 +0000810static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000811posix_getcwd(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000812 PyObject *self;
813 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000814{
815 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000816 char *res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000817 if (!PyArg_ParseTuple(args, ":getcwd"))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000818 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000819 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000820 res = getcwd(buf, sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +0000821 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000822 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000823 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000824 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000825}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000826#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000827
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000828
Guido van Rossumb6775db1994-08-01 11:34:53 +0000829#ifdef HAVE_LINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000830static char posix_link__doc__[] =
831"link(src, dst) -> None\n\
832Create a hard link to a file.";
833
Barry Warsaw53699e91996-12-10 23:23:01 +0000834static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000835posix_link(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000836 PyObject *self;
837 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000838{
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000839 return posix_2str(args, "ss:link", link);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000840}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000841#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000842
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000843
844static char posix_listdir__doc__[] =
845"listdir(path) -> list_of_strings\n\
846Return a list containing the names of the entries in the directory.\n\
847\n\
848 path: path of directory to list\n\
849\n\
850The list is in arbitrary order. It does not include the special\n\
851entries '.' and '..' even if they are present in the directory.";
852
Barry Warsaw53699e91996-12-10 23:23:01 +0000853static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000854posix_listdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000855 PyObject *self;
856 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000857{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000858 /* XXX Should redo this putting the (now four) versions of opendir
Guido van Rossum6d8841c1997-08-14 19:57:39 +0000859 in separate files instead of having them all here... */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000860#if defined(MS_WIN32) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000861
Guido van Rossumb6775db1994-08-01 11:34:53 +0000862 char *name;
863 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000864 PyObject *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000865 HANDLE hFindFile;
866 WIN32_FIND_DATA FileData;
867 char namebuf[MAX_PATH+5];
868
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000869 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000870 return NULL;
871 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000872 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000873 return NULL;
874 }
875 strcpy(namebuf, name);
876 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
877 namebuf[len++] = '/';
878 strcpy(namebuf + len, "*.*");
879
Barry Warsaw53699e91996-12-10 23:23:01 +0000880 if ((d = PyList_New(0)) == NULL)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000881 return NULL;
882
883 hFindFile = FindFirstFile(namebuf, &FileData);
884 if (hFindFile == INVALID_HANDLE_VALUE) {
885 errno = GetLastError();
Guido van Rossum617bc191998-08-06 03:23:32 +0000886 if (errno == ERROR_FILE_NOT_FOUND)
887 return PyList_New(0);
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000888 return posix_error_with_filename(name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000889 }
890 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000891 if (FileData.cFileName[0] == '.' &&
892 (FileData.cFileName[1] == '\0' ||
893 FileData.cFileName[1] == '.' &&
894 FileData.cFileName[2] == '\0'))
895 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000896 v = PyString_FromString(FileData.cFileName);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000897 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000898 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000899 d = NULL;
900 break;
901 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000902 if (PyList_Append(d, v) != 0) {
903 Py_DECREF(v);
904 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000905 d = NULL;
906 break;
907 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000908 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000909 } while (FindNextFile(hFindFile, &FileData) == TRUE);
910
911 if (FindClose(hFindFile) == FALSE) {
912 errno = GetLastError();
Andrew M. Kuchling54c8dc22000-06-06 20:52:17 +0000913 return posix_error_with_filename(name);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000914 }
915
916 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000917
Guido van Rossum8d665e61996-06-26 18:22:49 +0000918#else /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000919#ifdef _MSC_VER /* 16-bit Windows */
920
921#ifndef MAX_PATH
922#define MAX_PATH 250
923#endif
924 char *name, *pt;
925 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000926 PyObject *d, *v;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000927 char namebuf[MAX_PATH+5];
928 struct _find_t ep;
929
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000930 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000931 return NULL;
932 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000933 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000934 return NULL;
935 }
936 strcpy(namebuf, name);
937 for (pt = namebuf; *pt; pt++)
938 if (*pt == '/')
939 *pt = '\\';
940 if (namebuf[len-1] != '\\')
941 namebuf[len++] = '\\';
942 strcpy(namebuf + len, "*.*");
943
Barry Warsaw53699e91996-12-10 23:23:01 +0000944 if ((d = PyList_New(0)) == NULL)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000945 return NULL;
946
947 if (_dos_findfirst(namebuf, _A_RDONLY |
Barry Warsaw43d68b81996-12-19 22:10:44 +0000948 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0)
949 {
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000950 errno = ENOENT;
Barry Warsawf63b8cc1999-05-27 23:13:21 +0000951 return posix_error_with_filename(name);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000952 }
953 do {
954 if (ep.name[0] == '.' &&
955 (ep.name[1] == '\0' ||
956 ep.name[1] == '.' &&
957 ep.name[2] == '\0'))
958 continue;
959 strcpy(namebuf, ep.name);
960 for (pt = namebuf; *pt; pt++)
961 if (isupper(*pt))
962 *pt = tolower(*pt);
Barry Warsaw53699e91996-12-10 23:23:01 +0000963 v = PyString_FromString(namebuf);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000964 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000965 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000966 d = NULL;
967 break;
968 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000969 if (PyList_Append(d, v) != 0) {
970 Py_DECREF(v);
971 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000972 d = NULL;
973 break;
974 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000975 Py_DECREF(v);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000976 } while (_dos_findnext(&ep) == 0);
977
978 return d;
979
980#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000981#if defined(PYOS_OS2)
982
983#ifndef MAX_PATH
984#define MAX_PATH CCHMAXPATH
985#endif
986 char *name, *pt;
987 int len;
988 PyObject *d, *v;
989 char namebuf[MAX_PATH+5];
990 HDIR hdir = 1;
991 ULONG srchcnt = 1;
992 FILEFINDBUF3 ep;
993 APIRET rc;
994
Fred Drake5ab8eaf1999-12-09 21:13:07 +0000995 if (!PyArg_ParseTuple(args, "t#:listdir", &name, &len))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000996 return NULL;
997 if (len >= MAX_PATH) {
998 PyErr_SetString(PyExc_ValueError, "path too long");
999 return NULL;
1000 }
1001 strcpy(namebuf, name);
1002 for (pt = namebuf; *pt; pt++)
1003 if (*pt == '/')
1004 *pt = '\\';
1005 if (namebuf[len-1] != '\\')
1006 namebuf[len++] = '\\';
1007 strcpy(namebuf + len, "*.*");
1008
1009 if ((d = PyList_New(0)) == NULL)
1010 return NULL;
1011
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001012 rc = DosFindFirst(namebuf, /* Wildcard Pattern to Match */
1013 &hdir, /* Handle to Use While Search Directory */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001014 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001015 &ep, sizeof(ep), /* Structure to Receive Directory Entry */
1016 &srchcnt, /* Max and Actual Count of Entries Per Iteration */
1017 FIL_STANDARD); /* Format of Entry (EAs or Not) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001018
1019 if (rc != NO_ERROR) {
1020 errno = ENOENT;
Barry Warsawf63b8cc1999-05-27 23:13:21 +00001021 return posix_error_with_filename(name);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001022 }
1023
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001024 if (srchcnt > 0) { /* If Directory is NOT Totally Empty, */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001025 do {
1026 if (ep.achName[0] == '.'
1027 && (ep.achName[1] == '\0' || ep.achName[1] == '.' && ep.achName[2] == '\0'))
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001028 continue; /* Skip Over "." and ".." Names */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001029
1030 strcpy(namebuf, ep.achName);
1031
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001032 /* Leave Case of Name Alone -- In Native Form */
1033 /* (Removed Forced Lowercasing Code) */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001034
1035 v = PyString_FromString(namebuf);
1036 if (v == NULL) {
1037 Py_DECREF(d);
1038 d = NULL;
1039 break;
1040 }
1041 if (PyList_Append(d, v) != 0) {
1042 Py_DECREF(v);
1043 Py_DECREF(d);
1044 d = NULL;
1045 break;
1046 }
1047 Py_DECREF(v);
1048 } while (DosFindNext(hdir, &ep, sizeof(ep), &srchcnt) == NO_ERROR && srchcnt > 0);
1049 }
1050
1051 return d;
1052#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001053
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001054 char *name;
Barry Warsaw53699e91996-12-10 23:23:01 +00001055 PyObject *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001056 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001057 struct dirent *ep;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001058 if (!PyArg_ParseTuple(args, "s:listdir", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001059 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001060 if ((dirp = opendir(name)) == NULL) {
Barry Warsawf63b8cc1999-05-27 23:13:21 +00001061 return posix_error_with_filename(name);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001062 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001063 if ((d = PyList_New(0)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001064 closedir(dirp);
1065 return NULL;
1066 }
1067 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +00001068 if (ep->d_name[0] == '.' &&
1069 (NAMLEN(ep) == 1 ||
Guido van Rossuma376cc51996-12-05 23:43:35 +00001070 (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
Guido van Rossum24f42ac1995-07-18 18:16:52 +00001071 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +00001072 v = PyString_FromStringAndSize(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001073 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001074 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001075 d = NULL;
1076 break;
1077 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001078 if (PyList_Append(d, v) != 0) {
1079 Py_DECREF(v);
1080 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001081 d = NULL;
1082 break;
1083 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001084 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001085 }
1086 closedir(dirp);
Guido van Rossum0ee42cd1991-04-08 21:01:03 +00001087
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001088 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001089
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001090#endif /* !PYOS_OS2 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001091#endif /* !_MSC_VER */
Guido van Rossum8d665e61996-06-26 18:22:49 +00001092#endif /* !MS_WIN32 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001093}
1094
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001095static char posix_mkdir__doc__[] =
1096"mkdir(path [, mode=0777]) -> None\n\
1097Create a directory.";
1098
Barry Warsaw53699e91996-12-10 23:23:01 +00001099static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001100posix_mkdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001101 PyObject *self;
1102 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001103{
Guido van Rossumb0824db1996-02-25 04:50:32 +00001104 int res;
1105 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001106 int mode = 0777;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001107 if (!PyArg_ParseTuple(args, "s|i:mkdir", &path, &mode))
Guido van Rossumb0824db1996-02-25 04:50:32 +00001108 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001109 Py_BEGIN_ALLOW_THREADS
Guido van Rossumc5a0f531997-12-02 20:36:02 +00001110#if ( defined(__WATCOMC__) || defined(_MSC_VER) || defined(PYCC_VACPP) ) && !defined(__QNX__)
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001111 res = mkdir(path);
1112#else
Guido van Rossumb0824db1996-02-25 04:50:32 +00001113 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001114#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001115 Py_END_ALLOW_THREADS
Guido van Rossumb0824db1996-02-25 04:50:32 +00001116 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00001117 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00001118 Py_INCREF(Py_None);
1119 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001120}
1121
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001122
Guido van Rossumb6775db1994-08-01 11:34:53 +00001123#ifdef HAVE_NICE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001124static char posix_nice__doc__[] =
1125"nice(inc) -> new_priority\n\
1126Decrease the priority of process and return new priority.";
1127
Barry Warsaw53699e91996-12-10 23:23:01 +00001128static PyObject *
Guido van Rossum775f4da1993-01-09 17:18:52 +00001129posix_nice(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001130 PyObject *self;
1131 PyObject *args;
Guido van Rossum775f4da1993-01-09 17:18:52 +00001132{
1133 int increment, value;
1134
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001135 if (!PyArg_ParseTuple(args, "i:nice", &increment))
Guido van Rossum775f4da1993-01-09 17:18:52 +00001136 return NULL;
1137 value = nice(increment);
1138 if (value == -1)
1139 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001140 return PyInt_FromLong((long) value);
Guido van Rossum775f4da1993-01-09 17:18:52 +00001141}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001142#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001143
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001144
1145static char posix_rename__doc__[] =
1146"rename(old, new) -> None\n\
1147Rename a file or directory.";
1148
Barry Warsaw53699e91996-12-10 23:23:01 +00001149static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001150posix_rename(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001151 PyObject *self;
1152 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001153{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001154 return posix_2str(args, "ss:rename", rename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001155}
1156
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001157
1158static char posix_rmdir__doc__[] =
1159"rmdir(path) -> None\n\
1160Remove a directory.";
1161
Barry Warsaw53699e91996-12-10 23:23:01 +00001162static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001163posix_rmdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001164 PyObject *self;
1165 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001166{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001167 return posix_1str(args, "s:rmdir", rmdir);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001168}
1169
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001170
1171static char posix_stat__doc__[] =
1172"stat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
1173Perform a stat system call on the given path.";
1174
Barry Warsaw53699e91996-12-10 23:23:01 +00001175static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001176posix_stat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001177 PyObject *self;
1178 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001179{
Fred Drake699f3522000-06-29 21:12:41 +00001180 return posix_do_stat(self, args, "s:stat", STAT);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001181}
1182
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001183
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001184#ifdef HAVE_SYSTEM
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001185static char posix_system__doc__[] =
1186"system(command) -> exit_status\n\
1187Execute the command (a string) in a subshell.";
1188
Barry Warsaw53699e91996-12-10 23:23:01 +00001189static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001190posix_system(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001191 PyObject *self;
1192 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001193{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001194 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001195 long sts;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001196 if (!PyArg_ParseTuple(args, "s:system", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001197 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001198 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001199 sts = system(command);
Barry Warsaw53699e91996-12-10 23:23:01 +00001200 Py_END_ALLOW_THREADS
1201 return PyInt_FromLong(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001202}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001203#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001204
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001205
1206static char posix_umask__doc__[] =
1207"umask(new_mask) -> old_mask\n\
1208Set the current numeric umask and return the previous umask.";
1209
Barry Warsaw53699e91996-12-10 23:23:01 +00001210static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001211posix_umask(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001212 PyObject *self;
1213 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001214{
1215 int i;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001216 if (!PyArg_ParseTuple(args, "i:umask", &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001217 return NULL;
1218 i = umask(i);
1219 if (i < 0)
1220 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001221 return PyInt_FromLong((long)i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001222}
1223
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001224
1225static char posix_unlink__doc__[] =
1226"unlink(path) -> None\n\
1227Remove a file (same as remove(path)).";
1228
1229static char posix_remove__doc__[] =
1230"remove(path) -> None\n\
1231Remove a file (same as unlink(path)).";
1232
Barry Warsaw53699e91996-12-10 23:23:01 +00001233static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001234posix_unlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001235 PyObject *self;
1236 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001237{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001238 return posix_1str(args, "s:remove", unlink);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001239}
1240
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001241
Guido van Rossumb6775db1994-08-01 11:34:53 +00001242#ifdef HAVE_UNAME
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001243static char posix_uname__doc__[] =
1244"uname() -> (sysname, nodename, release, version, machine)\n\
1245Return a tuple identifying the current operating system.";
1246
Barry Warsaw53699e91996-12-10 23:23:01 +00001247static PyObject *
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001248posix_uname(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001249 PyObject *self;
1250 PyObject *args;
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001251{
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001252 struct utsname u;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001253 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001254 if (!PyArg_ParseTuple(args, ":uname"))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001255 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001256 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001257 res = uname(&u);
Barry Warsaw53699e91996-12-10 23:23:01 +00001258 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +00001259 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001260 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001261 return Py_BuildValue("(sssss)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00001262 u.sysname,
1263 u.nodename,
1264 u.release,
1265 u.version,
1266 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001267}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001268#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001269
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001270
1271static char posix_utime__doc__[] =
1272"utime(path, (atime, utime)) -> None\n\
Barry Warsaw3cef8562000-05-01 16:17:24 +00001273utime(path, None) -> None\n\
1274Set the access and modified time of the file to the given values. If the\n\
1275second form is used, set the access and modified times to the current time.";
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001276
Barry Warsaw53699e91996-12-10 23:23:01 +00001277static PyObject *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001278posix_utime(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001279 PyObject *self;
1280 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001281{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001282 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +00001283 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001284 int res;
Barry Warsaw3cef8562000-05-01 16:17:24 +00001285 PyObject* arg;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001286
Guido van Rossum6d8841c1997-08-14 19:57:39 +00001287/* XXX should define struct utimbuf instead, above */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001288#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001289 struct utimbuf buf;
1290#define ATIME buf.actime
1291#define MTIME buf.modtime
1292#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001293#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001294 time_t buf[2];
1295#define ATIME buf[0]
1296#define MTIME buf[1]
1297#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001298#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001299
Barry Warsaw3cef8562000-05-01 16:17:24 +00001300 if (!PyArg_ParseTuple(args, "sO:utime", &path, &arg))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001301 return NULL;
Barry Warsaw3cef8562000-05-01 16:17:24 +00001302 if (arg == Py_None) {
1303 /* optional time values not given */
1304 Py_BEGIN_ALLOW_THREADS
1305 res = utime(path, NULL);
1306 Py_END_ALLOW_THREADS
1307 }
1308 else if (!PyArg_Parse(arg, "(ll)", &atime, &mtime)) {
1309 PyErr_SetString(PyExc_TypeError,
1310 "Second argument must be a 2-tuple of numbers.");
1311 return NULL;
1312 }
1313 else {
1314 ATIME = atime;
1315 MTIME = mtime;
1316 Py_BEGIN_ALLOW_THREADS
1317 res = utime(path, UTIME_ARG);
1318 Py_END_ALLOW_THREADS
1319 }
Guido van Rossumff4949e1992-08-05 19:58:53 +00001320 if (res < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00001321 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00001322 Py_INCREF(Py_None);
1323 return Py_None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001324#undef UTIME_ARG
1325#undef ATIME
1326#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001327}
1328
Guido van Rossum85e3b011991-06-03 12:42:10 +00001329
Guido van Rossum3b066191991-06-04 19:40:25 +00001330/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001331
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001332static char posix__exit__doc__[] =
1333"_exit(status)\n\
1334Exit to the system with specified status, without normal exit processing.";
1335
Barry Warsaw53699e91996-12-10 23:23:01 +00001336static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001337posix__exit(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001338 PyObject *self;
1339 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001340{
1341 int sts;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001342 if (!PyArg_ParseTuple(args, "i:_exit", &sts))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001343 return NULL;
1344 _exit(sts);
Guido van Rossuma376cc51996-12-05 23:43:35 +00001345 return NULL; /* Make gcc -Wall happy */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001346}
1347
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001348
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001349#ifdef HAVE_EXECV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001350static char posix_execv__doc__[] =
1351"execv(path, args)\n\
1352Execute an executable path with arguments, replacing current process.\n\
1353\n\
1354 path: path of executable file\n\
1355 args: tuple or list of strings";
1356
Barry Warsaw53699e91996-12-10 23:23:01 +00001357static PyObject *
Guido van Rossum89b33251993-10-22 14:26:06 +00001358posix_execv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001359 PyObject *self;
1360 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001361{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001362 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00001363 PyObject *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001364 char **argvlist;
1365 int i, argc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001366 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossum85e3b011991-06-03 12:42:10 +00001367
Guido van Rossum89b33251993-10-22 14:26:06 +00001368 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +00001369 argv is a list or tuple of strings. */
1370
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001371 if (!PyArg_ParseTuple(args, "sO:execv", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001372 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001373 if (PyList_Check(argv)) {
1374 argc = PyList_Size(argv);
1375 getitem = PyList_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001376 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001377 else if (PyTuple_Check(argv)) {
1378 argc = PyTuple_Size(argv);
1379 getitem = PyTuple_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001380 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001381 else {
Guido van Rossum50422b42000-04-26 20:34:28 +00001382 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
1383 return NULL;
1384 }
1385
1386 if (argc == 0) {
1387 PyErr_SetString(PyExc_ValueError, "empty argument list");
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001388 return NULL;
1389 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00001390
Barry Warsaw53699e91996-12-10 23:23:01 +00001391 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001392 if (argvlist == NULL)
1393 return NULL;
1394 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001395 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
1396 PyMem_DEL(argvlist);
Guido van Rossum50422b42000-04-26 20:34:28 +00001397 PyErr_SetString(PyExc_TypeError,
1398 "all arguments must be strings");
1399 return NULL;
1400
Guido van Rossum85e3b011991-06-03 12:42:10 +00001401 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00001402 }
1403 argvlist[argc] = NULL;
1404
Guido van Rossumb6775db1994-08-01 11:34:53 +00001405#ifdef BAD_EXEC_PROTOTYPES
1406 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001407#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001408 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001409#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001410
Guido van Rossum85e3b011991-06-03 12:42:10 +00001411 /* If we get here it's definitely an error */
1412
Barry Warsaw53699e91996-12-10 23:23:01 +00001413 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001414 return posix_error();
1415}
1416
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001417
1418static char posix_execve__doc__[] =
1419"execve(path, args, env)\n\
1420Execute a path with arguments and environment, replacing current process.\n\
1421\n\
1422 path: path of executable file\n\
1423 args: tuple or list of arguments\n\
1424 env: dictonary of strings mapping to strings";
1425
Barry Warsaw53699e91996-12-10 23:23:01 +00001426static PyObject *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001427posix_execve(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001428 PyObject *self;
1429 PyObject *args;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001430{
1431 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00001432 PyObject *argv, *env;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001433 char **argvlist;
1434 char **envlist;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001435 PyObject *key, *val, *keys=NULL, *vals=NULL;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001436 int i, pos, argc, envc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001437 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001438
1439 /* execve has three arguments: (path, argv, env), where
1440 argv is a list or tuple of strings and env is a dictionary
1441 like posix.environ. */
1442
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001443 if (!PyArg_ParseTuple(args, "sOO:execve", &path, &argv, &env))
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001444 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001445 if (PyList_Check(argv)) {
1446 argc = PyList_Size(argv);
1447 getitem = PyList_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001448 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001449 else if (PyTuple_Check(argv)) {
1450 argc = PyTuple_Size(argv);
1451 getitem = PyTuple_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001452 }
1453 else {
Barry Warsaw53699e91996-12-10 23:23:01 +00001454 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001455 return NULL;
1456 }
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001457 if (!PyMapping_Check(env)) {
1458 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001459 return NULL;
1460 }
1461
Guido van Rossum50422b42000-04-26 20:34:28 +00001462 if (argc == 0) {
1463 PyErr_SetString(PyExc_ValueError,
1464 "empty argument list");
1465 return NULL;
1466 }
1467
Barry Warsaw53699e91996-12-10 23:23:01 +00001468 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001469 if (argvlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001470 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001471 return NULL;
1472 }
1473 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001474 if (!PyArg_Parse((*getitem)(argv, i),
Barry Warsaw43d68b81996-12-19 22:10:44 +00001475 "s;argv must be list of strings",
1476 &argvlist[i]))
1477 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001478 goto fail_1;
1479 }
1480 }
1481 argvlist[argc] = NULL;
1482
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001483 i = PyMapping_Length(env);
Barry Warsaw53699e91996-12-10 23:23:01 +00001484 envlist = PyMem_NEW(char *, i + 1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001485 if (envlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001486 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001487 goto fail_1;
1488 }
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001489 envc = 0;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001490 keys = PyMapping_Keys(env);
1491 vals = PyMapping_Values(env);
1492 if (!keys || !vals)
1493 goto fail_2;
1494
1495 for (pos = 0; pos < i; pos++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001496 char *p, *k, *v;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001497
1498 key = PyList_GetItem(keys, pos);
1499 val = PyList_GetItem(vals, pos);
1500 if (!key || !val)
1501 goto fail_2;
1502
Barry Warsaw53699e91996-12-10 23:23:01 +00001503 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
Barry Warsaw43d68b81996-12-19 22:10:44 +00001504 !PyArg_Parse(val, "s;non-string value in env", &v))
1505 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001506 goto fail_2;
1507 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00001508
1509#if defined(PYOS_OS2)
1510 /* Omit Pseudo-Env Vars that Would Confuse Programs if Passed On */
1511 if (stricmp(k, "BEGINLIBPATH") != 0 && stricmp(k, "ENDLIBPATH") != 0) {
1512#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001513 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001514 if (p == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001515 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001516 goto fail_2;
1517 }
1518 sprintf(p, "%s=%s", k, v);
1519 envlist[envc++] = p;
Guido van Rossumd48f2521997-12-05 22:19:34 +00001520#if defined(PYOS_OS2)
1521 }
1522#endif
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001523 }
1524 envlist[envc] = 0;
1525
Guido van Rossumb6775db1994-08-01 11:34:53 +00001526
1527#ifdef BAD_EXEC_PROTOTYPES
1528 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001529#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001530 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001531#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001532
1533 /* If we get here it's definitely an error */
1534
1535 (void) posix_error();
1536
1537 fail_2:
1538 while (--envc >= 0)
Barry Warsaw53699e91996-12-10 23:23:01 +00001539 PyMem_DEL(envlist[envc]);
1540 PyMem_DEL(envlist);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001541 fail_1:
Barry Warsaw53699e91996-12-10 23:23:01 +00001542 PyMem_DEL(argvlist);
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001543 Py_XDECREF(vals);
1544 Py_XDECREF(keys);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001545 return NULL;
1546}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001547#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001548
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001549
Guido van Rossuma1065681999-01-25 23:20:23 +00001550#ifdef HAVE_SPAWNV
1551static char posix_spawnv__doc__[] =
Fred Drakea6dff3e1999-02-01 22:24:40 +00001552"spawnv(mode, path, args)\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001553Execute an executable path with arguments, replacing current process.\n\
1554\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00001555 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001556 path: path of executable file\n\
1557 args: tuple or list of strings";
1558
1559static PyObject *
1560posix_spawnv(self, args)
1561 PyObject *self;
1562 PyObject *args;
1563{
1564 char *path;
1565 PyObject *argv;
1566 char **argvlist;
1567 int mode, i, argc;
Fred Drake699f3522000-06-29 21:12:41 +00001568 intptr_t spawnval;
Guido van Rossuma1065681999-01-25 23:20:23 +00001569 PyObject *(*getitem) Py_PROTO((PyObject *, int));
1570
1571 /* spawnv has three arguments: (mode, path, argv), where
1572 argv is a list or tuple of strings. */
1573
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001574 if (!PyArg_ParseTuple(args, "isO:spawnv", &mode, &path, &argv))
Guido van Rossuma1065681999-01-25 23:20:23 +00001575 return NULL;
1576 if (PyList_Check(argv)) {
1577 argc = PyList_Size(argv);
1578 getitem = PyList_GetItem;
1579 }
1580 else if (PyTuple_Check(argv)) {
1581 argc = PyTuple_Size(argv);
1582 getitem = PyTuple_GetItem;
1583 }
1584 else {
Fred Drake137507e2000-06-01 02:02:46 +00001585 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossuma1065681999-01-25 23:20:23 +00001586 return NULL;
1587 }
1588
1589 argvlist = PyMem_NEW(char *, argc+1);
1590 if (argvlist == NULL)
1591 return NULL;
1592 for (i = 0; i < argc; i++) {
1593 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
1594 PyMem_DEL(argvlist);
Fred Drake137507e2000-06-01 02:02:46 +00001595 PyErr_SetString(PyExc_TypeError,
1596 "all arguments must be strings");
1597 return NULL;
Guido van Rossuma1065681999-01-25 23:20:23 +00001598 }
1599 }
1600 argvlist[argc] = NULL;
1601
Guido van Rossum246bc171999-02-01 23:54:31 +00001602 if (mode == _OLD_P_OVERLAY)
1603 mode = _P_OVERLAY;
Fred Drake699f3522000-06-29 21:12:41 +00001604 spawnval = _spawnv(mode, path, argvlist);
Guido van Rossuma1065681999-01-25 23:20:23 +00001605
1606 PyMem_DEL(argvlist);
1607
Fred Drake699f3522000-06-29 21:12:41 +00001608 if (spawnval == -1)
Guido van Rossuma1065681999-01-25 23:20:23 +00001609 return posix_error();
1610 else
Fred Drake699f3522000-06-29 21:12:41 +00001611#if SIZEOF_LONG == SIZE_VOID_P
1612 return Py_BuildValue("l", spawnval);
1613#else
1614 return Py_BuildValue("L", spawnval);
1615#endif
Guido van Rossuma1065681999-01-25 23:20:23 +00001616}
1617
1618
1619static char posix_spawnve__doc__[] =
Fred Drakea6dff3e1999-02-01 22:24:40 +00001620"spawnve(mode, path, args, env)\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001621Execute a path with arguments and environment, replacing current process.\n\
1622\n\
Fred Drakea6dff3e1999-02-01 22:24:40 +00001623 mode: mode of process creation\n\
Guido van Rossuma1065681999-01-25 23:20:23 +00001624 path: path of executable file\n\
1625 args: tuple or list of arguments\n\
1626 env: dictonary of strings mapping to strings";
1627
1628static PyObject *
1629posix_spawnve(self, args)
1630 PyObject *self;
1631 PyObject *args;
1632{
1633 char *path;
1634 PyObject *argv, *env;
1635 char **argvlist;
1636 char **envlist;
1637 PyObject *key, *val, *keys=NULL, *vals=NULL, *res=NULL;
1638 int mode, i, pos, argc, envc;
Fred Drake699f3522000-06-29 21:12:41 +00001639 intptr_t spawnval;
Guido van Rossuma1065681999-01-25 23:20:23 +00001640 PyObject *(*getitem) Py_PROTO((PyObject *, int));
1641
1642 /* spawnve has four arguments: (mode, path, argv, env), where
1643 argv is a list or tuple of strings and env is a dictionary
1644 like posix.environ. */
1645
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001646 if (!PyArg_ParseTuple(args, "isOO:spawnve", &mode, &path, &argv, &env))
Guido van Rossuma1065681999-01-25 23:20:23 +00001647 return NULL;
1648 if (PyList_Check(argv)) {
1649 argc = PyList_Size(argv);
1650 getitem = PyList_GetItem;
1651 }
1652 else if (PyTuple_Check(argv)) {
1653 argc = PyTuple_Size(argv);
1654 getitem = PyTuple_GetItem;
1655 }
1656 else {
1657 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
1658 return NULL;
1659 }
1660 if (!PyMapping_Check(env)) {
1661 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
1662 return NULL;
1663 }
1664
1665 argvlist = PyMem_NEW(char *, argc+1);
1666 if (argvlist == NULL) {
1667 PyErr_NoMemory();
1668 return NULL;
1669 }
1670 for (i = 0; i < argc; i++) {
1671 if (!PyArg_Parse((*getitem)(argv, i),
1672 "s;argv must be list of strings",
1673 &argvlist[i]))
1674 {
1675 goto fail_1;
1676 }
1677 }
1678 argvlist[argc] = NULL;
1679
1680 i = PyMapping_Length(env);
1681 envlist = PyMem_NEW(char *, i + 1);
1682 if (envlist == NULL) {
1683 PyErr_NoMemory();
1684 goto fail_1;
1685 }
1686 envc = 0;
1687 keys = PyMapping_Keys(env);
1688 vals = PyMapping_Values(env);
1689 if (!keys || !vals)
1690 goto fail_2;
1691
1692 for (pos = 0; pos < i; pos++) {
1693 char *p, *k, *v;
1694
1695 key = PyList_GetItem(keys, pos);
1696 val = PyList_GetItem(vals, pos);
1697 if (!key || !val)
1698 goto fail_2;
1699
1700 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
1701 !PyArg_Parse(val, "s;non-string value in env", &v))
1702 {
1703 goto fail_2;
1704 }
1705 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
1706 if (p == NULL) {
1707 PyErr_NoMemory();
1708 goto fail_2;
1709 }
1710 sprintf(p, "%s=%s", k, v);
1711 envlist[envc++] = p;
1712 }
1713 envlist[envc] = 0;
1714
Guido van Rossum246bc171999-02-01 23:54:31 +00001715 if (mode == _OLD_P_OVERLAY)
1716 mode = _P_OVERLAY;
Fred Drake699f3522000-06-29 21:12:41 +00001717 spawnval = _spawnve(mode, path, argvlist, envlist);
1718 if (spawnval == -1)
Guido van Rossuma1065681999-01-25 23:20:23 +00001719 (void) posix_error();
1720 else
Fred Drake699f3522000-06-29 21:12:41 +00001721#if SIZEOF_LONG == SIZE_VOID_P
1722 res = Py_BuildValue("l", spawnval);
1723#else
1724 res = Py_BuildValue("L", spawnval);
1725#endif
Guido van Rossuma1065681999-01-25 23:20:23 +00001726
1727 fail_2:
1728 while (--envc >= 0)
1729 PyMem_DEL(envlist[envc]);
1730 PyMem_DEL(envlist);
1731 fail_1:
1732 PyMem_DEL(argvlist);
1733 Py_XDECREF(vals);
1734 Py_XDECREF(keys);
1735 return res;
1736}
1737#endif /* HAVE_SPAWNV */
1738
1739
Guido van Rossumad0ee831995-03-01 10:34:45 +00001740#ifdef HAVE_FORK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001741static char posix_fork__doc__[] =
1742"fork() -> pid\n\
1743Fork a child process.\n\
1744\n\
1745Return 0 to child process and PID of child to parent process.";
1746
Barry Warsaw53699e91996-12-10 23:23:01 +00001747static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001748posix_fork(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001749 PyObject *self;
1750 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001751{
1752 int pid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001753 if (!PyArg_ParseTuple(args, ":fork"))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001754 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001755 pid = fork();
1756 if (pid == -1)
1757 return posix_error();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001758 PyOS_AfterFork();
Barry Warsaw53699e91996-12-10 23:23:01 +00001759 return PyInt_FromLong((long)pid);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001760}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001761#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001762
Fred Drake8cef4cf2000-06-28 16:40:38 +00001763#if defined(HAVE_OPENPTY) || defined(HAVE_FORKPTY)
1764#ifdef HAVE_PTY_H
1765#include <pty.h>
1766#else
1767#ifdef HAVE_LIBUTIL_H
1768#include <libutil.h>
1769#else
1770/* BSDI does not supply a prototype for the 'openpty' and 'forkpty'
1771 functions, eventhough they are included in libutil. */
1772#include <termios.h>
1773extern int openpty(int *, int *, char *, struct termios *, struct winsize *);
1774extern int forkpty(int *, char *, struct termios *, struct winsize *);
1775#endif /* HAVE_LIBUTIL_H */
1776#endif /* HAVE_PTY_H */
1777#endif /* defined(HAVE_OPENPTY) or defined(HAVE_FORKPTY) */
1778
1779#ifdef HAVE_OPENPTY
1780static char posix_openpty__doc__[] =
1781"openpty() -> (master_fd, slave_fd)\n\
1782Open a pseudo-terminal, returning open fd's for both master and slave end.\n";
1783
1784static PyObject *
1785posix_openpty(self, args)
1786 PyObject *self;
1787 PyObject *args;
1788{
1789 int master_fd, slave_fd;
1790 if (!PyArg_ParseTuple(args, ":openpty"))
1791 return NULL;
1792 if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) != 0)
1793 return posix_error();
1794 return Py_BuildValue("(ii)", master_fd, slave_fd);
1795}
1796#endif
1797
1798#ifdef HAVE_FORKPTY
1799static char posix_forkpty__doc__[] =
1800"forkpty() -> (pid, master_fd)\n\
1801Fork a new process with a new pseudo-terminal as controlling tty.\n\n\
1802Like fork(), return 0 as pid to child process, and PID of child to parent.\n\
1803To both, return fd of newly opened pseudo-terminal.\n";
1804
1805static PyObject *
1806posix_forkpty(self, args)
1807 PyObject *self;
1808 PyObject *args;
1809{
1810 int master_fd, pid;
1811
1812 if (!PyArg_ParseTuple(args, ":forkpty"))
1813 return NULL;
1814 pid = forkpty(&master_fd, NULL, NULL, NULL);
1815 if (pid == -1)
1816 return posix_error();
1817 PyOS_AfterFork();
1818 return Py_BuildValue("(ii)", pid, master_fd);
1819}
1820#endif
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001821
Guido van Rossumad0ee831995-03-01 10:34:45 +00001822#ifdef HAVE_GETEGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001823static char posix_getegid__doc__[] =
1824"getegid() -> egid\n\
1825Return the current process's effective group id.";
1826
Barry Warsaw53699e91996-12-10 23:23:01 +00001827static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001828posix_getegid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001829 PyObject *self;
1830 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001831{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001832 if (!PyArg_ParseTuple(args, ":getegid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001833 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001834 return PyInt_FromLong((long)getegid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001835}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001836#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001837
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001838
Guido van Rossumad0ee831995-03-01 10:34:45 +00001839#ifdef HAVE_GETEUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001840static char posix_geteuid__doc__[] =
1841"geteuid() -> euid\n\
1842Return the current process's effective user id.";
1843
Barry Warsaw53699e91996-12-10 23:23:01 +00001844static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001845posix_geteuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001846 PyObject *self;
1847 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001848{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001849 if (!PyArg_ParseTuple(args, ":geteuid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001850 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001851 return PyInt_FromLong((long)geteuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001852}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001853#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001854
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001855
Guido van Rossumad0ee831995-03-01 10:34:45 +00001856#ifdef HAVE_GETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001857static char posix_getgid__doc__[] =
1858"getgid() -> gid\n\
1859Return the current process's group id.";
1860
Barry Warsaw53699e91996-12-10 23:23:01 +00001861static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001862posix_getgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001863 PyObject *self;
1864 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001865{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001866 if (!PyArg_ParseTuple(args, ":getgid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001867 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001868 return PyInt_FromLong((long)getgid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001869}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001870#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001871
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001872
1873static char posix_getpid__doc__[] =
1874"getpid() -> pid\n\
1875Return the current process id";
1876
Barry Warsaw53699e91996-12-10 23:23:01 +00001877static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001878posix_getpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001879 PyObject *self;
1880 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001881{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001882 if (!PyArg_ParseTuple(args, ":getpid"))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001883 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001884 return PyInt_FromLong((long)getpid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001885}
1886
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001887
Fred Drakec9680921999-12-13 16:37:25 +00001888#ifdef HAVE_GETGROUPS
1889static char posix_getgroups__doc__[] = "\
1890getgroups() -> list of group IDs\n\
1891Return list of supplemental group IDs for the process.";
1892
1893static PyObject *
1894posix_getgroups(self, args)
1895 PyObject *self;
1896 PyObject *args;
1897{
1898 PyObject *result = NULL;
1899
1900 if (PyArg_ParseTuple(args, ":getgroups")) {
1901#ifdef NGROUPS_MAX
1902#define MAX_GROUPS NGROUPS_MAX
1903#else
1904 /* defined to be 16 on Solaris7, so this should be a small number */
1905#define MAX_GROUPS 64
1906#endif
1907 gid_t grouplist[MAX_GROUPS];
1908 int n;
1909
1910 n = getgroups(MAX_GROUPS, grouplist);
1911 if (n < 0)
1912 posix_error();
1913 else {
1914 result = PyList_New(n);
1915 if (result != NULL) {
1916 PyObject *o;
1917 int i;
1918 for (i = 0; i < n; ++i) {
1919 o = PyInt_FromLong((long)grouplist[i]);
1920 if (o == NULL) {
1921 Py_DECREF(result);
1922 result = NULL;
1923 break;
1924 }
1925 PyList_SET_ITEM(result, i, o);
1926 }
1927 }
1928 }
1929 }
1930 return result;
1931}
1932#endif
1933
Guido van Rossumb6775db1994-08-01 11:34:53 +00001934#ifdef HAVE_GETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001935static char posix_getpgrp__doc__[] =
1936"getpgrp() -> pgrp\n\
1937Return the current process group id.";
1938
Barry Warsaw53699e91996-12-10 23:23:01 +00001939static PyObject *
Guido van Rossum04814471991-06-04 20:23:49 +00001940posix_getpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001941 PyObject *self;
1942 PyObject *args;
Guido van Rossum04814471991-06-04 20:23:49 +00001943{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001944 if (!PyArg_ParseTuple(args, ":getpgrp"))
Guido van Rossum04814471991-06-04 20:23:49 +00001945 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001946#ifdef GETPGRP_HAVE_ARG
Barry Warsaw53699e91996-12-10 23:23:01 +00001947 return PyInt_FromLong((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001948#else /* GETPGRP_HAVE_ARG */
Barry Warsaw53699e91996-12-10 23:23:01 +00001949 return PyInt_FromLong((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001950#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001951}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001952#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001953
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001954
Guido van Rossumb6775db1994-08-01 11:34:53 +00001955#ifdef HAVE_SETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001956static char posix_setpgrp__doc__[] =
1957"setpgrp() -> None\n\
1958Make this process a session leader.";
1959
Barry Warsaw53699e91996-12-10 23:23:01 +00001960static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001961posix_setpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001962 PyObject *self;
1963 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001964{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001965 if (!PyArg_ParseTuple(args, ":setpgrp"))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001966 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001967#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001968 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001969#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001970 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001971#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001972 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001973 Py_INCREF(Py_None);
1974 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001975}
1976
Guido van Rossumb6775db1994-08-01 11:34:53 +00001977#endif /* HAVE_SETPGRP */
1978
Guido van Rossumad0ee831995-03-01 10:34:45 +00001979#ifdef HAVE_GETPPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001980static char posix_getppid__doc__[] =
1981"getppid() -> ppid\n\
1982Return the parent's process id.";
1983
Barry Warsaw53699e91996-12-10 23:23:01 +00001984static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001985posix_getppid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001986 PyObject *self;
1987 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001988{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00001989 if (!PyArg_ParseTuple(args, ":getppid"))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001990 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001991 return PyInt_FromLong((long)getppid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001992}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001993#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001994
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001995
Fred Drake12c6e2d1999-12-14 21:25:03 +00001996#ifdef HAVE_GETLOGIN
1997static char posix_getlogin__doc__[] = "\
1998getlogin() -> string\n\
1999Return the actual login name.";
2000
2001static PyObject *
2002posix_getlogin(self, args)
2003 PyObject *self;
2004 PyObject *args;
2005{
2006 PyObject *result = NULL;
2007
2008 if (PyArg_ParseTuple(args, ":getlogin")) {
2009 char *name = getlogin();
2010
2011 if (name == NULL)
2012 posix_error();
2013 else
2014 result = PyString_FromString(name);
2015 }
2016 return result;
2017}
2018#endif
2019
Guido van Rossumad0ee831995-03-01 10:34:45 +00002020#ifdef HAVE_GETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002021static char posix_getuid__doc__[] =
2022"getuid() -> uid\n\
2023Return the current process's user id.";
2024
Barry Warsaw53699e91996-12-10 23:23:01 +00002025static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00002026posix_getuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002027 PyObject *self;
2028 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00002029{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002030 if (!PyArg_ParseTuple(args, ":getuid"))
Guido van Rossum46003ff1992-05-15 11:05:24 +00002031 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002032 return PyInt_FromLong((long)getuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00002033}
Guido van Rossumad0ee831995-03-01 10:34:45 +00002034#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00002035
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002036
Guido van Rossumad0ee831995-03-01 10:34:45 +00002037#ifdef HAVE_KILL
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002038static char posix_kill__doc__[] =
2039"kill(pid, sig) -> None\n\
2040Kill a process with a signal.";
2041
Barry Warsaw53699e91996-12-10 23:23:01 +00002042static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00002043posix_kill(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002044 PyObject *self;
2045 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00002046{
2047 int pid, sig;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002048 if (!PyArg_ParseTuple(args, "ii:kill", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00002049 return NULL;
Guido van Rossumd48f2521997-12-05 22:19:34 +00002050#if defined(PYOS_OS2)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002051 if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
2052 APIRET rc;
2053 if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002054 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002055
2056 } else if (sig == XCPT_SIGNAL_KILLPROC) {
2057 APIRET rc;
2058 if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002059 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002060
2061 } else
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002062 return NULL; /* Unrecognized Signal Requested */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002063#else
Guido van Rossum85e3b011991-06-03 12:42:10 +00002064 if (kill(pid, sig) == -1)
2065 return posix_error();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002066#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002067 Py_INCREF(Py_None);
2068 return Py_None;
Guido van Rossum85e3b011991-06-03 12:42:10 +00002069}
Guido van Rossumad0ee831995-03-01 10:34:45 +00002070#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00002071
Guido van Rossumc0125471996-06-28 18:55:32 +00002072#ifdef HAVE_PLOCK
2073
2074#ifdef HAVE_SYS_LOCK_H
2075#include <sys/lock.h>
2076#endif
2077
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002078static char posix_plock__doc__[] =
2079"plock(op) -> None\n\
2080Lock program segments into memory.";
2081
Barry Warsaw53699e91996-12-10 23:23:01 +00002082static PyObject *
Guido van Rossumc0125471996-06-28 18:55:32 +00002083posix_plock(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002084 PyObject *self;
2085 PyObject *args;
Guido van Rossumc0125471996-06-28 18:55:32 +00002086{
2087 int op;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002088 if (!PyArg_ParseTuple(args, "i:plock", &op))
Guido van Rossumc0125471996-06-28 18:55:32 +00002089 return NULL;
2090 if (plock(op) == -1)
2091 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002092 Py_INCREF(Py_None);
2093 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00002094}
2095#endif
2096
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002097
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002098#ifdef HAVE_POPEN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002099static char posix_popen__doc__[] =
2100"popen(command [, mode='r' [, bufsize]]) -> pipe\n\
2101Open a pipe to/from a command returning a file object.";
2102
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002103#if defined(PYOS_OS2)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002104static int
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002105async_system(const char *command)
2106{
2107 char *p, errormsg[256], args[1024];
2108 RESULTCODES rcodes;
2109 APIRET rc;
2110 char *shell = getenv("COMSPEC");
2111 if (!shell)
2112 shell = "cmd";
2113
2114 strcpy(args, shell);
2115 p = &args[ strlen(args)+1 ];
2116 strcpy(p, "/c ");
2117 strcat(p, command);
2118 p += strlen(p) + 1;
2119 *p = '\0';
2120
2121 rc = DosExecPgm(errormsg, sizeof(errormsg),
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002122 EXEC_ASYNC, /* Execute Async w/o Wait for Results */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002123 args,
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002124 NULL, /* Inherit Parent's Environment */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002125 &rcodes, shell);
2126 return rc;
2127}
2128
Guido van Rossumd48f2521997-12-05 22:19:34 +00002129static FILE *
2130popen(const char *command, const char *mode, int pipesize, int *err)
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002131{
2132 HFILE rhan, whan;
2133 FILE *retfd = NULL;
2134 APIRET rc = DosCreatePipe(&rhan, &whan, pipesize);
2135
Guido van Rossumd48f2521997-12-05 22:19:34 +00002136 if (rc != NO_ERROR) {
2137 *err = rc;
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002138 return NULL; /* ERROR - Unable to Create Anon Pipe */
Guido van Rossumd48f2521997-12-05 22:19:34 +00002139 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002140
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002141 if (strchr(mode, 'r') != NULL) { /* Treat Command as a Data Source */
2142 int oldfd = dup(1); /* Save STDOUT Handle in Another Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002143
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002144 DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
2145 close(1); /* Make STDOUT Available for Reallocation */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002146
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002147 if (dup2(whan, 1) == 0) { /* Connect STDOUT to Pipe Write Side */
2148 DosClose(whan); /* Close Now-Unused Pipe Write Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002149
2150 if (async_system(command) == NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002151 retfd = fdopen(rhan, mode); /* And Return Pipe Read Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002152 }
2153
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002154 dup2(oldfd, 1); /* Reconnect STDOUT to Original Handle */
2155 DosExitCritSec(); /* Now Allow Other Threads to Run */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002156
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002157 close(oldfd); /* And Close Saved STDOUT Handle */
2158 return retfd; /* Return fd of Pipe or NULL if Error */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002159
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002160 } else if (strchr(mode, 'w')) { /* Treat Command as a Data Sink */
2161 int oldfd = dup(0); /* Save STDIN Handle in Another Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002162
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002163 DosEnterCritSec(); /* Stop Other Threads While Changing Handles */
2164 close(0); /* Make STDIN Available for Reallocation */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002165
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002166 if (dup2(rhan, 0) == 0) { /* Connect STDIN to Pipe Read Side */
2167 DosClose(rhan); /* Close Now-Unused Pipe Read Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002168
2169 if (async_system(command) == NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002170 retfd = fdopen(whan, mode); /* And Return Pipe Write Handle */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002171 }
2172
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002173 dup2(oldfd, 0); /* Reconnect STDIN to Original Handle */
2174 DosExitCritSec(); /* Now Allow Other Threads to Run */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002175
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002176 close(oldfd); /* And Close Saved STDIN Handle */
2177 return retfd; /* Return fd of Pipe or NULL if Error */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002178
Guido van Rossumd48f2521997-12-05 22:19:34 +00002179 } else {
2180 *err = ERROR_INVALID_ACCESS;
Guido van Rossumc5a0f531997-12-02 20:36:02 +00002181 return NULL; /* ERROR - Invalid Mode (Neither Read nor Write) */
Guido van Rossumd48f2521997-12-05 22:19:34 +00002182 }
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002183}
2184
2185static PyObject *
2186posix_popen(self, args)
2187 PyObject *self;
2188 PyObject *args;
2189{
2190 char *name;
2191 char *mode = "r";
Guido van Rossumd48f2521997-12-05 22:19:34 +00002192 int err, bufsize = -1;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002193 FILE *fp;
2194 PyObject *f;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002195 if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002196 return NULL;
2197 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd48f2521997-12-05 22:19:34 +00002198 fp = popen(name, mode, (bufsize > 0) ? bufsize : 4096, &err);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002199 Py_END_ALLOW_THREADS
2200 if (fp == NULL)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002201 return os2_error(err);
2202
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002203 f = PyFile_FromFile(fp, name, mode, fclose);
2204 if (f != NULL)
2205 PyFile_SetBufSize(f, bufsize);
2206 return f;
2207}
2208
2209#else
Barry Warsaw53699e91996-12-10 23:23:01 +00002210static PyObject *
Guido van Rossum3b066191991-06-04 19:40:25 +00002211posix_popen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002212 PyObject *self;
2213 PyObject *args;
Guido van Rossum3b066191991-06-04 19:40:25 +00002214{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002215 char *name;
2216 char *mode = "r";
2217 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00002218 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002219 PyObject *f;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002220 if (!PyArg_ParseTuple(args, "s|si:popen", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00002221 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002222 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002223 fp = popen(name, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002224 Py_END_ALLOW_THREADS
Guido van Rossum3b066191991-06-04 19:40:25 +00002225 if (fp == NULL)
2226 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002227 f = PyFile_FromFile(fp, name, mode, pclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002228 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002229 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002230 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00002231}
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002232#endif
2233
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002234#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00002235
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002236
Guido van Rossumb6775db1994-08-01 11:34:53 +00002237#ifdef HAVE_SETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002238static char posix_setuid__doc__[] =
2239"setuid(uid) -> None\n\
2240Set the current process's user id.";
Barry Warsaw53699e91996-12-10 23:23:01 +00002241static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002242posix_setuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002243 PyObject *self;
2244 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002245{
2246 int uid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002247 if (!PyArg_ParseTuple(args, "i:setuid", &uid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002248 return NULL;
2249 if (setuid(uid) < 0)
2250 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002251 Py_INCREF(Py_None);
2252 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002253}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002254#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002255
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002256
Guido van Rossumb6775db1994-08-01 11:34:53 +00002257#ifdef HAVE_SETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002258static char posix_setgid__doc__[] =
2259"setgid(gid) -> None\n\
2260Set the current process's group id.";
2261
Barry Warsaw53699e91996-12-10 23:23:01 +00002262static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002263posix_setgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002264 PyObject *self;
2265 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002266{
2267 int gid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002268 if (!PyArg_ParseTuple(args, "i:setgid", &gid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002269 return NULL;
2270 if (setgid(gid) < 0)
2271 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002272 Py_INCREF(Py_None);
2273 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002274}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002275#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00002276
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002277
Guido van Rossumb6775db1994-08-01 11:34:53 +00002278#ifdef HAVE_WAITPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002279static char posix_waitpid__doc__[] =
2280"waitpid(pid, options) -> (pid, status)\n\
2281Wait for completion of a give child process.";
2282
Barry Warsaw53699e91996-12-10 23:23:01 +00002283static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00002284posix_waitpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002285 PyObject *self;
2286 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00002287{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002288 int pid, options;
2289#ifdef UNION_WAIT
2290 union wait status;
2291#define status_i (status.w_status)
2292#else
2293 int status;
2294#define status_i status
2295#endif
2296 status_i = 0;
2297
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002298 if (!PyArg_ParseTuple(args, "ii:waitpid", &pid, &options))
Guido van Rossum21803b81992-08-09 12:55:27 +00002299 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002300 Py_BEGIN_ALLOW_THREADS
Guido van Rossume6a3aa61999-02-01 16:15:30 +00002301#ifdef NeXT
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002302 pid = wait4(pid, &status, options, NULL);
Guido van Rossume6a3aa61999-02-01 16:15:30 +00002303#else
2304 pid = waitpid(pid, &status, options);
2305#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002306 Py_END_ALLOW_THREADS
Guido van Rossum85e3b011991-06-03 12:42:10 +00002307 if (pid == -1)
2308 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00002309 else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002310 return Py_BuildValue("ii", pid, status_i);
Guido van Rossum21803b81992-08-09 12:55:27 +00002311}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002312#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00002313
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002314
Guido van Rossumad0ee831995-03-01 10:34:45 +00002315#ifdef HAVE_WAIT
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002316static char posix_wait__doc__[] =
2317"wait() -> (pid, status)\n\
2318Wait for completion of a child process.";
2319
Barry Warsaw53699e91996-12-10 23:23:01 +00002320static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00002321posix_wait(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002322 PyObject *self;
2323 PyObject *args;
Guido van Rossum21803b81992-08-09 12:55:27 +00002324{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002325 int pid;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002326#ifdef UNION_WAIT
2327 union wait status;
2328#define status_i (status.w_status)
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002329#else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002330 int status;
2331#define status_i status
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002332#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002333 if (!PyArg_ParseTuple(args, ":wait"))
2334 return NULL;
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002335 status_i = 0;
2336 Py_BEGIN_ALLOW_THREADS
2337 pid = wait(&status);
Barry Warsaw53699e91996-12-10 23:23:01 +00002338 Py_END_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00002339 if (pid == -1)
2340 return posix_error();
2341 else
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00002342 return Py_BuildValue("ii", pid, status_i);
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002343#undef status_i
Guido van Rossum85e3b011991-06-03 12:42:10 +00002344}
Guido van Rossumad0ee831995-03-01 10:34:45 +00002345#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00002346
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002347
2348static char posix_lstat__doc__[] =
2349"lstat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
2350Like stat(path), but do not follow symbolic links.";
2351
Barry Warsaw53699e91996-12-10 23:23:01 +00002352static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002353posix_lstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002354 PyObject *self;
2355 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002356{
Guido van Rossumb6775db1994-08-01 11:34:53 +00002357#ifdef HAVE_LSTAT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002358 return posix_do_stat(self, args, "s:lstat", lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002359#else /* !HAVE_LSTAT */
Fred Drake699f3522000-06-29 21:12:41 +00002360 return posix_do_stat(self, args, "s:lstat", STAT);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002361#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002362}
2363
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002364
Guido van Rossumb6775db1994-08-01 11:34:53 +00002365#ifdef HAVE_READLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002366static char posix_readlink__doc__[] =
2367"readlink(path) -> path\n\
2368Return a string representing the path to which the symbolic link points.";
2369
Barry Warsaw53699e91996-12-10 23:23:01 +00002370static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002371posix_readlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002372 PyObject *self;
2373 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002374{
Guido van Rossumb6775db1994-08-01 11:34:53 +00002375 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00002376 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002377 int n;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002378 if (!PyArg_ParseTuple(args, "s:readlink", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002379 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002380 Py_BEGIN_ALLOW_THREADS
Guido van Rossum50e61dc1992-03-27 17:22:31 +00002381 n = readlink(path, buf, (int) sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +00002382 Py_END_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002383 if (n < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00002384 return posix_error_with_filename(path);
Barry Warsaw53699e91996-12-10 23:23:01 +00002385 return PyString_FromStringAndSize(buf, n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002386}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002387#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002388
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002389
Guido van Rossumb6775db1994-08-01 11:34:53 +00002390#ifdef HAVE_SYMLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002391static char posix_symlink__doc__[] =
2392"symlink(src, dst) -> None\n\
2393Create a symbolic link.";
2394
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002395static PyObject *
2396posix_symlink(self, args)
2397 PyObject *self;
2398 PyObject *args;
2399{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002400 return posix_2str(args, "ss:symlink", symlink);
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002401}
2402#endif /* HAVE_SYMLINK */
2403
2404
2405#ifdef HAVE_TIMES
2406#ifndef HZ
2407#define HZ 60 /* Universal constant :-) */
2408#endif /* HZ */
2409
Guido van Rossumd48f2521997-12-05 22:19:34 +00002410#if defined(PYCC_VACPP) && defined(PYOS_OS2)
2411static long
2412system_uptime()
2413{
2414 ULONG value = 0;
2415
2416 Py_BEGIN_ALLOW_THREADS
2417 DosQuerySysInfo(QSV_MS_COUNT, QSV_MS_COUNT, &value, sizeof(value));
2418 Py_END_ALLOW_THREADS
2419
2420 return value;
2421}
2422
2423static PyObject *
2424posix_times(self, args)
2425 PyObject *self;
2426 PyObject *args;
2427{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002428 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossumd48f2521997-12-05 22:19:34 +00002429 return NULL;
2430
2431 /* Currently Only Uptime is Provided -- Others Later */
2432 return Py_BuildValue("ddddd",
2433 (double)0 /* t.tms_utime / HZ */,
2434 (double)0 /* t.tms_stime / HZ */,
2435 (double)0 /* t.tms_cutime / HZ */,
2436 (double)0 /* t.tms_cstime / HZ */,
2437 (double)system_uptime() / 1000);
2438}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002439#else /* not OS2 */
Barry Warsaw53699e91996-12-10 23:23:01 +00002440static PyObject *
Guido van Rossum22db57e1992-04-05 14:25:30 +00002441posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002442 PyObject *self;
2443 PyObject *args;
Guido van Rossum22db57e1992-04-05 14:25:30 +00002444{
2445 struct tms t;
2446 clock_t c;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002447 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossum22db57e1992-04-05 14:25:30 +00002448 return NULL;
2449 errno = 0;
2450 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00002451 if (c == (clock_t) -1)
2452 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002453 return Py_BuildValue("ddddd",
Barry Warsaw43d68b81996-12-19 22:10:44 +00002454 (double)t.tms_utime / HZ,
2455 (double)t.tms_stime / HZ,
2456 (double)t.tms_cutime / HZ,
2457 (double)t.tms_cstime / HZ,
2458 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00002459}
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002460#endif /* not OS2 */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002461#endif /* HAVE_TIMES */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002462
2463
Guido van Rossum87755a21996-09-07 00:59:43 +00002464#ifdef MS_WIN32
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002465#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00002466static PyObject *
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002467posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002468 PyObject *self;
2469 PyObject *args;
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002470{
2471 FILETIME create, exit, kernel, user;
2472 HANDLE hProc;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002473 if (!PyArg_ParseTuple(args, ":times"))
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002474 return NULL;
2475 hProc = GetCurrentProcess();
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00002476 GetProcessTimes(hProc, &create, &exit, &kernel, &user);
2477 /* The fields of a FILETIME structure are the hi and lo part
2478 of a 64-bit value expressed in 100 nanosecond units.
2479 1e7 is one second in such units; 1e-7 the inverse.
2480 429.4967296 is 2**32 / 1e7 or 2**32 * 1e-7.
2481 */
Barry Warsaw53699e91996-12-10 23:23:01 +00002482 return Py_BuildValue(
2483 "ddddd",
Guido van Rossumb8c3cbd1999-02-16 14:37:28 +00002484 (double)(kernel.dwHighDateTime*429.4967296 +
2485 kernel.dwLowDateTime*1e-7),
2486 (double)(user.dwHighDateTime*429.4967296 +
2487 user.dwLowDateTime*1e-7),
Barry Warsaw53699e91996-12-10 23:23:01 +00002488 (double)0,
2489 (double)0,
2490 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00002491}
Guido van Rossum8d665e61996-06-26 18:22:49 +00002492#endif /* MS_WIN32 */
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002493
2494#ifdef HAVE_TIMES
Roger E. Masse0318fd61997-06-05 22:07:58 +00002495static char posix_times__doc__[] =
2496"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\
2497Return a tuple of floating point numbers indicating process times.";
Guido van Rossumbfaf3d61997-12-29 20:02:27 +00002498#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002499
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002500
Guido van Rossumb6775db1994-08-01 11:34:53 +00002501#ifdef HAVE_SETSID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002502static char posix_setsid__doc__[] =
2503"setsid() -> None\n\
2504Call the system call setsid().";
2505
Barry Warsaw53699e91996-12-10 23:23:01 +00002506static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00002507posix_setsid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002508 PyObject *self;
2509 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002510{
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002511 if (!PyArg_ParseTuple(args, ":setsid"))
Guido van Rossumc2670a01992-09-13 20:07:29 +00002512 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002513 if (setsid() < 0)
2514 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002515 Py_INCREF(Py_None);
2516 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002517}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002518#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00002519
Guido van Rossumb6775db1994-08-01 11:34:53 +00002520#ifdef HAVE_SETPGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002521static char posix_setpgid__doc__[] =
2522"setpgid(pid, pgrp) -> None\n\
2523Call the system call setpgid().";
2524
Barry Warsaw53699e91996-12-10 23:23:01 +00002525static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00002526posix_setpgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002527 PyObject *self;
2528 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002529{
2530 int pid, pgrp;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002531 if (!PyArg_ParseTuple(args, "ii:setpgid", &pid, &pgrp))
Guido van Rossumc2670a01992-09-13 20:07:29 +00002532 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002533 if (setpgid(pid, pgrp) < 0)
2534 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002535 Py_INCREF(Py_None);
2536 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00002537}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002538#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00002539
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002540
Guido van Rossumb6775db1994-08-01 11:34:53 +00002541#ifdef HAVE_TCGETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002542static char posix_tcgetpgrp__doc__[] =
2543"tcgetpgrp(fd) -> pgid\n\
2544Return the process group associated with the terminal given by a fd.";
2545
Barry Warsaw53699e91996-12-10 23:23:01 +00002546static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00002547posix_tcgetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002548 PyObject *self;
2549 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002550{
2551 int fd, pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002552 if (!PyArg_ParseTuple(args, "i:tcgetpgrp", &fd))
Guido van Rossum7066dd71992-09-17 17:54:56 +00002553 return NULL;
2554 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002555 if (pgid < 0)
2556 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002557 return PyInt_FromLong((long)pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00002558}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002559#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00002560
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002561
Guido van Rossumb6775db1994-08-01 11:34:53 +00002562#ifdef HAVE_TCSETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002563static char posix_tcsetpgrp__doc__[] =
2564"tcsetpgrp(fd, pgid) -> None\n\
2565Set the process group associated with the terminal given by a fd.";
2566
Barry Warsaw53699e91996-12-10 23:23:01 +00002567static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00002568posix_tcsetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002569 PyObject *self;
2570 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002571{
2572 int fd, pgid;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002573 if (!PyArg_ParseTuple(args, "ii:tcsetpgrp", &fd, &pgid))
Guido van Rossum7066dd71992-09-17 17:54:56 +00002574 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00002575 if (tcsetpgrp(fd, pgid) < 0)
2576 return posix_error();
Barry Warsaw43d68b81996-12-19 22:10:44 +00002577 Py_INCREF(Py_None);
Barry Warsaw53699e91996-12-10 23:23:01 +00002578 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00002579}
Guido van Rossumb6775db1994-08-01 11:34:53 +00002580#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00002581
Guido van Rossum687dd131993-05-17 08:34:16 +00002582/* Functions acting on file descriptors */
2583
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002584static char posix_open__doc__[] =
2585"open(filename, flag [, mode=0777]) -> fd\n\
2586Open a file (for low level IO).";
2587
Barry Warsaw53699e91996-12-10 23:23:01 +00002588static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002589posix_open(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002590 PyObject *self;
2591 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002592{
2593 char *file;
2594 int flag;
2595 int mode = 0777;
2596 int fd;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002597 if (!PyArg_ParseTuple(args, "si|i", &file, &flag, &mode))
2598 return NULL;
2599
Barry Warsaw53699e91996-12-10 23:23:01 +00002600 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002601 fd = open(file, flag, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002602 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002603 if (fd < 0)
Barry Warsawd58d7641998-07-23 16:14:40 +00002604 return posix_error_with_filename(file);
Barry Warsaw53699e91996-12-10 23:23:01 +00002605 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002606}
2607
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002608
2609static char posix_close__doc__[] =
2610"close(fd) -> None\n\
2611Close a file descriptor (for low level IO).";
2612
Barry Warsaw53699e91996-12-10 23:23:01 +00002613static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002614posix_close(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002615 PyObject *self;
2616 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002617{
2618 int fd, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002619 if (!PyArg_ParseTuple(args, "i:close", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002620 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002621 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002622 res = close(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00002623 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002624 if (res < 0)
2625 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002626 Py_INCREF(Py_None);
2627 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00002628}
2629
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002630
2631static char posix_dup__doc__[] =
2632"dup(fd) -> fd2\n\
2633Return a duplicate of a file descriptor.";
2634
Barry Warsaw53699e91996-12-10 23:23:01 +00002635static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002636posix_dup(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002637 PyObject *self;
2638 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002639{
2640 int fd;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002641 if (!PyArg_ParseTuple(args, "i:dup", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002642 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002643 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002644 fd = dup(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00002645 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002646 if (fd < 0)
2647 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002648 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00002649}
2650
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002651
2652static char posix_dup2__doc__[] =
2653"dup2(fd, fd2) -> None\n\
2654Duplicate file descriptor.";
2655
Barry Warsaw53699e91996-12-10 23:23:01 +00002656static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002657posix_dup2(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002658 PyObject *self;
2659 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002660{
2661 int fd, fd2, res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002662 if (!PyArg_ParseTuple(args, "ii:dup2", &fd, &fd2))
Guido van Rossum687dd131993-05-17 08:34:16 +00002663 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002664 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002665 res = dup2(fd, fd2);
Barry Warsaw53699e91996-12-10 23:23:01 +00002666 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002667 if (res < 0)
2668 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002669 Py_INCREF(Py_None);
2670 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00002671}
2672
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002673
2674static char posix_lseek__doc__[] =
2675"lseek(fd, pos, how) -> newpos\n\
2676Set the current position of a file descriptor.";
2677
Barry Warsaw53699e91996-12-10 23:23:01 +00002678static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002679posix_lseek(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002680 PyObject *self;
2681 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002682{
2683 int fd, how;
Fred Drake699f3522000-06-29 21:12:41 +00002684#ifdef MS_WIN64
2685 LONG_LONG pos, res;
2686#else
Guido van Rossum94f6f721999-01-06 18:42:14 +00002687 off_t pos, res;
Fred Drake699f3522000-06-29 21:12:41 +00002688#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00002689 PyObject *posobj;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002690 if (!PyArg_ParseTuple(args, "iOi:lseek", &fd, &posobj, &how))
Guido van Rossum687dd131993-05-17 08:34:16 +00002691 return NULL;
2692#ifdef SEEK_SET
2693 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
2694 switch (how) {
2695 case 0: how = SEEK_SET; break;
2696 case 1: how = SEEK_CUR; break;
2697 case 2: how = SEEK_END; break;
2698 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002699#endif /* SEEK_END */
Guido van Rossum94f6f721999-01-06 18:42:14 +00002700
2701#if !defined(HAVE_LARGEFILE_SUPPORT)
2702 pos = PyInt_AsLong(posobj);
2703#else
2704 pos = PyLong_Check(posobj) ?
2705 PyLong_AsLongLong(posobj) : PyInt_AsLong(posobj);
2706#endif
2707 if (PyErr_Occurred())
2708 return NULL;
2709
Barry Warsaw53699e91996-12-10 23:23:01 +00002710 Py_BEGIN_ALLOW_THREADS
Fred Drake699f3522000-06-29 21:12:41 +00002711#ifdef MS_WIN64
2712 res = _lseeki64(fd, pos, how);
2713#else
Guido van Rossum687dd131993-05-17 08:34:16 +00002714 res = lseek(fd, pos, how);
Fred Drake699f3522000-06-29 21:12:41 +00002715#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00002716 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002717 if (res < 0)
2718 return posix_error();
Guido van Rossum94f6f721999-01-06 18:42:14 +00002719
2720#if !defined(HAVE_LARGEFILE_SUPPORT)
Barry Warsaw53699e91996-12-10 23:23:01 +00002721 return PyInt_FromLong(res);
Guido van Rossum94f6f721999-01-06 18:42:14 +00002722#else
2723 return PyLong_FromLongLong(res);
2724#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002725}
2726
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002727
2728static char posix_read__doc__[] =
2729"read(fd, buffersize) -> string\n\
2730Read a file descriptor.";
2731
Barry Warsaw53699e91996-12-10 23:23:01 +00002732static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002733posix_read(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002734 PyObject *self;
2735 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002736{
Guido van Rossum8bac5461996-06-11 18:38:48 +00002737 int fd, size, n;
Barry Warsaw53699e91996-12-10 23:23:01 +00002738 PyObject *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002739 if (!PyArg_ParseTuple(args, "ii:read", &fd, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00002740 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002741 buffer = PyString_FromStringAndSize((char *)NULL, size);
Guido van Rossum687dd131993-05-17 08:34:16 +00002742 if (buffer == NULL)
2743 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002744 Py_BEGIN_ALLOW_THREADS
2745 n = read(fd, PyString_AsString(buffer), size);
2746 Py_END_ALLOW_THREADS
Guido van Rossum8bac5461996-06-11 18:38:48 +00002747 if (n < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002748 Py_DECREF(buffer);
Guido van Rossum687dd131993-05-17 08:34:16 +00002749 return posix_error();
2750 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00002751 if (n != size)
Barry Warsaw53699e91996-12-10 23:23:01 +00002752 _PyString_Resize(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00002753 return buffer;
2754}
2755
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002756
2757static char posix_write__doc__[] =
2758"write(fd, string) -> byteswritten\n\
2759Write a string to a file descriptor.";
2760
Barry Warsaw53699e91996-12-10 23:23:01 +00002761static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002762posix_write(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002763 PyObject *self;
2764 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002765{
2766 int fd, size;
2767 char *buffer;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002768 if (!PyArg_ParseTuple(args, "is#:write", &fd, &buffer, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00002769 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002770 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002771 size = write(fd, buffer, size);
Barry Warsaw53699e91996-12-10 23:23:01 +00002772 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002773 if (size < 0)
2774 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002775 return PyInt_FromLong((long)size);
Guido van Rossum687dd131993-05-17 08:34:16 +00002776}
2777
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002778
2779static char posix_fstat__doc__[]=
2780"fstat(fd) -> (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\
2781Like stat(), but for an open file descriptor.";
2782
Barry Warsaw53699e91996-12-10 23:23:01 +00002783static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002784posix_fstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002785 PyObject *self;
2786 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002787{
2788 int fd;
Fred Drake699f3522000-06-29 21:12:41 +00002789 STRUCT_STAT st;
Guido van Rossum687dd131993-05-17 08:34:16 +00002790 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002791 if (!PyArg_ParseTuple(args, "i:fstat", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002792 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002793 Py_BEGIN_ALLOW_THREADS
Fred Drake699f3522000-06-29 21:12:41 +00002794 res = FSTAT(fd, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00002795 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002796 if (res != 0)
2797 return posix_error();
Fred Drake699f3522000-06-29 21:12:41 +00002798
2799 return _pystat_fromstructstat(st);
Guido van Rossum687dd131993-05-17 08:34:16 +00002800}
2801
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002802
2803static char posix_fdopen__doc__[] =
2804"fdopen(fd, [, mode='r' [, bufsize]]) -> file_object\n\
2805Return an open file object connected to a file descriptor.";
2806
Barry Warsaw53699e91996-12-10 23:23:01 +00002807static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002808posix_fdopen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002809 PyObject *self;
2810 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002811{
Barry Warsaw53699e91996-12-10 23:23:01 +00002812 extern int fclose Py_PROTO((FILE *));
Guido van Rossum687dd131993-05-17 08:34:16 +00002813 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002814 char *mode = "r";
2815 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00002816 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002817 PyObject *f;
2818 if (!PyArg_ParseTuple(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00002819 return NULL;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002820
Barry Warsaw53699e91996-12-10 23:23:01 +00002821 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002822 fp = fdopen(fd, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002823 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002824 if (fp == NULL)
2825 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002826 f = PyFile_FromFile(fp, "(fdopen)", mode, fclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002827 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002828 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002829 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00002830}
2831
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002832
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002833#ifdef HAVE_PIPE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002834static char posix_pipe__doc__[] =
2835"pipe() -> (read_end, write_end)\n\
2836Create a pipe.";
2837
Barry Warsaw53699e91996-12-10 23:23:01 +00002838static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002839posix_pipe(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002840 PyObject *self;
2841 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002842{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002843#if defined(PYOS_OS2)
2844 HFILE read, write;
2845 APIRET rc;
2846
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002847 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002848 return NULL;
2849
2850 Py_BEGIN_ALLOW_THREADS
2851 rc = DosCreatePipe( &read, &write, 4096);
2852 Py_END_ALLOW_THREADS
2853 if (rc != NO_ERROR)
Guido van Rossumd48f2521997-12-05 22:19:34 +00002854 return os2_error(rc);
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002855
2856 return Py_BuildValue("(ii)", read, write);
2857#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002858#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00002859 int fds[2];
2860 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002861 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum687dd131993-05-17 08:34:16 +00002862 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002863 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002864 res = pipe(fds);
Barry Warsaw53699e91996-12-10 23:23:01 +00002865 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002866 if (res != 0)
2867 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002868 return Py_BuildValue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002869#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00002870 HANDLE read, write;
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002871 int read_fd, write_fd;
Guido van Rossum794d8131994-08-23 13:48:48 +00002872 BOOL ok;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002873 if (!PyArg_ParseTuple(args, ":pipe"))
Guido van Rossum794d8131994-08-23 13:48:48 +00002874 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002875 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002876 ok = CreatePipe(&read, &write, NULL, 0);
Barry Warsaw53699e91996-12-10 23:23:01 +00002877 Py_END_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00002878 if (!ok)
2879 return posix_error();
Fred Drake699f3522000-06-29 21:12:41 +00002880 read_fd = _open_osfhandle((intptr_t)read, 0);
2881 write_fd = _open_osfhandle((intptr_t)write, 1);
Guido van Rossumb3f9f4b1998-06-12 15:05:15 +00002882 return Py_BuildValue("(ii)", read_fd, write_fd);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002883#endif /* MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002884#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002885}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002886#endif /* HAVE_PIPE */
2887
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002888
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002889#ifdef HAVE_MKFIFO
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002890static char posix_mkfifo__doc__[] =
2891"mkfifo(file, [, mode=0666]) -> None\n\
2892Create a FIFO (a POSIX named pipe).";
2893
Barry Warsaw53699e91996-12-10 23:23:01 +00002894static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002895posix_mkfifo(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002896 PyObject *self;
2897 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002898{
2899 char *file;
2900 int mode = 0666;
2901 int res;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002902 if (!PyArg_ParseTuple(args, "s|i:mkfifo", &file, &mode))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002903 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002904 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002905 res = mkfifo(file, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002906 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002907 if (res < 0)
2908 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002909 Py_INCREF(Py_None);
2910 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002911}
2912#endif
2913
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002914
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002915#ifdef HAVE_FTRUNCATE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002916static char posix_ftruncate__doc__[] =
2917"ftruncate(fd, length) -> None\n\
2918Truncate a file to a specified length.";
2919
Barry Warsaw53699e91996-12-10 23:23:01 +00002920static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002921posix_ftruncate(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002922 PyObject *self; /* Not used */
2923 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002924{
2925 int fd;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002926 off_t length;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002927 int res;
Guido van Rossum94f6f721999-01-06 18:42:14 +00002928 PyObject *lenobj;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002929
Fred Drake5ab8eaf1999-12-09 21:13:07 +00002930 if (!PyArg_ParseTuple(args, "iO:ftruncate", &fd, &lenobj))
Guido van Rossum94f6f721999-01-06 18:42:14 +00002931 return NULL;
2932
2933#if !defined(HAVE_LARGEFILE_SUPPORT)
2934 length = PyInt_AsLong(lenobj);
2935#else
2936 length = PyLong_Check(lenobj) ?
2937 PyLong_AsLongLong(lenobj) : PyInt_AsLong(lenobj);
2938#endif
2939 if (PyErr_Occurred())
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002940 return NULL;
2941
Barry Warsaw53699e91996-12-10 23:23:01 +00002942 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002943 res = ftruncate(fd, length);
Barry Warsaw53699e91996-12-10 23:23:01 +00002944 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002945 if (res < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002946 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002947 return NULL;
2948 }
Barry Warsaw53699e91996-12-10 23:23:01 +00002949 Py_INCREF(Py_None);
2950 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002951}
2952#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002953
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002954#ifdef NeXT
2955#define HAVE_PUTENV
2956/* Steve Spicklemire got this putenv from NeXTAnswers */
2957static int
2958putenv(char *newval)
2959{
2960 extern char **environ;
2961
2962 static int firstTime = 1;
2963 char **ep;
2964 char *cp;
2965 int esiz;
2966 char *np;
2967
2968 if (!(np = strchr(newval, '=')))
2969 return 1;
2970 *np = '\0';
2971
2972 /* look it up */
2973 for (ep=environ ; *ep ; ep++)
2974 {
2975 /* this should always be true... */
2976 if (cp = strchr(*ep, '='))
2977 {
2978 *cp = '\0';
2979 if (!strcmp(*ep, newval))
2980 {
2981 /* got it! */
2982 *cp = '=';
2983 break;
2984 }
2985 *cp = '=';
2986 }
2987 else
2988 {
2989 *np = '=';
2990 return 1;
2991 }
2992 }
2993
2994 *np = '=';
2995 if (*ep)
2996 {
2997 /* the string was already there:
2998 just replace it with the new one */
2999 *ep = newval;
3000 return 0;
3001 }
3002
3003 /* expand environ by one */
3004 for (esiz=2, ep=environ ; *ep ; ep++)
3005 esiz++;
3006 if (firstTime)
3007 {
3008 char **epp;
3009 char **newenv;
3010 if (!(newenv = malloc(esiz * sizeof(char *))))
3011 return 1;
3012
3013 for (ep=environ, epp=newenv ; *ep ;)
3014 *epp++ = *ep++;
3015 *epp++ = newval;
3016 *epp = (char *) 0;
3017 environ = newenv;
3018 }
3019 else
3020 {
3021 if (!(environ = realloc(environ, esiz * sizeof(char *))))
3022 return 1;
3023 environ[esiz - 2] = newval;
3024 environ[esiz - 1] = (char *) 0;
3025 firstTime = 0;
3026 }
3027
3028 return 0;
3029}
Guido van Rossumc6ef2041997-08-21 02:30:45 +00003030#endif /* NeXT */
Guido van Rossumb9f866c1997-05-22 15:12:39 +00003031
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003032
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003033#ifdef HAVE_PUTENV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00003034static char posix_putenv__doc__[] =
3035"putenv(key, value) -> None\n\
3036Change or add an environment variable.";
3037
Guido van Rossumbcc20741998-08-04 22:53:56 +00003038#ifdef __BEOS__
3039/* We have putenv(), but not in the headers (as of PR2). - [cjh] */
3040int putenv( const char *str );
3041#endif
3042
Fred Drake762e2061999-08-26 17:23:54 +00003043/* Save putenv() parameters as values here, so we can collect them when they
3044 * get re-set with another call for the same key. */
3045static PyObject *posix_putenv_garbage;
3046
Barry Warsaw53699e91996-12-10 23:23:01 +00003047static PyObject *
Guido van Rossumb6a47161997-09-15 22:54:34 +00003048posix_putenv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00003049 PyObject *self;
3050 PyObject *args;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003051{
3052 char *s1, *s2;
3053 char *new;
Fred Drake762e2061999-08-26 17:23:54 +00003054 PyObject *newstr;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003055
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003056 if (!PyArg_ParseTuple(args, "ss:putenv", &s1, &s2))
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003057 return NULL;
Guido van Rossumd48f2521997-12-05 22:19:34 +00003058
3059#if defined(PYOS_OS2)
3060 if (stricmp(s1, "BEGINLIBPATH") == 0) {
3061 APIRET rc;
3062
3063 if (strlen(s2) == 0) /* If New Value is an Empty String */
3064 s2 = NULL; /* Then OS/2 API Wants a NULL to Undefine It */
3065
3066 rc = DosSetExtLIBPATH(s2, BEGIN_LIBPATH);
3067 if (rc != NO_ERROR)
3068 return os2_error(rc);
3069
3070 } else if (stricmp(s1, "ENDLIBPATH") == 0) {
3071 APIRET rc;
3072
3073 if (strlen(s2) == 0) /* If New Value is an Empty String */
3074 s2 = NULL; /* Then OS/2 API Wants a NULL to Undefine It */
3075
3076 rc = DosSetExtLIBPATH(s2, END_LIBPATH);
3077 if (rc != NO_ERROR)
3078 return os2_error(rc);
3079 } else {
3080#endif
3081
Fred Drake762e2061999-08-26 17:23:54 +00003082 /* XXX This can leak memory -- not easy to fix :-( */
3083 newstr = PyString_FromStringAndSize(NULL, strlen(s1) + strlen(s2) + 2);
3084 if (newstr == NULL)
3085 return PyErr_NoMemory();
3086 new = PyString_AS_STRING(newstr);
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003087 (void) sprintf(new, "%s=%s", s1, s2);
3088 if (putenv(new)) {
3089 posix_error();
3090 return NULL;
3091 }
Fred Drake762e2061999-08-26 17:23:54 +00003092 /* Install the first arg and newstr in posix_putenv_garbage;
3093 * this will cause previous value to be collected. This has to
3094 * happen after the real putenv() call because the old value
3095 * was still accessible until then. */
3096 if (PyDict_SetItem(posix_putenv_garbage,
3097 PyTuple_GET_ITEM(args, 0), newstr)) {
3098 /* really not much we can do; just leak */
3099 PyErr_Clear();
3100 }
3101 else {
3102 Py_DECREF(newstr);
3103 }
Guido van Rossumd48f2521997-12-05 22:19:34 +00003104
3105#if defined(PYOS_OS2)
3106 }
3107#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00003108 Py_INCREF(Py_None);
3109 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003110}
Guido van Rossumb6a47161997-09-15 22:54:34 +00003111#endif /* putenv */
3112
3113#ifdef HAVE_STRERROR
3114static char posix_strerror__doc__[] =
3115"strerror(code) -> string\n\
3116Translate an error code to a message string.";
3117
3118PyObject *
3119posix_strerror(self, args)
3120 PyObject *self;
3121 PyObject *args;
3122{
3123 int code;
3124 char *message;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003125 if (!PyArg_ParseTuple(args, "i:strerror", &code))
Guido van Rossumb6a47161997-09-15 22:54:34 +00003126 return NULL;
3127 message = strerror(code);
3128 if (message == NULL) {
3129 PyErr_SetString(PyExc_ValueError,
3130 "strerror code out of range");
3131 return NULL;
3132 }
3133 return PyString_FromString(message);
3134}
3135#endif /* strerror */
3136
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00003137
Guido van Rossumc9641791998-08-04 15:26:23 +00003138#ifdef HAVE_SYS_WAIT_H
3139
3140#ifdef WIFSTOPPED
3141static char posix_WIFSTOPPED__doc__[] =
3142"WIFSTOPPED(status) -> Boolean\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003143Return true if the process returning 'status' was stopped.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003144
3145static PyObject *
3146posix_WIFSTOPPED(self, args)
3147 PyObject *self;
3148 PyObject *args;
3149{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003150#ifdef UNION_WAIT
3151 union wait status;
3152#define status_i (status.w_status)
3153#else
3154 int status;
3155#define status_i status
3156#endif
3157 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003158
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003159 if (!PyArg_ParseTuple(args, "i:WIFSTOPPED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003160 {
3161 return NULL;
3162 }
3163
3164 return Py_BuildValue("i", WIFSTOPPED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003165#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003166}
3167#endif /* WIFSTOPPED */
3168
3169#ifdef WIFSIGNALED
3170static char posix_WIFSIGNALED__doc__[] =
3171"WIFSIGNALED(status) -> Boolean\n\
Guido van Rossum3366d1c1999-02-23 18:34:43 +00003172Return true if the process returning 'status' was terminated by a signal.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003173
3174static PyObject *
3175posix_WIFSIGNALED(self, args)
3176 PyObject *self;
3177 PyObject *args;
3178{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003179#ifdef UNION_WAIT
3180 union wait status;
3181#define status_i (status.w_status)
3182#else
3183 int status;
3184#define status_i status
3185#endif
3186 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003187
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003188 if (!PyArg_ParseTuple(args, "i:WIFSIGNALED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003189 {
3190 return NULL;
3191 }
3192
3193 return Py_BuildValue("i", WIFSIGNALED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003194#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003195}
3196#endif /* WIFSIGNALED */
3197
3198#ifdef WIFEXITED
3199static char posix_WIFEXITED__doc__[] =
3200"WIFEXITED(status) -> Boolean\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003201Return true if the process returning 'status' exited using the exit()\n\
3202system call.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003203
3204static PyObject *
3205posix_WIFEXITED(self, args)
3206 PyObject *self;
3207 PyObject *args;
3208{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003209#ifdef UNION_WAIT
3210 union wait status;
3211#define status_i (status.w_status)
3212#else
3213 int status;
3214#define status_i status
3215#endif
3216 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003217
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003218 if (!PyArg_ParseTuple(args, "i:WIFEXITED", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003219 {
3220 return NULL;
3221 }
3222
3223 return Py_BuildValue("i", WIFEXITED(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003224#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003225}
3226#endif /* WIFEXITED */
3227
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003228#ifdef WEXITSTATUS
Guido van Rossumc9641791998-08-04 15:26:23 +00003229static char posix_WEXITSTATUS__doc__[] =
3230"WEXITSTATUS(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003231Return the process return code from 'status'.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003232
3233static PyObject *
3234posix_WEXITSTATUS(self, args)
3235 PyObject *self;
3236 PyObject *args;
3237{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003238#ifdef UNION_WAIT
3239 union wait status;
3240#define status_i (status.w_status)
3241#else
3242 int status;
3243#define status_i status
3244#endif
3245 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003246
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003247 if (!PyArg_ParseTuple(args, "i:WEXITSTATUS", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003248 {
3249 return NULL;
3250 }
3251
3252 return Py_BuildValue("i", WEXITSTATUS(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003253#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003254}
3255#endif /* WEXITSTATUS */
3256
3257#ifdef WTERMSIG
3258static char posix_WTERMSIG__doc__[] =
3259"WTERMSIG(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003260Return the signal that terminated the process that provided the 'status'\n\
3261value.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003262
3263static PyObject *
3264posix_WTERMSIG(self, args)
3265 PyObject *self;
3266 PyObject *args;
3267{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003268#ifdef UNION_WAIT
3269 union wait status;
3270#define status_i (status.w_status)
3271#else
3272 int status;
3273#define status_i status
3274#endif
3275 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003276
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003277 if (!PyArg_ParseTuple(args, "i:WTERMSIG", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003278 {
3279 return NULL;
3280 }
3281
3282 return Py_BuildValue("i", WTERMSIG(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003283#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003284}
3285#endif /* WTERMSIG */
3286
3287#ifdef WSTOPSIG
3288static char posix_WSTOPSIG__doc__[] =
3289"WSTOPSIG(status) -> integer\n\
Fred Drake7e3535c1999-02-02 16:37:11 +00003290Return the signal that stopped the process that provided the 'status' value.";
Guido van Rossumc9641791998-08-04 15:26:23 +00003291
3292static PyObject *
3293posix_WSTOPSIG(self, args)
3294 PyObject *self;
3295 PyObject *args;
3296{
Guido van Rossum54ecc3d1999-01-27 17:53:11 +00003297#ifdef UNION_WAIT
3298 union wait status;
3299#define status_i (status.w_status)
3300#else
3301 int status;
3302#define status_i status
3303#endif
3304 status_i = 0;
Guido van Rossumc9641791998-08-04 15:26:23 +00003305
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003306 if (!PyArg_ParseTuple(args, "i:WSTOPSIG", &status_i))
Guido van Rossumc9641791998-08-04 15:26:23 +00003307 {
3308 return NULL;
3309 }
3310
3311 return Py_BuildValue("i", WSTOPSIG(status));
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003312#undef status_i
Guido van Rossumc9641791998-08-04 15:26:23 +00003313}
3314#endif /* WSTOPSIG */
3315
3316#endif /* HAVE_SYS_WAIT_H */
3317
3318
Guido van Rossum94f6f721999-01-06 18:42:14 +00003319#if defined(HAVE_FSTATVFS)
Guido van Rossumd5753e11999-10-19 13:29:23 +00003320#ifdef _SCO_DS
3321/* SCO OpenServer 5.0 and later requires _SVID3 before it reveals the
3322 needed definitions in sys/statvfs.h */
3323#define _SVID3
3324#endif
Guido van Rossum94f6f721999-01-06 18:42:14 +00003325#include <sys/statvfs.h>
3326
3327static char posix_fstatvfs__doc__[] =
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003328"fstatvfs(fd) -> \n\
3329 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +00003330Perform an fstatvfs system call on the given fd.";
3331
3332static PyObject *
3333posix_fstatvfs(self, args)
3334 PyObject *self;
3335 PyObject *args;
3336{
3337 int fd, res;
3338 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003339 if (!PyArg_ParseTuple(args, "i:fstatvfs", &fd))
Guido van Rossum94f6f721999-01-06 18:42:14 +00003340 return NULL;
3341 Py_BEGIN_ALLOW_THREADS
3342 res = fstatvfs(fd, &st);
3343 Py_END_ALLOW_THREADS
3344 if (res != 0)
3345 return posix_error();
3346#if !defined(HAVE_LARGEFILE_SUPPORT)
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003347 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003348 (long) st.f_bsize,
3349 (long) st.f_frsize,
3350 (long) st.f_blocks,
3351 (long) st.f_bfree,
3352 (long) st.f_bavail,
3353 (long) st.f_files,
3354 (long) st.f_ffree,
3355 (long) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003356 (long) st.f_flag,
3357 (long) st.f_namemax);
3358#else
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003359 return Py_BuildValue("(llLLLLLLll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003360 (long) st.f_bsize,
3361 (long) st.f_frsize,
3362 (LONG_LONG) st.f_blocks,
3363 (LONG_LONG) st.f_bfree,
3364 (LONG_LONG) st.f_bavail,
3365 (LONG_LONG) st.f_files,
3366 (LONG_LONG) st.f_ffree,
3367 (LONG_LONG) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003368 (long) st.f_flag,
3369 (long) st.f_namemax);
3370#endif
3371}
3372#endif /* HAVE_FSTATVFS */
3373
3374
3375#if defined(HAVE_STATVFS)
3376#include <sys/statvfs.h>
3377
3378static char posix_statvfs__doc__[] =
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003379"statvfs(path) -> \n\
3380 (bsize, frsize, blocks, bfree, bavail, files, ffree, favail, flag, namemax)\n\
Guido van Rossum94f6f721999-01-06 18:42:14 +00003381Perform a statvfs system call on the given path.";
3382
3383static PyObject *
3384posix_statvfs(self, args)
3385 PyObject *self;
3386 PyObject *args;
3387{
3388 char *path;
3389 int res;
3390 struct statvfs st;
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003391 if (!PyArg_ParseTuple(args, "s:statvfs", &path))
Guido van Rossum94f6f721999-01-06 18:42:14 +00003392 return NULL;
3393 Py_BEGIN_ALLOW_THREADS
3394 res = statvfs(path, &st);
3395 Py_END_ALLOW_THREADS
3396 if (res != 0)
3397 return posix_error_with_filename(path);
3398#if !defined(HAVE_LARGEFILE_SUPPORT)
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003399 return Py_BuildValue("(llllllllll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003400 (long) st.f_bsize,
3401 (long) st.f_frsize,
3402 (long) st.f_blocks,
3403 (long) st.f_bfree,
3404 (long) st.f_bavail,
3405 (long) st.f_files,
3406 (long) st.f_ffree,
3407 (long) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003408 (long) st.f_flag,
3409 (long) st.f_namemax);
3410#else /* HAVE_LARGEFILE_SUPPORT */
Guido van Rossum0c9608c1999-02-03 16:32:37 +00003411 return Py_BuildValue("(llLLLLLLll)",
Guido van Rossum94f6f721999-01-06 18:42:14 +00003412 (long) st.f_bsize,
3413 (long) st.f_frsize,
3414 (LONG_LONG) st.f_blocks,
3415 (LONG_LONG) st.f_bfree,
3416 (LONG_LONG) st.f_bavail,
3417 (LONG_LONG) st.f_files,
3418 (LONG_LONG) st.f_ffree,
3419 (LONG_LONG) st.f_favail,
Guido van Rossum94f6f721999-01-06 18:42:14 +00003420 (long) st.f_flag,
3421 (long) st.f_namemax);
3422#endif
3423}
3424#endif /* HAVE_STATVFS */
3425
3426
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003427#ifdef HAVE_TEMPNAM
3428static char posix_tempnam__doc__[] = "\
3429tempnam([dir[, prefix]]) -> string\n\
3430Return a unique name for a temporary file.\n\
3431The directory and a short may be specified as strings; they may be omitted\n\
3432or None if not needed.";
3433
3434static PyObject *
3435posix_tempnam(self, args)
3436 PyObject *self;
3437 PyObject *args;
3438{
3439 PyObject *result = NULL;
3440 char *dir = NULL;
3441 char *pfx = NULL;
3442 char *name;
3443
3444 if (!PyArg_ParseTuple(args, "|zz:tempnam", &dir, &pfx))
3445 return NULL;
3446 name = tempnam(dir, pfx);
3447 if (name == NULL)
3448 return PyErr_NoMemory();
3449 result = PyString_FromString(name);
3450 free(name);
3451 return result;
3452}
Guido van Rossumd371ff11999-01-25 16:12:23 +00003453#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003454
3455
3456#ifdef HAVE_TMPFILE
3457static char posix_tmpfile__doc__[] = "\
3458tmpfile() -> file object\n\
3459Create a temporary file with no directory entries.";
3460
3461static PyObject *
3462posix_tmpfile(self, args)
3463 PyObject *self;
3464 PyObject *args;
3465{
3466 FILE *fp;
3467
3468 if (!PyArg_ParseTuple(args, ":tmpfile"))
3469 return NULL;
3470 fp = tmpfile();
3471 if (fp == NULL)
3472 return posix_error();
3473 return PyFile_FromFile(fp, "<tmpfile>", "w+", fclose);
3474}
3475#endif
3476
3477
3478#ifdef HAVE_TMPNAM
3479static char posix_tmpnam__doc__[] = "\
3480tmpnam() -> string\n\
3481Return a unique name for a temporary file.";
3482
3483static PyObject *
3484posix_tmpnam(self, args)
3485 PyObject *self;
3486 PyObject *args;
3487{
3488 char buffer[L_tmpnam];
3489 char *name;
3490
3491 if (!PyArg_ParseTuple(args, ":tmpnam"))
3492 return NULL;
Greg Wardb48bc172000-03-01 21:51:56 +00003493#ifdef USE_TMPNAM_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003494 name = tmpnam_r(buffer);
3495#else
3496 name = tmpnam(buffer);
3497#endif
3498 if (name == NULL) {
3499 PyErr_SetObject(PyExc_OSError,
3500 Py_BuildValue("is", 0,
Greg Wardb48bc172000-03-01 21:51:56 +00003501#ifdef USE_TMPNAM_R
Fred Drake5ab8eaf1999-12-09 21:13:07 +00003502 "unexpected NULL from tmpnam_r"
3503#else
3504 "unexpected NULL from tmpnam"
3505#endif
3506 ));
3507 return NULL;
3508 }
3509 return PyString_FromString(buffer);
3510}
3511#endif
3512
3513
Fred Drakec9680921999-12-13 16:37:25 +00003514/* This is used for fpathconf(), pathconf(), confstr() and sysconf().
3515 * It maps strings representing configuration variable names to
3516 * integer values, allowing those functions to be called with the
3517 * magic names instead of poluting the module's namespace with tons of
Fred Drake12c6e2d1999-12-14 21:25:03 +00003518 * rarely-used constants. There are three separate tables that use
3519 * these definitions.
Fred Drakebec628d1999-12-15 18:31:10 +00003520 *
3521 * This code is always included, even if none of the interfaces that
3522 * need it are included. The #if hackery needed to avoid it would be
3523 * sufficiently pervasive that it's not worth the loss of readability.
Fred Drakec9680921999-12-13 16:37:25 +00003524 */
3525struct constdef {
3526 char *name;
3527 long value;
3528};
3529
Fred Drake12c6e2d1999-12-14 21:25:03 +00003530static int
3531conv_confname(arg, valuep, table, tablesize)
3532 PyObject *arg;
3533 int *valuep;
3534 struct constdef *table;
3535 size_t tablesize;
3536{
3537 if (PyInt_Check(arg)) {
3538 *valuep = PyInt_AS_LONG(arg);
3539 return 1;
3540 }
3541 if (PyString_Check(arg)) {
3542 /* look up the value in the table using a binary search */
Fred Drake699f3522000-06-29 21:12:41 +00003543 size_t lo = 0;
3544 size_t mid;
3545 size_t hi = tablesize;
3546 int cmp;
Fred Drake12c6e2d1999-12-14 21:25:03 +00003547 char *confname = PyString_AS_STRING(arg);
3548 while (lo < hi) {
3549 mid = (lo + hi) / 2;
3550 cmp = strcmp(confname, table[mid].name);
3551 if (cmp < 0)
3552 hi = mid;
3553 else if (cmp > 0)
3554 lo = mid + 1;
3555 else {
3556 *valuep = table[mid].value;
3557 return 1;
3558 }
3559 }
3560 PyErr_SetString(PyExc_ValueError, "unrecognized configuration name");
3561 }
3562 else
3563 PyErr_SetString(PyExc_TypeError,
3564 "configuration names must be strings or integers");
3565 return 0;
3566}
3567
3568
3569#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
3570static struct constdef posix_constants_pathconf[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003571#ifdef _PC_ABI_AIO_XFER_MAX
3572 {"PC_ABI_AIO_XFER_MAX", _PC_ABI_AIO_XFER_MAX},
3573#endif
3574#ifdef _PC_ABI_ASYNC_IO
3575 {"PC_ABI_ASYNC_IO", _PC_ABI_ASYNC_IO},
3576#endif
Fred Drakec9680921999-12-13 16:37:25 +00003577#ifdef _PC_ASYNC_IO
3578 {"PC_ASYNC_IO", _PC_ASYNC_IO},
3579#endif
3580#ifdef _PC_CHOWN_RESTRICTED
3581 {"PC_CHOWN_RESTRICTED", _PC_CHOWN_RESTRICTED},
3582#endif
3583#ifdef _PC_FILESIZEBITS
3584 {"PC_FILESIZEBITS", _PC_FILESIZEBITS},
3585#endif
3586#ifdef _PC_LAST
3587 {"PC_LAST", _PC_LAST},
3588#endif
3589#ifdef _PC_LINK_MAX
3590 {"PC_LINK_MAX", _PC_LINK_MAX},
3591#endif
3592#ifdef _PC_MAX_CANON
3593 {"PC_MAX_CANON", _PC_MAX_CANON},
3594#endif
3595#ifdef _PC_MAX_INPUT
3596 {"PC_MAX_INPUT", _PC_MAX_INPUT},
3597#endif
3598#ifdef _PC_NAME_MAX
3599 {"PC_NAME_MAX", _PC_NAME_MAX},
3600#endif
3601#ifdef _PC_NO_TRUNC
3602 {"PC_NO_TRUNC", _PC_NO_TRUNC},
3603#endif
3604#ifdef _PC_PATH_MAX
3605 {"PC_PATH_MAX", _PC_PATH_MAX},
3606#endif
3607#ifdef _PC_PIPE_BUF
3608 {"PC_PIPE_BUF", _PC_PIPE_BUF},
3609#endif
3610#ifdef _PC_PRIO_IO
3611 {"PC_PRIO_IO", _PC_PRIO_IO},
3612#endif
3613#ifdef _PC_SOCK_MAXBUF
3614 {"PC_SOCK_MAXBUF", _PC_SOCK_MAXBUF},
3615#endif
3616#ifdef _PC_SYNC_IO
3617 {"PC_SYNC_IO", _PC_SYNC_IO},
3618#endif
3619#ifdef _PC_VDISABLE
3620 {"PC_VDISABLE", _PC_VDISABLE},
3621#endif
3622};
3623
Fred Drakec9680921999-12-13 16:37:25 +00003624static int
3625conv_path_confname(arg, valuep)
3626 PyObject *arg;
3627 int *valuep;
3628{
3629 return conv_confname(arg, valuep, posix_constants_pathconf,
3630 sizeof(posix_constants_pathconf)
3631 / sizeof(struct constdef));
3632}
3633#endif
3634
3635#ifdef HAVE_FPATHCONF
3636static char posix_fpathconf__doc__[] = "\
3637fpathconf(fd, name) -> integer\n\
3638Return the configuration limit name for the file descriptor fd.\n\
3639If there is no limit, return -1.";
3640
3641static PyObject *
3642posix_fpathconf(self, args)
3643 PyObject *self;
3644 PyObject *args;
3645{
3646 PyObject *result = NULL;
3647 int name, fd;
3648
Fred Drake12c6e2d1999-12-14 21:25:03 +00003649 if (PyArg_ParseTuple(args, "iO&:fpathconf", &fd,
3650 conv_path_confname, &name)) {
Fred Drakec9680921999-12-13 16:37:25 +00003651 long limit;
3652
3653 errno = 0;
3654 limit = fpathconf(fd, name);
3655 if (limit == -1 && errno != 0)
3656 posix_error();
3657 else
3658 result = PyInt_FromLong(limit);
3659 }
3660 return result;
3661}
3662#endif
3663
3664
3665#ifdef HAVE_PATHCONF
3666static char posix_pathconf__doc__[] = "\
3667pathconf(path, name) -> integer\n\
3668Return the configuration limit name for the file or directory path.\n\
3669If there is no limit, return -1.";
3670
3671static PyObject *
3672posix_pathconf(self, args)
3673 PyObject *self;
3674 PyObject *args;
3675{
3676 PyObject *result = NULL;
3677 int name;
3678 char *path;
3679
3680 if (PyArg_ParseTuple(args, "sO&:pathconf", &path,
3681 conv_path_confname, &name)) {
3682 long limit;
3683
3684 errno = 0;
3685 limit = pathconf(path, name);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003686 if (limit == -1 && errno != 0) {
Fred Drakec9680921999-12-13 16:37:25 +00003687 if (errno == EINVAL)
3688 /* could be a path or name problem */
3689 posix_error();
3690 else
3691 posix_error_with_filename(path);
Fred Drake12c6e2d1999-12-14 21:25:03 +00003692 }
Fred Drakec9680921999-12-13 16:37:25 +00003693 else
3694 result = PyInt_FromLong(limit);
3695 }
3696 return result;
3697}
3698#endif
3699
3700#ifdef HAVE_CONFSTR
3701static struct constdef posix_constants_confstr[] = {
Fred Draked86ed291999-12-15 15:34:33 +00003702#ifdef _CS_ARCHITECTURE
3703 {"CS_ARCHITECTURE", _CS_ARCHITECTURE},
3704#endif
3705#ifdef _CS_HOSTNAME
3706 {"CS_HOSTNAME", _CS_HOSTNAME},
3707#endif
3708#ifdef _CS_HW_PROVIDER
3709 {"CS_HW_PROVIDER", _CS_HW_PROVIDER},
3710#endif
3711#ifdef _CS_HW_SERIAL
3712 {"CS_HW_SERIAL", _CS_HW_SERIAL},
3713#endif
3714#ifdef _CS_INITTAB_NAME
3715 {"CS_INITTAB_NAME", _CS_INITTAB_NAME},
3716#endif
Fred Drakec9680921999-12-13 16:37:25 +00003717#ifdef _CS_LFS64_CFLAGS
3718 {"CS_LFS64_CFLAGS", _CS_LFS64_CFLAGS},
3719#endif
3720#ifdef _CS_LFS64_LDFLAGS
3721 {"CS_LFS64_LDFLAGS", _CS_LFS64_LDFLAGS},
3722#endif
3723#ifdef _CS_LFS64_LIBS
3724 {"CS_LFS64_LIBS", _CS_LFS64_LIBS},
3725#endif
3726#ifdef _CS_LFS64_LINTFLAGS
3727 {"CS_LFS64_LINTFLAGS", _CS_LFS64_LINTFLAGS},
3728#endif
3729#ifdef _CS_LFS_CFLAGS
3730 {"CS_LFS_CFLAGS", _CS_LFS_CFLAGS},
3731#endif
3732#ifdef _CS_LFS_LDFLAGS
3733 {"CS_LFS_LDFLAGS", _CS_LFS_LDFLAGS},
3734#endif
3735#ifdef _CS_LFS_LIBS
3736 {"CS_LFS_LIBS", _CS_LFS_LIBS},
3737#endif
3738#ifdef _CS_LFS_LINTFLAGS
3739 {"CS_LFS_LINTFLAGS", _CS_LFS_LINTFLAGS},
3740#endif
Fred Draked86ed291999-12-15 15:34:33 +00003741#ifdef _CS_MACHINE
3742 {"CS_MACHINE", _CS_MACHINE},
3743#endif
Fred Drakec9680921999-12-13 16:37:25 +00003744#ifdef _CS_PATH
3745 {"CS_PATH", _CS_PATH},
3746#endif
Fred Draked86ed291999-12-15 15:34:33 +00003747#ifdef _CS_RELEASE
3748 {"CS_RELEASE", _CS_RELEASE},
3749#endif
3750#ifdef _CS_SRPC_DOMAIN
3751 {"CS_SRPC_DOMAIN", _CS_SRPC_DOMAIN},
3752#endif
3753#ifdef _CS_SYSNAME
3754 {"CS_SYSNAME", _CS_SYSNAME},
3755#endif
3756#ifdef _CS_VERSION
3757 {"CS_VERSION", _CS_VERSION},
3758#endif
Fred Drakec9680921999-12-13 16:37:25 +00003759#ifdef _CS_XBS5_ILP32_OFF32_CFLAGS
3760 {"CS_XBS5_ILP32_OFF32_CFLAGS", _CS_XBS5_ILP32_OFF32_CFLAGS},
3761#endif
3762#ifdef _CS_XBS5_ILP32_OFF32_LDFLAGS
3763 {"CS_XBS5_ILP32_OFF32_LDFLAGS", _CS_XBS5_ILP32_OFF32_LDFLAGS},
3764#endif
3765#ifdef _CS_XBS5_ILP32_OFF32_LIBS
3766 {"CS_XBS5_ILP32_OFF32_LIBS", _CS_XBS5_ILP32_OFF32_LIBS},
3767#endif
3768#ifdef _CS_XBS5_ILP32_OFF32_LINTFLAGS
3769 {"CS_XBS5_ILP32_OFF32_LINTFLAGS", _CS_XBS5_ILP32_OFF32_LINTFLAGS},
3770#endif
3771#ifdef _CS_XBS5_ILP32_OFFBIG_CFLAGS
3772 {"CS_XBS5_ILP32_OFFBIG_CFLAGS", _CS_XBS5_ILP32_OFFBIG_CFLAGS},
3773#endif
3774#ifdef _CS_XBS5_ILP32_OFFBIG_LDFLAGS
3775 {"CS_XBS5_ILP32_OFFBIG_LDFLAGS", _CS_XBS5_ILP32_OFFBIG_LDFLAGS},
3776#endif
3777#ifdef _CS_XBS5_ILP32_OFFBIG_LIBS
3778 {"CS_XBS5_ILP32_OFFBIG_LIBS", _CS_XBS5_ILP32_OFFBIG_LIBS},
3779#endif
3780#ifdef _CS_XBS5_ILP32_OFFBIG_LINTFLAGS
3781 {"CS_XBS5_ILP32_OFFBIG_LINTFLAGS", _CS_XBS5_ILP32_OFFBIG_LINTFLAGS},
3782#endif
3783#ifdef _CS_XBS5_LP64_OFF64_CFLAGS
3784 {"CS_XBS5_LP64_OFF64_CFLAGS", _CS_XBS5_LP64_OFF64_CFLAGS},
3785#endif
3786#ifdef _CS_XBS5_LP64_OFF64_LDFLAGS
3787 {"CS_XBS5_LP64_OFF64_LDFLAGS", _CS_XBS5_LP64_OFF64_LDFLAGS},
3788#endif
3789#ifdef _CS_XBS5_LP64_OFF64_LIBS
3790 {"CS_XBS5_LP64_OFF64_LIBS", _CS_XBS5_LP64_OFF64_LIBS},
3791#endif
3792#ifdef _CS_XBS5_LP64_OFF64_LINTFLAGS
3793 {"CS_XBS5_LP64_OFF64_LINTFLAGS", _CS_XBS5_LP64_OFF64_LINTFLAGS},
3794#endif
3795#ifdef _CS_XBS5_LPBIG_OFFBIG_CFLAGS
3796 {"CS_XBS5_LPBIG_OFFBIG_CFLAGS", _CS_XBS5_LPBIG_OFFBIG_CFLAGS},
3797#endif
3798#ifdef _CS_XBS5_LPBIG_OFFBIG_LDFLAGS
3799 {"CS_XBS5_LPBIG_OFFBIG_LDFLAGS", _CS_XBS5_LPBIG_OFFBIG_LDFLAGS},
3800#endif
3801#ifdef _CS_XBS5_LPBIG_OFFBIG_LIBS
3802 {"CS_XBS5_LPBIG_OFFBIG_LIBS", _CS_XBS5_LPBIG_OFFBIG_LIBS},
3803#endif
3804#ifdef _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS
3805 {"CS_XBS5_LPBIG_OFFBIG_LINTFLAGS", _CS_XBS5_LPBIG_OFFBIG_LINTFLAGS},
3806#endif
Fred Draked86ed291999-12-15 15:34:33 +00003807#ifdef _MIPS_CS_AVAIL_PROCESSORS
3808 {"MIPS_CS_AVAIL_PROCESSORS", _MIPS_CS_AVAIL_PROCESSORS},
3809#endif
3810#ifdef _MIPS_CS_BASE
3811 {"MIPS_CS_BASE", _MIPS_CS_BASE},
3812#endif
3813#ifdef _MIPS_CS_HOSTID
3814 {"MIPS_CS_HOSTID", _MIPS_CS_HOSTID},
3815#endif
3816#ifdef _MIPS_CS_HW_NAME
3817 {"MIPS_CS_HW_NAME", _MIPS_CS_HW_NAME},
3818#endif
3819#ifdef _MIPS_CS_NUM_PROCESSORS
3820 {"MIPS_CS_NUM_PROCESSORS", _MIPS_CS_NUM_PROCESSORS},
3821#endif
3822#ifdef _MIPS_CS_OSREL_MAJ
3823 {"MIPS_CS_OSREL_MAJ", _MIPS_CS_OSREL_MAJ},
3824#endif
3825#ifdef _MIPS_CS_OSREL_MIN
3826 {"MIPS_CS_OSREL_MIN", _MIPS_CS_OSREL_MIN},
3827#endif
3828#ifdef _MIPS_CS_OSREL_PATCH
3829 {"MIPS_CS_OSREL_PATCH", _MIPS_CS_OSREL_PATCH},
3830#endif
3831#ifdef _MIPS_CS_OS_NAME
3832 {"MIPS_CS_OS_NAME", _MIPS_CS_OS_NAME},
3833#endif
3834#ifdef _MIPS_CS_OS_PROVIDER
3835 {"MIPS_CS_OS_PROVIDER", _MIPS_CS_OS_PROVIDER},
3836#endif
3837#ifdef _MIPS_CS_PROCESSORS
3838 {"MIPS_CS_PROCESSORS", _MIPS_CS_PROCESSORS},
3839#endif
3840#ifdef _MIPS_CS_SERIAL
3841 {"MIPS_CS_SERIAL", _MIPS_CS_SERIAL},
3842#endif
3843#ifdef _MIPS_CS_VENDOR
3844 {"MIPS_CS_VENDOR", _MIPS_CS_VENDOR},
3845#endif
Fred Drakec9680921999-12-13 16:37:25 +00003846};
3847
3848static int
3849conv_confstr_confname(arg, valuep)
3850 PyObject *arg;
3851 int *valuep;
3852{
3853 return conv_confname(arg, valuep, posix_constants_confstr,
3854 sizeof(posix_constants_confstr)
3855 / sizeof(struct constdef));
3856}
3857
3858static char posix_confstr__doc__[] = "\
3859confstr(name) -> string\n\
3860Return a string-valued system configuration variable.";
3861
3862static PyObject *
3863posix_confstr(self, args)
3864 PyObject *self;
3865 PyObject *args;
3866{
3867 PyObject *result = NULL;
3868 int name;
3869 char buffer[64];
3870
3871 if (PyArg_ParseTuple(args, "O&:confstr", conv_confstr_confname, &name)) {
3872 int len = confstr(name, buffer, sizeof(buffer));
3873
Fred Drakec9680921999-12-13 16:37:25 +00003874 errno = 0;
3875 if (len == 0) {
3876 if (errno != 0)
3877 posix_error();
3878 else
3879 result = PyString_FromString("");
3880 }
3881 else {
3882 if (len >= sizeof(buffer)) {
3883 result = PyString_FromStringAndSize(NULL, len);
3884 if (result != NULL)
3885 confstr(name, PyString_AS_STRING(result), len+1);
3886 }
3887 else
3888 result = PyString_FromString(buffer);
3889 }
3890 }
3891 return result;
3892}
3893#endif
3894
3895
3896#ifdef HAVE_SYSCONF
3897static struct constdef posix_constants_sysconf[] = {
3898#ifdef _SC_2_CHAR_TERM
3899 {"SC_2_CHAR_TERM", _SC_2_CHAR_TERM},
3900#endif
3901#ifdef _SC_2_C_BIND
3902 {"SC_2_C_BIND", _SC_2_C_BIND},
3903#endif
3904#ifdef _SC_2_C_DEV
3905 {"SC_2_C_DEV", _SC_2_C_DEV},
3906#endif
3907#ifdef _SC_2_C_VERSION
3908 {"SC_2_C_VERSION", _SC_2_C_VERSION},
3909#endif
3910#ifdef _SC_2_FORT_DEV
3911 {"SC_2_FORT_DEV", _SC_2_FORT_DEV},
3912#endif
3913#ifdef _SC_2_FORT_RUN
3914 {"SC_2_FORT_RUN", _SC_2_FORT_RUN},
3915#endif
3916#ifdef _SC_2_LOCALEDEF
3917 {"SC_2_LOCALEDEF", _SC_2_LOCALEDEF},
3918#endif
3919#ifdef _SC_2_SW_DEV
3920 {"SC_2_SW_DEV", _SC_2_SW_DEV},
3921#endif
3922#ifdef _SC_2_UPE
3923 {"SC_2_UPE", _SC_2_UPE},
3924#endif
3925#ifdef _SC_2_VERSION
3926 {"SC_2_VERSION", _SC_2_VERSION},
3927#endif
Fred Draked86ed291999-12-15 15:34:33 +00003928#ifdef _SC_ABI_ASYNCHRONOUS_IO
3929 {"SC_ABI_ASYNCHRONOUS_IO", _SC_ABI_ASYNCHRONOUS_IO},
3930#endif
3931#ifdef _SC_ACL
3932 {"SC_ACL", _SC_ACL},
3933#endif
Fred Drakec9680921999-12-13 16:37:25 +00003934#ifdef _SC_AIO_LISTIO_MAX
3935 {"SC_AIO_LISTIO_MAX", _SC_AIO_LISTIO_MAX},
3936#endif
Fred Drakec9680921999-12-13 16:37:25 +00003937#ifdef _SC_AIO_MAX
3938 {"SC_AIO_MAX", _SC_AIO_MAX},
3939#endif
3940#ifdef _SC_AIO_PRIO_DELTA_MAX
3941 {"SC_AIO_PRIO_DELTA_MAX", _SC_AIO_PRIO_DELTA_MAX},
3942#endif
3943#ifdef _SC_ARG_MAX
3944 {"SC_ARG_MAX", _SC_ARG_MAX},
3945#endif
3946#ifdef _SC_ASYNCHRONOUS_IO
3947 {"SC_ASYNCHRONOUS_IO", _SC_ASYNCHRONOUS_IO},
3948#endif
3949#ifdef _SC_ATEXIT_MAX
3950 {"SC_ATEXIT_MAX", _SC_ATEXIT_MAX},
3951#endif
Fred Draked86ed291999-12-15 15:34:33 +00003952#ifdef _SC_AUDIT
3953 {"SC_AUDIT", _SC_AUDIT},
3954#endif
Fred Drakec9680921999-12-13 16:37:25 +00003955#ifdef _SC_AVPHYS_PAGES
3956 {"SC_AVPHYS_PAGES", _SC_AVPHYS_PAGES},
3957#endif
3958#ifdef _SC_BC_BASE_MAX
3959 {"SC_BC_BASE_MAX", _SC_BC_BASE_MAX},
3960#endif
3961#ifdef _SC_BC_DIM_MAX
3962 {"SC_BC_DIM_MAX", _SC_BC_DIM_MAX},
3963#endif
3964#ifdef _SC_BC_SCALE_MAX
3965 {"SC_BC_SCALE_MAX", _SC_BC_SCALE_MAX},
3966#endif
3967#ifdef _SC_BC_STRING_MAX
3968 {"SC_BC_STRING_MAX", _SC_BC_STRING_MAX},
3969#endif
Fred Draked86ed291999-12-15 15:34:33 +00003970#ifdef _SC_CAP
3971 {"SC_CAP", _SC_CAP},
3972#endif
Fred Drakec9680921999-12-13 16:37:25 +00003973#ifdef _SC_CHARCLASS_NAME_MAX
3974 {"SC_CHARCLASS_NAME_MAX", _SC_CHARCLASS_NAME_MAX},
3975#endif
3976#ifdef _SC_CHAR_BIT
3977 {"SC_CHAR_BIT", _SC_CHAR_BIT},
3978#endif
3979#ifdef _SC_CHAR_MAX
3980 {"SC_CHAR_MAX", _SC_CHAR_MAX},
3981#endif
3982#ifdef _SC_CHAR_MIN
3983 {"SC_CHAR_MIN", _SC_CHAR_MIN},
3984#endif
3985#ifdef _SC_CHILD_MAX
3986 {"SC_CHILD_MAX", _SC_CHILD_MAX},
3987#endif
3988#ifdef _SC_CLK_TCK
3989 {"SC_CLK_TCK", _SC_CLK_TCK},
3990#endif
3991#ifdef _SC_COHER_BLKSZ
3992 {"SC_COHER_BLKSZ", _SC_COHER_BLKSZ},
3993#endif
3994#ifdef _SC_COLL_WEIGHTS_MAX
3995 {"SC_COLL_WEIGHTS_MAX", _SC_COLL_WEIGHTS_MAX},
3996#endif
3997#ifdef _SC_DCACHE_ASSOC
3998 {"SC_DCACHE_ASSOC", _SC_DCACHE_ASSOC},
3999#endif
4000#ifdef _SC_DCACHE_BLKSZ
4001 {"SC_DCACHE_BLKSZ", _SC_DCACHE_BLKSZ},
4002#endif
4003#ifdef _SC_DCACHE_LINESZ
4004 {"SC_DCACHE_LINESZ", _SC_DCACHE_LINESZ},
4005#endif
4006#ifdef _SC_DCACHE_SZ
4007 {"SC_DCACHE_SZ", _SC_DCACHE_SZ},
4008#endif
4009#ifdef _SC_DCACHE_TBLKSZ
4010 {"SC_DCACHE_TBLKSZ", _SC_DCACHE_TBLKSZ},
4011#endif
4012#ifdef _SC_DELAYTIMER_MAX
4013 {"SC_DELAYTIMER_MAX", _SC_DELAYTIMER_MAX},
4014#endif
4015#ifdef _SC_EQUIV_CLASS_MAX
4016 {"SC_EQUIV_CLASS_MAX", _SC_EQUIV_CLASS_MAX},
4017#endif
4018#ifdef _SC_EXPR_NEST_MAX
4019 {"SC_EXPR_NEST_MAX", _SC_EXPR_NEST_MAX},
4020#endif
4021#ifdef _SC_FSYNC
4022 {"SC_FSYNC", _SC_FSYNC},
4023#endif
4024#ifdef _SC_GETGR_R_SIZE_MAX
4025 {"SC_GETGR_R_SIZE_MAX", _SC_GETGR_R_SIZE_MAX},
4026#endif
4027#ifdef _SC_GETPW_R_SIZE_MAX
4028 {"SC_GETPW_R_SIZE_MAX", _SC_GETPW_R_SIZE_MAX},
4029#endif
4030#ifdef _SC_ICACHE_ASSOC
4031 {"SC_ICACHE_ASSOC", _SC_ICACHE_ASSOC},
4032#endif
4033#ifdef _SC_ICACHE_BLKSZ
4034 {"SC_ICACHE_BLKSZ", _SC_ICACHE_BLKSZ},
4035#endif
4036#ifdef _SC_ICACHE_LINESZ
4037 {"SC_ICACHE_LINESZ", _SC_ICACHE_LINESZ},
4038#endif
4039#ifdef _SC_ICACHE_SZ
4040 {"SC_ICACHE_SZ", _SC_ICACHE_SZ},
4041#endif
Fred Draked86ed291999-12-15 15:34:33 +00004042#ifdef _SC_INF
4043 {"SC_INF", _SC_INF},
4044#endif
Fred Drakec9680921999-12-13 16:37:25 +00004045#ifdef _SC_INT_MAX
4046 {"SC_INT_MAX", _SC_INT_MAX},
4047#endif
4048#ifdef _SC_INT_MIN
4049 {"SC_INT_MIN", _SC_INT_MIN},
4050#endif
4051#ifdef _SC_IOV_MAX
4052 {"SC_IOV_MAX", _SC_IOV_MAX},
4053#endif
Fred Draked86ed291999-12-15 15:34:33 +00004054#ifdef _SC_IP_SECOPTS
4055 {"SC_IP_SECOPTS", _SC_IP_SECOPTS},
4056#endif
Fred Drakec9680921999-12-13 16:37:25 +00004057#ifdef _SC_JOB_CONTROL
4058 {"SC_JOB_CONTROL", _SC_JOB_CONTROL},
4059#endif
Fred Draked86ed291999-12-15 15:34:33 +00004060#ifdef _SC_KERN_POINTERS
4061 {"SC_KERN_POINTERS", _SC_KERN_POINTERS},
4062#endif
4063#ifdef _SC_KERN_SIM
4064 {"SC_KERN_SIM", _SC_KERN_SIM},
4065#endif
Fred Drakec9680921999-12-13 16:37:25 +00004066#ifdef _SC_LINE_MAX
4067 {"SC_LINE_MAX", _SC_LINE_MAX},
4068#endif
4069#ifdef _SC_LOGIN_NAME_MAX
4070 {"SC_LOGIN_NAME_MAX", _SC_LOGIN_NAME_MAX},
4071#endif
4072#ifdef _SC_LOGNAME_MAX
4073 {"SC_LOGNAME_MAX", _SC_LOGNAME_MAX},
4074#endif
4075#ifdef _SC_LONG_BIT
4076 {"SC_LONG_BIT", _SC_LONG_BIT},
4077#endif
Fred Draked86ed291999-12-15 15:34:33 +00004078#ifdef _SC_MAC
4079 {"SC_MAC", _SC_MAC},
4080#endif
Fred Drakec9680921999-12-13 16:37:25 +00004081#ifdef _SC_MAPPED_FILES
4082 {"SC_MAPPED_FILES", _SC_MAPPED_FILES},
4083#endif
4084#ifdef _SC_MAXPID
4085 {"SC_MAXPID", _SC_MAXPID},
4086#endif
4087#ifdef _SC_MB_LEN_MAX
4088 {"SC_MB_LEN_MAX", _SC_MB_LEN_MAX},
4089#endif
4090#ifdef _SC_MEMLOCK
4091 {"SC_MEMLOCK", _SC_MEMLOCK},
4092#endif
4093#ifdef _SC_MEMLOCK_RANGE
4094 {"SC_MEMLOCK_RANGE", _SC_MEMLOCK_RANGE},
4095#endif
4096#ifdef _SC_MEMORY_PROTECTION
4097 {"SC_MEMORY_PROTECTION", _SC_MEMORY_PROTECTION},
4098#endif
4099#ifdef _SC_MESSAGE_PASSING
4100 {"SC_MESSAGE_PASSING", _SC_MESSAGE_PASSING},
4101#endif
Fred Draked86ed291999-12-15 15:34:33 +00004102#ifdef _SC_MMAP_FIXED_ALIGNMENT
4103 {"SC_MMAP_FIXED_ALIGNMENT", _SC_MMAP_FIXED_ALIGNMENT},
4104#endif
Fred Drakec9680921999-12-13 16:37:25 +00004105#ifdef _SC_MQ_OPEN_MAX
4106 {"SC_MQ_OPEN_MAX", _SC_MQ_OPEN_MAX},
4107#endif
4108#ifdef _SC_MQ_PRIO_MAX
4109 {"SC_MQ_PRIO_MAX", _SC_MQ_PRIO_MAX},
4110#endif
Fred Draked86ed291999-12-15 15:34:33 +00004111#ifdef _SC_NACLS_MAX
4112 {"SC_NACLS_MAX", _SC_NACLS_MAX},
4113#endif
Fred Drakec9680921999-12-13 16:37:25 +00004114#ifdef _SC_NGROUPS_MAX
4115 {"SC_NGROUPS_MAX", _SC_NGROUPS_MAX},
4116#endif
4117#ifdef _SC_NL_ARGMAX
4118 {"SC_NL_ARGMAX", _SC_NL_ARGMAX},
4119#endif
4120#ifdef _SC_NL_LANGMAX
4121 {"SC_NL_LANGMAX", _SC_NL_LANGMAX},
4122#endif
4123#ifdef _SC_NL_MSGMAX
4124 {"SC_NL_MSGMAX", _SC_NL_MSGMAX},
4125#endif
4126#ifdef _SC_NL_NMAX
4127 {"SC_NL_NMAX", _SC_NL_NMAX},
4128#endif
4129#ifdef _SC_NL_SETMAX
4130 {"SC_NL_SETMAX", _SC_NL_SETMAX},
4131#endif
4132#ifdef _SC_NL_TEXTMAX
4133 {"SC_NL_TEXTMAX", _SC_NL_TEXTMAX},
4134#endif
4135#ifdef _SC_NPROCESSORS_CONF
4136 {"SC_NPROCESSORS_CONF", _SC_NPROCESSORS_CONF},
4137#endif
4138#ifdef _SC_NPROCESSORS_ONLN
4139 {"SC_NPROCESSORS_ONLN", _SC_NPROCESSORS_ONLN},
4140#endif
Fred Draked86ed291999-12-15 15:34:33 +00004141#ifdef _SC_NPROC_CONF
4142 {"SC_NPROC_CONF", _SC_NPROC_CONF},
4143#endif
4144#ifdef _SC_NPROC_ONLN
4145 {"SC_NPROC_ONLN", _SC_NPROC_ONLN},
4146#endif
Fred Drakec9680921999-12-13 16:37:25 +00004147#ifdef _SC_NZERO
4148 {"SC_NZERO", _SC_NZERO},
4149#endif
4150#ifdef _SC_OPEN_MAX
4151 {"SC_OPEN_MAX", _SC_OPEN_MAX},
4152#endif
4153#ifdef _SC_PAGESIZE
4154 {"SC_PAGESIZE", _SC_PAGESIZE},
4155#endif
4156#ifdef _SC_PAGE_SIZE
4157 {"SC_PAGE_SIZE", _SC_PAGE_SIZE},
4158#endif
4159#ifdef _SC_PASS_MAX
4160 {"SC_PASS_MAX", _SC_PASS_MAX},
4161#endif
4162#ifdef _SC_PHYS_PAGES
4163 {"SC_PHYS_PAGES", _SC_PHYS_PAGES},
4164#endif
4165#ifdef _SC_PII
4166 {"SC_PII", _SC_PII},
4167#endif
4168#ifdef _SC_PII_INTERNET
4169 {"SC_PII_INTERNET", _SC_PII_INTERNET},
4170#endif
4171#ifdef _SC_PII_INTERNET_DGRAM
4172 {"SC_PII_INTERNET_DGRAM", _SC_PII_INTERNET_DGRAM},
4173#endif
4174#ifdef _SC_PII_INTERNET_STREAM
4175 {"SC_PII_INTERNET_STREAM", _SC_PII_INTERNET_STREAM},
4176#endif
4177#ifdef _SC_PII_OSI
4178 {"SC_PII_OSI", _SC_PII_OSI},
4179#endif
4180#ifdef _SC_PII_OSI_CLTS
4181 {"SC_PII_OSI_CLTS", _SC_PII_OSI_CLTS},
4182#endif
4183#ifdef _SC_PII_OSI_COTS
4184 {"SC_PII_OSI_COTS", _SC_PII_OSI_COTS},
4185#endif
4186#ifdef _SC_PII_OSI_M
4187 {"SC_PII_OSI_M", _SC_PII_OSI_M},
4188#endif
4189#ifdef _SC_PII_SOCKET
4190 {"SC_PII_SOCKET", _SC_PII_SOCKET},
4191#endif
4192#ifdef _SC_PII_XTI
4193 {"SC_PII_XTI", _SC_PII_XTI},
4194#endif
4195#ifdef _SC_POLL
4196 {"SC_POLL", _SC_POLL},
4197#endif
4198#ifdef _SC_PRIORITIZED_IO
4199 {"SC_PRIORITIZED_IO", _SC_PRIORITIZED_IO},
4200#endif
4201#ifdef _SC_PRIORITY_SCHEDULING
4202 {"SC_PRIORITY_SCHEDULING", _SC_PRIORITY_SCHEDULING},
4203#endif
4204#ifdef _SC_REALTIME_SIGNALS
4205 {"SC_REALTIME_SIGNALS", _SC_REALTIME_SIGNALS},
4206#endif
4207#ifdef _SC_RE_DUP_MAX
4208 {"SC_RE_DUP_MAX", _SC_RE_DUP_MAX},
4209#endif
4210#ifdef _SC_RTSIG_MAX
4211 {"SC_RTSIG_MAX", _SC_RTSIG_MAX},
4212#endif
4213#ifdef _SC_SAVED_IDS
4214 {"SC_SAVED_IDS", _SC_SAVED_IDS},
4215#endif
4216#ifdef _SC_SCHAR_MAX
4217 {"SC_SCHAR_MAX", _SC_SCHAR_MAX},
4218#endif
4219#ifdef _SC_SCHAR_MIN
4220 {"SC_SCHAR_MIN", _SC_SCHAR_MIN},
4221#endif
4222#ifdef _SC_SELECT
4223 {"SC_SELECT", _SC_SELECT},
4224#endif
4225#ifdef _SC_SEMAPHORES
4226 {"SC_SEMAPHORES", _SC_SEMAPHORES},
4227#endif
4228#ifdef _SC_SEM_NSEMS_MAX
4229 {"SC_SEM_NSEMS_MAX", _SC_SEM_NSEMS_MAX},
4230#endif
4231#ifdef _SC_SEM_VALUE_MAX
4232 {"SC_SEM_VALUE_MAX", _SC_SEM_VALUE_MAX},
4233#endif
4234#ifdef _SC_SHARED_MEMORY_OBJECTS
4235 {"SC_SHARED_MEMORY_OBJECTS", _SC_SHARED_MEMORY_OBJECTS},
4236#endif
4237#ifdef _SC_SHRT_MAX
4238 {"SC_SHRT_MAX", _SC_SHRT_MAX},
4239#endif
4240#ifdef _SC_SHRT_MIN
4241 {"SC_SHRT_MIN", _SC_SHRT_MIN},
4242#endif
4243#ifdef _SC_SIGQUEUE_MAX
4244 {"SC_SIGQUEUE_MAX", _SC_SIGQUEUE_MAX},
4245#endif
4246#ifdef _SC_SIGRT_MAX
4247 {"SC_SIGRT_MAX", _SC_SIGRT_MAX},
4248#endif
4249#ifdef _SC_SIGRT_MIN
4250 {"SC_SIGRT_MIN", _SC_SIGRT_MIN},
4251#endif
Fred Draked86ed291999-12-15 15:34:33 +00004252#ifdef _SC_SOFTPOWER
4253 {"SC_SOFTPOWER", _SC_SOFTPOWER},
4254#endif
Fred Drakec9680921999-12-13 16:37:25 +00004255#ifdef _SC_SPLIT_CACHE
4256 {"SC_SPLIT_CACHE", _SC_SPLIT_CACHE},
4257#endif
4258#ifdef _SC_SSIZE_MAX
4259 {"SC_SSIZE_MAX", _SC_SSIZE_MAX},
4260#endif
4261#ifdef _SC_STACK_PROT
4262 {"SC_STACK_PROT", _SC_STACK_PROT},
4263#endif
4264#ifdef _SC_STREAM_MAX
4265 {"SC_STREAM_MAX", _SC_STREAM_MAX},
4266#endif
4267#ifdef _SC_SYNCHRONIZED_IO
4268 {"SC_SYNCHRONIZED_IO", _SC_SYNCHRONIZED_IO},
4269#endif
4270#ifdef _SC_THREADS
4271 {"SC_THREADS", _SC_THREADS},
4272#endif
4273#ifdef _SC_THREAD_ATTR_STACKADDR
4274 {"SC_THREAD_ATTR_STACKADDR", _SC_THREAD_ATTR_STACKADDR},
4275#endif
4276#ifdef _SC_THREAD_ATTR_STACKSIZE
4277 {"SC_THREAD_ATTR_STACKSIZE", _SC_THREAD_ATTR_STACKSIZE},
4278#endif
4279#ifdef _SC_THREAD_DESTRUCTOR_ITERATIONS
4280 {"SC_THREAD_DESTRUCTOR_ITERATIONS", _SC_THREAD_DESTRUCTOR_ITERATIONS},
4281#endif
4282#ifdef _SC_THREAD_KEYS_MAX
4283 {"SC_THREAD_KEYS_MAX", _SC_THREAD_KEYS_MAX},
4284#endif
4285#ifdef _SC_THREAD_PRIORITY_SCHEDULING
4286 {"SC_THREAD_PRIORITY_SCHEDULING", _SC_THREAD_PRIORITY_SCHEDULING},
4287#endif
4288#ifdef _SC_THREAD_PRIO_INHERIT
4289 {"SC_THREAD_PRIO_INHERIT", _SC_THREAD_PRIO_INHERIT},
4290#endif
4291#ifdef _SC_THREAD_PRIO_PROTECT
4292 {"SC_THREAD_PRIO_PROTECT", _SC_THREAD_PRIO_PROTECT},
4293#endif
4294#ifdef _SC_THREAD_PROCESS_SHARED
4295 {"SC_THREAD_PROCESS_SHARED", _SC_THREAD_PROCESS_SHARED},
4296#endif
4297#ifdef _SC_THREAD_SAFE_FUNCTIONS
4298 {"SC_THREAD_SAFE_FUNCTIONS", _SC_THREAD_SAFE_FUNCTIONS},
4299#endif
4300#ifdef _SC_THREAD_STACK_MIN
4301 {"SC_THREAD_STACK_MIN", _SC_THREAD_STACK_MIN},
4302#endif
4303#ifdef _SC_THREAD_THREADS_MAX
4304 {"SC_THREAD_THREADS_MAX", _SC_THREAD_THREADS_MAX},
4305#endif
4306#ifdef _SC_TIMERS
4307 {"SC_TIMERS", _SC_TIMERS},
4308#endif
4309#ifdef _SC_TIMER_MAX
4310 {"SC_TIMER_MAX", _SC_TIMER_MAX},
4311#endif
4312#ifdef _SC_TTY_NAME_MAX
4313 {"SC_TTY_NAME_MAX", _SC_TTY_NAME_MAX},
4314#endif
4315#ifdef _SC_TZNAME_MAX
4316 {"SC_TZNAME_MAX", _SC_TZNAME_MAX},
4317#endif
4318#ifdef _SC_T_IOV_MAX
4319 {"SC_T_IOV_MAX", _SC_T_IOV_MAX},
4320#endif
4321#ifdef _SC_UCHAR_MAX
4322 {"SC_UCHAR_MAX", _SC_UCHAR_MAX},
4323#endif
4324#ifdef _SC_UINT_MAX
4325 {"SC_UINT_MAX", _SC_UINT_MAX},
4326#endif
4327#ifdef _SC_UIO_MAXIOV
4328 {"SC_UIO_MAXIOV", _SC_UIO_MAXIOV},
4329#endif
4330#ifdef _SC_ULONG_MAX
4331 {"SC_ULONG_MAX", _SC_ULONG_MAX},
4332#endif
4333#ifdef _SC_USHRT_MAX
4334 {"SC_USHRT_MAX", _SC_USHRT_MAX},
4335#endif
4336#ifdef _SC_VERSION
4337 {"SC_VERSION", _SC_VERSION},
4338#endif
4339#ifdef _SC_WORD_BIT
4340 {"SC_WORD_BIT", _SC_WORD_BIT},
4341#endif
4342#ifdef _SC_XBS5_ILP32_OFF32
4343 {"SC_XBS5_ILP32_OFF32", _SC_XBS5_ILP32_OFF32},
4344#endif
4345#ifdef _SC_XBS5_ILP32_OFFBIG
4346 {"SC_XBS5_ILP32_OFFBIG", _SC_XBS5_ILP32_OFFBIG},
4347#endif
4348#ifdef _SC_XBS5_LP64_OFF64
4349 {"SC_XBS5_LP64_OFF64", _SC_XBS5_LP64_OFF64},
4350#endif
4351#ifdef _SC_XBS5_LPBIG_OFFBIG
4352 {"SC_XBS5_LPBIG_OFFBIG", _SC_XBS5_LPBIG_OFFBIG},
4353#endif
4354#ifdef _SC_XOPEN_CRYPT
4355 {"SC_XOPEN_CRYPT", _SC_XOPEN_CRYPT},
4356#endif
4357#ifdef _SC_XOPEN_ENH_I18N
4358 {"SC_XOPEN_ENH_I18N", _SC_XOPEN_ENH_I18N},
4359#endif
4360#ifdef _SC_XOPEN_LEGACY
4361 {"SC_XOPEN_LEGACY", _SC_XOPEN_LEGACY},
4362#endif
4363#ifdef _SC_XOPEN_REALTIME
4364 {"SC_XOPEN_REALTIME", _SC_XOPEN_REALTIME},
4365#endif
4366#ifdef _SC_XOPEN_REALTIME_THREADS
4367 {"SC_XOPEN_REALTIME_THREADS", _SC_XOPEN_REALTIME_THREADS},
4368#endif
4369#ifdef _SC_XOPEN_SHM
4370 {"SC_XOPEN_SHM", _SC_XOPEN_SHM},
4371#endif
4372#ifdef _SC_XOPEN_UNIX
4373 {"SC_XOPEN_UNIX", _SC_XOPEN_UNIX},
4374#endif
4375#ifdef _SC_XOPEN_VERSION
4376 {"SC_XOPEN_VERSION", _SC_XOPEN_VERSION},
4377#endif
4378#ifdef _SC_XOPEN_XCU_VERSION
4379 {"SC_XOPEN_XCU_VERSION", _SC_XOPEN_XCU_VERSION},
4380#endif
4381#ifdef _SC_XOPEN_XPG2
4382 {"SC_XOPEN_XPG2", _SC_XOPEN_XPG2},
4383#endif
4384#ifdef _SC_XOPEN_XPG3
4385 {"SC_XOPEN_XPG3", _SC_XOPEN_XPG3},
4386#endif
4387#ifdef _SC_XOPEN_XPG4
4388 {"SC_XOPEN_XPG4", _SC_XOPEN_XPG4},
4389#endif
4390};
4391
4392static int
4393conv_sysconf_confname(arg, valuep)
4394 PyObject *arg;
4395 int *valuep;
4396{
4397 return conv_confname(arg, valuep, posix_constants_sysconf,
4398 sizeof(posix_constants_sysconf)
4399 / sizeof(struct constdef));
4400}
4401
4402static char posix_sysconf__doc__[] = "\
4403sysconf(name) -> integer\n\
4404Return an integer-valued system configuration variable.";
4405
4406static PyObject *
4407posix_sysconf(self, args)
4408 PyObject *self;
4409 PyObject *args;
4410{
4411 PyObject *result = NULL;
4412 int name;
4413
4414 if (PyArg_ParseTuple(args, "O&:sysconf", conv_sysconf_confname, &name)) {
4415 int value;
4416
4417 errno = 0;
4418 value = sysconf(name);
4419 if (value == -1 && errno != 0)
4420 posix_error();
4421 else
4422 result = PyInt_FromLong(value);
4423 }
4424 return result;
4425}
4426#endif
4427
4428
Fred Drakebec628d1999-12-15 18:31:10 +00004429/* This code is used to ensure that the tables of configuration value names
4430 * are in sorted order as required by conv_confname(), and also to build the
4431 * the exported dictionaries that are used to publish information about the
4432 * names available on the host platform.
4433 *
4434 * Sorting the table at runtime ensures that the table is properly ordered
4435 * when used, even for platforms we're not able to test on. It also makes
4436 * it easier to add additional entries to the tables.
Fred Draked86ed291999-12-15 15:34:33 +00004437 */
Fred Drakebec628d1999-12-15 18:31:10 +00004438
4439static int
4440cmp_constdefs(v1, v2)
4441 const void *v1;
4442 const void *v2;
4443{
4444 const struct constdef *c1 =
4445 (const struct constdef *) v1;
4446 const struct constdef *c2 =
4447 (const struct constdef *) v2;
4448
4449 return strcmp(c1->name, c2->name);
4450}
4451
4452static int
4453setup_confname_table(table, tablesize, tablename, moddict)
Fred Draked86ed291999-12-15 15:34:33 +00004454 struct constdef *table;
4455 size_t tablesize;
Fred Drakebec628d1999-12-15 18:31:10 +00004456 char * tablename;
4457 PyObject *moddict;
Fred Draked86ed291999-12-15 15:34:33 +00004458{
Fred Drakebec628d1999-12-15 18:31:10 +00004459 PyObject *d = NULL;
Barry Warsaw3155db32000-04-13 15:20:40 +00004460 size_t i;
4461 int status;
Fred Drakebec628d1999-12-15 18:31:10 +00004462
4463 qsort(table, tablesize, sizeof(struct constdef), cmp_constdefs);
4464 d = PyDict_New();
Barry Warsaw3155db32000-04-13 15:20:40 +00004465 if (d == NULL)
4466 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004467
Barry Warsaw3155db32000-04-13 15:20:40 +00004468 for (i=0; i < tablesize; ++i) {
4469 PyObject *o = PyInt_FromLong(table[i].value);
4470 if (o == NULL || PyDict_SetItemString(d, table[i].name, o) == -1) {
4471 Py_XDECREF(o);
4472 Py_DECREF(d);
4473 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004474 }
Barry Warsaw3155db32000-04-13 15:20:40 +00004475 Py_DECREF(o);
Fred Draked86ed291999-12-15 15:34:33 +00004476 }
Barry Warsaw3155db32000-04-13 15:20:40 +00004477 status = PyDict_SetItemString(moddict, tablename, d);
4478 Py_DECREF(d);
4479 return status;
Fred Draked86ed291999-12-15 15:34:33 +00004480}
4481
Fred Drakebec628d1999-12-15 18:31:10 +00004482/* Return -1 on failure, 0 on success. */
4483static int
4484setup_confname_tables(moddict)
4485 PyObject *moddict;
Fred Draked86ed291999-12-15 15:34:33 +00004486{
4487#if defined(HAVE_FPATHCONF) || defined(HAVE_PATHCONF)
Fred Drakebec628d1999-12-15 18:31:10 +00004488 if (setup_confname_table(posix_constants_pathconf,
Fred Draked86ed291999-12-15 15:34:33 +00004489 sizeof(posix_constants_pathconf)
4490 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004491 "pathconf_names", moddict))
4492 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004493#endif
4494#ifdef HAVE_CONFSTR
Fred Drakebec628d1999-12-15 18:31:10 +00004495 if (setup_confname_table(posix_constants_confstr,
Fred Draked86ed291999-12-15 15:34:33 +00004496 sizeof(posix_constants_confstr)
4497 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004498 "confstr_names", moddict))
4499 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004500#endif
4501#ifdef HAVE_SYSCONF
Fred Drakebec628d1999-12-15 18:31:10 +00004502 if (setup_confname_table(posix_constants_sysconf,
Fred Draked86ed291999-12-15 15:34:33 +00004503 sizeof(posix_constants_sysconf)
4504 / sizeof(struct constdef),
Fred Drakebec628d1999-12-15 18:31:10 +00004505 "sysconf_names", moddict))
4506 return -1;
Fred Draked86ed291999-12-15 15:34:33 +00004507#endif
Fred Drakebec628d1999-12-15 18:31:10 +00004508 return 0;
Fred Draked86ed291999-12-15 15:34:33 +00004509}
Fred Draked86ed291999-12-15 15:34:33 +00004510
4511
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004512static char posix_abort__doc__[] = "\
4513abort() -> does not return!\n\
4514Abort the interpreter immediately. This 'dumps core' or otherwise fails\n\
4515in the hardest way possible on the hosting operating system.";
4516
4517static PyObject *
4518posix_abort(self, args)
4519 PyObject *self;
4520 PyObject *args;
4521{
4522 if (!PyArg_ParseTuple(args, ":abort"))
4523 return NULL;
4524 abort();
4525 /*NOTREACHED*/
4526 Py_FatalError("abort() called from Python code didn't abort!");
4527 return NULL;
4528}
Fred Drakebec628d1999-12-15 18:31:10 +00004529
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004530
4531static PyMethodDef posix_methods[] = {
4532 {"access", posix_access, METH_VARARGS, posix_access__doc__},
4533#ifdef HAVE_TTYNAME
4534 {"ttyname", posix_ttyname, METH_VARARGS, posix_ttyname__doc__},
4535#endif
4536 {"chdir", posix_chdir, METH_VARARGS, posix_chdir__doc__},
4537 {"chmod", posix_chmod, METH_VARARGS, posix_chmod__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004538#ifdef HAVE_CHOWN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004539 {"chown", posix_chown, METH_VARARGS, posix_chown__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004540#endif /* HAVE_CHOWN */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004541#ifdef HAVE_CTERMID
4542 {"ctermid", posix_ctermid, METH_VARARGS, posix_ctermid__doc__},
4543#endif
Guido van Rossum36bc6801995-06-14 22:54:23 +00004544#ifdef HAVE_GETCWD
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004545 {"getcwd", posix_getcwd, METH_VARARGS, posix_getcwd__doc__},
Guido van Rossum36bc6801995-06-14 22:54:23 +00004546#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004547#ifdef HAVE_LINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004548 {"link", posix_link, METH_VARARGS, posix_link__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004549#endif /* HAVE_LINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004550 {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__},
4551 {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__},
4552 {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004553#ifdef HAVE_NICE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004554 {"nice", posix_nice, METH_VARARGS, posix_nice__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004555#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004556#ifdef HAVE_READLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004557 {"readlink", posix_readlink, METH_VARARGS, posix_readlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004558#endif /* HAVE_READLINK */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004559 {"rename", posix_rename, METH_VARARGS, posix_rename__doc__},
4560 {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__},
4561 {"stat", posix_stat, METH_VARARGS, posix_stat__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004562#ifdef HAVE_SYMLINK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004563 {"symlink", posix_symlink, METH_VARARGS, posix_symlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004564#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004565#ifdef HAVE_SYSTEM
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004566 {"system", posix_system, METH_VARARGS, posix_system__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004567#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004568 {"umask", posix_umask, METH_VARARGS, posix_umask__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004569#ifdef HAVE_UNAME
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004570 {"uname", posix_uname, METH_VARARGS, posix_uname__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004571#endif /* HAVE_UNAME */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004572 {"unlink", posix_unlink, METH_VARARGS, posix_unlink__doc__},
4573 {"remove", posix_unlink, METH_VARARGS, posix_remove__doc__},
4574 {"utime", posix_utime, METH_VARARGS, posix_utime__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004575#ifdef HAVE_TIMES
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004576 {"times", posix_times, METH_VARARGS, posix_times__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004577#endif /* HAVE_TIMES */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004578 {"_exit", posix__exit, METH_VARARGS, posix__exit__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004579#ifdef HAVE_EXECV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004580 {"execv", posix_execv, METH_VARARGS, posix_execv__doc__},
4581 {"execve", posix_execve, METH_VARARGS, posix_execve__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004582#endif /* HAVE_EXECV */
Guido van Rossuma1065681999-01-25 23:20:23 +00004583#ifdef HAVE_SPAWNV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004584 {"spawnv", posix_spawnv, METH_VARARGS, posix_spawnv__doc__},
4585 {"spawnve", posix_spawnve, METH_VARARGS, posix_spawnve__doc__},
Guido van Rossuma1065681999-01-25 23:20:23 +00004586#endif /* HAVE_SPAWNV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004587#ifdef HAVE_FORK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004588 {"fork", posix_fork, METH_VARARGS, posix_fork__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004589#endif /* HAVE_FORK */
Fred Drake8cef4cf2000-06-28 16:40:38 +00004590#ifdef HAVE_OPENPTY
4591 {"openpty", posix_openpty, METH_VARARGS, posix_openpty__doc__},
4592#endif /* HAVE_OPENPTY */
4593#ifdef HAVE_FORKPTY
4594 {"forkpty", posix_forkpty, METH_VARARGS, posix_forkpty__doc__},
4595#endif /* HAVE_FORKPTY */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004596#ifdef HAVE_GETEGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004597 {"getegid", posix_getegid, METH_VARARGS, posix_getegid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004598#endif /* HAVE_GETEGID */
4599#ifdef HAVE_GETEUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004600 {"geteuid", posix_geteuid, METH_VARARGS, posix_geteuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004601#endif /* HAVE_GETEUID */
4602#ifdef HAVE_GETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004603 {"getgid", posix_getgid, METH_VARARGS, posix_getgid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004604#endif /* HAVE_GETGID */
Fred Drakec9680921999-12-13 16:37:25 +00004605#ifdef HAVE_GETGROUPS
4606 {"getgroups", posix_getgroups, METH_VARARGS, posix_getgroups__doc__},
4607#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004608 {"getpid", posix_getpid, METH_VARARGS, posix_getpid__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00004609#ifdef HAVE_GETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004610 {"getpgrp", posix_getpgrp, METH_VARARGS, posix_getpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004611#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004612#ifdef HAVE_GETPPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004613 {"getppid", posix_getppid, METH_VARARGS, posix_getppid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004614#endif /* HAVE_GETPPID */
4615#ifdef HAVE_GETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004616 {"getuid", posix_getuid, METH_VARARGS, posix_getuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004617#endif /* HAVE_GETUID */
Fred Drake12c6e2d1999-12-14 21:25:03 +00004618#ifdef HAVE_GETLOGIN
4619 {"getlogin", posix_getlogin, METH_VARARGS, posix_getlogin__doc__},
4620#endif
Guido van Rossumad0ee831995-03-01 10:34:45 +00004621#ifdef HAVE_KILL
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004622 {"kill", posix_kill, METH_VARARGS, posix_kill__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004623#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00004624#ifdef HAVE_PLOCK
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004625 {"plock", posix_plock, METH_VARARGS, posix_plock__doc__},
Guido van Rossumc0125471996-06-28 18:55:32 +00004626#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004627#ifdef HAVE_POPEN
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004628 {"popen", posix_popen, METH_VARARGS, posix_popen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004629#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004630#ifdef HAVE_SETUID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004631 {"setuid", posix_setuid, METH_VARARGS, posix_setuid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004632#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004633#ifdef HAVE_SETGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004634 {"setgid", posix_setgid, METH_VARARGS, posix_setgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004635#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004636#ifdef HAVE_SETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004637 {"setpgrp", posix_setpgrp, METH_VARARGS, posix_setpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004638#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00004639#ifdef HAVE_WAIT
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004640 {"wait", posix_wait, METH_VARARGS, posix_wait__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00004641#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004642#ifdef HAVE_WAITPID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004643 {"waitpid", posix_waitpid, METH_VARARGS, posix_waitpid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004644#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004645#ifdef HAVE_SETSID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004646 {"setsid", posix_setsid, METH_VARARGS, posix_setsid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004647#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004648#ifdef HAVE_SETPGID
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004649 {"setpgid", posix_setpgid, METH_VARARGS, posix_setpgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004650#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004651#ifdef HAVE_TCGETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004652 {"tcgetpgrp", posix_tcgetpgrp, METH_VARARGS, posix_tcgetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004653#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004654#ifdef HAVE_TCSETPGRP
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004655 {"tcsetpgrp", posix_tcsetpgrp, METH_VARARGS, posix_tcsetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00004656#endif /* HAVE_TCSETPGRP */
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004657 {"open", posix_open, METH_VARARGS, posix_open__doc__},
4658 {"close", posix_close, METH_VARARGS, posix_close__doc__},
4659 {"dup", posix_dup, METH_VARARGS, posix_dup__doc__},
4660 {"dup2", posix_dup2, METH_VARARGS, posix_dup2__doc__},
4661 {"lseek", posix_lseek, METH_VARARGS, posix_lseek__doc__},
4662 {"read", posix_read, METH_VARARGS, posix_read__doc__},
4663 {"write", posix_write, METH_VARARGS, posix_write__doc__},
4664 {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__},
4665 {"fdopen", posix_fdopen, METH_VARARGS, posix_fdopen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004666#ifdef HAVE_PIPE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004667 {"pipe", posix_pipe, METH_VARARGS, posix_pipe__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004668#endif
4669#ifdef HAVE_MKFIFO
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004670 {"mkfifo", posix_mkfifo, METH_VARARGS, posix_mkfifo__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004671#endif
4672#ifdef HAVE_FTRUNCATE
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004673 {"ftruncate", posix_ftruncate, METH_VARARGS, posix_ftruncate__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00004674#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004675#ifdef HAVE_PUTENV
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004676 {"putenv", posix_putenv, METH_VARARGS, posix_putenv__doc__},
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00004677#endif
Guido van Rossumb6a47161997-09-15 22:54:34 +00004678#ifdef HAVE_STRERROR
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004679 {"strerror", posix_strerror, METH_VARARGS, posix_strerror__doc__},
Guido van Rossumb6a47161997-09-15 22:54:34 +00004680#endif
Guido van Rossum21142a01999-01-08 21:05:37 +00004681#ifdef HAVE_FSYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004682 {"fsync", posix_fsync, METH_VARARGS, posix_fsync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004683#endif
4684#ifdef HAVE_FDATASYNC
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004685 {"fdatasync", posix_fdatasync, METH_VARARGS, posix_fdatasync__doc__},
Guido van Rossum21142a01999-01-08 21:05:37 +00004686#endif
Guido van Rossumc9641791998-08-04 15:26:23 +00004687#ifdef HAVE_SYS_WAIT_H
4688#ifdef WIFSTOPPED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004689 {"WIFSTOPPED", posix_WIFSTOPPED, METH_VARARGS, posix_WIFSTOPPED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004690#endif /* WIFSTOPPED */
4691#ifdef WIFSIGNALED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004692 {"WIFSIGNALED", posix_WIFSIGNALED, METH_VARARGS, posix_WIFSIGNALED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004693#endif /* WIFSIGNALED */
4694#ifdef WIFEXITED
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004695 {"WIFEXITED", posix_WIFEXITED, METH_VARARGS, posix_WIFEXITED__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004696#endif /* WIFEXITED */
4697#ifdef WEXITSTATUS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004698 {"WEXITSTATUS", posix_WEXITSTATUS, METH_VARARGS, posix_WEXITSTATUS__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004699#endif /* WEXITSTATUS */
4700#ifdef WTERMSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004701 {"WTERMSIG", posix_WTERMSIG, METH_VARARGS, posix_WTERMSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004702#endif /* WTERMSIG */
4703#ifdef WSTOPSIG
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004704 {"WSTOPSIG", posix_WSTOPSIG, METH_VARARGS, posix_WSTOPSIG__doc__},
Guido van Rossumc9641791998-08-04 15:26:23 +00004705#endif /* WSTOPSIG */
4706#endif /* HAVE_SYS_WAIT_H */
Guido van Rossum94f6f721999-01-06 18:42:14 +00004707#ifdef HAVE_FSTATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004708 {"fstatvfs", posix_fstatvfs, METH_VARARGS, posix_fstatvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004709#endif
4710#ifdef HAVE_STATVFS
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004711 {"statvfs", posix_statvfs, METH_VARARGS, posix_statvfs__doc__},
Guido van Rossum94f6f721999-01-06 18:42:14 +00004712#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004713#ifdef HAVE_TMPNAM
4714 {"tmpfile", posix_tmpfile, METH_VARARGS, posix_tmpfile__doc__},
4715#endif
4716#ifdef HAVE_TEMPNAM
4717 {"tempnam", posix_tempnam, METH_VARARGS, posix_tempnam__doc__},
4718#endif
4719#ifdef HAVE_TMPNAM
4720 {"tmpnam", posix_tmpnam, METH_VARARGS, posix_tmpnam__doc__},
4721#endif
Fred Drakec9680921999-12-13 16:37:25 +00004722#ifdef HAVE_CONFSTR
4723 {"confstr", posix_confstr, METH_VARARGS, posix_confstr__doc__},
4724#endif
4725#ifdef HAVE_SYSCONF
4726 {"sysconf", posix_sysconf, METH_VARARGS, posix_sysconf__doc__},
4727#endif
4728#ifdef HAVE_FPATHCONF
4729 {"fpathconf", posix_fpathconf, METH_VARARGS, posix_fpathconf__doc__},
4730#endif
4731#ifdef HAVE_PATHCONF
4732 {"pathconf", posix_pathconf, METH_VARARGS, posix_pathconf__doc__},
4733#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004734 {"abort", posix_abort, METH_VARARGS, posix_abort__doc__},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004735 {NULL, NULL} /* Sentinel */
4736};
4737
4738
Barry Warsaw4a342091996-12-19 23:50:02 +00004739static int
4740ins(d, symbol, value)
4741 PyObject* d;
4742 char* symbol;
4743 long value;
4744{
4745 PyObject* v = PyInt_FromLong(value);
4746 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
4747 return -1; /* triggers fatal error */
4748
4749 Py_DECREF(v);
4750 return 0;
4751}
4752
Guido van Rossumd48f2521997-12-05 22:19:34 +00004753#if defined(PYOS_OS2)
4754/* Insert Platform-Specific Constant Values (Strings & Numbers) of Common Use */
4755static int insertvalues(PyObject *d)
4756{
4757 APIRET rc;
4758 ULONG values[QSV_MAX+1];
4759 PyObject *v;
4760 char *ver, tmp[10];
4761
4762 Py_BEGIN_ALLOW_THREADS
4763 rc = DosQuerySysInfo(1, QSV_MAX, &values[1], sizeof(values));
4764 Py_END_ALLOW_THREADS
4765
4766 if (rc != NO_ERROR) {
4767 os2_error(rc);
4768 return -1;
4769 }
4770
4771 if (ins(d, "meminstalled", values[QSV_TOTPHYSMEM])) return -1;
4772 if (ins(d, "memkernel", values[QSV_TOTRESMEM])) return -1;
4773 if (ins(d, "memvirtual", values[QSV_TOTAVAILMEM])) return -1;
4774 if (ins(d, "maxpathlen", values[QSV_MAX_PATH_LENGTH])) return -1;
4775 if (ins(d, "maxnamelen", values[QSV_MAX_COMP_LENGTH])) return -1;
4776 if (ins(d, "revision", values[QSV_VERSION_REVISION])) return -1;
4777 if (ins(d, "timeslice", values[QSV_MIN_SLICE])) return -1;
4778
4779 switch (values[QSV_VERSION_MINOR]) {
4780 case 0: ver = "2.00"; break;
4781 case 10: ver = "2.10"; break;
4782 case 11: ver = "2.11"; break;
4783 case 30: ver = "3.00"; break;
4784 case 40: ver = "4.00"; break;
4785 case 50: ver = "5.00"; break;
4786 default:
4787 sprintf(tmp, "%d-%d", values[QSV_VERSION_MAJOR],
4788 values[QSV_VERSION_MINOR]);
4789 ver = &tmp[0];
4790 }
4791
4792 /* Add Indicator of the Version of the Operating System */
4793 v = PyString_FromString(ver);
4794 if (!v || PyDict_SetItemString(d, "version", v) < 0)
4795 return -1;
4796 Py_DECREF(v);
4797
4798 /* Add Indicator of Which Drive was Used to Boot the System */
4799 tmp[0] = 'A' + values[QSV_BOOT_DRIVE] - 1;
4800 tmp[1] = ':';
4801 tmp[2] = '\0';
4802
4803 v = PyString_FromString(tmp);
4804 if (!v || PyDict_SetItemString(d, "bootdrive", v) < 0)
4805 return -1;
4806 Py_DECREF(v);
4807
4808 return 0;
4809}
4810#endif
4811
Barry Warsaw4a342091996-12-19 23:50:02 +00004812static int
4813all_ins(d)
4814 PyObject* d;
4815{
Guido van Rossum94f6f721999-01-06 18:42:14 +00004816#ifdef F_OK
4817 if (ins(d, "F_OK", (long)F_OK)) return -1;
4818#endif
4819#ifdef R_OK
4820 if (ins(d, "R_OK", (long)R_OK)) return -1;
4821#endif
4822#ifdef W_OK
4823 if (ins(d, "W_OK", (long)W_OK)) return -1;
4824#endif
4825#ifdef X_OK
4826 if (ins(d, "X_OK", (long)X_OK)) return -1;
4827#endif
Fred Drakec9680921999-12-13 16:37:25 +00004828#ifdef NGROUPS_MAX
4829 if (ins(d, "NGROUPS_MAX", (long)NGROUPS_MAX)) return -1;
4830#endif
Fred Drake5ab8eaf1999-12-09 21:13:07 +00004831#ifdef TMP_MAX
4832 if (ins(d, "TMP_MAX", (long)TMP_MAX)) return -1;
4833#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004834#ifdef WNOHANG
4835 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
4836#endif
4837#ifdef O_RDONLY
4838 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
4839#endif
4840#ifdef O_WRONLY
4841 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
4842#endif
4843#ifdef O_RDWR
4844 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
4845#endif
4846#ifdef O_NDELAY
4847 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
4848#endif
4849#ifdef O_NONBLOCK
4850 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
4851#endif
4852#ifdef O_APPEND
4853 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
4854#endif
4855#ifdef O_DSYNC
4856 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
4857#endif
4858#ifdef O_RSYNC
4859 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
4860#endif
4861#ifdef O_SYNC
4862 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
4863#endif
4864#ifdef O_NOCTTY
4865 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
4866#endif
4867#ifdef O_CREAT
4868 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
4869#endif
4870#ifdef O_EXCL
4871 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
4872#endif
4873#ifdef O_TRUNC
4874 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
4875#endif
Guido van Rossum98d9d091997-08-08 21:48:51 +00004876#ifdef O_BINARY
4877 if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
4878#endif
4879#ifdef O_TEXT
4880 if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
4881#endif
Guido van Rossumd48f2521997-12-05 22:19:34 +00004882
Guido van Rossum246bc171999-02-01 23:54:31 +00004883#ifdef HAVE_SPAWNV
Guido van Rossum7d385291999-02-16 19:38:04 +00004884 if (ins(d, "P_WAIT", (long)_P_WAIT)) return -1;
4885 if (ins(d, "P_NOWAIT", (long)_P_NOWAIT)) return -1;
4886 if (ins(d, "P_OVERLAY", (long)_OLD_P_OVERLAY)) return -1;
4887 if (ins(d, "P_NOWAITO", (long)_P_NOWAITO)) return -1;
4888 if (ins(d, "P_DETACH", (long)_P_DETACH)) return -1;
Guido van Rossum246bc171999-02-01 23:54:31 +00004889#endif
4890
Guido van Rossumd48f2521997-12-05 22:19:34 +00004891#if defined(PYOS_OS2)
4892 if (insertvalues(d)) return -1;
4893#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00004894 return 0;
4895}
4896
4897
Guido van Rossumc5a0f531997-12-02 20:36:02 +00004898#if ( defined(_MSC_VER) || defined(__WATCOMC__) ) && !defined(__QNX__)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004899#define INITFUNC initnt
4900#define MODNAME "nt"
4901#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004902#if defined(PYOS_OS2)
4903#define INITFUNC initos2
4904#define MODNAME "os2"
4905#else
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004906#define INITFUNC initposix
4907#define MODNAME "posix"
4908#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00004909#endif
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004910
Guido van Rossum3886bb61998-12-04 18:50:17 +00004911DL_EXPORT(void)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004912INITFUNC()
Guido van Rossumb6775db1994-08-01 11:34:53 +00004913{
Barry Warsaw53699e91996-12-10 23:23:01 +00004914 PyObject *m, *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00004915
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004916 m = Py_InitModule4(MODNAME,
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00004917 posix_methods,
4918 posix__doc__,
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004919 (PyObject *)NULL,
4920 PYTHON_API_VERSION);
Barry Warsaw53699e91996-12-10 23:23:01 +00004921 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +00004922
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004923 /* Initialize environ dictionary */
Guido van Rossumb6775db1994-08-01 11:34:53 +00004924 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00004925 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00004926 return;
Barry Warsaw53699e91996-12-10 23:23:01 +00004927 Py_DECREF(v);
Fred Drakec9680921999-12-13 16:37:25 +00004928
Barry Warsaw4a342091996-12-19 23:50:02 +00004929 if (all_ins(d))
Barry Warsaw4a342091996-12-19 23:50:02 +00004930 return;
4931
Fred Drakebec628d1999-12-15 18:31:10 +00004932 if (setup_confname_tables(d))
4933 return;
4934
Barry Warsawca74da41999-02-09 19:31:45 +00004935 PyDict_SetItemString(d, "error", PyExc_OSError);
Fred Drake762e2061999-08-26 17:23:54 +00004936
Guido van Rossumb3d39562000-01-31 18:41:26 +00004937#ifdef HAVE_PUTENV
Fred Drake762e2061999-08-26 17:23:54 +00004938 posix_putenv_garbage = PyDict_New();
Guido van Rossumb3d39562000-01-31 18:41:26 +00004939#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00004940}