blob: 16bfe091a2d4cc86e9622d9b75f80a827afc1306 [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
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* POSIX module implementation */
26
Guido van Rossuma4916fa1996-05-23 22:58:55 +000027/* This file is also used for Windows NT and MS-Win. In that case the module
Guido van Rossumad0ee831995-03-01 10:34:45 +000028 actually calls itself 'nt', not 'posix', and a few functions are
29 either unimplemented or implemented differently. The source
Guido van Rossum8d665e61996-06-26 18:22:49 +000030 assumes that for Windows NT, the macro 'MS_WIN32' is defined independent
Guido van Rossumad0ee831995-03-01 10:34:45 +000031 of the compiler used. Different compilers define their own feature
Guido van Rossuma4916fa1996-05-23 22:58:55 +000032 test macro, e.g. '__BORLANDC__' or '_MSC_VER'. */
Guido van Rossumad0ee831995-03-01 10:34:45 +000033
Guido van Rossuma4916fa1996-05-23 22:58:55 +000034/* See also ../Dos/dosmodule.c */
Guido van Rossumad0ee831995-03-01 10:34:45 +000035
Guido van Rossum3f5da241990-12-20 15:06:42 +000036#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037#include "modsupport.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000038#include "ceval.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039
Guido van Rossumb6775db1994-08-01 11:34:53 +000040#include <string.h>
41#include <errno.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +000042#include <sys/types.h>
43#include <sys/stat.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +000044#ifdef HAVE_SYS_WAIT_H
45#include <sys/wait.h> /* For WNOHANG */
46#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000047
48#include "mytime.h" /* For clock_t on some systems */
49
50#ifdef HAVE_FCNTL_H
51#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000052#endif /* HAVE_FCNTL_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +000053
Guido van Rossuma4916fa1996-05-23 22:58:55 +000054/* Various compilers have only certain posix functions */
55#ifdef __WATCOMC__ /* Watcom compiler */
56#define HAVE_GETCWD 1
57#define HAVE_OPENDIR 1
58#define HAVE_SYSTEM 1
59#if defined(__OS2__)
60#define HAVE_EXECV 1
61#define HAVE_WAIT 1
Guido van Rossumad0ee831995-03-01 10:34:45 +000062#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +000063#include <process.h>
64#else
65#ifdef __BORLANDC__ /* Borland compiler */
66#define HAVE_EXECV 1
67#define HAVE_GETCWD 1
68#define HAVE_GETEGID 1
69#define HAVE_GETEUID 1
70#define HAVE_GETGID 1
71#define HAVE_GETPPID 1
72#define HAVE_GETUID 1
73#define HAVE_KILL 1
74#define HAVE_OPENDIR 1
75#define HAVE_PIPE 1
76#define HAVE_POPEN 1
77#define HAVE_SYSTEM 1
78#define HAVE_WAIT 1
79#else
80#ifdef _MSC_VER /* Microsoft compiler */
Guido van Rossum8d665e61996-06-26 18:22:49 +000081#define HAVE_GETCWD 1
82#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +000083#define HAVE_EXECV 1
84#define HAVE_PIPE 1
85#define HAVE_POPEN 1
86#define HAVE_SYSTEM 1
87#else /* 16-bit Windows */
Guido van Rossum8d665e61996-06-26 18:22:49 +000088#endif /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +000089#else /* all other compilers */
90/* Unix functions that the configure script doesn't check for */
91#define HAVE_EXECV 1
92#define HAVE_FORK 1
93#define HAVE_GETCWD 1
94#define HAVE_GETEGID 1
95#define HAVE_GETEUID 1
96#define HAVE_GETGID 1
97#define HAVE_GETPPID 1
98#define HAVE_GETUID 1
99#define HAVE_KILL 1
100#define HAVE_OPENDIR 1
101#define HAVE_PIPE 1
102#define HAVE_POPEN 1
103#define HAVE_SYSTEM 1
104#define HAVE_WAIT 1
105#endif /* _MSC_VER */
106#endif /* __BORLANDC__ */
107#endif /* ! __WATCOMC__ */
Guido van Rossumad0ee831995-03-01 10:34:45 +0000108
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000109#ifndef _MSC_VER
Guido van Rossum36bc6801995-06-14 22:54:23 +0000110
Guido van Rossumb6775db1994-08-01 11:34:53 +0000111#ifdef HAVE_UNISTD_H
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000112#include <unistd.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +0000113#endif
114
115#ifdef NeXT
116/* NeXT's <unistd.h> and <utime.h> aren't worth much */
117#undef HAVE_UNISTD_H
118#undef HAVE_UTIME_H
119/* #undef HAVE_GETCWD */
120#endif
121
122#ifdef HAVE_UNISTD_H
Guido van Rossumad0ee831995-03-01 10:34:45 +0000123/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
124extern int rename();
125extern int pclose();
126extern int lstat();
127extern int symlink();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000128#else /* !HAVE_UNISTD_H */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000129#if defined(__WATCOMC__) || defined(_MSC_VER)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000130extern int mkdir PROTO((const char *));
131#else
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000132extern int mkdir PROTO((const char *, mode_t));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000133#endif
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000134extern int chdir PROTO((const char *));
Guido van Rossume22e6441993-07-09 10:51:31 +0000135extern int rmdir PROTO((const char *));
136extern int chmod PROTO((const char *, mode_t));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000137extern int chown PROTO((const char *, uid_t, gid_t));
138extern char *getcwd PROTO((char *, int));
Guido van Rossume22e6441993-07-09 10:51:31 +0000139extern char *strerror PROTO((int));
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000140extern int link PROTO((const char *, const char *));
141extern int rename PROTO((const char *, const char *));
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000142extern int stat PROTO((const char *, struct stat *));
143extern int unlink PROTO((const char *));
144extern int pclose PROTO((FILE *));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000145#ifdef HAVE_SYMLINK
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000146extern int symlink PROTO((const char *, const char *));
Guido van Rossuma38a5031995-02-17 15:11:36 +0000147#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000148#ifdef HAVE_LSTAT
149extern int lstat PROTO((const char *, struct stat *));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000150#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000151#endif /* !HAVE_UNISTD_H */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000152
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000153#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000154
Guido van Rossumb6775db1994-08-01 11:34:53 +0000155#ifdef HAVE_UTIME_H
156#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000157#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000158
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000159#ifdef HAVE_SYS_UTIME_H
160#include <sys/utime.h>
161#define HAVE_UTIME_H /* pretend we do for the rest of this file */
162#endif /* HAVE_SYS_UTIME_H */
163
Guido van Rossumb6775db1994-08-01 11:34:53 +0000164#ifdef HAVE_SYS_TIMES_H
165#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000166#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000167
168#ifdef HAVE_SYS_PARAM_H
169#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000170#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000171
172#ifdef HAVE_SYS_UTSNAME_H
173#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000174#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000175
176#ifndef MAXPATHLEN
177#define MAXPATHLEN 1024
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000178#endif /* MAXPATHLEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000179
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000180#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000181#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000182#define NAMLEN(dirent) strlen((dirent)->d_name)
183#else
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000184#ifdef __WATCOMC__
185#include <direct.h>
186#define NAMLEN(dirent) strlen((dirent)->d_name)
187#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000188#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000189#define NAMLEN(dirent) (dirent)->d_namlen
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000190#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000191#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000192#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000193#endif
194#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000195#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000196#endif
197#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000198#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000199#endif
200#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000201
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000202#ifdef _MSC_VER
Guido van Rossumb6775db1994-08-01 11:34:53 +0000203#include <direct.h>
204#include <io.h>
205#include <process.h>
206#include <windows.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000207#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000208#define popen _popen
Guido van Rossum794d8131994-08-23 13:48:48 +0000209#define pclose _pclose
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000210#else /* 16-bit Windows */
211#include <dos.h>
212#include <ctype.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000213#endif /* MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000214#endif /* _MSC_VER */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000215
216#ifdef OS2
217#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000218#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000219
220/* Return a dictionary corresponding to the POSIX environment table */
221
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000222#if !defined(_MSC_VER) && !defined(__WATCOMC__)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000224#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000225
226static object *
227convertenviron()
228{
229 object *d;
230 char **e;
231 d = newdictobject();
232 if (d == NULL)
233 return NULL;
234 if (environ == NULL)
235 return d;
236 /* XXX This part ignores errors */
237 for (e = environ; *e != NULL; e++) {
238 object *v;
239 char *p = strchr(*e, '=');
240 if (p == NULL)
241 continue;
242 v = newstringobject(p+1);
243 if (v == NULL)
244 continue;
245 *p = '\0';
246 (void) dictinsert(d, *e, v);
247 *p = '=';
248 DECREF(v);
249 }
250 return d;
251}
252
253
254static object *PosixError; /* Exception posix.error */
255
256/* Set a POSIX-specific error from errno, and return NULL */
257
Guido van Rossumad0ee831995-03-01 10:34:45 +0000258static object * posix_error()
259{
260 return err_errno(PosixError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261}
262
263
264/* POSIX generic methods */
265
266static object *
267posix_1str(args, func)
268 object *args;
269 int (*func) FPROTO((const char *));
270{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000271 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000272 int res;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000273 if (!getargs(args, "s", &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000275 BGN_SAVE
276 res = (*func)(path1);
277 END_SAVE
278 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279 return posix_error();
280 INCREF(None);
281 return None;
282}
283
284static object *
285posix_2str(args, func)
286 object *args;
287 int (*func) FPROTO((const char *, const char *));
288{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000289 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000290 int res;
Guido van Rossum234f9421993-06-17 12:35:49 +0000291 if (!getargs(args, "(ss)", &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000293 BGN_SAVE
294 res = (*func)(path1, path2);
295 END_SAVE
296 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000297 return posix_error();
298 INCREF(None);
299 return None;
300}
301
302static object *
303posix_strint(args, func)
304 object *args;
305 int (*func) FPROTO((const char *, int));
306{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000307 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000309 int res;
Guido van Rossum234f9421993-06-17 12:35:49 +0000310 if (!getargs(args, "(si)", &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000312 BGN_SAVE
313 res = (*func)(path, i);
314 END_SAVE
315 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316 return posix_error();
317 INCREF(None);
318 return None;
319}
320
321static object *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000322posix_strintint(args, func)
323 object *args;
324 int (*func) FPROTO((const char *, int, int));
325{
326 char *path;
327 int i,i2;
328 int res;
329 if (!getargs(args, "(sii)", &path, &i, &i2))
330 return NULL;
331 BGN_SAVE
332 res = (*func)(path, i, i2);
333 END_SAVE
334 if (res < 0)
335 return posix_error();
336 INCREF(None);
337 return None;
338}
339
340static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341posix_do_stat(self, args, statfunc)
342 object *self;
343 object *args;
344 int (*statfunc) FPROTO((const char *, struct stat *));
345{
346 struct stat st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000347 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000348 int res;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000349 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000350 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000351 BGN_SAVE
352 res = (*statfunc)(path, &st);
353 END_SAVE
354 if (res != 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355 return posix_error();
Guido van Rossum687dd131993-05-17 08:34:16 +0000356 return mkvalue("(llllllllll)",
Guido van Rossume5372401993-03-16 12:15:04 +0000357 (long)st.st_mode,
358 (long)st.st_ino,
359 (long)st.st_dev,
360 (long)st.st_nlink,
361 (long)st.st_uid,
362 (long)st.st_gid,
363 (long)st.st_size,
364 (long)st.st_atime,
365 (long)st.st_mtime,
366 (long)st.st_ctime);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000367}
368
369
370/* POSIX methods */
371
372static object *
373posix_chdir(self, args)
374 object *self;
375 object *args;
376{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000377 return posix_1str(args, chdir);
378}
379
380static object *
381posix_chmod(self, args)
382 object *self;
383 object *args;
384{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 return posix_strint(args, chmod);
386}
387
Guido van Rossumb6775db1994-08-01 11:34:53 +0000388#ifdef HAVE_CHOWN
389static object *
390posix_chown(self, args)
391 object *self;
392 object *args;
393{
394 return posix_strintint(args, chown);
395}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000396#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000397
Guido van Rossum36bc6801995-06-14 22:54:23 +0000398#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000399static object *
400posix_getcwd(self, args)
401 object *self;
402 object *args;
403{
404 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000405 char *res;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406 if (!getnoarg(args))
407 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000408 BGN_SAVE
409 res = getcwd(buf, sizeof buf);
410 END_SAVE
411 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412 return posix_error();
413 return newstringobject(buf);
414}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000415#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000416
Guido van Rossumb6775db1994-08-01 11:34:53 +0000417#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418static object *
419posix_link(self, args)
420 object *self;
421 object *args;
422{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000423 return posix_2str(args, link);
424}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000425#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426
Guido van Rossumb6775db1994-08-01 11:34:53 +0000427static object *
428posix_listdir(self, args)
429 object *self;
430 object *args;
431{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000432#if defined(MS_WIN32) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000433
Guido van Rossumb6775db1994-08-01 11:34:53 +0000434 char *name;
435 int len;
436 object *d, *v;
437 HANDLE hFindFile;
438 WIN32_FIND_DATA FileData;
439 char namebuf[MAX_PATH+5];
440
441 if (!getargs(args, "s#", &name, &len))
442 return NULL;
443 if (len >= MAX_PATH) {
444 err_setstr(ValueError, "path too long");
445 return NULL;
446 }
447 strcpy(namebuf, name);
448 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
449 namebuf[len++] = '/';
450 strcpy(namebuf + len, "*.*");
451
452 if ((d = newlistobject(0)) == NULL)
453 return NULL;
454
455 hFindFile = FindFirstFile(namebuf, &FileData);
456 if (hFindFile == INVALID_HANDLE_VALUE) {
457 errno = GetLastError();
458 return posix_error();
459 }
460 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000461 if (FileData.cFileName[0] == '.' &&
462 (FileData.cFileName[1] == '\0' ||
463 FileData.cFileName[1] == '.' &&
464 FileData.cFileName[2] == '\0'))
465 continue;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000466 v = newstringobject(FileData.cFileName);
467 if (v == NULL) {
468 DECREF(d);
469 d = NULL;
470 break;
471 }
472 if (addlistitem(d, v) != 0) {
473 DECREF(v);
474 DECREF(d);
475 d = NULL;
476 break;
477 }
478 DECREF(v);
479 } while (FindNextFile(hFindFile, &FileData) == TRUE);
480
481 if (FindClose(hFindFile) == FALSE) {
482 errno = GetLastError();
483 return posix_error();
484 }
485
486 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000487
Guido van Rossum8d665e61996-06-26 18:22:49 +0000488#else /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000489#ifdef _MSC_VER /* 16-bit Windows */
490
491#ifndef MAX_PATH
492#define MAX_PATH 250
493#endif
494 char *name, *pt;
495 int len;
496 object *d, *v;
497 char namebuf[MAX_PATH+5];
498 struct _find_t ep;
499
500 if (!getargs(args, "s#", &name, &len))
501 return NULL;
502 if (len >= MAX_PATH) {
503 err_setstr(ValueError, "path too long");
504 return NULL;
505 }
506 strcpy(namebuf, name);
507 for (pt = namebuf; *pt; pt++)
508 if (*pt == '/')
509 *pt = '\\';
510 if (namebuf[len-1] != '\\')
511 namebuf[len++] = '\\';
512 strcpy(namebuf + len, "*.*");
513
514 if ((d = newlistobject(0)) == NULL)
515 return NULL;
516
517 if (_dos_findfirst(namebuf, _A_RDONLY |
518 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0){
519 errno = ENOENT;
520 return posix_error();
521 }
522 do {
523 if (ep.name[0] == '.' &&
524 (ep.name[1] == '\0' ||
525 ep.name[1] == '.' &&
526 ep.name[2] == '\0'))
527 continue;
528 strcpy(namebuf, ep.name);
529 for (pt = namebuf; *pt; pt++)
530 if (isupper(*pt))
531 *pt = tolower(*pt);
532 v = newstringobject(namebuf);
533 if (v == NULL) {
534 DECREF(d);
535 d = NULL;
536 break;
537 }
538 if (addlistitem(d, v) != 0) {
539 DECREF(v);
540 DECREF(d);
541 d = NULL;
542 break;
543 }
544 DECREF(v);
545 } while (_dos_findnext(&ep) == 0);
546
547 return d;
548
549#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000550
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000551 char *name;
552 object *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000553 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000554 struct dirent *ep;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000555 if (!getargs(args, "s", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000556 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000557 BGN_SAVE
558 if ((dirp = opendir(name)) == NULL) {
559 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000560 return posix_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000561 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000562 if ((d = newlistobject(0)) == NULL) {
563 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000564 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565 return NULL;
566 }
567 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000568 if (ep->d_name[0] == '.' &&
569 (NAMLEN(ep) == 1 ||
570 ep->d_name[1] == '.' && NAMLEN(ep) == 2))
571 continue;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000572 v = newsizedstringobject(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000573 if (v == NULL) {
574 DECREF(d);
575 d = NULL;
576 break;
577 }
578 if (addlistitem(d, v) != 0) {
579 DECREF(v);
580 DECREF(d);
581 d = NULL;
582 break;
583 }
584 DECREF(v);
585 }
586 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000587 END_SAVE
Guido van Rossum0ee42cd1991-04-08 21:01:03 +0000588
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000589 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000590
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000591#endif /* !_MSC_VER */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000592#endif /* !MS_WIN32 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000593}
594
595static object *
596posix_mkdir(self, args)
597 object *self;
598 object *args;
599{
Guido van Rossumb0824db1996-02-25 04:50:32 +0000600 int res;
601 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000602 int mode = 0777;
Guido van Rossumb0824db1996-02-25 04:50:32 +0000603 if (!newgetargs(args, "s|i", &path, &mode))
604 return NULL;
605 BGN_SAVE
Guido van Rossum8d665e61996-06-26 18:22:49 +0000606#if defined(__WATCOMC__) || defined(_MSC_VER)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000607 res = mkdir(path);
608#else
Guido van Rossumb0824db1996-02-25 04:50:32 +0000609 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000610#endif
Guido van Rossumb0824db1996-02-25 04:50:32 +0000611 END_SAVE
612 if (res < 0)
613 return posix_error();
614 INCREF(None);
615 return None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000616}
617
Guido van Rossumb6775db1994-08-01 11:34:53 +0000618#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +0000619static object *
620posix_nice(self, args)
621 object *self;
622 object *args;
623{
624 int increment, value;
625
626 if (!getargs(args, "i", &increment))
627 return NULL;
628 value = nice(increment);
629 if (value == -1)
630 return posix_error();
631 return newintobject((long) value);
632}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000633#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000634
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000635static object *
636posix_rename(self, args)
637 object *self;
638 object *args;
639{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000640 return posix_2str(args, rename);
641}
642
643static object *
644posix_rmdir(self, args)
645 object *self;
646 object *args;
647{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000648 return posix_1str(args, rmdir);
649}
650
651static object *
652posix_stat(self, args)
653 object *self;
654 object *args;
655{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000656 return posix_do_stat(self, args, stat);
657}
658
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000659#ifdef HAVE_SYSTEM
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000660static object *
661posix_system(self, args)
662 object *self;
663 object *args;
664{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000665 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000666 long sts;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000667 if (!getargs(args, "s", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000668 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000669 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000670 sts = system(command);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000671 END_SAVE
672 return newintobject(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000673}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000674#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000675
676static object *
677posix_umask(self, args)
678 object *self;
679 object *args;
680{
681 int i;
682 if (!getintarg(args, &i))
683 return NULL;
684 i = umask(i);
685 if (i < 0)
686 return posix_error();
687 return newintobject((long)i);
688}
689
690static object *
691posix_unlink(self, args)
692 object *self;
693 object *args;
694{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000695 return posix_1str(args, unlink);
696}
697
Guido van Rossumb6775db1994-08-01 11:34:53 +0000698#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000699static object *
700posix_uname(self, args)
701 object *self;
702 object *args;
703{
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000704 struct utsname u;
705 object *v;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000706 int res;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000707 if (!getnoarg(args))
708 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000709 BGN_SAVE
710 res = uname(&u);
711 END_SAVE
712 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000713 return posix_error();
Guido van Rossume5372401993-03-16 12:15:04 +0000714 return mkvalue("(sssss)",
715 u.sysname,
716 u.nodename,
717 u.release,
718 u.version,
719 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000720}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000721#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000722
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000723static object *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000724posix_utime(self, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000725 object *self;
726 object *args;
727{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000728 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000729 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000730 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000731
Guido van Rossumb6775db1994-08-01 11:34:53 +0000732#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000733 struct utimbuf buf;
734#define ATIME buf.actime
735#define MTIME buf.modtime
736#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000737#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000738 time_t buf[2];
739#define ATIME buf[0]
740#define MTIME buf[1]
741#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000742#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000743
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000744 if (!getargs(args, "(s(ll))", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000745 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000746 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +0000747 MTIME = mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000748 BGN_SAVE
749 res = utime(path, UTIME_ARG);
750 END_SAVE
751 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000752 return posix_error();
753 INCREF(None);
754 return None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000755#undef UTIME_ARG
756#undef ATIME
757#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000758}
759
Guido van Rossum85e3b011991-06-03 12:42:10 +0000760
Guido van Rossum3b066191991-06-04 19:40:25 +0000761/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000762
763static object *
764posix__exit(self, args)
765 object *self;
766 object *args;
767{
768 int sts;
769 if (!getintarg(args, &sts))
770 return NULL;
771 _exit(sts);
772 /* NOTREACHED */
773}
774
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000775#ifdef HAVE_EXECV
Guido van Rossum85e3b011991-06-03 12:42:10 +0000776static object *
Guido van Rossum89b33251993-10-22 14:26:06 +0000777posix_execv(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +0000778 object *self;
779 object *args;
780{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000781 char *path;
782 object *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000783 char **argvlist;
784 int i, argc;
785 object *(*getitem) PROTO((object *, int));
786
Guido van Rossum89b33251993-10-22 14:26:06 +0000787 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +0000788 argv is a list or tuple of strings. */
789
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000790 if (!getargs(args, "(sO)", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000791 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000792 if (is_listobject(argv)) {
793 argc = getlistsize(argv);
794 getitem = getlistitem;
795 }
796 else if (is_tupleobject(argv)) {
797 argc = gettuplesize(argv);
798 getitem = gettupleitem;
799 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000800 else {
801 badarg:
802 err_badarg();
803 return NULL;
804 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000805
806 argvlist = NEW(char *, argc+1);
807 if (argvlist == NULL)
808 return NULL;
809 for (i = 0; i < argc; i++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000810 if (!getargs((*getitem)(argv, i), "s", &argvlist[i])) {
Guido van Rossum85e3b011991-06-03 12:42:10 +0000811 DEL(argvlist);
812 goto badarg;
813 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000814 }
815 argvlist[argc] = NULL;
816
Guido van Rossumb6775db1994-08-01 11:34:53 +0000817#ifdef BAD_EXEC_PROTOTYPES
818 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000819#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000820 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000821#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000822
Guido van Rossum85e3b011991-06-03 12:42:10 +0000823 /* If we get here it's definitely an error */
824
825 DEL(argvlist);
826 return posix_error();
827}
828
829static object *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000830posix_execve(self, args)
831 object *self;
832 object *args;
833{
834 char *path;
835 object *argv, *env;
836 char **argvlist;
837 char **envlist;
838 object *key, *val;
839 int i, pos, argc, envc;
840 object *(*getitem) PROTO((object *, int));
841
842 /* execve has three arguments: (path, argv, env), where
843 argv is a list or tuple of strings and env is a dictionary
844 like posix.environ. */
845
846 if (!getargs(args, "(sOO)", &path, &argv, &env))
847 return NULL;
848 if (is_listobject(argv)) {
849 argc = getlistsize(argv);
850 getitem = getlistitem;
851 }
852 else if (is_tupleobject(argv)) {
853 argc = gettuplesize(argv);
854 getitem = gettupleitem;
855 }
856 else {
857 err_setstr(TypeError, "argv must be tuple or list");
858 return NULL;
859 }
860 if (!is_dictobject(env)) {
861 err_setstr(TypeError, "env must be dictionary");
862 return NULL;
863 }
864
865 argvlist = NEW(char *, argc+1);
866 if (argvlist == NULL) {
867 err_nomem();
868 return NULL;
869 }
870 for (i = 0; i < argc; i++) {
871 if (!getargs((*getitem)(argv, i),
872 "s;argv must be list of strings",
873 &argvlist[i])) {
874 goto fail_1;
875 }
876 }
877 argvlist[argc] = NULL;
878
879 i = getmappingsize(env);
880 envlist = NEW(char *, i + 1);
881 if (envlist == NULL) {
882 err_nomem();
883 goto fail_1;
884 }
885 pos = 0;
886 envc = 0;
887 while (mappinggetnext(env, &pos, &key, &val)) {
888 char *p, *k, *v;
889 if (!getargs(key, "s;non-string key in env", &k) ||
890 !getargs(val, "s;non-string value in env", &v)) {
891 goto fail_2;
892 }
893 p = NEW(char, getstringsize(key) + getstringsize(val) + 2);
894 if (p == NULL) {
895 err_nomem();
896 goto fail_2;
897 }
898 sprintf(p, "%s=%s", k, v);
899 envlist[envc++] = p;
900 }
901 envlist[envc] = 0;
902
Guido van Rossumb6775db1994-08-01 11:34:53 +0000903
904#ifdef BAD_EXEC_PROTOTYPES
905 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000906#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000907 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000908#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000909
910 /* If we get here it's definitely an error */
911
912 (void) posix_error();
913
914 fail_2:
915 while (--envc >= 0)
916 DEL(envlist[envc]);
917 DEL(envlist);
918 fail_1:
919 DEL(argvlist);
920
921 return NULL;
922}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000923#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000924
Guido van Rossumad0ee831995-03-01 10:34:45 +0000925#ifdef HAVE_FORK
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000926static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000927posix_fork(self, args)
928 object *self;
929 object *args;
930{
931 int pid;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000932 if (!getnoarg(args))
933 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000934 pid = fork();
935 if (pid == -1)
936 return posix_error();
937 return newintobject((long)pid);
938}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000939#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000940
Guido van Rossumad0ee831995-03-01 10:34:45 +0000941#ifdef HAVE_GETEGID
Guido van Rossum85e3b011991-06-03 12:42:10 +0000942static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000943posix_getegid(self, args)
944 object *self;
945 object *args;
946{
947 if (!getnoarg(args))
948 return NULL;
949 return newintobject((long)getegid());
950}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000951#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000952
Guido van Rossumad0ee831995-03-01 10:34:45 +0000953#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000954static object *
955posix_geteuid(self, args)
956 object *self;
957 object *args;
958{
959 if (!getnoarg(args))
960 return NULL;
961 return newintobject((long)geteuid());
962}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000963#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000964
Guido van Rossumad0ee831995-03-01 10:34:45 +0000965#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000966static object *
967posix_getgid(self, args)
968 object *self;
969 object *args;
970{
971 if (!getnoarg(args))
972 return NULL;
973 return newintobject((long)getgid());
974}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000975#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000976
977static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000978posix_getpid(self, args)
979 object *self;
980 object *args;
981{
Guido van Rossum04814471991-06-04 20:23:49 +0000982 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000983 return NULL;
984 return newintobject((long)getpid());
985}
986
Guido van Rossumb6775db1994-08-01 11:34:53 +0000987#ifdef HAVE_GETPGRP
Guido van Rossum85e3b011991-06-03 12:42:10 +0000988static object *
Guido van Rossum04814471991-06-04 20:23:49 +0000989posix_getpgrp(self, args)
990 object *self;
991 object *args;
992{
993 if (!getnoarg(args))
994 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000995#ifdef GETPGRP_HAVE_ARG
Guido van Rossum971443b1991-06-07 13:59:29 +0000996 return newintobject((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000997#else /* GETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000998 return newintobject((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000999#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001000}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001001#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001002
Guido van Rossumb6775db1994-08-01 11:34:53 +00001003#ifdef HAVE_SETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001004static object *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001005posix_setpgrp(self, args)
1006 object *self;
1007 object *args;
1008{
1009 if (!getnoarg(args))
1010 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001011#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001012 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001013#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001014 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001015#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001016 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001017 INCREF(None);
1018 return None;
1019}
1020
Guido van Rossumb6775db1994-08-01 11:34:53 +00001021#endif /* HAVE_SETPGRP */
1022
Guido van Rossumad0ee831995-03-01 10:34:45 +00001023#ifdef HAVE_GETPPID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001024static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001025posix_getppid(self, args)
1026 object *self;
1027 object *args;
1028{
Guido van Rossum04814471991-06-04 20:23:49 +00001029 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001030 return NULL;
1031 return newintobject((long)getppid());
1032}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001033#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001034
Guido van Rossumad0ee831995-03-01 10:34:45 +00001035#ifdef HAVE_GETUID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001036static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001037posix_getuid(self, args)
1038 object *self;
1039 object *args;
1040{
1041 if (!getnoarg(args))
1042 return NULL;
1043 return newintobject((long)getuid());
1044}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001045#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001046
Guido van Rossumad0ee831995-03-01 10:34:45 +00001047#ifdef HAVE_KILL
Guido van Rossum46003ff1992-05-15 11:05:24 +00001048static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001049posix_kill(self, args)
1050 object *self;
1051 object *args;
1052{
1053 int pid, sig;
Guido van Rossum234f9421993-06-17 12:35:49 +00001054 if (!getargs(args, "(ii)", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001055 return NULL;
1056 if (kill(pid, sig) == -1)
1057 return posix_error();
1058 INCREF(None);
1059 return None;
1060}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001061#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001062
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001063#ifdef HAVE_POPEN
Guido van Rossum85e3b011991-06-03 12:42:10 +00001064static object *
Guido van Rossum3b066191991-06-04 19:40:25 +00001065posix_popen(self, args)
1066 object *self;
1067 object *args;
1068{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001069 char *name;
1070 char *mode = "r";
1071 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00001072 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001073 object *f;
1074 if (!newgetargs(args, "s|si", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00001075 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001076 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001077 fp = popen(name, mode);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001078 END_SAVE
Guido van Rossum3b066191991-06-04 19:40:25 +00001079 if (fp == NULL)
1080 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001081 f = newopenfileobject(fp, name, mode, pclose);
1082 if (f != NULL)
1083 setfilebufsize(f, bufsize);
1084 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00001085}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001086#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00001087
Guido van Rossumb6775db1994-08-01 11:34:53 +00001088#ifdef HAVE_SETUID
Guido van Rossum3b066191991-06-04 19:40:25 +00001089static object *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001090posix_setuid(self, args)
1091 object *self;
1092 object *args;
1093{
1094 int uid;
1095 if (!getargs(args, "i", &uid))
1096 return NULL;
1097 if (setuid(uid) < 0)
1098 return posix_error();
1099 INCREF(None);
1100 return None;
1101}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001102#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001103
Guido van Rossumb6775db1994-08-01 11:34:53 +00001104#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001105static object *
1106posix_setgid(self, args)
1107 object *self;
1108 object *args;
1109{
1110 int gid;
1111 if (!getargs(args, "i", &gid))
1112 return NULL;
1113 if (setgid(gid) < 0)
1114 return posix_error();
1115 INCREF(None);
1116 return None;
1117}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001118#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001119
Guido van Rossumb6775db1994-08-01 11:34:53 +00001120#ifdef HAVE_WAITPID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001121static object *
Guido van Rossum21803b81992-08-09 12:55:27 +00001122posix_waitpid(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +00001123 object *self;
1124 object *args;
1125{
Guido van Rossumfd03e2b1996-06-19 23:17:02 +00001126 int pid, options, sts = 0;
Guido van Rossum21803b81992-08-09 12:55:27 +00001127 if (!getargs(args, "(ii)", &pid, &options))
1128 return NULL;
1129 BGN_SAVE
1130 pid = waitpid(pid, &sts, options);
1131 END_SAVE
Guido van Rossum85e3b011991-06-03 12:42:10 +00001132 if (pid == -1)
1133 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00001134 else
1135 return mkvalue("ii", pid, sts);
Guido van Rossum21803b81992-08-09 12:55:27 +00001136}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001137#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00001138
Guido van Rossumad0ee831995-03-01 10:34:45 +00001139#ifdef HAVE_WAIT
Guido van Rossum21803b81992-08-09 12:55:27 +00001140static object *
1141posix_wait(self, args)
1142 object *self;
1143 object *args;
1144{
1145 int pid, sts;
Guido van Rossum21803b81992-08-09 12:55:27 +00001146 BGN_SAVE
1147 pid = wait(&sts);
1148 END_SAVE
1149 if (pid == -1)
1150 return posix_error();
1151 else
1152 return mkvalue("ii", pid, sts);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001153}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001154#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001155
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001156static object *
1157posix_lstat(self, args)
1158 object *self;
1159 object *args;
1160{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001161#ifdef HAVE_LSTAT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001162 return posix_do_stat(self, args, lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001163#else /* !HAVE_LSTAT */
1164 return posix_do_stat(self, args, stat);
1165#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001166}
1167
Guido van Rossumb6775db1994-08-01 11:34:53 +00001168#ifdef HAVE_READLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001169static object *
1170posix_readlink(self, args)
1171 object *self;
1172 object *args;
1173{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001174 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001175 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001176 int n;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001177 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001178 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001179 BGN_SAVE
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001180 n = readlink(path, buf, (int) sizeof buf);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001181 END_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001182 if (n < 0)
1183 return posix_error();
1184 return newsizedstringobject(buf, n);
1185}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001186#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001187
Guido van Rossumb6775db1994-08-01 11:34:53 +00001188#ifdef HAVE_SYMLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001189static object *
1190posix_symlink(self, args)
1191 object *self;
1192 object *args;
1193{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001194 return posix_2str(args, symlink);
1195}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001196#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001197
Guido van Rossumb6775db1994-08-01 11:34:53 +00001198#ifdef HAVE_TIMES
1199#ifndef HZ
1200#define HZ 60 /* Universal constant :-) */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001201#endif /* HZ */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001202static object *
1203posix_times(self, args)
1204 object *self;
1205 object *args;
1206{
1207 struct tms t;
1208 clock_t c;
Guido van Rossum22db57e1992-04-05 14:25:30 +00001209 if (!getnoarg(args))
1210 return NULL;
1211 errno = 0;
1212 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00001213 if (c == (clock_t) -1)
1214 return posix_error();
Guido van Rossumbbc34101995-09-13 17:39:51 +00001215 return mkvalue("ddddd",
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001216 (double)t.tms_utime / HZ,
1217 (double)t.tms_stime / HZ,
1218 (double)t.tms_cutime / HZ,
Guido van Rossumbbc34101995-09-13 17:39:51 +00001219 (double)t.tms_cstime / HZ,
1220 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00001221}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001222#endif /* HAVE_TIMES */
Guido van Rossum8d665e61996-06-26 18:22:49 +00001223#if defined(MS_WIN32) && !defined(HAVE_TIMES)
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001224#define HAVE_TIMES /* so the method table will pick it up */
1225static object *
1226posix_times(self, args)
1227 object *self;
1228 object *args;
1229{
1230 FILETIME create, exit, kernel, user;
1231 HANDLE hProc;
1232 if (!getnoarg(args))
1233 return NULL;
1234 hProc = GetCurrentProcess();
1235 GetProcessTimes(hProc,&create, &exit, &kernel, &user);
Guido van Rossumbbc34101995-09-13 17:39:51 +00001236 return mkvalue("ddddd",
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001237 (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime) / 2E6,
1238 (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6,
1239 (double)0,
Guido van Rossumbbc34101995-09-13 17:39:51 +00001240 (double)0,
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001241 (double)0);
1242}
Guido van Rossum8d665e61996-06-26 18:22:49 +00001243#endif /* MS_WIN32 */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001244
Guido van Rossumb6775db1994-08-01 11:34:53 +00001245#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001246static object *
1247posix_setsid(self, args)
1248 object *self;
1249 object *args;
1250{
1251 if (!getnoarg(args))
1252 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001253 if (setsid() < 0)
1254 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001255 INCREF(None);
1256 return None;
1257}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001258#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001259
Guido van Rossumb6775db1994-08-01 11:34:53 +00001260#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001261static object *
1262posix_setpgid(self, args)
1263 object *self;
1264 object *args;
1265{
1266 int pid, pgrp;
1267 if (!getargs(args, "(ii)", &pid, &pgrp))
1268 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001269 if (setpgid(pid, pgrp) < 0)
1270 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001271 INCREF(None);
1272 return None;
1273}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001274#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001275
Guido van Rossumb6775db1994-08-01 11:34:53 +00001276#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001277static object *
1278posix_tcgetpgrp(self, args)
1279 object *self;
1280 object *args;
1281{
1282 int fd, pgid;
1283 if (!getargs(args, "i", &fd))
1284 return NULL;
1285 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001286 if (pgid < 0)
1287 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001288 return newintobject((long)pgid);
1289}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001290#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00001291
Guido van Rossumb6775db1994-08-01 11:34:53 +00001292#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001293static object *
1294posix_tcsetpgrp(self, args)
1295 object *self;
1296 object *args;
1297{
1298 int fd, pgid;
1299 if (!getargs(args, "(ii)", &fd, &pgid))
1300 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001301 if (tcsetpgrp(fd, pgid) < 0)
1302 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001303 INCREF(None);
1304 return None;
1305}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001306#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001307
Guido van Rossum687dd131993-05-17 08:34:16 +00001308/* Functions acting on file descriptors */
1309
Guido van Rossum234f9421993-06-17 12:35:49 +00001310static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001311posix_open(self, args)
1312 object *self;
1313 object *args;
1314{
1315 char *file;
1316 int flag;
1317 int mode = 0777;
1318 int fd;
1319 if (!getargs(args, "(si)", &file, &flag)) {
1320 err_clear();
1321 if (!getargs(args, "(sii)", &file, &flag, &mode))
1322 return NULL;
1323 }
1324 BGN_SAVE
1325 fd = open(file, flag, mode);
1326 END_SAVE
1327 if (fd < 0)
1328 return posix_error();
1329 return newintobject((long)fd);
1330}
1331
Guido van Rossum234f9421993-06-17 12:35:49 +00001332static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001333posix_close(self, args)
1334 object *self;
1335 object *args;
1336{
1337 int fd, res;
1338 if (!getargs(args, "i", &fd))
1339 return NULL;
1340 BGN_SAVE
1341 res = close(fd);
1342 END_SAVE
1343 if (res < 0)
1344 return posix_error();
1345 INCREF(None);
1346 return None;
1347}
1348
Guido van Rossum234f9421993-06-17 12:35:49 +00001349static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001350posix_dup(self, args)
1351 object *self;
1352 object *args;
1353{
1354 int fd;
1355 if (!getargs(args, "i", &fd))
1356 return NULL;
1357 BGN_SAVE
1358 fd = dup(fd);
1359 END_SAVE
1360 if (fd < 0)
1361 return posix_error();
1362 return newintobject((long)fd);
1363}
1364
Guido van Rossum234f9421993-06-17 12:35:49 +00001365static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001366posix_dup2(self, args)
1367 object *self;
1368 object *args;
1369{
1370 int fd, fd2, res;
1371 if (!getargs(args, "(ii)", &fd, &fd2))
1372 return NULL;
1373 BGN_SAVE
1374 res = dup2(fd, fd2);
1375 END_SAVE
1376 if (res < 0)
1377 return posix_error();
1378 INCREF(None);
1379 return None;
1380}
1381
Guido van Rossum234f9421993-06-17 12:35:49 +00001382static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001383posix_lseek(self, args)
1384 object *self;
1385 object *args;
1386{
1387 int fd, how;
1388 long pos, res;
1389 if (!getargs(args, "(ili)", &fd, &pos, &how))
1390 return NULL;
1391#ifdef SEEK_SET
1392 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
1393 switch (how) {
1394 case 0: how = SEEK_SET; break;
1395 case 1: how = SEEK_CUR; break;
1396 case 2: how = SEEK_END; break;
1397 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001398#endif /* SEEK_END */
Guido van Rossum687dd131993-05-17 08:34:16 +00001399 BGN_SAVE
1400 res = lseek(fd, pos, how);
1401 END_SAVE
1402 if (res < 0)
1403 return posix_error();
1404 return newintobject(res);
1405}
1406
Guido van Rossum234f9421993-06-17 12:35:49 +00001407static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001408posix_read(self, args)
1409 object *self;
1410 object *args;
1411{
Guido van Rossum8bac5461996-06-11 18:38:48 +00001412 int fd, size, n;
Guido van Rossum687dd131993-05-17 08:34:16 +00001413 object *buffer;
1414 if (!getargs(args, "(ii)", &fd, &size))
1415 return NULL;
1416 buffer = newsizedstringobject((char *)NULL, size);
1417 if (buffer == NULL)
1418 return NULL;
1419 BGN_SAVE
Guido van Rossum8bac5461996-06-11 18:38:48 +00001420 n = read(fd, getstringvalue(buffer), size);
Guido van Rossum687dd131993-05-17 08:34:16 +00001421 END_SAVE
Guido van Rossum8bac5461996-06-11 18:38:48 +00001422 if (n < 0) {
Guido van Rossum687dd131993-05-17 08:34:16 +00001423 DECREF(buffer);
1424 return posix_error();
1425 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00001426 if (n != size)
1427 resizestring(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00001428 return buffer;
1429}
1430
Guido van Rossum234f9421993-06-17 12:35:49 +00001431static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001432posix_write(self, args)
1433 object *self;
1434 object *args;
1435{
1436 int fd, size;
1437 char *buffer;
1438 if (!getargs(args, "(is#)", &fd, &buffer, &size))
1439 return NULL;
1440 BGN_SAVE
1441 size = write(fd, buffer, size);
1442 END_SAVE
1443 if (size < 0)
1444 return posix_error();
1445 return newintobject((long)size);
1446}
1447
Guido van Rossum234f9421993-06-17 12:35:49 +00001448static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001449posix_fstat(self, args)
1450 object *self;
1451 object *args;
1452{
1453 int fd;
1454 struct stat st;
1455 int res;
1456 if (!getargs(args, "i", &fd))
1457 return NULL;
1458 BGN_SAVE
1459 res = fstat(fd, &st);
1460 END_SAVE
1461 if (res != 0)
1462 return posix_error();
1463 return mkvalue("(llllllllll)",
1464 (long)st.st_mode,
1465 (long)st.st_ino,
1466 (long)st.st_dev,
1467 (long)st.st_nlink,
1468 (long)st.st_uid,
1469 (long)st.st_gid,
1470 (long)st.st_size,
1471 (long)st.st_atime,
1472 (long)st.st_mtime,
1473 (long)st.st_ctime);
1474}
1475
1476static object *
1477posix_fdopen(self, args)
1478 object *self;
1479 object *args;
1480{
1481 extern int fclose PROTO((FILE *));
1482 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001483 char *mode = "r";
1484 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00001485 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001486 object *f;
1487 if (!newgetargs(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00001488 return NULL;
1489 BGN_SAVE
1490 fp = fdopen(fd, mode);
1491 END_SAVE
1492 if (fp == NULL)
1493 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001494 f = newopenfileobject(fp, "(fdopen)", mode, fclose);
1495 if (f != NULL)
1496 setfilebufsize(f, bufsize);
1497 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00001498}
1499
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001500#ifdef HAVE_PIPE
Guido van Rossum234f9421993-06-17 12:35:49 +00001501static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001502posix_pipe(self, args)
1503 object *self;
1504 object *args;
1505{
Guido van Rossum8d665e61996-06-26 18:22:49 +00001506#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00001507 int fds[2];
1508 int res;
1509 if (!getargs(args, ""))
1510 return NULL;
1511 BGN_SAVE
1512 res = pipe(fds);
1513 END_SAVE
1514 if (res != 0)
1515 return posix_error();
1516 return mkvalue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00001517#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00001518 HANDLE read, write;
1519 BOOL ok;
1520 if (!getargs(args, ""))
1521 return NULL;
1522 BGN_SAVE
1523 ok = CreatePipe( &read, &write, NULL, 0);
1524 END_SAVE
1525 if (!ok)
1526 return posix_error();
1527 return mkvalue("(ii)", read, write);
Guido van Rossum8d665e61996-06-26 18:22:49 +00001528#endif /* MS_WIN32 */
Guido van Rossum687dd131993-05-17 08:34:16 +00001529}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001530#endif /* HAVE_PIPE */
1531
1532#ifdef HAVE_MKFIFO
1533static object *
1534posix_mkfifo(self, args)
1535 object *self;
1536 object *args;
1537{
1538 char *file;
1539 int mode = 0666;
1540 int res;
1541 if (!newgetargs(args, "s|i", &file, &mode))
1542 return NULL;
1543 BGN_SAVE
1544 res = mkfifo(file, mode);
1545 END_SAVE
1546 if (res < 0)
1547 return posix_error();
1548 INCREF(None);
1549 return None;
1550}
1551#endif
1552
1553#ifdef HAVE_FTRUNCATE
1554static object *
1555posix_ftruncate(self, args)
1556 object *self; /* Not used */
1557 object *args;
1558{
1559 int fd;
1560 long length;
1561 int res;
1562
1563 if (!getargs(args, "(il)", &fd, &length))
1564 return NULL;
1565
1566 BGN_SAVE
1567 res = ftruncate(fd, length);
1568 END_SAVE
1569 if (res < 0) {
1570 err_errno(IOError);
1571 return NULL;
1572 }
1573 INCREF(None);
1574 return None;
1575}
1576#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00001577
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001578static struct methodlist posix_methods[] = {
1579 {"chdir", posix_chdir},
1580 {"chmod", posix_chmod},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001581#ifdef HAVE_CHOWN
1582 {"chown", posix_chown},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001583#endif /* HAVE_CHOWN */
Guido van Rossum36bc6801995-06-14 22:54:23 +00001584#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001585 {"getcwd", posix_getcwd},
Guido van Rossum36bc6801995-06-14 22:54:23 +00001586#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001587#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001588 {"link", posix_link},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001589#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001590 {"listdir", posix_listdir},
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001591 {"lstat", posix_lstat},
Guido van Rossumb0824db1996-02-25 04:50:32 +00001592 {"mkdir", posix_mkdir, 1},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001593#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +00001594 {"nice", posix_nice},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001595#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001596#ifdef HAVE_READLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001597 {"readlink", posix_readlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001598#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001599 {"rename", posix_rename},
1600 {"rmdir", posix_rmdir},
1601 {"stat", posix_stat},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001602#ifdef HAVE_SYMLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001603 {"symlink", posix_symlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001604#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001605#ifdef HAVE_SYSTEM
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001606 {"system", posix_system},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001607#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001608 {"umask", posix_umask},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001609#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001610 {"uname", posix_uname},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001611#endif /* HAVE_UNAME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001612 {"unlink", posix_unlink},
Guido van Rossumf4a59121996-02-13 00:12:56 +00001613 {"remove", posix_unlink},
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001614 {"utime", posix_utime},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001615#ifdef HAVE_TIMES
Guido van Rossum22db57e1992-04-05 14:25:30 +00001616 {"times", posix_times},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001617#endif /* HAVE_TIMES */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001618 {"_exit", posix__exit},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001619#ifdef HAVE_EXECV
Guido van Rossum89b33251993-10-22 14:26:06 +00001620 {"execv", posix_execv},
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001621 {"execve", posix_execve},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001622#endif /* HAVE_EXECV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001623#ifdef HAVE_FORK
Guido van Rossum85e3b011991-06-03 12:42:10 +00001624 {"fork", posix_fork},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001625#endif /* HAVE_FORK */
1626#ifdef HAVE_GETEGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001627 {"getegid", posix_getegid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001628#endif /* HAVE_GETEGID */
1629#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001630 {"geteuid", posix_geteuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001631#endif /* HAVE_GETEUID */
1632#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001633 {"getgid", posix_getgid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001634#endif /* HAVE_GETGID */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001635 {"getpid", posix_getpid},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001636#ifdef HAVE_GETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001637 {"getpgrp", posix_getpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001638#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001639#ifdef HAVE_GETPPID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001640 {"getppid", posix_getppid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001641#endif /* HAVE_GETPPID */
1642#ifdef HAVE_GETUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001643 {"getuid", posix_getuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001644#endif /* HAVE_GETUID */
1645#ifdef HAVE_KILL
Guido van Rossum85e3b011991-06-03 12:42:10 +00001646 {"kill", posix_kill},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001647#endif /* HAVE_KILL */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001648#ifdef HAVE_POPEN
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001649 {"popen", posix_popen, 1},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001650#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001651#ifdef HAVE_SETUID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001652 {"setuid", posix_setuid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001653#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001654#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001655 {"setgid", posix_setgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001656#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001657#ifdef HAVE_SETPGRP
Guido van Rossumc2670a01992-09-13 20:07:29 +00001658 {"setpgrp", posix_setpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001659#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001660#ifdef HAVE_WAIT
Guido van Rossum85e3b011991-06-03 12:42:10 +00001661 {"wait", posix_wait},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001662#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001663#ifdef HAVE_WAITPID
Guido van Rossum21803b81992-08-09 12:55:27 +00001664 {"waitpid", posix_waitpid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001665#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001666#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001667 {"setsid", posix_setsid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001668#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001669#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001670 {"setpgid", posix_setpgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001671#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001672#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001673 {"tcgetpgrp", posix_tcgetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001674#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001675#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001676 {"tcsetpgrp", posix_tcsetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001677#endif /* HAVE_TCSETPGRP */
Guido van Rossum687dd131993-05-17 08:34:16 +00001678 {"open", posix_open},
1679 {"close", posix_close},
1680 {"dup", posix_dup},
1681 {"dup2", posix_dup2},
1682 {"lseek", posix_lseek},
1683 {"read", posix_read},
1684 {"write", posix_write},
1685 {"fstat", posix_fstat},
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001686 {"fdopen", posix_fdopen, 1},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001687#ifdef HAVE_PIPE
Guido van Rossum687dd131993-05-17 08:34:16 +00001688 {"pipe", posix_pipe},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001689#endif
1690#ifdef HAVE_MKFIFO
1691 {"mkfifo", posix_mkfifo, 1},
1692#endif
1693#ifdef HAVE_FTRUNCATE
1694 {"ftruncate", posix_ftruncate, 1},
1695#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001696 {NULL, NULL} /* Sentinel */
1697};
1698
1699
Guido van Rossuma0e71301996-05-28 22:30:38 +00001700#if defined(_MSC_VER) || defined(__WATCOMC__)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001701void
1702initnt()
1703{
1704 object *m, *d, *v;
1705
1706 m = initmodule("nt", posix_methods);
1707 d = getmoduledict(m);
1708
1709 /* Initialize nt.environ dictionary */
1710 v = convertenviron();
1711 if (v == NULL || dictinsert(d, "environ", v) != 0)
1712 fatal("can't define nt.environ");
1713 DECREF(v);
1714
1715 /* Initialize nt.error exception */
1716 PosixError = newstringobject("nt.error");
1717 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1718 fatal("can't define nt.error");
1719}
Guido van Rossum8d665e61996-06-26 18:22:49 +00001720#else /* not a PC port */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001721void
1722initposix()
1723{
1724 object *m, *d, *v;
1725
1726 m = initmodule("posix", posix_methods);
1727 d = getmoduledict(m);
1728
1729 /* Initialize posix.environ dictionary */
1730 v = convertenviron();
1731 if (v == NULL || dictinsert(d, "environ", v) != 0)
1732 fatal("can't define posix.environ");
1733 DECREF(v);
1734
Guido van Rossumde4e1241995-03-30 10:56:54 +00001735#ifdef WNOHANG
1736 /* Export WNOHANG symbol */
1737 v = newintobject((long)WNOHANG);
1738 if (v == NULL || dictinsert(d, "WNOHANG", v) != 0)
1739 fatal("can't define posix.WNOHANG");
1740 DECREF(v);
1741#endif
1742
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001743 /* Initialize posix.error exception */
1744 PosixError = newstringobject("posix.error");
1745 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1746 fatal("can't define posix.error");
1747}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001748#endif /* !_MSC_VER */