blob: 5ce985fadd740e79086a411632c2c597c396b6c1 [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
Guido van Rossumb9f866c1997-05-22 15:12:39 +0000126#define HAVE_WAITPID
Guido van Rossum36bc6801995-06-14 22:54:23 +0000127/* #undef HAVE_GETCWD */
128#endif
129
130#ifdef HAVE_UNISTD_H
Guido van Rossumad0ee831995-03-01 10:34:45 +0000131/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
132extern int rename();
133extern int pclose();
134extern int lstat();
135extern int symlink();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000136#else /* !HAVE_UNISTD_H */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000137#if defined(__WATCOMC__) || defined(_MSC_VER)
Barry Warsaw53699e91996-12-10 23:23:01 +0000138extern int mkdir Py_PROTO((const char *));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000139#else
Barry Warsaw53699e91996-12-10 23:23:01 +0000140extern int mkdir Py_PROTO((const char *, mode_t));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000141#endif
Barry Warsaw53699e91996-12-10 23:23:01 +0000142extern int chdir Py_PROTO((const char *));
143extern int rmdir Py_PROTO((const char *));
144extern int chmod Py_PROTO((const char *, mode_t));
145extern int chown Py_PROTO((const char *, uid_t, gid_t));
146extern char *getcwd Py_PROTO((char *, int));
147extern char *strerror Py_PROTO((int));
148extern int link Py_PROTO((const char *, const char *));
149extern int rename Py_PROTO((const char *, const char *));
150extern int stat Py_PROTO((const char *, struct stat *));
151extern int unlink Py_PROTO((const char *));
152extern int pclose Py_PROTO((FILE *));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000153#ifdef HAVE_SYMLINK
Barry Warsaw53699e91996-12-10 23:23:01 +0000154extern int symlink Py_PROTO((const char *, const char *));
Guido van Rossuma38a5031995-02-17 15:11:36 +0000155#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000156#ifdef HAVE_LSTAT
Barry Warsaw53699e91996-12-10 23:23:01 +0000157extern int lstat Py_PROTO((const char *, struct stat *));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000158#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000159#endif /* !HAVE_UNISTD_H */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000160
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000161#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162
Guido van Rossumb6775db1994-08-01 11:34:53 +0000163#ifdef HAVE_UTIME_H
164#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000165#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000166
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000167#ifdef HAVE_SYS_UTIME_H
168#include <sys/utime.h>
169#define HAVE_UTIME_H /* pretend we do for the rest of this file */
170#endif /* HAVE_SYS_UTIME_H */
171
Guido van Rossumb6775db1994-08-01 11:34:53 +0000172#ifdef HAVE_SYS_TIMES_H
173#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000174#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000175
176#ifdef HAVE_SYS_PARAM_H
177#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000178#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000179
180#ifdef HAVE_SYS_UTSNAME_H
181#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000182#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000183
184#ifndef MAXPATHLEN
185#define MAXPATHLEN 1024
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000186#endif /* MAXPATHLEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000187
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000188#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000189#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000190#define NAMLEN(dirent) strlen((dirent)->d_name)
191#else
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000192#ifdef __WATCOMC__
193#include <direct.h>
194#define NAMLEN(dirent) strlen((dirent)->d_name)
195#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000196#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000197#define NAMLEN(dirent) (dirent)->d_namlen
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000198#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000199#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000200#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000201#endif
202#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000203#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000204#endif
205#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000206#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000207#endif
208#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000209
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000210#ifdef _MSC_VER
Guido van Rossumb6775db1994-08-01 11:34:53 +0000211#include <direct.h>
212#include <io.h>
213#include <process.h>
214#include <windows.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000215#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000216#define popen _popen
Guido van Rossum794d8131994-08-23 13:48:48 +0000217#define pclose _pclose
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000218#else /* 16-bit Windows */
219#include <dos.h>
220#include <ctype.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000221#endif /* MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000222#endif /* _MSC_VER */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000223
224#ifdef OS2
225#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000226#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000227
228/* Return a dictionary corresponding to the POSIX environment table */
229
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000230#if !defined(_MSC_VER) && !defined(__WATCOMC__)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000232#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000233
Barry Warsaw53699e91996-12-10 23:23:01 +0000234static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235convertenviron()
236{
Barry Warsaw53699e91996-12-10 23:23:01 +0000237 PyObject *d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000238 char **e;
Barry Warsaw53699e91996-12-10 23:23:01 +0000239 d = PyDict_New();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240 if (d == NULL)
241 return NULL;
242 if (environ == NULL)
243 return d;
244 /* XXX This part ignores errors */
245 for (e = environ; *e != NULL; e++) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000246 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247 char *p = strchr(*e, '=');
248 if (p == NULL)
249 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000250 v = PyString_FromString(p+1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251 if (v == NULL)
252 continue;
253 *p = '\0';
Barry Warsaw53699e91996-12-10 23:23:01 +0000254 (void) PyDict_SetItemString(d, *e, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000255 *p = '=';
Barry Warsaw53699e91996-12-10 23:23:01 +0000256 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257 }
258 return d;
259}
260
261
Barry Warsaw53699e91996-12-10 23:23:01 +0000262static PyObject *PosixError; /* Exception posix.error */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263
264/* Set a POSIX-specific error from errno, and return NULL */
265
Barry Warsaw53699e91996-12-10 23:23:01 +0000266static PyObject * posix_error()
Guido van Rossumad0ee831995-03-01 10:34:45 +0000267{
Barry Warsaw53699e91996-12-10 23:23:01 +0000268 return PyErr_SetFromErrno(PosixError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000269}
270
271
272/* POSIX generic methods */
273
Barry Warsaw53699e91996-12-10 23:23:01 +0000274static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275posix_1str(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000276 PyObject *args;
277 int (*func) Py_FPROTO((const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000278{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000279 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000280 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000281 if (!PyArg_Parse(args, "s", &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000283 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000284 res = (*func)(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000285 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000286 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000288 Py_INCREF(Py_None);
289 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290}
291
Barry Warsaw53699e91996-12-10 23:23:01 +0000292static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000293posix_2str(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000294 PyObject *args;
295 int (*func) Py_FPROTO((const char *, const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000297 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000298 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000299 if (!PyArg_Parse(args, "(ss)", &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000301 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000302 res = (*func)(path1, path2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000303 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000304 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000306 Py_INCREF(Py_None);
307 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308}
309
Barry Warsaw53699e91996-12-10 23:23:01 +0000310static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311posix_strint(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000312 PyObject *args;
313 int (*func) Py_FPROTO((const char *, int));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000315 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000317 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000318 if (!PyArg_Parse(args, "(si)", &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000320 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000321 res = (*func)(path, i);
Barry Warsaw53699e91996-12-10 23:23:01 +0000322 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000323 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000325 Py_INCREF(Py_None);
326 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000327}
328
Barry Warsaw53699e91996-12-10 23:23:01 +0000329static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000330posix_strintint(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000331 PyObject *args;
332 int (*func) Py_FPROTO((const char *, int, int));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000333{
334 char *path;
335 int i,i2;
336 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000337 if (!PyArg_Parse(args, "(sii)", &path, &i, &i2))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000338 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000339 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000340 res = (*func)(path, i, i2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000341 Py_END_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000342 if (res < 0)
343 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000344 Py_INCREF(Py_None);
345 return Py_None;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000346}
347
Barry Warsaw53699e91996-12-10 23:23:01 +0000348static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349posix_do_stat(self, args, statfunc)
Barry Warsaw53699e91996-12-10 23:23:01 +0000350 PyObject *self;
351 PyObject *args;
352 int (*statfunc) Py_FPROTO((const char *, struct stat *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353{
354 struct stat st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000355 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000356 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000357 if (!PyArg_Parse(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000359 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000360 res = (*statfunc)(path, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +0000361 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000362 if (res != 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000363 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000364 return Py_BuildValue("(llllllllll)",
Guido van Rossume5372401993-03-16 12:15:04 +0000365 (long)st.st_mode,
366 (long)st.st_ino,
367 (long)st.st_dev,
368 (long)st.st_nlink,
369 (long)st.st_uid,
370 (long)st.st_gid,
371 (long)st.st_size,
372 (long)st.st_atime,
373 (long)st.st_mtime,
374 (long)st.st_ctime);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375}
376
377
378/* POSIX methods */
379
Barry Warsaw53699e91996-12-10 23:23:01 +0000380static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000381posix_chdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000382 PyObject *self;
383 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 return posix_1str(args, chdir);
386}
387
Barry Warsaw53699e91996-12-10 23:23:01 +0000388static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389posix_chmod(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000390 PyObject *self;
391 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000393 return posix_strint(args, chmod);
394}
395
Guido van Rossumb6775db1994-08-01 11:34:53 +0000396#ifdef HAVE_CHOWN
Barry Warsaw53699e91996-12-10 23:23:01 +0000397static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000398posix_chown(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000399 PyObject *self;
400 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000401{
402 return posix_strintint(args, chown);
403}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000404#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000405
Guido van Rossum36bc6801995-06-14 22:54:23 +0000406#ifdef HAVE_GETCWD
Barry Warsaw53699e91996-12-10 23:23:01 +0000407static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000408posix_getcwd(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000409 PyObject *self;
410 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411{
412 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000413 char *res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000414 if (!PyArg_NoArgs(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000416 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000417 res = getcwd(buf, sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +0000418 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000419 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000421 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000423#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424
Guido van Rossumb6775db1994-08-01 11:34:53 +0000425#ifdef HAVE_LINK
Barry Warsaw53699e91996-12-10 23:23:01 +0000426static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427posix_link(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000428 PyObject *self;
429 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431 return posix_2str(args, link);
432}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000433#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434
Barry Warsaw53699e91996-12-10 23:23:01 +0000435static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000436posix_listdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000437 PyObject *self;
438 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000439{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000440#if defined(MS_WIN32) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000441
Guido van Rossumb6775db1994-08-01 11:34:53 +0000442 char *name;
443 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000444 PyObject *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000445 HANDLE hFindFile;
446 WIN32_FIND_DATA FileData;
447 char namebuf[MAX_PATH+5];
448
Barry Warsaw53699e91996-12-10 23:23:01 +0000449 if (!PyArg_Parse(args, "s#", &name, &len))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000450 return NULL;
451 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000452 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000453 return NULL;
454 }
455 strcpy(namebuf, name);
456 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
457 namebuf[len++] = '/';
458 strcpy(namebuf + len, "*.*");
459
Barry Warsaw53699e91996-12-10 23:23:01 +0000460 if ((d = PyList_New(0)) == NULL)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000461 return NULL;
462
463 hFindFile = FindFirstFile(namebuf, &FileData);
464 if (hFindFile == INVALID_HANDLE_VALUE) {
465 errno = GetLastError();
466 return posix_error();
467 }
468 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000469 if (FileData.cFileName[0] == '.' &&
470 (FileData.cFileName[1] == '\0' ||
471 FileData.cFileName[1] == '.' &&
472 FileData.cFileName[2] == '\0'))
473 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000474 v = PyString_FromString(FileData.cFileName);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000475 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000476 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000477 d = NULL;
478 break;
479 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000480 if (PyList_Append(d, v) != 0) {
481 Py_DECREF(v);
482 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000483 d = NULL;
484 break;
485 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000486 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000487 } while (FindNextFile(hFindFile, &FileData) == TRUE);
488
489 if (FindClose(hFindFile) == FALSE) {
490 errno = GetLastError();
491 return posix_error();
492 }
493
494 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000495
Guido van Rossum8d665e61996-06-26 18:22:49 +0000496#else /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000497#ifdef _MSC_VER /* 16-bit Windows */
498
499#ifndef MAX_PATH
500#define MAX_PATH 250
501#endif
502 char *name, *pt;
503 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000504 PyObject *d, *v;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000505 char namebuf[MAX_PATH+5];
506 struct _find_t ep;
507
Barry Warsaw53699e91996-12-10 23:23:01 +0000508 if (!PyArg_Parse(args, "s#", &name, &len))
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000509 return NULL;
510 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000511 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000512 return NULL;
513 }
514 strcpy(namebuf, name);
515 for (pt = namebuf; *pt; pt++)
516 if (*pt == '/')
517 *pt = '\\';
518 if (namebuf[len-1] != '\\')
519 namebuf[len++] = '\\';
520 strcpy(namebuf + len, "*.*");
521
Barry Warsaw53699e91996-12-10 23:23:01 +0000522 if ((d = PyList_New(0)) == NULL)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000523 return NULL;
524
525 if (_dos_findfirst(namebuf, _A_RDONLY |
Barry Warsaw43d68b81996-12-19 22:10:44 +0000526 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0)
527 {
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000528 errno = ENOENT;
529 return posix_error();
530 }
531 do {
532 if (ep.name[0] == '.' &&
533 (ep.name[1] == '\0' ||
534 ep.name[1] == '.' &&
535 ep.name[2] == '\0'))
536 continue;
537 strcpy(namebuf, ep.name);
538 for (pt = namebuf; *pt; pt++)
539 if (isupper(*pt))
540 *pt = tolower(*pt);
Barry Warsaw53699e91996-12-10 23:23:01 +0000541 v = PyString_FromString(namebuf);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000542 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000543 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000544 d = NULL;
545 break;
546 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000547 if (PyList_Append(d, v) != 0) {
548 Py_DECREF(v);
549 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000550 d = NULL;
551 break;
552 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000553 Py_DECREF(v);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000554 } while (_dos_findnext(&ep) == 0);
555
556 return d;
557
558#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000559
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000560 char *name;
Barry Warsaw53699e91996-12-10 23:23:01 +0000561 PyObject *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000562 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000563 struct dirent *ep;
Barry Warsaw53699e91996-12-10 23:23:01 +0000564 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000566 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000567 if ((dirp = opendir(name)) == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000568 Py_BLOCK_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000569 return posix_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000570 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000571 if ((d = PyList_New(0)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000572 closedir(dirp);
Barry Warsaw53699e91996-12-10 23:23:01 +0000573 Py_BLOCK_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000574 return NULL;
575 }
576 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000577 if (ep->d_name[0] == '.' &&
578 (NAMLEN(ep) == 1 ||
Guido van Rossuma376cc51996-12-05 23:43:35 +0000579 (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000580 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000581 v = PyString_FromStringAndSize(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000582 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000583 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000584 d = NULL;
585 break;
586 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000587 if (PyList_Append(d, v) != 0) {
588 Py_DECREF(v);
589 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000590 d = NULL;
591 break;
592 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000593 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000594 }
595 closedir(dirp);
Barry Warsaw53699e91996-12-10 23:23:01 +0000596 Py_END_ALLOW_THREADS
Guido van Rossum0ee42cd1991-04-08 21:01:03 +0000597
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000598 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000599
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000600#endif /* !_MSC_VER */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000601#endif /* !MS_WIN32 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000602}
603
Barry Warsaw53699e91996-12-10 23:23:01 +0000604static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000605posix_mkdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000606 PyObject *self;
607 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000608{
Guido van Rossumb0824db1996-02-25 04:50:32 +0000609 int res;
610 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000611 int mode = 0777;
Barry Warsaw53699e91996-12-10 23:23:01 +0000612 if (!PyArg_ParseTuple(args, "s|i", &path, &mode))
Guido van Rossumb0824db1996-02-25 04:50:32 +0000613 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000614 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8d665e61996-06-26 18:22:49 +0000615#if defined(__WATCOMC__) || defined(_MSC_VER)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000616 res = mkdir(path);
617#else
Guido van Rossumb0824db1996-02-25 04:50:32 +0000618 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000619#endif
Barry Warsaw53699e91996-12-10 23:23:01 +0000620 Py_END_ALLOW_THREADS
Guido van Rossumb0824db1996-02-25 04:50:32 +0000621 if (res < 0)
622 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000623 Py_INCREF(Py_None);
624 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000625}
626
Guido van Rossumb6775db1994-08-01 11:34:53 +0000627#ifdef HAVE_NICE
Barry Warsaw53699e91996-12-10 23:23:01 +0000628static PyObject *
Guido van Rossum775f4da1993-01-09 17:18:52 +0000629posix_nice(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000630 PyObject *self;
631 PyObject *args;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000632{
633 int increment, value;
634
Barry Warsaw53699e91996-12-10 23:23:01 +0000635 if (!PyArg_Parse(args, "i", &increment))
Guido van Rossum775f4da1993-01-09 17:18:52 +0000636 return NULL;
637 value = nice(increment);
638 if (value == -1)
639 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000640 return PyInt_FromLong((long) value);
Guido van Rossum775f4da1993-01-09 17:18:52 +0000641}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000642#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000643
Barry Warsaw53699e91996-12-10 23:23:01 +0000644static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000645posix_rename(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000646 PyObject *self;
647 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000648{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000649 return posix_2str(args, rename);
650}
651
Barry Warsaw53699e91996-12-10 23:23:01 +0000652static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000653posix_rmdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000654 PyObject *self;
655 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000656{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000657 return posix_1str(args, rmdir);
658}
659
Barry Warsaw53699e91996-12-10 23:23:01 +0000660static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000661posix_stat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000662 PyObject *self;
663 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000664{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000665 return posix_do_stat(self, args, stat);
666}
667
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000668#ifdef HAVE_SYSTEM
Barry Warsaw53699e91996-12-10 23:23:01 +0000669static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000670posix_system(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000671 PyObject *self;
672 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000673{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000674 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000675 long sts;
Barry Warsaw53699e91996-12-10 23:23:01 +0000676 if (!PyArg_Parse(args, "s", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000677 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000678 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000679 sts = system(command);
Barry Warsaw53699e91996-12-10 23:23:01 +0000680 Py_END_ALLOW_THREADS
681 return PyInt_FromLong(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000682}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000683#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000684
Barry Warsaw53699e91996-12-10 23:23:01 +0000685static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000686posix_umask(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000687 PyObject *self;
688 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000689{
690 int i;
Barry Warsaw53699e91996-12-10 23:23:01 +0000691 if (!PyArg_Parse(args, "i", &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000692 return NULL;
693 i = umask(i);
694 if (i < 0)
695 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000696 return PyInt_FromLong((long)i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000697}
698
Barry Warsaw53699e91996-12-10 23:23:01 +0000699static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000700posix_unlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000701 PyObject *self;
702 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000703{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000704 return posix_1str(args, unlink);
705}
706
Guido van Rossumb6775db1994-08-01 11:34:53 +0000707#ifdef HAVE_UNAME
Barry Warsaw53699e91996-12-10 23:23:01 +0000708static PyObject *
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000709posix_uname(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000710 PyObject *self;
711 PyObject *args;
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000712{
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000713 struct utsname u;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000714 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000715 if (!PyArg_NoArgs(args))
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000716 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000717 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000718 res = uname(&u);
Barry Warsaw53699e91996-12-10 23:23:01 +0000719 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000720 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000721 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000722 return Py_BuildValue("(sssss)",
Barry Warsaw43d68b81996-12-19 22:10:44 +0000723 u.sysname,
724 u.nodename,
725 u.release,
726 u.version,
727 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000728}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000729#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000730
Barry Warsaw53699e91996-12-10 23:23:01 +0000731static PyObject *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000732posix_utime(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000733 PyObject *self;
734 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000735{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000736 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000737 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000738 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000739
Guido van Rossumb6775db1994-08-01 11:34:53 +0000740#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000741 struct utimbuf buf;
742#define ATIME buf.actime
743#define MTIME buf.modtime
744#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000745#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000746 time_t buf[2];
747#define ATIME buf[0]
748#define MTIME buf[1]
749#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000750#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000751
Barry Warsaw53699e91996-12-10 23:23:01 +0000752 if (!PyArg_Parse(args, "(s(ll))", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000753 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000754 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +0000755 MTIME = mtime;
Barry Warsaw53699e91996-12-10 23:23:01 +0000756 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000757 res = utime(path, UTIME_ARG);
Barry Warsaw53699e91996-12-10 23:23:01 +0000758 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000759 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000760 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000761 Py_INCREF(Py_None);
762 return Py_None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000763#undef UTIME_ARG
764#undef ATIME
765#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000766}
767
Guido van Rossum85e3b011991-06-03 12:42:10 +0000768
Guido van Rossum3b066191991-06-04 19:40:25 +0000769/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000770
Barry Warsaw53699e91996-12-10 23:23:01 +0000771static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000772posix__exit(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000773 PyObject *self;
774 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000775{
776 int sts;
Barry Warsaw53699e91996-12-10 23:23:01 +0000777 if (!PyArg_Parse(args, "i", &sts))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000778 return NULL;
779 _exit(sts);
Guido van Rossuma376cc51996-12-05 23:43:35 +0000780 return NULL; /* Make gcc -Wall happy */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000781}
782
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000783#ifdef HAVE_EXECV
Barry Warsaw53699e91996-12-10 23:23:01 +0000784static PyObject *
Guido van Rossum89b33251993-10-22 14:26:06 +0000785posix_execv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000786 PyObject *self;
787 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000788{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000789 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +0000790 PyObject *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000791 char **argvlist;
792 int i, argc;
Barry Warsaw53699e91996-12-10 23:23:01 +0000793 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossum85e3b011991-06-03 12:42:10 +0000794
Guido van Rossum89b33251993-10-22 14:26:06 +0000795 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +0000796 argv is a list or tuple of strings. */
797
Barry Warsaw53699e91996-12-10 23:23:01 +0000798 if (!PyArg_Parse(args, "(sO)", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000799 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000800 if (PyList_Check(argv)) {
801 argc = PyList_Size(argv);
802 getitem = PyList_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000803 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000804 else if (PyTuple_Check(argv)) {
805 argc = PyTuple_Size(argv);
806 getitem = PyTuple_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000807 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000808 else {
809 badarg:
Barry Warsaw53699e91996-12-10 23:23:01 +0000810 PyErr_BadArgument();
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000811 return NULL;
812 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000813
Barry Warsaw53699e91996-12-10 23:23:01 +0000814 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000815 if (argvlist == NULL)
816 return NULL;
817 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000818 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
819 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000820 goto badarg;
821 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000822 }
823 argvlist[argc] = NULL;
824
Guido van Rossumb6775db1994-08-01 11:34:53 +0000825#ifdef BAD_EXEC_PROTOTYPES
826 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000827#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000828 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000829#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000830
Guido van Rossum85e3b011991-06-03 12:42:10 +0000831 /* If we get here it's definitely an error */
832
Barry Warsaw53699e91996-12-10 23:23:01 +0000833 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000834 return posix_error();
835}
836
Barry Warsaw53699e91996-12-10 23:23:01 +0000837static PyObject *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000838posix_execve(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000839 PyObject *self;
840 PyObject *args;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000841{
842 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +0000843 PyObject *argv, *env;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000844 char **argvlist;
845 char **envlist;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +0000846 PyObject *key, *val, *keys=NULL, *vals=NULL;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000847 int i, pos, argc, envc;
Barry Warsaw53699e91996-12-10 23:23:01 +0000848 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000849
850 /* execve has three arguments: (path, argv, env), where
851 argv is a list or tuple of strings and env is a dictionary
852 like posix.environ. */
853
Barry Warsaw53699e91996-12-10 23:23:01 +0000854 if (!PyArg_Parse(args, "(sOO)", &path, &argv, &env))
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000855 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000856 if (PyList_Check(argv)) {
857 argc = PyList_Size(argv);
858 getitem = PyList_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000859 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000860 else if (PyTuple_Check(argv)) {
861 argc = PyTuple_Size(argv);
862 getitem = PyTuple_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000863 }
864 else {
Barry Warsaw53699e91996-12-10 23:23:01 +0000865 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000866 return NULL;
867 }
Barry Warsaw5ed19dc1997-01-29 15:08:24 +0000868 if (!PyMapping_Check(env)) {
869 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000870 return NULL;
871 }
872
Barry Warsaw53699e91996-12-10 23:23:01 +0000873 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000874 if (argvlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000875 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000876 return NULL;
877 }
878 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000879 if (!PyArg_Parse((*getitem)(argv, i),
Barry Warsaw43d68b81996-12-19 22:10:44 +0000880 "s;argv must be list of strings",
881 &argvlist[i]))
882 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000883 goto fail_1;
884 }
885 }
886 argvlist[argc] = NULL;
887
Barry Warsaw5ed19dc1997-01-29 15:08:24 +0000888 i = PyMapping_Length(env);
Barry Warsaw53699e91996-12-10 23:23:01 +0000889 envlist = PyMem_NEW(char *, i + 1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000890 if (envlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000891 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000892 goto fail_1;
893 }
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000894 envc = 0;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +0000895 keys = PyMapping_Keys(env);
896 vals = PyMapping_Values(env);
897 if (!keys || !vals)
898 goto fail_2;
899
900 for (pos = 0; pos < i; pos++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000901 char *p, *k, *v;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +0000902
903 key = PyList_GetItem(keys, pos);
904 val = PyList_GetItem(vals, pos);
905 if (!key || !val)
906 goto fail_2;
907
Barry Warsaw53699e91996-12-10 23:23:01 +0000908 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
Barry Warsaw43d68b81996-12-19 22:10:44 +0000909 !PyArg_Parse(val, "s;non-string value in env", &v))
910 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000911 goto fail_2;
912 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000913 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000914 if (p == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000915 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000916 goto fail_2;
917 }
918 sprintf(p, "%s=%s", k, v);
919 envlist[envc++] = p;
920 }
921 envlist[envc] = 0;
922
Guido van Rossumb6775db1994-08-01 11:34:53 +0000923
924#ifdef BAD_EXEC_PROTOTYPES
925 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000926#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000927 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000928#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000929
930 /* If we get here it's definitely an error */
931
932 (void) posix_error();
933
934 fail_2:
935 while (--envc >= 0)
Barry Warsaw53699e91996-12-10 23:23:01 +0000936 PyMem_DEL(envlist[envc]);
937 PyMem_DEL(envlist);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000938 fail_1:
Barry Warsaw53699e91996-12-10 23:23:01 +0000939 PyMem_DEL(argvlist);
Barry Warsaw5ed19dc1997-01-29 15:08:24 +0000940 Py_XDECREF(vals);
941 Py_XDECREF(keys);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000942 return NULL;
943}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000944#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000945
Guido van Rossumad0ee831995-03-01 10:34:45 +0000946#ifdef HAVE_FORK
Barry Warsaw53699e91996-12-10 23:23:01 +0000947static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000948posix_fork(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000949 PyObject *self;
950 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000951{
952 int pid;
Barry Warsaw53699e91996-12-10 23:23:01 +0000953 if (!PyArg_NoArgs(args))
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000954 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000955 pid = fork();
956 if (pid == -1)
957 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000958 return PyInt_FromLong((long)pid);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000959}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000960#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000961
Guido van Rossumad0ee831995-03-01 10:34:45 +0000962#ifdef HAVE_GETEGID
Barry Warsaw53699e91996-12-10 23:23:01 +0000963static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000964posix_getegid(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)getegid());
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_GETEUID
Barry Warsaw53699e91996-12-10 23:23:01 +0000975static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000976posix_geteuid(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)geteuid());
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
Guido van Rossumad0ee831995-03-01 10:34:45 +0000986#ifdef HAVE_GETGID
Barry Warsaw53699e91996-12-10 23:23:01 +0000987static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000988posix_getgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000989 PyObject *self;
990 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +0000991{
Barry Warsaw53699e91996-12-10 23:23:01 +0000992 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +0000993 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000994 return PyInt_FromLong((long)getgid());
Guido van Rossum46003ff1992-05-15 11:05:24 +0000995}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000996#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000997
Barry Warsaw53699e91996-12-10 23:23:01 +0000998static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000999posix_getpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001000 PyObject *self;
1001 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001002{
Barry Warsaw53699e91996-12-10 23:23:01 +00001003 if (!PyArg_NoArgs(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001004 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001005 return PyInt_FromLong((long)getpid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001006}
1007
Guido van Rossumb6775db1994-08-01 11:34:53 +00001008#ifdef HAVE_GETPGRP
Barry Warsaw53699e91996-12-10 23:23:01 +00001009static PyObject *
Guido van Rossum04814471991-06-04 20:23:49 +00001010posix_getpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001011 PyObject *self;
1012 PyObject *args;
Guido van Rossum04814471991-06-04 20:23:49 +00001013{
Barry Warsaw53699e91996-12-10 23:23:01 +00001014 if (!PyArg_NoArgs(args))
Guido van Rossum04814471991-06-04 20:23:49 +00001015 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001016#ifdef GETPGRP_HAVE_ARG
Barry Warsaw53699e91996-12-10 23:23:01 +00001017 return PyInt_FromLong((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001018#else /* GETPGRP_HAVE_ARG */
Barry Warsaw53699e91996-12-10 23:23:01 +00001019 return PyInt_FromLong((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001020#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001021}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001022#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001023
Guido van Rossumb6775db1994-08-01 11:34:53 +00001024#ifdef HAVE_SETPGRP
Barry Warsaw53699e91996-12-10 23:23:01 +00001025static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001026posix_setpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001027 PyObject *self;
1028 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001029{
Barry Warsaw53699e91996-12-10 23:23:01 +00001030 if (!PyArg_NoArgs(args))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001031 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001032#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001033 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001034#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001035 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001036#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001037 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001038 Py_INCREF(Py_None);
1039 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001040}
1041
Guido van Rossumb6775db1994-08-01 11:34:53 +00001042#endif /* HAVE_SETPGRP */
1043
Guido van Rossumad0ee831995-03-01 10:34:45 +00001044#ifdef HAVE_GETPPID
Barry Warsaw53699e91996-12-10 23:23:01 +00001045static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001046posix_getppid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001047 PyObject *self;
1048 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001049{
Barry Warsaw53699e91996-12-10 23:23:01 +00001050 if (!PyArg_NoArgs(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001051 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001052 return PyInt_FromLong((long)getppid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001053}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001054#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001055
Guido van Rossumad0ee831995-03-01 10:34:45 +00001056#ifdef HAVE_GETUID
Barry Warsaw53699e91996-12-10 23:23:01 +00001057static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001058posix_getuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001059 PyObject *self;
1060 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001061{
Barry Warsaw53699e91996-12-10 23:23:01 +00001062 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001063 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001064 return PyInt_FromLong((long)getuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001065}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001066#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001067
Guido van Rossumad0ee831995-03-01 10:34:45 +00001068#ifdef HAVE_KILL
Barry Warsaw53699e91996-12-10 23:23:01 +00001069static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001070posix_kill(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001071 PyObject *self;
1072 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001073{
1074 int pid, sig;
Barry Warsaw53699e91996-12-10 23:23:01 +00001075 if (!PyArg_Parse(args, "(ii)", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001076 return NULL;
1077 if (kill(pid, sig) == -1)
1078 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001079 Py_INCREF(Py_None);
1080 return Py_None;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001081}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001082#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001083
Guido van Rossumc0125471996-06-28 18:55:32 +00001084#ifdef HAVE_PLOCK
1085
1086#ifdef HAVE_SYS_LOCK_H
1087#include <sys/lock.h>
1088#endif
1089
Barry Warsaw53699e91996-12-10 23:23:01 +00001090static PyObject *
Guido van Rossumc0125471996-06-28 18:55:32 +00001091posix_plock(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001092 PyObject *self;
1093 PyObject *args;
Guido van Rossumc0125471996-06-28 18:55:32 +00001094{
1095 int op;
Barry Warsaw53699e91996-12-10 23:23:01 +00001096 if (!PyArg_Parse(args, "i", &op))
Guido van Rossumc0125471996-06-28 18:55:32 +00001097 return NULL;
1098 if (plock(op) == -1)
1099 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001100 Py_INCREF(Py_None);
1101 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00001102}
1103#endif
1104
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001105#ifdef HAVE_POPEN
Barry Warsaw53699e91996-12-10 23:23:01 +00001106static PyObject *
Guido van Rossum3b066191991-06-04 19:40:25 +00001107posix_popen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001108 PyObject *self;
1109 PyObject *args;
Guido van Rossum3b066191991-06-04 19:40:25 +00001110{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001111 char *name;
1112 char *mode = "r";
1113 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00001114 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00001115 PyObject *f;
1116 if (!PyArg_ParseTuple(args, "s|si", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00001117 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001118 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001119 fp = popen(name, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001120 Py_END_ALLOW_THREADS
Guido van Rossum3b066191991-06-04 19:40:25 +00001121 if (fp == NULL)
1122 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001123 f = PyFile_FromFile(fp, name, mode, pclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001124 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00001125 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001126 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00001127}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001128#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00001129
Guido van Rossumb6775db1994-08-01 11:34:53 +00001130#ifdef HAVE_SETUID
Barry Warsaw53699e91996-12-10 23:23:01 +00001131static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001132posix_setuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001133 PyObject *self;
1134 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001135{
1136 int uid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001137 if (!PyArg_Parse(args, "i", &uid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001138 return NULL;
1139 if (setuid(uid) < 0)
1140 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001141 Py_INCREF(Py_None);
1142 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001143}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001144#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001145
Guido van Rossumb6775db1994-08-01 11:34:53 +00001146#ifdef HAVE_SETGID
Barry Warsaw53699e91996-12-10 23:23:01 +00001147static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001148posix_setgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001149 PyObject *self;
1150 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001151{
1152 int gid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001153 if (!PyArg_Parse(args, "i", &gid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001154 return NULL;
1155 if (setgid(gid) < 0)
1156 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001157 Py_INCREF(Py_None);
1158 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001159}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001160#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001161
Guido van Rossumb6775db1994-08-01 11:34:53 +00001162#ifdef HAVE_WAITPID
Barry Warsaw53699e91996-12-10 23:23:01 +00001163static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00001164posix_waitpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001165 PyObject *self;
1166 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001167{
Guido van Rossumfd03e2b1996-06-19 23:17:02 +00001168 int pid, options, sts = 0;
Barry Warsaw53699e91996-12-10 23:23:01 +00001169 if (!PyArg_Parse(args, "(ii)", &pid, &options))
Guido van Rossum21803b81992-08-09 12:55:27 +00001170 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001171 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb9f866c1997-05-22 15:12:39 +00001172#ifdef NeXT
1173 pid = wait4(pid, (union wait *)&sts, options, NULL);
1174#else
Guido van Rossum21803b81992-08-09 12:55:27 +00001175 pid = waitpid(pid, &sts, options);
Guido van Rossumb9f866c1997-05-22 15:12:39 +00001176#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001177 Py_END_ALLOW_THREADS
Guido van Rossum85e3b011991-06-03 12:42:10 +00001178 if (pid == -1)
1179 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00001180 else
Barry Warsaw53699e91996-12-10 23:23:01 +00001181 return Py_BuildValue("ii", pid, sts);
Guido van Rossum21803b81992-08-09 12:55:27 +00001182}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001183#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00001184
Guido van Rossumad0ee831995-03-01 10:34:45 +00001185#ifdef HAVE_WAIT
Barry Warsaw53699e91996-12-10 23:23:01 +00001186static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00001187posix_wait(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001188 PyObject *self;
1189 PyObject *args;
Guido van Rossum21803b81992-08-09 12:55:27 +00001190{
1191 int pid, sts;
Barry Warsaw53699e91996-12-10 23:23:01 +00001192 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb9f866c1997-05-22 15:12:39 +00001193#ifdef NeXT
1194 pid = wait((union wait *)&sts);
1195#else
Guido van Rossum21803b81992-08-09 12:55:27 +00001196 pid = wait(&sts);
Guido van Rossumb9f866c1997-05-22 15:12:39 +00001197#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001198 Py_END_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00001199 if (pid == -1)
1200 return posix_error();
1201 else
Barry Warsaw53699e91996-12-10 23:23:01 +00001202 return Py_BuildValue("ii", pid, sts);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001203}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001204#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001205
Barry Warsaw53699e91996-12-10 23:23:01 +00001206static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001207posix_lstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001208 PyObject *self;
1209 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001210{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001211#ifdef HAVE_LSTAT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001212 return posix_do_stat(self, args, lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001213#else /* !HAVE_LSTAT */
1214 return posix_do_stat(self, args, stat);
1215#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001216}
1217
Guido van Rossumb6775db1994-08-01 11:34:53 +00001218#ifdef HAVE_READLINK
Barry Warsaw53699e91996-12-10 23:23:01 +00001219static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001220posix_readlink(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 Rossumb6775db1994-08-01 11:34:53 +00001224 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001225 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001226 int n;
Barry Warsaw53699e91996-12-10 23:23:01 +00001227 if (!PyArg_Parse(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001228 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001229 Py_BEGIN_ALLOW_THREADS
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001230 n = readlink(path, buf, (int) sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +00001231 Py_END_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001232 if (n < 0)
1233 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001234 return PyString_FromStringAndSize(buf, n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001235}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001236#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001237
Guido van Rossumb6775db1994-08-01 11:34:53 +00001238#ifdef HAVE_SYMLINK
Barry Warsaw53699e91996-12-10 23:23:01 +00001239static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001240posix_symlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001241 PyObject *self;
1242 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001243{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001244 return posix_2str(args, symlink);
1245}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001246#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001247
Guido van Rossumb6775db1994-08-01 11:34:53 +00001248#ifdef HAVE_TIMES
1249#ifndef HZ
1250#define HZ 60 /* Universal constant :-) */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001251#endif /* HZ */
Barry Warsaw53699e91996-12-10 23:23:01 +00001252static PyObject *
Guido van Rossum22db57e1992-04-05 14:25:30 +00001253posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001254 PyObject *self;
1255 PyObject *args;
Guido van Rossum22db57e1992-04-05 14:25:30 +00001256{
1257 struct tms t;
1258 clock_t c;
Barry Warsaw53699e91996-12-10 23:23:01 +00001259 if (!PyArg_NoArgs(args))
Guido van Rossum22db57e1992-04-05 14:25:30 +00001260 return NULL;
1261 errno = 0;
1262 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00001263 if (c == (clock_t) -1)
1264 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001265 return Py_BuildValue("ddddd",
Barry Warsaw43d68b81996-12-19 22:10:44 +00001266 (double)t.tms_utime / HZ,
1267 (double)t.tms_stime / HZ,
1268 (double)t.tms_cutime / HZ,
1269 (double)t.tms_cstime / HZ,
1270 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00001271}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001272#endif /* HAVE_TIMES */
Guido van Rossum87755a21996-09-07 00:59:43 +00001273#ifdef MS_WIN32
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001274#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00001275static PyObject *
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001276posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001277 PyObject *self;
1278 PyObject *args;
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001279{
1280 FILETIME create, exit, kernel, user;
1281 HANDLE hProc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001282 if (!PyArg_NoArgs(args))
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001283 return NULL;
1284 hProc = GetCurrentProcess();
1285 GetProcessTimes(hProc,&create, &exit, &kernel, &user);
Barry Warsaw53699e91996-12-10 23:23:01 +00001286 return Py_BuildValue(
1287 "ddddd",
1288 (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime)/2E6,
1289 (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6,
1290 (double)0,
1291 (double)0,
1292 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001293}
Guido van Rossum8d665e61996-06-26 18:22:49 +00001294#endif /* MS_WIN32 */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001295
Guido van Rossumb6775db1994-08-01 11:34:53 +00001296#ifdef HAVE_SETSID
Barry Warsaw53699e91996-12-10 23:23:01 +00001297static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001298posix_setsid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001299 PyObject *self;
1300 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001301{
Barry Warsaw53699e91996-12-10 23:23:01 +00001302 if (!PyArg_NoArgs(args))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001303 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001304 if (setsid() < 0)
1305 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001306 Py_INCREF(Py_None);
1307 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001308}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001309#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001310
Guido van Rossumb6775db1994-08-01 11:34:53 +00001311#ifdef HAVE_SETPGID
Barry Warsaw53699e91996-12-10 23:23:01 +00001312static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001313posix_setpgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001314 PyObject *self;
1315 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001316{
1317 int pid, pgrp;
Barry Warsaw53699e91996-12-10 23:23:01 +00001318 if (!PyArg_Parse(args, "(ii)", &pid, &pgrp))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001319 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001320 if (setpgid(pid, pgrp) < 0)
1321 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001322 Py_INCREF(Py_None);
1323 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001324}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001325#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001326
Guido van Rossumb6775db1994-08-01 11:34:53 +00001327#ifdef HAVE_TCGETPGRP
Barry Warsaw53699e91996-12-10 23:23:01 +00001328static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00001329posix_tcgetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001330 PyObject *self;
1331 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001332{
1333 int fd, pgid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001334 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum7066dd71992-09-17 17:54:56 +00001335 return NULL;
1336 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001337 if (pgid < 0)
1338 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001339 return PyInt_FromLong((long)pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00001340}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001341#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00001342
Guido van Rossumb6775db1994-08-01 11:34:53 +00001343#ifdef HAVE_TCSETPGRP
Barry Warsaw53699e91996-12-10 23:23:01 +00001344static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00001345posix_tcsetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001346 PyObject *self;
1347 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001348{
1349 int fd, pgid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001350 if (!PyArg_Parse(args, "(ii)", &fd, &pgid))
Guido van Rossum7066dd71992-09-17 17:54:56 +00001351 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001352 if (tcsetpgrp(fd, pgid) < 0)
1353 return posix_error();
Barry Warsaw43d68b81996-12-19 22:10:44 +00001354 Py_INCREF(Py_None);
Barry Warsaw53699e91996-12-10 23:23:01 +00001355 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001356}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001357#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001358
Guido van Rossum687dd131993-05-17 08:34:16 +00001359/* Functions acting on file descriptors */
1360
Barry Warsaw53699e91996-12-10 23:23:01 +00001361static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001362posix_open(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 char *file;
1367 int flag;
1368 int mode = 0777;
1369 int fd;
Barry Warsaw43d68b81996-12-19 22:10:44 +00001370 if (!PyArg_ParseTuple(args, "si|i", &file, &flag, &mode))
1371 return NULL;
1372
Barry Warsaw53699e91996-12-10 23:23:01 +00001373 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001374 fd = open(file, flag, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001375 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001376 if (fd < 0)
1377 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001378 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001379}
1380
Barry Warsaw53699e91996-12-10 23:23:01 +00001381static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001382posix_close(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001383 PyObject *self;
1384 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001385{
1386 int fd, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001387 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00001388 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001389 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001390 res = close(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00001391 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001392 if (res < 0)
1393 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001394 Py_INCREF(Py_None);
1395 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00001396}
1397
Barry Warsaw53699e91996-12-10 23:23:01 +00001398static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001399posix_dup(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001400 PyObject *self;
1401 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001402{
1403 int fd;
Barry Warsaw53699e91996-12-10 23:23:01 +00001404 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00001405 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001406 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001407 fd = dup(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00001408 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001409 if (fd < 0)
1410 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001411 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001412}
1413
Barry Warsaw53699e91996-12-10 23:23:01 +00001414static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001415posix_dup2(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001416 PyObject *self;
1417 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001418{
1419 int fd, fd2, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001420 if (!PyArg_Parse(args, "(ii)", &fd, &fd2))
Guido van Rossum687dd131993-05-17 08:34:16 +00001421 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001422 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001423 res = dup2(fd, fd2);
Barry Warsaw53699e91996-12-10 23:23:01 +00001424 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001425 if (res < 0)
1426 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001427 Py_INCREF(Py_None);
1428 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00001429}
1430
Barry Warsaw53699e91996-12-10 23:23:01 +00001431static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001432posix_lseek(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001433 PyObject *self;
1434 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001435{
1436 int fd, how;
1437 long pos, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001438 if (!PyArg_Parse(args, "(ili)", &fd, &pos, &how))
Guido van Rossum687dd131993-05-17 08:34:16 +00001439 return NULL;
1440#ifdef SEEK_SET
1441 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
1442 switch (how) {
1443 case 0: how = SEEK_SET; break;
1444 case 1: how = SEEK_CUR; break;
1445 case 2: how = SEEK_END; break;
1446 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001447#endif /* SEEK_END */
Barry Warsaw53699e91996-12-10 23:23:01 +00001448 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001449 res = lseek(fd, pos, how);
Barry Warsaw53699e91996-12-10 23:23:01 +00001450 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001451 if (res < 0)
1452 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001453 return PyInt_FromLong(res);
Guido van Rossum687dd131993-05-17 08:34:16 +00001454}
1455
Barry Warsaw53699e91996-12-10 23:23:01 +00001456static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001457posix_read(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001458 PyObject *self;
1459 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001460{
Guido van Rossum8bac5461996-06-11 18:38:48 +00001461 int fd, size, n;
Barry Warsaw53699e91996-12-10 23:23:01 +00001462 PyObject *buffer;
1463 if (!PyArg_Parse(args, "(ii)", &fd, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00001464 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001465 buffer = PyString_FromStringAndSize((char *)NULL, size);
Guido van Rossum687dd131993-05-17 08:34:16 +00001466 if (buffer == NULL)
1467 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001468 Py_BEGIN_ALLOW_THREADS
1469 n = read(fd, PyString_AsString(buffer), size);
1470 Py_END_ALLOW_THREADS
Guido van Rossum8bac5461996-06-11 18:38:48 +00001471 if (n < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001472 Py_DECREF(buffer);
Guido van Rossum687dd131993-05-17 08:34:16 +00001473 return posix_error();
1474 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00001475 if (n != size)
Barry Warsaw53699e91996-12-10 23:23:01 +00001476 _PyString_Resize(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00001477 return buffer;
1478}
1479
Barry Warsaw53699e91996-12-10 23:23:01 +00001480static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001481posix_write(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001482 PyObject *self;
1483 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001484{
1485 int fd, size;
1486 char *buffer;
Barry Warsaw53699e91996-12-10 23:23:01 +00001487 if (!PyArg_Parse(args, "(is#)", &fd, &buffer, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00001488 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001489 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001490 size = write(fd, buffer, size);
Barry Warsaw53699e91996-12-10 23:23:01 +00001491 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001492 if (size < 0)
1493 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001494 return PyInt_FromLong((long)size);
Guido van Rossum687dd131993-05-17 08:34:16 +00001495}
1496
Barry Warsaw53699e91996-12-10 23:23:01 +00001497static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001498posix_fstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001499 PyObject *self;
1500 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001501{
1502 int fd;
1503 struct stat st;
1504 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001505 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00001506 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001507 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001508 res = fstat(fd, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00001509 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001510 if (res != 0)
1511 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001512 return Py_BuildValue("(llllllllll)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00001513 (long)st.st_mode,
1514 (long)st.st_ino,
1515 (long)st.st_dev,
1516 (long)st.st_nlink,
1517 (long)st.st_uid,
1518 (long)st.st_gid,
1519 (long)st.st_size,
1520 (long)st.st_atime,
1521 (long)st.st_mtime,
1522 (long)st.st_ctime);
Guido van Rossum687dd131993-05-17 08:34:16 +00001523}
1524
Barry Warsaw53699e91996-12-10 23:23:01 +00001525static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001526posix_fdopen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001527 PyObject *self;
1528 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001529{
Barry Warsaw53699e91996-12-10 23:23:01 +00001530 extern int fclose Py_PROTO((FILE *));
Guido van Rossum687dd131993-05-17 08:34:16 +00001531 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001532 char *mode = "r";
1533 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00001534 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00001535 PyObject *f;
1536 if (!PyArg_ParseTuple(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00001537 return NULL;
Barry Warsaw43d68b81996-12-19 22:10:44 +00001538
Barry Warsaw53699e91996-12-10 23:23:01 +00001539 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001540 fp = fdopen(fd, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001541 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001542 if (fp == NULL)
1543 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001544 f = PyFile_FromFile(fp, "(fdopen)", mode, fclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001545 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00001546 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001547 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00001548}
1549
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001550#ifdef HAVE_PIPE
Barry Warsaw53699e91996-12-10 23:23:01 +00001551static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001552posix_pipe(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001553 PyObject *self;
1554 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001555{
Guido van Rossum8d665e61996-06-26 18:22:49 +00001556#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00001557 int fds[2];
1558 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001559 if (!PyArg_Parse(args, ""))
Guido van Rossum687dd131993-05-17 08:34:16 +00001560 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001561 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001562 res = pipe(fds);
Barry Warsaw53699e91996-12-10 23:23:01 +00001563 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001564 if (res != 0)
1565 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001566 return Py_BuildValue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00001567#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00001568 HANDLE read, write;
1569 BOOL ok;
Barry Warsaw53699e91996-12-10 23:23:01 +00001570 if (!PyArg_Parse(args, ""))
Guido van Rossum794d8131994-08-23 13:48:48 +00001571 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001572 Py_BEGIN_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00001573 ok = CreatePipe( &read, &write, NULL, 0);
Barry Warsaw53699e91996-12-10 23:23:01 +00001574 Py_END_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00001575 if (!ok)
1576 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001577 return Py_BuildValue("(ii)", read, write);
Guido van Rossum8d665e61996-06-26 18:22:49 +00001578#endif /* MS_WIN32 */
Guido van Rossum687dd131993-05-17 08:34:16 +00001579}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001580#endif /* HAVE_PIPE */
1581
1582#ifdef HAVE_MKFIFO
Barry Warsaw53699e91996-12-10 23:23:01 +00001583static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001584posix_mkfifo(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001585 PyObject *self;
1586 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001587{
1588 char *file;
1589 int mode = 0666;
1590 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001591 if (!PyArg_ParseTuple(args, "s|i", &file, &mode))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001592 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001593 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001594 res = mkfifo(file, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001595 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001596 if (res < 0)
1597 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001598 Py_INCREF(Py_None);
1599 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001600}
1601#endif
1602
1603#ifdef HAVE_FTRUNCATE
Barry Warsaw53699e91996-12-10 23:23:01 +00001604static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001605posix_ftruncate(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001606 PyObject *self; /* Not used */
1607 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001608{
1609 int fd;
1610 long length;
1611 int res;
1612
Barry Warsaw53699e91996-12-10 23:23:01 +00001613 if (!PyArg_Parse(args, "(il)", &fd, &length))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001614 return NULL;
1615
Barry Warsaw53699e91996-12-10 23:23:01 +00001616 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001617 res = ftruncate(fd, length);
Barry Warsaw53699e91996-12-10 23:23:01 +00001618 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001619 if (res < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001620 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001621 return NULL;
1622 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001623 Py_INCREF(Py_None);
1624 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001625}
1626#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00001627
Guido van Rossumb9f866c1997-05-22 15:12:39 +00001628#ifdef NeXT
1629#define HAVE_PUTENV
1630/* Steve Spicklemire got this putenv from NeXTAnswers */
1631static int
1632putenv(char *newval)
1633{
1634 extern char **environ;
1635
1636 static int firstTime = 1;
1637 char **ep;
1638 char *cp;
1639 int esiz;
1640 char *np;
1641
1642 if (!(np = strchr(newval, '=')))
1643 return 1;
1644 *np = '\0';
1645
1646 /* look it up */
1647 for (ep=environ ; *ep ; ep++)
1648 {
1649 /* this should always be true... */
1650 if (cp = strchr(*ep, '='))
1651 {
1652 *cp = '\0';
1653 if (!strcmp(*ep, newval))
1654 {
1655 /* got it! */
1656 *cp = '=';
1657 break;
1658 }
1659 *cp = '=';
1660 }
1661 else
1662 {
1663 *np = '=';
1664 return 1;
1665 }
1666 }
1667
1668 *np = '=';
1669 if (*ep)
1670 {
1671 /* the string was already there:
1672 just replace it with the new one */
1673 *ep = newval;
1674 return 0;
1675 }
1676
1677 /* expand environ by one */
1678 for (esiz=2, ep=environ ; *ep ; ep++)
1679 esiz++;
1680 if (firstTime)
1681 {
1682 char **epp;
1683 char **newenv;
1684 if (!(newenv = malloc(esiz * sizeof(char *))))
1685 return 1;
1686
1687 for (ep=environ, epp=newenv ; *ep ;)
1688 *epp++ = *ep++;
1689 *epp++ = newval;
1690 *epp = (char *) 0;
1691 environ = newenv;
1692 }
1693 else
1694 {
1695 if (!(environ = realloc(environ, esiz * sizeof(char *))))
1696 return 1;
1697 environ[esiz - 2] = newval;
1698 environ[esiz - 1] = (char *) 0;
1699 firstTime = 0;
1700 }
1701
1702 return 0;
1703}
1704#endif NeXT
1705
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001706#ifdef HAVE_PUTENV
Barry Warsaw53699e91996-12-10 23:23:01 +00001707static PyObject *
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001708posix_putenv(self,args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001709 PyObject *self;
1710 PyObject *args;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001711{
1712 char *s1, *s2;
1713 char *new;
1714
Barry Warsaw53699e91996-12-10 23:23:01 +00001715 if (!PyArg_ParseTuple(args, "ss", &s1, &s2))
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001716 return NULL;
1717 /* XXX This leaks memory -- not easy to fix :-( */
1718 if ((new = malloc(strlen(s1) + strlen(s2) + 2)) == NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00001719 return PyErr_NoMemory();
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001720 (void) sprintf(new, "%s=%s", s1, s2);
1721 if (putenv(new)) {
1722 posix_error();
1723 return NULL;
1724 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001725 Py_INCREF(Py_None);
1726 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001727}
1728#endif
1729
Barry Warsaw53699e91996-12-10 23:23:01 +00001730static PyMethodDef posix_methods[] = {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001731 {"chdir", posix_chdir},
1732 {"chmod", posix_chmod},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001733#ifdef HAVE_CHOWN
1734 {"chown", posix_chown},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001735#endif /* HAVE_CHOWN */
Guido van Rossum36bc6801995-06-14 22:54:23 +00001736#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001737 {"getcwd", posix_getcwd},
Guido van Rossum36bc6801995-06-14 22:54:23 +00001738#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001739#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001740 {"link", posix_link},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001741#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001742 {"listdir", posix_listdir},
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001743 {"lstat", posix_lstat},
Guido van Rossumb0824db1996-02-25 04:50:32 +00001744 {"mkdir", posix_mkdir, 1},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001745#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +00001746 {"nice", posix_nice},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001747#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001748#ifdef HAVE_READLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001749 {"readlink", posix_readlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001750#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001751 {"rename", posix_rename},
1752 {"rmdir", posix_rmdir},
1753 {"stat", posix_stat},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001754#ifdef HAVE_SYMLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001755 {"symlink", posix_symlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001756#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001757#ifdef HAVE_SYSTEM
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001758 {"system", posix_system},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001759#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001760 {"umask", posix_umask},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001761#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001762 {"uname", posix_uname},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001763#endif /* HAVE_UNAME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001764 {"unlink", posix_unlink},
Guido van Rossumf4a59121996-02-13 00:12:56 +00001765 {"remove", posix_unlink},
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001766 {"utime", posix_utime},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001767#ifdef HAVE_TIMES
Guido van Rossum22db57e1992-04-05 14:25:30 +00001768 {"times", posix_times},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001769#endif /* HAVE_TIMES */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001770 {"_exit", posix__exit},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001771#ifdef HAVE_EXECV
Guido van Rossum89b33251993-10-22 14:26:06 +00001772 {"execv", posix_execv},
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001773 {"execve", posix_execve},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001774#endif /* HAVE_EXECV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001775#ifdef HAVE_FORK
Guido van Rossum85e3b011991-06-03 12:42:10 +00001776 {"fork", posix_fork},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001777#endif /* HAVE_FORK */
1778#ifdef HAVE_GETEGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001779 {"getegid", posix_getegid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001780#endif /* HAVE_GETEGID */
1781#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001782 {"geteuid", posix_geteuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001783#endif /* HAVE_GETEUID */
1784#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001785 {"getgid", posix_getgid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001786#endif /* HAVE_GETGID */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001787 {"getpid", posix_getpid},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001788#ifdef HAVE_GETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001789 {"getpgrp", posix_getpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001790#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001791#ifdef HAVE_GETPPID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001792 {"getppid", posix_getppid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001793#endif /* HAVE_GETPPID */
1794#ifdef HAVE_GETUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001795 {"getuid", posix_getuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001796#endif /* HAVE_GETUID */
1797#ifdef HAVE_KILL
Guido van Rossum85e3b011991-06-03 12:42:10 +00001798 {"kill", posix_kill},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001799#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00001800#ifdef HAVE_PLOCK
1801 {"plock", posix_plock},
1802#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001803#ifdef HAVE_POPEN
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001804 {"popen", posix_popen, 1},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001805#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001806#ifdef HAVE_SETUID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001807 {"setuid", posix_setuid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001808#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001809#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001810 {"setgid", posix_setgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001811#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001812#ifdef HAVE_SETPGRP
Guido van Rossumc2670a01992-09-13 20:07:29 +00001813 {"setpgrp", posix_setpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001814#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001815#ifdef HAVE_WAIT
Guido van Rossum85e3b011991-06-03 12:42:10 +00001816 {"wait", posix_wait},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001817#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001818#ifdef HAVE_WAITPID
Guido van Rossum21803b81992-08-09 12:55:27 +00001819 {"waitpid", posix_waitpid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001820#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001821#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001822 {"setsid", posix_setsid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001823#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001824#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001825 {"setpgid", posix_setpgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001826#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001827#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001828 {"tcgetpgrp", posix_tcgetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001829#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001830#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001831 {"tcsetpgrp", posix_tcsetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001832#endif /* HAVE_TCSETPGRP */
Barry Warsaw43d68b81996-12-19 22:10:44 +00001833 {"open", posix_open, 1},
Guido van Rossum687dd131993-05-17 08:34:16 +00001834 {"close", posix_close},
1835 {"dup", posix_dup},
1836 {"dup2", posix_dup2},
1837 {"lseek", posix_lseek},
1838 {"read", posix_read},
1839 {"write", posix_write},
1840 {"fstat", posix_fstat},
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001841 {"fdopen", posix_fdopen, 1},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001842#ifdef HAVE_PIPE
Guido van Rossum687dd131993-05-17 08:34:16 +00001843 {"pipe", posix_pipe},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001844#endif
1845#ifdef HAVE_MKFIFO
1846 {"mkfifo", posix_mkfifo, 1},
1847#endif
1848#ifdef HAVE_FTRUNCATE
1849 {"ftruncate", posix_ftruncate, 1},
1850#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001851#ifdef HAVE_PUTENV
1852 {"putenv", posix_putenv, 1},
1853#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001854 {NULL, NULL} /* Sentinel */
1855};
1856
1857
Barry Warsaw4a342091996-12-19 23:50:02 +00001858static int
1859ins(d, symbol, value)
1860 PyObject* d;
1861 char* symbol;
1862 long value;
1863{
1864 PyObject* v = PyInt_FromLong(value);
1865 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
1866 return -1; /* triggers fatal error */
1867
1868 Py_DECREF(v);
1869 return 0;
1870}
1871
1872static int
1873all_ins(d)
1874 PyObject* d;
1875{
1876#ifdef WNOHANG
1877 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
1878#endif
1879#ifdef O_RDONLY
1880 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
1881#endif
1882#ifdef O_WRONLY
1883 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
1884#endif
1885#ifdef O_RDWR
1886 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
1887#endif
1888#ifdef O_NDELAY
1889 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
1890#endif
1891#ifdef O_NONBLOCK
1892 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
1893#endif
1894#ifdef O_APPEND
1895 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
1896#endif
1897#ifdef O_DSYNC
1898 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
1899#endif
1900#ifdef O_RSYNC
1901 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
1902#endif
1903#ifdef O_SYNC
1904 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
1905#endif
1906#ifdef O_NOCTTY
1907 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
1908#endif
1909#ifdef O_CREAT
1910 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
1911#endif
1912#ifdef O_EXCL
1913 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
1914#endif
1915#ifdef O_TRUNC
1916 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
1917#endif
1918 return 0;
1919}
1920
1921
1922
1923
Guido van Rossuma0e71301996-05-28 22:30:38 +00001924#if defined(_MSC_VER) || defined(__WATCOMC__)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001925void
1926initnt()
1927{
Barry Warsaw53699e91996-12-10 23:23:01 +00001928 PyObject *m, *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001929
Barry Warsaw53699e91996-12-10 23:23:01 +00001930 m = Py_InitModule("nt", posix_methods);
1931 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001932
1933 /* Initialize nt.environ dictionary */
1934 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00001935 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
Barry Warsaw4a342091996-12-19 23:50:02 +00001936 goto finally;
Barry Warsaw53699e91996-12-10 23:23:01 +00001937 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001938
Barry Warsaw4a342091996-12-19 23:50:02 +00001939 if (all_ins(d))
1940 goto finally;
1941
Guido van Rossumb6775db1994-08-01 11:34:53 +00001942 /* Initialize nt.error exception */
Guido van Rossumba9d7c51997-04-29 15:49:54 +00001943 PosixError = PyString_FromString("os.error");
Barry Warsaw4a342091996-12-19 23:50:02 +00001944 PyDict_SetItemString(d, "error", PosixError);
1945
1946 if (!PyErr_Occurred())
1947 return;
1948
1949 finally:
1950 Py_FatalError("can't initialize NT posixmodule");
Guido van Rossumb6775db1994-08-01 11:34:53 +00001951}
Guido van Rossum8d665e61996-06-26 18:22:49 +00001952#else /* not a PC port */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001953void
1954initposix()
1955{
Barry Warsaw53699e91996-12-10 23:23:01 +00001956 PyObject *m, *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001957
Barry Warsaw53699e91996-12-10 23:23:01 +00001958 m = Py_InitModule("posix", posix_methods);
1959 d = PyModule_GetDict(m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001960
1961 /* Initialize posix.environ dictionary */
1962 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00001963 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
Barry Warsaw4a342091996-12-19 23:50:02 +00001964 goto finally;
Barry Warsaw53699e91996-12-10 23:23:01 +00001965 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001966
Barry Warsaw4a342091996-12-19 23:50:02 +00001967 if (all_ins(d))
1968 goto finally;
1969
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001970 /* Initialize posix.error exception */
Guido van Rossumba9d7c51997-04-29 15:49:54 +00001971 PosixError = PyString_FromString("os.error");
Barry Warsaw4a342091996-12-19 23:50:02 +00001972 PyDict_SetItemString(d, "error", PosixError);
1973
1974 if (!PyErr_Occurred())
1975 return;
1976
1977 finally:
1978 Py_FatalError("can't initialize posix module");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001979}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001980#endif /* !_MSC_VER */