blob: 58111efda5eb3cc450c8e309a95cfcc2d71f944b [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
49
50
Barry Warsaw53699e91996-12-10 23:23:01 +000051#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052
Guido van Rossumb6775db1994-08-01 11:34:53 +000053#include <sys/types.h>
54#include <sys/stat.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +000055#ifdef HAVE_SYS_WAIT_H
56#include <sys/wait.h> /* For WNOHANG */
57#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000058
Guido van Rossuma376cc51996-12-05 23:43:35 +000059#ifdef HAVE_SIGNAL_H
60#include <signal.h>
61#endif
62
Guido van Rossumb6775db1994-08-01 11:34:53 +000063#include "mytime.h" /* For clock_t on some systems */
64
65#ifdef HAVE_FCNTL_H
66#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000067#endif /* HAVE_FCNTL_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +000068
Guido van Rossuma4916fa1996-05-23 22:58:55 +000069/* Various compilers have only certain posix functions */
Guido van Rossum6d8841c1997-08-14 19:57:39 +000070/* XXX Gosh I wish these were all moved into config.h */
Guido van Rossuma4916fa1996-05-23 22:58:55 +000071#ifdef __WATCOMC__ /* Watcom compiler */
72#define HAVE_GETCWD 1
73#define HAVE_OPENDIR 1
74#define HAVE_SYSTEM 1
75#if defined(__OS2__)
76#define HAVE_EXECV 1
77#define HAVE_WAIT 1
Guido van Rossumad0ee831995-03-01 10:34:45 +000078#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +000079#include <process.h>
80#else
81#ifdef __BORLANDC__ /* Borland compiler */
82#define HAVE_EXECV 1
83#define HAVE_GETCWD 1
84#define HAVE_GETEGID 1
85#define HAVE_GETEUID 1
86#define HAVE_GETGID 1
87#define HAVE_GETPPID 1
88#define HAVE_GETUID 1
89#define HAVE_KILL 1
90#define HAVE_OPENDIR 1
91#define HAVE_PIPE 1
92#define HAVE_POPEN 1
93#define HAVE_SYSTEM 1
94#define HAVE_WAIT 1
95#else
96#ifdef _MSC_VER /* Microsoft compiler */
Guido van Rossum8d665e61996-06-26 18:22:49 +000097#define HAVE_GETCWD 1
98#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +000099#define HAVE_EXECV 1
100#define HAVE_PIPE 1
101#define HAVE_POPEN 1
102#define HAVE_SYSTEM 1
103#else /* 16-bit Windows */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000104#endif /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000105#else /* all other compilers */
106/* Unix functions that the configure script doesn't check for */
107#define HAVE_EXECV 1
108#define HAVE_FORK 1
109#define HAVE_GETCWD 1
110#define HAVE_GETEGID 1
111#define HAVE_GETEUID 1
112#define HAVE_GETGID 1
113#define HAVE_GETPPID 1
114#define HAVE_GETUID 1
115#define HAVE_KILL 1
116#define HAVE_OPENDIR 1
117#define HAVE_PIPE 1
118#define HAVE_POPEN 1
119#define HAVE_SYSTEM 1
120#define HAVE_WAIT 1
121#endif /* _MSC_VER */
122#endif /* __BORLANDC__ */
123#endif /* ! __WATCOMC__ */
Guido van Rossumad0ee831995-03-01 10:34:45 +0000124
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000125#ifndef _MSC_VER
Guido van Rossum36bc6801995-06-14 22:54:23 +0000126
Guido van Rossumb6775db1994-08-01 11:34:53 +0000127#ifdef HAVE_UNISTD_H
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000128#include <unistd.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +0000129#endif
130
131#ifdef NeXT
132/* NeXT's <unistd.h> and <utime.h> aren't worth much */
133#undef HAVE_UNISTD_H
134#undef HAVE_UTIME_H
Guido van Rossumb9f866c1997-05-22 15:12:39 +0000135#define HAVE_WAITPID
Guido van Rossum36bc6801995-06-14 22:54:23 +0000136/* #undef HAVE_GETCWD */
137#endif
138
139#ifdef HAVE_UNISTD_H
Guido van Rossumad0ee831995-03-01 10:34:45 +0000140/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
141extern int rename();
142extern int pclose();
143extern int lstat();
144extern int symlink();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000145#else /* !HAVE_UNISTD_H */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000146#if defined(__WATCOMC__) || defined(_MSC_VER)
Barry Warsaw53699e91996-12-10 23:23:01 +0000147extern int mkdir Py_PROTO((const char *));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000148#else
Barry Warsaw53699e91996-12-10 23:23:01 +0000149extern int mkdir Py_PROTO((const char *, mode_t));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000150#endif
Barry Warsaw53699e91996-12-10 23:23:01 +0000151extern int chdir Py_PROTO((const char *));
152extern int rmdir Py_PROTO((const char *));
153extern int chmod Py_PROTO((const char *, mode_t));
154extern int chown Py_PROTO((const char *, uid_t, gid_t));
155extern char *getcwd Py_PROTO((char *, int));
156extern char *strerror Py_PROTO((int));
157extern int link Py_PROTO((const char *, const char *));
158extern int rename Py_PROTO((const char *, const char *));
159extern int stat Py_PROTO((const char *, struct stat *));
160extern int unlink Py_PROTO((const char *));
161extern int pclose Py_PROTO((FILE *));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000162#ifdef HAVE_SYMLINK
Barry Warsaw53699e91996-12-10 23:23:01 +0000163extern int symlink Py_PROTO((const char *, const char *));
Guido van Rossuma38a5031995-02-17 15:11:36 +0000164#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000165#ifdef HAVE_LSTAT
Barry Warsaw53699e91996-12-10 23:23:01 +0000166extern int lstat Py_PROTO((const char *, struct stat *));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000167#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000168#endif /* !HAVE_UNISTD_H */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000169
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000170#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000171
Guido van Rossumb6775db1994-08-01 11:34:53 +0000172#ifdef HAVE_UTIME_H
173#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000174#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000175
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000176#ifdef HAVE_SYS_UTIME_H
177#include <sys/utime.h>
178#define HAVE_UTIME_H /* pretend we do for the rest of this file */
179#endif /* HAVE_SYS_UTIME_H */
180
Guido van Rossumb6775db1994-08-01 11:34:53 +0000181#ifdef HAVE_SYS_TIMES_H
182#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000183#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000184
185#ifdef HAVE_SYS_PARAM_H
186#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000187#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000188
189#ifdef HAVE_SYS_UTSNAME_H
190#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000191#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000192
193#ifndef MAXPATHLEN
194#define MAXPATHLEN 1024
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000195#endif /* MAXPATHLEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000196
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000197#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000198#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000199#define NAMLEN(dirent) strlen((dirent)->d_name)
200#else
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000201#ifdef __WATCOMC__
202#include <direct.h>
203#define NAMLEN(dirent) strlen((dirent)->d_name)
204#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000205#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000206#define NAMLEN(dirent) (dirent)->d_namlen
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000207#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000208#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000209#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000210#endif
211#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000212#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000213#endif
214#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000215#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000216#endif
217#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000218
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000219#ifdef _MSC_VER
Guido van Rossumb6775db1994-08-01 11:34:53 +0000220#include <direct.h>
221#include <io.h>
222#include <process.h>
223#include <windows.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000224#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000225#define popen _popen
Guido van Rossum794d8131994-08-23 13:48:48 +0000226#define pclose _pclose
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000227#else /* 16-bit Windows */
228#include <dos.h>
229#include <ctype.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000230#endif /* MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000231#endif /* _MSC_VER */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000232
233#ifdef OS2
234#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000235#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236
237/* Return a dictionary corresponding to the POSIX environment table */
238
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000239#if !defined(_MSC_VER) && !defined(__WATCOMC__)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000241#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242
Barry Warsaw53699e91996-12-10 23:23:01 +0000243static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244convertenviron()
245{
Barry Warsaw53699e91996-12-10 23:23:01 +0000246 PyObject *d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247 char **e;
Barry Warsaw53699e91996-12-10 23:23:01 +0000248 d = PyDict_New();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249 if (d == NULL)
250 return NULL;
251 if (environ == NULL)
252 return d;
253 /* XXX This part ignores errors */
254 for (e = environ; *e != NULL; e++) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000255 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000256 char *p = strchr(*e, '=');
257 if (p == NULL)
258 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000259 v = PyString_FromString(p+1);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260 if (v == NULL)
261 continue;
262 *p = '\0';
Barry Warsaw53699e91996-12-10 23:23:01 +0000263 (void) PyDict_SetItemString(d, *e, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264 *p = '=';
Barry Warsaw53699e91996-12-10 23:23:01 +0000265 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000266 }
267 return d;
268}
269
270
Barry Warsaw53699e91996-12-10 23:23:01 +0000271static PyObject *PosixError; /* Exception posix.error */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272
273/* Set a POSIX-specific error from errno, and return NULL */
274
Barry Warsaw53699e91996-12-10 23:23:01 +0000275static PyObject * posix_error()
Guido van Rossumad0ee831995-03-01 10:34:45 +0000276{
Barry Warsaw53699e91996-12-10 23:23:01 +0000277 return PyErr_SetFromErrno(PosixError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000278}
279
280
281/* POSIX generic methods */
282
Barry Warsaw53699e91996-12-10 23:23:01 +0000283static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284posix_1str(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000285 PyObject *args;
286 int (*func) Py_FPROTO((const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000288 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000289 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000290 if (!PyArg_Parse(args, "s", &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000292 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000293 res = (*func)(path1);
Barry Warsaw53699e91996-12-10 23:23:01 +0000294 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000295 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000297 Py_INCREF(Py_None);
298 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299}
300
Barry Warsaw53699e91996-12-10 23:23:01 +0000301static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000302posix_2str(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000303 PyObject *args;
304 int (*func) Py_FPROTO((const char *, const char *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000306 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000307 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000308 if (!PyArg_Parse(args, "(ss)", &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000310 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000311 res = (*func)(path1, path2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000312 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000313 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000314 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000315 Py_INCREF(Py_None);
316 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317}
318
Barry Warsaw53699e91996-12-10 23:23:01 +0000319static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320posix_strint(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000321 PyObject *args;
322 int (*func) Py_FPROTO((const char *, int));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000323{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000324 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000326 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000327 if (!PyArg_Parse(args, "(si)", &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000329 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000330 res = (*func)(path, i);
Barry Warsaw53699e91996-12-10 23:23:01 +0000331 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000332 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000334 Py_INCREF(Py_None);
335 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336}
337
Barry Warsaw53699e91996-12-10 23:23:01 +0000338static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000339posix_strintint(args, func)
Barry Warsaw53699e91996-12-10 23:23:01 +0000340 PyObject *args;
341 int (*func) Py_FPROTO((const char *, int, int));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000342{
343 char *path;
344 int i,i2;
345 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000346 if (!PyArg_Parse(args, "(sii)", &path, &i, &i2))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000347 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000348 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000349 res = (*func)(path, i, i2);
Barry Warsaw53699e91996-12-10 23:23:01 +0000350 Py_END_ALLOW_THREADS
Guido van Rossumb6775db1994-08-01 11:34:53 +0000351 if (res < 0)
352 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000353 Py_INCREF(Py_None);
354 return Py_None;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000355}
356
Barry Warsaw53699e91996-12-10 23:23:01 +0000357static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358posix_do_stat(self, args, statfunc)
Barry Warsaw53699e91996-12-10 23:23:01 +0000359 PyObject *self;
360 PyObject *args;
361 int (*statfunc) Py_FPROTO((const char *, struct stat *));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362{
363 struct stat st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000364 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000365 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000366 if (!PyArg_Parse(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000367 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000368 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000369 res = (*statfunc)(path, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +0000370 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000371 if (res != 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000372 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000373 return Py_BuildValue("(llllllllll)",
Guido van Rossume5372401993-03-16 12:15:04 +0000374 (long)st.st_mode,
375 (long)st.st_ino,
376 (long)st.st_dev,
377 (long)st.st_nlink,
378 (long)st.st_uid,
379 (long)st.st_gid,
380 (long)st.st_size,
381 (long)st.st_atime,
382 (long)st.st_mtime,
383 (long)st.st_ctime);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384}
385
386
387/* POSIX methods */
388
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000389static char posix_chdir__doc__[] =
390"chdir(path) -> None\n\
391Change the current working directory to the specified path.";
392
Barry Warsaw53699e91996-12-10 23:23:01 +0000393static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000394posix_chdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000395 PyObject *self;
396 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000397{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398 return posix_1str(args, chdir);
399}
400
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000401
402static char posix_chmod__doc__[] =
403"chmod(path, mode) -> None\n\
404Change the access permissions of a file.";
405
Barry Warsaw53699e91996-12-10 23:23:01 +0000406static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407posix_chmod(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000408 PyObject *self;
409 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411 return posix_strint(args, chmod);
412}
413
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000414
Guido van Rossumb6775db1994-08-01 11:34:53 +0000415#ifdef HAVE_CHOWN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000416static char posix_chown__doc__[] =
417"chown(path, uid, gid) -> None\n\
418Change the owner and group id of path to the numeric uid and gid.";
419
Barry Warsaw53699e91996-12-10 23:23:01 +0000420static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000421posix_chown(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000422 PyObject *self;
423 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000424{
425 return posix_strintint(args, chown);
426}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000427#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000428
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000429
Guido van Rossum36bc6801995-06-14 22:54:23 +0000430#ifdef HAVE_GETCWD
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000431static char posix_getcwd__doc__[] =
432"getcwd() -> path\n\
433Return a string representing the current working directory.";
434
Barry Warsaw53699e91996-12-10 23:23:01 +0000435static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436posix_getcwd(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000437 PyObject *self;
438 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000439{
440 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000441 char *res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000442 if (!PyArg_NoArgs(args))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000444 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000445 res = getcwd(buf, sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +0000446 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000447 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000448 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000449 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000450}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000451#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000453
Guido van Rossumb6775db1994-08-01 11:34:53 +0000454#ifdef HAVE_LINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000455static char posix_link__doc__[] =
456"link(src, dst) -> None\n\
457Create a hard link to a file.";
458
Barry Warsaw53699e91996-12-10 23:23:01 +0000459static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460posix_link(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000461 PyObject *self;
462 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000464 return posix_2str(args, link);
465}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000466#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000467
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000468
469static char posix_listdir__doc__[] =
470"listdir(path) -> list_of_strings\n\
471Return a list containing the names of the entries in the directory.\n\
472\n\
473 path: path of directory to list\n\
474\n\
475The list is in arbitrary order. It does not include the special\n\
476entries '.' and '..' even if they are present in the directory.";
477
Barry Warsaw53699e91996-12-10 23:23:01 +0000478static PyObject *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000479posix_listdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000480 PyObject *self;
481 PyObject *args;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000482{
Guido van Rossum6d8841c1997-08-14 19:57:39 +0000483 /* XXX Should redo this putting the three versions of opendir
484 in separate files instead of having them all here... */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000485#if defined(MS_WIN32) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000486
Guido van Rossumb6775db1994-08-01 11:34:53 +0000487 char *name;
488 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000489 PyObject *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000490 HANDLE hFindFile;
491 WIN32_FIND_DATA FileData;
492 char namebuf[MAX_PATH+5];
493
Barry Warsaw53699e91996-12-10 23:23:01 +0000494 if (!PyArg_Parse(args, "s#", &name, &len))
Guido van Rossumb6775db1994-08-01 11:34:53 +0000495 return NULL;
496 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000497 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossumb6775db1994-08-01 11:34:53 +0000498 return NULL;
499 }
500 strcpy(namebuf, name);
501 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
502 namebuf[len++] = '/';
503 strcpy(namebuf + len, "*.*");
504
Barry Warsaw53699e91996-12-10 23:23:01 +0000505 if ((d = PyList_New(0)) == NULL)
Guido van Rossumb6775db1994-08-01 11:34:53 +0000506 return NULL;
507
508 hFindFile = FindFirstFile(namebuf, &FileData);
509 if (hFindFile == INVALID_HANDLE_VALUE) {
510 errno = GetLastError();
511 return posix_error();
512 }
513 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000514 if (FileData.cFileName[0] == '.' &&
515 (FileData.cFileName[1] == '\0' ||
516 FileData.cFileName[1] == '.' &&
517 FileData.cFileName[2] == '\0'))
518 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000519 v = PyString_FromString(FileData.cFileName);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000520 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000521 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000522 d = NULL;
523 break;
524 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000525 if (PyList_Append(d, v) != 0) {
526 Py_DECREF(v);
527 Py_DECREF(d);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000528 d = NULL;
529 break;
530 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000531 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +0000532 } while (FindNextFile(hFindFile, &FileData) == TRUE);
533
534 if (FindClose(hFindFile) == FALSE) {
535 errno = GetLastError();
536 return posix_error();
537 }
538
539 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000540
Guido van Rossum8d665e61996-06-26 18:22:49 +0000541#else /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000542#ifdef _MSC_VER /* 16-bit Windows */
543
544#ifndef MAX_PATH
545#define MAX_PATH 250
546#endif
547 char *name, *pt;
548 int len;
Barry Warsaw53699e91996-12-10 23:23:01 +0000549 PyObject *d, *v;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000550 char namebuf[MAX_PATH+5];
551 struct _find_t ep;
552
Barry Warsaw53699e91996-12-10 23:23:01 +0000553 if (!PyArg_Parse(args, "s#", &name, &len))
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000554 return NULL;
555 if (len >= MAX_PATH) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000556 PyErr_SetString(PyExc_ValueError, "path too long");
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000557 return NULL;
558 }
559 strcpy(namebuf, name);
560 for (pt = namebuf; *pt; pt++)
561 if (*pt == '/')
562 *pt = '\\';
563 if (namebuf[len-1] != '\\')
564 namebuf[len++] = '\\';
565 strcpy(namebuf + len, "*.*");
566
Barry Warsaw53699e91996-12-10 23:23:01 +0000567 if ((d = PyList_New(0)) == NULL)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000568 return NULL;
569
570 if (_dos_findfirst(namebuf, _A_RDONLY |
Barry Warsaw43d68b81996-12-19 22:10:44 +0000571 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0)
572 {
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000573 errno = ENOENT;
574 return posix_error();
575 }
576 do {
577 if (ep.name[0] == '.' &&
578 (ep.name[1] == '\0' ||
579 ep.name[1] == '.' &&
580 ep.name[2] == '\0'))
581 continue;
582 strcpy(namebuf, ep.name);
583 for (pt = namebuf; *pt; pt++)
584 if (isupper(*pt))
585 *pt = tolower(*pt);
Barry Warsaw53699e91996-12-10 23:23:01 +0000586 v = PyString_FromString(namebuf);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000587 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000588 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000589 d = NULL;
590 break;
591 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000592 if (PyList_Append(d, v) != 0) {
593 Py_DECREF(v);
594 Py_DECREF(d);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000595 d = NULL;
596 break;
597 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000598 Py_DECREF(v);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000599 } while (_dos_findnext(&ep) == 0);
600
601 return d;
602
603#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000604
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000605 char *name;
Barry Warsaw53699e91996-12-10 23:23:01 +0000606 PyObject *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000607 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000608 struct dirent *ep;
Barry Warsaw53699e91996-12-10 23:23:01 +0000609 if (!PyArg_Parse(args, "s", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000610 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000611 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000612 if ((dirp = opendir(name)) == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000613 Py_BLOCK_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000614 return posix_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000615 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000616 if ((d = PyList_New(0)) == NULL) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000617 closedir(dirp);
Barry Warsaw53699e91996-12-10 23:23:01 +0000618 Py_BLOCK_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000619 return NULL;
620 }
621 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000622 if (ep->d_name[0] == '.' &&
623 (NAMLEN(ep) == 1 ||
Guido van Rossuma376cc51996-12-05 23:43:35 +0000624 (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000625 continue;
Barry Warsaw53699e91996-12-10 23:23:01 +0000626 v = PyString_FromStringAndSize(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000627 if (v == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000628 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000629 d = NULL;
630 break;
631 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000632 if (PyList_Append(d, v) != 0) {
633 Py_DECREF(v);
634 Py_DECREF(d);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000635 d = NULL;
636 break;
637 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000638 Py_DECREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000639 }
640 closedir(dirp);
Barry Warsaw53699e91996-12-10 23:23:01 +0000641 Py_END_ALLOW_THREADS
Guido van Rossum0ee42cd1991-04-08 21:01:03 +0000642
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000643 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000644
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000645#endif /* !_MSC_VER */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000646#endif /* !MS_WIN32 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000647}
648
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000649static char posix_mkdir__doc__[] =
650"mkdir(path [, mode=0777]) -> None\n\
651Create a directory.";
652
Barry Warsaw53699e91996-12-10 23:23:01 +0000653static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000654posix_mkdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000655 PyObject *self;
656 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000657{
Guido van Rossumb0824db1996-02-25 04:50:32 +0000658 int res;
659 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000660 int mode = 0777;
Barry Warsaw53699e91996-12-10 23:23:01 +0000661 if (!PyArg_ParseTuple(args, "s|i", &path, &mode))
Guido van Rossumb0824db1996-02-25 04:50:32 +0000662 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000663 Py_BEGIN_ALLOW_THREADS
Guido van Rossum8d665e61996-06-26 18:22:49 +0000664#if defined(__WATCOMC__) || defined(_MSC_VER)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000665 res = mkdir(path);
666#else
Guido van Rossumb0824db1996-02-25 04:50:32 +0000667 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000668#endif
Barry Warsaw53699e91996-12-10 23:23:01 +0000669 Py_END_ALLOW_THREADS
Guido van Rossumb0824db1996-02-25 04:50:32 +0000670 if (res < 0)
671 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000672 Py_INCREF(Py_None);
673 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000674}
675
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000676
Guido van Rossumb6775db1994-08-01 11:34:53 +0000677#ifdef HAVE_NICE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000678static char posix_nice__doc__[] =
679"nice(inc) -> new_priority\n\
680Decrease the priority of process and return new priority.";
681
Barry Warsaw53699e91996-12-10 23:23:01 +0000682static PyObject *
Guido van Rossum775f4da1993-01-09 17:18:52 +0000683posix_nice(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000684 PyObject *self;
685 PyObject *args;
Guido van Rossum775f4da1993-01-09 17:18:52 +0000686{
687 int increment, value;
688
Barry Warsaw53699e91996-12-10 23:23:01 +0000689 if (!PyArg_Parse(args, "i", &increment))
Guido van Rossum775f4da1993-01-09 17:18:52 +0000690 return NULL;
691 value = nice(increment);
692 if (value == -1)
693 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000694 return PyInt_FromLong((long) value);
Guido van Rossum775f4da1993-01-09 17:18:52 +0000695}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000696#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000697
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000698
699static char posix_rename__doc__[] =
700"rename(old, new) -> None\n\
701Rename a file or directory.";
702
Barry Warsaw53699e91996-12-10 23:23:01 +0000703static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000704posix_rename(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000705 PyObject *self;
706 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000707{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000708 return posix_2str(args, rename);
709}
710
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000711
712static char posix_rmdir__doc__[] =
713"rmdir(path) -> None\n\
714Remove a directory.";
715
Barry Warsaw53699e91996-12-10 23:23:01 +0000716static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000717posix_rmdir(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000718 PyObject *self;
719 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000720{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000721 return posix_1str(args, rmdir);
722}
723
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000724
725static char posix_stat__doc__[] =
726"stat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
727Perform a stat system call on the given path.";
728
Barry Warsaw53699e91996-12-10 23:23:01 +0000729static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000730posix_stat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000731 PyObject *self;
732 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000733{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000734 return posix_do_stat(self, args, stat);
735}
736
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000737
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000738#ifdef HAVE_SYSTEM
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000739static char posix_system__doc__[] =
740"system(command) -> exit_status\n\
741Execute the command (a string) in a subshell.";
742
Barry Warsaw53699e91996-12-10 23:23:01 +0000743static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000744posix_system(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000745 PyObject *self;
746 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000747{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000748 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000749 long sts;
Barry Warsaw53699e91996-12-10 23:23:01 +0000750 if (!PyArg_Parse(args, "s", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000751 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000752 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000753 sts = system(command);
Barry Warsaw53699e91996-12-10 23:23:01 +0000754 Py_END_ALLOW_THREADS
755 return PyInt_FromLong(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000756}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000757#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000758
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000759
760static char posix_umask__doc__[] =
761"umask(new_mask) -> old_mask\n\
762Set the current numeric umask and return the previous umask.";
763
Barry Warsaw53699e91996-12-10 23:23:01 +0000764static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000765posix_umask(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000766 PyObject *self;
767 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000768{
769 int i;
Barry Warsaw53699e91996-12-10 23:23:01 +0000770 if (!PyArg_Parse(args, "i", &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000771 return NULL;
772 i = umask(i);
773 if (i < 0)
774 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000775 return PyInt_FromLong((long)i);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000776}
777
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000778
779static char posix_unlink__doc__[] =
780"unlink(path) -> None\n\
781Remove a file (same as remove(path)).";
782
783static char posix_remove__doc__[] =
784"remove(path) -> None\n\
785Remove a file (same as unlink(path)).";
786
Barry Warsaw53699e91996-12-10 23:23:01 +0000787static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000788posix_unlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000789 PyObject *self;
790 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000791{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000792 return posix_1str(args, unlink);
793}
794
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000795
Guido van Rossumb6775db1994-08-01 11:34:53 +0000796#ifdef HAVE_UNAME
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000797static char posix_uname__doc__[] =
798"uname() -> (sysname, nodename, release, version, machine)\n\
799Return a tuple identifying the current operating system.";
800
Barry Warsaw53699e91996-12-10 23:23:01 +0000801static PyObject *
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000802posix_uname(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000803 PyObject *self;
804 PyObject *args;
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000805{
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000806 struct utsname u;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000807 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +0000808 if (!PyArg_NoArgs(args))
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000809 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000810 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000811 res = uname(&u);
Barry Warsaw53699e91996-12-10 23:23:01 +0000812 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000813 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000814 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000815 return Py_BuildValue("(sssss)",
Barry Warsaw43d68b81996-12-19 22:10:44 +0000816 u.sysname,
817 u.nodename,
818 u.release,
819 u.version,
820 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000821}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000822#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000823
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000824
825static char posix_utime__doc__[] =
826"utime(path, (atime, utime)) -> None\n\
827Set the access and modified time of the file to the given values.";
828
Barry Warsaw53699e91996-12-10 23:23:01 +0000829static PyObject *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000830posix_utime(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000831 PyObject *self;
832 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000833{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000834 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000835 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000836 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000837
Guido van Rossum6d8841c1997-08-14 19:57:39 +0000838/* XXX should define struct utimbuf instead, above */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000839#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000840 struct utimbuf buf;
841#define ATIME buf.actime
842#define MTIME buf.modtime
843#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000844#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000845 time_t buf[2];
846#define ATIME buf[0]
847#define MTIME buf[1]
848#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000849#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000850
Barry Warsaw53699e91996-12-10 23:23:01 +0000851 if (!PyArg_Parse(args, "(s(ll))", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000852 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000853 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +0000854 MTIME = mtime;
Barry Warsaw53699e91996-12-10 23:23:01 +0000855 Py_BEGIN_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000856 res = utime(path, UTIME_ARG);
Barry Warsaw53699e91996-12-10 23:23:01 +0000857 Py_END_ALLOW_THREADS
Guido van Rossumff4949e1992-08-05 19:58:53 +0000858 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000859 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +0000860 Py_INCREF(Py_None);
861 return Py_None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000862#undef UTIME_ARG
863#undef ATIME
864#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000865}
866
Guido van Rossum85e3b011991-06-03 12:42:10 +0000867
Guido van Rossum3b066191991-06-04 19:40:25 +0000868/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000869
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000870static char posix__exit__doc__[] =
871"_exit(status)\n\
872Exit to the system with specified status, without normal exit processing.";
873
Barry Warsaw53699e91996-12-10 23:23:01 +0000874static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000875posix__exit(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000876 PyObject *self;
877 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000878{
879 int sts;
Barry Warsaw53699e91996-12-10 23:23:01 +0000880 if (!PyArg_Parse(args, "i", &sts))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000881 return NULL;
882 _exit(sts);
Guido van Rossuma376cc51996-12-05 23:43:35 +0000883 return NULL; /* Make gcc -Wall happy */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000884}
885
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000886
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000887#ifdef HAVE_EXECV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000888static char posix_execv__doc__[] =
889"execv(path, args)\n\
890Execute an executable path with arguments, replacing current process.\n\
891\n\
892 path: path of executable file\n\
893 args: tuple or list of strings";
894
Barry Warsaw53699e91996-12-10 23:23:01 +0000895static PyObject *
Guido van Rossum89b33251993-10-22 14:26:06 +0000896posix_execv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000897 PyObject *self;
898 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000899{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000900 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +0000901 PyObject *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000902 char **argvlist;
903 int i, argc;
Barry Warsaw53699e91996-12-10 23:23:01 +0000904 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossum85e3b011991-06-03 12:42:10 +0000905
Guido van Rossum89b33251993-10-22 14:26:06 +0000906 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +0000907 argv is a list or tuple of strings. */
908
Barry Warsaw53699e91996-12-10 23:23:01 +0000909 if (!PyArg_Parse(args, "(sO)", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000910 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000911 if (PyList_Check(argv)) {
912 argc = PyList_Size(argv);
913 getitem = PyList_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000914 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000915 else if (PyTuple_Check(argv)) {
916 argc = PyTuple_Size(argv);
917 getitem = PyTuple_GetItem;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000918 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000919 else {
920 badarg:
Barry Warsaw53699e91996-12-10 23:23:01 +0000921 PyErr_BadArgument();
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000922 return NULL;
923 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000924
Barry Warsaw53699e91996-12-10 23:23:01 +0000925 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000926 if (argvlist == NULL)
927 return NULL;
928 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000929 if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
930 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000931 goto badarg;
932 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000933 }
934 argvlist[argc] = NULL;
935
Guido van Rossumb6775db1994-08-01 11:34:53 +0000936#ifdef BAD_EXEC_PROTOTYPES
937 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000938#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000939 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000940#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000941
Guido van Rossum85e3b011991-06-03 12:42:10 +0000942 /* If we get here it's definitely an error */
943
Barry Warsaw53699e91996-12-10 23:23:01 +0000944 PyMem_DEL(argvlist);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000945 return posix_error();
946}
947
Guido van Rossumec4f4ac1997-06-02 22:20:51 +0000948
949static char posix_execve__doc__[] =
950"execve(path, args, env)\n\
951Execute a path with arguments and environment, replacing current process.\n\
952\n\
953 path: path of executable file\n\
954 args: tuple or list of arguments\n\
955 env: dictonary of strings mapping to strings";
956
Barry Warsaw53699e91996-12-10 23:23:01 +0000957static PyObject *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000958posix_execve(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +0000959 PyObject *self;
960 PyObject *args;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000961{
962 char *path;
Barry Warsaw53699e91996-12-10 23:23:01 +0000963 PyObject *argv, *env;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000964 char **argvlist;
965 char **envlist;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +0000966 PyObject *key, *val, *keys=NULL, *vals=NULL;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000967 int i, pos, argc, envc;
Barry Warsaw53699e91996-12-10 23:23:01 +0000968 PyObject *(*getitem) Py_PROTO((PyObject *, int));
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000969
970 /* execve has three arguments: (path, argv, env), where
971 argv is a list or tuple of strings and env is a dictionary
972 like posix.environ. */
973
Barry Warsaw53699e91996-12-10 23:23:01 +0000974 if (!PyArg_Parse(args, "(sOO)", &path, &argv, &env))
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000975 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +0000976 if (PyList_Check(argv)) {
977 argc = PyList_Size(argv);
978 getitem = PyList_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000979 }
Barry Warsaw53699e91996-12-10 23:23:01 +0000980 else if (PyTuple_Check(argv)) {
981 argc = PyTuple_Size(argv);
982 getitem = PyTuple_GetItem;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000983 }
984 else {
Barry Warsaw53699e91996-12-10 23:23:01 +0000985 PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000986 return NULL;
987 }
Barry Warsaw5ed19dc1997-01-29 15:08:24 +0000988 if (!PyMapping_Check(env)) {
989 PyErr_SetString(PyExc_TypeError, "env must be mapping object");
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000990 return NULL;
991 }
992
Barry Warsaw53699e91996-12-10 23:23:01 +0000993 argvlist = PyMem_NEW(char *, argc+1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000994 if (argvlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000995 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000996 return NULL;
997 }
998 for (i = 0; i < argc; i++) {
Barry Warsaw53699e91996-12-10 23:23:01 +0000999 if (!PyArg_Parse((*getitem)(argv, i),
Barry Warsaw43d68b81996-12-19 22:10:44 +00001000 "s;argv must be list of strings",
1001 &argvlist[i]))
1002 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001003 goto fail_1;
1004 }
1005 }
1006 argvlist[argc] = NULL;
1007
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001008 i = PyMapping_Length(env);
Barry Warsaw53699e91996-12-10 23:23:01 +00001009 envlist = PyMem_NEW(char *, i + 1);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001010 if (envlist == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001011 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001012 goto fail_1;
1013 }
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001014 envc = 0;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001015 keys = PyMapping_Keys(env);
1016 vals = PyMapping_Values(env);
1017 if (!keys || !vals)
1018 goto fail_2;
1019
1020 for (pos = 0; pos < i; pos++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001021 char *p, *k, *v;
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001022
1023 key = PyList_GetItem(keys, pos);
1024 val = PyList_GetItem(vals, pos);
1025 if (!key || !val)
1026 goto fail_2;
1027
Barry Warsaw53699e91996-12-10 23:23:01 +00001028 if (!PyArg_Parse(key, "s;non-string key in env", &k) ||
Barry Warsaw43d68b81996-12-19 22:10:44 +00001029 !PyArg_Parse(val, "s;non-string value in env", &v))
1030 {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001031 goto fail_2;
1032 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001033 p = PyMem_NEW(char, PyString_Size(key)+PyString_Size(val) + 2);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001034 if (p == NULL) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001035 PyErr_NoMemory();
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001036 goto fail_2;
1037 }
1038 sprintf(p, "%s=%s", k, v);
1039 envlist[envc++] = p;
1040 }
1041 envlist[envc] = 0;
1042
Guido van Rossumb6775db1994-08-01 11:34:53 +00001043
1044#ifdef BAD_EXEC_PROTOTYPES
1045 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001046#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001047 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001048#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001049
1050 /* If we get here it's definitely an error */
1051
1052 (void) posix_error();
1053
1054 fail_2:
1055 while (--envc >= 0)
Barry Warsaw53699e91996-12-10 23:23:01 +00001056 PyMem_DEL(envlist[envc]);
1057 PyMem_DEL(envlist);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001058 fail_1:
Barry Warsaw53699e91996-12-10 23:23:01 +00001059 PyMem_DEL(argvlist);
Barry Warsaw5ed19dc1997-01-29 15:08:24 +00001060 Py_XDECREF(vals);
1061 Py_XDECREF(keys);
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001062 return NULL;
1063}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001064#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001065
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001066
Guido van Rossumad0ee831995-03-01 10:34:45 +00001067#ifdef HAVE_FORK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001068static char posix_fork__doc__[] =
1069"fork() -> pid\n\
1070Fork a child process.\n\
1071\n\
1072Return 0 to child process and PID of child to parent process.";
1073
Barry Warsaw53699e91996-12-10 23:23:01 +00001074static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001075posix_fork(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001076 PyObject *self;
1077 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001078{
1079 int pid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001080 if (!PyArg_NoArgs(args))
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001081 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001082 pid = fork();
1083 if (pid == -1)
1084 return posix_error();
Guido van Rossum359bcaa1997-11-14 22:24:28 +00001085 PyOS_AfterFork();
Barry Warsaw53699e91996-12-10 23:23:01 +00001086 return PyInt_FromLong((long)pid);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001087}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001088#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001089
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001090
Guido van Rossumad0ee831995-03-01 10:34:45 +00001091#ifdef HAVE_GETEGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001092static char posix_getegid__doc__[] =
1093"getegid() -> egid\n\
1094Return the current process's effective group id.";
1095
Barry Warsaw53699e91996-12-10 23:23:01 +00001096static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001097posix_getegid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001098 PyObject *self;
1099 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001100{
Barry Warsaw53699e91996-12-10 23:23:01 +00001101 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001102 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001103 return PyInt_FromLong((long)getegid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001104}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001105#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001106
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001107
Guido van Rossumad0ee831995-03-01 10:34:45 +00001108#ifdef HAVE_GETEUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001109static char posix_geteuid__doc__[] =
1110"geteuid() -> euid\n\
1111Return the current process's effective user id.";
1112
Barry Warsaw53699e91996-12-10 23:23:01 +00001113static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001114posix_geteuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001115 PyObject *self;
1116 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001117{
Barry Warsaw53699e91996-12-10 23:23:01 +00001118 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001119 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001120 return PyInt_FromLong((long)geteuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001121}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001122#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001123
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001124
Guido van Rossumad0ee831995-03-01 10:34:45 +00001125#ifdef HAVE_GETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001126static char posix_getgid__doc__[] =
1127"getgid() -> gid\n\
1128Return the current process's group id.";
1129
Barry Warsaw53699e91996-12-10 23:23:01 +00001130static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001131posix_getgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001132 PyObject *self;
1133 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001134{
Barry Warsaw53699e91996-12-10 23:23:01 +00001135 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001136 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001137 return PyInt_FromLong((long)getgid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001138}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001139#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001140
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001141
1142static char posix_getpid__doc__[] =
1143"getpid() -> pid\n\
1144Return the current process id";
1145
Barry Warsaw53699e91996-12-10 23:23:01 +00001146static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001147posix_getpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001148 PyObject *self;
1149 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001150{
Barry Warsaw53699e91996-12-10 23:23:01 +00001151 if (!PyArg_NoArgs(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001152 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001153 return PyInt_FromLong((long)getpid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001154}
1155
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001156
Guido van Rossumb6775db1994-08-01 11:34:53 +00001157#ifdef HAVE_GETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001158static char posix_getpgrp__doc__[] =
1159"getpgrp() -> pgrp\n\
1160Return the current process group id.";
1161
Barry Warsaw53699e91996-12-10 23:23:01 +00001162static PyObject *
Guido van Rossum04814471991-06-04 20:23:49 +00001163posix_getpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001164 PyObject *self;
1165 PyObject *args;
Guido van Rossum04814471991-06-04 20:23:49 +00001166{
Barry Warsaw53699e91996-12-10 23:23:01 +00001167 if (!PyArg_NoArgs(args))
Guido van Rossum04814471991-06-04 20:23:49 +00001168 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001169#ifdef GETPGRP_HAVE_ARG
Barry Warsaw53699e91996-12-10 23:23:01 +00001170 return PyInt_FromLong((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001171#else /* GETPGRP_HAVE_ARG */
Barry Warsaw53699e91996-12-10 23:23:01 +00001172 return PyInt_FromLong((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001173#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001174}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001175#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001176
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001177
Guido van Rossumb6775db1994-08-01 11:34:53 +00001178#ifdef HAVE_SETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001179static char posix_setpgrp__doc__[] =
1180"setpgrp() -> None\n\
1181Make this process a session leader.";
1182
Barry Warsaw53699e91996-12-10 23:23:01 +00001183static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001184posix_setpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001185 PyObject *self;
1186 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001187{
Barry Warsaw53699e91996-12-10 23:23:01 +00001188 if (!PyArg_NoArgs(args))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001189 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001190#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001191 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001192#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001193 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001194#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001195 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001196 Py_INCREF(Py_None);
1197 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001198}
1199
Guido van Rossumb6775db1994-08-01 11:34:53 +00001200#endif /* HAVE_SETPGRP */
1201
Guido van Rossumad0ee831995-03-01 10:34:45 +00001202#ifdef HAVE_GETPPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001203static char posix_getppid__doc__[] =
1204"getppid() -> ppid\n\
1205Return the parent's process id.";
1206
Barry Warsaw53699e91996-12-10 23:23:01 +00001207static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001208posix_getppid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001209 PyObject *self;
1210 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001211{
Barry Warsaw53699e91996-12-10 23:23:01 +00001212 if (!PyArg_NoArgs(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001213 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001214 return PyInt_FromLong((long)getppid());
Guido van Rossum85e3b011991-06-03 12:42:10 +00001215}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001216#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001217
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001218
Guido van Rossumad0ee831995-03-01 10:34:45 +00001219#ifdef HAVE_GETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001220static char posix_getuid__doc__[] =
1221"getuid() -> uid\n\
1222Return the current process's user id.";
1223
Barry Warsaw53699e91996-12-10 23:23:01 +00001224static PyObject *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001225posix_getuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001226 PyObject *self;
1227 PyObject *args;
Guido van Rossum46003ff1992-05-15 11:05:24 +00001228{
Barry Warsaw53699e91996-12-10 23:23:01 +00001229 if (!PyArg_NoArgs(args))
Guido van Rossum46003ff1992-05-15 11:05:24 +00001230 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001231 return PyInt_FromLong((long)getuid());
Guido van Rossum46003ff1992-05-15 11:05:24 +00001232}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001233#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001234
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001235
Guido van Rossumad0ee831995-03-01 10:34:45 +00001236#ifdef HAVE_KILL
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001237static char posix_kill__doc__[] =
1238"kill(pid, sig) -> None\n\
1239Kill a process with a signal.";
1240
Barry Warsaw53699e91996-12-10 23:23:01 +00001241static PyObject *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001242posix_kill(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001243 PyObject *self;
1244 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001245{
1246 int pid, sig;
Barry Warsaw53699e91996-12-10 23:23:01 +00001247 if (!PyArg_Parse(args, "(ii)", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001248 return NULL;
1249 if (kill(pid, sig) == -1)
1250 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001251 Py_INCREF(Py_None);
1252 return Py_None;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001253}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001254#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001255
Guido van Rossumc0125471996-06-28 18:55:32 +00001256#ifdef HAVE_PLOCK
1257
1258#ifdef HAVE_SYS_LOCK_H
1259#include <sys/lock.h>
1260#endif
1261
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001262static char posix_plock__doc__[] =
1263"plock(op) -> None\n\
1264Lock program segments into memory.";
1265
Barry Warsaw53699e91996-12-10 23:23:01 +00001266static PyObject *
Guido van Rossumc0125471996-06-28 18:55:32 +00001267posix_plock(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001268 PyObject *self;
1269 PyObject *args;
Guido van Rossumc0125471996-06-28 18:55:32 +00001270{
1271 int op;
Barry Warsaw53699e91996-12-10 23:23:01 +00001272 if (!PyArg_Parse(args, "i", &op))
Guido van Rossumc0125471996-06-28 18:55:32 +00001273 return NULL;
1274 if (plock(op) == -1)
1275 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001276 Py_INCREF(Py_None);
1277 return Py_None;
Guido van Rossumc0125471996-06-28 18:55:32 +00001278}
1279#endif
1280
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001281
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001282#ifdef HAVE_POPEN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001283static char posix_popen__doc__[] =
1284"popen(command [, mode='r' [, bufsize]]) -> pipe\n\
1285Open a pipe to/from a command returning a file object.";
1286
Barry Warsaw53699e91996-12-10 23:23:01 +00001287static PyObject *
Guido van Rossum3b066191991-06-04 19:40:25 +00001288posix_popen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001289 PyObject *self;
1290 PyObject *args;
Guido van Rossum3b066191991-06-04 19:40:25 +00001291{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001292 char *name;
1293 char *mode = "r";
1294 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00001295 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00001296 PyObject *f;
1297 if (!PyArg_ParseTuple(args, "s|si", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00001298 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001299 Py_BEGIN_ALLOW_THREADS
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001300 fp = popen(name, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001301 Py_END_ALLOW_THREADS
Guido van Rossum3b066191991-06-04 19:40:25 +00001302 if (fp == NULL)
1303 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001304 f = PyFile_FromFile(fp, name, mode, pclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001305 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00001306 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001307 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00001308}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001309#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00001310
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001311
Guido van Rossumb6775db1994-08-01 11:34:53 +00001312#ifdef HAVE_SETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001313static char posix_setuid__doc__[] =
1314"setuid(uid) -> None\n\
1315Set the current process's user id.";
Barry Warsaw53699e91996-12-10 23:23:01 +00001316static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001317posix_setuid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001318 PyObject *self;
1319 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001320{
1321 int uid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001322 if (!PyArg_Parse(args, "i", &uid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001323 return NULL;
1324 if (setuid(uid) < 0)
1325 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001326 Py_INCREF(Py_None);
1327 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001328}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001329#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001330
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001331
Guido van Rossumb6775db1994-08-01 11:34:53 +00001332#ifdef HAVE_SETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001333static char posix_setgid__doc__[] =
1334"setgid(gid) -> None\n\
1335Set the current process's group id.";
1336
Barry Warsaw53699e91996-12-10 23:23:01 +00001337static PyObject *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001338posix_setgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001339 PyObject *self;
1340 PyObject *args;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001341{
1342 int gid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001343 if (!PyArg_Parse(args, "i", &gid))
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001344 return NULL;
1345 if (setgid(gid) < 0)
1346 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001347 Py_INCREF(Py_None);
1348 return Py_None;
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001349}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001350#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001351
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001352
Guido van Rossumb6775db1994-08-01 11:34:53 +00001353#ifdef HAVE_WAITPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001354static char posix_waitpid__doc__[] =
1355"waitpid(pid, options) -> (pid, status)\n\
1356Wait for completion of a give child process.";
1357
Barry Warsaw53699e91996-12-10 23:23:01 +00001358static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00001359posix_waitpid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001360 PyObject *self;
1361 PyObject *args;
Guido van Rossum85e3b011991-06-03 12:42:10 +00001362{
Guido van Rossumfd03e2b1996-06-19 23:17:02 +00001363 int pid, options, sts = 0;
Barry Warsaw53699e91996-12-10 23:23:01 +00001364 if (!PyArg_Parse(args, "(ii)", &pid, &options))
Guido van Rossum21803b81992-08-09 12:55:27 +00001365 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001366 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb9f866c1997-05-22 15:12:39 +00001367#ifdef NeXT
1368 pid = wait4(pid, (union wait *)&sts, options, NULL);
1369#else
Guido van Rossum21803b81992-08-09 12:55:27 +00001370 pid = waitpid(pid, &sts, options);
Guido van Rossumb9f866c1997-05-22 15:12:39 +00001371#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001372 Py_END_ALLOW_THREADS
Guido van Rossum85e3b011991-06-03 12:42:10 +00001373 if (pid == -1)
1374 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00001375 else
Barry Warsaw53699e91996-12-10 23:23:01 +00001376 return Py_BuildValue("ii", pid, sts);
Guido van Rossum21803b81992-08-09 12:55:27 +00001377}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001378#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00001379
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001380
Guido van Rossumad0ee831995-03-01 10:34:45 +00001381#ifdef HAVE_WAIT
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001382static char posix_wait__doc__[] =
1383"wait() -> (pid, status)\n\
1384Wait for completion of a child process.";
1385
Barry Warsaw53699e91996-12-10 23:23:01 +00001386static PyObject *
Guido van Rossum21803b81992-08-09 12:55:27 +00001387posix_wait(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001388 PyObject *self;
1389 PyObject *args;
Guido van Rossum21803b81992-08-09 12:55:27 +00001390{
1391 int pid, sts;
Barry Warsaw53699e91996-12-10 23:23:01 +00001392 Py_BEGIN_ALLOW_THREADS
Guido van Rossumb9f866c1997-05-22 15:12:39 +00001393#ifdef NeXT
1394 pid = wait((union wait *)&sts);
1395#else
Guido van Rossum21803b81992-08-09 12:55:27 +00001396 pid = wait(&sts);
Guido van Rossumb9f866c1997-05-22 15:12:39 +00001397#endif
Barry Warsaw53699e91996-12-10 23:23:01 +00001398 Py_END_ALLOW_THREADS
Guido van Rossum21803b81992-08-09 12:55:27 +00001399 if (pid == -1)
1400 return posix_error();
1401 else
Barry Warsaw53699e91996-12-10 23:23:01 +00001402 return Py_BuildValue("ii", pid, sts);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001403}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001404#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001405
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001406
1407static char posix_lstat__doc__[] =
1408"lstat(path) -> (mode,ino,dev,nlink,uid,gid,size,atime,mtime,ctime)\n\
1409Like stat(path), but do not follow symbolic links.";
1410
Barry Warsaw53699e91996-12-10 23:23:01 +00001411static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001412posix_lstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001413 PyObject *self;
1414 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001415{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001416#ifdef HAVE_LSTAT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001417 return posix_do_stat(self, args, lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001418#else /* !HAVE_LSTAT */
1419 return posix_do_stat(self, args, stat);
1420#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001421}
1422
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001423
Guido van Rossumb6775db1994-08-01 11:34:53 +00001424#ifdef HAVE_READLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001425static char posix_readlink__doc__[] =
1426"readlink(path) -> path\n\
1427Return a string representing the path to which the symbolic link points.";
1428
Barry Warsaw53699e91996-12-10 23:23:01 +00001429static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001430posix_readlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001431 PyObject *self;
1432 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001433{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001434 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001435 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001436 int n;
Barry Warsaw53699e91996-12-10 23:23:01 +00001437 if (!PyArg_Parse(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001438 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001439 Py_BEGIN_ALLOW_THREADS
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001440 n = readlink(path, buf, (int) sizeof buf);
Barry Warsaw53699e91996-12-10 23:23:01 +00001441 Py_END_ALLOW_THREADS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001442 if (n < 0)
1443 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001444 return PyString_FromStringAndSize(buf, n);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001445}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001446#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001447
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001448
Guido van Rossumb6775db1994-08-01 11:34:53 +00001449#ifdef HAVE_SYMLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001450static char posix_symlink__doc__[] =
1451"symlink(src, dst) -> None\n\
1452Create a symbolic link.";
1453
Barry Warsaw53699e91996-12-10 23:23:01 +00001454static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001455posix_symlink(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001456 PyObject *self;
1457 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001458{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001459 return posix_2str(args, symlink);
1460}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001461#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001462
Guido van Rossumb6775db1994-08-01 11:34:53 +00001463#ifdef HAVE_TIMES
1464#ifndef HZ
1465#define HZ 60 /* Universal constant :-) */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001466#endif /* HZ */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001467
Barry Warsaw53699e91996-12-10 23:23:01 +00001468static PyObject *
Guido van Rossum22db57e1992-04-05 14:25:30 +00001469posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001470 PyObject *self;
1471 PyObject *args;
Guido van Rossum22db57e1992-04-05 14:25:30 +00001472{
1473 struct tms t;
1474 clock_t c;
Barry Warsaw53699e91996-12-10 23:23:01 +00001475 if (!PyArg_NoArgs(args))
Guido van Rossum22db57e1992-04-05 14:25:30 +00001476 return NULL;
1477 errno = 0;
1478 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00001479 if (c == (clock_t) -1)
1480 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001481 return Py_BuildValue("ddddd",
Barry Warsaw43d68b81996-12-19 22:10:44 +00001482 (double)t.tms_utime / HZ,
1483 (double)t.tms_stime / HZ,
1484 (double)t.tms_cutime / HZ,
1485 (double)t.tms_cstime / HZ,
1486 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00001487}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001488#endif /* HAVE_TIMES */
Guido van Rossum87755a21996-09-07 00:59:43 +00001489#ifdef MS_WIN32
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001490#define HAVE_TIMES /* so the method table will pick it up */
Barry Warsaw53699e91996-12-10 23:23:01 +00001491static PyObject *
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001492posix_times(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001493 PyObject *self;
1494 PyObject *args;
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001495{
1496 FILETIME create, exit, kernel, user;
1497 HANDLE hProc;
Barry Warsaw53699e91996-12-10 23:23:01 +00001498 if (!PyArg_NoArgs(args))
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001499 return NULL;
1500 hProc = GetCurrentProcess();
1501 GetProcessTimes(hProc,&create, &exit, &kernel, &user);
Barry Warsaw53699e91996-12-10 23:23:01 +00001502 return Py_BuildValue(
1503 "ddddd",
1504 (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime)/2E6,
1505 (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6,
1506 (double)0,
1507 (double)0,
1508 (double)0);
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001509}
Guido van Rossum8d665e61996-06-26 18:22:49 +00001510#endif /* MS_WIN32 */
Roger E. Masse0318fd61997-06-05 22:07:58 +00001511static char posix_times__doc__[] =
1512"times() -> (utime, stime, cutime, cstime, elapsed_time)\n\
1513Return a tuple of floating point numbers indicating process times.";
Guido van Rossum22db57e1992-04-05 14:25:30 +00001514
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001515
Guido van Rossumb6775db1994-08-01 11:34:53 +00001516#ifdef HAVE_SETSID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001517static char posix_setsid__doc__[] =
1518"setsid() -> None\n\
1519Call the system call setsid().";
1520
Barry Warsaw53699e91996-12-10 23:23:01 +00001521static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001522posix_setsid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001523 PyObject *self;
1524 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001525{
Barry Warsaw53699e91996-12-10 23:23:01 +00001526 if (!PyArg_NoArgs(args))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001527 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001528 if (setsid() < 0)
1529 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001530 Py_INCREF(Py_None);
1531 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001532}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001533#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001534
Guido van Rossumb6775db1994-08-01 11:34:53 +00001535#ifdef HAVE_SETPGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001536static char posix_setpgid__doc__[] =
1537"setpgid(pid, pgrp) -> None\n\
1538Call the system call setpgid().";
1539
Barry Warsaw53699e91996-12-10 23:23:01 +00001540static PyObject *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001541posix_setpgid(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001542 PyObject *self;
1543 PyObject *args;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001544{
1545 int pid, pgrp;
Barry Warsaw53699e91996-12-10 23:23:01 +00001546 if (!PyArg_Parse(args, "(ii)", &pid, &pgrp))
Guido van Rossumc2670a01992-09-13 20:07:29 +00001547 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001548 if (setpgid(pid, pgrp) < 0)
1549 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001550 Py_INCREF(Py_None);
1551 return Py_None;
Guido van Rossumc2670a01992-09-13 20:07:29 +00001552}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001553#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001554
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001555
Guido van Rossumb6775db1994-08-01 11:34:53 +00001556#ifdef HAVE_TCGETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001557static char posix_tcgetpgrp__doc__[] =
1558"tcgetpgrp(fd) -> pgid\n\
1559Return the process group associated with the terminal given by a fd.";
1560
Barry Warsaw53699e91996-12-10 23:23:01 +00001561static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00001562posix_tcgetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001563 PyObject *self;
1564 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001565{
1566 int fd, pgid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001567 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum7066dd71992-09-17 17:54:56 +00001568 return NULL;
1569 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001570 if (pgid < 0)
1571 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001572 return PyInt_FromLong((long)pgid);
Guido van Rossum7066dd71992-09-17 17:54:56 +00001573}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001574#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00001575
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001576
Guido van Rossumb6775db1994-08-01 11:34:53 +00001577#ifdef HAVE_TCSETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001578static char posix_tcsetpgrp__doc__[] =
1579"tcsetpgrp(fd, pgid) -> None\n\
1580Set the process group associated with the terminal given by a fd.";
1581
Barry Warsaw53699e91996-12-10 23:23:01 +00001582static PyObject *
Guido van Rossum7066dd71992-09-17 17:54:56 +00001583posix_tcsetpgrp(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001584 PyObject *self;
1585 PyObject *args;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001586{
1587 int fd, pgid;
Barry Warsaw53699e91996-12-10 23:23:01 +00001588 if (!PyArg_Parse(args, "(ii)", &fd, &pgid))
Guido van Rossum7066dd71992-09-17 17:54:56 +00001589 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001590 if (tcsetpgrp(fd, pgid) < 0)
1591 return posix_error();
Barry Warsaw43d68b81996-12-19 22:10:44 +00001592 Py_INCREF(Py_None);
Barry Warsaw53699e91996-12-10 23:23:01 +00001593 return Py_None;
Guido van Rossum7066dd71992-09-17 17:54:56 +00001594}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001595#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001596
Guido van Rossum687dd131993-05-17 08:34:16 +00001597/* Functions acting on file descriptors */
1598
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001599static char posix_open__doc__[] =
1600"open(filename, flag [, mode=0777]) -> fd\n\
1601Open a file (for low level IO).";
1602
Barry Warsaw53699e91996-12-10 23:23:01 +00001603static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001604posix_open(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001605 PyObject *self;
1606 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001607{
1608 char *file;
1609 int flag;
1610 int mode = 0777;
1611 int fd;
Barry Warsaw43d68b81996-12-19 22:10:44 +00001612 if (!PyArg_ParseTuple(args, "si|i", &file, &flag, &mode))
1613 return NULL;
1614
Barry Warsaw53699e91996-12-10 23:23:01 +00001615 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001616 fd = open(file, flag, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001617 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001618 if (fd < 0)
1619 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001620 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001621}
1622
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001623
1624static char posix_close__doc__[] =
1625"close(fd) -> None\n\
1626Close a file descriptor (for low level IO).";
1627
Barry Warsaw53699e91996-12-10 23:23:01 +00001628static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001629posix_close(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001630 PyObject *self;
1631 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001632{
1633 int fd, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001634 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00001635 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001636 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001637 res = close(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00001638 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001639 if (res < 0)
1640 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001641 Py_INCREF(Py_None);
1642 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00001643}
1644
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001645
1646static char posix_dup__doc__[] =
1647"dup(fd) -> fd2\n\
1648Return a duplicate of a file descriptor.";
1649
Barry Warsaw53699e91996-12-10 23:23:01 +00001650static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001651posix_dup(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001652 PyObject *self;
1653 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001654{
1655 int fd;
Barry Warsaw53699e91996-12-10 23:23:01 +00001656 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00001657 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001658 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001659 fd = dup(fd);
Barry Warsaw53699e91996-12-10 23:23:01 +00001660 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001661 if (fd < 0)
1662 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001663 return PyInt_FromLong((long)fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001664}
1665
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001666
1667static char posix_dup2__doc__[] =
1668"dup2(fd, fd2) -> None\n\
1669Duplicate file descriptor.";
1670
Barry Warsaw53699e91996-12-10 23:23:01 +00001671static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001672posix_dup2(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001673 PyObject *self;
1674 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001675{
1676 int fd, fd2, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001677 if (!PyArg_Parse(args, "(ii)", &fd, &fd2))
Guido van Rossum687dd131993-05-17 08:34:16 +00001678 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001679 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001680 res = dup2(fd, fd2);
Barry Warsaw53699e91996-12-10 23:23:01 +00001681 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001682 if (res < 0)
1683 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001684 Py_INCREF(Py_None);
1685 return Py_None;
Guido van Rossum687dd131993-05-17 08:34:16 +00001686}
1687
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001688
1689static char posix_lseek__doc__[] =
1690"lseek(fd, pos, how) -> newpos\n\
1691Set the current position of a file descriptor.";
1692
Barry Warsaw53699e91996-12-10 23:23:01 +00001693static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001694posix_lseek(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001695 PyObject *self;
1696 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001697{
1698 int fd, how;
1699 long pos, res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001700 if (!PyArg_Parse(args, "(ili)", &fd, &pos, &how))
Guido van Rossum687dd131993-05-17 08:34:16 +00001701 return NULL;
1702#ifdef SEEK_SET
1703 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
1704 switch (how) {
1705 case 0: how = SEEK_SET; break;
1706 case 1: how = SEEK_CUR; break;
1707 case 2: how = SEEK_END; break;
1708 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001709#endif /* SEEK_END */
Barry Warsaw53699e91996-12-10 23:23:01 +00001710 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001711 res = lseek(fd, pos, how);
Barry Warsaw53699e91996-12-10 23:23:01 +00001712 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001713 if (res < 0)
1714 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001715 return PyInt_FromLong(res);
Guido van Rossum687dd131993-05-17 08:34:16 +00001716}
1717
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001718
1719static char posix_read__doc__[] =
1720"read(fd, buffersize) -> string\n\
1721Read a file descriptor.";
1722
Barry Warsaw53699e91996-12-10 23:23:01 +00001723static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001724posix_read(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001725 PyObject *self;
1726 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001727{
Guido van Rossum8bac5461996-06-11 18:38:48 +00001728 int fd, size, n;
Barry Warsaw53699e91996-12-10 23:23:01 +00001729 PyObject *buffer;
1730 if (!PyArg_Parse(args, "(ii)", &fd, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00001731 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001732 buffer = PyString_FromStringAndSize((char *)NULL, size);
Guido van Rossum687dd131993-05-17 08:34:16 +00001733 if (buffer == NULL)
1734 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001735 Py_BEGIN_ALLOW_THREADS
1736 n = read(fd, PyString_AsString(buffer), size);
1737 Py_END_ALLOW_THREADS
Guido van Rossum8bac5461996-06-11 18:38:48 +00001738 if (n < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001739 Py_DECREF(buffer);
Guido van Rossum687dd131993-05-17 08:34:16 +00001740 return posix_error();
1741 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00001742 if (n != size)
Barry Warsaw53699e91996-12-10 23:23:01 +00001743 _PyString_Resize(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00001744 return buffer;
1745}
1746
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001747
1748static char posix_write__doc__[] =
1749"write(fd, string) -> byteswritten\n\
1750Write a string to a file descriptor.";
1751
Barry Warsaw53699e91996-12-10 23:23:01 +00001752static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001753posix_write(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001754 PyObject *self;
1755 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001756{
1757 int fd, size;
1758 char *buffer;
Barry Warsaw53699e91996-12-10 23:23:01 +00001759 if (!PyArg_Parse(args, "(is#)", &fd, &buffer, &size))
Guido van Rossum687dd131993-05-17 08:34:16 +00001760 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001761 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001762 size = write(fd, buffer, size);
Barry Warsaw53699e91996-12-10 23:23:01 +00001763 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001764 if (size < 0)
1765 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001766 return PyInt_FromLong((long)size);
Guido van Rossum687dd131993-05-17 08:34:16 +00001767}
1768
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001769
1770static char posix_fstat__doc__[]=
1771"fstat(fd) -> (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\
1772Like stat(), but for an open file descriptor.";
1773
Barry Warsaw53699e91996-12-10 23:23:01 +00001774static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001775posix_fstat(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001776 PyObject *self;
1777 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001778{
1779 int fd;
1780 struct stat st;
1781 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001782 if (!PyArg_Parse(args, "i", &fd))
Guido van Rossum687dd131993-05-17 08:34:16 +00001783 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001784 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001785 res = fstat(fd, &st);
Barry Warsaw53699e91996-12-10 23:23:01 +00001786 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001787 if (res != 0)
1788 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001789 return Py_BuildValue("(llllllllll)",
Barry Warsaw43d68b81996-12-19 22:10:44 +00001790 (long)st.st_mode,
1791 (long)st.st_ino,
1792 (long)st.st_dev,
1793 (long)st.st_nlink,
1794 (long)st.st_uid,
1795 (long)st.st_gid,
1796 (long)st.st_size,
1797 (long)st.st_atime,
1798 (long)st.st_mtime,
1799 (long)st.st_ctime);
Guido van Rossum687dd131993-05-17 08:34:16 +00001800}
1801
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001802
1803static char posix_fdopen__doc__[] =
1804"fdopen(fd, [, mode='r' [, bufsize]]) -> file_object\n\
1805Return an open file object connected to a file descriptor.";
1806
Barry Warsaw53699e91996-12-10 23:23:01 +00001807static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001808posix_fdopen(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001809 PyObject *self;
1810 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001811{
Barry Warsaw53699e91996-12-10 23:23:01 +00001812 extern int fclose Py_PROTO((FILE *));
Guido van Rossum687dd131993-05-17 08:34:16 +00001813 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001814 char *mode = "r";
1815 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00001816 FILE *fp;
Barry Warsaw53699e91996-12-10 23:23:01 +00001817 PyObject *f;
1818 if (!PyArg_ParseTuple(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00001819 return NULL;
Barry Warsaw43d68b81996-12-19 22:10:44 +00001820
Barry Warsaw53699e91996-12-10 23:23:01 +00001821 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001822 fp = fdopen(fd, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001823 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001824 if (fp == NULL)
1825 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001826 f = PyFile_FromFile(fp, "(fdopen)", mode, fclose);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001827 if (f != NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00001828 PyFile_SetBufSize(f, bufsize);
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001829 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00001830}
1831
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001832
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001833#ifdef HAVE_PIPE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001834static char posix_pipe__doc__[] =
1835"pipe() -> (read_end, write_end)\n\
1836Create a pipe.";
1837
Barry Warsaw53699e91996-12-10 23:23:01 +00001838static PyObject *
Guido van Rossum687dd131993-05-17 08:34:16 +00001839posix_pipe(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001840 PyObject *self;
1841 PyObject *args;
Guido van Rossum687dd131993-05-17 08:34:16 +00001842{
Guido van Rossum8d665e61996-06-26 18:22:49 +00001843#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00001844 int fds[2];
1845 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001846 if (!PyArg_Parse(args, ""))
Guido van Rossum687dd131993-05-17 08:34:16 +00001847 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001848 Py_BEGIN_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001849 res = pipe(fds);
Barry Warsaw53699e91996-12-10 23:23:01 +00001850 Py_END_ALLOW_THREADS
Guido van Rossum687dd131993-05-17 08:34:16 +00001851 if (res != 0)
1852 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001853 return Py_BuildValue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00001854#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00001855 HANDLE read, write;
1856 BOOL ok;
Barry Warsaw53699e91996-12-10 23:23:01 +00001857 if (!PyArg_Parse(args, ""))
Guido van Rossum794d8131994-08-23 13:48:48 +00001858 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001859 Py_BEGIN_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00001860 ok = CreatePipe( &read, &write, NULL, 0);
Barry Warsaw53699e91996-12-10 23:23:01 +00001861 Py_END_ALLOW_THREADS
Guido van Rossum794d8131994-08-23 13:48:48 +00001862 if (!ok)
1863 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001864 return Py_BuildValue("(ii)", read, write);
Guido van Rossum8d665e61996-06-26 18:22:49 +00001865#endif /* MS_WIN32 */
Guido van Rossum687dd131993-05-17 08:34:16 +00001866}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001867#endif /* HAVE_PIPE */
1868
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001869
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001870#ifdef HAVE_MKFIFO
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001871static char posix_mkfifo__doc__[] =
1872"mkfifo(file, [, mode=0666]) -> None\n\
1873Create a FIFO (a POSIX named pipe).";
1874
Barry Warsaw53699e91996-12-10 23:23:01 +00001875static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001876posix_mkfifo(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001877 PyObject *self;
1878 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001879{
1880 char *file;
1881 int mode = 0666;
1882 int res;
Barry Warsaw53699e91996-12-10 23:23:01 +00001883 if (!PyArg_ParseTuple(args, "s|i", &file, &mode))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001884 return NULL;
Barry Warsaw53699e91996-12-10 23:23:01 +00001885 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001886 res = mkfifo(file, mode);
Barry Warsaw53699e91996-12-10 23:23:01 +00001887 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001888 if (res < 0)
1889 return posix_error();
Barry Warsaw53699e91996-12-10 23:23:01 +00001890 Py_INCREF(Py_None);
1891 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001892}
1893#endif
1894
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001895
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001896#ifdef HAVE_FTRUNCATE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00001897static char posix_ftruncate__doc__[] =
1898"ftruncate(fd, length) -> None\n\
1899Truncate a file to a specified length.";
1900
Barry Warsaw53699e91996-12-10 23:23:01 +00001901static PyObject *
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001902posix_ftruncate(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00001903 PyObject *self; /* Not used */
1904 PyObject *args;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001905{
1906 int fd;
1907 long length;
1908 int res;
1909
Barry Warsaw53699e91996-12-10 23:23:01 +00001910 if (!PyArg_Parse(args, "(il)", &fd, &length))
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001911 return NULL;
1912
Barry Warsaw53699e91996-12-10 23:23:01 +00001913 Py_BEGIN_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001914 res = ftruncate(fd, length);
Barry Warsaw53699e91996-12-10 23:23:01 +00001915 Py_END_ALLOW_THREADS
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001916 if (res < 0) {
Barry Warsaw53699e91996-12-10 23:23:01 +00001917 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001918 return NULL;
1919 }
Barry Warsaw53699e91996-12-10 23:23:01 +00001920 Py_INCREF(Py_None);
1921 return Py_None;
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001922}
1923#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00001924
Guido van Rossumb9f866c1997-05-22 15:12:39 +00001925#ifdef NeXT
1926#define HAVE_PUTENV
1927/* Steve Spicklemire got this putenv from NeXTAnswers */
1928static int
1929putenv(char *newval)
1930{
1931 extern char **environ;
1932
1933 static int firstTime = 1;
1934 char **ep;
1935 char *cp;
1936 int esiz;
1937 char *np;
1938
1939 if (!(np = strchr(newval, '=')))
1940 return 1;
1941 *np = '\0';
1942
1943 /* look it up */
1944 for (ep=environ ; *ep ; ep++)
1945 {
1946 /* this should always be true... */
1947 if (cp = strchr(*ep, '='))
1948 {
1949 *cp = '\0';
1950 if (!strcmp(*ep, newval))
1951 {
1952 /* got it! */
1953 *cp = '=';
1954 break;
1955 }
1956 *cp = '=';
1957 }
1958 else
1959 {
1960 *np = '=';
1961 return 1;
1962 }
1963 }
1964
1965 *np = '=';
1966 if (*ep)
1967 {
1968 /* the string was already there:
1969 just replace it with the new one */
1970 *ep = newval;
1971 return 0;
1972 }
1973
1974 /* expand environ by one */
1975 for (esiz=2, ep=environ ; *ep ; ep++)
1976 esiz++;
1977 if (firstTime)
1978 {
1979 char **epp;
1980 char **newenv;
1981 if (!(newenv = malloc(esiz * sizeof(char *))))
1982 return 1;
1983
1984 for (ep=environ, epp=newenv ; *ep ;)
1985 *epp++ = *ep++;
1986 *epp++ = newval;
1987 *epp = (char *) 0;
1988 environ = newenv;
1989 }
1990 else
1991 {
1992 if (!(environ = realloc(environ, esiz * sizeof(char *))))
1993 return 1;
1994 environ[esiz - 2] = newval;
1995 environ[esiz - 1] = (char *) 0;
1996 firstTime = 0;
1997 }
1998
1999 return 0;
2000}
Guido van Rossumc6ef2041997-08-21 02:30:45 +00002001#endif /* NeXT */
Guido van Rossumb9f866c1997-05-22 15:12:39 +00002002
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002003
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002004#ifdef HAVE_PUTENV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002005static char posix_putenv__doc__[] =
2006"putenv(key, value) -> None\n\
2007Change or add an environment variable.";
2008
Barry Warsaw53699e91996-12-10 23:23:01 +00002009static PyObject *
Guido van Rossumb6a47161997-09-15 22:54:34 +00002010posix_putenv(self, args)
Barry Warsaw53699e91996-12-10 23:23:01 +00002011 PyObject *self;
2012 PyObject *args;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002013{
2014 char *s1, *s2;
2015 char *new;
2016
Barry Warsaw53699e91996-12-10 23:23:01 +00002017 if (!PyArg_ParseTuple(args, "ss", &s1, &s2))
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002018 return NULL;
2019 /* XXX This leaks memory -- not easy to fix :-( */
2020 if ((new = malloc(strlen(s1) + strlen(s2) + 2)) == NULL)
Barry Warsaw53699e91996-12-10 23:23:01 +00002021 return PyErr_NoMemory();
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002022 (void) sprintf(new, "%s=%s", s1, s2);
2023 if (putenv(new)) {
2024 posix_error();
2025 return NULL;
2026 }
Barry Warsaw53699e91996-12-10 23:23:01 +00002027 Py_INCREF(Py_None);
2028 return Py_None;
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002029}
Guido van Rossumb6a47161997-09-15 22:54:34 +00002030#endif /* putenv */
2031
2032#ifdef HAVE_STRERROR
2033static char posix_strerror__doc__[] =
2034"strerror(code) -> string\n\
2035Translate an error code to a message string.";
2036
2037PyObject *
2038posix_strerror(self, args)
2039 PyObject *self;
2040 PyObject *args;
2041{
2042 int code;
2043 char *message;
2044 if (!PyArg_ParseTuple(args, "i", &code))
2045 return NULL;
2046 message = strerror(code);
2047 if (message == NULL) {
2048 PyErr_SetString(PyExc_ValueError,
2049 "strerror code out of range");
2050 return NULL;
2051 }
2052 return PyString_FromString(message);
2053}
2054#endif /* strerror */
2055
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002056
Barry Warsaw53699e91996-12-10 23:23:01 +00002057static PyMethodDef posix_methods[] = {
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002058 {"chdir", posix_chdir, 0, posix_chdir__doc__},
2059 {"chmod", posix_chmod, 0, posix_chmod__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002060#ifdef HAVE_CHOWN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002061 {"chown", posix_chown, 0, posix_chown__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002062#endif /* HAVE_CHOWN */
Guido van Rossum36bc6801995-06-14 22:54:23 +00002063#ifdef HAVE_GETCWD
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002064 {"getcwd", posix_getcwd, 0, posix_getcwd__doc__},
Guido van Rossum36bc6801995-06-14 22:54:23 +00002065#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00002066#ifdef HAVE_LINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002067 {"link", posix_link, 0, posix_link__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002068#endif /* HAVE_LINK */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002069 {"listdir", posix_listdir, 0, posix_listdir__doc__},
2070 {"lstat", posix_lstat, 0, posix_lstat__doc__},
2071 {"mkdir", posix_mkdir, 1, posix_mkdir__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002072#ifdef HAVE_NICE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002073 {"nice", posix_nice, 0, posix_nice__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002074#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002075#ifdef HAVE_READLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002076 {"readlink", posix_readlink, 0, posix_readlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002077#endif /* HAVE_READLINK */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002078 {"rename", posix_rename, 0, posix_rename__doc__},
2079 {"rmdir", posix_rmdir, 0, posix_rmdir__doc__},
2080 {"stat", posix_stat, 0, posix_stat__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002081#ifdef HAVE_SYMLINK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002082 {"symlink", posix_symlink, 0, posix_symlink__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002083#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002084#ifdef HAVE_SYSTEM
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002085 {"system", posix_system, 0, posix_system__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002086#endif
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002087 {"umask", posix_umask, 0, posix_umask__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002088#ifdef HAVE_UNAME
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002089 {"uname", posix_uname, 0, posix_uname__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002090#endif /* HAVE_UNAME */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002091 {"unlink", posix_unlink, 0, posix_unlink__doc__},
2092 {"remove", posix_unlink, 0, posix_remove__doc__},
2093 {"utime", posix_utime, 0, posix_utime__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002094#ifdef HAVE_TIMES
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002095 {"times", posix_times, 0, posix_times__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002096#endif /* HAVE_TIMES */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002097 {"_exit", posix__exit, 0, posix__exit__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002098#ifdef HAVE_EXECV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002099 {"execv", posix_execv, 0, posix_execv__doc__},
2100 {"execve", posix_execve, 0, posix_execve__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002101#endif /* HAVE_EXECV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00002102#ifdef HAVE_FORK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002103 {"fork", posix_fork, 0, posix_fork__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002104#endif /* HAVE_FORK */
2105#ifdef HAVE_GETEGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002106 {"getegid", posix_getegid, 0, posix_getegid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002107#endif /* HAVE_GETEGID */
2108#ifdef HAVE_GETEUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002109 {"geteuid", posix_geteuid, 0, posix_geteuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002110#endif /* HAVE_GETEUID */
2111#ifdef HAVE_GETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002112 {"getgid", posix_getgid, 0, posix_getgid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002113#endif /* HAVE_GETGID */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002114 {"getpid", posix_getpid, 0, posix_getpid__doc__},
Guido van Rossumb6775db1994-08-01 11:34:53 +00002115#ifdef HAVE_GETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002116 {"getpgrp", posix_getpgrp, 0, posix_getpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002117#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00002118#ifdef HAVE_GETPPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002119 {"getppid", posix_getppid, 0, posix_getppid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002120#endif /* HAVE_GETPPID */
2121#ifdef HAVE_GETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002122 {"getuid", posix_getuid, 0, posix_getuid__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002123#endif /* HAVE_GETUID */
2124#ifdef HAVE_KILL
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002125 {"kill", posix_kill, 0, posix_kill__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002126#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00002127#ifdef HAVE_PLOCK
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002128 {"plock", posix_plock, 0, posix_plock__doc__},
Guido van Rossumc0125471996-06-28 18:55:32 +00002129#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002130#ifdef HAVE_POPEN
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002131 {"popen", posix_popen, 1, posix_popen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002132#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002133#ifdef HAVE_SETUID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002134 {"setuid", posix_setuid, 0, posix_setuid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002135#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002136#ifdef HAVE_SETGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002137 {"setgid", posix_setgid, 0, posix_setgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002138#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002139#ifdef HAVE_SETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002140 {"setpgrp", posix_setpgrp, 0, posix_setpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002141#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00002142#ifdef HAVE_WAIT
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002143 {"wait", posix_wait, 0, posix_wait__doc__},
Guido van Rossumad0ee831995-03-01 10:34:45 +00002144#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002145#ifdef HAVE_WAITPID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002146 {"waitpid", posix_waitpid, 0, posix_waitpid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002147#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002148#ifdef HAVE_SETSID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002149 {"setsid", posix_setsid, 0, posix_setsid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002150#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002151#ifdef HAVE_SETPGID
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002152 {"setpgid", posix_setpgid, 0, posix_setpgid__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002153#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002154#ifdef HAVE_TCGETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002155 {"tcgetpgrp", posix_tcgetpgrp, 0, posix_tcgetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002156#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002157#ifdef HAVE_TCSETPGRP
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002158 {"tcsetpgrp", posix_tcsetpgrp, 0, posix_tcsetpgrp__doc__},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00002159#endif /* HAVE_TCSETPGRP */
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002160 {"open", posix_open, 1, posix_open__doc__},
2161 {"close", posix_close, 0, posix_close__doc__},
2162 {"dup", posix_dup, 0, posix_dup__doc__},
2163 {"dup2", posix_dup2, 0, posix_dup2__doc__},
2164 {"lseek", posix_lseek, 0, posix_lseek__doc__},
2165 {"read", posix_read, 0, posix_read__doc__},
2166 {"write", posix_write, 0, posix_write__doc__},
2167 {"fstat", posix_fstat, 0, posix_fstat__doc__},
2168 {"fdopen", posix_fdopen, 1, posix_fdopen__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002169#ifdef HAVE_PIPE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002170 {"pipe", posix_pipe, 0, posix_pipe__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002171#endif
2172#ifdef HAVE_MKFIFO
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002173 {"mkfifo", posix_mkfifo, 1, posix_mkfifo__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002174#endif
2175#ifdef HAVE_FTRUNCATE
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002176 {"ftruncate", posix_ftruncate, 1, posix_ftruncate__doc__},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00002177#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002178#ifdef HAVE_PUTENV
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002179 {"putenv", posix_putenv, 1, posix_putenv__doc__},
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00002180#endif
Guido van Rossumb6a47161997-09-15 22:54:34 +00002181#ifdef HAVE_STRERROR
2182 {"strerror", posix_strerror, 1, posix_strerror__doc__},
2183#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002184 {NULL, NULL} /* Sentinel */
2185};
2186
2187
Barry Warsaw4a342091996-12-19 23:50:02 +00002188static int
2189ins(d, symbol, value)
2190 PyObject* d;
2191 char* symbol;
2192 long value;
2193{
2194 PyObject* v = PyInt_FromLong(value);
2195 if (!v || PyDict_SetItemString(d, symbol, v) < 0)
2196 return -1; /* triggers fatal error */
2197
2198 Py_DECREF(v);
2199 return 0;
2200}
2201
2202static int
2203all_ins(d)
2204 PyObject* d;
2205{
2206#ifdef WNOHANG
2207 if (ins(d, "WNOHANG", (long)WNOHANG)) return -1;
2208#endif
2209#ifdef O_RDONLY
2210 if (ins(d, "O_RDONLY", (long)O_RDONLY)) return -1;
2211#endif
2212#ifdef O_WRONLY
2213 if (ins(d, "O_WRONLY", (long)O_WRONLY)) return -1;
2214#endif
2215#ifdef O_RDWR
2216 if (ins(d, "O_RDWR", (long)O_RDWR)) return -1;
2217#endif
2218#ifdef O_NDELAY
2219 if (ins(d, "O_NDELAY", (long)O_NDELAY)) return -1;
2220#endif
2221#ifdef O_NONBLOCK
2222 if (ins(d, "O_NONBLOCK", (long)O_NONBLOCK)) return -1;
2223#endif
2224#ifdef O_APPEND
2225 if (ins(d, "O_APPEND", (long)O_APPEND)) return -1;
2226#endif
2227#ifdef O_DSYNC
2228 if (ins(d, "O_DSYNC", (long)O_DSYNC)) return -1;
2229#endif
2230#ifdef O_RSYNC
2231 if (ins(d, "O_RSYNC", (long)O_RSYNC)) return -1;
2232#endif
2233#ifdef O_SYNC
2234 if (ins(d, "O_SYNC", (long)O_SYNC)) return -1;
2235#endif
2236#ifdef O_NOCTTY
2237 if (ins(d, "O_NOCTTY", (long)O_NOCTTY)) return -1;
2238#endif
2239#ifdef O_CREAT
2240 if (ins(d, "O_CREAT", (long)O_CREAT)) return -1;
2241#endif
2242#ifdef O_EXCL
2243 if (ins(d, "O_EXCL", (long)O_EXCL)) return -1;
2244#endif
2245#ifdef O_TRUNC
2246 if (ins(d, "O_TRUNC", (long)O_TRUNC)) return -1;
2247#endif
Guido van Rossum98d9d091997-08-08 21:48:51 +00002248#ifdef O_BINARY
2249 if (ins(d, "O_BINARY", (long)O_BINARY)) return -1;
2250#endif
2251#ifdef O_TEXT
2252 if (ins(d, "O_TEXT", (long)O_TEXT)) return -1;
2253#endif
Barry Warsaw4a342091996-12-19 23:50:02 +00002254 return 0;
2255}
2256
2257
Guido van Rossuma0e71301996-05-28 22:30:38 +00002258#if defined(_MSC_VER) || defined(__WATCOMC__)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002259#define INITFUNC initnt
2260#define MODNAME "nt"
2261#else
2262#define INITFUNC initposix
2263#define MODNAME "posix"
2264#endif
2265
Guido van Rossumb6775db1994-08-01 11:34:53 +00002266void
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002267INITFUNC()
Guido van Rossumb6775db1994-08-01 11:34:53 +00002268{
Barry Warsaw53699e91996-12-10 23:23:01 +00002269 PyObject *m, *d, *v;
Guido van Rossumb6775db1994-08-01 11:34:53 +00002270
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002271 m = Py_InitModule4(MODNAME,
Guido van Rossumec4f4ac1997-06-02 22:20:51 +00002272 posix_methods,
2273 posix__doc__,
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002274 (PyObject *)NULL,
2275 PYTHON_API_VERSION);
Barry Warsaw53699e91996-12-10 23:23:01 +00002276 d = PyModule_GetDict(m);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002277
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002278 /* Initialize environ dictionary */
Guido van Rossumb6775db1994-08-01 11:34:53 +00002279 v = convertenviron();
Barry Warsaw53699e91996-12-10 23:23:01 +00002280 if (v == NULL || PyDict_SetItemString(d, "environ", v) != 0)
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002281 return;
Barry Warsaw53699e91996-12-10 23:23:01 +00002282 Py_DECREF(v);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002283
Barry Warsaw4a342091996-12-19 23:50:02 +00002284 if (all_ins(d))
Barry Warsaw4a342091996-12-19 23:50:02 +00002285 return;
2286
Guido van Rossum0cb96de1997-10-01 04:29:29 +00002287 /* Initialize exception */
2288 PosixError = PyErr_NewException("os.error", NULL, NULL);
2289 if (PosixError != NULL)
2290 PyDict_SetItemString(d, "error", PosixError);
Guido van Rossumb6775db1994-08-01 11:34:53 +00002291}