blob: 8679e0978dc086a977bd4423152c7a785a9fff67 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* POSIX module implementation */
33
Guido van Rossuma4916fa1996-05-23 22:58:55 +000034/* This file is also used for Windows NT and MS-Win. In that case the module
Guido van Rossumad0ee831995-03-01 10:34:45 +000035 actually calls itself 'nt', not 'posix', and a few functions are
36 either unimplemented or implemented differently. The source
Guido van Rossum8d665e61996-06-26 18:22:49 +000037 assumes that for Windows NT, the macro 'MS_WIN32' is defined independent
Guido van Rossumad0ee831995-03-01 10:34:45 +000038 of the compiler used. Different compilers define their own feature
Guido van Rossuma4916fa1996-05-23 22:58:55 +000039 test macro, e.g. '__BORLANDC__' or '_MSC_VER'. */
Guido van Rossumad0ee831995-03-01 10:34:45 +000040
Guido van Rossuma4916fa1996-05-23 22:58:55 +000041/* See also ../Dos/dosmodule.c */
Guido van Rossumad0ee831995-03-01 10:34:45 +000042
Guido van Rossumec4f4ac1997-06-02 22:20:51 +000043static char posix__doc__ [] =
44"This module provides access to operating system functionality that is\n\
45standardized by the C Standard and the POSIX standard (a thinly\n\
46disguised Unix interface). Refer to the library manual and\n\
47corresponding Unix manual entries for more information on calls.";
48
Barry Warsaw53699e91996-12-10 23:23:01 +000049#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000051#if defined(PYOS_OS2)
52#define INCL_DOS
53#define INCL_DOSERRORS
54#define INCL_DOSPROCESS
55#define INCL_NOPMAPI
56#include <os2.h>
57#endif
58
Guido van Rossumb6775db1994-08-01 11:34:53 +000059#include <sys/types.h>
60#include <sys/stat.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +000061#ifdef HAVE_SYS_WAIT_H
62#include <sys/wait.h> /* For WNOHANG */
63#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000064
Guido van Rossuma376cc51996-12-05 23:43:35 +000065#ifdef HAVE_SIGNAL_H
66#include <signal.h>
67#endif
68
Guido van Rossumb6775db1994-08-01 11:34:53 +000069#include "mytime.h" /* For clock_t on some systems */
70
71#ifdef HAVE_FCNTL_H
72#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000073#endif /* HAVE_FCNTL_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +000074
Guido van Rossuma4916fa1996-05-23 22:58:55 +000075/* Various compilers have only certain posix functions */
Guido van Rossum6d8841c1997-08-14 19:57:39 +000076/* XXX Gosh I wish these were all moved into config.h */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +000077#if defined(PYCC_VACPP) && defined(PYOS_OS2)
78 #define HAVE_EXECV 1
79 #define HAVE_GETCWD 1
80 #define HAVE_SYSTEM 1
81 #define HAVE_WAIT 1
82 #define HAVE_KILL 1
83 #define HAVE_PIPE 1
84 #define HAVE_POPEN 1
85
86// #define HAVE_FORK 1
87// #define HAVE_GETEGID 1
88// #define HAVE_GETEUID 1
89// #define HAVE_GETGID 1
90// #define HAVE_GETPPID 1
91// #define HAVE_GETUID 1
92// #define HAVE_OPENDIR 1
93#include <process.h>
94#else
Guido van Rossuma4916fa1996-05-23 22:58:55 +000095#ifdef __WATCOMC__ /* Watcom compiler */
96#define HAVE_GETCWD 1
97#define HAVE_OPENDIR 1
98#define HAVE_SYSTEM 1
99#if defined(__OS2__)
100#define HAVE_EXECV 1
101#define HAVE_WAIT 1
Guido van Rossumad0ee831995-03-01 10:34:45 +0000102#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000103#include <process.h>
104#else
105#ifdef __BORLANDC__ /* Borland compiler */
106#define HAVE_EXECV 1
107#define HAVE_GETCWD 1
108#define HAVE_GETEGID 1
109#define HAVE_GETEUID 1
110#define HAVE_GETGID 1
111#define HAVE_GETPPID 1
112#define HAVE_GETUID 1
113#define HAVE_KILL 1
114#define HAVE_OPENDIR 1
115#define HAVE_PIPE 1
116#define HAVE_POPEN 1
117#define HAVE_SYSTEM 1
118#define HAVE_WAIT 1
119#else
120#ifdef _MSC_VER /* Microsoft compiler */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000121#define HAVE_GETCWD 1
122#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000123#define HAVE_EXECV 1
124#define HAVE_PIPE 1
125#define HAVE_POPEN 1
126#define HAVE_SYSTEM 1
127#else /* 16-bit Windows */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000128#endif /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000129#else /* all other compilers */
130/* Unix functions that the configure script doesn't check for */
131#define HAVE_EXECV 1
132#define HAVE_FORK 1
133#define HAVE_GETCWD 1
134#define HAVE_GETEGID 1
135#define HAVE_GETEUID 1
136#define HAVE_GETGID 1
137#define HAVE_GETPPID 1
138#define HAVE_GETUID 1
139#define HAVE_KILL 1
140#define HAVE_OPENDIR 1
141#define HAVE_PIPE 1
142#define HAVE_POPEN 1
143#define HAVE_SYSTEM 1
144#define HAVE_WAIT 1
145#endif /* _MSC_VER */
146#endif /* __BORLANDC__ */
147#endif /* ! __WATCOMC__ */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000148#endif /* ! __IBMC__ */
Guido van Rossumad0ee831995-03-01 10:34:45 +0000149
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000150#ifndef _MSC_VER
Guido van Rossum36bc6801995-06-14 22:54:23 +0000151
Guido van Rossumb6775db1994-08-01 11:34:53 +0000152#ifdef HAVE_UNISTD_H
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000153#include <unistd.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +0000154#endif
155
156#ifdef NeXT
157/* NeXT's <unistd.h> and <utime.h> aren't worth much */
158#undef HAVE_UNISTD_H
159#undef HAVE_UTIME_H
Guido van Rossumb9f866c1997-05-22 15:12:39 +0000160#define HAVE_WAITPID
Guido van Rossum36bc6801995-06-14 22:54:23 +0000161/* #undef HAVE_GETCWD */
162#endif
163
164#ifdef HAVE_UNISTD_H
Guido van Rossumad0ee831995-03-01 10:34:45 +0000165/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
166extern int rename();
167extern int pclose();
168extern int lstat();
169extern int symlink();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000170#else /* !HAVE_UNISTD_H */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000171#if defined(PYCC_VACPP)
172extern int mkdir Py_PROTO((char *));
173#else
Guido van Rossum8d665e61996-06-26 18:22:49 +0000174#if defined(__WATCOMC__) || defined(_MSC_VER)
Barry Warsaw53699e91996-12-10 23:23:01 +0000175extern int mkdir Py_PROTO((const char *));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000176#else
Barry Warsaw53699e91996-12-10 23:23:01 +0000177extern int mkdir Py_PROTO((const char *, mode_t));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000178#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000179#endif
180#if defined(__IBMC__) || defined(__IBMCPP__)
181extern int chdir Py_PROTO((char *));
182extern int rmdir Py_PROTO((char *));
183#else
Barry Warsaw53699e91996-12-10 23:23:01 +0000184extern int chdir Py_PROTO((const char *));
185extern int rmdir Py_PROTO((const char *));
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000186#endif
Barry Warsaw53699e91996-12-10 23:23:01 +0000187extern int chmod Py_PROTO((const char *, mode_t));
188extern int chown Py_PROTO((const char *, uid_t, gid_t));
189extern char *getcwd Py_PROTO((char *, int));
190extern char *strerror Py_PROTO((int));
191extern int link Py_PROTO((const char *, const char *));
192extern int rename Py_PROTO((const char *, const char *));
193extern int stat Py_PROTO((const char *, struct stat *));
194extern int unlink Py_PROTO((const char *));
195extern int pclose Py_PROTO((FILE *));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000196#ifdef HAVE_SYMLINK
Barry Warsaw53699e91996-12-10 23:23:01 +0000197extern int symlink Py_PROTO((const char *, const char *));
Guido van Rossuma38a5031995-02-17 15:11:36 +0000198#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000199#ifdef HAVE_LSTAT
Barry Warsaw53699e91996-12-10 23:23:01 +0000200extern int lstat Py_PROTO((const char *, struct stat *));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000201#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000202#endif /* !HAVE_UNISTD_H */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000203
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000204#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205
Guido van Rossumb6775db1994-08-01 11:34:53 +0000206#ifdef HAVE_UTIME_H
207#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000208#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000209
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000210#ifdef HAVE_SYS_UTIME_H
211#include <sys/utime.h>
212#define HAVE_UTIME_H /* pretend we do for the rest of this file */
213#endif /* HAVE_SYS_UTIME_H */
214
Guido van Rossumb6775db1994-08-01 11:34:53 +0000215#ifdef HAVE_SYS_TIMES_H
216#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000217#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000218
219#ifdef HAVE_SYS_PARAM_H
220#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000221#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000222
223#ifdef HAVE_SYS_UTSNAME_H
224#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000225#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000226
227#ifndef MAXPATHLEN
228#define MAXPATHLEN 1024
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000229#endif /* MAXPATHLEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000230
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000231#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000232#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000233#define NAMLEN(dirent) strlen((dirent)->d_name)
234#else
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000235#ifdef __WATCOMC__
236#include <direct.h>
237#define NAMLEN(dirent) strlen((dirent)->d_name)
238#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000239#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000240#define NAMLEN(dirent) (dirent)->d_namlen
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000241#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000242#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000243#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000244#endif
245#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000246#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000247#endif
248#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000249#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000250#endif
251#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000252
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000253#ifdef _MSC_VER
Guido van Rossumb6775db1994-08-01 11:34:53 +0000254#include <direct.h>
255#include <io.h>
256#include <process.h>
257#include <windows.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000258#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000259#define popen _popen
Guido van Rossum794d8131994-08-23 13:48:48 +0000260#define pclose _pclose
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000261#else /* 16-bit Windows */
262#include <dos.h>
263#include <ctype.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000264#endif /* MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000265#endif /* _MSC_VER */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000266
267#ifdef OS2
268#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000269#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000270
271/* Return a dictionary corresponding to the POSIX environment table */
272
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000273#if !defined(_MSC_VER) && !defined(__WATCOMC__)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000275#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276
Barry Warsaw53699e91996-12-10 23:23:01 +0000277static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000278convertenviron()
279{
Barry Warsaw53699e91996-12-10 23:23:01 +0000280 PyObject *d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281 char **e;
Barry Warsaw53699e91996-12-10 23:23:01 +0000282 d = PyDict_New();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283 if (d == NULL)
284 return NULL;
285 if (environ == NULL)
286 return d;
287 /* XXX This part ignores errors */
288 for (e = environ; *e != NULL; e++) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000289 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290 char *p = strchr(*e, '=');
291 if (p == NULL)
292 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000293 v = PyString_FromString(p+1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294 if (v == NULL)
295 continue;
296 *p = '\0';
Barry Warsaw53699e91996-12-10 23:23:01 +0000297 (void) PyDict_SetItemString(d, *e, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000298 *p = '=';
Barry Warsaw53699e91996-12-10 23:23:01 +0000299 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300 }
301 return d;
302}
303
304
Barry Warsaw53699e91996-12-10 23:23:01 +0000305static PyObject *PosixError; /* Exception posix.error */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000306
307/* Set a POSIX-specific error from errno, and return NULL */
308
Barry Warsaw53699e91996-12-10 23:23:01 +0000309static PyObject * posix_error()
Guido van Rossumad0ee831995-03-01 10:34:45 +0000310{
Barry Warsaw53699e91996-12-10 23:23:01 +0000311 return PyErr_SetFromErrno(PosixError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312}
313
314
315/* POSIX generic methods */
316
Barry Warsaw53699e91996-12-10 23:23:01 +0000317static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318posix_1str(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000319 PyObject *args;
320 int (*func) Py_FPROTO((const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000322 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000323 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000324 if (!PyArg_Parse(args, "s", &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000326 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000327 res = (*func)(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000328 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000329 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000331 Py_INCREF(Py_None);
332 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333}
334
Barry Warsaw53699e91996-12-10 23:23:01 +0000335static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336posix_2str(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000337 PyObject *args;
338 int (*func) Py_FPROTO((const char *, const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000340 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000341 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000342 if (!PyArg_Parse(args, "(ss)", &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000344 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000345 res = (*func)(path1, path2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000346 Py_END_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000347 if (res != 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000348 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000349 Py_INCREF(Py_None);
350 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000351}
352
Barry Warsaw53699e91996-12-10 23:23:01 +0000353static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000354posix_strint(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000355 PyObject *args;
356 int (*func) Py_FPROTO((const char *, int));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000357{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000358 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000359 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000360 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000361 if (!PyArg_Parse(args, "(si)", &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000363 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000364 res = (*func)(path, i);
Barry Warsaw53699e91996-12-10 23:23:01 +0000365 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000366 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000367 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000368 Py_INCREF(Py_None);
369 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000370}
371
Barry Warsaw53699e91996-12-10 23:23:01 +0000372static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000373posix_strintint(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000374 PyObject *args;
375 int (*func) Py_FPROTO((const char *, int, int));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000376{
377 char *path;
378 int i,i2;
379 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000380 if (!PyArg_Parse(args, "(sii)", &path, &i, &i2))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000381 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000382 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000383 res = (*func)(path, i, i2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000384 Py_END_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000385 if (res < 0)
386 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000387 Py_INCREF(Py_None);
388 return Py_None;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000389}
390
Barry Warsaw53699e91996-12-10 23:23:01 +0000391static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392posix_do_stat(self, args, statfunc)
Barry Warsaw53699e91996-12-10 23:23:01 +0000393 PyObject *self;
394 PyObject *args;
395 int (*statfunc) Py_FPROTO((const char *, struct stat *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000396{
397 struct stat st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000398 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000399 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000400 if (!PyArg_Parse(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000401 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000402 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000403 res = (*statfunc)(path, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +0000404 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000405 if (res != 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000407 return Py_BuildValue("(llllllllll)",
Guido van Rossume5372401993-03-16 12:15:04 +0000408 (long)st.st_mode,
409 (long)st.st_ino,
410 (long)st.st_dev,
411 (long)st.st_nlink,
412 (long)st.st_uid,
413 (long)st.st_gid,
414 (long)st.st_size,
415 (long)st.st_atime,
416 (long)st.st_mtime,
417 (long)st.st_ctime);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418}
419
420
421/* POSIX methods */
422
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000423static char posix_chdir__doc__[] =
424"chdir(path) -> None\n\
425Change the current working directory to the specified path.";
426
Barry Warsaw53699e91996-12-10 23:23:01 +0000427static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428posix_chdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000429 PyObject *self;
430 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000432 return posix_1str(args, chdir);
433}
434
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000435
436static char posix_chmod__doc__[] =
437"chmod(path, mode) -> None\n\
438Change the access permissions of a file.";
439
Barry Warsaw53699e91996-12-10 23:23:01 +0000440static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441posix_chmod(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000442 PyObject *self;
443 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445 return posix_strint(args, chmod);
446}
447
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000448
Guido van Rossumb6775db1994-08-01 11:34:53 +0000449#ifdef HAVE_CHOWN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000450static char posix_chown__doc__[] =
451"chown(path, uid, gid) -> None\n\
452Change the owner and group id of path to the numeric uid and gid.";
453
Barry Warsaw53699e91996-12-10 23:23:01 +0000454static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000455posix_chown(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000456 PyObject *self;
457 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000458{
459 return posix_strintint(args, chown);
460}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000461#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000462
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000463
Guido van Rossum36bc6801995-06-14 22:54:23 +0000464#ifdef HAVE_GETCWD
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000465static char posix_getcwd__doc__[] =
466"getcwd() -> path\n\
467Return a string representing the current working directory.";
468
Barry Warsaw53699e91996-12-10 23:23:01 +0000469static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000470posix_getcwd(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000471 PyObject *self;
472 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000473{
474 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000475 char *res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000476 if (!PyArg_NoArgs(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000477 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000478 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000479 res = getcwd(buf, sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +0000480 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000481 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000482 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000483 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000484}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000485#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000487
Guido van Rossumb6775db1994-08-01 11:34:53 +0000488#ifdef HAVE_LINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000489static char posix_link__doc__[] =
490"link(src, dst) -> None\n\
491Create a hard link to a file.";
492
Barry Warsaw53699e91996-12-10 23:23:01 +0000493static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000494posix_link(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000495 PyObject *self;
496 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000497{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498 return posix_2str(args, link);
499}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000500#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000501
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000502
503static char posix_listdir__doc__[] =
504"listdir(path) -> list_of_strings\n\
505Return a list containing the names of the entries in the directory.\n\
506\n\
507 path: path of directory to list\n\
508\n\
509The list is in arbitrary order. It does not include the special\n\
510entries '.' and '..' even if they are present in the directory.";
511
Barry Warsaw53699e91996-12-10 23:23:01 +0000512static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000513posix_listdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000514 PyObject *self;
515 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000516{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000517 /* XXX Should redo this putting the (now four) versions of opendir
Guido van Rossum6d8841c1997-08-14 19:57:39 +0000518 in separate files instead of having them all here... */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000519#if defined(MS_WIN32) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000520
Guido van Rossumb6775db1994-08-01 11:34:53 +0000521 char *name;
522 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000523 PyObject *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000524 HANDLE hFindFile;
525 WIN32_FIND_DATA FileData;
526 char namebuf[MAX_PATH+5];
527
Barry Warsaw53699e91996-12-10 23:23:01 +0000528 if (!PyArg_Parse(args, "s#", &name, &len))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000529 return NULL;
530 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000531 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000532 return NULL;
533 }
534 strcpy(namebuf, name);
535 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
536 namebuf[len++] = '/';
537 strcpy(namebuf + len, "*.*");
538
Barry Warsaw53699e91996-12-10 23:23:01 +0000539 if ((d = PyList_New(0)) == NULL)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000540 return NULL;
541
542 hFindFile = FindFirstFile(namebuf, &FileData);
543 if (hFindFile == INVALID_HANDLE_VALUE) {
544 errno = GetLastError();
545 return posix_error();
546 }
547 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000548 if (FileData.cFileName[0] == '.' &&
549 (FileData.cFileName[1] == '\0' ||
550 FileData.cFileName[1] == '.' &&
551 FileData.cFileName[2] == '\0'))
552 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000553 v = PyString_FromString(FileData.cFileName);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000554 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000555 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000556 d = NULL;
557 break;
558 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000559 if (PyList_Append(d, v) != 0) {
560 Py_DECREF(v);
561 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000562 d = NULL;
563 break;
564 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000565 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000566 } while (FindNextFile(hFindFile, &FileData) == TRUE);
567
568 if (FindClose(hFindFile) == FALSE) {
569 errno = GetLastError();
570 return posix_error();
571 }
572
573 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000574
Guido van Rossum8d665e61996-06-26 18:22:49 +0000575#else /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000576#ifdef _MSC_VER /* 16-bit Windows */
577
578#ifndef MAX_PATH
579#define MAX_PATH 250
580#endif
581 char *name, *pt;
582 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000583 PyObject *d, *v;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000584 char namebuf[MAX_PATH+5];
585 struct _find_t ep;
586
Barry Warsaw53699e91996-12-10 23:23:01 +0000587 if (!PyArg_Parse(args, "s#", &name, &len))
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000588 return NULL;
589 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000590 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000591 return NULL;
592 }
593 strcpy(namebuf, name);
594 for (pt = namebuf; *pt; pt++)
595 if (*pt == '/')
596 *pt = '\\';
597 if (namebuf[len-1] != '\\')
598 namebuf[len++] = '\\';
599 strcpy(namebuf + len, "*.*");
600
Barry Warsaw53699e91996-12-10 23:23:01 +0000601 if ((d = PyList_New(0)) == NULL)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000602 return NULL;
603
604 if (_dos_findfirst(namebuf, _A_RDONLY |
Barry Warsaw43d68b81996-12-19 22:10:44 +0000605 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0)
606 {
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000607 errno = ENOENT;
608 return posix_error();
609 }
610 do {
611 if (ep.name[0] == '.' &&
612 (ep.name[1] == '\0' ||
613 ep.name[1] == '.' &&
614 ep.name[2] == '\0'))
615 continue;
616 strcpy(namebuf, ep.name);
617 for (pt = namebuf; *pt; pt++)
618 if (isupper(*pt))
619 *pt = tolower(*pt);
Barry Warsaw53699e91996-12-10 23:23:01 +0000620 v = PyString_FromString(namebuf);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000621 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000622 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000623 d = NULL;
624 break;
625 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000626 if (PyList_Append(d, v) != 0) {
627 Py_DECREF(v);
628 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000629 d = NULL;
630 break;
631 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000632 Py_DECREF(v);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000633 } while (_dos_findnext(&ep) == 0);
634
635 return d;
636
637#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000638#if defined(PYOS_OS2)
639
640#ifndef MAX_PATH
641#define MAX_PATH CCHMAXPATH
642#endif
643 char *name, *pt;
644 int len;
645 PyObject *d, *v;
646 char namebuf[MAX_PATH+5];
647 HDIR hdir = 1;
648 ULONG srchcnt = 1;
649 FILEFINDBUF3 ep;
650 APIRET rc;
651
652 if (!PyArg_Parse(args, "s#", &name, &len))
653 return NULL;
654 if (len >= MAX_PATH) {
655 PyErr_SetString(PyExc_ValueError, "path too long");
656 return NULL;
657 }
658 strcpy(namebuf, name);
659 for (pt = namebuf; *pt; pt++)
660 if (*pt == '/')
661 *pt = '\\';
662 if (namebuf[len-1] != '\\')
663 namebuf[len++] = '\\';
664 strcpy(namebuf + len, "*.*");
665
666 if ((d = PyList_New(0)) == NULL)
667 return NULL;
668
669 rc = DosFindFirst(namebuf, // Wildcard Pattern to Match
670 &hdir, // Handle to Use While Search Directory
671 FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_DIRECTORY,
672 &ep, sizeof(ep), // Structure to Receive Directory Entry
673 &srchcnt, // Max and Actual Count of Entries Per Iteration
674 FIL_STANDARD); // Format of Entry (EAs or Not)
675
676 if (rc != NO_ERROR) {
677 errno = ENOENT;
678 return posix_error();
679 }
680
681 if (srchcnt > 0) { // If Directory is NOT Totally Empty,
682 do {
683 if (ep.achName[0] == '.'
684 && (ep.achName[1] == '\0' || ep.achName[1] == '.' && ep.achName[2] == '\0'))
685 continue; // Skip Over "." and ".." Names
686
687 strcpy(namebuf, ep.achName);
688
689 // Leave Case of Name Alone -- In Native Form
690 // (Removed Forced Lowercasing Code)
691
692 v = PyString_FromString(namebuf);
693 if (v == NULL) {
694 Py_DECREF(d);
695 d = NULL;
696 break;
697 }
698 if (PyList_Append(d, v) != 0) {
699 Py_DECREF(v);
700 Py_DECREF(d);
701 d = NULL;
702 break;
703 }
704 Py_DECREF(v);
705 } while (DosFindNext(hdir, &ep, sizeof(ep), &srchcnt) == NO_ERROR && srchcnt > 0);
706 }
707
708 return d;
709#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000710
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000711 char *name;
Barry Warsaw53699e91996-12-10 23:23:01 +0000712 PyObject *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000713 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000714 struct dirent *ep;
Barry Warsaw53699e91996-12-10 23:23:01 +0000715 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000716 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000717 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000718 if ((dirp = opendir(name)) == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000719 Py_BLOCK_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000720 return posix_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000721 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000722 if ((d = PyList_New(0)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000723 closedir(dirp);
Barry Warsaw53699e91996-12-10 23:23:01 +0000724 Py_BLOCK_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000725 return NULL;
726 }
727 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000728 if (ep->d_name[0] == '.' &&
729 (NAMLEN(ep) == 1 ||
Guido van Rossuma376cc51996-12-05 23:43:35 +0000730 (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000731 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000732 v = PyString_FromStringAndSize(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000733 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000734 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000735 d = NULL;
736 break;
737 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000738 if (PyList_Append(d, v) != 0) {
739 Py_DECREF(v);
740 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000741 d = NULL;
742 break;
743 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000744 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000745 }
746 closedir(dirp);
Barry Warsaw53699e91996-12-10 23:23:01 +0000747 Py_END_ALLOW_THREADS
Guido van Rossum0ee42cd1991-04-08 21:01:03 +0000748
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000749 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000750
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000751#endif /* !PYOS_OS2 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000752#endif /* !_MSC_VER */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000753#endif /* !MS_WIN32 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000754}
755
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000756static char posix_mkdir__doc__[] =
757"mkdir(path [, mode=0777]) -> None\n\
758Create a directory.";
759
Barry Warsaw53699e91996-12-10 23:23:01 +0000760static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000761posix_mkdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000762 PyObject *self;
763 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000764{
Guido van Rossumb0824db1996-02-25 04:50:32 +0000765 int res;
766 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000767 int mode = 0777;
Barry Warsaw53699e91996-12-10 23:23:01 +0000768 if (!PyArg_ParseTuple(args, "s|i", &path, &mode))
Guido van Rossumb0824db1996-02-25 04:50:32 +0000769 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000770 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +0000771#if defined(__WATCOMC__) || defined(_MSC_VER) || defined(PYCC_VACPP)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000772 res = mkdir(path);
773#else
Guido van Rossumb0824db1996-02-25 04:50:32 +0000774 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000775#endif
Barry Warsaw53699e91996-12-10 23:23:01 +0000776 Py_END_ALLOW_THREADS
Guido van Rossumb0824db1996-02-25 04:50:32 +0000777 if (res < 0)
778 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000779 Py_INCREF(Py_None);
780 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000781}
782
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000783
Guido van Rossumb6775db1994-08-01 11:34:53 +0000784#ifdef HAVE_NICE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000785static char posix_nice__doc__[] =
786"nice(inc) -> new_priority\n\
787Decrease the priority of process and return new priority.";
788
Barry Warsaw53699e91996-12-10 23:23:01 +0000789static PyObject *
Guido van Rossum775f4da1993-01-09 17:18:52 +0000790posix_nice(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000791 PyObject *self;
792 PyObject *args;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000793{
794 int increment, value;
795
Barry Warsaw53699e91996-12-10 23:23:01 +0000796 if (!PyArg_Parse(args, "i", &increment))
Guido van Rossum775f4da1993-01-09 17:18:52 +0000797 return NULL;
798 value = nice(increment);
799 if (value == -1)
800 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000801 return PyInt_FromLong((long) value);
Guido van Rossum775f4da1993-01-09 17:18:52 +0000802}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000803#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000804
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000805
806static char posix_rename__doc__[] =
807"rename(old, new) -> None\n\
808Rename a file or directory.";
809
Barry Warsaw53699e91996-12-10 23:23:01 +0000810static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000811posix_rename(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000812 PyObject *self;
813 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000814{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000815 return posix_2str(args, rename);
816}
817
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000818
819static char posix_rmdir__doc__[] =
820"rmdir(path) -> None\n\
821Remove a directory.";
822
Barry Warsaw53699e91996-12-10 23:23:01 +0000823static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000824posix_rmdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000825 PyObject *self;
826 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000827{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000828 return posix_1str(args, rmdir);
829}
830
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000831
832static char posix_stat__doc__[] =
833"stat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
834Perform a stat system call on the given path.";
835
Barry Warsaw53699e91996-12-10 23:23:01 +0000836static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000837posix_stat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000838 PyObject *self;
839 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000840{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000841 return posix_do_stat(self, args, stat);
842}
843
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000844
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000845#ifdef HAVE_SYSTEM
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000846static char posix_system__doc__[] =
847"system(command) -> exit_status\n\
848Execute the command (a string) in a subshell.";
849
Barry Warsaw53699e91996-12-10 23:23:01 +0000850static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000851posix_system(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000852 PyObject *self;
853 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000854{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000855 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000856 long sts;
Barry Warsaw53699e91996-12-10 23:23:01 +0000857 if (!PyArg_Parse(args, "s", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000858 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000859 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000860 sts = system(command);
Barry Warsaw53699e91996-12-10 23:23:01 +0000861 Py_END_ALLOW_THREADS
862 return PyInt_FromLong(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000863}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000864#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000865
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000866
867static char posix_umask__doc__[] =
868"umask(new_mask) -> old_mask\n\
869Set the current numeric umask and return the previous umask.";
870
Barry Warsaw53699e91996-12-10 23:23:01 +0000871static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000872posix_umask(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000873 PyObject *self;
874 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000875{
876 int i;
Barry Warsaw53699e91996-12-10 23:23:01 +0000877 if (!PyArg_Parse(args, "i", &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000878 return NULL;
879 i = umask(i);
880 if (i < 0)
881 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000882 return PyInt_FromLong((long)i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000883}
884
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000885
886static char posix_unlink__doc__[] =
887"unlink(path) -> None\n\
888Remove a file (same as remove(path)).";
889
890static char posix_remove__doc__[] =
891"remove(path) -> None\n\
892Remove a file (same as unlink(path)).";
893
Barry Warsaw53699e91996-12-10 23:23:01 +0000894static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000895posix_unlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000896 PyObject *self;
897 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000898{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000899 return posix_1str(args, unlink);
900}
901
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000902
Guido van Rossumb6775db1994-08-01 11:34:53 +0000903#ifdef HAVE_UNAME
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000904static char posix_uname__doc__[] =
905"uname() -> (sysname, nodename, release, version, machine)\n\
906Return a tuple identifying the current operating system.";
907
Barry Warsaw53699e91996-12-10 23:23:01 +0000908static PyObject *
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000909posix_uname(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000910 PyObject *self;
911 PyObject *args;
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000912{
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000913 struct utsname u;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000914 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000915 if (!PyArg_NoArgs(args))
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000916 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000917 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000918 res = uname(&u);
Barry Warsaw53699e91996-12-10 23:23:01 +0000919 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000920 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000921 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000922 return Py_BuildValue("(sssss)",
Barry Warsaw43d68b81996-12-19 22:10:44 +0000923 u.sysname,
924 u.nodename,
925 u.release,
926 u.version,
927 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000928}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000929#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000930
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000931
932static char posix_utime__doc__[] =
933"utime(path, (atime, utime)) -> None\n\
934Set the access and modified time of the file to the given values.";
935
Barry Warsaw53699e91996-12-10 23:23:01 +0000936static PyObject *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000937posix_utime(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000938 PyObject *self;
939 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000940{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000941 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000942 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000943 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000944
Guido van Rossum6d8841c1997-08-14 19:57:39 +0000945/* XXX should define struct utimbuf instead, above */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000946#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000947 struct utimbuf buf;
948#define ATIME buf.actime
949#define MTIME buf.modtime
950#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000951#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000952 time_t buf[2];
953#define ATIME buf[0]
954#define MTIME buf[1]
955#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000956#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000957
Barry Warsaw53699e91996-12-10 23:23:01 +0000958 if (!PyArg_Parse(args, "(s(ll))", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000959 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000960 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +0000961 MTIME = mtime;
Barry Warsaw53699e91996-12-10 23:23:01 +0000962 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000963 res = utime(path, UTIME_ARG);
Barry Warsaw53699e91996-12-10 23:23:01 +0000964 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000965 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000966 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000967 Py_INCREF(Py_None);
968 return Py_None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000969#undef UTIME_ARG
970#undef ATIME
971#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000972}
973
Guido van Rossum85e3b011991-06-03 12:42:10 +0000974
Guido van Rossum3b066191991-06-04 19:40:25 +0000975/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000976
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000977static char posix__exit__doc__[] =
978"_exit(status)\n\
979Exit to the system with specified status, without normal exit processing.";
980
Barry Warsaw53699e91996-12-10 23:23:01 +0000981static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000982posix__exit(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000983 PyObject *self;
984 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000985{
986 int sts;
Barry Warsaw53699e91996-12-10 23:23:01 +0000987 if (!PyArg_Parse(args, "i", &sts))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000988 return NULL;
989 _exit(sts);
Guido van Rossuma376cc51996-12-05 23:43:35 +0000990 return NULL; /* Make gcc -Wall happy */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000991}
992
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000993
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000994#ifdef HAVE_EXECV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000995static char posix_execv__doc__[] =
996"execv(path, args)\n\
997Execute an executable path with arguments, replacing current process.\n\
998\n\
999 path: path of executable file\n\
1000 args: tuple or list of strings";
1001
Barry Warsaw53699e91996-12-10 23:23:01 +00001002static PyObject *
Guido van Rossum89b33251993-10-22 14:26:06 +00001003posix_execv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001004 PyObject *self;
1005 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001006{
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001007 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00001008 PyObject *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001009 char **argvlist;
1010 int i, argc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001011 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossum85e3b011991-06-03 12:42:10 +00001012
Guido van Rossum89b33251993-10-22 14:26:06 +00001013 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +00001014 argv is a list or tuple of strings. */
1015
Barry Warsaw53699e91996-12-10 23:23:01 +00001016 if (!PyArg_Parse(args, "(sO)", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001017 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001018 if (PyList_Check(argv)) {
1019 argc = PyList_Size(argv);
1020 getitem = PyList_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001021 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001022 else if (PyTuple_Check(argv)) {
1023 argc = PyTuple_Size(argv);
1024 getitem = PyTuple_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001025 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001026 else {
1027 badarg:
Barry Warsaw53699e91996-12-10 23:23:01 +00001028 PyErr_BadArgument();
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001029 return NULL;
1030 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00001031
Barry Warsaw53699e91996-12-10 23:23:01 +00001032 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001033 if (argvlist == NULL)
1034 return NULL;
1035 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001036 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
1037 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001038 goto badarg;
1039 }
Guido van Rossum85e3b011991-06-03 12:42:10 +00001040 }
1041 argvlist[argc] = NULL;
1042
Guido van Rossumb6775db1994-08-01 11:34:53 +00001043#ifdef BAD_EXEC_PROTOTYPES
1044 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001045#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001046 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001047#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001048
Guido van Rossum85e3b011991-06-03 12:42:10 +00001049 /* If we get here it's definitely an error */
1050
Barry Warsaw53699e91996-12-10 23:23:01 +00001051 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001052 return posix_error();
1053}
1054
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001055
1056static char posix_execve__doc__[] =
1057"execve(path, args, env)\n\
1058Execute a path with arguments and environment, replacing current process.\n\
1059\n\
1060 path: path of executable file\n\
1061 args: tuple or list of arguments\n\
1062 env: dictonary of strings mapping to strings";
1063
Barry Warsaw53699e91996-12-10 23:23:01 +00001064static PyObject *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001065posix_execve(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001066 PyObject *self;
1067 PyObject *args;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001068{
1069 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +00001070 PyObject *argv, *env;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001071 char **argvlist;
1072 char **envlist;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001073 PyObject *key, *val, *keys=NULL, *vals=NULL;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001074 int i, pos, argc, envc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001075 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001076
1077 /* execve has three arguments: (path, argv, env), where
1078 argv is a list or tuple of strings and env is a dictionary
1079 like posix.environ. */
1080
Barry Warsaw53699e91996-12-10 23:23:01 +00001081 if (!PyArg_Parse(args, "(sOO)", &path, &argv, &env))
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001082 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001083 if (PyList_Check(argv)) {
1084 argc = PyList_Size(argv);
1085 getitem = PyList_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001086 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001087 else if (PyTuple_Check(argv)) {
1088 argc = PyTuple_Size(argv);
1089 getitem = PyTuple_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001090 }
1091 else {
Barry Warsaw53699e91996-12-10 23:23:01 +00001092 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001093 return NULL;
1094 }
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001095 if (!PyMapping_Check(env)) {
1096 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001097 return NULL;
1098 }
1099
Barry Warsaw53699e91996-12-10 23:23:01 +00001100 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001101 if (argvlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001102 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001103 return NULL;
1104 }
1105 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001106 if (!PyArg_Parse((*getitem)(argv, i),
Barry Warsaw43d68b81996-12-19 22:10:44 +00001107 "s;argv must be list of strings",
1108 &argvlist[i]))
1109 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001110 goto fail_1;
1111 }
1112 }
1113 argvlist[argc] = NULL;
1114
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001115 i = PyMapping_Length(env);
Barry Warsaw53699e91996-12-10 23:23:01 +00001116 envlist = PyMem_NEW(char *, i + 1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001117 if (envlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001118 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001119 goto fail_1;
1120 }
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001121 envc = 0;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001122 keys = PyMapping_Keys(env);
1123 vals = PyMapping_Values(env);
1124 if (!keys || !vals)
1125 goto fail_2;
1126
1127 for (pos = 0; pos < i; pos++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001128 char *p, *k, *v;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001129
1130 key = PyList_GetItem(keys, pos);
1131 val = PyList_GetItem(vals, pos);
1132 if (!key || !val)
1133 goto fail_2;
1134
Barry Warsaw53699e91996-12-10 23:23:01 +00001135 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
Barry Warsaw43d68b81996-12-19 22:10:44 +00001136 !PyArg_Parse(val, "s;non-string value in env", &v))
1137 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001138 goto fail_2;
1139 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001140 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001141 if (p == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001142 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001143 goto fail_2;
1144 }
1145 sprintf(p, "%s=%s", k, v);
1146 envlist[envc++] = p;
1147 }
1148 envlist[envc] = 0;
1149
Guido van Rossumb6775db1994-08-01 11:34:53 +00001150
1151#ifdef BAD_EXEC_PROTOTYPES
1152 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001153#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001154 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001155#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001156
1157 /* If we get here it's definitely an error */
1158
1159 (void) posix_error();
1160
1161 fail_2:
1162 while (--envc >= 0)
Barry Warsaw53699e91996-12-10 23:23:01 +00001163 PyMem_DEL(envlist[envc]);
1164 PyMem_DEL(envlist);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001165 fail_1:
Barry Warsaw53699e91996-12-10 23:23:01 +00001166 PyMem_DEL(argvlist);
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001167 Py_XDECREF(vals);
1168 Py_XDECREF(keys);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001169 return NULL;
1170}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001171#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001172
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001173
Guido van Rossumad0ee831995-03-01 10:34:45 +00001174#ifdef HAVE_FORK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001175static char posix_fork__doc__[] =
1176"fork() -> pid\n\
1177Fork a child process.\n\
1178\n\
1179Return 0 to child process and PID of child to parent process.";
1180
Barry Warsaw53699e91996-12-10 23:23:01 +00001181static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001182posix_fork(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001183 PyObject *self;
1184 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001185{
1186 int pid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001187 if (!PyArg_NoArgs(args))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001188 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001189 pid = fork();
1190 if (pid == -1)
1191 return posix_error();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001192 PyOS_AfterFork();
Barry Warsaw53699e91996-12-10 23:23:01 +00001193 return PyInt_FromLong((long)pid);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001194}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001195#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001196
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001197
Guido van Rossumad0ee831995-03-01 10:34:45 +00001198#ifdef HAVE_GETEGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001199static char posix_getegid__doc__[] =
1200"getegid() -> egid\n\
1201Return the current process's effective group id.";
1202
Barry Warsaw53699e91996-12-10 23:23:01 +00001203static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001204posix_getegid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001205 PyObject *self;
1206 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001207{
Barry Warsaw53699e91996-12-10 23:23:01 +00001208 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001209 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001210 return PyInt_FromLong((long)getegid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001211}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001212#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001213
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001214
Guido van Rossumad0ee831995-03-01 10:34:45 +00001215#ifdef HAVE_GETEUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001216static char posix_geteuid__doc__[] =
1217"geteuid() -> euid\n\
1218Return the current process's effective user id.";
1219
Barry Warsaw53699e91996-12-10 23:23:01 +00001220static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001221posix_geteuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001222 PyObject *self;
1223 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001224{
Barry Warsaw53699e91996-12-10 23:23:01 +00001225 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001226 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001227 return PyInt_FromLong((long)geteuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001228}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001229#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001230
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001231
Guido van Rossumad0ee831995-03-01 10:34:45 +00001232#ifdef HAVE_GETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001233static char posix_getgid__doc__[] =
1234"getgid() -> gid\n\
1235Return the current process's group id.";
1236
Barry Warsaw53699e91996-12-10 23:23:01 +00001237static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001238posix_getgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001239 PyObject *self;
1240 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001241{
Barry Warsaw53699e91996-12-10 23:23:01 +00001242 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001243 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001244 return PyInt_FromLong((long)getgid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001245}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001246#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001247
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001248
1249static char posix_getpid__doc__[] =
1250"getpid() -> pid\n\
1251Return the current process id";
1252
Barry Warsaw53699e91996-12-10 23:23:01 +00001253static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001254posix_getpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001255 PyObject *self;
1256 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001257{
Barry Warsaw53699e91996-12-10 23:23:01 +00001258 if (!PyArg_NoArgs(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001259 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001260 return PyInt_FromLong((long)getpid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001261}
1262
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001263
Guido van Rossumb6775db1994-08-01 11:34:53 +00001264#ifdef HAVE_GETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001265static char posix_getpgrp__doc__[] =
1266"getpgrp() -> pgrp\n\
1267Return the current process group id.";
1268
Barry Warsaw53699e91996-12-10 23:23:01 +00001269static PyObject *
Guido van Rossum04814471991-06-04 20:23:49 +00001270posix_getpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001271 PyObject *self;
1272 PyObject *args;
Guido van Rossum04814471991-06-04 20:23:49 +00001273{
Barry Warsaw53699e91996-12-10 23:23:01 +00001274 if (!PyArg_NoArgs(args))
Guido van Rossum04814471991-06-04 20:23:49 +00001275 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001276#ifdef GETPGRP_HAVE_ARG
Barry Warsaw53699e91996-12-10 23:23:01 +00001277 return PyInt_FromLong((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001278#else /* GETPGRP_HAVE_ARG */
Barry Warsaw53699e91996-12-10 23:23:01 +00001279 return PyInt_FromLong((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001280#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001281}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001282#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001283
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001284
Guido van Rossumb6775db1994-08-01 11:34:53 +00001285#ifdef HAVE_SETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001286static char posix_setpgrp__doc__[] =
1287"setpgrp() -> None\n\
1288Make this process a session leader.";
1289
Barry Warsaw53699e91996-12-10 23:23:01 +00001290static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001291posix_setpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001292 PyObject *self;
1293 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001294{
Barry Warsaw53699e91996-12-10 23:23:01 +00001295 if (!PyArg_NoArgs(args))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001296 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001297#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001298 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001299#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001300 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001301#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001302 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001303 Py_INCREF(Py_None);
1304 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001305}
1306
Guido van Rossumb6775db1994-08-01 11:34:53 +00001307#endif /* HAVE_SETPGRP */
1308
Guido van Rossumad0ee831995-03-01 10:34:45 +00001309#ifdef HAVE_GETPPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001310static char posix_getppid__doc__[] =
1311"getppid() -> ppid\n\
1312Return the parent's process id.";
1313
Barry Warsaw53699e91996-12-10 23:23:01 +00001314static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001315posix_getppid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001316 PyObject *self;
1317 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001318{
Barry Warsaw53699e91996-12-10 23:23:01 +00001319 if (!PyArg_NoArgs(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001320 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001321 return PyInt_FromLong((long)getppid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001322}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001323#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001324
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001325
Guido van Rossumad0ee831995-03-01 10:34:45 +00001326#ifdef HAVE_GETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001327static char posix_getuid__doc__[] =
1328"getuid() -> uid\n\
1329Return the current process's user id.";
1330
Barry Warsaw53699e91996-12-10 23:23:01 +00001331static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001332posix_getuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001333 PyObject *self;
1334 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001335{
Barry Warsaw53699e91996-12-10 23:23:01 +00001336 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001337 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001338 return PyInt_FromLong((long)getuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001339}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001340#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001341
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001342
Guido van Rossumad0ee831995-03-01 10:34:45 +00001343#ifdef HAVE_KILL
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001344static char posix_kill__doc__[] =
1345"kill(pid, sig) -> None\n\
1346Kill a process with a signal.";
1347
Barry Warsaw53699e91996-12-10 23:23:01 +00001348static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001349posix_kill(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001350 PyObject *self;
1351 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001352{
1353 int pid, sig;
Barry Warsaw53699e91996-12-10 23:23:01 +00001354 if (!PyArg_Parse(args, "(ii)", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001355 return NULL;
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001356#if defined(__TOS_OS2__)
1357 if (sig == XCPT_SIGNAL_INTR || sig == XCPT_SIGNAL_BREAK) {
1358 APIRET rc;
1359 if ((rc = DosSendSignalException(pid, sig)) != NO_ERROR)
1360 return posix_error();
1361
1362 } else if (sig == XCPT_SIGNAL_KILLPROC) {
1363 APIRET rc;
1364 if ((rc = DosKillProcess(DKP_PROCESS, pid)) != NO_ERROR)
1365 return posix_error();
1366
1367 } else
1368 return NULL; // Unrecognized Signal Requested
1369#else
Guido van Rossum85e3b011991-06-03 12:42:10 +00001370 if (kill(pid, sig) == -1)
1371 return posix_error();
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001372#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001373 Py_INCREF(Py_None);
1374 return Py_None;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001375}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001376#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001377
Guido van Rossumc0125471996-06-28 18:55:32 +00001378#ifdef HAVE_PLOCK
1379
1380#ifdef HAVE_SYS_LOCK_H
1381#include <sys/lock.h>
1382#endif
1383
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001384static char posix_plock__doc__[] =
1385"plock(op) -> None\n\
1386Lock program segments into memory.";
1387
Barry Warsaw53699e91996-12-10 23:23:01 +00001388static PyObject *
Guido van Rossumc0125471996-06-28 18:55:32 +00001389posix_plock(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001390 PyObject *self;
1391 PyObject *args;
Guido van Rossumc0125471996-06-28 18:55:32 +00001392{
1393 int op;
Barry Warsaw53699e91996-12-10 23:23:01 +00001394 if (!PyArg_Parse(args, "i", &op))
Guido van Rossumc0125471996-06-28 18:55:32 +00001395 return NULL;
1396 if (plock(op) == -1)
1397 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001398 Py_INCREF(Py_None);
1399 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00001400}
1401#endif
1402
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001403
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001404#ifdef HAVE_POPEN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001405static char posix_popen__doc__[] =
1406"popen(command [, mode='r' [, bufsize]]) -> pipe\n\
1407Open a pipe to/from a command returning a file object.";
1408
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001409#if defined(PYOS_OS2)
1410int
1411async_system(const char *command)
1412{
1413 char *p, errormsg[256], args[1024];
1414 RESULTCODES rcodes;
1415 APIRET rc;
1416 char *shell = getenv("COMSPEC");
1417 if (!shell)
1418 shell = "cmd";
1419
1420 strcpy(args, shell);
1421 p = &args[ strlen(args)+1 ];
1422 strcpy(p, "/c ");
1423 strcat(p, command);
1424 p += strlen(p) + 1;
1425 *p = '\0';
1426
1427 rc = DosExecPgm(errormsg, sizeof(errormsg),
1428 EXEC_ASYNC, // Execute Async w/o Wait for Results
1429 args,
1430 NULL, // Inherit Parent's Environment
1431 &rcodes, shell);
1432 return rc;
1433}
1434
1435FILE *
1436popen(const char *command, const char *mode, int pipesize)
1437{
1438 HFILE rhan, whan;
1439 FILE *retfd = NULL;
1440 APIRET rc = DosCreatePipe(&rhan, &whan, pipesize);
1441
1442 if (rc != NO_ERROR)
1443 return NULL; // ERROR - Unable to Create Anon Pipe
1444
1445 if (strchr(mode, 'r') != NULL) { // Treat Command as a Data Source
1446 int oldfd = dup(1); // Save STDOUT Handle in Another Handle
1447
1448 DosEnterCritSec(); // Stop Other Threads While Changing Handles
1449 close(1); // Make STDOUT Available for Reallocation
1450
1451 if (dup2(whan, 1) == 0) { // Connect STDOUT to Pipe Write Side
1452 DosClose(whan); // Close Now-Unused Pipe Write Handle
1453
1454 if (async_system(command) == NO_ERROR)
1455 retfd = fdopen(rhan, "rb"); // And Return Pipe Read Handle
1456 }
1457
1458 dup2(oldfd, 1); // Reconnect STDOUT to Original Handle
1459 DosExitCritSec(); // Now Allow Other Threads to Run
1460
1461 close(oldfd); // And Close Saved STDOUT Handle
1462 return retfd; // Return fd of Pipe or NULL if Error
1463
1464 } else if (strchr(mode, 'w')) { // Treat Command as a Data Sink
1465 int oldfd = dup(0); // Save STDIN Handle in Another Handle
1466
1467 DosEnterCritSec(); // Stop Other Threads While Changing Handles
1468 close(0); // Make STDIN Available for Reallocation
1469
1470 if (dup2(rhan, 0) == 0) { // Connect STDIN to Pipe Read Side
1471 DosClose(rhan); // Close Now-Unused Pipe Read Handle
1472
1473 if (async_system(command) == NO_ERROR)
1474 retfd = fdopen(whan, "wb"); // And Return Pipe Write Handle
1475 }
1476
1477 dup2(oldfd, 0); // Reconnect STDIN to Original Handle
1478 DosExitCritSec(); // Now Allow Other Threads to Run
1479
1480 close(oldfd); // And Close Saved STDIN Handle
1481 return retfd; // Return fd of Pipe or NULL if Error
1482
1483 } else
1484 return NULL; // ERROR - Invalid Mode (Neither Read nor Write)
1485}
1486
1487static PyObject *
1488posix_popen(self, args)
1489 PyObject *self;
1490 PyObject *args;
1491{
1492 char *name;
1493 char *mode = "r";
1494 int bufsize = -1;
1495 FILE *fp;
1496 PyObject *f;
1497 if (!PyArg_ParseTuple(args, "s|si", &name, &mode, &bufsize))
1498 return NULL;
1499 Py_BEGIN_ALLOW_THREADS
1500 fp = popen(name, mode, (bufsize > 0) ? bufsize : 4096);
1501 Py_END_ALLOW_THREADS
1502 if (fp == NULL)
1503 return posix_error();
1504 f = PyFile_FromFile(fp, name, mode, fclose);
1505 if (f != NULL)
1506 PyFile_SetBufSize(f, bufsize);
1507 return f;
1508}
1509
1510#else
Barry Warsaw53699e91996-12-10 23:23:01 +00001511static PyObject *
Guido van Rossum3b066191991-06-04 19:40:25 +00001512posix_popen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001513 PyObject *self;
1514 PyObject *args;
Guido van Rossum3b066191991-06-04 19:40:25 +00001515{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001516 char *name;
1517 char *mode = "r";
1518 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00001519 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00001520 PyObject *f;
1521 if (!PyArg_ParseTuple(args, "s|si", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00001522 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001523 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001524 fp = popen(name, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001525 Py_END_ALLOW_THREADS
Guido van Rossum3b066191991-06-04 19:40:25 +00001526 if (fp == NULL)
1527 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001528 f = PyFile_FromFile(fp, name, mode, pclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001529 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00001530 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001531 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00001532}
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00001533#endif
1534
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001535#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00001536
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001537
Guido van Rossumb6775db1994-08-01 11:34:53 +00001538#ifdef HAVE_SETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001539static char posix_setuid__doc__[] =
1540"setuid(uid) -> None\n\
1541Set the current process's user id.";
Barry Warsaw53699e91996-12-10 23:23:01 +00001542static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001543posix_setuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001544 PyObject *self;
1545 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001546{
1547 int uid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001548 if (!PyArg_Parse(args, "i", &uid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001549 return NULL;
1550 if (setuid(uid) < 0)
1551 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001552 Py_INCREF(Py_None);
1553 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001554}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001555#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001556
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001557
Guido van Rossumb6775db1994-08-01 11:34:53 +00001558#ifdef HAVE_SETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001559static char posix_setgid__doc__[] =
1560"setgid(gid) -> None\n\
1561Set the current process's group id.";
1562
Barry Warsaw53699e91996-12-10 23:23:01 +00001563static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001564posix_setgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001565 PyObject *self;
1566 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001567{
1568 int gid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001569 if (!PyArg_Parse(args, "i", &gid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001570 return NULL;
1571 if (setgid(gid) < 0)
1572 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001573 Py_INCREF(Py_None);
1574 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001575}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001576#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001577
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001578
Guido van Rossumb6775db1994-08-01 11:34:53 +00001579#ifdef HAVE_WAITPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001580static char posix_waitpid__doc__[] =
1581"waitpid(pid, options) -> (pid, status)\n\
1582Wait for completion of a give child process.";
1583
Barry Warsaw53699e91996-12-10 23:23:01 +00001584static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00001585posix_waitpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001586 PyObject *self;
1587 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001588{
Guido van Rossumfd03e2b1996-06-19 23:17:02 +00001589 int pid, options, sts = 0;
Barry Warsaw53699e91996-12-10 23:23:01 +00001590 if (!PyArg_Parse(args, "(ii)", &pid, &options))
Guido van Rossum21803b81992-08-09 12:55:27 +00001591 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001592 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb9f866c1997-05-22 15:12:39 +00001593#ifdef NeXT
1594 pid = wait4(pid, (union wait *)&sts, options, NULL);
1595#else
Guido van Rossum21803b81992-08-09 12:55:27 +00001596 pid = waitpid(pid, &sts, options);
Guido van Rossumb9f866c1997-05-22 15:12:39 +00001597#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001598 Py_END_ALLOW_THREADS
Guido van Rossum85e3b011991-06-03 12:42:10 +00001599 if (pid == -1)
1600 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00001601 else
Barry Warsaw53699e91996-12-10 23:23:01 +00001602 return Py_BuildValue("ii", pid, sts);
Guido van Rossum21803b81992-08-09 12:55:27 +00001603}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001604#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00001605
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001606
Guido van Rossumad0ee831995-03-01 10:34:45 +00001607#ifdef HAVE_WAIT
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001608static char posix_wait__doc__[] =
1609"wait() -> (pid, status)\n\
1610Wait for completion of a child process.";
1611
Barry Warsaw53699e91996-12-10 23:23:01 +00001612static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00001613posix_wait(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001614 PyObject *self;
1615 PyObject *args;
Guido van Rossum21803b81992-08-09 12:55:27 +00001616{
1617 int pid, sts;
Barry Warsaw53699e91996-12-10 23:23:01 +00001618 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb9f866c1997-05-22 15:12:39 +00001619#ifdef NeXT
1620 pid = wait((union wait *)&sts);
1621#else
Guido van Rossum21803b81992-08-09 12:55:27 +00001622 pid = wait(&sts);
Guido van Rossumb9f866c1997-05-22 15:12:39 +00001623#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001624 Py_END_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00001625 if (pid == -1)
1626 return posix_error();
1627 else
Barry Warsaw53699e91996-12-10 23:23:01 +00001628 return Py_BuildValue("ii", pid, sts);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001629}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001630#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001631
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001632
1633static char posix_lstat__doc__[] =
1634"lstat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
1635Like stat(path), but do not follow symbolic links.";
1636
Barry Warsaw53699e91996-12-10 23:23:01 +00001637static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001638posix_lstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001639 PyObject *self;
1640 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001641{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001642#ifdef HAVE_LSTAT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001643 return posix_do_stat(self, args, lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001644#else /* !HAVE_LSTAT */
1645 return posix_do_stat(self, args, stat);
1646#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001647}
1648
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001649
Guido van Rossumb6775db1994-08-01 11:34:53 +00001650#ifdef HAVE_READLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001651static char posix_readlink__doc__[] =
1652"readlink(path) -> path\n\
1653Return a string representing the path to which the symbolic link points.";
1654
Barry Warsaw53699e91996-12-10 23:23:01 +00001655static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001656posix_readlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001657 PyObject *self;
1658 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001659{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001660 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001661 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001662 int n;
Barry Warsaw53699e91996-12-10 23:23:01 +00001663 if (!PyArg_Parse(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001664 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001665 Py_BEGIN_ALLOW_THREADS
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001666 n = readlink(path, buf, (int) sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +00001667 Py_END_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001668 if (n < 0)
1669 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001670 return PyString_FromStringAndSize(buf, n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001671}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001672#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001673
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001674
Guido van Rossumb6775db1994-08-01 11:34:53 +00001675#ifdef HAVE_SYMLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001676static char posix_symlink__doc__[] =
1677"symlink(src, dst) -> None\n\
1678Create a symbolic link.";
1679
Barry Warsaw53699e91996-12-10 23:23:01 +00001680static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001681posix_symlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001682 PyObject *self;
1683 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001684{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001685 return posix_2str(args, symlink);
1686}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001687#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001688
Guido van Rossumb6775db1994-08-01 11:34:53 +00001689#ifdef HAVE_TIMES
1690#ifndef HZ
1691#define HZ 60 /* Universal constant :-) */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001692#endif /* HZ */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001693
Barry Warsaw53699e91996-12-10 23:23:01 +00001694static PyObject *
Guido van Rossum22db57e1992-04-05 14:25:30 +00001695posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001696 PyObject *self;
1697 PyObject *args;
Guido van Rossum22db57e1992-04-05 14:25:30 +00001698{
1699 struct tms t;
1700 clock_t c;
Barry Warsaw53699e91996-12-10 23:23:01 +00001701 if (!PyArg_NoArgs(args))
Guido van Rossum22db57e1992-04-05 14:25:30 +00001702 return NULL;
1703 errno = 0;
1704 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00001705 if (c == (clock_t) -1)
1706 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001707 return Py_BuildValue("ddddd",
Barry Warsaw43d68b81996-12-19 22:10:44 +00001708 (double)t.tms_utime / HZ,
1709 (double)t.tms_stime / HZ,
1710 (double)t.tms_cutime / HZ,
1711 (double)t.tms_cstime / HZ,
1712 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00001713}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001714#endif /* HAVE_TIMES */
Guido van Rossum87755a21996-09-07 00:59:43 +00001715#ifdef MS_WIN32
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001716#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00001717static PyObject *
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001718posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001719 PyObject *self;
1720 PyObject *args;
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001721{
1722 FILETIME create, exit, kernel, user;
1723 HANDLE hProc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001724 if (!PyArg_NoArgs(args))
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001725 return NULL;
1726 hProc = GetCurrentProcess();
1727 GetProcessTimes(hProc,&create, &exit, &kernel, &user);
Barry Warsaw53699e91996-12-10 23:23:01 +00001728 return Py_BuildValue(
1729 "ddddd",
1730 (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime)/2E6,
1731 (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6,
1732 (double)0,
1733 (double)0,
1734 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001735}
Guido van Rossum8d665e61996-06-26 18:22:49 +00001736#endif /* MS_WIN32 */
Roger E. Masse0318fd61997-06-05 22:07:58 +00001737static char posix_times__doc__[] =
1738"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\
1739Return a tuple of floating point numbers indicating process times.";
Guido van Rossum22db57e1992-04-05 14:25:30 +00001740
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001741
Guido van Rossumb6775db1994-08-01 11:34:53 +00001742#ifdef HAVE_SETSID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001743static char posix_setsid__doc__[] =
1744"setsid() -> None\n\
1745Call the system call setsid().";
1746
Barry Warsaw53699e91996-12-10 23:23:01 +00001747static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001748posix_setsid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001749 PyObject *self;
1750 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001751{
Barry Warsaw53699e91996-12-10 23:23:01 +00001752 if (!PyArg_NoArgs(args))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001753 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001754 if (setsid() < 0)
1755 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001756 Py_INCREF(Py_None);
1757 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001758}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001759#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001760
Guido van Rossumb6775db1994-08-01 11:34:53 +00001761#ifdef HAVE_SETPGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001762static char posix_setpgid__doc__[] =
1763"setpgid(pid, pgrp) -> None\n\
1764Call the system call setpgid().";
1765
Barry Warsaw53699e91996-12-10 23:23:01 +00001766static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001767posix_setpgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001768 PyObject *self;
1769 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001770{
1771 int pid, pgrp;
Barry Warsaw53699e91996-12-10 23:23:01 +00001772 if (!PyArg_Parse(args, "(ii)", &pid, &pgrp))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001773 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001774 if (setpgid(pid, pgrp) < 0)
1775 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001776 Py_INCREF(Py_None);
1777 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001778}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001779#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001780
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001781
Guido van Rossumb6775db1994-08-01 11:34:53 +00001782#ifdef HAVE_TCGETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001783static char posix_tcgetpgrp__doc__[] =
1784"tcgetpgrp(fd) -> pgid\n\
1785Return the process group associated with the terminal given by a fd.";
1786
Barry Warsaw53699e91996-12-10 23:23:01 +00001787static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00001788posix_tcgetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001789 PyObject *self;
1790 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001791{
1792 int fd, pgid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001793 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum7066dd71992-09-17 17:54:56 +00001794 return NULL;
1795 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001796 if (pgid < 0)
1797 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001798 return PyInt_FromLong((long)pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00001799}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001800#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00001801
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001802
Guido van Rossumb6775db1994-08-01 11:34:53 +00001803#ifdef HAVE_TCSETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001804static char posix_tcsetpgrp__doc__[] =
1805"tcsetpgrp(fd, pgid) -> None\n\
1806Set the process group associated with the terminal given by a fd.";
1807
Barry Warsaw53699e91996-12-10 23:23:01 +00001808static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00001809posix_tcsetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001810 PyObject *self;
1811 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001812{
1813 int fd, pgid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001814 if (!PyArg_Parse(args, "(ii)", &fd, &pgid))
Guido van Rossum7066dd71992-09-17 17:54:56 +00001815 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001816 if (tcsetpgrp(fd, pgid) < 0)
1817 return posix_error();
Barry Warsaw43d68b81996-12-19 22:10:44 +00001818 Py_INCREF(Py_None);
Barry Warsaw53699e91996-12-10 23:23:01 +00001819 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001820}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001821#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001822
Guido van Rossum687dd131993-05-17 08:34:16 +00001823/* Functions acting on file descriptors */
1824
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001825static char posix_open__doc__[] =
1826"open(filename, flag [, mode=0777]) -> fd\n\
1827Open a file (for low level IO).";
1828
Barry Warsaw53699e91996-12-10 23:23:01 +00001829static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001830posix_open(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001831 PyObject *self;
1832 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001833{
1834 char *file;
1835 int flag;
1836 int mode = 0777;
1837 int fd;
Barry Warsaw43d68b81996-12-19 22:10:44 +00001838 if (!PyArg_ParseTuple(args, "si|i", &file, &flag, &mode))
1839 return NULL;
1840
Barry Warsaw53699e91996-12-10 23:23:01 +00001841 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001842 fd = open(file, flag, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001843 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001844 if (fd < 0)
1845 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001846 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001847}
1848
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001849
1850static char posix_close__doc__[] =
1851"close(fd) -> None\n\
1852Close a file descriptor (for low level IO).";
1853
Barry Warsaw53699e91996-12-10 23:23:01 +00001854static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001855posix_close(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001856 PyObject *self;
1857 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001858{
1859 int fd, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001860 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00001861 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001862 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001863 res = close(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00001864 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001865 if (res < 0)
1866 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001867 Py_INCREF(Py_None);
1868 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00001869}
1870
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001871
1872static char posix_dup__doc__[] =
1873"dup(fd) -> fd2\n\
1874Return a duplicate of a file descriptor.";
1875
Barry Warsaw53699e91996-12-10 23:23:01 +00001876static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001877posix_dup(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001878 PyObject *self;
1879 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001880{
1881 int fd;
Barry Warsaw53699e91996-12-10 23:23:01 +00001882 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00001883 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001884 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001885 fd = dup(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00001886 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001887 if (fd < 0)
1888 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001889 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001890}
1891
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001892
1893static char posix_dup2__doc__[] =
1894"dup2(fd, fd2) -> None\n\
1895Duplicate file descriptor.";
1896
Barry Warsaw53699e91996-12-10 23:23:01 +00001897static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001898posix_dup2(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001899 PyObject *self;
1900 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001901{
1902 int fd, fd2, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001903 if (!PyArg_Parse(args, "(ii)", &fd, &fd2))
Guido van Rossum687dd131993-05-17 08:34:16 +00001904 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001905 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001906 res = dup2(fd, fd2);
Barry Warsaw53699e91996-12-10 23:23:01 +00001907 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001908 if (res < 0)
1909 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001910 Py_INCREF(Py_None);
1911 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00001912}
1913
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001914
1915static char posix_lseek__doc__[] =
1916"lseek(fd, pos, how) -> newpos\n\
1917Set the current position of a file descriptor.";
1918
Barry Warsaw53699e91996-12-10 23:23:01 +00001919static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001920posix_lseek(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001921 PyObject *self;
1922 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001923{
1924 int fd, how;
1925 long pos, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001926 if (!PyArg_Parse(args, "(ili)", &fd, &pos, &how))
Guido van Rossum687dd131993-05-17 08:34:16 +00001927 return NULL;
1928#ifdef SEEK_SET
1929 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
1930 switch (how) {
1931 case 0: how = SEEK_SET; break;
1932 case 1: how = SEEK_CUR; break;
1933 case 2: how = SEEK_END; break;
1934 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001935#endif /* SEEK_END */
Barry Warsaw53699e91996-12-10 23:23:01 +00001936 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001937 res = lseek(fd, pos, how);
Barry Warsaw53699e91996-12-10 23:23:01 +00001938 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001939 if (res < 0)
1940 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001941 return PyInt_FromLong(res);
Guido van Rossum687dd131993-05-17 08:34:16 +00001942}
1943
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001944
1945static char posix_read__doc__[] =
1946"read(fd, buffersize) -> string\n\
1947Read a file descriptor.";
1948
Barry Warsaw53699e91996-12-10 23:23:01 +00001949static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001950posix_read(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001951 PyObject *self;
1952 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001953{
Guido van Rossum8bac5461996-06-11 18:38:48 +00001954 int fd, size, n;
Barry Warsaw53699e91996-12-10 23:23:01 +00001955 PyObject *buffer;
1956 if (!PyArg_Parse(args, "(ii)", &fd, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00001957 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001958 buffer = PyString_FromStringAndSize((char *)NULL, size);
Guido van Rossum687dd131993-05-17 08:34:16 +00001959 if (buffer == NULL)
1960 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001961 Py_BEGIN_ALLOW_THREADS
1962 n = read(fd, PyString_AsString(buffer), size);
1963 Py_END_ALLOW_THREADS
Guido van Rossum8bac5461996-06-11 18:38:48 +00001964 if (n < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001965 Py_DECREF(buffer);
Guido van Rossum687dd131993-05-17 08:34:16 +00001966 return posix_error();
1967 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00001968 if (n != size)
Barry Warsaw53699e91996-12-10 23:23:01 +00001969 _PyString_Resize(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00001970 return buffer;
1971}
1972
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001973
1974static char posix_write__doc__[] =
1975"write(fd, string) -> byteswritten\n\
1976Write a string to a file descriptor.";
1977
Barry Warsaw53699e91996-12-10 23:23:01 +00001978static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001979posix_write(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001980 PyObject *self;
1981 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001982{
1983 int fd, size;
1984 char *buffer;
Barry Warsaw53699e91996-12-10 23:23:01 +00001985 if (!PyArg_Parse(args, "(is#)", &fd, &buffer, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00001986 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001987 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001988 size = write(fd, buffer, size);
Barry Warsaw53699e91996-12-10 23:23:01 +00001989 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001990 if (size < 0)
1991 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001992 return PyInt_FromLong((long)size);
Guido van Rossum687dd131993-05-17 08:34:16 +00001993}
1994
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001995
1996static char posix_fstat__doc__[]=
1997"fstat(fd) -> (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\
1998Like stat(), but for an open file descriptor.";
1999
Barry Warsaw53699e91996-12-10 23:23:01 +00002000static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002001posix_fstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002002 PyObject *self;
2003 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002004{
2005 int fd;
2006 struct stat st;
2007 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00002008 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00002009 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002010 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002011 res = fstat(fd, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00002012 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002013 if (res != 0)
2014 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002015 return Py_BuildValue("(llllllllll)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00002016 (long)st.st_mode,
2017 (long)st.st_ino,
2018 (long)st.st_dev,
2019 (long)st.st_nlink,
2020 (long)st.st_uid,
2021 (long)st.st_gid,
2022 (long)st.st_size,
2023 (long)st.st_atime,
2024 (long)st.st_mtime,
2025 (long)st.st_ctime);
Guido van Rossum687dd131993-05-17 08:34:16 +00002026}
2027
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002028
2029static char posix_fdopen__doc__[] =
2030"fdopen(fd, [, mode='r' [, bufsize]]) -> file_object\n\
2031Return an open file object connected to a file descriptor.";
2032
Barry Warsaw53699e91996-12-10 23:23:01 +00002033static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002034posix_fdopen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002035 PyObject *self;
2036 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002037{
Barry Warsaw53699e91996-12-10 23:23:01 +00002038 extern int fclose Py_PROTO((FILE *));
Guido van Rossum687dd131993-05-17 08:34:16 +00002039 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002040 char *mode = "r";
2041 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00002042 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00002043 PyObject *f;
2044 if (!PyArg_ParseTuple(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00002045 return NULL;
Barry Warsaw43d68b81996-12-19 22:10:44 +00002046
Barry Warsaw53699e91996-12-10 23:23:01 +00002047 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002048 fp = fdopen(fd, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002049 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002050 if (fp == NULL)
2051 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002052 f = PyFile_FromFile(fp, "(fdopen)", mode, fclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002053 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002054 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00002055 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00002056}
2057
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002058
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002059#ifdef HAVE_PIPE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002060static char posix_pipe__doc__[] =
2061"pipe() -> (read_end, write_end)\n\
2062Create a pipe.";
2063
Barry Warsaw53699e91996-12-10 23:23:01 +00002064static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00002065posix_pipe(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002066 PyObject *self;
2067 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00002068{
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002069#if defined(PYOS_OS2)
2070 HFILE read, write;
2071 APIRET rc;
2072
2073 if (!PyArg_Parse(args, ""))
2074 return NULL;
2075
2076 Py_BEGIN_ALLOW_THREADS
2077 rc = DosCreatePipe( &read, &write, 4096);
2078 Py_END_ALLOW_THREADS
2079 if (rc != NO_ERROR)
2080 return posix_error();
2081
2082 return Py_BuildValue("(ii)", read, write);
2083#else
Guido van Rossum8d665e61996-06-26 18:22:49 +00002084#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00002085 int fds[2];
2086 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00002087 if (!PyArg_Parse(args, ""))
Guido van Rossum687dd131993-05-17 08:34:16 +00002088 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002089 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002090 res = pipe(fds);
Barry Warsaw53699e91996-12-10 23:23:01 +00002091 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00002092 if (res != 0)
2093 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002094 return Py_BuildValue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002095#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00002096 HANDLE read, write;
2097 BOOL ok;
Barry Warsaw53699e91996-12-10 23:23:01 +00002098 if (!PyArg_Parse(args, ""))
Guido van Rossum794d8131994-08-23 13:48:48 +00002099 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002100 Py_BEGIN_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00002101 ok = CreatePipe( &read, &write, NULL, 0);
Barry Warsaw53699e91996-12-10 23:23:01 +00002102 Py_END_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00002103 if (!ok)
2104 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002105 return Py_BuildValue("(ii)", read, write);
Guido van Rossum8d665e61996-06-26 18:22:49 +00002106#endif /* MS_WIN32 */
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002107#endif
Guido van Rossum687dd131993-05-17 08:34:16 +00002108}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002109#endif /* HAVE_PIPE */
2110
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002111
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002112#ifdef HAVE_MKFIFO
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002113static char posix_mkfifo__doc__[] =
2114"mkfifo(file, [, mode=0666]) -> None\n\
2115Create a FIFO (a POSIX named pipe).";
2116
Barry Warsaw53699e91996-12-10 23:23:01 +00002117static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002118posix_mkfifo(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002119 PyObject *self;
2120 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002121{
2122 char *file;
2123 int mode = 0666;
2124 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00002125 if (!PyArg_ParseTuple(args, "s|i", &file, &mode))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002126 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00002127 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002128 res = mkfifo(file, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00002129 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002130 if (res < 0)
2131 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00002132 Py_INCREF(Py_None);
2133 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002134}
2135#endif
2136
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002137
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002138#ifdef HAVE_FTRUNCATE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002139static char posix_ftruncate__doc__[] =
2140"ftruncate(fd, length) -> None\n\
2141Truncate a file to a specified length.";
2142
Barry Warsaw53699e91996-12-10 23:23:01 +00002143static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002144posix_ftruncate(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002145 PyObject *self; /* Not used */
2146 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002147{
2148 int fd;
2149 long length;
2150 int res;
2151
Barry Warsaw53699e91996-12-10 23:23:01 +00002152 if (!PyArg_Parse(args, "(il)", &fd, &length))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002153 return NULL;
2154
Barry Warsaw53699e91996-12-10 23:23:01 +00002155 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002156 res = ftruncate(fd, length);
Barry Warsaw53699e91996-12-10 23:23:01 +00002157 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002158 if (res < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00002159 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002160 return NULL;
2161 }
Barry Warsaw53699e91996-12-10 23:23:01 +00002162 Py_INCREF(Py_None);
2163 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002164}
2165#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00002166
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002167#ifdef NeXT
2168#define HAVE_PUTENV
2169/* Steve Spicklemire got this putenv from NeXTAnswers */
2170static int
2171putenv(char *newval)
2172{
2173 extern char **environ;
2174
2175 static int firstTime = 1;
2176 char **ep;
2177 char *cp;
2178 int esiz;
2179 char *np;
2180
2181 if (!(np = strchr(newval, '=')))
2182 return 1;
2183 *np = '\0';
2184
2185 /* look it up */
2186 for (ep=environ ; *ep ; ep++)
2187 {
2188 /* this should always be true... */
2189 if (cp = strchr(*ep, '='))
2190 {
2191 *cp = '\0';
2192 if (!strcmp(*ep, newval))
2193 {
2194 /* got it! */
2195 *cp = '=';
2196 break;
2197 }
2198 *cp = '=';
2199 }
2200 else
2201 {
2202 *np = '=';
2203 return 1;
2204 }
2205 }
2206
2207 *np = '=';
2208 if (*ep)
2209 {
2210 /* the string was already there:
2211 just replace it with the new one */
2212 *ep = newval;
2213 return 0;
2214 }
2215
2216 /* expand environ by one */
2217 for (esiz=2, ep=environ ; *ep ; ep++)
2218 esiz++;
2219 if (firstTime)
2220 {
2221 char **epp;
2222 char **newenv;
2223 if (!(newenv = malloc(esiz * sizeof(char *))))
2224 return 1;
2225
2226 for (ep=environ, epp=newenv ; *ep ;)
2227 *epp++ = *ep++;
2228 *epp++ = newval;
2229 *epp = (char *) 0;
2230 environ = newenv;
2231 }
2232 else
2233 {
2234 if (!(environ = realloc(environ, esiz * sizeof(char *))))
2235 return 1;
2236 environ[esiz - 2] = newval;
2237 environ[esiz - 1] = (char *) 0;
2238 firstTime = 0;
2239 }
2240
2241 return 0;
2242}
Guido van Rossumc6ef2041997-08-21 02:30:45 +00002243#endif /* NeXT */
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002244
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002245
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002246#ifdef HAVE_PUTENV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002247static char posix_putenv__doc__[] =
2248"putenv(key, value) -> None\n\
2249Change or add an environment variable.";
2250
Barry Warsaw53699e91996-12-10 23:23:01 +00002251static PyObject *
Guido van Rossumb6a47161997-09-15 22:54:34 +00002252posix_putenv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002253 PyObject *self;
2254 PyObject *args;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002255{
2256 char *s1, *s2;
2257 char *new;
2258
Barry Warsaw53699e91996-12-10 23:23:01 +00002259 if (!PyArg_ParseTuple(args, "ss", &s1, &s2))
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002260 return NULL;
2261 /* XXX This leaks memory -- not easy to fix :-( */
2262 if ((new = malloc(strlen(s1) + strlen(s2) + 2)) == NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002263 return PyErr_NoMemory();
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002264 (void) sprintf(new, "%s=%s", s1, s2);
2265 if (putenv(new)) {
2266 posix_error();
2267 return NULL;
2268 }
Barry Warsaw53699e91996-12-10 23:23:01 +00002269 Py_INCREF(Py_None);
2270 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002271}
Guido van Rossumb6a47161997-09-15 22:54:34 +00002272#endif /* putenv */
2273
2274#ifdef HAVE_STRERROR
2275static char posix_strerror__doc__[] =
2276"strerror(code) -> string\n\
2277Translate an error code to a message string.";
2278
2279PyObject *
2280posix_strerror(self, args)
2281 PyObject *self;
2282 PyObject *args;
2283{
2284 int code;
2285 char *message;
2286 if (!PyArg_ParseTuple(args, "i", &code))
2287 return NULL;
2288 message = strerror(code);
2289 if (message == NULL) {
2290 PyErr_SetString(PyExc_ValueError,
2291 "strerror code out of range");
2292 return NULL;
2293 }
2294 return PyString_FromString(message);
2295}
2296#endif /* strerror */
2297
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002298
Barry Warsaw53699e91996-12-10 23:23:01 +00002299static PyMethodDef posix_methods[] = {
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002300 {"chdir", posix_chdir, 0, posix_chdir__doc__},
2301 {"chmod", posix_chmod, 0, posix_chmod__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002302#ifdef HAVE_CHOWN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002303 {"chown", posix_chown, 0, posix_chown__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002304#endif /* HAVE_CHOWN */
Guido van Rossum36bc6801995-06-14 22:54:23 +00002305#ifdef HAVE_GETCWD
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002306 {"getcwd", posix_getcwd, 0, posix_getcwd__doc__},
Guido van Rossum36bc6801995-06-14 22:54:23 +00002307#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002308#ifdef HAVE_LINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002309 {"link", posix_link, 0, posix_link__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002310#endif /* HAVE_LINK */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002311 {"listdir", posix_listdir, 0, posix_listdir__doc__},
2312 {"lstat", posix_lstat, 0, posix_lstat__doc__},
2313 {"mkdir", posix_mkdir, 1, posix_mkdir__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002314#ifdef HAVE_NICE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002315 {"nice", posix_nice, 0, posix_nice__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002316#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002317#ifdef HAVE_READLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002318 {"readlink", posix_readlink, 0, posix_readlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002319#endif /* HAVE_READLINK */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002320 {"rename", posix_rename, 0, posix_rename__doc__},
2321 {"rmdir", posix_rmdir, 0, posix_rmdir__doc__},
2322 {"stat", posix_stat, 0, posix_stat__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002323#ifdef HAVE_SYMLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002324 {"symlink", posix_symlink, 0, posix_symlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002325#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002326#ifdef HAVE_SYSTEM
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002327 {"system", posix_system, 0, posix_system__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002328#endif
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002329 {"umask", posix_umask, 0, posix_umask__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002330#ifdef HAVE_UNAME
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002331 {"uname", posix_uname, 0, posix_uname__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002332#endif /* HAVE_UNAME */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002333 {"unlink", posix_unlink, 0, posix_unlink__doc__},
2334 {"remove", posix_unlink, 0, posix_remove__doc__},
2335 {"utime", posix_utime, 0, posix_utime__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002336#ifdef HAVE_TIMES
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002337 {"times", posix_times, 0, posix_times__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002338#endif /* HAVE_TIMES */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002339 {"_exit", posix__exit, 0, posix__exit__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002340#ifdef HAVE_EXECV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002341 {"execv", posix_execv, 0, posix_execv__doc__},
2342 {"execve", posix_execve, 0, posix_execve__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002343#endif /* HAVE_EXECV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00002344#ifdef HAVE_FORK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002345 {"fork", posix_fork, 0, posix_fork__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002346#endif /* HAVE_FORK */
2347#ifdef HAVE_GETEGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002348 {"getegid", posix_getegid, 0, posix_getegid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002349#endif /* HAVE_GETEGID */
2350#ifdef HAVE_GETEUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002351 {"geteuid", posix_geteuid, 0, posix_geteuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002352#endif /* HAVE_GETEUID */
2353#ifdef HAVE_GETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002354 {"getgid", posix_getgid, 0, posix_getgid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002355#endif /* HAVE_GETGID */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002356 {"getpid", posix_getpid, 0, posix_getpid__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002357#ifdef HAVE_GETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002358 {"getpgrp", posix_getpgrp, 0, posix_getpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002359#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00002360#ifdef HAVE_GETPPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002361 {"getppid", posix_getppid, 0, posix_getppid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002362#endif /* HAVE_GETPPID */
2363#ifdef HAVE_GETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002364 {"getuid", posix_getuid, 0, posix_getuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002365#endif /* HAVE_GETUID */
2366#ifdef HAVE_KILL
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002367 {"kill", posix_kill, 0, posix_kill__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002368#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00002369#ifdef HAVE_PLOCK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002370 {"plock", posix_plock, 0, posix_plock__doc__},
Guido van Rossumc0125471996-06-28 18:55:32 +00002371#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002372#ifdef HAVE_POPEN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002373 {"popen", posix_popen, 1, posix_popen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002374#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002375#ifdef HAVE_SETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002376 {"setuid", posix_setuid, 0, posix_setuid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002377#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002378#ifdef HAVE_SETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002379 {"setgid", posix_setgid, 0, posix_setgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002380#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002381#ifdef HAVE_SETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002382 {"setpgrp", posix_setpgrp, 0, posix_setpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002383#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00002384#ifdef HAVE_WAIT
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002385 {"wait", posix_wait, 0, posix_wait__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002386#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002387#ifdef HAVE_WAITPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002388 {"waitpid", posix_waitpid, 0, posix_waitpid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002389#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002390#ifdef HAVE_SETSID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002391 {"setsid", posix_setsid, 0, posix_setsid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002392#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002393#ifdef HAVE_SETPGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002394 {"setpgid", posix_setpgid, 0, posix_setpgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002395#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002396#ifdef HAVE_TCGETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002397 {"tcgetpgrp", posix_tcgetpgrp, 0, posix_tcgetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002398#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002399#ifdef HAVE_TCSETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002400 {"tcsetpgrp", posix_tcsetpgrp, 0, posix_tcsetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002401#endif /* HAVE_TCSETPGRP */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002402 {"open", posix_open, 1, posix_open__doc__},
2403 {"close", posix_close, 0, posix_close__doc__},
2404 {"dup", posix_dup, 0, posix_dup__doc__},
2405 {"dup2", posix_dup2, 0, posix_dup2__doc__},
2406 {"lseek", posix_lseek, 0, posix_lseek__doc__},
2407 {"read", posix_read, 0, posix_read__doc__},
2408 {"write", posix_write, 0, posix_write__doc__},
2409 {"fstat", posix_fstat, 0, posix_fstat__doc__},
2410 {"fdopen", posix_fdopen, 1, posix_fdopen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002411#ifdef HAVE_PIPE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002412 {"pipe", posix_pipe, 0, posix_pipe__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002413#endif
2414#ifdef HAVE_MKFIFO
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002415 {"mkfifo", posix_mkfifo, 1, posix_mkfifo__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002416#endif
2417#ifdef HAVE_FTRUNCATE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002418 {"ftruncate", posix_ftruncate, 1, posix_ftruncate__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002419#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002420#ifdef HAVE_PUTENV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002421 {"putenv", posix_putenv, 1, posix_putenv__doc__},
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002422#endif
Guido van Rossumb6a47161997-09-15 22:54:34 +00002423#ifdef HAVE_STRERROR
2424 {"strerror", posix_strerror, 1, posix_strerror__doc__},
2425#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002426 {NULL, NULL} /* Sentinel */
2427};
2428
2429
Barry Warsaw4a342091996-12-19 23:50:02 +00002430static int
2431ins(d, symbol, value)
2432 PyObject* d;
2433 char* symbol;
2434 long value;
2435{
2436 PyObject* v = PyInt_FromLong(value);
2437 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
2438 return -1; /* triggers fatal error */
2439
2440 Py_DECREF(v);
2441 return 0;
2442}
2443
2444static int
2445all_ins(d)
2446 PyObject* d;
2447{
2448#ifdef WNOHANG
2449 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
2450#endif
2451#ifdef O_RDONLY
2452 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
2453#endif
2454#ifdef O_WRONLY
2455 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
2456#endif
2457#ifdef O_RDWR
2458 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
2459#endif
2460#ifdef O_NDELAY
2461 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
2462#endif
2463#ifdef O_NONBLOCK
2464 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
2465#endif
2466#ifdef O_APPEND
2467 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
2468#endif
2469#ifdef O_DSYNC
2470 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
2471#endif
2472#ifdef O_RSYNC
2473 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
2474#endif
2475#ifdef O_SYNC
2476 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
2477#endif
2478#ifdef O_NOCTTY
2479 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
2480#endif
2481#ifdef O_CREAT
2482 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
2483#endif
2484#ifdef O_EXCL
2485 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
2486#endif
2487#ifdef O_TRUNC
2488 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
2489#endif
Guido van Rossum98d9d091997-08-08 21:48:51 +00002490#ifdef O_BINARY
2491 if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
2492#endif
2493#ifdef O_TEXT
2494 if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
2495#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00002496 return 0;
2497}
2498
2499
Guido van Rossuma0e71301996-05-28 22:30:38 +00002500#if defined(_MSC_VER) || defined(__WATCOMC__)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002501#define INITFUNC initnt
2502#define MODNAME "nt"
2503#else
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002504#if defined(PYOS_OS2)
2505#define INITFUNC initos2
2506#define MODNAME "os2"
2507#else
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002508#define INITFUNC initposix
2509#define MODNAME "posix"
2510#endif
Guido van Rossum8e9ebfd1997-11-22 21:53:48 +00002511#endif
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002512
Guido van Rossumb6775db1994-08-01 11:34:53 +00002513void
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002514INITFUNC()
Guido van Rossumb6775db1994-08-01 11:34:53 +00002515{
Barry Warsaw53699e91996-12-10 23:23:01 +00002516 PyObject *m, *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00002517
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002518 m = Py_InitModule4(MODNAME,
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002519 posix_methods,
2520 posix__doc__,
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002521 (PyObject *)NULL,
2522 PYTHON_API_VERSION);
Barry Warsaw53699e91996-12-10 23:23:01 +00002523 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002524
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002525 /* Initialize environ dictionary */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002526 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00002527 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002528 return;
Barry Warsaw53699e91996-12-10 23:23:01 +00002529 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002530
Barry Warsaw4a342091996-12-19 23:50:02 +00002531 if (all_ins(d))
Barry Warsaw4a342091996-12-19 23:50:02 +00002532 return;
2533
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002534 /* Initialize exception */
2535 PosixError = PyErr_NewException("os.error", NULL, NULL);
2536 if (PosixError != NULL)
2537 PyDict_SetItemString(d, "error", PosixError);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002538}