blob: d73397d7a9f7c93c1a43a732acc62f633eb77863 [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 |
Barry Warsaw43d68b81996-12-19 22:10:44 +0000525 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0)
526 {
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000527 errno = ENOENT;
528 return posix_error();
529 }
530 do {
531 if (ep.name[0] == '.' &&
532 (ep.name[1] == '\0' ||
533 ep.name[1] == '.' &&
534 ep.name[2] == '\0'))
535 continue;
536 strcpy(namebuf, ep.name);
537 for (pt = namebuf; *pt; pt++)
538 if (isupper(*pt))
539 *pt = tolower(*pt);
Barry Warsaw53699e91996-12-10 23:23:01 +0000540 v = PyString_FromString(namebuf);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000541 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000542 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000543 d = NULL;
544 break;
545 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000546 if (PyList_Append(d, v) != 0) {
547 Py_DECREF(v);
548 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000549 d = NULL;
550 break;
551 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000552 Py_DECREF(v);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000553 } while (_dos_findnext(&ep) == 0);
554
555 return d;
556
557#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000558
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000559 char *name;
Barry Warsaw53699e91996-12-10 23:23:01 +0000560 PyObject *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000561 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000562 struct dirent *ep;
Barry Warsaw53699e91996-12-10 23:23:01 +0000563 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000564 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000565 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000566 if ((dirp = opendir(name)) == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000567 Py_BLOCK_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000568 return posix_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000569 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000570 if ((d = PyList_New(0)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000571 closedir(dirp);
Barry Warsaw53699e91996-12-10 23:23:01 +0000572 Py_BLOCK_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000573 return NULL;
574 }
575 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000576 if (ep->d_name[0] == '.' &&
577 (NAMLEN(ep) == 1 ||
Guido van Rossuma376cc51996-12-05 23:43:35 +0000578 (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000579 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000580 v = PyString_FromStringAndSize(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000581 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000582 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000583 d = NULL;
584 break;
585 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000586 if (PyList_Append(d, v) != 0) {
587 Py_DECREF(v);
588 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000589 d = NULL;
590 break;
591 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000592 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000593 }
594 closedir(dirp);
Barry Warsaw53699e91996-12-10 23:23:01 +0000595 Py_END_ALLOW_THREADS
Guido van Rossum0ee42cd1991-04-08 21:01:03 +0000596
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000597 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000598
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000599#endif /* !_MSC_VER */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000600#endif /* !MS_WIN32 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000601}
602
Barry Warsaw53699e91996-12-10 23:23:01 +0000603static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000604posix_mkdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000605 PyObject *self;
606 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000607{
Guido van Rossumb0824db1996-02-25 04:50:32 +0000608 int res;
609 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000610 int mode = 0777;
Barry Warsaw53699e91996-12-10 23:23:01 +0000611 if (!PyArg_ParseTuple(args, "s|i", &path, &mode))
Guido van Rossumb0824db1996-02-25 04:50:32 +0000612 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000613 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8d665e61996-06-26 18:22:49 +0000614#if defined(__WATCOMC__) || defined(_MSC_VER)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000615 res = mkdir(path);
616#else
Guido van Rossumb0824db1996-02-25 04:50:32 +0000617 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000618#endif
Barry Warsaw53699e91996-12-10 23:23:01 +0000619 Py_END_ALLOW_THREADS
Guido van Rossumb0824db1996-02-25 04:50:32 +0000620 if (res < 0)
621 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000622 Py_INCREF(Py_None);
623 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000624}
625
Guido van Rossumb6775db1994-08-01 11:34:53 +0000626#ifdef HAVE_NICE
Barry Warsaw53699e91996-12-10 23:23:01 +0000627static PyObject *
Guido van Rossum775f4da1993-01-09 17:18:52 +0000628posix_nice(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000629 PyObject *self;
630 PyObject *args;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000631{
632 int increment, value;
633
Barry Warsaw53699e91996-12-10 23:23:01 +0000634 if (!PyArg_Parse(args, "i", &increment))
Guido van Rossum775f4da1993-01-09 17:18:52 +0000635 return NULL;
636 value = nice(increment);
637 if (value == -1)
638 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000639 return PyInt_FromLong((long) value);
Guido van Rossum775f4da1993-01-09 17:18:52 +0000640}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000641#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000642
Barry Warsaw53699e91996-12-10 23:23:01 +0000643static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000644posix_rename(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000645 PyObject *self;
646 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000647{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000648 return posix_2str(args, rename);
649}
650
Barry Warsaw53699e91996-12-10 23:23:01 +0000651static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000652posix_rmdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000653 PyObject *self;
654 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000655{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000656 return posix_1str(args, rmdir);
657}
658
Barry Warsaw53699e91996-12-10 23:23:01 +0000659static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000660posix_stat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000661 PyObject *self;
662 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000663{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000664 return posix_do_stat(self, args, stat);
665}
666
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000667#ifdef HAVE_SYSTEM
Barry Warsaw53699e91996-12-10 23:23:01 +0000668static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000669posix_system(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000670 PyObject *self;
671 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000672{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000673 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000674 long sts;
Barry Warsaw53699e91996-12-10 23:23:01 +0000675 if (!PyArg_Parse(args, "s", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000676 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000677 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000678 sts = system(command);
Barry Warsaw53699e91996-12-10 23:23:01 +0000679 Py_END_ALLOW_THREADS
680 return PyInt_FromLong(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000681}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000682#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000683
Barry Warsaw53699e91996-12-10 23:23:01 +0000684static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000685posix_umask(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000686 PyObject *self;
687 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000688{
689 int i;
Barry Warsaw53699e91996-12-10 23:23:01 +0000690 if (!PyArg_Parse(args, "i", &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000691 return NULL;
692 i = umask(i);
693 if (i < 0)
694 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000695 return PyInt_FromLong((long)i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000696}
697
Barry Warsaw53699e91996-12-10 23:23:01 +0000698static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000699posix_unlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000700 PyObject *self;
701 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000702{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000703 return posix_1str(args, unlink);
704}
705
Guido van Rossumb6775db1994-08-01 11:34:53 +0000706#ifdef HAVE_UNAME
Barry Warsaw53699e91996-12-10 23:23:01 +0000707static PyObject *
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000708posix_uname(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000709 PyObject *self;
710 PyObject *args;
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000711{
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000712 struct utsname u;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000713 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000714 if (!PyArg_NoArgs(args))
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000715 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000716 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000717 res = uname(&u);
Barry Warsaw53699e91996-12-10 23:23:01 +0000718 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000719 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000720 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000721 return Py_BuildValue("(sssss)",
Barry Warsaw43d68b81996-12-19 22:10:44 +0000722 u.sysname,
723 u.nodename,
724 u.release,
725 u.version,
726 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000727}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000728#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000729
Barry Warsaw53699e91996-12-10 23:23:01 +0000730static PyObject *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000731posix_utime(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000732 PyObject *self;
733 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000734{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000735 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000736 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000737 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000738
Guido van Rossumb6775db1994-08-01 11:34:53 +0000739#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000740 struct utimbuf buf;
741#define ATIME buf.actime
742#define MTIME buf.modtime
743#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000744#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000745 time_t buf[2];
746#define ATIME buf[0]
747#define MTIME buf[1]
748#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000749#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000750
Barry Warsaw53699e91996-12-10 23:23:01 +0000751 if (!PyArg_Parse(args, "(s(ll))", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000752 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000753 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +0000754 MTIME = mtime;
Barry Warsaw53699e91996-12-10 23:23:01 +0000755 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000756 res = utime(path, UTIME_ARG);
Barry Warsaw53699e91996-12-10 23:23:01 +0000757 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000758 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000759 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000760 Py_INCREF(Py_None);
761 return Py_None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000762#undef UTIME_ARG
763#undef ATIME
764#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000765}
766
Guido van Rossum85e3b011991-06-03 12:42:10 +0000767
Guido van Rossum3b066191991-06-04 19:40:25 +0000768/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000769
Barry Warsaw53699e91996-12-10 23:23:01 +0000770static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000771posix__exit(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000772 PyObject *self;
773 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000774{
775 int sts;
Barry Warsaw53699e91996-12-10 23:23:01 +0000776 if (!PyArg_Parse(args, "i", &sts))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000777 return NULL;
778 _exit(sts);
Guido van Rossuma376cc51996-12-05 23:43:35 +0000779 return NULL; /* Make gcc -Wall happy */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000780}
781
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000782#ifdef HAVE_EXECV
Barry Warsaw53699e91996-12-10 23:23:01 +0000783static PyObject *
Guido van Rossum89b33251993-10-22 14:26:06 +0000784posix_execv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000785 PyObject *self;
786 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000787{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000788 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +0000789 PyObject *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000790 char **argvlist;
791 int i, argc;
Barry Warsaw53699e91996-12-10 23:23:01 +0000792 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossum85e3b011991-06-03 12:42:10 +0000793
Guido van Rossum89b33251993-10-22 14:26:06 +0000794 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +0000795 argv is a list or tuple of strings. */
796
Barry Warsaw53699e91996-12-10 23:23:01 +0000797 if (!PyArg_Parse(args, "(sO)", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000798 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000799 if (PyList_Check(argv)) {
800 argc = PyList_Size(argv);
801 getitem = PyList_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000802 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000803 else if (PyTuple_Check(argv)) {
804 argc = PyTuple_Size(argv);
805 getitem = PyTuple_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000806 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000807 else {
808 badarg:
Barry Warsaw53699e91996-12-10 23:23:01 +0000809 PyErr_BadArgument();
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000810 return NULL;
811 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000812
Barry Warsaw53699e91996-12-10 23:23:01 +0000813 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000814 if (argvlist == NULL)
815 return NULL;
816 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000817 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
818 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000819 goto badarg;
820 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000821 }
822 argvlist[argc] = NULL;
823
Guido van Rossumb6775db1994-08-01 11:34:53 +0000824#ifdef BAD_EXEC_PROTOTYPES
825 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000826#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000827 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000828#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000829
Guido van Rossum85e3b011991-06-03 12:42:10 +0000830 /* If we get here it's definitely an error */
831
Barry Warsaw53699e91996-12-10 23:23:01 +0000832 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000833 return posix_error();
834}
835
Barry Warsaw53699e91996-12-10 23:23:01 +0000836static PyObject *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000837posix_execve(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000838 PyObject *self;
839 PyObject *args;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000840{
841 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +0000842 PyObject *argv, *env;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000843 char **argvlist;
844 char **envlist;
Barry Warsaw53699e91996-12-10 23:23:01 +0000845 PyObject *key, *val;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000846 int i, pos, argc, envc;
Barry Warsaw53699e91996-12-10 23:23:01 +0000847 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000848
849 /* execve has three arguments: (path, argv, env), where
850 argv is a list or tuple of strings and env is a dictionary
851 like posix.environ. */
852
Barry Warsaw53699e91996-12-10 23:23:01 +0000853 if (!PyArg_Parse(args, "(sOO)", &path, &argv, &env))
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000854 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000855 if (PyList_Check(argv)) {
856 argc = PyList_Size(argv);
857 getitem = PyList_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000858 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000859 else if (PyTuple_Check(argv)) {
860 argc = PyTuple_Size(argv);
861 getitem = PyTuple_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000862 }
863 else {
Barry Warsaw53699e91996-12-10 23:23:01 +0000864 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000865 return NULL;
866 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000867 if (!PyDict_Check(env)) {
868 PyErr_SetString(PyExc_TypeError, "env must be dictionary");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000869 return NULL;
870 }
871
Barry Warsaw53699e91996-12-10 23:23:01 +0000872 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000873 if (argvlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000874 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000875 return NULL;
876 }
877 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000878 if (!PyArg_Parse((*getitem)(argv, i),
Barry Warsaw43d68b81996-12-19 22:10:44 +0000879 "s;argv must be list of strings",
880 &argvlist[i]))
881 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000882 goto fail_1;
883 }
884 }
885 argvlist[argc] = NULL;
886
Barry Warsaw53699e91996-12-10 23:23:01 +0000887 i = PyDict_Size(env);
888 envlist = PyMem_NEW(char *, i + 1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000889 if (envlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000890 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000891 goto fail_1;
892 }
893 pos = 0;
894 envc = 0;
Barry Warsaw53699e91996-12-10 23:23:01 +0000895 while (PyDict_Next(env, &pos, &key, &val)) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000896 char *p, *k, *v;
Barry Warsaw53699e91996-12-10 23:23:01 +0000897 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
Barry Warsaw43d68b81996-12-19 22:10:44 +0000898 !PyArg_Parse(val, "s;non-string value in env", &v))
899 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000900 goto fail_2;
901 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000902 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000903 if (p == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000904 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000905 goto fail_2;
906 }
907 sprintf(p, "%s=%s", k, v);
908 envlist[envc++] = p;
909 }
910 envlist[envc] = 0;
911
Guido van Rossumb6775db1994-08-01 11:34:53 +0000912
913#ifdef BAD_EXEC_PROTOTYPES
914 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000915#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000916 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000917#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000918
919 /* If we get here it's definitely an error */
920
921 (void) posix_error();
922
923 fail_2:
924 while (--envc >= 0)
Barry Warsaw53699e91996-12-10 23:23:01 +0000925 PyMem_DEL(envlist[envc]);
926 PyMem_DEL(envlist);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000927 fail_1:
Barry Warsaw53699e91996-12-10 23:23:01 +0000928 PyMem_DEL(argvlist);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000929
930 return NULL;
931}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000932#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000933
Guido van Rossumad0ee831995-03-01 10:34:45 +0000934#ifdef HAVE_FORK
Barry Warsaw53699e91996-12-10 23:23:01 +0000935static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000936posix_fork(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000937 PyObject *self;
938 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000939{
940 int pid;
Barry Warsaw53699e91996-12-10 23:23:01 +0000941 if (!PyArg_NoArgs(args))
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000942 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000943 pid = fork();
944 if (pid == -1)
945 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000946 return PyInt_FromLong((long)pid);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000947}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000948#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000949
Guido van Rossumad0ee831995-03-01 10:34:45 +0000950#ifdef HAVE_GETEGID
Barry Warsaw53699e91996-12-10 23:23:01 +0000951static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000952posix_getegid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000953 PyObject *self;
954 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +0000955{
Barry Warsaw53699e91996-12-10 23:23:01 +0000956 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +0000957 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000958 return PyInt_FromLong((long)getegid());
Guido van Rossum46003ff1992-05-15 11:05:24 +0000959}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000960#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000961
Guido van Rossumad0ee831995-03-01 10:34:45 +0000962#ifdef HAVE_GETEUID
Barry Warsaw53699e91996-12-10 23:23:01 +0000963static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000964posix_geteuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000965 PyObject *self;
966 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +0000967{
Barry Warsaw53699e91996-12-10 23:23:01 +0000968 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +0000969 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000970 return PyInt_FromLong((long)geteuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +0000971}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000972#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000973
Guido van Rossumad0ee831995-03-01 10:34:45 +0000974#ifdef HAVE_GETGID
Barry Warsaw53699e91996-12-10 23:23:01 +0000975static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000976posix_getgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000977 PyObject *self;
978 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +0000979{
Barry Warsaw53699e91996-12-10 23:23:01 +0000980 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +0000981 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000982 return PyInt_FromLong((long)getgid());
Guido van Rossum46003ff1992-05-15 11:05:24 +0000983}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000984#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000985
Barry Warsaw53699e91996-12-10 23:23:01 +0000986static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000987posix_getpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000988 PyObject *self;
989 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000990{
Barry Warsaw53699e91996-12-10 23:23:01 +0000991 if (!PyArg_NoArgs(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000992 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000993 return PyInt_FromLong((long)getpid());
Guido van Rossum85e3b011991-06-03 12:42:10 +0000994}
995
Guido van Rossumb6775db1994-08-01 11:34:53 +0000996#ifdef HAVE_GETPGRP
Barry Warsaw53699e91996-12-10 23:23:01 +0000997static PyObject *
Guido van Rossum04814471991-06-04 20:23:49 +0000998posix_getpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000999 PyObject *self;
1000 PyObject *args;
Guido van Rossum04814471991-06-04 20:23:49 +00001001{
Barry Warsaw53699e91996-12-10 23:23:01 +00001002 if (!PyArg_NoArgs(args))
Guido van Rossum04814471991-06-04 20:23:49 +00001003 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001004#ifdef GETPGRP_HAVE_ARG
Barry Warsaw53699e91996-12-10 23:23:01 +00001005 return PyInt_FromLong((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001006#else /* GETPGRP_HAVE_ARG */
Barry Warsaw53699e91996-12-10 23:23:01 +00001007 return PyInt_FromLong((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001008#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001009}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001010#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001011
Guido van Rossumb6775db1994-08-01 11:34:53 +00001012#ifdef HAVE_SETPGRP
Barry Warsaw53699e91996-12-10 23:23:01 +00001013static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001014posix_setpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001015 PyObject *self;
1016 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001017{
Barry Warsaw53699e91996-12-10 23:23:01 +00001018 if (!PyArg_NoArgs(args))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001019 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001020#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001021 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001022#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001023 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001024#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001025 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001026 Py_INCREF(Py_None);
1027 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001028}
1029
Guido van Rossumb6775db1994-08-01 11:34:53 +00001030#endif /* HAVE_SETPGRP */
1031
Guido van Rossumad0ee831995-03-01 10:34:45 +00001032#ifdef HAVE_GETPPID
Barry Warsaw53699e91996-12-10 23:23:01 +00001033static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001034posix_getppid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001035 PyObject *self;
1036 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001037{
Barry Warsaw53699e91996-12-10 23:23:01 +00001038 if (!PyArg_NoArgs(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001039 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001040 return PyInt_FromLong((long)getppid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001041}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001042#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001043
Guido van Rossumad0ee831995-03-01 10:34:45 +00001044#ifdef HAVE_GETUID
Barry Warsaw53699e91996-12-10 23:23:01 +00001045static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001046posix_getuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001047 PyObject *self;
1048 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001049{
Barry Warsaw53699e91996-12-10 23:23:01 +00001050 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001051 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001052 return PyInt_FromLong((long)getuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001053}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001054#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001055
Guido van Rossumad0ee831995-03-01 10:34:45 +00001056#ifdef HAVE_KILL
Barry Warsaw53699e91996-12-10 23:23:01 +00001057static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001058posix_kill(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001059 PyObject *self;
1060 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001061{
1062 int pid, sig;
Barry Warsaw53699e91996-12-10 23:23:01 +00001063 if (!PyArg_Parse(args, "(ii)", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001064 return NULL;
1065 if (kill(pid, sig) == -1)
1066 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001067 Py_INCREF(Py_None);
1068 return Py_None;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001069}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001070#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001071
Guido van Rossumc0125471996-06-28 18:55:32 +00001072#ifdef HAVE_PLOCK
1073
1074#ifdef HAVE_SYS_LOCK_H
1075#include <sys/lock.h>
1076#endif
1077
Barry Warsaw53699e91996-12-10 23:23:01 +00001078static PyObject *
Guido van Rossumc0125471996-06-28 18:55:32 +00001079posix_plock(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001080 PyObject *self;
1081 PyObject *args;
Guido van Rossumc0125471996-06-28 18:55:32 +00001082{
1083 int op;
Barry Warsaw53699e91996-12-10 23:23:01 +00001084 if (!PyArg_Parse(args, "i", &op))
Guido van Rossumc0125471996-06-28 18:55:32 +00001085 return NULL;
1086 if (plock(op) == -1)
1087 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001088 Py_INCREF(Py_None);
1089 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00001090}
1091#endif
1092
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001093#ifdef HAVE_POPEN
Barry Warsaw53699e91996-12-10 23:23:01 +00001094static PyObject *
Guido van Rossum3b066191991-06-04 19:40:25 +00001095posix_popen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001096 PyObject *self;
1097 PyObject *args;
Guido van Rossum3b066191991-06-04 19:40:25 +00001098{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001099 char *name;
1100 char *mode = "r";
1101 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00001102 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00001103 PyObject *f;
1104 if (!PyArg_ParseTuple(args, "s|si", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00001105 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001106 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001107 fp = popen(name, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001108 Py_END_ALLOW_THREADS
Guido van Rossum3b066191991-06-04 19:40:25 +00001109 if (fp == NULL)
1110 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001111 f = PyFile_FromFile(fp, name, mode, pclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001112 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00001113 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001114 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00001115}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001116#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00001117
Guido van Rossumb6775db1994-08-01 11:34:53 +00001118#ifdef HAVE_SETUID
Barry Warsaw53699e91996-12-10 23:23:01 +00001119static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001120posix_setuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001121 PyObject *self;
1122 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001123{
1124 int uid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001125 if (!PyArg_Parse(args, "i", &uid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001126 return NULL;
1127 if (setuid(uid) < 0)
1128 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001129 Py_INCREF(Py_None);
1130 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001131}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001132#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001133
Guido van Rossumb6775db1994-08-01 11:34:53 +00001134#ifdef HAVE_SETGID
Barry Warsaw53699e91996-12-10 23:23:01 +00001135static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001136posix_setgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001137 PyObject *self;
1138 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001139{
1140 int gid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001141 if (!PyArg_Parse(args, "i", &gid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001142 return NULL;
1143 if (setgid(gid) < 0)
1144 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001145 Py_INCREF(Py_None);
1146 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001147}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001148#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001149
Guido van Rossumb6775db1994-08-01 11:34:53 +00001150#ifdef HAVE_WAITPID
Barry Warsaw53699e91996-12-10 23:23:01 +00001151static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00001152posix_waitpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001153 PyObject *self;
1154 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001155{
Guido van Rossumfd03e2b1996-06-19 23:17:02 +00001156 int pid, options, sts = 0;
Barry Warsaw53699e91996-12-10 23:23:01 +00001157 if (!PyArg_Parse(args, "(ii)", &pid, &options))
Guido van Rossum21803b81992-08-09 12:55:27 +00001158 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001159 Py_BEGIN_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00001160 pid = waitpid(pid, &sts, options);
Barry Warsaw53699e91996-12-10 23:23:01 +00001161 Py_END_ALLOW_THREADS
Guido van Rossum85e3b011991-06-03 12:42:10 +00001162 if (pid == -1)
1163 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00001164 else
Barry Warsaw53699e91996-12-10 23:23:01 +00001165 return Py_BuildValue("ii", pid, sts);
Guido van Rossum21803b81992-08-09 12:55:27 +00001166}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001167#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00001168
Guido van Rossumad0ee831995-03-01 10:34:45 +00001169#ifdef HAVE_WAIT
Barry Warsaw53699e91996-12-10 23:23:01 +00001170static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00001171posix_wait(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001172 PyObject *self;
1173 PyObject *args;
Guido van Rossum21803b81992-08-09 12:55:27 +00001174{
1175 int pid, sts;
Barry Warsaw53699e91996-12-10 23:23:01 +00001176 Py_BEGIN_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00001177 pid = wait(&sts);
Barry Warsaw53699e91996-12-10 23:23:01 +00001178 Py_END_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00001179 if (pid == -1)
1180 return posix_error();
1181 else
Barry Warsaw53699e91996-12-10 23:23:01 +00001182 return Py_BuildValue("ii", pid, sts);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001183}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001184#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001185
Barry Warsaw53699e91996-12-10 23:23:01 +00001186static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001187posix_lstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001188 PyObject *self;
1189 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001190{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001191#ifdef HAVE_LSTAT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001192 return posix_do_stat(self, args, lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001193#else /* !HAVE_LSTAT */
1194 return posix_do_stat(self, args, stat);
1195#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001196}
1197
Guido van Rossumb6775db1994-08-01 11:34:53 +00001198#ifdef HAVE_READLINK
Barry Warsaw53699e91996-12-10 23:23:01 +00001199static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001200posix_readlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001201 PyObject *self;
1202 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001203{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001204 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001205 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001206 int n;
Barry Warsaw53699e91996-12-10 23:23:01 +00001207 if (!PyArg_Parse(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001208 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001209 Py_BEGIN_ALLOW_THREADS
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001210 n = readlink(path, buf, (int) sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +00001211 Py_END_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001212 if (n < 0)
1213 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001214 return PyString_FromStringAndSize(buf, n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001215}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001216#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001217
Guido van Rossumb6775db1994-08-01 11:34:53 +00001218#ifdef HAVE_SYMLINK
Barry Warsaw53699e91996-12-10 23:23:01 +00001219static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001220posix_symlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001221 PyObject *self;
1222 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001223{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001224 return posix_2str(args, symlink);
1225}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001226#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001227
Guido van Rossumb6775db1994-08-01 11:34:53 +00001228#ifdef HAVE_TIMES
1229#ifndef HZ
1230#define HZ 60 /* Universal constant :-) */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001231#endif /* HZ */
Barry Warsaw53699e91996-12-10 23:23:01 +00001232static PyObject *
Guido van Rossum22db57e1992-04-05 14:25:30 +00001233posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001234 PyObject *self;
1235 PyObject *args;
Guido van Rossum22db57e1992-04-05 14:25:30 +00001236{
1237 struct tms t;
1238 clock_t c;
Barry Warsaw53699e91996-12-10 23:23:01 +00001239 if (!PyArg_NoArgs(args))
Guido van Rossum22db57e1992-04-05 14:25:30 +00001240 return NULL;
1241 errno = 0;
1242 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00001243 if (c == (clock_t) -1)
1244 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001245 return Py_BuildValue("ddddd",
Barry Warsaw43d68b81996-12-19 22:10:44 +00001246 (double)t.tms_utime / HZ,
1247 (double)t.tms_stime / HZ,
1248 (double)t.tms_cutime / HZ,
1249 (double)t.tms_cstime / HZ,
1250 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00001251}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001252#endif /* HAVE_TIMES */
Guido van Rossum87755a21996-09-07 00:59:43 +00001253#ifdef MS_WIN32
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001254#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00001255static PyObject *
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001256posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001257 PyObject *self;
1258 PyObject *args;
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001259{
1260 FILETIME create, exit, kernel, user;
1261 HANDLE hProc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001262 if (!PyArg_NoArgs(args))
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001263 return NULL;
1264 hProc = GetCurrentProcess();
1265 GetProcessTimes(hProc,&create, &exit, &kernel, &user);
Barry Warsaw53699e91996-12-10 23:23:01 +00001266 return Py_BuildValue(
1267 "ddddd",
1268 (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime)/2E6,
1269 (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6,
1270 (double)0,
1271 (double)0,
1272 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001273}
Guido van Rossum8d665e61996-06-26 18:22:49 +00001274#endif /* MS_WIN32 */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001275
Guido van Rossumb6775db1994-08-01 11:34:53 +00001276#ifdef HAVE_SETSID
Barry Warsaw53699e91996-12-10 23:23:01 +00001277static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001278posix_setsid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001279 PyObject *self;
1280 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001281{
Barry Warsaw53699e91996-12-10 23:23:01 +00001282 if (!PyArg_NoArgs(args))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001283 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001284 if (setsid() < 0)
1285 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001286 Py_INCREF(Py_None);
1287 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001288}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001289#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001290
Guido van Rossumb6775db1994-08-01 11:34:53 +00001291#ifdef HAVE_SETPGID
Barry Warsaw53699e91996-12-10 23:23:01 +00001292static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001293posix_setpgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001294 PyObject *self;
1295 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001296{
1297 int pid, pgrp;
Barry Warsaw53699e91996-12-10 23:23:01 +00001298 if (!PyArg_Parse(args, "(ii)", &pid, &pgrp))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001299 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001300 if (setpgid(pid, pgrp) < 0)
1301 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001302 Py_INCREF(Py_None);
1303 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001304}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001305#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001306
Guido van Rossumb6775db1994-08-01 11:34:53 +00001307#ifdef HAVE_TCGETPGRP
Barry Warsaw53699e91996-12-10 23:23:01 +00001308static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00001309posix_tcgetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001310 PyObject *self;
1311 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001312{
1313 int fd, pgid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001314 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum7066dd71992-09-17 17:54:56 +00001315 return NULL;
1316 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001317 if (pgid < 0)
1318 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001319 return PyInt_FromLong((long)pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00001320}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001321#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00001322
Guido van Rossumb6775db1994-08-01 11:34:53 +00001323#ifdef HAVE_TCSETPGRP
Barry Warsaw53699e91996-12-10 23:23:01 +00001324static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00001325posix_tcsetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001326 PyObject *self;
1327 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001328{
1329 int fd, pgid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001330 if (!PyArg_Parse(args, "(ii)", &fd, &pgid))
Guido van Rossum7066dd71992-09-17 17:54:56 +00001331 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001332 if (tcsetpgrp(fd, pgid) < 0)
1333 return posix_error();
Barry Warsaw43d68b81996-12-19 22:10:44 +00001334 Py_INCREF(Py_None);
Barry Warsaw53699e91996-12-10 23:23:01 +00001335 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001336}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001337#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001338
Guido van Rossum687dd131993-05-17 08:34:16 +00001339/* Functions acting on file descriptors */
1340
Barry Warsaw53699e91996-12-10 23:23:01 +00001341static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001342posix_open(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001343 PyObject *self;
1344 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001345{
1346 char *file;
1347 int flag;
1348 int mode = 0777;
1349 int fd;
Barry Warsaw43d68b81996-12-19 22:10:44 +00001350 if (!PyArg_ParseTuple(args, "si|i", &file, &flag, &mode))
1351 return NULL;
1352
Barry Warsaw53699e91996-12-10 23:23:01 +00001353 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001354 fd = open(file, flag, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001355 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001356 if (fd < 0)
1357 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001358 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001359}
1360
Barry Warsaw53699e91996-12-10 23:23:01 +00001361static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001362posix_close(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001363 PyObject *self;
1364 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001365{
1366 int fd, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001367 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00001368 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001369 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001370 res = close(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00001371 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001372 if (res < 0)
1373 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001374 Py_INCREF(Py_None);
1375 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00001376}
1377
Barry Warsaw53699e91996-12-10 23:23:01 +00001378static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001379posix_dup(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001380 PyObject *self;
1381 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001382{
1383 int fd;
Barry Warsaw53699e91996-12-10 23:23:01 +00001384 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00001385 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001386 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001387 fd = dup(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00001388 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001389 if (fd < 0)
1390 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001391 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001392}
1393
Barry Warsaw53699e91996-12-10 23:23:01 +00001394static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001395posix_dup2(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001396 PyObject *self;
1397 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001398{
1399 int fd, fd2, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001400 if (!PyArg_Parse(args, "(ii)", &fd, &fd2))
Guido van Rossum687dd131993-05-17 08:34:16 +00001401 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001402 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001403 res = dup2(fd, fd2);
Barry Warsaw53699e91996-12-10 23:23:01 +00001404 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001405 if (res < 0)
1406 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001407 Py_INCREF(Py_None);
1408 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00001409}
1410
Barry Warsaw53699e91996-12-10 23:23:01 +00001411static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001412posix_lseek(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001413 PyObject *self;
1414 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001415{
1416 int fd, how;
1417 long pos, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001418 if (!PyArg_Parse(args, "(ili)", &fd, &pos, &how))
Guido van Rossum687dd131993-05-17 08:34:16 +00001419 return NULL;
1420#ifdef SEEK_SET
1421 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
1422 switch (how) {
1423 case 0: how = SEEK_SET; break;
1424 case 1: how = SEEK_CUR; break;
1425 case 2: how = SEEK_END; break;
1426 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001427#endif /* SEEK_END */
Barry Warsaw53699e91996-12-10 23:23:01 +00001428 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001429 res = lseek(fd, pos, how);
Barry Warsaw53699e91996-12-10 23:23:01 +00001430 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001431 if (res < 0)
1432 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001433 return PyInt_FromLong(res);
Guido van Rossum687dd131993-05-17 08:34:16 +00001434}
1435
Barry Warsaw53699e91996-12-10 23:23:01 +00001436static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001437posix_read(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001438 PyObject *self;
1439 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001440{
Guido van Rossum8bac5461996-06-11 18:38:48 +00001441 int fd, size, n;
Barry Warsaw53699e91996-12-10 23:23:01 +00001442 PyObject *buffer;
1443 if (!PyArg_Parse(args, "(ii)", &fd, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00001444 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001445 buffer = PyString_FromStringAndSize((char *)NULL, size);
Guido van Rossum687dd131993-05-17 08:34:16 +00001446 if (buffer == NULL)
1447 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001448 Py_BEGIN_ALLOW_THREADS
1449 n = read(fd, PyString_AsString(buffer), size);
1450 Py_END_ALLOW_THREADS
Guido van Rossum8bac5461996-06-11 18:38:48 +00001451 if (n < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001452 Py_DECREF(buffer);
Guido van Rossum687dd131993-05-17 08:34:16 +00001453 return posix_error();
1454 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00001455 if (n != size)
Barry Warsaw53699e91996-12-10 23:23:01 +00001456 _PyString_Resize(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00001457 return buffer;
1458}
1459
Barry Warsaw53699e91996-12-10 23:23:01 +00001460static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001461posix_write(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001462 PyObject *self;
1463 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001464{
1465 int fd, size;
1466 char *buffer;
Barry Warsaw53699e91996-12-10 23:23:01 +00001467 if (!PyArg_Parse(args, "(is#)", &fd, &buffer, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00001468 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001469 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001470 size = write(fd, buffer, size);
Barry Warsaw53699e91996-12-10 23:23:01 +00001471 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001472 if (size < 0)
1473 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001474 return PyInt_FromLong((long)size);
Guido van Rossum687dd131993-05-17 08:34:16 +00001475}
1476
Barry Warsaw53699e91996-12-10 23:23:01 +00001477static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001478posix_fstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001479 PyObject *self;
1480 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001481{
1482 int fd;
1483 struct stat st;
1484 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001485 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00001486 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001487 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001488 res = fstat(fd, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00001489 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001490 if (res != 0)
1491 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001492 return Py_BuildValue("(llllllllll)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00001493 (long)st.st_mode,
1494 (long)st.st_ino,
1495 (long)st.st_dev,
1496 (long)st.st_nlink,
1497 (long)st.st_uid,
1498 (long)st.st_gid,
1499 (long)st.st_size,
1500 (long)st.st_atime,
1501 (long)st.st_mtime,
1502 (long)st.st_ctime);
Guido van Rossum687dd131993-05-17 08:34:16 +00001503}
1504
Barry Warsaw53699e91996-12-10 23:23:01 +00001505static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001506posix_fdopen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001507 PyObject *self;
1508 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001509{
Barry Warsaw53699e91996-12-10 23:23:01 +00001510 extern int fclose Py_PROTO((FILE *));
Guido van Rossum687dd131993-05-17 08:34:16 +00001511 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001512 char *mode = "r";
1513 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00001514 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00001515 PyObject *f;
1516 if (!PyArg_ParseTuple(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00001517 return NULL;
Barry Warsaw43d68b81996-12-19 22:10:44 +00001518
Barry Warsaw53699e91996-12-10 23:23:01 +00001519 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001520 fp = fdopen(fd, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001521 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001522 if (fp == NULL)
1523 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001524 f = PyFile_FromFile(fp, "(fdopen)", mode, fclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001525 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00001526 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001527 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00001528}
1529
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001530#ifdef HAVE_PIPE
Barry Warsaw53699e91996-12-10 23:23:01 +00001531static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001532posix_pipe(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001533 PyObject *self;
1534 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001535{
Guido van Rossum8d665e61996-06-26 18:22:49 +00001536#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00001537 int fds[2];
1538 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001539 if (!PyArg_Parse(args, ""))
Guido van Rossum687dd131993-05-17 08:34:16 +00001540 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001541 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001542 res = pipe(fds);
Barry Warsaw53699e91996-12-10 23:23:01 +00001543 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001544 if (res != 0)
1545 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001546 return Py_BuildValue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00001547#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00001548 HANDLE read, write;
1549 BOOL ok;
Barry Warsaw53699e91996-12-10 23:23:01 +00001550 if (!PyArg_Parse(args, ""))
Guido van Rossum794d8131994-08-23 13:48:48 +00001551 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001552 Py_BEGIN_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00001553 ok = CreatePipe( &read, &write, NULL, 0);
Barry Warsaw53699e91996-12-10 23:23:01 +00001554 Py_END_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00001555 if (!ok)
1556 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001557 return Py_BuildValue("(ii)", read, write);
Guido van Rossum8d665e61996-06-26 18:22:49 +00001558#endif /* MS_WIN32 */
Guido van Rossum687dd131993-05-17 08:34:16 +00001559}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001560#endif /* HAVE_PIPE */
1561
1562#ifdef HAVE_MKFIFO
Barry Warsaw53699e91996-12-10 23:23:01 +00001563static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001564posix_mkfifo(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001565 PyObject *self;
1566 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001567{
1568 char *file;
1569 int mode = 0666;
1570 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001571 if (!PyArg_ParseTuple(args, "s|i", &file, &mode))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001572 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001573 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001574 res = mkfifo(file, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001575 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001576 if (res < 0)
1577 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001578 Py_INCREF(Py_None);
1579 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001580}
1581#endif
1582
1583#ifdef HAVE_FTRUNCATE
Barry Warsaw53699e91996-12-10 23:23:01 +00001584static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001585posix_ftruncate(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001586 PyObject *self; /* Not used */
1587 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001588{
1589 int fd;
1590 long length;
1591 int res;
1592
Barry Warsaw53699e91996-12-10 23:23:01 +00001593 if (!PyArg_Parse(args, "(il)", &fd, &length))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001594 return NULL;
1595
Barry Warsaw53699e91996-12-10 23:23:01 +00001596 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001597 res = ftruncate(fd, length);
Barry Warsaw53699e91996-12-10 23:23:01 +00001598 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001599 if (res < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001600 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001601 return NULL;
1602 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001603 Py_INCREF(Py_None);
1604 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001605}
1606#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00001607
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001608#ifdef HAVE_PUTENV
Barry Warsaw53699e91996-12-10 23:23:01 +00001609static PyObject *
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001610posix_putenv(self,args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001611 PyObject *self;
1612 PyObject *args;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001613{
1614 char *s1, *s2;
1615 char *new;
1616
Barry Warsaw53699e91996-12-10 23:23:01 +00001617 if (!PyArg_ParseTuple(args, "ss", &s1, &s2))
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001618 return NULL;
1619 /* XXX This leaks memory -- not easy to fix :-( */
1620 if ((new = malloc(strlen(s1) + strlen(s2) + 2)) == NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00001621 return PyErr_NoMemory();
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001622 (void) sprintf(new, "%s=%s", s1, s2);
1623 if (putenv(new)) {
1624 posix_error();
1625 return NULL;
1626 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001627 Py_INCREF(Py_None);
1628 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001629}
1630#endif
1631
Barry Warsaw53699e91996-12-10 23:23:01 +00001632static PyMethodDef posix_methods[] = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001633 {"chdir", posix_chdir},
1634 {"chmod", posix_chmod},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001635#ifdef HAVE_CHOWN
1636 {"chown", posix_chown},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001637#endif /* HAVE_CHOWN */
Guido van Rossum36bc6801995-06-14 22:54:23 +00001638#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001639 {"getcwd", posix_getcwd},
Guido van Rossum36bc6801995-06-14 22:54:23 +00001640#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001641#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001642 {"link", posix_link},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001643#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001644 {"listdir", posix_listdir},
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001645 {"lstat", posix_lstat},
Guido van Rossumb0824db1996-02-25 04:50:32 +00001646 {"mkdir", posix_mkdir, 1},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001647#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +00001648 {"nice", posix_nice},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001649#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001650#ifdef HAVE_READLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001651 {"readlink", posix_readlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001652#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001653 {"rename", posix_rename},
1654 {"rmdir", posix_rmdir},
1655 {"stat", posix_stat},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001656#ifdef HAVE_SYMLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001657 {"symlink", posix_symlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001658#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001659#ifdef HAVE_SYSTEM
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001660 {"system", posix_system},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001661#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001662 {"umask", posix_umask},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001663#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001664 {"uname", posix_uname},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001665#endif /* HAVE_UNAME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001666 {"unlink", posix_unlink},
Guido van Rossumf4a59121996-02-13 00:12:56 +00001667 {"remove", posix_unlink},
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001668 {"utime", posix_utime},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001669#ifdef HAVE_TIMES
Guido van Rossum22db57e1992-04-05 14:25:30 +00001670 {"times", posix_times},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001671#endif /* HAVE_TIMES */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001672 {"_exit", posix__exit},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001673#ifdef HAVE_EXECV
Guido van Rossum89b33251993-10-22 14:26:06 +00001674 {"execv", posix_execv},
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001675 {"execve", posix_execve},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001676#endif /* HAVE_EXECV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001677#ifdef HAVE_FORK
Guido van Rossum85e3b011991-06-03 12:42:10 +00001678 {"fork", posix_fork},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001679#endif /* HAVE_FORK */
1680#ifdef HAVE_GETEGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001681 {"getegid", posix_getegid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001682#endif /* HAVE_GETEGID */
1683#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001684 {"geteuid", posix_geteuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001685#endif /* HAVE_GETEUID */
1686#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001687 {"getgid", posix_getgid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001688#endif /* HAVE_GETGID */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001689 {"getpid", posix_getpid},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001690#ifdef HAVE_GETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001691 {"getpgrp", posix_getpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001692#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001693#ifdef HAVE_GETPPID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001694 {"getppid", posix_getppid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001695#endif /* HAVE_GETPPID */
1696#ifdef HAVE_GETUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001697 {"getuid", posix_getuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001698#endif /* HAVE_GETUID */
1699#ifdef HAVE_KILL
Guido van Rossum85e3b011991-06-03 12:42:10 +00001700 {"kill", posix_kill},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001701#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00001702#ifdef HAVE_PLOCK
1703 {"plock", posix_plock},
1704#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001705#ifdef HAVE_POPEN
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001706 {"popen", posix_popen, 1},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001707#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001708#ifdef HAVE_SETUID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001709 {"setuid", posix_setuid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001710#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001711#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001712 {"setgid", posix_setgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001713#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001714#ifdef HAVE_SETPGRP
Guido van Rossumc2670a01992-09-13 20:07:29 +00001715 {"setpgrp", posix_setpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001716#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001717#ifdef HAVE_WAIT
Guido van Rossum85e3b011991-06-03 12:42:10 +00001718 {"wait", posix_wait},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001719#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001720#ifdef HAVE_WAITPID
Guido van Rossum21803b81992-08-09 12:55:27 +00001721 {"waitpid", posix_waitpid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001722#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001723#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001724 {"setsid", posix_setsid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001725#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001726#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001727 {"setpgid", posix_setpgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001728#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001729#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001730 {"tcgetpgrp", posix_tcgetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001731#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001732#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001733 {"tcsetpgrp", posix_tcsetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001734#endif /* HAVE_TCSETPGRP */
Barry Warsaw43d68b81996-12-19 22:10:44 +00001735 {"open", posix_open, 1},
Guido van Rossum687dd131993-05-17 08:34:16 +00001736 {"close", posix_close},
1737 {"dup", posix_dup},
1738 {"dup2", posix_dup2},
1739 {"lseek", posix_lseek},
1740 {"read", posix_read},
1741 {"write", posix_write},
1742 {"fstat", posix_fstat},
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001743 {"fdopen", posix_fdopen, 1},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001744#ifdef HAVE_PIPE
Guido van Rossum687dd131993-05-17 08:34:16 +00001745 {"pipe", posix_pipe},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001746#endif
1747#ifdef HAVE_MKFIFO
1748 {"mkfifo", posix_mkfifo, 1},
1749#endif
1750#ifdef HAVE_FTRUNCATE
1751 {"ftruncate", posix_ftruncate, 1},
1752#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001753#ifdef HAVE_PUTENV
1754 {"putenv", posix_putenv, 1},
1755#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001756 {NULL, NULL} /* Sentinel */
1757};
1758
1759
Barry Warsaw4a342091996-12-19 23:50:02 +00001760static int
1761ins(d, symbol, value)
1762 PyObject* d;
1763 char* symbol;
1764 long value;
1765{
1766 PyObject* v = PyInt_FromLong(value);
1767 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
1768 return -1; /* triggers fatal error */
1769
1770 Py_DECREF(v);
1771 return 0;
1772}
1773
1774static int
1775all_ins(d)
1776 PyObject* d;
1777{
1778#ifdef WNOHANG
1779 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
1780#endif
1781#ifdef O_RDONLY
1782 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
1783#endif
1784#ifdef O_WRONLY
1785 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
1786#endif
1787#ifdef O_RDWR
1788 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
1789#endif
1790#ifdef O_NDELAY
1791 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
1792#endif
1793#ifdef O_NONBLOCK
1794 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
1795#endif
1796#ifdef O_APPEND
1797 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
1798#endif
1799#ifdef O_DSYNC
1800 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
1801#endif
1802#ifdef O_RSYNC
1803 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
1804#endif
1805#ifdef O_SYNC
1806 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
1807#endif
1808#ifdef O_NOCTTY
1809 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
1810#endif
1811#ifdef O_CREAT
1812 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
1813#endif
1814#ifdef O_EXCL
1815 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
1816#endif
1817#ifdef O_TRUNC
1818 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
1819#endif
1820 return 0;
1821}
1822
1823
1824
1825
Guido van Rossuma0e71301996-05-28 22:30:38 +00001826#if defined(_MSC_VER) || defined(__WATCOMC__)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001827void
1828initnt()
1829{
Barry Warsaw53699e91996-12-10 23:23:01 +00001830 PyObject *m, *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001831
Barry Warsaw53699e91996-12-10 23:23:01 +00001832 m = Py_InitModule("nt", posix_methods);
1833 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001834
1835 /* Initialize nt.environ dictionary */
1836 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00001837 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
Barry Warsaw4a342091996-12-19 23:50:02 +00001838 goto finally;
Barry Warsaw53699e91996-12-10 23:23:01 +00001839 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001840
Barry Warsaw4a342091996-12-19 23:50:02 +00001841 if (all_ins(d))
1842 goto finally;
1843
Guido van Rossumb6775db1994-08-01 11:34:53 +00001844 /* Initialize nt.error exception */
Barry Warsaw53699e91996-12-10 23:23:01 +00001845 PosixError = PyString_FromString("nt.error");
Barry Warsaw4a342091996-12-19 23:50:02 +00001846 PyDict_SetItemString(d, "error", PosixError);
1847
1848 if (!PyErr_Occurred())
1849 return;
1850
1851 finally:
1852 Py_FatalError("can't initialize NT posixmodule");
Guido van Rossumb6775db1994-08-01 11:34:53 +00001853}
Guido van Rossum8d665e61996-06-26 18:22:49 +00001854#else /* not a PC port */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001855void
1856initposix()
1857{
Barry Warsaw53699e91996-12-10 23:23:01 +00001858 PyObject *m, *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001859
Barry Warsaw53699e91996-12-10 23:23:01 +00001860 m = Py_InitModule("posix", posix_methods);
1861 d = PyModule_GetDict(m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001862
1863 /* Initialize posix.environ dictionary */
1864 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00001865 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
Barry Warsaw4a342091996-12-19 23:50:02 +00001866 goto finally;
Barry Warsaw53699e91996-12-10 23:23:01 +00001867 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001868
Barry Warsaw4a342091996-12-19 23:50:02 +00001869 if (all_ins(d))
1870 goto finally;
1871
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001872 /* Initialize posix.error exception */
Barry Warsaw53699e91996-12-10 23:23:01 +00001873 PosixError = PyString_FromString("posix.error");
Barry Warsaw4a342091996-12-19 23:50:02 +00001874 PyDict_SetItemString(d, "error", PosixError);
1875
1876 if (!PyErr_Occurred())
1877 return;
1878
1879 finally:
1880 Py_FatalError("can't initialize posix module");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001881}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001882#endif /* !_MSC_VER */