blob: c72467997649911d5d623f1ade653546688b773e [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* POSIX module implementation */
33
Guido van Rossuma4916fa1996-05-23 22:58:55 +000034/* This file is also used for Windows NT and MS-Win. In that case the module
Guido van Rossumad0ee831995-03-01 10:34:45 +000035 actually calls itself 'nt', not 'posix', and a few functions are
36 either unimplemented or implemented differently. The source
Guido van Rossum8d665e61996-06-26 18:22:49 +000037 assumes that for Windows NT, the macro 'MS_WIN32' is defined independent
Guido van Rossumad0ee831995-03-01 10:34:45 +000038 of the compiler used. Different compilers define their own feature
Guido van Rossuma4916fa1996-05-23 22:58:55 +000039 test macro, e.g. '__BORLANDC__' or '_MSC_VER'. */
Guido van Rossumad0ee831995-03-01 10:34:45 +000040
Guido van Rossuma4916fa1996-05-23 22:58:55 +000041/* See also ../Dos/dosmodule.c */
Guido van Rossumad0ee831995-03-01 10:34:45 +000042
Barry Warsaw53699e91996-12-10 23:23:01 +000043#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044
Guido van Rossumb6775db1994-08-01 11:34:53 +000045#include <sys/types.h>
46#include <sys/stat.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +000047#ifdef HAVE_SYS_WAIT_H
48#include <sys/wait.h> /* For WNOHANG */
49#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000050
Guido van Rossuma376cc51996-12-05 23:43:35 +000051#ifdef HAVE_SIGNAL_H
52#include <signal.h>
53#endif
54
Guido van Rossumb6775db1994-08-01 11:34:53 +000055#include "mytime.h" /* For clock_t on some systems */
56
57#ifdef HAVE_FCNTL_H
58#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000059#endif /* HAVE_FCNTL_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +000060
Guido van Rossuma4916fa1996-05-23 22:58:55 +000061/* Various compilers have only certain posix functions */
62#ifdef __WATCOMC__ /* Watcom compiler */
63#define HAVE_GETCWD 1
64#define HAVE_OPENDIR 1
65#define HAVE_SYSTEM 1
66#if defined(__OS2__)
67#define HAVE_EXECV 1
68#define HAVE_WAIT 1
Guido van Rossumad0ee831995-03-01 10:34:45 +000069#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +000070#include <process.h>
71#else
72#ifdef __BORLANDC__ /* Borland compiler */
73#define HAVE_EXECV 1
74#define HAVE_GETCWD 1
75#define HAVE_GETEGID 1
76#define HAVE_GETEUID 1
77#define HAVE_GETGID 1
78#define HAVE_GETPPID 1
79#define HAVE_GETUID 1
80#define HAVE_KILL 1
81#define HAVE_OPENDIR 1
82#define HAVE_PIPE 1
83#define HAVE_POPEN 1
84#define HAVE_SYSTEM 1
85#define HAVE_WAIT 1
86#else
87#ifdef _MSC_VER /* Microsoft compiler */
Guido van Rossum8d665e61996-06-26 18:22:49 +000088#define HAVE_GETCWD 1
89#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +000090#define HAVE_EXECV 1
91#define HAVE_PIPE 1
92#define HAVE_POPEN 1
93#define HAVE_SYSTEM 1
94#else /* 16-bit Windows */
Guido van Rossum8d665e61996-06-26 18:22:49 +000095#endif /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +000096#else /* all other compilers */
97/* Unix functions that the configure script doesn't check for */
98#define HAVE_EXECV 1
99#define HAVE_FORK 1
100#define HAVE_GETCWD 1
101#define HAVE_GETEGID 1
102#define HAVE_GETEUID 1
103#define HAVE_GETGID 1
104#define HAVE_GETPPID 1
105#define HAVE_GETUID 1
106#define HAVE_KILL 1
107#define HAVE_OPENDIR 1
108#define HAVE_PIPE 1
109#define HAVE_POPEN 1
110#define HAVE_SYSTEM 1
111#define HAVE_WAIT 1
112#endif /* _MSC_VER */
113#endif /* __BORLANDC__ */
114#endif /* ! __WATCOMC__ */
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
126/* #undef HAVE_GETCWD */
127#endif
128
129#ifdef HAVE_UNISTD_H
Guido van Rossumad0ee831995-03-01 10:34:45 +0000130/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
131extern int rename();
132extern int pclose();
133extern int lstat();
134extern int symlink();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000135#else /* !HAVE_UNISTD_H */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000136#if defined(__WATCOMC__) || defined(_MSC_VER)
Barry Warsaw53699e91996-12-10 23:23:01 +0000137extern int mkdir Py_PROTO((const char *));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000138#else
Barry Warsaw53699e91996-12-10 23:23:01 +0000139extern int mkdir Py_PROTO((const char *, mode_t));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000140#endif
Barry Warsaw53699e91996-12-10 23:23:01 +0000141extern int chdir Py_PROTO((const char *));
142extern int rmdir Py_PROTO((const char *));
143extern int chmod Py_PROTO((const char *, mode_t));
144extern int chown Py_PROTO((const char *, uid_t, gid_t));
145extern char *getcwd Py_PROTO((char *, int));
146extern char *strerror Py_PROTO((int));
147extern int link Py_PROTO((const char *, const char *));
148extern int rename Py_PROTO((const char *, const char *));
149extern int stat Py_PROTO((const char *, struct stat *));
150extern int unlink Py_PROTO((const char *));
151extern int pclose Py_PROTO((FILE *));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000152#ifdef HAVE_SYMLINK
Barry Warsaw53699e91996-12-10 23:23:01 +0000153extern int symlink Py_PROTO((const char *, const char *));
Guido van Rossuma38a5031995-02-17 15:11:36 +0000154#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000155#ifdef HAVE_LSTAT
Barry Warsaw53699e91996-12-10 23:23:01 +0000156extern int lstat Py_PROTO((const char *, struct stat *));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000157#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000158#endif /* !HAVE_UNISTD_H */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000159
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000160#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161
Guido van Rossumb6775db1994-08-01 11:34:53 +0000162#ifdef HAVE_UTIME_H
163#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000164#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000165
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000166#ifdef HAVE_SYS_UTIME_H
167#include <sys/utime.h>
168#define HAVE_UTIME_H /* pretend we do for the rest of this file */
169#endif /* HAVE_SYS_UTIME_H */
170
Guido van Rossumb6775db1994-08-01 11:34:53 +0000171#ifdef HAVE_SYS_TIMES_H
172#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000173#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000174
175#ifdef HAVE_SYS_PARAM_H
176#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000177#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000178
179#ifdef HAVE_SYS_UTSNAME_H
180#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000181#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000182
183#ifndef MAXPATHLEN
184#define MAXPATHLEN 1024
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000185#endif /* MAXPATHLEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000186
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000187#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000188#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000189#define NAMLEN(dirent) strlen((dirent)->d_name)
190#else
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000191#ifdef __WATCOMC__
192#include <direct.h>
193#define NAMLEN(dirent) strlen((dirent)->d_name)
194#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000195#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000196#define NAMLEN(dirent) (dirent)->d_namlen
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000197#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000198#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000199#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000200#endif
201#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000202#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000203#endif
204#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000205#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000206#endif
207#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000208
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000209#ifdef _MSC_VER
Guido van Rossumb6775db1994-08-01 11:34:53 +0000210#include <direct.h>
211#include <io.h>
212#include <process.h>
213#include <windows.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000214#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000215#define popen _popen
Guido van Rossum794d8131994-08-23 13:48:48 +0000216#define pclose _pclose
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000217#else /* 16-bit Windows */
218#include <dos.h>
219#include <ctype.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000220#endif /* MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000221#endif /* _MSC_VER */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000222
223#ifdef OS2
224#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000225#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226
227/* Return a dictionary corresponding to the POSIX environment table */
228
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000229#if !defined(_MSC_VER) && !defined(__WATCOMC__)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000231#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232
Barry Warsaw53699e91996-12-10 23:23:01 +0000233static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234convertenviron()
235{
Barry Warsaw53699e91996-12-10 23:23:01 +0000236 PyObject *d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237 char **e;
Barry Warsaw53699e91996-12-10 23:23:01 +0000238 d = PyDict_New();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000239 if (d == NULL)
240 return NULL;
241 if (environ == NULL)
242 return d;
243 /* XXX This part ignores errors */
244 for (e = environ; *e != NULL; e++) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000245 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246 char *p = strchr(*e, '=');
247 if (p == NULL)
248 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000249 v = PyString_FromString(p+1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250 if (v == NULL)
251 continue;
252 *p = '\0';
Barry Warsaw53699e91996-12-10 23:23:01 +0000253 (void) PyDict_SetItemString(d, *e, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254 *p = '=';
Barry Warsaw53699e91996-12-10 23:23:01 +0000255 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000256 }
257 return d;
258}
259
260
Barry Warsaw53699e91996-12-10 23:23:01 +0000261static PyObject *PosixError; /* Exception posix.error */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000262
263/* Set a POSIX-specific error from errno, and return NULL */
264
Barry Warsaw53699e91996-12-10 23:23:01 +0000265static PyObject * posix_error()
Guido van Rossumad0ee831995-03-01 10:34:45 +0000266{
Barry Warsaw53699e91996-12-10 23:23:01 +0000267 return PyErr_SetFromErrno(PosixError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268}
269
270
271/* POSIX generic methods */
272
Barry Warsaw53699e91996-12-10 23:23:01 +0000273static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274posix_1str(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000275 PyObject *args;
276 int (*func) Py_FPROTO((const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000278 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000279 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000280 if (!PyArg_Parse(args, "s", &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000282 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000283 res = (*func)(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000284 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000285 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000287 Py_INCREF(Py_None);
288 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289}
290
Barry Warsaw53699e91996-12-10 23:23:01 +0000291static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292posix_2str(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000293 PyObject *args;
294 int (*func) Py_FPROTO((const char *, const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000295{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000296 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000297 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000298 if (!PyArg_Parse(args, "(ss)", &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000300 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000301 res = (*func)(path1, path2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000302 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000303 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000305 Py_INCREF(Py_None);
306 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307}
308
Barry Warsaw53699e91996-12-10 23:23:01 +0000309static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310posix_strint(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000311 PyObject *args;
312 int (*func) Py_FPROTO((const char *, int));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000314 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000316 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000317 if (!PyArg_Parse(args, "(si)", &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000319 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000320 res = (*func)(path, i);
Barry Warsaw53699e91996-12-10 23:23:01 +0000321 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000322 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000323 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000324 Py_INCREF(Py_None);
325 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000326}
327
Barry Warsaw53699e91996-12-10 23:23:01 +0000328static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000329posix_strintint(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000330 PyObject *args;
331 int (*func) Py_FPROTO((const char *, int, int));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000332{
333 char *path;
334 int i,i2;
335 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000336 if (!PyArg_Parse(args, "(sii)", &path, &i, &i2))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000337 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000338 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000339 res = (*func)(path, i, i2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000340 Py_END_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000341 if (res < 0)
342 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000343 Py_INCREF(Py_None);
344 return Py_None;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000345}
346
Barry Warsaw53699e91996-12-10 23:23:01 +0000347static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000348posix_do_stat(self, args, statfunc)
Barry Warsaw53699e91996-12-10 23:23:01 +0000349 PyObject *self;
350 PyObject *args;
351 int (*statfunc) Py_FPROTO((const char *, struct stat *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000352{
353 struct stat st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000354 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000355 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000356 if (!PyArg_Parse(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000357 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000358 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000359 res = (*statfunc)(path, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +0000360 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000361 if (res != 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000363 return Py_BuildValue("(llllllllll)",
Guido van Rossume5372401993-03-16 12:15:04 +0000364 (long)st.st_mode,
365 (long)st.st_ino,
366 (long)st.st_dev,
367 (long)st.st_nlink,
368 (long)st.st_uid,
369 (long)st.st_gid,
370 (long)st.st_size,
371 (long)st.st_atime,
372 (long)st.st_mtime,
373 (long)st.st_ctime);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374}
375
376
377/* POSIX methods */
378
Barry Warsaw53699e91996-12-10 23:23:01 +0000379static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000380posix_chdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000381 PyObject *self;
382 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000383{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384 return posix_1str(args, chdir);
385}
386
Barry Warsaw53699e91996-12-10 23:23:01 +0000387static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388posix_chmod(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000389 PyObject *self;
390 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000391{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392 return posix_strint(args, chmod);
393}
394
Guido van Rossumb6775db1994-08-01 11:34:53 +0000395#ifdef HAVE_CHOWN
Barry Warsaw53699e91996-12-10 23:23:01 +0000396static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000397posix_chown(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000398 PyObject *self;
399 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000400{
401 return posix_strintint(args, chown);
402}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000403#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000404
Guido van Rossum36bc6801995-06-14 22:54:23 +0000405#ifdef HAVE_GETCWD
Barry Warsaw53699e91996-12-10 23:23:01 +0000406static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407posix_getcwd(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000408 PyObject *self;
409 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410{
411 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000412 char *res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000413 if (!PyArg_NoArgs(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000414 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000415 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000416 res = getcwd(buf, sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +0000417 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000418 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000419 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000420 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000422#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000423
Guido van Rossumb6775db1994-08-01 11:34:53 +0000424#ifdef HAVE_LINK
Barry Warsaw53699e91996-12-10 23:23:01 +0000425static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426posix_link(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000427 PyObject *self;
428 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430 return posix_2str(args, link);
431}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000432#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433
Barry Warsaw53699e91996-12-10 23:23:01 +0000434static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000435posix_listdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000436 PyObject *self;
437 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000438{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000439#if defined(MS_WIN32) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000440
Guido van Rossumb6775db1994-08-01 11:34:53 +0000441 char *name;
442 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000443 PyObject *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000444 HANDLE hFindFile;
445 WIN32_FIND_DATA FileData;
446 char namebuf[MAX_PATH+5];
447
Barry Warsaw53699e91996-12-10 23:23:01 +0000448 if (!PyArg_Parse(args, "s#", &name, &len))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000449 return NULL;
450 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000451 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000452 return NULL;
453 }
454 strcpy(namebuf, name);
455 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
456 namebuf[len++] = '/';
457 strcpy(namebuf + len, "*.*");
458
Barry Warsaw53699e91996-12-10 23:23:01 +0000459 if ((d = PyList_New(0)) == NULL)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000460 return NULL;
461
462 hFindFile = FindFirstFile(namebuf, &FileData);
463 if (hFindFile == INVALID_HANDLE_VALUE) {
464 errno = GetLastError();
465 return posix_error();
466 }
467 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000468 if (FileData.cFileName[0] == '.' &&
469 (FileData.cFileName[1] == '\0' ||
470 FileData.cFileName[1] == '.' &&
471 FileData.cFileName[2] == '\0'))
472 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000473 v = PyString_FromString(FileData.cFileName);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000474 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000475 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000476 d = NULL;
477 break;
478 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000479 if (PyList_Append(d, v) != 0) {
480 Py_DECREF(v);
481 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000482 d = NULL;
483 break;
484 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000485 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000486 } while (FindNextFile(hFindFile, &FileData) == TRUE);
487
488 if (FindClose(hFindFile) == FALSE) {
489 errno = GetLastError();
490 return posix_error();
491 }
492
493 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000494
Guido van Rossum8d665e61996-06-26 18:22:49 +0000495#else /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000496#ifdef _MSC_VER /* 16-bit Windows */
497
498#ifndef MAX_PATH
499#define MAX_PATH 250
500#endif
501 char *name, *pt;
502 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000503 PyObject *d, *v;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000504 char namebuf[MAX_PATH+5];
505 struct _find_t ep;
506
Barry Warsaw53699e91996-12-10 23:23:01 +0000507 if (!PyArg_Parse(args, "s#", &name, &len))
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000508 return NULL;
509 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000510 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000511 return NULL;
512 }
513 strcpy(namebuf, name);
514 for (pt = namebuf; *pt; pt++)
515 if (*pt == '/')
516 *pt = '\\';
517 if (namebuf[len-1] != '\\')
518 namebuf[len++] = '\\';
519 strcpy(namebuf + len, "*.*");
520
Barry Warsaw53699e91996-12-10 23:23:01 +0000521 if ((d = PyList_New(0)) == NULL)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000522 return NULL;
523
524 if (_dos_findfirst(namebuf, _A_RDONLY |
525 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0){
526 errno = ENOENT;
527 return posix_error();
528 }
529 do {
530 if (ep.name[0] == '.' &&
531 (ep.name[1] == '\0' ||
532 ep.name[1] == '.' &&
533 ep.name[2] == '\0'))
534 continue;
535 strcpy(namebuf, ep.name);
536 for (pt = namebuf; *pt; pt++)
537 if (isupper(*pt))
538 *pt = tolower(*pt);
Barry Warsaw53699e91996-12-10 23:23:01 +0000539 v = PyString_FromString(namebuf);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000540 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000541 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000542 d = NULL;
543 break;
544 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000545 if (PyList_Append(d, v) != 0) {
546 Py_DECREF(v);
547 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000548 d = NULL;
549 break;
550 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000551 Py_DECREF(v);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000552 } while (_dos_findnext(&ep) == 0);
553
554 return d;
555
556#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000557
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000558 char *name;
Barry Warsaw53699e91996-12-10 23:23:01 +0000559 PyObject *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000560 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000561 struct dirent *ep;
Barry Warsaw53699e91996-12-10 23:23:01 +0000562 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000564 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000565 if ((dirp = opendir(name)) == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000566 Py_BLOCK_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000567 return posix_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000568 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000569 if ((d = PyList_New(0)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000570 closedir(dirp);
Barry Warsaw53699e91996-12-10 23:23:01 +0000571 Py_BLOCK_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000572 return NULL;
573 }
574 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000575 if (ep->d_name[0] == '.' &&
576 (NAMLEN(ep) == 1 ||
Guido van Rossuma376cc51996-12-05 23:43:35 +0000577 (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000578 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000579 v = PyString_FromStringAndSize(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000580 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000581 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000582 d = NULL;
583 break;
584 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000585 if (PyList_Append(d, v) != 0) {
586 Py_DECREF(v);
587 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000588 d = NULL;
589 break;
590 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000591 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000592 }
593 closedir(dirp);
Barry Warsaw53699e91996-12-10 23:23:01 +0000594 Py_END_ALLOW_THREADS
Guido van Rossum0ee42cd1991-04-08 21:01:03 +0000595
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000596 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000597
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000598#endif /* !_MSC_VER */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000599#endif /* !MS_WIN32 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000600}
601
Barry Warsaw53699e91996-12-10 23:23:01 +0000602static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000603posix_mkdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000604 PyObject *self;
605 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000606{
Guido van Rossumb0824db1996-02-25 04:50:32 +0000607 int res;
608 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000609 int mode = 0777;
Barry Warsaw53699e91996-12-10 23:23:01 +0000610 if (!PyArg_ParseTuple(args, "s|i", &path, &mode))
Guido van Rossumb0824db1996-02-25 04:50:32 +0000611 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000612 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8d665e61996-06-26 18:22:49 +0000613#if defined(__WATCOMC__) || defined(_MSC_VER)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000614 res = mkdir(path);
615#else
Guido van Rossumb0824db1996-02-25 04:50:32 +0000616 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000617#endif
Barry Warsaw53699e91996-12-10 23:23:01 +0000618 Py_END_ALLOW_THREADS
Guido van Rossumb0824db1996-02-25 04:50:32 +0000619 if (res < 0)
620 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000621 Py_INCREF(Py_None);
622 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000623}
624
Guido van Rossumb6775db1994-08-01 11:34:53 +0000625#ifdef HAVE_NICE
Barry Warsaw53699e91996-12-10 23:23:01 +0000626static PyObject *
Guido van Rossum775f4da1993-01-09 17:18:52 +0000627posix_nice(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000628 PyObject *self;
629 PyObject *args;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000630{
631 int increment, value;
632
Barry Warsaw53699e91996-12-10 23:23:01 +0000633 if (!PyArg_Parse(args, "i", &increment))
Guido van Rossum775f4da1993-01-09 17:18:52 +0000634 return NULL;
635 value = nice(increment);
636 if (value == -1)
637 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000638 return PyInt_FromLong((long) value);
Guido van Rossum775f4da1993-01-09 17:18:52 +0000639}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000640#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000641
Barry Warsaw53699e91996-12-10 23:23:01 +0000642static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000643posix_rename(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000644 PyObject *self;
645 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000646{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000647 return posix_2str(args, rename);
648}
649
Barry Warsaw53699e91996-12-10 23:23:01 +0000650static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000651posix_rmdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000652 PyObject *self;
653 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000654{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000655 return posix_1str(args, rmdir);
656}
657
Barry Warsaw53699e91996-12-10 23:23:01 +0000658static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000659posix_stat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000660 PyObject *self;
661 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000662{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000663 return posix_do_stat(self, args, stat);
664}
665
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000666#ifdef HAVE_SYSTEM
Barry Warsaw53699e91996-12-10 23:23:01 +0000667static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000668posix_system(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000669 PyObject *self;
670 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000671{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000672 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000673 long sts;
Barry Warsaw53699e91996-12-10 23:23:01 +0000674 if (!PyArg_Parse(args, "s", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000675 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000676 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000677 sts = system(command);
Barry Warsaw53699e91996-12-10 23:23:01 +0000678 Py_END_ALLOW_THREADS
679 return PyInt_FromLong(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000680}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000681#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000682
Barry Warsaw53699e91996-12-10 23:23:01 +0000683static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000684posix_umask(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000685 PyObject *self;
686 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000687{
688 int i;
Barry Warsaw53699e91996-12-10 23:23:01 +0000689 if (!PyArg_Parse(args, "i", &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000690 return NULL;
691 i = umask(i);
692 if (i < 0)
693 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000694 return PyInt_FromLong((long)i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000695}
696
Barry Warsaw53699e91996-12-10 23:23:01 +0000697static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000698posix_unlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000699 PyObject *self;
700 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000701{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000702 return posix_1str(args, unlink);
703}
704
Guido van Rossumb6775db1994-08-01 11:34:53 +0000705#ifdef HAVE_UNAME
Barry Warsaw53699e91996-12-10 23:23:01 +0000706static PyObject *
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000707posix_uname(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000708 PyObject *self;
709 PyObject *args;
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000710{
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000711 struct utsname u;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000712 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000713 if (!PyArg_NoArgs(args))
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000714 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000715 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000716 res = uname(&u);
Barry Warsaw53699e91996-12-10 23:23:01 +0000717 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000718 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000719 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000720 return Py_BuildValue("(sssss)",
Guido van Rossume5372401993-03-16 12:15:04 +0000721 u.sysname,
722 u.nodename,
723 u.release,
724 u.version,
725 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000726}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000727#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000728
Barry Warsaw53699e91996-12-10 23:23:01 +0000729static PyObject *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000730posix_utime(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000731 PyObject *self;
732 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000733{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000734 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000735 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000736 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000737
Guido van Rossumb6775db1994-08-01 11:34:53 +0000738#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000739 struct utimbuf buf;
740#define ATIME buf.actime
741#define MTIME buf.modtime
742#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000743#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000744 time_t buf[2];
745#define ATIME buf[0]
746#define MTIME buf[1]
747#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000748#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000749
Barry Warsaw53699e91996-12-10 23:23:01 +0000750 if (!PyArg_Parse(args, "(s(ll))", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000751 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000752 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +0000753 MTIME = mtime;
Barry Warsaw53699e91996-12-10 23:23:01 +0000754 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000755 res = utime(path, UTIME_ARG);
Barry Warsaw53699e91996-12-10 23:23:01 +0000756 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000757 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000758 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000759 Py_INCREF(Py_None);
760 return Py_None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000761#undef UTIME_ARG
762#undef ATIME
763#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000764}
765
Guido van Rossum85e3b011991-06-03 12:42:10 +0000766
Guido van Rossum3b066191991-06-04 19:40:25 +0000767/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000768
Barry Warsaw53699e91996-12-10 23:23:01 +0000769static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000770posix__exit(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000771 PyObject *self;
772 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000773{
774 int sts;
Barry Warsaw53699e91996-12-10 23:23:01 +0000775 if (!PyArg_Parse(args, "i", &sts))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000776 return NULL;
777 _exit(sts);
Guido van Rossuma376cc51996-12-05 23:43:35 +0000778 return NULL; /* Make gcc -Wall happy */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000779}
780
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000781#ifdef HAVE_EXECV
Barry Warsaw53699e91996-12-10 23:23:01 +0000782static PyObject *
Guido van Rossum89b33251993-10-22 14:26:06 +0000783posix_execv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000784 PyObject *self;
785 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000786{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000787 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +0000788 PyObject *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000789 char **argvlist;
790 int i, argc;
Barry Warsaw53699e91996-12-10 23:23:01 +0000791 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossum85e3b011991-06-03 12:42:10 +0000792
Guido van Rossum89b33251993-10-22 14:26:06 +0000793 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +0000794 argv is a list or tuple of strings. */
795
Barry Warsaw53699e91996-12-10 23:23:01 +0000796 if (!PyArg_Parse(args, "(sO)", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000797 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000798 if (PyList_Check(argv)) {
799 argc = PyList_Size(argv);
800 getitem = PyList_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000801 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000802 else if (PyTuple_Check(argv)) {
803 argc = PyTuple_Size(argv);
804 getitem = PyTuple_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000805 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000806 else {
807 badarg:
Barry Warsaw53699e91996-12-10 23:23:01 +0000808 PyErr_BadArgument();
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000809 return NULL;
810 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000811
Barry Warsaw53699e91996-12-10 23:23:01 +0000812 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000813 if (argvlist == NULL)
814 return NULL;
815 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000816 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
817 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000818 goto badarg;
819 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000820 }
821 argvlist[argc] = NULL;
822
Guido van Rossumb6775db1994-08-01 11:34:53 +0000823#ifdef BAD_EXEC_PROTOTYPES
824 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000825#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000826 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000827#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000828
Guido van Rossum85e3b011991-06-03 12:42:10 +0000829 /* If we get here it's definitely an error */
830
Barry Warsaw53699e91996-12-10 23:23:01 +0000831 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000832 return posix_error();
833}
834
Barry Warsaw53699e91996-12-10 23:23:01 +0000835static PyObject *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000836posix_execve(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000837 PyObject *self;
838 PyObject *args;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000839{
840 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +0000841 PyObject *argv, *env;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000842 char **argvlist;
843 char **envlist;
Barry Warsaw53699e91996-12-10 23:23:01 +0000844 PyObject *key, *val;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000845 int i, pos, argc, envc;
Barry Warsaw53699e91996-12-10 23:23:01 +0000846 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000847
848 /* execve has three arguments: (path, argv, env), where
849 argv is a list or tuple of strings and env is a dictionary
850 like posix.environ. */
851
Barry Warsaw53699e91996-12-10 23:23:01 +0000852 if (!PyArg_Parse(args, "(sOO)", &path, &argv, &env))
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000853 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000854 if (PyList_Check(argv)) {
855 argc = PyList_Size(argv);
856 getitem = PyList_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000857 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000858 else if (PyTuple_Check(argv)) {
859 argc = PyTuple_Size(argv);
860 getitem = PyTuple_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000861 }
862 else {
Barry Warsaw53699e91996-12-10 23:23:01 +0000863 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000864 return NULL;
865 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000866 if (!PyDict_Check(env)) {
867 PyErr_SetString(PyExc_TypeError, "env must be dictionary");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000868 return NULL;
869 }
870
Barry Warsaw53699e91996-12-10 23:23:01 +0000871 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000872 if (argvlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000873 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000874 return NULL;
875 }
876 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000877 if (!PyArg_Parse((*getitem)(argv, i),
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000878 "s;argv must be list of strings",
879 &argvlist[i])) {
880 goto fail_1;
881 }
882 }
883 argvlist[argc] = NULL;
884
Barry Warsaw53699e91996-12-10 23:23:01 +0000885 i = PyDict_Size(env);
886 envlist = PyMem_NEW(char *, i + 1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000887 if (envlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000888 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000889 goto fail_1;
890 }
891 pos = 0;
892 envc = 0;
Barry Warsaw53699e91996-12-10 23:23:01 +0000893 while (PyDict_Next(env, &pos, &key, &val)) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000894 char *p, *k, *v;
Barry Warsaw53699e91996-12-10 23:23:01 +0000895 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
896 !PyArg_Parse(val, "s;non-string value in env", &v)) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000897 goto fail_2;
898 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000899 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000900 if (p == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000901 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000902 goto fail_2;
903 }
904 sprintf(p, "%s=%s", k, v);
905 envlist[envc++] = p;
906 }
907 envlist[envc] = 0;
908
Guido van Rossumb6775db1994-08-01 11:34:53 +0000909
910#ifdef BAD_EXEC_PROTOTYPES
911 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000912#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000913 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000914#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000915
916 /* If we get here it's definitely an error */
917
918 (void) posix_error();
919
920 fail_2:
921 while (--envc >= 0)
Barry Warsaw53699e91996-12-10 23:23:01 +0000922 PyMem_DEL(envlist[envc]);
923 PyMem_DEL(envlist);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000924 fail_1:
Barry Warsaw53699e91996-12-10 23:23:01 +0000925 PyMem_DEL(argvlist);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000926
927 return NULL;
928}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000929#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000930
Guido van Rossumad0ee831995-03-01 10:34:45 +0000931#ifdef HAVE_FORK
Barry Warsaw53699e91996-12-10 23:23:01 +0000932static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000933posix_fork(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000934 PyObject *self;
935 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000936{
937 int pid;
Barry Warsaw53699e91996-12-10 23:23:01 +0000938 if (!PyArg_NoArgs(args))
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000939 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000940 pid = fork();
941 if (pid == -1)
942 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000943 return PyInt_FromLong((long)pid);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000944}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000945#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000946
Guido van Rossumad0ee831995-03-01 10:34:45 +0000947#ifdef HAVE_GETEGID
Barry Warsaw53699e91996-12-10 23:23:01 +0000948static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000949posix_getegid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000950 PyObject *self;
951 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +0000952{
Barry Warsaw53699e91996-12-10 23:23:01 +0000953 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +0000954 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000955 return PyInt_FromLong((long)getegid());
Guido van Rossum46003ff1992-05-15 11:05:24 +0000956}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000957#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000958
Guido van Rossumad0ee831995-03-01 10:34:45 +0000959#ifdef HAVE_GETEUID
Barry Warsaw53699e91996-12-10 23:23:01 +0000960static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000961posix_geteuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000962 PyObject *self;
963 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +0000964{
Barry Warsaw53699e91996-12-10 23:23:01 +0000965 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +0000966 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000967 return PyInt_FromLong((long)geteuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +0000968}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000969#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000970
Guido van Rossumad0ee831995-03-01 10:34:45 +0000971#ifdef HAVE_GETGID
Barry Warsaw53699e91996-12-10 23:23:01 +0000972static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000973posix_getgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000974 PyObject *self;
975 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +0000976{
Barry Warsaw53699e91996-12-10 23:23:01 +0000977 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +0000978 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000979 return PyInt_FromLong((long)getgid());
Guido van Rossum46003ff1992-05-15 11:05:24 +0000980}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000981#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000982
Barry Warsaw53699e91996-12-10 23:23:01 +0000983static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000984posix_getpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000985 PyObject *self;
986 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000987{
Barry Warsaw53699e91996-12-10 23:23:01 +0000988 if (!PyArg_NoArgs(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000989 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000990 return PyInt_FromLong((long)getpid());
Guido van Rossum85e3b011991-06-03 12:42:10 +0000991}
992
Guido van Rossumb6775db1994-08-01 11:34:53 +0000993#ifdef HAVE_GETPGRP
Barry Warsaw53699e91996-12-10 23:23:01 +0000994static PyObject *
Guido van Rossum04814471991-06-04 20:23:49 +0000995posix_getpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000996 PyObject *self;
997 PyObject *args;
Guido van Rossum04814471991-06-04 20:23:49 +0000998{
Barry Warsaw53699e91996-12-10 23:23:01 +0000999 if (!PyArg_NoArgs(args))
Guido van Rossum04814471991-06-04 20:23:49 +00001000 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001001#ifdef GETPGRP_HAVE_ARG
Barry Warsaw53699e91996-12-10 23:23:01 +00001002 return PyInt_FromLong((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001003#else /* GETPGRP_HAVE_ARG */
Barry Warsaw53699e91996-12-10 23:23:01 +00001004 return PyInt_FromLong((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001005#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001006}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001007#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001008
Guido van Rossumb6775db1994-08-01 11:34:53 +00001009#ifdef HAVE_SETPGRP
Barry Warsaw53699e91996-12-10 23:23:01 +00001010static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001011posix_setpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001012 PyObject *self;
1013 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001014{
Barry Warsaw53699e91996-12-10 23:23:01 +00001015 if (!PyArg_NoArgs(args))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001016 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001017#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001018 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001019#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001020 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001021#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001022 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001023 Py_INCREF(Py_None);
1024 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001025}
1026
Guido van Rossumb6775db1994-08-01 11:34:53 +00001027#endif /* HAVE_SETPGRP */
1028
Guido van Rossumad0ee831995-03-01 10:34:45 +00001029#ifdef HAVE_GETPPID
Barry Warsaw53699e91996-12-10 23:23:01 +00001030static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001031posix_getppid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001032 PyObject *self;
1033 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001034{
Barry Warsaw53699e91996-12-10 23:23:01 +00001035 if (!PyArg_NoArgs(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001036 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001037 return PyInt_FromLong((long)getppid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001038}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001039#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001040
Guido van Rossumad0ee831995-03-01 10:34:45 +00001041#ifdef HAVE_GETUID
Barry Warsaw53699e91996-12-10 23:23:01 +00001042static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001043posix_getuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001044 PyObject *self;
1045 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001046{
Barry Warsaw53699e91996-12-10 23:23:01 +00001047 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001048 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001049 return PyInt_FromLong((long)getuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001050}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001051#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001052
Guido van Rossumad0ee831995-03-01 10:34:45 +00001053#ifdef HAVE_KILL
Barry Warsaw53699e91996-12-10 23:23:01 +00001054static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001055posix_kill(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001056 PyObject *self;
1057 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001058{
1059 int pid, sig;
Barry Warsaw53699e91996-12-10 23:23:01 +00001060 if (!PyArg_Parse(args, "(ii)", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001061 return NULL;
1062 if (kill(pid, sig) == -1)
1063 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001064 Py_INCREF(Py_None);
1065 return Py_None;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001066}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001067#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001068
Guido van Rossumc0125471996-06-28 18:55:32 +00001069#ifdef HAVE_PLOCK
1070
1071#ifdef HAVE_SYS_LOCK_H
1072#include <sys/lock.h>
1073#endif
1074
Barry Warsaw53699e91996-12-10 23:23:01 +00001075static PyObject *
Guido van Rossumc0125471996-06-28 18:55:32 +00001076posix_plock(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001077 PyObject *self;
1078 PyObject *args;
Guido van Rossumc0125471996-06-28 18:55:32 +00001079{
1080 int op;
Barry Warsaw53699e91996-12-10 23:23:01 +00001081 if (!PyArg_Parse(args, "i", &op))
Guido van Rossumc0125471996-06-28 18:55:32 +00001082 return NULL;
1083 if (plock(op) == -1)
1084 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001085 Py_INCREF(Py_None);
1086 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00001087}
1088#endif
1089
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001090#ifdef HAVE_POPEN
Barry Warsaw53699e91996-12-10 23:23:01 +00001091static PyObject *
Guido van Rossum3b066191991-06-04 19:40:25 +00001092posix_popen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001093 PyObject *self;
1094 PyObject *args;
Guido van Rossum3b066191991-06-04 19:40:25 +00001095{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001096 char *name;
1097 char *mode = "r";
1098 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00001099 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00001100 PyObject *f;
1101 if (!PyArg_ParseTuple(args, "s|si", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00001102 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001103 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001104 fp = popen(name, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001105 Py_END_ALLOW_THREADS
Guido van Rossum3b066191991-06-04 19:40:25 +00001106 if (fp == NULL)
1107 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001108 f = PyFile_FromFile(fp, name, mode, pclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001109 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00001110 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001111 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00001112}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001113#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00001114
Guido van Rossumb6775db1994-08-01 11:34:53 +00001115#ifdef HAVE_SETUID
Barry Warsaw53699e91996-12-10 23:23:01 +00001116static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001117posix_setuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001118 PyObject *self;
1119 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001120{
1121 int uid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001122 if (!PyArg_Parse(args, "i", &uid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001123 return NULL;
1124 if (setuid(uid) < 0)
1125 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001126 Py_INCREF(Py_None);
1127 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001128}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001129#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001130
Guido van Rossumb6775db1994-08-01 11:34:53 +00001131#ifdef HAVE_SETGID
Barry Warsaw53699e91996-12-10 23:23:01 +00001132static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001133posix_setgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001134 PyObject *self;
1135 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001136{
1137 int gid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001138 if (!PyArg_Parse(args, "i", &gid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001139 return NULL;
1140 if (setgid(gid) < 0)
1141 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001142 Py_INCREF(Py_None);
1143 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001144}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001145#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001146
Guido van Rossumb6775db1994-08-01 11:34:53 +00001147#ifdef HAVE_WAITPID
Barry Warsaw53699e91996-12-10 23:23:01 +00001148static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00001149posix_waitpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001150 PyObject *self;
1151 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001152{
Guido van Rossumfd03e2b1996-06-19 23:17:02 +00001153 int pid, options, sts = 0;
Barry Warsaw53699e91996-12-10 23:23:01 +00001154 if (!PyArg_Parse(args, "(ii)", &pid, &options))
Guido van Rossum21803b81992-08-09 12:55:27 +00001155 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001156 Py_BEGIN_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00001157 pid = waitpid(pid, &sts, options);
Barry Warsaw53699e91996-12-10 23:23:01 +00001158 Py_END_ALLOW_THREADS
Guido van Rossum85e3b011991-06-03 12:42:10 +00001159 if (pid == -1)
1160 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00001161 else
Barry Warsaw53699e91996-12-10 23:23:01 +00001162 return Py_BuildValue("ii", pid, sts);
Guido van Rossum21803b81992-08-09 12:55:27 +00001163}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001164#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00001165
Guido van Rossumad0ee831995-03-01 10:34:45 +00001166#ifdef HAVE_WAIT
Barry Warsaw53699e91996-12-10 23:23:01 +00001167static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00001168posix_wait(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001169 PyObject *self;
1170 PyObject *args;
Guido van Rossum21803b81992-08-09 12:55:27 +00001171{
1172 int pid, sts;
Barry Warsaw53699e91996-12-10 23:23:01 +00001173 Py_BEGIN_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00001174 pid = wait(&sts);
Barry Warsaw53699e91996-12-10 23:23:01 +00001175 Py_END_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00001176 if (pid == -1)
1177 return posix_error();
1178 else
Barry Warsaw53699e91996-12-10 23:23:01 +00001179 return Py_BuildValue("ii", pid, sts);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001180}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001181#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001182
Barry Warsaw53699e91996-12-10 23:23:01 +00001183static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001184posix_lstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001185 PyObject *self;
1186 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001187{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001188#ifdef HAVE_LSTAT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001189 return posix_do_stat(self, args, lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001190#else /* !HAVE_LSTAT */
1191 return posix_do_stat(self, args, stat);
1192#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001193}
1194
Guido van Rossumb6775db1994-08-01 11:34:53 +00001195#ifdef HAVE_READLINK
Barry Warsaw53699e91996-12-10 23:23:01 +00001196static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001197posix_readlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001198 PyObject *self;
1199 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001200{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001201 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001202 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001203 int n;
Barry Warsaw53699e91996-12-10 23:23:01 +00001204 if (!PyArg_Parse(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001205 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001206 Py_BEGIN_ALLOW_THREADS
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001207 n = readlink(path, buf, (int) sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +00001208 Py_END_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001209 if (n < 0)
1210 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001211 return PyString_FromStringAndSize(buf, n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001212}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001213#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001214
Guido van Rossumb6775db1994-08-01 11:34:53 +00001215#ifdef HAVE_SYMLINK
Barry Warsaw53699e91996-12-10 23:23:01 +00001216static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001217posix_symlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001218 PyObject *self;
1219 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001220{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001221 return posix_2str(args, symlink);
1222}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001223#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001224
Guido van Rossumb6775db1994-08-01 11:34:53 +00001225#ifdef HAVE_TIMES
1226#ifndef HZ
1227#define HZ 60 /* Universal constant :-) */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001228#endif /* HZ */
Barry Warsaw53699e91996-12-10 23:23:01 +00001229static PyObject *
Guido van Rossum22db57e1992-04-05 14:25:30 +00001230posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001231 PyObject *self;
1232 PyObject *args;
Guido van Rossum22db57e1992-04-05 14:25:30 +00001233{
1234 struct tms t;
1235 clock_t c;
Barry Warsaw53699e91996-12-10 23:23:01 +00001236 if (!PyArg_NoArgs(args))
Guido van Rossum22db57e1992-04-05 14:25:30 +00001237 return NULL;
1238 errno = 0;
1239 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00001240 if (c == (clock_t) -1)
1241 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001242 return Py_BuildValue("ddddd",
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001243 (double)t.tms_utime / HZ,
1244 (double)t.tms_stime / HZ,
1245 (double)t.tms_cutime / HZ,
Guido van Rossumbbc34101995-09-13 17:39:51 +00001246 (double)t.tms_cstime / HZ,
1247 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00001248}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001249#endif /* HAVE_TIMES */
Guido van Rossum87755a21996-09-07 00:59:43 +00001250#ifdef MS_WIN32
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001251#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00001252static PyObject *
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001253posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001254 PyObject *self;
1255 PyObject *args;
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001256{
1257 FILETIME create, exit, kernel, user;
1258 HANDLE hProc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001259 if (!PyArg_NoArgs(args))
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001260 return NULL;
1261 hProc = GetCurrentProcess();
1262 GetProcessTimes(hProc,&create, &exit, &kernel, &user);
Barry Warsaw53699e91996-12-10 23:23:01 +00001263 return Py_BuildValue(
1264 "ddddd",
1265 (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime)/2E6,
1266 (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6,
1267 (double)0,
1268 (double)0,
1269 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001270}
Guido van Rossum8d665e61996-06-26 18:22:49 +00001271#endif /* MS_WIN32 */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001272
Guido van Rossumb6775db1994-08-01 11:34:53 +00001273#ifdef HAVE_SETSID
Barry Warsaw53699e91996-12-10 23:23:01 +00001274static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001275posix_setsid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001276 PyObject *self;
1277 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001278{
Barry Warsaw53699e91996-12-10 23:23:01 +00001279 if (!PyArg_NoArgs(args))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001280 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001281 if (setsid() < 0)
1282 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001283 Py_INCREF(Py_None);
1284 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001285}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001286#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001287
Guido van Rossumb6775db1994-08-01 11:34:53 +00001288#ifdef HAVE_SETPGID
Barry Warsaw53699e91996-12-10 23:23:01 +00001289static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001290posix_setpgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001291 PyObject *self;
1292 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001293{
1294 int pid, pgrp;
Barry Warsaw53699e91996-12-10 23:23:01 +00001295 if (!PyArg_Parse(args, "(ii)", &pid, &pgrp))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001296 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001297 if (setpgid(pid, pgrp) < 0)
1298 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001299 Py_INCREF(Py_None);
1300 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001301}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001302#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001303
Guido van Rossumb6775db1994-08-01 11:34:53 +00001304#ifdef HAVE_TCGETPGRP
Barry Warsaw53699e91996-12-10 23:23:01 +00001305static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00001306posix_tcgetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001307 PyObject *self;
1308 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001309{
1310 int fd, pgid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001311 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum7066dd71992-09-17 17:54:56 +00001312 return NULL;
1313 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001314 if (pgid < 0)
1315 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001316 return PyInt_FromLong((long)pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00001317}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001318#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00001319
Guido van Rossumb6775db1994-08-01 11:34:53 +00001320#ifdef HAVE_TCSETPGRP
Barry Warsaw53699e91996-12-10 23:23:01 +00001321static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00001322posix_tcsetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001323 PyObject *self;
1324 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001325{
1326 int fd, pgid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001327 if (!PyArg_Parse(args, "(ii)", &fd, &pgid))
Guido van Rossum7066dd71992-09-17 17:54:56 +00001328 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001329 if (tcsetpgrp(fd, pgid) < 0)
1330 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001331 Py_INCREF(Py_None);
1332 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001333}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001334#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001335
Guido van Rossum687dd131993-05-17 08:34:16 +00001336/* Functions acting on file descriptors */
1337
Barry Warsaw53699e91996-12-10 23:23:01 +00001338static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001339posix_open(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001340 PyObject *self;
1341 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001342{
1343 char *file;
1344 int flag;
1345 int mode = 0777;
1346 int fd;
Barry Warsaw53699e91996-12-10 23:23:01 +00001347 if (!PyArg_Parse(args, "(si)", &file, &flag)) {
1348 PyErr_Clear();
1349 if (!PyArg_Parse(args, "(sii)", &file, &flag, &mode))
Guido van Rossum687dd131993-05-17 08:34:16 +00001350 return NULL;
1351 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001352 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001353 fd = open(file, flag, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001354 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001355 if (fd < 0)
1356 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001357 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001358}
1359
Barry Warsaw53699e91996-12-10 23:23:01 +00001360static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001361posix_close(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001362 PyObject *self;
1363 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001364{
1365 int fd, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001366 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00001367 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001368 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001369 res = close(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00001370 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001371 if (res < 0)
1372 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001373 Py_INCREF(Py_None);
1374 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00001375}
1376
Barry Warsaw53699e91996-12-10 23:23:01 +00001377static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001378posix_dup(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001379 PyObject *self;
1380 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001381{
1382 int fd;
Barry Warsaw53699e91996-12-10 23:23:01 +00001383 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00001384 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001385 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001386 fd = dup(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00001387 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001388 if (fd < 0)
1389 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001390 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001391}
1392
Barry Warsaw53699e91996-12-10 23:23:01 +00001393static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001394posix_dup2(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001395 PyObject *self;
1396 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001397{
1398 int fd, fd2, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001399 if (!PyArg_Parse(args, "(ii)", &fd, &fd2))
Guido van Rossum687dd131993-05-17 08:34:16 +00001400 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001401 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001402 res = dup2(fd, fd2);
Barry Warsaw53699e91996-12-10 23:23:01 +00001403 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001404 if (res < 0)
1405 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001406 Py_INCREF(Py_None);
1407 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00001408}
1409
Barry Warsaw53699e91996-12-10 23:23:01 +00001410static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001411posix_lseek(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001412 PyObject *self;
1413 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001414{
1415 int fd, how;
1416 long pos, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001417 if (!PyArg_Parse(args, "(ili)", &fd, &pos, &how))
Guido van Rossum687dd131993-05-17 08:34:16 +00001418 return NULL;
1419#ifdef SEEK_SET
1420 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
1421 switch (how) {
1422 case 0: how = SEEK_SET; break;
1423 case 1: how = SEEK_CUR; break;
1424 case 2: how = SEEK_END; break;
1425 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001426#endif /* SEEK_END */
Barry Warsaw53699e91996-12-10 23:23:01 +00001427 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001428 res = lseek(fd, pos, how);
Barry Warsaw53699e91996-12-10 23:23:01 +00001429 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001430 if (res < 0)
1431 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001432 return PyInt_FromLong(res);
Guido van Rossum687dd131993-05-17 08:34:16 +00001433}
1434
Barry Warsaw53699e91996-12-10 23:23:01 +00001435static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001436posix_read(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001437 PyObject *self;
1438 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001439{
Guido van Rossum8bac5461996-06-11 18:38:48 +00001440 int fd, size, n;
Barry Warsaw53699e91996-12-10 23:23:01 +00001441 PyObject *buffer;
1442 if (!PyArg_Parse(args, "(ii)", &fd, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00001443 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001444 buffer = PyString_FromStringAndSize((char *)NULL, size);
Guido van Rossum687dd131993-05-17 08:34:16 +00001445 if (buffer == NULL)
1446 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001447 Py_BEGIN_ALLOW_THREADS
1448 n = read(fd, PyString_AsString(buffer), size);
1449 Py_END_ALLOW_THREADS
Guido van Rossum8bac5461996-06-11 18:38:48 +00001450 if (n < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001451 Py_DECREF(buffer);
Guido van Rossum687dd131993-05-17 08:34:16 +00001452 return posix_error();
1453 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00001454 if (n != size)
Barry Warsaw53699e91996-12-10 23:23:01 +00001455 _PyString_Resize(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00001456 return buffer;
1457}
1458
Barry Warsaw53699e91996-12-10 23:23:01 +00001459static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001460posix_write(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001461 PyObject *self;
1462 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001463{
1464 int fd, size;
1465 char *buffer;
Barry Warsaw53699e91996-12-10 23:23:01 +00001466 if (!PyArg_Parse(args, "(is#)", &fd, &buffer, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00001467 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001468 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001469 size = write(fd, buffer, size);
Barry Warsaw53699e91996-12-10 23:23:01 +00001470 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001471 if (size < 0)
1472 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001473 return PyInt_FromLong((long)size);
Guido van Rossum687dd131993-05-17 08:34:16 +00001474}
1475
Barry Warsaw53699e91996-12-10 23:23:01 +00001476static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001477posix_fstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001478 PyObject *self;
1479 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001480{
1481 int fd;
1482 struct stat st;
1483 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001484 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00001485 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001486 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001487 res = fstat(fd, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00001488 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001489 if (res != 0)
1490 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001491 return Py_BuildValue("(llllllllll)",
Guido van Rossum687dd131993-05-17 08:34:16 +00001492 (long)st.st_mode,
1493 (long)st.st_ino,
1494 (long)st.st_dev,
1495 (long)st.st_nlink,
1496 (long)st.st_uid,
1497 (long)st.st_gid,
1498 (long)st.st_size,
1499 (long)st.st_atime,
1500 (long)st.st_mtime,
1501 (long)st.st_ctime);
1502}
1503
Barry Warsaw53699e91996-12-10 23:23:01 +00001504static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001505posix_fdopen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001506 PyObject *self;
1507 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001508{
Barry Warsaw53699e91996-12-10 23:23:01 +00001509 extern int fclose Py_PROTO((FILE *));
Guido van Rossum687dd131993-05-17 08:34:16 +00001510 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001511 char *mode = "r";
1512 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00001513 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00001514 PyObject *f;
1515 if (!PyArg_ParseTuple(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00001516 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001517 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001518 fp = fdopen(fd, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001519 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001520 if (fp == NULL)
1521 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001522 f = PyFile_FromFile(fp, "(fdopen)", mode, fclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001523 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00001524 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001525 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00001526}
1527
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001528#ifdef HAVE_PIPE
Barry Warsaw53699e91996-12-10 23:23:01 +00001529static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001530posix_pipe(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001531 PyObject *self;
1532 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001533{
Guido van Rossum8d665e61996-06-26 18:22:49 +00001534#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00001535 int fds[2];
1536 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001537 if (!PyArg_Parse(args, ""))
Guido van Rossum687dd131993-05-17 08:34:16 +00001538 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001539 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001540 res = pipe(fds);
Barry Warsaw53699e91996-12-10 23:23:01 +00001541 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001542 if (res != 0)
1543 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001544 return Py_BuildValue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00001545#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00001546 HANDLE read, write;
1547 BOOL ok;
Barry Warsaw53699e91996-12-10 23:23:01 +00001548 if (!PyArg_Parse(args, ""))
Guido van Rossum794d8131994-08-23 13:48:48 +00001549 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001550 Py_BEGIN_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00001551 ok = CreatePipe( &read, &write, NULL, 0);
Barry Warsaw53699e91996-12-10 23:23:01 +00001552 Py_END_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00001553 if (!ok)
1554 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001555 return Py_BuildValue("(ii)", read, write);
Guido van Rossum8d665e61996-06-26 18:22:49 +00001556#endif /* MS_WIN32 */
Guido van Rossum687dd131993-05-17 08:34:16 +00001557}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001558#endif /* HAVE_PIPE */
1559
1560#ifdef HAVE_MKFIFO
Barry Warsaw53699e91996-12-10 23:23:01 +00001561static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001562posix_mkfifo(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001563 PyObject *self;
1564 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001565{
1566 char *file;
1567 int mode = 0666;
1568 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001569 if (!PyArg_ParseTuple(args, "s|i", &file, &mode))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001570 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001571 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001572 res = mkfifo(file, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001573 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001574 if (res < 0)
1575 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001576 Py_INCREF(Py_None);
1577 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001578}
1579#endif
1580
1581#ifdef HAVE_FTRUNCATE
Barry Warsaw53699e91996-12-10 23:23:01 +00001582static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001583posix_ftruncate(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001584 PyObject *self; /* Not used */
1585 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001586{
1587 int fd;
1588 long length;
1589 int res;
1590
Barry Warsaw53699e91996-12-10 23:23:01 +00001591 if (!PyArg_Parse(args, "(il)", &fd, &length))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001592 return NULL;
1593
Barry Warsaw53699e91996-12-10 23:23:01 +00001594 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001595 res = ftruncate(fd, length);
Barry Warsaw53699e91996-12-10 23:23:01 +00001596 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001597 if (res < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001598 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001599 return NULL;
1600 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001601 Py_INCREF(Py_None);
1602 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001603}
1604#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00001605
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001606#ifdef HAVE_PUTENV
Barry Warsaw53699e91996-12-10 23:23:01 +00001607static PyObject *
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001608posix_putenv(self,args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001609 PyObject *self;
1610 PyObject *args;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001611{
1612 char *s1, *s2;
1613 char *new;
1614
Barry Warsaw53699e91996-12-10 23:23:01 +00001615 if (!PyArg_ParseTuple(args, "ss", &s1, &s2))
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001616 return NULL;
1617 /* XXX This leaks memory -- not easy to fix :-( */
1618 if ((new = malloc(strlen(s1) + strlen(s2) + 2)) == NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00001619 return PyErr_NoMemory();
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001620 (void) sprintf(new, "%s=%s", s1, s2);
1621 if (putenv(new)) {
1622 posix_error();
1623 return NULL;
1624 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001625 Py_INCREF(Py_None);
1626 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001627}
1628#endif
1629
Barry Warsaw53699e91996-12-10 23:23:01 +00001630static PyMethodDef posix_methods[] = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001631 {"chdir", posix_chdir},
1632 {"chmod", posix_chmod},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001633#ifdef HAVE_CHOWN
1634 {"chown", posix_chown},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001635#endif /* HAVE_CHOWN */
Guido van Rossum36bc6801995-06-14 22:54:23 +00001636#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001637 {"getcwd", posix_getcwd},
Guido van Rossum36bc6801995-06-14 22:54:23 +00001638#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001639#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001640 {"link", posix_link},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001641#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001642 {"listdir", posix_listdir},
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001643 {"lstat", posix_lstat},
Guido van Rossumb0824db1996-02-25 04:50:32 +00001644 {"mkdir", posix_mkdir, 1},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001645#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +00001646 {"nice", posix_nice},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001647#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001648#ifdef HAVE_READLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001649 {"readlink", posix_readlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001650#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001651 {"rename", posix_rename},
1652 {"rmdir", posix_rmdir},
1653 {"stat", posix_stat},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001654#ifdef HAVE_SYMLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001655 {"symlink", posix_symlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001656#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001657#ifdef HAVE_SYSTEM
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001658 {"system", posix_system},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001659#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001660 {"umask", posix_umask},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001661#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001662 {"uname", posix_uname},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001663#endif /* HAVE_UNAME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001664 {"unlink", posix_unlink},
Guido van Rossumf4a59121996-02-13 00:12:56 +00001665 {"remove", posix_unlink},
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001666 {"utime", posix_utime},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001667#ifdef HAVE_TIMES
Guido van Rossum22db57e1992-04-05 14:25:30 +00001668 {"times", posix_times},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001669#endif /* HAVE_TIMES */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001670 {"_exit", posix__exit},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001671#ifdef HAVE_EXECV
Guido van Rossum89b33251993-10-22 14:26:06 +00001672 {"execv", posix_execv},
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001673 {"execve", posix_execve},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001674#endif /* HAVE_EXECV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001675#ifdef HAVE_FORK
Guido van Rossum85e3b011991-06-03 12:42:10 +00001676 {"fork", posix_fork},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001677#endif /* HAVE_FORK */
1678#ifdef HAVE_GETEGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001679 {"getegid", posix_getegid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001680#endif /* HAVE_GETEGID */
1681#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001682 {"geteuid", posix_geteuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001683#endif /* HAVE_GETEUID */
1684#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001685 {"getgid", posix_getgid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001686#endif /* HAVE_GETGID */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001687 {"getpid", posix_getpid},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001688#ifdef HAVE_GETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001689 {"getpgrp", posix_getpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001690#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001691#ifdef HAVE_GETPPID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001692 {"getppid", posix_getppid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001693#endif /* HAVE_GETPPID */
1694#ifdef HAVE_GETUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001695 {"getuid", posix_getuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001696#endif /* HAVE_GETUID */
1697#ifdef HAVE_KILL
Guido van Rossum85e3b011991-06-03 12:42:10 +00001698 {"kill", posix_kill},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001699#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00001700#ifdef HAVE_PLOCK
1701 {"plock", posix_plock},
1702#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001703#ifdef HAVE_POPEN
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001704 {"popen", posix_popen, 1},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001705#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001706#ifdef HAVE_SETUID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001707 {"setuid", posix_setuid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001708#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001709#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001710 {"setgid", posix_setgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001711#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001712#ifdef HAVE_SETPGRP
Guido van Rossumc2670a01992-09-13 20:07:29 +00001713 {"setpgrp", posix_setpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001714#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001715#ifdef HAVE_WAIT
Guido van Rossum85e3b011991-06-03 12:42:10 +00001716 {"wait", posix_wait},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001717#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001718#ifdef HAVE_WAITPID
Guido van Rossum21803b81992-08-09 12:55:27 +00001719 {"waitpid", posix_waitpid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001720#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001721#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001722 {"setsid", posix_setsid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001723#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001724#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001725 {"setpgid", posix_setpgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001726#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001727#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001728 {"tcgetpgrp", posix_tcgetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001729#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001730#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001731 {"tcsetpgrp", posix_tcsetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001732#endif /* HAVE_TCSETPGRP */
Guido van Rossum687dd131993-05-17 08:34:16 +00001733 {"open", posix_open},
1734 {"close", posix_close},
1735 {"dup", posix_dup},
1736 {"dup2", posix_dup2},
1737 {"lseek", posix_lseek},
1738 {"read", posix_read},
1739 {"write", posix_write},
1740 {"fstat", posix_fstat},
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001741 {"fdopen", posix_fdopen, 1},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001742#ifdef HAVE_PIPE
Guido van Rossum687dd131993-05-17 08:34:16 +00001743 {"pipe", posix_pipe},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001744#endif
1745#ifdef HAVE_MKFIFO
1746 {"mkfifo", posix_mkfifo, 1},
1747#endif
1748#ifdef HAVE_FTRUNCATE
1749 {"ftruncate", posix_ftruncate, 1},
1750#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001751#ifdef HAVE_PUTENV
1752 {"putenv", posix_putenv, 1},
1753#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001754 {NULL, NULL} /* Sentinel */
1755};
1756
1757
Guido van Rossuma0e71301996-05-28 22:30:38 +00001758#if defined(_MSC_VER) || defined(__WATCOMC__)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001759void
1760initnt()
1761{
Barry Warsaw53699e91996-12-10 23:23:01 +00001762 PyObject *m, *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001763
Barry Warsaw53699e91996-12-10 23:23:01 +00001764 m = Py_InitModule("nt", posix_methods);
1765 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001766
1767 /* Initialize nt.environ dictionary */
1768 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00001769 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
1770 Py_FatalError("can't define nt.environ");
1771 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001772
1773 /* Initialize nt.error exception */
Barry Warsaw53699e91996-12-10 23:23:01 +00001774 PosixError = PyString_FromString("nt.error");
1775 if (PosixError == NULL ||
1776 PyDict_SetItemString(d, "error", PosixError) != 0)
1777 Py_FatalError("can't define nt.error");
Guido van Rossumb6775db1994-08-01 11:34:53 +00001778}
Guido van Rossum8d665e61996-06-26 18:22:49 +00001779#else /* not a PC port */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001780void
1781initposix()
1782{
Barry Warsaw53699e91996-12-10 23:23:01 +00001783 PyObject *m, *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001784
Barry Warsaw53699e91996-12-10 23:23:01 +00001785 m = Py_InitModule("posix", posix_methods);
1786 d = PyModule_GetDict(m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001787
1788 /* Initialize posix.environ dictionary */
1789 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00001790 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
1791 Py_FatalError("can't define posix.environ");
1792 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001793
Guido van Rossumde4e1241995-03-30 10:56:54 +00001794#ifdef WNOHANG
1795 /* Export WNOHANG symbol */
Barry Warsaw53699e91996-12-10 23:23:01 +00001796 v = PyInt_FromLong((long)WNOHANG);
1797 if (v == NULL || PyDict_SetItemString(d, "WNOHANG", v) != 0)
1798 Py_FatalError("can't define posix.WNOHANG");
1799 Py_DECREF(v);
Guido van Rossumde4e1241995-03-30 10:56:54 +00001800#endif
1801
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001802 /* Initialize posix.error exception */
Barry Warsaw53699e91996-12-10 23:23:01 +00001803 PosixError = PyString_FromString("posix.error");
1804 if (PosixError == NULL ||
1805 PyDict_SetItemString(d, "error", PosixError) != 0)
1806 Py_FatalError("can't define posix.error");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001807}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001808#endif /* !_MSC_VER */