blob: 119e871741957892fc01f69433a4ecbccdab2f37 [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
Guido van Rossuma376cc51996-12-05 23:43:35 +000055#ifdef HAVE_SIGNAL_H
56#include <signal.h>
57#endif
58
Guido van Rossumb6775db1994-08-01 11:34:53 +000059#include "mytime.h" /* For clock_t on some systems */
60
61#ifdef HAVE_FCNTL_H
62#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000063#endif /* HAVE_FCNTL_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +000064
Guido van Rossuma4916fa1996-05-23 22:58:55 +000065/* Various compilers have only certain posix functions */
66#ifdef __WATCOMC__ /* Watcom compiler */
67#define HAVE_GETCWD 1
68#define HAVE_OPENDIR 1
69#define HAVE_SYSTEM 1
70#if defined(__OS2__)
71#define HAVE_EXECV 1
72#define HAVE_WAIT 1
Guido van Rossumad0ee831995-03-01 10:34:45 +000073#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +000074#include <process.h>
75#else
76#ifdef __BORLANDC__ /* Borland compiler */
77#define HAVE_EXECV 1
78#define HAVE_GETCWD 1
79#define HAVE_GETEGID 1
80#define HAVE_GETEUID 1
81#define HAVE_GETGID 1
82#define HAVE_GETPPID 1
83#define HAVE_GETUID 1
84#define HAVE_KILL 1
85#define HAVE_OPENDIR 1
86#define HAVE_PIPE 1
87#define HAVE_POPEN 1
88#define HAVE_SYSTEM 1
89#define HAVE_WAIT 1
90#else
91#ifdef _MSC_VER /* Microsoft compiler */
Guido van Rossum8d665e61996-06-26 18:22:49 +000092#define HAVE_GETCWD 1
93#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +000094#define HAVE_EXECV 1
95#define HAVE_PIPE 1
96#define HAVE_POPEN 1
97#define HAVE_SYSTEM 1
98#else /* 16-bit Windows */
Guido van Rossum8d665e61996-06-26 18:22:49 +000099#endif /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000100#else /* all other compilers */
101/* Unix functions that the configure script doesn't check for */
102#define HAVE_EXECV 1
103#define HAVE_FORK 1
104#define HAVE_GETCWD 1
105#define HAVE_GETEGID 1
106#define HAVE_GETEUID 1
107#define HAVE_GETGID 1
108#define HAVE_GETPPID 1
109#define HAVE_GETUID 1
110#define HAVE_KILL 1
111#define HAVE_OPENDIR 1
112#define HAVE_PIPE 1
113#define HAVE_POPEN 1
114#define HAVE_SYSTEM 1
115#define HAVE_WAIT 1
116#endif /* _MSC_VER */
117#endif /* __BORLANDC__ */
118#endif /* ! __WATCOMC__ */
Guido van Rossumad0ee831995-03-01 10:34:45 +0000119
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000120#ifndef _MSC_VER
Guido van Rossum36bc6801995-06-14 22:54:23 +0000121
Guido van Rossumb6775db1994-08-01 11:34:53 +0000122#ifdef HAVE_UNISTD_H
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000123#include <unistd.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +0000124#endif
125
126#ifdef NeXT
127/* NeXT's <unistd.h> and <utime.h> aren't worth much */
128#undef HAVE_UNISTD_H
129#undef HAVE_UTIME_H
130/* #undef HAVE_GETCWD */
131#endif
132
133#ifdef HAVE_UNISTD_H
Guido van Rossumad0ee831995-03-01 10:34:45 +0000134/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
135extern int rename();
136extern int pclose();
137extern int lstat();
138extern int symlink();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000139#else /* !HAVE_UNISTD_H */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000140#if defined(__WATCOMC__) || defined(_MSC_VER)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000141extern int mkdir PROTO((const char *));
142#else
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000143extern int mkdir PROTO((const char *, mode_t));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000144#endif
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000145extern int chdir PROTO((const char *));
Guido van Rossume22e6441993-07-09 10:51:31 +0000146extern int rmdir PROTO((const char *));
147extern int chmod PROTO((const char *, mode_t));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000148extern int chown PROTO((const char *, uid_t, gid_t));
149extern char *getcwd PROTO((char *, int));
Guido van Rossume22e6441993-07-09 10:51:31 +0000150extern char *strerror PROTO((int));
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000151extern int link PROTO((const char *, const char *));
152extern int rename PROTO((const char *, const char *));
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000153extern int stat PROTO((const char *, struct stat *));
154extern int unlink PROTO((const char *));
155extern int pclose PROTO((FILE *));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000156#ifdef HAVE_SYMLINK
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000157extern int symlink PROTO((const char *, const char *));
Guido van Rossuma38a5031995-02-17 15:11:36 +0000158#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000159#ifdef HAVE_LSTAT
160extern int lstat PROTO((const char *, struct stat *));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000161#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000162#endif /* !HAVE_UNISTD_H */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000163
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000164#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165
Guido van Rossumb6775db1994-08-01 11:34:53 +0000166#ifdef HAVE_UTIME_H
167#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000168#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000169
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000170#ifdef HAVE_SYS_UTIME_H
171#include <sys/utime.h>
172#define HAVE_UTIME_H /* pretend we do for the rest of this file */
173#endif /* HAVE_SYS_UTIME_H */
174
Guido van Rossumb6775db1994-08-01 11:34:53 +0000175#ifdef HAVE_SYS_TIMES_H
176#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000177#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000178
179#ifdef HAVE_SYS_PARAM_H
180#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000181#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000182
183#ifdef HAVE_SYS_UTSNAME_H
184#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000185#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000186
187#ifndef MAXPATHLEN
188#define MAXPATHLEN 1024
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000189#endif /* MAXPATHLEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000190
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000191#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000192#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000193#define NAMLEN(dirent) strlen((dirent)->d_name)
194#else
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000195#ifdef __WATCOMC__
196#include <direct.h>
197#define NAMLEN(dirent) strlen((dirent)->d_name)
198#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000199#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000200#define NAMLEN(dirent) (dirent)->d_namlen
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000201#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000202#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000203#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000204#endif
205#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000206#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000207#endif
208#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000209#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000210#endif
211#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000212
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000213#ifdef _MSC_VER
Guido van Rossumb6775db1994-08-01 11:34:53 +0000214#include <direct.h>
215#include <io.h>
216#include <process.h>
217#include <windows.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000218#ifdef MS_WIN32
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000219#define popen _popen
Guido van Rossum794d8131994-08-23 13:48:48 +0000220#define pclose _pclose
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000221#else /* 16-bit Windows */
222#include <dos.h>
223#include <ctype.h>
Guido van Rossum8d665e61996-06-26 18:22:49 +0000224#endif /* MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000225#endif /* _MSC_VER */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000226
227#ifdef OS2
228#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000229#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230
231/* Return a dictionary corresponding to the POSIX environment table */
232
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000233#if !defined(_MSC_VER) && !defined(__WATCOMC__)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000235#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236
237static object *
238convertenviron()
239{
240 object *d;
241 char **e;
242 d = newdictobject();
243 if (d == NULL)
244 return NULL;
245 if (environ == NULL)
246 return d;
247 /* XXX This part ignores errors */
248 for (e = environ; *e != NULL; e++) {
249 object *v;
250 char *p = strchr(*e, '=');
251 if (p == NULL)
252 continue;
253 v = newstringobject(p+1);
254 if (v == NULL)
255 continue;
256 *p = '\0';
257 (void) dictinsert(d, *e, v);
258 *p = '=';
259 DECREF(v);
260 }
261 return d;
262}
263
264
265static object *PosixError; /* Exception posix.error */
266
267/* Set a POSIX-specific error from errno, and return NULL */
268
Guido van Rossumad0ee831995-03-01 10:34:45 +0000269static object * posix_error()
270{
271 return err_errno(PosixError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272}
273
274
275/* POSIX generic methods */
276
277static object *
278posix_1str(args, func)
279 object *args;
280 int (*func) FPROTO((const char *));
281{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000282 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000283 int res;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000284 if (!getargs(args, "s", &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000286 BGN_SAVE
287 res = (*func)(path1);
288 END_SAVE
289 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290 return posix_error();
291 INCREF(None);
292 return None;
293}
294
295static object *
296posix_2str(args, func)
297 object *args;
298 int (*func) FPROTO((const char *, const char *));
299{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000300 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000301 int res;
Guido van Rossum234f9421993-06-17 12:35:49 +0000302 if (!getargs(args, "(ss)", &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000304 BGN_SAVE
305 res = (*func)(path1, path2);
306 END_SAVE
307 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308 return posix_error();
309 INCREF(None);
310 return None;
311}
312
313static object *
314posix_strint(args, func)
315 object *args;
316 int (*func) FPROTO((const char *, int));
317{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000318 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000320 int res;
Guido van Rossum234f9421993-06-17 12:35:49 +0000321 if (!getargs(args, "(si)", &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000323 BGN_SAVE
324 res = (*func)(path, i);
325 END_SAVE
326 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000327 return posix_error();
328 INCREF(None);
329 return None;
330}
331
332static object *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000333posix_strintint(args, func)
334 object *args;
335 int (*func) FPROTO((const char *, int, int));
336{
337 char *path;
338 int i,i2;
339 int res;
340 if (!getargs(args, "(sii)", &path, &i, &i2))
341 return NULL;
342 BGN_SAVE
343 res = (*func)(path, i, i2);
344 END_SAVE
345 if (res < 0)
346 return posix_error();
347 INCREF(None);
348 return None;
349}
350
351static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000352posix_do_stat(self, args, statfunc)
353 object *self;
354 object *args;
355 int (*statfunc) FPROTO((const char *, struct stat *));
356{
357 struct stat st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000358 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000359 int res;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000360 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000361 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000362 BGN_SAVE
363 res = (*statfunc)(path, &st);
364 END_SAVE
365 if (res != 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366 return posix_error();
Guido van Rossum687dd131993-05-17 08:34:16 +0000367 return mkvalue("(llllllllll)",
Guido van Rossume5372401993-03-16 12:15:04 +0000368 (long)st.st_mode,
369 (long)st.st_ino,
370 (long)st.st_dev,
371 (long)st.st_nlink,
372 (long)st.st_uid,
373 (long)st.st_gid,
374 (long)st.st_size,
375 (long)st.st_atime,
376 (long)st.st_mtime,
377 (long)st.st_ctime);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000378}
379
380
381/* POSIX methods */
382
383static object *
384posix_chdir(self, args)
385 object *self;
386 object *args;
387{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388 return posix_1str(args, chdir);
389}
390
391static object *
392posix_chmod(self, args)
393 object *self;
394 object *args;
395{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000396 return posix_strint(args, chmod);
397}
398
Guido van Rossumb6775db1994-08-01 11:34:53 +0000399#ifdef HAVE_CHOWN
400static object *
401posix_chown(self, args)
402 object *self;
403 object *args;
404{
405 return posix_strintint(args, chown);
406}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000407#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000408
Guido van Rossum36bc6801995-06-14 22:54:23 +0000409#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000410static object *
411posix_getcwd(self, args)
412 object *self;
413 object *args;
414{
415 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000416 char *res;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000417 if (!getnoarg(args))
418 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000419 BGN_SAVE
420 res = getcwd(buf, sizeof buf);
421 END_SAVE
422 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000423 return posix_error();
424 return newstringobject(buf);
425}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000426#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427
Guido van Rossumb6775db1994-08-01 11:34:53 +0000428#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429static object *
430posix_link(self, args)
431 object *self;
432 object *args;
433{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434 return posix_2str(args, link);
435}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000436#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437
Guido van Rossumb6775db1994-08-01 11:34:53 +0000438static object *
439posix_listdir(self, args)
440 object *self;
441 object *args;
442{
Guido van Rossum8d665e61996-06-26 18:22:49 +0000443#if defined(MS_WIN32) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000444
Guido van Rossumb6775db1994-08-01 11:34:53 +0000445 char *name;
446 int len;
447 object *d, *v;
448 HANDLE hFindFile;
449 WIN32_FIND_DATA FileData;
450 char namebuf[MAX_PATH+5];
451
452 if (!getargs(args, "s#", &name, &len))
453 return NULL;
454 if (len >= MAX_PATH) {
455 err_setstr(ValueError, "path too long");
456 return NULL;
457 }
458 strcpy(namebuf, name);
459 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
460 namebuf[len++] = '/';
461 strcpy(namebuf + len, "*.*");
462
463 if ((d = newlistobject(0)) == NULL)
464 return NULL;
465
466 hFindFile = FindFirstFile(namebuf, &FileData);
467 if (hFindFile == INVALID_HANDLE_VALUE) {
468 errno = GetLastError();
469 return posix_error();
470 }
471 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000472 if (FileData.cFileName[0] == '.' &&
473 (FileData.cFileName[1] == '\0' ||
474 FileData.cFileName[1] == '.' &&
475 FileData.cFileName[2] == '\0'))
476 continue;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000477 v = newstringobject(FileData.cFileName);
478 if (v == NULL) {
479 DECREF(d);
480 d = NULL;
481 break;
482 }
483 if (addlistitem(d, v) != 0) {
484 DECREF(v);
485 DECREF(d);
486 d = NULL;
487 break;
488 }
489 DECREF(v);
490 } while (FindNextFile(hFindFile, &FileData) == TRUE);
491
492 if (FindClose(hFindFile) == FALSE) {
493 errno = GetLastError();
494 return posix_error();
495 }
496
497 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000498
Guido van Rossum8d665e61996-06-26 18:22:49 +0000499#else /* !MS_WIN32 */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000500#ifdef _MSC_VER /* 16-bit Windows */
501
502#ifndef MAX_PATH
503#define MAX_PATH 250
504#endif
505 char *name, *pt;
506 int len;
507 object *d, *v;
508 char namebuf[MAX_PATH+5];
509 struct _find_t ep;
510
511 if (!getargs(args, "s#", &name, &len))
512 return NULL;
513 if (len >= MAX_PATH) {
514 err_setstr(ValueError, "path too long");
515 return NULL;
516 }
517 strcpy(namebuf, name);
518 for (pt = namebuf; *pt; pt++)
519 if (*pt == '/')
520 *pt = '\\';
521 if (namebuf[len-1] != '\\')
522 namebuf[len++] = '\\';
523 strcpy(namebuf + len, "*.*");
524
525 if ((d = newlistobject(0)) == NULL)
526 return NULL;
527
528 if (_dos_findfirst(namebuf, _A_RDONLY |
529 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0){
530 errno = ENOENT;
531 return posix_error();
532 }
533 do {
534 if (ep.name[0] == '.' &&
535 (ep.name[1] == '\0' ||
536 ep.name[1] == '.' &&
537 ep.name[2] == '\0'))
538 continue;
539 strcpy(namebuf, ep.name);
540 for (pt = namebuf; *pt; pt++)
541 if (isupper(*pt))
542 *pt = tolower(*pt);
543 v = newstringobject(namebuf);
544 if (v == NULL) {
545 DECREF(d);
546 d = NULL;
547 break;
548 }
549 if (addlistitem(d, v) != 0) {
550 DECREF(v);
551 DECREF(d);
552 d = NULL;
553 break;
554 }
555 DECREF(v);
556 } while (_dos_findnext(&ep) == 0);
557
558 return d;
559
560#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000561
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000562 char *name;
563 object *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000564 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000565 struct dirent *ep;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000566 if (!getargs(args, "s", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000567 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000568 BGN_SAVE
569 if ((dirp = opendir(name)) == NULL) {
570 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000571 return posix_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000572 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000573 if ((d = newlistobject(0)) == NULL) {
574 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000575 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000576 return NULL;
577 }
578 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000579 if (ep->d_name[0] == '.' &&
580 (NAMLEN(ep) == 1 ||
Guido van Rossuma376cc51996-12-05 23:43:35 +0000581 (ep->d_name[1] == '.' && NAMLEN(ep) == 2)))
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000582 continue;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000583 v = newsizedstringobject(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000584 if (v == NULL) {
585 DECREF(d);
586 d = NULL;
587 break;
588 }
589 if (addlistitem(d, v) != 0) {
590 DECREF(v);
591 DECREF(d);
592 d = NULL;
593 break;
594 }
595 DECREF(v);
596 }
597 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000598 END_SAVE
Guido van Rossum0ee42cd1991-04-08 21:01:03 +0000599
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000600 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000601
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000602#endif /* !_MSC_VER */
Guido van Rossum8d665e61996-06-26 18:22:49 +0000603#endif /* !MS_WIN32 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000604}
605
606static object *
607posix_mkdir(self, args)
608 object *self;
609 object *args;
610{
Guido van Rossumb0824db1996-02-25 04:50:32 +0000611 int res;
612 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000613 int mode = 0777;
Guido van Rossumb0824db1996-02-25 04:50:32 +0000614 if (!newgetargs(args, "s|i", &path, &mode))
615 return NULL;
616 BGN_SAVE
Guido van Rossum8d665e61996-06-26 18:22:49 +0000617#if defined(__WATCOMC__) || defined(_MSC_VER)
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000618 res = mkdir(path);
619#else
Guido van Rossumb0824db1996-02-25 04:50:32 +0000620 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000621#endif
Guido van Rossumb0824db1996-02-25 04:50:32 +0000622 END_SAVE
623 if (res < 0)
624 return posix_error();
625 INCREF(None);
626 return None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000627}
628
Guido van Rossumb6775db1994-08-01 11:34:53 +0000629#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +0000630static object *
631posix_nice(self, args)
632 object *self;
633 object *args;
634{
635 int increment, value;
636
637 if (!getargs(args, "i", &increment))
638 return NULL;
639 value = nice(increment);
640 if (value == -1)
641 return posix_error();
642 return newintobject((long) value);
643}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000644#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000645
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000646static object *
647posix_rename(self, args)
648 object *self;
649 object *args;
650{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000651 return posix_2str(args, rename);
652}
653
654static object *
655posix_rmdir(self, args)
656 object *self;
657 object *args;
658{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000659 return posix_1str(args, rmdir);
660}
661
662static object *
663posix_stat(self, args)
664 object *self;
665 object *args;
666{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000667 return posix_do_stat(self, args, stat);
668}
669
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000670#ifdef HAVE_SYSTEM
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000671static object *
672posix_system(self, args)
673 object *self;
674 object *args;
675{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000676 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000677 long sts;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000678 if (!getargs(args, "s", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000679 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000680 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000681 sts = system(command);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000682 END_SAVE
683 return newintobject(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000684}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000685#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000686
687static object *
688posix_umask(self, args)
689 object *self;
690 object *args;
691{
692 int i;
693 if (!getintarg(args, &i))
694 return NULL;
695 i = umask(i);
696 if (i < 0)
697 return posix_error();
698 return newintobject((long)i);
699}
700
701static object *
702posix_unlink(self, args)
703 object *self;
704 object *args;
705{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000706 return posix_1str(args, unlink);
707}
708
Guido van Rossumb6775db1994-08-01 11:34:53 +0000709#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000710static object *
711posix_uname(self, args)
712 object *self;
713 object *args;
714{
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000715 struct utsname u;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000716 int res;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000717 if (!getnoarg(args))
718 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000719 BGN_SAVE
720 res = uname(&u);
721 END_SAVE
722 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000723 return posix_error();
Guido van Rossume5372401993-03-16 12:15:04 +0000724 return mkvalue("(sssss)",
725 u.sysname,
726 u.nodename,
727 u.release,
728 u.version,
729 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000730}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000731#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000732
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000733static object *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000734posix_utime(self, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000735 object *self;
736 object *args;
737{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000738 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000739 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000740 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000741
Guido van Rossumb6775db1994-08-01 11:34:53 +0000742#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000743 struct utimbuf buf;
744#define ATIME buf.actime
745#define MTIME buf.modtime
746#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000747#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000748 time_t buf[2];
749#define ATIME buf[0]
750#define MTIME buf[1]
751#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000752#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000753
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000754 if (!getargs(args, "(s(ll))", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000755 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000756 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +0000757 MTIME = mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000758 BGN_SAVE
759 res = utime(path, UTIME_ARG);
760 END_SAVE
761 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000762 return posix_error();
763 INCREF(None);
764 return None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000765#undef UTIME_ARG
766#undef ATIME
767#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000768}
769
Guido van Rossum85e3b011991-06-03 12:42:10 +0000770
Guido van Rossum3b066191991-06-04 19:40:25 +0000771/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000772
773static object *
774posix__exit(self, args)
775 object *self;
776 object *args;
777{
778 int sts;
779 if (!getintarg(args, &sts))
780 return NULL;
781 _exit(sts);
Guido van Rossuma376cc51996-12-05 23:43:35 +0000782 return NULL; /* Make gcc -Wall happy */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000783}
784
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000785#ifdef HAVE_EXECV
Guido van Rossum85e3b011991-06-03 12:42:10 +0000786static object *
Guido van Rossum89b33251993-10-22 14:26:06 +0000787posix_execv(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +0000788 object *self;
789 object *args;
790{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000791 char *path;
792 object *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000793 char **argvlist;
794 int i, argc;
795 object *(*getitem) PROTO((object *, int));
796
Guido van Rossum89b33251993-10-22 14:26:06 +0000797 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +0000798 argv is a list or tuple of strings. */
799
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000800 if (!getargs(args, "(sO)", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000801 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000802 if (is_listobject(argv)) {
803 argc = getlistsize(argv);
804 getitem = getlistitem;
805 }
806 else if (is_tupleobject(argv)) {
807 argc = gettuplesize(argv);
808 getitem = gettupleitem;
809 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000810 else {
811 badarg:
812 err_badarg();
813 return NULL;
814 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000815
816 argvlist = NEW(char *, argc+1);
817 if (argvlist == NULL)
818 return NULL;
819 for (i = 0; i < argc; i++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000820 if (!getargs((*getitem)(argv, i), "s", &argvlist[i])) {
Guido van Rossum85e3b011991-06-03 12:42:10 +0000821 DEL(argvlist);
822 goto badarg;
823 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000824 }
825 argvlist[argc] = NULL;
826
Guido van Rossumb6775db1994-08-01 11:34:53 +0000827#ifdef BAD_EXEC_PROTOTYPES
828 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000829#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000830 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000831#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000832
Guido van Rossum85e3b011991-06-03 12:42:10 +0000833 /* If we get here it's definitely an error */
834
835 DEL(argvlist);
836 return posix_error();
837}
838
839static object *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000840posix_execve(self, args)
841 object *self;
842 object *args;
843{
844 char *path;
845 object *argv, *env;
846 char **argvlist;
847 char **envlist;
848 object *key, *val;
849 int i, pos, argc, envc;
850 object *(*getitem) PROTO((object *, int));
851
852 /* execve has three arguments: (path, argv, env), where
853 argv is a list or tuple of strings and env is a dictionary
854 like posix.environ. */
855
856 if (!getargs(args, "(sOO)", &path, &argv, &env))
857 return NULL;
858 if (is_listobject(argv)) {
859 argc = getlistsize(argv);
860 getitem = getlistitem;
861 }
862 else if (is_tupleobject(argv)) {
863 argc = gettuplesize(argv);
864 getitem = gettupleitem;
865 }
866 else {
867 err_setstr(TypeError, "argv must be tuple or list");
868 return NULL;
869 }
870 if (!is_dictobject(env)) {
871 err_setstr(TypeError, "env must be dictionary");
872 return NULL;
873 }
874
875 argvlist = NEW(char *, argc+1);
876 if (argvlist == NULL) {
877 err_nomem();
878 return NULL;
879 }
880 for (i = 0; i < argc; i++) {
881 if (!getargs((*getitem)(argv, i),
882 "s;argv must be list of strings",
883 &argvlist[i])) {
884 goto fail_1;
885 }
886 }
887 argvlist[argc] = NULL;
888
889 i = getmappingsize(env);
890 envlist = NEW(char *, i + 1);
891 if (envlist == NULL) {
892 err_nomem();
893 goto fail_1;
894 }
895 pos = 0;
896 envc = 0;
897 while (mappinggetnext(env, &pos, &key, &val)) {
898 char *p, *k, *v;
899 if (!getargs(key, "s;non-string key in env", &k) ||
900 !getargs(val, "s;non-string value in env", &v)) {
901 goto fail_2;
902 }
903 p = NEW(char, getstringsize(key) + getstringsize(val) + 2);
904 if (p == NULL) {
905 err_nomem();
906 goto fail_2;
907 }
908 sprintf(p, "%s=%s", k, v);
909 envlist[envc++] = p;
910 }
911 envlist[envc] = 0;
912
Guido van Rossumb6775db1994-08-01 11:34:53 +0000913
914#ifdef BAD_EXEC_PROTOTYPES
915 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000916#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000917 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000918#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000919
920 /* If we get here it's definitely an error */
921
922 (void) posix_error();
923
924 fail_2:
925 while (--envc >= 0)
926 DEL(envlist[envc]);
927 DEL(envlist);
928 fail_1:
929 DEL(argvlist);
930
931 return NULL;
932}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000933#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000934
Guido van Rossumad0ee831995-03-01 10:34:45 +0000935#ifdef HAVE_FORK
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000936static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000937posix_fork(self, args)
938 object *self;
939 object *args;
940{
941 int pid;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000942 if (!getnoarg(args))
943 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000944 pid = fork();
945 if (pid == -1)
946 return posix_error();
947 return newintobject((long)pid);
948}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000949#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000950
Guido van Rossumad0ee831995-03-01 10:34:45 +0000951#ifdef HAVE_GETEGID
Guido van Rossum85e3b011991-06-03 12:42:10 +0000952static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000953posix_getegid(self, args)
954 object *self;
955 object *args;
956{
957 if (!getnoarg(args))
958 return NULL;
959 return newintobject((long)getegid());
960}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000961#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000962
Guido van Rossumad0ee831995-03-01 10:34:45 +0000963#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000964static object *
965posix_geteuid(self, args)
966 object *self;
967 object *args;
968{
969 if (!getnoarg(args))
970 return NULL;
971 return newintobject((long)geteuid());
972}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000973#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000974
Guido van Rossumad0ee831995-03-01 10:34:45 +0000975#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000976static object *
977posix_getgid(self, args)
978 object *self;
979 object *args;
980{
981 if (!getnoarg(args))
982 return NULL;
983 return newintobject((long)getgid());
984}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000985#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000986
987static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000988posix_getpid(self, args)
989 object *self;
990 object *args;
991{
Guido van Rossum04814471991-06-04 20:23:49 +0000992 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000993 return NULL;
994 return newintobject((long)getpid());
995}
996
Guido van Rossumb6775db1994-08-01 11:34:53 +0000997#ifdef HAVE_GETPGRP
Guido van Rossum85e3b011991-06-03 12:42:10 +0000998static object *
Guido van Rossum04814471991-06-04 20:23:49 +0000999posix_getpgrp(self, args)
1000 object *self;
1001 object *args;
1002{
1003 if (!getnoarg(args))
1004 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +00001005#ifdef GETPGRP_HAVE_ARG
Guido van Rossum971443b1991-06-07 13:59:29 +00001006 return newintobject((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001007#else /* GETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001008 return newintobject((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001009#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +00001010}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001011#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001012
Guido van Rossumb6775db1994-08-01 11:34:53 +00001013#ifdef HAVE_SETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001014static object *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001015posix_setpgrp(self, args)
1016 object *self;
1017 object *args;
1018{
1019 if (!getnoarg(args))
1020 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001021#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001022 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001023#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001024 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001025#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001026 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001027 INCREF(None);
1028 return None;
1029}
1030
Guido van Rossumb6775db1994-08-01 11:34:53 +00001031#endif /* HAVE_SETPGRP */
1032
Guido van Rossumad0ee831995-03-01 10:34:45 +00001033#ifdef HAVE_GETPPID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001034static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001035posix_getppid(self, args)
1036 object *self;
1037 object *args;
1038{
Guido van Rossum04814471991-06-04 20:23:49 +00001039 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001040 return NULL;
1041 return newintobject((long)getppid());
1042}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001043#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001044
Guido van Rossumad0ee831995-03-01 10:34:45 +00001045#ifdef HAVE_GETUID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001046static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001047posix_getuid(self, args)
1048 object *self;
1049 object *args;
1050{
1051 if (!getnoarg(args))
1052 return NULL;
1053 return newintobject((long)getuid());
1054}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001055#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001056
Guido van Rossumad0ee831995-03-01 10:34:45 +00001057#ifdef HAVE_KILL
Guido van Rossum46003ff1992-05-15 11:05:24 +00001058static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001059posix_kill(self, args)
1060 object *self;
1061 object *args;
1062{
1063 int pid, sig;
Guido van Rossum234f9421993-06-17 12:35:49 +00001064 if (!getargs(args, "(ii)", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001065 return NULL;
1066 if (kill(pid, sig) == -1)
1067 return posix_error();
1068 INCREF(None);
1069 return None;
1070}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001071#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001072
Guido van Rossumc0125471996-06-28 18:55:32 +00001073#ifdef HAVE_PLOCK
1074
1075#ifdef HAVE_SYS_LOCK_H
1076#include <sys/lock.h>
1077#endif
1078
1079static object *
1080posix_plock(self, args)
1081 object *self;
1082 object *args;
1083{
1084 int op;
1085 if (!getargs(args, "i", &op))
1086 return NULL;
1087 if (plock(op) == -1)
1088 return posix_error();
1089 INCREF(None);
1090 return None;
1091}
1092#endif
1093
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001094#ifdef HAVE_POPEN
Guido van Rossum85e3b011991-06-03 12:42:10 +00001095static object *
Guido van Rossum3b066191991-06-04 19:40:25 +00001096posix_popen(self, args)
1097 object *self;
1098 object *args;
1099{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001100 char *name;
1101 char *mode = "r";
1102 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00001103 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001104 object *f;
1105 if (!newgetargs(args, "s|si", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00001106 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001107 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001108 fp = popen(name, mode);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001109 END_SAVE
Guido van Rossum3b066191991-06-04 19:40:25 +00001110 if (fp == NULL)
1111 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001112 f = newopenfileobject(fp, name, mode, pclose);
1113 if (f != NULL)
1114 setfilebufsize(f, bufsize);
1115 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00001116}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001117#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00001118
Guido van Rossumb6775db1994-08-01 11:34:53 +00001119#ifdef HAVE_SETUID
Guido van Rossum3b066191991-06-04 19:40:25 +00001120static object *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001121posix_setuid(self, args)
1122 object *self;
1123 object *args;
1124{
1125 int uid;
1126 if (!getargs(args, "i", &uid))
1127 return NULL;
1128 if (setuid(uid) < 0)
1129 return posix_error();
1130 INCREF(None);
1131 return None;
1132}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001133#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001134
Guido van Rossumb6775db1994-08-01 11:34:53 +00001135#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001136static object *
1137posix_setgid(self, args)
1138 object *self;
1139 object *args;
1140{
1141 int gid;
1142 if (!getargs(args, "i", &gid))
1143 return NULL;
1144 if (setgid(gid) < 0)
1145 return posix_error();
1146 INCREF(None);
1147 return None;
1148}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001149#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001150
Guido van Rossumb6775db1994-08-01 11:34:53 +00001151#ifdef HAVE_WAITPID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001152static object *
Guido van Rossum21803b81992-08-09 12:55:27 +00001153posix_waitpid(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +00001154 object *self;
1155 object *args;
1156{
Guido van Rossumfd03e2b1996-06-19 23:17:02 +00001157 int pid, options, sts = 0;
Guido van Rossum21803b81992-08-09 12:55:27 +00001158 if (!getargs(args, "(ii)", &pid, &options))
1159 return NULL;
1160 BGN_SAVE
1161 pid = waitpid(pid, &sts, options);
1162 END_SAVE
Guido van Rossum85e3b011991-06-03 12:42:10 +00001163 if (pid == -1)
1164 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00001165 else
1166 return mkvalue("ii", pid, sts);
Guido van Rossum21803b81992-08-09 12:55:27 +00001167}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001168#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00001169
Guido van Rossumad0ee831995-03-01 10:34:45 +00001170#ifdef HAVE_WAIT
Guido van Rossum21803b81992-08-09 12:55:27 +00001171static object *
1172posix_wait(self, args)
1173 object *self;
1174 object *args;
1175{
1176 int pid, sts;
Guido van Rossum21803b81992-08-09 12:55:27 +00001177 BGN_SAVE
1178 pid = wait(&sts);
1179 END_SAVE
1180 if (pid == -1)
1181 return posix_error();
1182 else
1183 return mkvalue("ii", pid, sts);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001184}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001185#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001186
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001187static object *
1188posix_lstat(self, args)
1189 object *self;
1190 object *args;
1191{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001192#ifdef HAVE_LSTAT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001193 return posix_do_stat(self, args, lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001194#else /* !HAVE_LSTAT */
1195 return posix_do_stat(self, args, stat);
1196#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001197}
1198
Guido van Rossumb6775db1994-08-01 11:34:53 +00001199#ifdef HAVE_READLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001200static object *
1201posix_readlink(self, args)
1202 object *self;
1203 object *args;
1204{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001205 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001206 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001207 int n;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001208 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001209 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001210 BGN_SAVE
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001211 n = readlink(path, buf, (int) sizeof buf);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001212 END_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001213 if (n < 0)
1214 return posix_error();
1215 return newsizedstringobject(buf, n);
1216}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001217#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001218
Guido van Rossumb6775db1994-08-01 11:34:53 +00001219#ifdef HAVE_SYMLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001220static object *
1221posix_symlink(self, args)
1222 object *self;
1223 object *args;
1224{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001225 return posix_2str(args, symlink);
1226}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001227#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001228
Guido van Rossumb6775db1994-08-01 11:34:53 +00001229#ifdef HAVE_TIMES
1230#ifndef HZ
1231#define HZ 60 /* Universal constant :-) */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001232#endif /* HZ */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001233static object *
1234posix_times(self, args)
1235 object *self;
1236 object *args;
1237{
1238 struct tms t;
1239 clock_t c;
Guido van Rossum22db57e1992-04-05 14:25:30 +00001240 if (!getnoarg(args))
1241 return NULL;
1242 errno = 0;
1243 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00001244 if (c == (clock_t) -1)
1245 return posix_error();
Guido van Rossumbbc34101995-09-13 17:39:51 +00001246 return mkvalue("ddddd",
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001247 (double)t.tms_utime / HZ,
1248 (double)t.tms_stime / HZ,
1249 (double)t.tms_cutime / HZ,
Guido van Rossumbbc34101995-09-13 17:39:51 +00001250 (double)t.tms_cstime / HZ,
1251 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00001252}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001253#endif /* HAVE_TIMES */
Guido van Rossum87755a21996-09-07 00:59:43 +00001254#ifdef MS_WIN32
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001255#define HAVE_TIMES /* so the method table will pick it up */
1256static object *
1257posix_times(self, args)
1258 object *self;
1259 object *args;
1260{
1261 FILETIME create, exit, kernel, user;
1262 HANDLE hProc;
1263 if (!getnoarg(args))
1264 return NULL;
1265 hProc = GetCurrentProcess();
1266 GetProcessTimes(hProc,&create, &exit, &kernel, &user);
Guido van Rossumbbc34101995-09-13 17:39:51 +00001267 return mkvalue("ddddd",
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001268 (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime) / 2E6,
1269 (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6,
1270 (double)0,
Guido van Rossumbbc34101995-09-13 17:39:51 +00001271 (double)0,
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001272 (double)0);
1273}
Guido van Rossum8d665e61996-06-26 18:22:49 +00001274#endif /* MS_WIN32 */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001275
Guido van Rossumb6775db1994-08-01 11:34:53 +00001276#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001277static object *
1278posix_setsid(self, args)
1279 object *self;
1280 object *args;
1281{
1282 if (!getnoarg(args))
1283 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001284 if (setsid() < 0)
1285 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001286 INCREF(None);
1287 return None;
1288}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001289#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001290
Guido van Rossumb6775db1994-08-01 11:34:53 +00001291#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001292static object *
1293posix_setpgid(self, args)
1294 object *self;
1295 object *args;
1296{
1297 int pid, pgrp;
1298 if (!getargs(args, "(ii)", &pid, &pgrp))
1299 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001300 if (setpgid(pid, pgrp) < 0)
1301 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001302 INCREF(None);
1303 return None;
1304}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001305#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001306
Guido van Rossumb6775db1994-08-01 11:34:53 +00001307#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001308static object *
1309posix_tcgetpgrp(self, args)
1310 object *self;
1311 object *args;
1312{
1313 int fd, pgid;
1314 if (!getargs(args, "i", &fd))
1315 return NULL;
1316 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001317 if (pgid < 0)
1318 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001319 return newintobject((long)pgid);
1320}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001321#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00001322
Guido van Rossumb6775db1994-08-01 11:34:53 +00001323#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001324static object *
1325posix_tcsetpgrp(self, args)
1326 object *self;
1327 object *args;
1328{
1329 int fd, pgid;
1330 if (!getargs(args, "(ii)", &fd, &pgid))
1331 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001332 if (tcsetpgrp(fd, pgid) < 0)
1333 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001334 INCREF(None);
1335 return None;
1336}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001337#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001338
Guido van Rossum687dd131993-05-17 08:34:16 +00001339/* Functions acting on file descriptors */
1340
Guido van Rossum234f9421993-06-17 12:35:49 +00001341static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001342posix_open(self, args)
1343 object *self;
1344 object *args;
1345{
1346 char *file;
1347 int flag;
1348 int mode = 0777;
1349 int fd;
1350 if (!getargs(args, "(si)", &file, &flag)) {
1351 err_clear();
1352 if (!getargs(args, "(sii)", &file, &flag, &mode))
1353 return NULL;
1354 }
1355 BGN_SAVE
1356 fd = open(file, flag, mode);
1357 END_SAVE
1358 if (fd < 0)
1359 return posix_error();
1360 return newintobject((long)fd);
1361}
1362
Guido van Rossum234f9421993-06-17 12:35:49 +00001363static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001364posix_close(self, args)
1365 object *self;
1366 object *args;
1367{
1368 int fd, res;
1369 if (!getargs(args, "i", &fd))
1370 return NULL;
1371 BGN_SAVE
1372 res = close(fd);
1373 END_SAVE
1374 if (res < 0)
1375 return posix_error();
1376 INCREF(None);
1377 return None;
1378}
1379
Guido van Rossum234f9421993-06-17 12:35:49 +00001380static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001381posix_dup(self, args)
1382 object *self;
1383 object *args;
1384{
1385 int fd;
1386 if (!getargs(args, "i", &fd))
1387 return NULL;
1388 BGN_SAVE
1389 fd = dup(fd);
1390 END_SAVE
1391 if (fd < 0)
1392 return posix_error();
1393 return newintobject((long)fd);
1394}
1395
Guido van Rossum234f9421993-06-17 12:35:49 +00001396static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001397posix_dup2(self, args)
1398 object *self;
1399 object *args;
1400{
1401 int fd, fd2, res;
1402 if (!getargs(args, "(ii)", &fd, &fd2))
1403 return NULL;
1404 BGN_SAVE
1405 res = dup2(fd, fd2);
1406 END_SAVE
1407 if (res < 0)
1408 return posix_error();
1409 INCREF(None);
1410 return None;
1411}
1412
Guido van Rossum234f9421993-06-17 12:35:49 +00001413static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001414posix_lseek(self, args)
1415 object *self;
1416 object *args;
1417{
1418 int fd, how;
1419 long pos, res;
1420 if (!getargs(args, "(ili)", &fd, &pos, &how))
1421 return NULL;
1422#ifdef SEEK_SET
1423 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
1424 switch (how) {
1425 case 0: how = SEEK_SET; break;
1426 case 1: how = SEEK_CUR; break;
1427 case 2: how = SEEK_END; break;
1428 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001429#endif /* SEEK_END */
Guido van Rossum687dd131993-05-17 08:34:16 +00001430 BGN_SAVE
1431 res = lseek(fd, pos, how);
1432 END_SAVE
1433 if (res < 0)
1434 return posix_error();
1435 return newintobject(res);
1436}
1437
Guido van Rossum234f9421993-06-17 12:35:49 +00001438static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001439posix_read(self, args)
1440 object *self;
1441 object *args;
1442{
Guido van Rossum8bac5461996-06-11 18:38:48 +00001443 int fd, size, n;
Guido van Rossum687dd131993-05-17 08:34:16 +00001444 object *buffer;
1445 if (!getargs(args, "(ii)", &fd, &size))
1446 return NULL;
1447 buffer = newsizedstringobject((char *)NULL, size);
1448 if (buffer == NULL)
1449 return NULL;
1450 BGN_SAVE
Guido van Rossum8bac5461996-06-11 18:38:48 +00001451 n = read(fd, getstringvalue(buffer), size);
Guido van Rossum687dd131993-05-17 08:34:16 +00001452 END_SAVE
Guido van Rossum8bac5461996-06-11 18:38:48 +00001453 if (n < 0) {
Guido van Rossum687dd131993-05-17 08:34:16 +00001454 DECREF(buffer);
1455 return posix_error();
1456 }
Guido van Rossum8bac5461996-06-11 18:38:48 +00001457 if (n != size)
1458 resizestring(&buffer, n);
Guido van Rossum687dd131993-05-17 08:34:16 +00001459 return buffer;
1460}
1461
Guido van Rossum234f9421993-06-17 12:35:49 +00001462static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001463posix_write(self, args)
1464 object *self;
1465 object *args;
1466{
1467 int fd, size;
1468 char *buffer;
1469 if (!getargs(args, "(is#)", &fd, &buffer, &size))
1470 return NULL;
1471 BGN_SAVE
1472 size = write(fd, buffer, size);
1473 END_SAVE
1474 if (size < 0)
1475 return posix_error();
1476 return newintobject((long)size);
1477}
1478
Guido van Rossum234f9421993-06-17 12:35:49 +00001479static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001480posix_fstat(self, args)
1481 object *self;
1482 object *args;
1483{
1484 int fd;
1485 struct stat st;
1486 int res;
1487 if (!getargs(args, "i", &fd))
1488 return NULL;
1489 BGN_SAVE
1490 res = fstat(fd, &st);
1491 END_SAVE
1492 if (res != 0)
1493 return posix_error();
1494 return mkvalue("(llllllllll)",
1495 (long)st.st_mode,
1496 (long)st.st_ino,
1497 (long)st.st_dev,
1498 (long)st.st_nlink,
1499 (long)st.st_uid,
1500 (long)st.st_gid,
1501 (long)st.st_size,
1502 (long)st.st_atime,
1503 (long)st.st_mtime,
1504 (long)st.st_ctime);
1505}
1506
1507static object *
1508posix_fdopen(self, args)
1509 object *self;
1510 object *args;
1511{
1512 extern int fclose PROTO((FILE *));
1513 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001514 char *mode = "r";
1515 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00001516 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001517 object *f;
1518 if (!newgetargs(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00001519 return NULL;
1520 BGN_SAVE
1521 fp = fdopen(fd, mode);
1522 END_SAVE
1523 if (fp == NULL)
1524 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001525 f = newopenfileobject(fp, "(fdopen)", mode, fclose);
1526 if (f != NULL)
1527 setfilebufsize(f, bufsize);
1528 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00001529}
1530
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001531#ifdef HAVE_PIPE
Guido van Rossum234f9421993-06-17 12:35:49 +00001532static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001533posix_pipe(self, args)
1534 object *self;
1535 object *args;
1536{
Guido van Rossum8d665e61996-06-26 18:22:49 +00001537#if !defined(MS_WIN32)
Guido van Rossum687dd131993-05-17 08:34:16 +00001538 int fds[2];
1539 int res;
1540 if (!getargs(args, ""))
1541 return NULL;
1542 BGN_SAVE
1543 res = pipe(fds);
1544 END_SAVE
1545 if (res != 0)
1546 return posix_error();
1547 return mkvalue("(ii)", fds[0], fds[1]);
Guido van Rossum8d665e61996-06-26 18:22:49 +00001548#else /* MS_WIN32 */
Guido van Rossum794d8131994-08-23 13:48:48 +00001549 HANDLE read, write;
1550 BOOL ok;
1551 if (!getargs(args, ""))
1552 return NULL;
1553 BGN_SAVE
1554 ok = CreatePipe( &read, &write, NULL, 0);
1555 END_SAVE
1556 if (!ok)
1557 return posix_error();
1558 return mkvalue("(ii)", read, write);
Guido van Rossum8d665e61996-06-26 18:22:49 +00001559#endif /* MS_WIN32 */
Guido van Rossum687dd131993-05-17 08:34:16 +00001560}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001561#endif /* HAVE_PIPE */
1562
1563#ifdef HAVE_MKFIFO
1564static object *
1565posix_mkfifo(self, args)
1566 object *self;
1567 object *args;
1568{
1569 char *file;
1570 int mode = 0666;
1571 int res;
1572 if (!newgetargs(args, "s|i", &file, &mode))
1573 return NULL;
1574 BGN_SAVE
1575 res = mkfifo(file, mode);
1576 END_SAVE
1577 if (res < 0)
1578 return posix_error();
1579 INCREF(None);
1580 return None;
1581}
1582#endif
1583
1584#ifdef HAVE_FTRUNCATE
1585static object *
1586posix_ftruncate(self, args)
1587 object *self; /* Not used */
1588 object *args;
1589{
1590 int fd;
1591 long length;
1592 int res;
1593
1594 if (!getargs(args, "(il)", &fd, &length))
1595 return NULL;
1596
1597 BGN_SAVE
1598 res = ftruncate(fd, length);
1599 END_SAVE
1600 if (res < 0) {
1601 err_errno(IOError);
1602 return NULL;
1603 }
1604 INCREF(None);
1605 return None;
1606}
1607#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00001608
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001609#ifdef HAVE_PUTENV
1610static object *
1611posix_putenv(self,args)
1612 object *self;
1613 object *args;
1614{
1615 char *s1, *s2;
1616 char *new;
1617
1618 if (!newgetargs(args, "ss", &s1, &s2))
1619 return NULL;
1620 /* XXX This leaks memory -- not easy to fix :-( */
1621 if ((new = malloc(strlen(s1) + strlen(s2) + 2)) == NULL)
1622 return err_nomem();
1623 (void) sprintf(new, "%s=%s", s1, s2);
1624 if (putenv(new)) {
1625 posix_error();
1626 return NULL;
1627 }
1628 INCREF(None);
1629 return None;
1630}
1631#endif
1632
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001633static struct methodlist posix_methods[] = {
1634 {"chdir", posix_chdir},
1635 {"chmod", posix_chmod},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001636#ifdef HAVE_CHOWN
1637 {"chown", posix_chown},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001638#endif /* HAVE_CHOWN */
Guido van Rossum36bc6801995-06-14 22:54:23 +00001639#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001640 {"getcwd", posix_getcwd},
Guido van Rossum36bc6801995-06-14 22:54:23 +00001641#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001642#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001643 {"link", posix_link},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001644#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001645 {"listdir", posix_listdir},
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001646 {"lstat", posix_lstat},
Guido van Rossumb0824db1996-02-25 04:50:32 +00001647 {"mkdir", posix_mkdir, 1},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001648#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +00001649 {"nice", posix_nice},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001650#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001651#ifdef HAVE_READLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001652 {"readlink", posix_readlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001653#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001654 {"rename", posix_rename},
1655 {"rmdir", posix_rmdir},
1656 {"stat", posix_stat},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001657#ifdef HAVE_SYMLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001658 {"symlink", posix_symlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001659#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001660#ifdef HAVE_SYSTEM
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001661 {"system", posix_system},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001662#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001663 {"umask", posix_umask},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001664#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001665 {"uname", posix_uname},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001666#endif /* HAVE_UNAME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001667 {"unlink", posix_unlink},
Guido van Rossumf4a59121996-02-13 00:12:56 +00001668 {"remove", posix_unlink},
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001669 {"utime", posix_utime},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001670#ifdef HAVE_TIMES
Guido van Rossum22db57e1992-04-05 14:25:30 +00001671 {"times", posix_times},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001672#endif /* HAVE_TIMES */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001673 {"_exit", posix__exit},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001674#ifdef HAVE_EXECV
Guido van Rossum89b33251993-10-22 14:26:06 +00001675 {"execv", posix_execv},
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001676 {"execve", posix_execve},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001677#endif /* HAVE_EXECV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001678#ifdef HAVE_FORK
Guido van Rossum85e3b011991-06-03 12:42:10 +00001679 {"fork", posix_fork},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001680#endif /* HAVE_FORK */
1681#ifdef HAVE_GETEGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001682 {"getegid", posix_getegid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001683#endif /* HAVE_GETEGID */
1684#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001685 {"geteuid", posix_geteuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001686#endif /* HAVE_GETEUID */
1687#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001688 {"getgid", posix_getgid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001689#endif /* HAVE_GETGID */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001690 {"getpid", posix_getpid},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001691#ifdef HAVE_GETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001692 {"getpgrp", posix_getpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001693#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001694#ifdef HAVE_GETPPID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001695 {"getppid", posix_getppid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001696#endif /* HAVE_GETPPID */
1697#ifdef HAVE_GETUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001698 {"getuid", posix_getuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001699#endif /* HAVE_GETUID */
1700#ifdef HAVE_KILL
Guido van Rossum85e3b011991-06-03 12:42:10 +00001701 {"kill", posix_kill},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001702#endif /* HAVE_KILL */
Guido van Rossumc0125471996-06-28 18:55:32 +00001703#ifdef HAVE_PLOCK
1704 {"plock", posix_plock},
1705#endif /* HAVE_PLOCK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001706#ifdef HAVE_POPEN
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001707 {"popen", posix_popen, 1},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001708#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001709#ifdef HAVE_SETUID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001710 {"setuid", posix_setuid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001711#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001712#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001713 {"setgid", posix_setgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001714#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001715#ifdef HAVE_SETPGRP
Guido van Rossumc2670a01992-09-13 20:07:29 +00001716 {"setpgrp", posix_setpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001717#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001718#ifdef HAVE_WAIT
Guido van Rossum85e3b011991-06-03 12:42:10 +00001719 {"wait", posix_wait},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001720#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001721#ifdef HAVE_WAITPID
Guido van Rossum21803b81992-08-09 12:55:27 +00001722 {"waitpid", posix_waitpid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001723#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001724#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001725 {"setsid", posix_setsid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001726#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001727#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001728 {"setpgid", posix_setpgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001729#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001730#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001731 {"tcgetpgrp", posix_tcgetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001732#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001733#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001734 {"tcsetpgrp", posix_tcsetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001735#endif /* HAVE_TCSETPGRP */
Guido van Rossum687dd131993-05-17 08:34:16 +00001736 {"open", posix_open},
1737 {"close", posix_close},
1738 {"dup", posix_dup},
1739 {"dup2", posix_dup2},
1740 {"lseek", posix_lseek},
1741 {"read", posix_read},
1742 {"write", posix_write},
1743 {"fstat", posix_fstat},
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001744 {"fdopen", posix_fdopen, 1},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001745#ifdef HAVE_PIPE
Guido van Rossum687dd131993-05-17 08:34:16 +00001746 {"pipe", posix_pipe},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001747#endif
1748#ifdef HAVE_MKFIFO
1749 {"mkfifo", posix_mkfifo, 1},
1750#endif
1751#ifdef HAVE_FTRUNCATE
1752 {"ftruncate", posix_ftruncate, 1},
1753#endif
Guido van Rossumf1af3fe1996-07-23 19:18:10 +00001754#ifdef HAVE_PUTENV
1755 {"putenv", posix_putenv, 1},
1756#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001757 {NULL, NULL} /* Sentinel */
1758};
1759
1760
Guido van Rossuma0e71301996-05-28 22:30:38 +00001761#if defined(_MSC_VER) || defined(__WATCOMC__)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001762void
1763initnt()
1764{
1765 object *m, *d, *v;
1766
1767 m = initmodule("nt", posix_methods);
1768 d = getmoduledict(m);
1769
1770 /* Initialize nt.environ dictionary */
1771 v = convertenviron();
1772 if (v == NULL || dictinsert(d, "environ", v) != 0)
1773 fatal("can't define nt.environ");
1774 DECREF(v);
1775
1776 /* Initialize nt.error exception */
1777 PosixError = newstringobject("nt.error");
1778 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1779 fatal("can't define nt.error");
1780}
Guido van Rossum8d665e61996-06-26 18:22:49 +00001781#else /* not a PC port */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001782void
1783initposix()
1784{
1785 object *m, *d, *v;
1786
1787 m = initmodule("posix", posix_methods);
1788 d = getmoduledict(m);
1789
1790 /* Initialize posix.environ dictionary */
1791 v = convertenviron();
1792 if (v == NULL || dictinsert(d, "environ", v) != 0)
1793 fatal("can't define posix.environ");
1794 DECREF(v);
1795
Guido van Rossumde4e1241995-03-30 10:56:54 +00001796#ifdef WNOHANG
1797 /* Export WNOHANG symbol */
1798 v = newintobject((long)WNOHANG);
1799 if (v == NULL || dictinsert(d, "WNOHANG", v) != 0)
1800 fatal("can't define posix.WNOHANG");
1801 DECREF(v);
1802#endif
1803
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001804 /* Initialize posix.error exception */
1805 PosixError = newstringobject("posix.error");
1806 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1807 fatal("can't define posix.error");
1808}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001809#endif /* !_MSC_VER */