blob: f8cc2987a652bdab8b21c96497581180690189fd [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 Rossum3f5da241990-12-20 15:06:42 +000043#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044#include "modsupport.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000045#include "ceval.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000046
Guido van Rossumb6775db1994-08-01 11:34:53 +000047#include <string.h>
48#include <errno.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +000049#include <sys/types.h>
50#include <sys/stat.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +000051#ifdef HAVE_SYS_WAIT_H
52#include <sys/wait.h> /* For WNOHANG */
53#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000054
55#include "mytime.h" /* For clock_t on some systems */
56
57#ifdef HAVE_FCNTL_H
58#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000059#endif /* HAVE_FCNTL_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +000060
Guido van Rossuma4916fa1996-05-23 22:58:55 +000061/* Various compilers have only certain posix functions */
62#ifdef __WATCOMC__ /* Watcom compiler */
63#define HAVE_GETCWD 1
64#define HAVE_OPENDIR 1
65#define HAVE_SYSTEM 1
66#if defined(__OS2__)
67#define HAVE_EXECV 1
68#define HAVE_WAIT 1
Guido van Rossumad0ee831995-03-01 10:34:45 +000069#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +000070#include <process.h>
71#else
72#ifdef __BORLANDC__ /* Borland compiler */
73#define HAVE_EXECV 1
74#define HAVE_GETCWD 1
75#define HAVE_GETEGID 1
76#define HAVE_GETEUID 1
77#define HAVE_GETGID 1
78#define HAVE_GETPPID 1
79#define HAVE_GETUID 1
80#define HAVE_KILL 1
81#define HAVE_OPENDIR 1
82#define HAVE_PIPE 1
83#define HAVE_POPEN 1
84#define HAVE_SYSTEM 1
85#define HAVE_WAIT 1
86#else
87#ifdef _MSC_VER /* Microsoft compiler */
Guido van Rossum8d665e61996-06-26 18:22:49 +000088#define HAVE_GETCWD 1
89#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +000090#define HAVE_EXECV 1
91#define HAVE_PIPE 1
92#define HAVE_POPEN 1
93#define HAVE_SYSTEM 1
94#else /* 16-bit Windows */
Guido van Rossum8d665e61996-06-26 18:22:49 +000095#endif /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +000096#else /* all other compilers */
97/* Unix functions that the configure script doesn't check for */
98#define HAVE_EXECV 1
99#define HAVE_FORK 1
100#define HAVE_GETCWD 1
101#define HAVE_GETEGID 1
102#define HAVE_GETEUID 1
103#define HAVE_GETGID 1
104#define HAVE_GETPPID 1
105#define HAVE_GETUID 1
106#define HAVE_KILL 1
107#define HAVE_OPENDIR 1
108#define HAVE_PIPE 1
109#define HAVE_POPEN 1
110#define HAVE_SYSTEM 1
111#define HAVE_WAIT 1
112#endif /* _MSC_VER */
113#endif /* __BORLANDC__ */
114#endif /* ! __WATCOMC__ */
Guido van Rossumad0ee831995-03-01 10:34:45 +0000115
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000116#ifndef _MSC_VER
Guido van Rossum36bc6801995-06-14 22:54:23 +0000117
Guido van Rossumb6775db1994-08-01 11:34:53 +0000118#ifdef HAVE_UNISTD_H
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000119#include <unistd.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +0000120#endif
121
122#ifdef NeXT
123/* NeXT's <unistd.h> and <utime.h> aren't worth much */
124#undef HAVE_UNISTD_H
125#undef HAVE_UTIME_H
126/* #undef HAVE_GETCWD */
127#endif
128
129#ifdef HAVE_UNISTD_H
Guido van Rossumad0ee831995-03-01 10:34:45 +0000130/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
131extern int rename();
132extern int pclose();
133extern int lstat();
134extern int symlink();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000135#else /* !HAVE_UNISTD_H */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000136#if defined(__WATCOMC__) || defined(_MSC_VER)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000137extern int mkdir PROTO((const char *));
138#else
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000139extern int mkdir PROTO((const char *, mode_t));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000140#endif
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000141extern int chdir PROTO((const char *));
Guido van Rossume22e6441993-07-09 10:51:31 +0000142extern int rmdir PROTO((const char *));
143extern int chmod PROTO((const char *, mode_t));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000144extern int chown PROTO((const char *, uid_t, gid_t));
145extern char *getcwd PROTO((char *, int));
Guido van Rossume22e6441993-07-09 10:51:31 +0000146extern char *strerror PROTO((int));
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000147extern int link PROTO((const char *, const char *));
148extern int rename PROTO((const char *, const char *));
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000149extern int stat PROTO((const char *, struct stat *));
150extern int unlink PROTO((const char *));
151extern int pclose PROTO((FILE *));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000152#ifdef HAVE_SYMLINK
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000153extern int symlink PROTO((const char *, const char *));
Guido van Rossuma38a5031995-02-17 15:11:36 +0000154#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000155#ifdef HAVE_LSTAT
156extern int lstat PROTO((const char *, struct stat *));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000157#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000158#endif /* !HAVE_UNISTD_H */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000159
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000160#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161
Guido van Rossumb6775db1994-08-01 11:34:53 +0000162#ifdef HAVE_UTIME_H
163#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000164#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000165
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000166#ifdef HAVE_SYS_UTIME_H
167#include <sys/utime.h>
168#define HAVE_UTIME_H /* pretend we do for the rest of this file */
169#endif /* HAVE_SYS_UTIME_H */
170
Guido van Rossumb6775db1994-08-01 11:34:53 +0000171#ifdef HAVE_SYS_TIMES_H
172#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000173#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000174
175#ifdef HAVE_SYS_PARAM_H
176#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000177#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000178
179#ifdef HAVE_SYS_UTSNAME_H
180#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000181#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000182
183#ifndef MAXPATHLEN
184#define MAXPATHLEN 1024
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000185#endif /* MAXPATHLEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000186
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000187#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000188#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000189#define NAMLEN(dirent) strlen((dirent)->d_name)
190#else
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000191#ifdef __WATCOMC__
192#include <direct.h>
193#define NAMLEN(dirent) strlen((dirent)->d_name)
194#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000195#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000196#define NAMLEN(dirent) (dirent)->d_namlen
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000197#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000198#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000199#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000200#endif
201#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000202#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000203#endif
204#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000205#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000206#endif
207#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000208
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000209#ifdef _MSC_VER
Guido van Rossumb6775db1994-08-01 11:34:53 +0000210#include <direct.h>
211#include <io.h>
212#include <process.h>
213#include <windows.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000214#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000215#define popen _popen
Guido van Rossum794d8131994-08-23 13:48:48 +0000216#define pclose _pclose
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000217#else /* 16-bit Windows */
218#include <dos.h>
219#include <ctype.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000220#endif /* MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000221#endif /* _MSC_VER */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000222
223#ifdef OS2
224#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000225#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226
227/* Return a dictionary corresponding to the POSIX environment table */
228
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000229#if !defined(_MSC_VER) && !defined(__WATCOMC__)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000231#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232
233static object *
234convertenviron()
235{
236 object *d;
237 char **e;
238 d = newdictobject();
239 if (d == NULL)
240 return NULL;
241 if (environ == NULL)
242 return d;
243 /* XXX This part ignores errors */
244 for (e = environ; *e != NULL; e++) {
245 object *v;
246 char *p = strchr(*e, '=');
247 if (p == NULL)
248 continue;
249 v = newstringobject(p+1);
250 if (v == NULL)
251 continue;
252 *p = '\0';
253 (void) dictinsert(d, *e, v);
254 *p = '=';
255 DECREF(v);
256 }
257 return d;
258}
259
260
261static object *PosixError; /* Exception posix.error */
262
263/* Set a POSIX-specific error from errno, and return NULL */
264
Guido van Rossumad0ee831995-03-01 10:34:45 +0000265static object * posix_error()
266{
267 return err_errno(PosixError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268}
269
270
271/* POSIX generic methods */
272
273static object *
274posix_1str(args, func)
275 object *args;
276 int (*func) FPROTO((const char *));
277{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000278 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000279 int res;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000280 if (!getargs(args, "s", &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000282 BGN_SAVE
283 res = (*func)(path1);
284 END_SAVE
285 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286 return posix_error();
287 INCREF(None);
288 return None;
289}
290
291static object *
292posix_2str(args, func)
293 object *args;
294 int (*func) FPROTO((const char *, const char *));
295{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000296 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000297 int res;
Guido van Rossum234f9421993-06-17 12:35:49 +0000298 if (!getargs(args, "(ss)", &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000300 BGN_SAVE
301 res = (*func)(path1, path2);
302 END_SAVE
303 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304 return posix_error();
305 INCREF(None);
306 return None;
307}
308
309static object *
310posix_strint(args, func)
311 object *args;
312 int (*func) FPROTO((const char *, int));
313{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000314 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000316 int res;
Guido van Rossum234f9421993-06-17 12:35:49 +0000317 if (!getargs(args, "(si)", &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000319 BGN_SAVE
320 res = (*func)(path, i);
321 END_SAVE
322 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000323 return posix_error();
324 INCREF(None);
325 return None;
326}
327
328static object *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000329posix_strintint(args, func)
330 object *args;
331 int (*func) FPROTO((const char *, int, int));
332{
333 char *path;
334 int i,i2;
335 int res;
336 if (!getargs(args, "(sii)", &path, &i, &i2))
337 return NULL;
338 BGN_SAVE
339 res = (*func)(path, i, i2);
340 END_SAVE
341 if (res < 0)
342 return posix_error();
343 INCREF(None);
344 return None;
345}
346
347static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000348posix_do_stat(self, args, statfunc)
349 object *self;
350 object *args;
351 int (*statfunc) FPROTO((const char *, struct stat *));
352{
353 struct stat st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000354 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000355 int res;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000356 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000357 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000358 BGN_SAVE
359 res = (*statfunc)(path, &st);
360 END_SAVE
361 if (res != 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362 return posix_error();
Guido van Rossum687dd131993-05-17 08:34:16 +0000363 return mkvalue("(llllllllll)",
Guido van Rossume5372401993-03-16 12:15:04 +0000364 (long)st.st_mode,
365 (long)st.st_ino,
366 (long)st.st_dev,
367 (long)st.st_nlink,
368 (long)st.st_uid,
369 (long)st.st_gid,
370 (long)st.st_size,
371 (long)st.st_atime,
372 (long)st.st_mtime,
373 (long)st.st_ctime);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374}
375
376
377/* POSIX methods */
378
379static object *
380posix_chdir(self, args)
381 object *self;
382 object *args;
383{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384 return posix_1str(args, chdir);
385}
386
387static object *
388posix_chmod(self, args)
389 object *self;
390 object *args;
391{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392 return posix_strint(args, chmod);
393}
394
Guido van Rossumb6775db1994-08-01 11:34:53 +0000395#ifdef HAVE_CHOWN
396static object *
397posix_chown(self, args)
398 object *self;
399 object *args;
400{
401 return posix_strintint(args, chown);
402}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000403#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000404
Guido van Rossum36bc6801995-06-14 22:54:23 +0000405#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000406static object *
407posix_getcwd(self, args)
408 object *self;
409 object *args;
410{
411 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000412 char *res;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000413 if (!getnoarg(args))
414 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000415 BGN_SAVE
416 res = getcwd(buf, sizeof buf);
417 END_SAVE
418 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000419 return posix_error();
420 return newstringobject(buf);
421}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000422#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000423
Guido van Rossumb6775db1994-08-01 11:34:53 +0000424#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000425static object *
426posix_link(self, args)
427 object *self;
428 object *args;
429{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430 return posix_2str(args, link);
431}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000432#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433
Guido van Rossumb6775db1994-08-01 11:34:53 +0000434static object *
435posix_listdir(self, args)
436 object *self;
437 object *args;
438{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000439#if defined(MS_WIN32) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000440
Guido van Rossumb6775db1994-08-01 11:34:53 +0000441 char *name;
442 int len;
443 object *d, *v;
444 HANDLE hFindFile;
445 WIN32_FIND_DATA FileData;
446 char namebuf[MAX_PATH+5];
447
448 if (!getargs(args, "s#", &name, &len))
449 return NULL;
450 if (len >= MAX_PATH) {
451 err_setstr(ValueError, "path too long");
452 return NULL;
453 }
454 strcpy(namebuf, name);
455 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
456 namebuf[len++] = '/';
457 strcpy(namebuf + len, "*.*");
458
459 if ((d = newlistobject(0)) == NULL)
460 return NULL;
461
462 hFindFile = FindFirstFile(namebuf, &FileData);
463 if (hFindFile == INVALID_HANDLE_VALUE) {
464 errno = GetLastError();
465 return posix_error();
466 }
467 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000468 if (FileData.cFileName[0] == '.' &&
469 (FileData.cFileName[1] == '\0' ||
470 FileData.cFileName[1] == '.' &&
471 FileData.cFileName[2] == '\0'))
472 continue;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000473 v = newstringobject(FileData.cFileName);
474 if (v == NULL) {
475 DECREF(d);
476 d = NULL;
477 break;
478 }
479 if (addlistitem(d, v) != 0) {
480 DECREF(v);
481 DECREF(d);
482 d = NULL;
483 break;
484 }
485 DECREF(v);
486 } while (FindNextFile(hFindFile, &FileData) == TRUE);
487
488 if (FindClose(hFindFile) == FALSE) {
489 errno = GetLastError();
490 return posix_error();
491 }
492
493 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000494
Guido van Rossum8d665e61996-06-26 18:22:49 +0000495#else /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000496#ifdef _MSC_VER /* 16-bit Windows */
497
498#ifndef MAX_PATH
499#define MAX_PATH 250
500#endif
501 char *name, *pt;
502 int len;
503 object *d, *v;
504 char namebuf[MAX_PATH+5];
505 struct _find_t ep;
506
507 if (!getargs(args, "s#", &name, &len))
508 return NULL;
509 if (len >= MAX_PATH) {
510 err_setstr(ValueError, "path too long");
511 return NULL;
512 }
513 strcpy(namebuf, name);
514 for (pt = namebuf; *pt; pt++)
515 if (*pt == '/')
516 *pt = '\\';
517 if (namebuf[len-1] != '\\')
518 namebuf[len++] = '\\';
519 strcpy(namebuf + len, "*.*");
520
521 if ((d = newlistobject(0)) == NULL)
522 return NULL;
523
524 if (_dos_findfirst(namebuf, _A_RDONLY |
525 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0){
526 errno = ENOENT;
527 return posix_error();
528 }
529 do {
530 if (ep.name[0] == '.' &&
531 (ep.name[1] == '\0' ||
532 ep.name[1] == '.' &&
533 ep.name[2] == '\0'))
534 continue;
535 strcpy(namebuf, ep.name);
536 for (pt = namebuf; *pt; pt++)
537 if (isupper(*pt))
538 *pt = tolower(*pt);
539 v = newstringobject(namebuf);
540 if (v == NULL) {
541 DECREF(d);
542 d = NULL;
543 break;
544 }
545 if (addlistitem(d, v) != 0) {
546 DECREF(v);
547 DECREF(d);
548 d = NULL;
549 break;
550 }
551 DECREF(v);
552 } while (_dos_findnext(&ep) == 0);
553
554 return d;
555
556#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000557
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000558 char *name;
559 object *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000560 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000561 struct dirent *ep;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000562 if (!getargs(args, "s", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000564 BGN_SAVE
565 if ((dirp = opendir(name)) == NULL) {
566 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000567 return posix_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000568 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000569 if ((d = newlistobject(0)) == NULL) {
570 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000571 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000572 return NULL;
573 }
574 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000575 if (ep->d_name[0] == '.' &&
576 (NAMLEN(ep) == 1 ||
577 ep->d_name[1] == '.' && NAMLEN(ep) == 2))
578 continue;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000579 v = newsizedstringobject(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000580 if (v == NULL) {
581 DECREF(d);
582 d = NULL;
583 break;
584 }
585 if (addlistitem(d, v) != 0) {
586 DECREF(v);
587 DECREF(d);
588 d = NULL;
589 break;
590 }
591 DECREF(v);
592 }
593 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000594 END_SAVE
Guido van Rossum0ee42cd1991-04-08 21:01:03 +0000595
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000596 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000597
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000598#endif /* !_MSC_VER */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000599#endif /* !MS_WIN32 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000600}
601
602static object *
603posix_mkdir(self, args)
604 object *self;
605 object *args;
606{
Guido van Rossumb0824db1996-02-25 04:50:32 +0000607 int res;
608 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000609 int mode = 0777;
Guido van Rossumb0824db1996-02-25 04:50:32 +0000610 if (!newgetargs(args, "s|i", &path, &mode))
611 return NULL;
612 BGN_SAVE
Guido van Rossum8d665e61996-06-26 18:22:49 +0000613#if defined(__WATCOMC__) || defined(_MSC_VER)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000614 res = mkdir(path);
615#else
Guido van Rossumb0824db1996-02-25 04:50:32 +0000616 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000617#endif
Guido van Rossumb0824db1996-02-25 04:50:32 +0000618 END_SAVE
619 if (res < 0)
620 return posix_error();
621 INCREF(None);
622 return None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000623}
624
Guido van Rossumb6775db1994-08-01 11:34:53 +0000625#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +0000626static object *
627posix_nice(self, args)
628 object *self;
629 object *args;
630{
631 int increment, value;
632
633 if (!getargs(args, "i", &increment))
634 return NULL;
635 value = nice(increment);
636 if (value == -1)
637 return posix_error();
638 return newintobject((long) value);
639}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000640#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000641
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000642static object *
643posix_rename(self, args)
644 object *self;
645 object *args;
646{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000647 return posix_2str(args, rename);
648}
649
650static object *
651posix_rmdir(self, args)
652 object *self;
653 object *args;
654{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000655 return posix_1str(args, rmdir);
656}
657
658static object *
659posix_stat(self, args)
660 object *self;
661 object *args;
662{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000663 return posix_do_stat(self, args, stat);
664}
665
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000666#ifdef HAVE_SYSTEM
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000667static object *
668posix_system(self, args)
669 object *self;
670 object *args;
671{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000672 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000673 long sts;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000674 if (!getargs(args, "s", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000675 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000676 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000677 sts = system(command);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000678 END_SAVE
679 return newintobject(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000680}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000681#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000682
683static object *
684posix_umask(self, args)
685 object *self;
686 object *args;
687{
688 int i;
689 if (!getintarg(args, &i))
690 return NULL;
691 i = umask(i);
692 if (i < 0)
693 return posix_error();
694 return newintobject((long)i);
695}
696
697static object *
698posix_unlink(self, args)
699 object *self;
700 object *args;
701{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000702 return posix_1str(args, unlink);
703}
704
Guido van Rossumb6775db1994-08-01 11:34:53 +0000705#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000706static object *
707posix_uname(self, args)
708 object *self;
709 object *args;
710{
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000711 struct utsname u;
712 object *v;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000713 int res;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000714 if (!getnoarg(args))
715 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000716 BGN_SAVE
717 res = uname(&u);
718 END_SAVE
719 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000720 return posix_error();
Guido van Rossume5372401993-03-16 12:15:04 +0000721 return mkvalue("(sssss)",
722 u.sysname,
723 u.nodename,
724 u.release,
725 u.version,
726 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000727}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000728#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000729
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000730static object *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000731posix_utime(self, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000732 object *self;
733 object *args;
734{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000735 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000736 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000737 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000738
Guido van Rossumb6775db1994-08-01 11:34:53 +0000739#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000740 struct utimbuf buf;
741#define ATIME buf.actime
742#define MTIME buf.modtime
743#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000744#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000745 time_t buf[2];
746#define ATIME buf[0]
747#define MTIME buf[1]
748#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000749#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000750
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000751 if (!getargs(args, "(s(ll))", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000752 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000753 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +0000754 MTIME = mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000755 BGN_SAVE
756 res = utime(path, UTIME_ARG);
757 END_SAVE
758 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000759 return posix_error();
760 INCREF(None);
761 return None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000762#undef UTIME_ARG
763#undef ATIME
764#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000765}
766
Guido van Rossum85e3b011991-06-03 12:42:10 +0000767
Guido van Rossum3b066191991-06-04 19:40:25 +0000768/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000769
770static object *
771posix__exit(self, args)
772 object *self;
773 object *args;
774{
775 int sts;
776 if (!getintarg(args, &sts))
777 return NULL;
778 _exit(sts);
779 /* NOTREACHED */
780}
781
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000782#ifdef HAVE_EXECV
Guido van Rossum85e3b011991-06-03 12:42:10 +0000783static object *
Guido van Rossum89b33251993-10-22 14:26:06 +0000784posix_execv(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +0000785 object *self;
786 object *args;
787{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000788 char *path;
789 object *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000790 char **argvlist;
791 int i, argc;
792 object *(*getitem) PROTO((object *, int));
793
Guido van Rossum89b33251993-10-22 14:26:06 +0000794 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +0000795 argv is a list or tuple of strings. */
796
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000797 if (!getargs(args, "(sO)", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000798 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000799 if (is_listobject(argv)) {
800 argc = getlistsize(argv);
801 getitem = getlistitem;
802 }
803 else if (is_tupleobject(argv)) {
804 argc = gettuplesize(argv);
805 getitem = gettupleitem;
806 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000807 else {
808 badarg:
809 err_badarg();
810 return NULL;
811 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000812
813 argvlist = NEW(char *, argc+1);
814 if (argvlist == NULL)
815 return NULL;
816 for (i = 0; i < argc; i++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000817 if (!getargs((*getitem)(argv, i), "s", &argvlist[i])) {
Guido van Rossum85e3b011991-06-03 12:42:10 +0000818 DEL(argvlist);
819 goto badarg;
820 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000821 }
822 argvlist[argc] = NULL;
823
Guido van Rossumb6775db1994-08-01 11:34:53 +0000824#ifdef BAD_EXEC_PROTOTYPES
825 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000826#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000827 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000828#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000829
Guido van Rossum85e3b011991-06-03 12:42:10 +0000830 /* If we get here it's definitely an error */
831
832 DEL(argvlist);
833 return posix_error();
834}
835
836static object *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000837posix_execve(self, args)
838 object *self;
839 object *args;
840{
841 char *path;
842 object *argv, *env;
843 char **argvlist;
844 char **envlist;
845 object *key, *val;
846 int i, pos, argc, envc;
847 object *(*getitem) PROTO((object *, int));
848
849 /* execve has three arguments: (path, argv, env), where
850 argv is a list or tuple of strings and env is a dictionary
851 like posix.environ. */
852
853 if (!getargs(args, "(sOO)", &path, &argv, &env))
854 return NULL;
855 if (is_listobject(argv)) {
856 argc = getlistsize(argv);
857 getitem = getlistitem;
858 }
859 else if (is_tupleobject(argv)) {
860 argc = gettuplesize(argv);
861 getitem = gettupleitem;
862 }
863 else {
864 err_setstr(TypeError, "argv must be tuple or list");
865 return NULL;
866 }
867 if (!is_dictobject(env)) {
868 err_setstr(TypeError, "env must be dictionary");
869 return NULL;
870 }
871
872 argvlist = NEW(char *, argc+1);
873 if (argvlist == NULL) {
874 err_nomem();
875 return NULL;
876 }
877 for (i = 0; i < argc; i++) {
878 if (!getargs((*getitem)(argv, i),
879 "s;argv must be list of strings",
880 &argvlist[i])) {
881 goto fail_1;
882 }
883 }
884 argvlist[argc] = NULL;
885
886 i = getmappingsize(env);
887 envlist = NEW(char *, i + 1);
888 if (envlist == NULL) {
889 err_nomem();
890 goto fail_1;
891 }
892 pos = 0;
893 envc = 0;
894 while (mappinggetnext(env, &pos, &key, &val)) {
895 char *p, *k, *v;
896 if (!getargs(key, "s;non-string key in env", &k) ||
897 !getargs(val, "s;non-string value in env", &v)) {
898 goto fail_2;
899 }
900 p = NEW(char, getstringsize(key) + getstringsize(val) + 2);
901 if (p == NULL) {
902 err_nomem();
903 goto fail_2;
904 }
905 sprintf(p, "%s=%s", k, v);
906 envlist[envc++] = p;
907 }
908 envlist[envc] = 0;
909
Guido van Rossumb6775db1994-08-01 11:34:53 +0000910
911#ifdef BAD_EXEC_PROTOTYPES
912 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000913#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000914 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000915#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000916
917 /* If we get here it's definitely an error */
918
919 (void) posix_error();
920
921 fail_2:
922 while (--envc >= 0)
923 DEL(envlist[envc]);
924 DEL(envlist);
925 fail_1:
926 DEL(argvlist);
927
928 return NULL;
929}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000930#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000931
Guido van Rossumad0ee831995-03-01 10:34:45 +0000932#ifdef HAVE_FORK
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000933static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000934posix_fork(self, args)
935 object *self;
936 object *args;
937{
938 int pid;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000939 if (!getnoarg(args))
940 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000941 pid = fork();
942 if (pid == -1)
943 return posix_error();
944 return newintobject((long)pid);
945}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000946#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000947
Guido van Rossumad0ee831995-03-01 10:34:45 +0000948#ifdef HAVE_GETEGID
Guido van Rossum85e3b011991-06-03 12:42:10 +0000949static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000950posix_getegid(self, args)
951 object *self;
952 object *args;
953{
954 if (!getnoarg(args))
955 return NULL;
956 return newintobject((long)getegid());
957}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000958#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000959
Guido van Rossumad0ee831995-03-01 10:34:45 +0000960#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000961static object *
962posix_geteuid(self, args)
963 object *self;
964 object *args;
965{
966 if (!getnoarg(args))
967 return NULL;
968 return newintobject((long)geteuid());
969}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000970#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000971
Guido van Rossumad0ee831995-03-01 10:34:45 +0000972#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000973static object *
974posix_getgid(self, args)
975 object *self;
976 object *args;
977{
978 if (!getnoarg(args))
979 return NULL;
980 return newintobject((long)getgid());
981}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000982#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000983
984static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000985posix_getpid(self, args)
986 object *self;
987 object *args;
988{
Guido van Rossum04814471991-06-04 20:23:49 +0000989 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000990 return NULL;
991 return newintobject((long)getpid());
992}
993
Guido van Rossumb6775db1994-08-01 11:34:53 +0000994#ifdef HAVE_GETPGRP
Guido van Rossum85e3b011991-06-03 12:42:10 +0000995static object *
Guido van Rossum04814471991-06-04 20:23:49 +0000996posix_getpgrp(self, args)
997 object *self;
998 object *args;
999{
1000 if (!getnoarg(args))
1001 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001002#ifdef GETPGRP_HAVE_ARG
Guido van Rossum971443b1991-06-07 13:59:29 +00001003 return newintobject((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001004#else /* GETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001005 return newintobject((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001006#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001007}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001008#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001009
Guido van Rossumb6775db1994-08-01 11:34:53 +00001010#ifdef HAVE_SETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001011static object *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001012posix_setpgrp(self, args)
1013 object *self;
1014 object *args;
1015{
1016 if (!getnoarg(args))
1017 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001018#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001019 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001020#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001021 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001022#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001023 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001024 INCREF(None);
1025 return None;
1026}
1027
Guido van Rossumb6775db1994-08-01 11:34:53 +00001028#endif /* HAVE_SETPGRP */
1029
Guido van Rossumad0ee831995-03-01 10:34:45 +00001030#ifdef HAVE_GETPPID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001031static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001032posix_getppid(self, args)
1033 object *self;
1034 object *args;
1035{
Guido van Rossum04814471991-06-04 20:23:49 +00001036 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001037 return NULL;
1038 return newintobject((long)getppid());
1039}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001040#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001041
Guido van Rossumad0ee831995-03-01 10:34:45 +00001042#ifdef HAVE_GETUID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001043static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001044posix_getuid(self, args)
1045 object *self;
1046 object *args;
1047{
1048 if (!getnoarg(args))
1049 return NULL;
1050 return newintobject((long)getuid());
1051}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001052#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001053
Guido van Rossumad0ee831995-03-01 10:34:45 +00001054#ifdef HAVE_KILL
Guido van Rossum46003ff1992-05-15 11:05:24 +00001055static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001056posix_kill(self, args)
1057 object *self;
1058 object *args;
1059{
1060 int pid, sig;
Guido van Rossum234f9421993-06-17 12:35:49 +00001061 if (!getargs(args, "(ii)", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001062 return NULL;
1063 if (kill(pid, sig) == -1)
1064 return posix_error();
1065 INCREF(None);
1066 return None;
1067}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001068#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001069
Guido van Rossumc0125471996-06-28 18:55:32 +00001070#ifdef HAVE_PLOCK
1071
1072#ifdef HAVE_SYS_LOCK_H
1073#include <sys/lock.h>
1074#endif
1075
1076static object *
1077posix_plock(self, args)
1078 object *self;
1079 object *args;
1080{
1081 int op;
1082 if (!getargs(args, "i", &op))
1083 return NULL;
1084 if (plock(op) == -1)
1085 return posix_error();
1086 INCREF(None);
1087 return None;
1088}
1089#endif
1090
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001091#ifdef HAVE_POPEN
Guido van Rossum85e3b011991-06-03 12:42:10 +00001092static object *
Guido van Rossum3b066191991-06-04 19:40:25 +00001093posix_popen(self, args)
1094 object *self;
1095 object *args;
1096{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001097 char *name;
1098 char *mode = "r";
1099 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00001100 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001101 object *f;
1102 if (!newgetargs(args, "s|si", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00001103 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001104 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001105 fp = popen(name, mode);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001106 END_SAVE
Guido van Rossum3b066191991-06-04 19:40:25 +00001107 if (fp == NULL)
1108 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001109 f = newopenfileobject(fp, name, mode, pclose);
1110 if (f != NULL)
1111 setfilebufsize(f, bufsize);
1112 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00001113}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001114#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00001115
Guido van Rossumb6775db1994-08-01 11:34:53 +00001116#ifdef HAVE_SETUID
Guido van Rossum3b066191991-06-04 19:40:25 +00001117static object *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001118posix_setuid(self, args)
1119 object *self;
1120 object *args;
1121{
1122 int uid;
1123 if (!getargs(args, "i", &uid))
1124 return NULL;
1125 if (setuid(uid) < 0)
1126 return posix_error();
1127 INCREF(None);
1128 return None;
1129}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001130#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001131
Guido van Rossumb6775db1994-08-01 11:34:53 +00001132#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001133static object *
1134posix_setgid(self, args)
1135 object *self;
1136 object *args;
1137{
1138 int gid;
1139 if (!getargs(args, "i", &gid))
1140 return NULL;
1141 if (setgid(gid) < 0)
1142 return posix_error();
1143 INCREF(None);
1144 return None;
1145}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001146#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001147
Guido van Rossumb6775db1994-08-01 11:34:53 +00001148#ifdef HAVE_WAITPID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001149static object *
Guido van Rossum21803b81992-08-09 12:55:27 +00001150posix_waitpid(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +00001151 object *self;
1152 object *args;
1153{
Guido van Rossumfd03e2b1996-06-19 23:17:02 +00001154 int pid, options, sts = 0;
Guido van Rossum21803b81992-08-09 12:55:27 +00001155 if (!getargs(args, "(ii)", &pid, &options))
1156 return NULL;
1157 BGN_SAVE
1158 pid = waitpid(pid, &sts, options);
1159 END_SAVE
Guido van Rossum85e3b011991-06-03 12:42:10 +00001160 if (pid == -1)
1161 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00001162 else
1163 return mkvalue("ii", pid, sts);
Guido van Rossum21803b81992-08-09 12:55:27 +00001164}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001165#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00001166
Guido van Rossumad0ee831995-03-01 10:34:45 +00001167#ifdef HAVE_WAIT
Guido van Rossum21803b81992-08-09 12:55:27 +00001168static object *
1169posix_wait(self, args)
1170 object *self;
1171 object *args;
1172{
1173 int pid, sts;
Guido van Rossum21803b81992-08-09 12:55:27 +00001174 BGN_SAVE
1175 pid = wait(&sts);
1176 END_SAVE
1177 if (pid == -1)
1178 return posix_error();
1179 else
1180 return mkvalue("ii", pid, sts);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001181}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001182#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001183
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001184static object *
1185posix_lstat(self, args)
1186 object *self;
1187 object *args;
1188{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001189#ifdef HAVE_LSTAT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001190 return posix_do_stat(self, args, lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001191#else /* !HAVE_LSTAT */
1192 return posix_do_stat(self, args, stat);
1193#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001194}
1195
Guido van Rossumb6775db1994-08-01 11:34:53 +00001196#ifdef HAVE_READLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001197static object *
1198posix_readlink(self, args)
1199 object *self;
1200 object *args;
1201{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001202 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001203 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001204 int n;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001205 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001206 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001207 BGN_SAVE
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001208 n = readlink(path, buf, (int) sizeof buf);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001209 END_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001210 if (n < 0)
1211 return posix_error();
1212 return newsizedstringobject(buf, n);
1213}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001214#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001215
Guido van Rossumb6775db1994-08-01 11:34:53 +00001216#ifdef HAVE_SYMLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001217static object *
1218posix_symlink(self, args)
1219 object *self;
1220 object *args;
1221{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001222 return posix_2str(args, symlink);
1223}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001224#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001225
Guido van Rossumb6775db1994-08-01 11:34:53 +00001226#ifdef HAVE_TIMES
1227#ifndef HZ
1228#define HZ 60 /* Universal constant :-) */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001229#endif /* HZ */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001230static object *
1231posix_times(self, args)
1232 object *self;
1233 object *args;
1234{
1235 struct tms t;
1236 clock_t c;
Guido van Rossum22db57e1992-04-05 14:25:30 +00001237 if (!getnoarg(args))
1238 return NULL;
1239 errno = 0;
1240 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00001241 if (c == (clock_t) -1)
1242 return posix_error();
Guido van Rossumbbc34101995-09-13 17:39:51 +00001243 return mkvalue("ddddd",
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001244 (double)t.tms_utime / HZ,
1245 (double)t.tms_stime / HZ,
1246 (double)t.tms_cutime / HZ,
Guido van Rossumbbc34101995-09-13 17:39:51 +00001247 (double)t.tms_cstime / HZ,
1248 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00001249}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001250#endif /* HAVE_TIMES */
Guido van Rossum87755a21996-09-07 00:59:43 +00001251#ifdef MS_WIN32
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001252#define HAVE_TIMES /* so the method table will pick it up */
1253static object *
1254posix_times(self, args)
1255 object *self;
1256 object *args;
1257{
1258 FILETIME create, exit, kernel, user;
1259 HANDLE hProc;
1260 if (!getnoarg(args))
1261 return NULL;
1262 hProc = GetCurrentProcess();
1263 GetProcessTimes(hProc,&create, &exit, &kernel, &user);
Guido van Rossumbbc34101995-09-13 17:39:51 +00001264 return mkvalue("ddddd",
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001265 (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime) / 2E6,
1266 (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6,
1267 (double)0,
Guido van Rossumbbc34101995-09-13 17:39:51 +00001268 (double)0,
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001269 (double)0);
1270}
Guido van Rossum8d665e61996-06-26 18:22:49 +00001271#endif /* MS_WIN32 */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001272
Guido van Rossumb6775db1994-08-01 11:34:53 +00001273#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001274static object *
1275posix_setsid(self, args)
1276 object *self;
1277 object *args;
1278{
1279 if (!getnoarg(args))
1280 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001281 if (setsid() < 0)
1282 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001283 INCREF(None);
1284 return None;
1285}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001286#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001287
Guido van Rossumb6775db1994-08-01 11:34:53 +00001288#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001289static object *
1290posix_setpgid(self, args)
1291 object *self;
1292 object *args;
1293{
1294 int pid, pgrp;
1295 if (!getargs(args, "(ii)", &pid, &pgrp))
1296 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001297 if (setpgid(pid, pgrp) < 0)
1298 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001299 INCREF(None);
1300 return None;
1301}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001302#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001303
Guido van Rossumb6775db1994-08-01 11:34:53 +00001304#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001305static object *
1306posix_tcgetpgrp(self, args)
1307 object *self;
1308 object *args;
1309{
1310 int fd, pgid;
1311 if (!getargs(args, "i", &fd))
1312 return NULL;
1313 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001314 if (pgid < 0)
1315 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001316 return newintobject((long)pgid);
1317}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001318#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00001319
Guido van Rossumb6775db1994-08-01 11:34:53 +00001320#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001321static object *
1322posix_tcsetpgrp(self, args)
1323 object *self;
1324 object *args;
1325{
1326 int fd, pgid;
1327 if (!getargs(args, "(ii)", &fd, &pgid))
1328 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001329 if (tcsetpgrp(fd, pgid) < 0)
1330 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001331 INCREF(None);
1332 return None;
1333}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001334#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001335
Guido van Rossum687dd131993-05-17 08:34:16 +00001336/* Functions acting on file descriptors */
1337
Guido van Rossum234f9421993-06-17 12:35:49 +00001338static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001339posix_open(self, args)
1340 object *self;
1341 object *args;
1342{
1343 char *file;
1344 int flag;
1345 int mode = 0777;
1346 int fd;
1347 if (!getargs(args, "(si)", &file, &flag)) {
1348 err_clear();
1349 if (!getargs(args, "(sii)", &file, &flag, &mode))
1350 return NULL;
1351 }
1352 BGN_SAVE
1353 fd = open(file, flag, mode);
1354 END_SAVE
1355 if (fd < 0)
1356 return posix_error();
1357 return newintobject((long)fd);
1358}
1359
Guido van Rossum234f9421993-06-17 12:35:49 +00001360static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001361posix_close(self, args)
1362 object *self;
1363 object *args;
1364{
1365 int fd, res;
1366 if (!getargs(args, "i", &fd))
1367 return NULL;
1368 BGN_SAVE
1369 res = close(fd);
1370 END_SAVE
1371 if (res < 0)
1372 return posix_error();
1373 INCREF(None);
1374 return None;
1375}
1376
Guido van Rossum234f9421993-06-17 12:35:49 +00001377static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001378posix_dup(self, args)
1379 object *self;
1380 object *args;
1381{
1382 int fd;
1383 if (!getargs(args, "i", &fd))
1384 return NULL;
1385 BGN_SAVE
1386 fd = dup(fd);
1387 END_SAVE
1388 if (fd < 0)
1389 return posix_error();
1390 return newintobject((long)fd);
1391}
1392
Guido van Rossum234f9421993-06-17 12:35:49 +00001393static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001394posix_dup2(self, args)
1395 object *self;
1396 object *args;
1397{
1398 int fd, fd2, res;
1399 if (!getargs(args, "(ii)", &fd, &fd2))
1400 return NULL;
1401 BGN_SAVE
1402 res = dup2(fd, fd2);
1403 END_SAVE
1404 if (res < 0)
1405 return posix_error();
1406 INCREF(None);
1407 return None;
1408}
1409
Guido van Rossum234f9421993-06-17 12:35:49 +00001410static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001411posix_lseek(self, args)
1412 object *self;
1413 object *args;
1414{
1415 int fd, how;
1416 long pos, res;
1417 if (!getargs(args, "(ili)", &fd, &pos, &how))
1418 return NULL;
1419#ifdef SEEK_SET
1420 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
1421 switch (how) {
1422 case 0: how = SEEK_SET; break;
1423 case 1: how = SEEK_CUR; break;
1424 case 2: how = SEEK_END; break;
1425 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001426#endif /* SEEK_END */
Guido van Rossum687dd131993-05-17 08:34:16 +00001427 BGN_SAVE
1428 res = lseek(fd, pos, how);
1429 END_SAVE
1430 if (res < 0)
1431 return posix_error();
1432 return newintobject(res);
1433}
1434
Guido van Rossum234f9421993-06-17 12:35:49 +00001435static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001436posix_read(self, args)
1437 object *self;
1438 object *args;
1439{
Guido van Rossum8bac5461996-06-11 18:38:48 +00001440 int fd, size, n;
Guido van Rossum687dd131993-05-17 08:34:16 +00001441 object *buffer;
1442 if (!getargs(args, "(ii)", &fd, &size))
1443 return NULL;
1444 buffer = newsizedstringobject((char *)NULL, size);
1445 if (buffer == NULL)
1446 return NULL;
1447 BGN_SAVE
Guido van Rossum8bac5461996-06-11 18:38:48 +00001448 n = read(fd, getstringvalue(buffer), size);
Guido van Rossum687dd131993-05-17 08:34:16 +00001449 END_SAVE
Guido van Rossum8bac5461996-06-11 18:38:48 +00001450 if (n < 0) {
Guido van Rossum687dd131993-05-17 08:34:16 +00001451 DECREF(buffer);
1452 return posix_error();
1453 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00001454 if (n != size)
1455 resizestring(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00001456 return buffer;
1457}
1458
Guido van Rossum234f9421993-06-17 12:35:49 +00001459static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001460posix_write(self, args)
1461 object *self;
1462 object *args;
1463{
1464 int fd, size;
1465 char *buffer;
1466 if (!getargs(args, "(is#)", &fd, &buffer, &size))
1467 return NULL;
1468 BGN_SAVE
1469 size = write(fd, buffer, size);
1470 END_SAVE
1471 if (size < 0)
1472 return posix_error();
1473 return newintobject((long)size);
1474}
1475
Guido van Rossum234f9421993-06-17 12:35:49 +00001476static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001477posix_fstat(self, args)
1478 object *self;
1479 object *args;
1480{
1481 int fd;
1482 struct stat st;
1483 int res;
1484 if (!getargs(args, "i", &fd))
1485 return NULL;
1486 BGN_SAVE
1487 res = fstat(fd, &st);
1488 END_SAVE
1489 if (res != 0)
1490 return posix_error();
1491 return mkvalue("(llllllllll)",
1492 (long)st.st_mode,
1493 (long)st.st_ino,
1494 (long)st.st_dev,
1495 (long)st.st_nlink,
1496 (long)st.st_uid,
1497 (long)st.st_gid,
1498 (long)st.st_size,
1499 (long)st.st_atime,
1500 (long)st.st_mtime,
1501 (long)st.st_ctime);
1502}
1503
1504static object *
1505posix_fdopen(self, args)
1506 object *self;
1507 object *args;
1508{
1509 extern int fclose PROTO((FILE *));
1510 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001511 char *mode = "r";
1512 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00001513 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001514 object *f;
1515 if (!newgetargs(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00001516 return NULL;
1517 BGN_SAVE
1518 fp = fdopen(fd, mode);
1519 END_SAVE
1520 if (fp == NULL)
1521 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001522 f = newopenfileobject(fp, "(fdopen)", mode, fclose);
1523 if (f != NULL)
1524 setfilebufsize(f, bufsize);
1525 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00001526}
1527
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001528#ifdef HAVE_PIPE
Guido van Rossum234f9421993-06-17 12:35:49 +00001529static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001530posix_pipe(self, args)
1531 object *self;
1532 object *args;
1533{
Guido van Rossum8d665e61996-06-26 18:22:49 +00001534#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00001535 int fds[2];
1536 int res;
1537 if (!getargs(args, ""))
1538 return NULL;
1539 BGN_SAVE
1540 res = pipe(fds);
1541 END_SAVE
1542 if (res != 0)
1543 return posix_error();
1544 return mkvalue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00001545#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00001546 HANDLE read, write;
1547 BOOL ok;
1548 if (!getargs(args, ""))
1549 return NULL;
1550 BGN_SAVE
1551 ok = CreatePipe( &read, &write, NULL, 0);
1552 END_SAVE
1553 if (!ok)
1554 return posix_error();
1555 return mkvalue("(ii)", read, write);
Guido van Rossum8d665e61996-06-26 18:22:49 +00001556#endif /* MS_WIN32 */
Guido van Rossum687dd131993-05-17 08:34:16 +00001557}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001558#endif /* HAVE_PIPE */
1559
1560#ifdef HAVE_MKFIFO
1561static object *
1562posix_mkfifo(self, args)
1563 object *self;
1564 object *args;
1565{
1566 char *file;
1567 int mode = 0666;
1568 int res;
1569 if (!newgetargs(args, "s|i", &file, &mode))
1570 return NULL;
1571 BGN_SAVE
1572 res = mkfifo(file, mode);
1573 END_SAVE
1574 if (res < 0)
1575 return posix_error();
1576 INCREF(None);
1577 return None;
1578}
1579#endif
1580
1581#ifdef HAVE_FTRUNCATE
1582static object *
1583posix_ftruncate(self, args)
1584 object *self; /* Not used */
1585 object *args;
1586{
1587 int fd;
1588 long length;
1589 int res;
1590
1591 if (!getargs(args, "(il)", &fd, &length))
1592 return NULL;
1593
1594 BGN_SAVE
1595 res = ftruncate(fd, length);
1596 END_SAVE
1597 if (res < 0) {
1598 err_errno(IOError);
1599 return NULL;
1600 }
1601 INCREF(None);
1602 return None;
1603}
1604#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00001605
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001606#ifdef HAVE_PUTENV
1607static object *
1608posix_putenv(self,args)
1609 object *self;
1610 object *args;
1611{
1612 char *s1, *s2;
1613 char *new;
1614
1615 if (!newgetargs(args, "ss", &s1, &s2))
1616 return NULL;
1617 /* XXX This leaks memory -- not easy to fix :-( */
1618 if ((new = malloc(strlen(s1) + strlen(s2) + 2)) == NULL)
1619 return err_nomem();
1620 (void) sprintf(new, "%s=%s", s1, s2);
1621 if (putenv(new)) {
1622 posix_error();
1623 return NULL;
1624 }
1625 INCREF(None);
1626 return None;
1627}
1628#endif
1629
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001630static struct methodlist posix_methods[] = {
1631 {"chdir", posix_chdir},
1632 {"chmod", posix_chmod},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001633#ifdef HAVE_CHOWN
1634 {"chown", posix_chown},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001635#endif /* HAVE_CHOWN */
Guido van Rossum36bc6801995-06-14 22:54:23 +00001636#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001637 {"getcwd", posix_getcwd},
Guido van Rossum36bc6801995-06-14 22:54:23 +00001638#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001639#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001640 {"link", posix_link},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001641#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001642 {"listdir", posix_listdir},
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001643 {"lstat", posix_lstat},
Guido van Rossumb0824db1996-02-25 04:50:32 +00001644 {"mkdir", posix_mkdir, 1},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001645#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +00001646 {"nice", posix_nice},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001647#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001648#ifdef HAVE_READLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001649 {"readlink", posix_readlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001650#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001651 {"rename", posix_rename},
1652 {"rmdir", posix_rmdir},
1653 {"stat", posix_stat},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001654#ifdef HAVE_SYMLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001655 {"symlink", posix_symlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001656#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001657#ifdef HAVE_SYSTEM
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001658 {"system", posix_system},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001659#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001660 {"umask", posix_umask},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001661#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001662 {"uname", posix_uname},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001663#endif /* HAVE_UNAME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001664 {"unlink", posix_unlink},
Guido van Rossumf4a59121996-02-13 00:12:56 +00001665 {"remove", posix_unlink},
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001666 {"utime", posix_utime},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001667#ifdef HAVE_TIMES
Guido van Rossum22db57e1992-04-05 14:25:30 +00001668 {"times", posix_times},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001669#endif /* HAVE_TIMES */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001670 {"_exit", posix__exit},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001671#ifdef HAVE_EXECV
Guido van Rossum89b33251993-10-22 14:26:06 +00001672 {"execv", posix_execv},
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001673 {"execve", posix_execve},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001674#endif /* HAVE_EXECV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001675#ifdef HAVE_FORK
Guido van Rossum85e3b011991-06-03 12:42:10 +00001676 {"fork", posix_fork},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001677#endif /* HAVE_FORK */
1678#ifdef HAVE_GETEGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001679 {"getegid", posix_getegid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001680#endif /* HAVE_GETEGID */
1681#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001682 {"geteuid", posix_geteuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001683#endif /* HAVE_GETEUID */
1684#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001685 {"getgid", posix_getgid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001686#endif /* HAVE_GETGID */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001687 {"getpid", posix_getpid},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001688#ifdef HAVE_GETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001689 {"getpgrp", posix_getpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001690#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001691#ifdef HAVE_GETPPID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001692 {"getppid", posix_getppid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001693#endif /* HAVE_GETPPID */
1694#ifdef HAVE_GETUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001695 {"getuid", posix_getuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001696#endif /* HAVE_GETUID */
1697#ifdef HAVE_KILL
Guido van Rossum85e3b011991-06-03 12:42:10 +00001698 {"kill", posix_kill},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001699#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00001700#ifdef HAVE_PLOCK
1701 {"plock", posix_plock},
1702#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001703#ifdef HAVE_POPEN
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001704 {"popen", posix_popen, 1},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001705#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001706#ifdef HAVE_SETUID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001707 {"setuid", posix_setuid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001708#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001709#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001710 {"setgid", posix_setgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001711#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001712#ifdef HAVE_SETPGRP
Guido van Rossumc2670a01992-09-13 20:07:29 +00001713 {"setpgrp", posix_setpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001714#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001715#ifdef HAVE_WAIT
Guido van Rossum85e3b011991-06-03 12:42:10 +00001716 {"wait", posix_wait},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001717#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001718#ifdef HAVE_WAITPID
Guido van Rossum21803b81992-08-09 12:55:27 +00001719 {"waitpid", posix_waitpid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001720#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001721#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001722 {"setsid", posix_setsid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001723#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001724#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001725 {"setpgid", posix_setpgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001726#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001727#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001728 {"tcgetpgrp", posix_tcgetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001729#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001730#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001731 {"tcsetpgrp", posix_tcsetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001732#endif /* HAVE_TCSETPGRP */
Guido van Rossum687dd131993-05-17 08:34:16 +00001733 {"open", posix_open},
1734 {"close", posix_close},
1735 {"dup", posix_dup},
1736 {"dup2", posix_dup2},
1737 {"lseek", posix_lseek},
1738 {"read", posix_read},
1739 {"write", posix_write},
1740 {"fstat", posix_fstat},
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001741 {"fdopen", posix_fdopen, 1},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001742#ifdef HAVE_PIPE
Guido van Rossum687dd131993-05-17 08:34:16 +00001743 {"pipe", posix_pipe},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001744#endif
1745#ifdef HAVE_MKFIFO
1746 {"mkfifo", posix_mkfifo, 1},
1747#endif
1748#ifdef HAVE_FTRUNCATE
1749 {"ftruncate", posix_ftruncate, 1},
1750#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001751#ifdef HAVE_PUTENV
1752 {"putenv", posix_putenv, 1},
1753#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001754 {NULL, NULL} /* Sentinel */
1755};
1756
1757
Guido van Rossuma0e71301996-05-28 22:30:38 +00001758#if defined(_MSC_VER) || defined(__WATCOMC__)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001759void
1760initnt()
1761{
1762 object *m, *d, *v;
1763
1764 m = initmodule("nt", posix_methods);
1765 d = getmoduledict(m);
1766
1767 /* Initialize nt.environ dictionary */
1768 v = convertenviron();
1769 if (v == NULL || dictinsert(d, "environ", v) != 0)
1770 fatal("can't define nt.environ");
1771 DECREF(v);
1772
1773 /* Initialize nt.error exception */
1774 PosixError = newstringobject("nt.error");
1775 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1776 fatal("can't define nt.error");
1777}
Guido van Rossum8d665e61996-06-26 18:22:49 +00001778#else /* not a PC port */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001779void
1780initposix()
1781{
1782 object *m, *d, *v;
1783
1784 m = initmodule("posix", posix_methods);
1785 d = getmoduledict(m);
1786
1787 /* Initialize posix.environ dictionary */
1788 v = convertenviron();
1789 if (v == NULL || dictinsert(d, "environ", v) != 0)
1790 fatal("can't define posix.environ");
1791 DECREF(v);
1792
Guido van Rossumde4e1241995-03-30 10:56:54 +00001793#ifdef WNOHANG
1794 /* Export WNOHANG symbol */
1795 v = newintobject((long)WNOHANG);
1796 if (v == NULL || dictinsert(d, "WNOHANG", v) != 0)
1797 fatal("can't define posix.WNOHANG");
1798 DECREF(v);
1799#endif
1800
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001801 /* Initialize posix.error exception */
1802 PosixError = newstringobject("posix.error");
1803 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1804 fatal("can't define posix.error");
1805}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001806#endif /* !_MSC_VER */