blob: 338a40c0d2504297de72b059f4e8a853a6492324 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* POSIX module implementation */
26
Guido van Rossuma4916fa1996-05-23 22:58:55 +000027/* This file is also used for Windows NT and MS-Win. In that case the module
Guido van Rossumad0ee831995-03-01 10:34:45 +000028 actually calls itself 'nt', not 'posix', and a few functions are
29 either unimplemented or implemented differently. The source
30 assumes that for Windows NT, the macro 'NT' is defined independent
31 of the compiler used. Different compilers define their own feature
Guido van Rossuma4916fa1996-05-23 22:58:55 +000032 test macro, e.g. '__BORLANDC__' or '_MSC_VER'. */
Guido van Rossumad0ee831995-03-01 10:34:45 +000033
Guido van Rossuma4916fa1996-05-23 22:58:55 +000034/* See also ../Dos/dosmodule.c */
Guido van Rossumad0ee831995-03-01 10:34:45 +000035
Guido van Rossum3f5da241990-12-20 15:06:42 +000036#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037#include "modsupport.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000038#include "ceval.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039
Guido van Rossumb6775db1994-08-01 11:34:53 +000040#include <string.h>
41#include <errno.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +000042#include <sys/types.h>
43#include <sys/stat.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +000044#ifdef HAVE_SYS_WAIT_H
45#include <sys/wait.h> /* For WNOHANG */
46#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +000047
48#include "mytime.h" /* For clock_t on some systems */
49
50#ifdef HAVE_FCNTL_H
51#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000052#endif /* HAVE_FCNTL_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +000053
Guido van Rossuma4916fa1996-05-23 22:58:55 +000054/* Various compilers have only certain posix functions */
55#ifdef __WATCOMC__ /* Watcom compiler */
56#define HAVE_GETCWD 1
57#define HAVE_OPENDIR 1
58#define HAVE_SYSTEM 1
59#if defined(__OS2__)
60#define HAVE_EXECV 1
61#define HAVE_WAIT 1
Guido van Rossumad0ee831995-03-01 10:34:45 +000062#endif
Guido van Rossuma4916fa1996-05-23 22:58:55 +000063#include <process.h>
64#else
65#ifdef __BORLANDC__ /* Borland compiler */
66#define HAVE_EXECV 1
67#define HAVE_GETCWD 1
68#define HAVE_GETEGID 1
69#define HAVE_GETEUID 1
70#define HAVE_GETGID 1
71#define HAVE_GETPPID 1
72#define HAVE_GETUID 1
73#define HAVE_KILL 1
74#define HAVE_OPENDIR 1
75#define HAVE_PIPE 1
76#define HAVE_POPEN 1
77#define HAVE_SYSTEM 1
78#define HAVE_WAIT 1
79#else
80#ifdef _MSC_VER /* Microsoft compiler */
81#ifdef NT
82#define HAVE_EXECV 1
83#define HAVE_PIPE 1
84#define HAVE_POPEN 1
85#define HAVE_SYSTEM 1
86#else /* 16-bit Windows */
87#endif /* NT */
88#else /* all other compilers */
89/* Unix functions that the configure script doesn't check for */
90#define HAVE_EXECV 1
91#define HAVE_FORK 1
92#define HAVE_GETCWD 1
93#define HAVE_GETEGID 1
94#define HAVE_GETEUID 1
95#define HAVE_GETGID 1
96#define HAVE_GETPPID 1
97#define HAVE_GETUID 1
98#define HAVE_KILL 1
99#define HAVE_OPENDIR 1
100#define HAVE_PIPE 1
101#define HAVE_POPEN 1
102#define HAVE_SYSTEM 1
103#define HAVE_WAIT 1
104#endif /* _MSC_VER */
105#endif /* __BORLANDC__ */
106#endif /* ! __WATCOMC__ */
Guido van Rossumad0ee831995-03-01 10:34:45 +0000107
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000108#ifndef _MSC_VER
Guido van Rossum36bc6801995-06-14 22:54:23 +0000109
Guido van Rossumb6775db1994-08-01 11:34:53 +0000110#ifdef HAVE_UNISTD_H
Guido van Rossum0b0db8e1993-01-21 16:07:51 +0000111#include <unistd.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +0000112#endif
113
114#ifdef NeXT
115/* NeXT's <unistd.h> and <utime.h> aren't worth much */
116#undef HAVE_UNISTD_H
117#undef HAVE_UTIME_H
118/* #undef HAVE_GETCWD */
119#endif
120
121#ifdef HAVE_UNISTD_H
Guido van Rossumad0ee831995-03-01 10:34:45 +0000122/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
123extern int rename();
124extern int pclose();
125extern int lstat();
126extern int symlink();
Guido van Rossumb6775db1994-08-01 11:34:53 +0000127#else /* !HAVE_UNISTD_H */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000128#if defined(__WATCOMC__)
129extern int mkdir PROTO((const char *));
130#else
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000131extern int mkdir PROTO((const char *, mode_t));
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000132#endif
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000133extern int chdir PROTO((const char *));
Guido van Rossume22e6441993-07-09 10:51:31 +0000134extern int rmdir PROTO((const char *));
135extern int chmod PROTO((const char *, mode_t));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000136extern int chown PROTO((const char *, uid_t, gid_t));
137extern char *getcwd PROTO((char *, int));
Guido van Rossume22e6441993-07-09 10:51:31 +0000138extern char *strerror PROTO((int));
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000139extern int link PROTO((const char *, const char *));
140extern int rename PROTO((const char *, const char *));
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000141extern int stat PROTO((const char *, struct stat *));
142extern int unlink PROTO((const char *));
143extern int pclose PROTO((FILE *));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000144#ifdef HAVE_SYMLINK
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000145extern int symlink PROTO((const char *, const char *));
Guido van Rossuma38a5031995-02-17 15:11:36 +0000146#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000147#ifdef HAVE_LSTAT
148extern int lstat PROTO((const char *, struct stat *));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000149#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000150#endif /* !HAVE_UNISTD_H */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000151
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000152#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153
Guido van Rossumb6775db1994-08-01 11:34:53 +0000154#ifdef HAVE_UTIME_H
155#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000156#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000157
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000158#ifdef HAVE_SYS_UTIME_H
159#include <sys/utime.h>
160#define HAVE_UTIME_H /* pretend we do for the rest of this file */
161#endif /* HAVE_SYS_UTIME_H */
162
Guido van Rossumb6775db1994-08-01 11:34:53 +0000163#ifdef HAVE_SYS_TIMES_H
164#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000165#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000166
167#ifdef HAVE_SYS_PARAM_H
168#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000169#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000170
171#ifdef HAVE_SYS_UTSNAME_H
172#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000173#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000174
175#ifndef MAXPATHLEN
176#define MAXPATHLEN 1024
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000177#endif /* MAXPATHLEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000178
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000179#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000180#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000181#define NAMLEN(dirent) strlen((dirent)->d_name)
182#else
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000183#ifdef __WATCOMC__
184#include <direct.h>
185#define NAMLEN(dirent) strlen((dirent)->d_name)
186#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000187#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000188#define NAMLEN(dirent) (dirent)->d_namlen
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000189#endif
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000190#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000191#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000192#endif
193#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000194#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000195#endif
196#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000197#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000198#endif
199#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000200
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000201#ifdef _MSC_VER
Guido van Rossumb6775db1994-08-01 11:34:53 +0000202#include <direct.h>
203#include <io.h>
204#include <process.h>
205#include <windows.h>
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000206#ifdef NT
207#define popen _popen
Guido van Rossum794d8131994-08-23 13:48:48 +0000208#define pclose _pclose
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000209#else /* 16-bit Windows */
210#include <dos.h>
211#include <ctype.h>
Guido van Rossumb6775db1994-08-01 11:34:53 +0000212#endif /* NT */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000213#endif /* _MSC_VER */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000214
215#ifdef OS2
216#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000217#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218
219/* Return a dictionary corresponding to the POSIX environment table */
220
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000221#if !defined(_MSC_VER) && !defined(__WATCOMC__)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222extern char **environ;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000223#endif /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224
225static object *
226convertenviron()
227{
228 object *d;
229 char **e;
230 d = newdictobject();
231 if (d == NULL)
232 return NULL;
233 if (environ == NULL)
234 return d;
235 /* XXX This part ignores errors */
236 for (e = environ; *e != NULL; e++) {
237 object *v;
238 char *p = strchr(*e, '=');
239 if (p == NULL)
240 continue;
241 v = newstringobject(p+1);
242 if (v == NULL)
243 continue;
244 *p = '\0';
245 (void) dictinsert(d, *e, v);
246 *p = '=';
247 DECREF(v);
248 }
249 return d;
250}
251
252
253static object *PosixError; /* Exception posix.error */
254
255/* Set a POSIX-specific error from errno, and return NULL */
256
Guido van Rossumad0ee831995-03-01 10:34:45 +0000257static object * posix_error()
258{
259 return err_errno(PosixError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260}
261
262
263/* POSIX generic methods */
264
265static object *
266posix_1str(args, func)
267 object *args;
268 int (*func) FPROTO((const char *));
269{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000270 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000271 int res;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000272 if (!getargs(args, "s", &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000274 BGN_SAVE
275 res = (*func)(path1);
276 END_SAVE
277 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000278 return posix_error();
279 INCREF(None);
280 return None;
281}
282
283static object *
284posix_2str(args, func)
285 object *args;
286 int (*func) FPROTO((const char *, const char *));
287{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000288 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000289 int res;
Guido van Rossum234f9421993-06-17 12:35:49 +0000290 if (!getargs(args, "(ss)", &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000292 BGN_SAVE
293 res = (*func)(path1, path2);
294 END_SAVE
295 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296 return posix_error();
297 INCREF(None);
298 return None;
299}
300
301static object *
302posix_strint(args, func)
303 object *args;
304 int (*func) FPROTO((const char *, int));
305{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000306 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000308 int res;
Guido van Rossum234f9421993-06-17 12:35:49 +0000309 if (!getargs(args, "(si)", &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000311 BGN_SAVE
312 res = (*func)(path, i);
313 END_SAVE
314 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315 return posix_error();
316 INCREF(None);
317 return None;
318}
319
320static object *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000321posix_strintint(args, func)
322 object *args;
323 int (*func) FPROTO((const char *, int, int));
324{
325 char *path;
326 int i,i2;
327 int res;
328 if (!getargs(args, "(sii)", &path, &i, &i2))
329 return NULL;
330 BGN_SAVE
331 res = (*func)(path, i, i2);
332 END_SAVE
333 if (res < 0)
334 return posix_error();
335 INCREF(None);
336 return None;
337}
338
339static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340posix_do_stat(self, args, statfunc)
341 object *self;
342 object *args;
343 int (*statfunc) FPROTO((const char *, struct stat *));
344{
345 struct stat st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000346 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000347 int res;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000348 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000350 BGN_SAVE
351 res = (*statfunc)(path, &st);
352 END_SAVE
353 if (res != 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000354 return posix_error();
Guido van Rossum687dd131993-05-17 08:34:16 +0000355 return mkvalue("(llllllllll)",
Guido van Rossume5372401993-03-16 12:15:04 +0000356 (long)st.st_mode,
357 (long)st.st_ino,
358 (long)st.st_dev,
359 (long)st.st_nlink,
360 (long)st.st_uid,
361 (long)st.st_gid,
362 (long)st.st_size,
363 (long)st.st_atime,
364 (long)st.st_mtime,
365 (long)st.st_ctime);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366}
367
368
369/* POSIX methods */
370
371static object *
372posix_chdir(self, args)
373 object *self;
374 object *args;
375{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376 return posix_1str(args, chdir);
377}
378
379static object *
380posix_chmod(self, args)
381 object *self;
382 object *args;
383{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384 return posix_strint(args, chmod);
385}
386
Guido van Rossumb6775db1994-08-01 11:34:53 +0000387#ifdef HAVE_CHOWN
388static object *
389posix_chown(self, args)
390 object *self;
391 object *args;
392{
393 return posix_strintint(args, chown);
394}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000395#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000396
Guido van Rossum36bc6801995-06-14 22:54:23 +0000397#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398static object *
399posix_getcwd(self, args)
400 object *self;
401 object *args;
402{
403 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000404 char *res;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000405 if (!getnoarg(args))
406 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000407 BGN_SAVE
408 res = getcwd(buf, sizeof buf);
409 END_SAVE
410 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411 return posix_error();
412 return newstringobject(buf);
413}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000414#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415
Guido van Rossumb6775db1994-08-01 11:34:53 +0000416#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000417static object *
418posix_link(self, args)
419 object *self;
420 object *args;
421{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422 return posix_2str(args, link);
423}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000424#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000425
Guido van Rossumb6775db1994-08-01 11:34:53 +0000426static object *
427posix_listdir(self, args)
428 object *self;
429 object *args;
430{
Guido van Rossum6f4f5f71995-03-10 15:14:41 +0000431#if defined(NT) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000432
Guido van Rossumb6775db1994-08-01 11:34:53 +0000433 char *name;
434 int len;
435 object *d, *v;
436 HANDLE hFindFile;
437 WIN32_FIND_DATA FileData;
438 char namebuf[MAX_PATH+5];
439
440 if (!getargs(args, "s#", &name, &len))
441 return NULL;
442 if (len >= MAX_PATH) {
443 err_setstr(ValueError, "path too long");
444 return NULL;
445 }
446 strcpy(namebuf, name);
447 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
448 namebuf[len++] = '/';
449 strcpy(namebuf + len, "*.*");
450
451 if ((d = newlistobject(0)) == NULL)
452 return NULL;
453
454 hFindFile = FindFirstFile(namebuf, &FileData);
455 if (hFindFile == INVALID_HANDLE_VALUE) {
456 errno = GetLastError();
457 return posix_error();
458 }
459 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000460 if (FileData.cFileName[0] == '.' &&
461 (FileData.cFileName[1] == '\0' ||
462 FileData.cFileName[1] == '.' &&
463 FileData.cFileName[2] == '\0'))
464 continue;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000465 v = newstringobject(FileData.cFileName);
466 if (v == NULL) {
467 DECREF(d);
468 d = NULL;
469 break;
470 }
471 if (addlistitem(d, v) != 0) {
472 DECREF(v);
473 DECREF(d);
474 d = NULL;
475 break;
476 }
477 DECREF(v);
478 } while (FindNextFile(hFindFile, &FileData) == TRUE);
479
480 if (FindClose(hFindFile) == FALSE) {
481 errno = GetLastError();
482 return posix_error();
483 }
484
485 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000486
487#else /* !NT */
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000488#ifdef _MSC_VER /* 16-bit Windows */
489
490#ifndef MAX_PATH
491#define MAX_PATH 250
492#endif
493 char *name, *pt;
494 int len;
495 object *d, *v;
496 char namebuf[MAX_PATH+5];
497 struct _find_t ep;
498
499 if (!getargs(args, "s#", &name, &len))
500 return NULL;
501 if (len >= MAX_PATH) {
502 err_setstr(ValueError, "path too long");
503 return NULL;
504 }
505 strcpy(namebuf, name);
506 for (pt = namebuf; *pt; pt++)
507 if (*pt == '/')
508 *pt = '\\';
509 if (namebuf[len-1] != '\\')
510 namebuf[len++] = '\\';
511 strcpy(namebuf + len, "*.*");
512
513 if ((d = newlistobject(0)) == NULL)
514 return NULL;
515
516 if (_dos_findfirst(namebuf, _A_RDONLY |
517 _A_HIDDEN | _A_SYSTEM | _A_SUBDIR, &ep) != 0){
518 errno = ENOENT;
519 return posix_error();
520 }
521 do {
522 if (ep.name[0] == '.' &&
523 (ep.name[1] == '\0' ||
524 ep.name[1] == '.' &&
525 ep.name[2] == '\0'))
526 continue;
527 strcpy(namebuf, ep.name);
528 for (pt = namebuf; *pt; pt++)
529 if (isupper(*pt))
530 *pt = tolower(*pt);
531 v = newstringobject(namebuf);
532 if (v == NULL) {
533 DECREF(d);
534 d = NULL;
535 break;
536 }
537 if (addlistitem(d, v) != 0) {
538 DECREF(v);
539 DECREF(d);
540 d = NULL;
541 break;
542 }
543 DECREF(v);
544 } while (_dos_findnext(&ep) == 0);
545
546 return d;
547
548#else
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000549
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000550 char *name;
551 object *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000552 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000553 struct dirent *ep;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000554 if (!getargs(args, "s", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000555 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000556 BGN_SAVE
557 if ((dirp = opendir(name)) == NULL) {
558 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000559 return posix_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000560 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000561 if ((d = newlistobject(0)) == NULL) {
562 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000563 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000564 return NULL;
565 }
566 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000567 if (ep->d_name[0] == '.' &&
568 (NAMLEN(ep) == 1 ||
569 ep->d_name[1] == '.' && NAMLEN(ep) == 2))
570 continue;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000571 v = newsizedstringobject(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000572 if (v == NULL) {
573 DECREF(d);
574 d = NULL;
575 break;
576 }
577 if (addlistitem(d, v) != 0) {
578 DECREF(v);
579 DECREF(d);
580 d = NULL;
581 break;
582 }
583 DECREF(v);
584 }
585 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000586 END_SAVE
Guido van Rossum0ee42cd1991-04-08 21:01:03 +0000587
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000588 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000589
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000590#endif /* !_MSC_VER */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000591#endif /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000592}
593
594static object *
595posix_mkdir(self, args)
596 object *self;
597 object *args;
598{
Guido van Rossumb0824db1996-02-25 04:50:32 +0000599 int res;
600 char *path;
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000601 int mode = 0777;
Guido van Rossumb0824db1996-02-25 04:50:32 +0000602 if (!newgetargs(args, "s|i", &path, &mode))
603 return NULL;
604 BGN_SAVE
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000605#if defined(__WATCOMC__)
606 res = mkdir(path);
607#else
Guido van Rossumb0824db1996-02-25 04:50:32 +0000608 res = mkdir(path, mode);
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000609#endif
Guido van Rossumb0824db1996-02-25 04:50:32 +0000610 END_SAVE
611 if (res < 0)
612 return posix_error();
613 INCREF(None);
614 return None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000615}
616
Guido van Rossumb6775db1994-08-01 11:34:53 +0000617#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +0000618static object *
619posix_nice(self, args)
620 object *self;
621 object *args;
622{
623 int increment, value;
624
625 if (!getargs(args, "i", &increment))
626 return NULL;
627 value = nice(increment);
628 if (value == -1)
629 return posix_error();
630 return newintobject((long) value);
631}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000632#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000633
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000634static object *
635posix_rename(self, args)
636 object *self;
637 object *args;
638{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000639 return posix_2str(args, rename);
640}
641
642static object *
643posix_rmdir(self, args)
644 object *self;
645 object *args;
646{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000647 return posix_1str(args, rmdir);
648}
649
650static object *
651posix_stat(self, args)
652 object *self;
653 object *args;
654{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000655 return posix_do_stat(self, args, stat);
656}
657
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000658#ifdef HAVE_SYSTEM
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000659static object *
660posix_system(self, args)
661 object *self;
662 object *args;
663{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000664 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000665 long sts;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000666 if (!getargs(args, "s", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000667 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000668 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000669 sts = system(command);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000670 END_SAVE
671 return newintobject(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000672}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000673#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000674
675static object *
676posix_umask(self, args)
677 object *self;
678 object *args;
679{
680 int i;
681 if (!getintarg(args, &i))
682 return NULL;
683 i = umask(i);
684 if (i < 0)
685 return posix_error();
686 return newintobject((long)i);
687}
688
689static object *
690posix_unlink(self, args)
691 object *self;
692 object *args;
693{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000694 return posix_1str(args, unlink);
695}
696
Guido van Rossumb6775db1994-08-01 11:34:53 +0000697#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000698static object *
699posix_uname(self, args)
700 object *self;
701 object *args;
702{
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000703 struct utsname u;
704 object *v;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000705 int res;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000706 if (!getnoarg(args))
707 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000708 BGN_SAVE
709 res = uname(&u);
710 END_SAVE
711 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000712 return posix_error();
Guido van Rossume5372401993-03-16 12:15:04 +0000713 return mkvalue("(sssss)",
714 u.sysname,
715 u.nodename,
716 u.release,
717 u.version,
718 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000719}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000720#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000721
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000722static object *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000723posix_utime(self, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000724 object *self;
725 object *args;
726{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000727 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000728 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000729 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000730
Guido van Rossumb6775db1994-08-01 11:34:53 +0000731#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000732 struct utimbuf buf;
733#define ATIME buf.actime
734#define MTIME buf.modtime
735#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000736#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000737 time_t buf[2];
738#define ATIME buf[0]
739#define MTIME buf[1]
740#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000741#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000742
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000743 if (!getargs(args, "(s(ll))", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000744 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000745 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +0000746 MTIME = mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000747 BGN_SAVE
748 res = utime(path, UTIME_ARG);
749 END_SAVE
750 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000751 return posix_error();
752 INCREF(None);
753 return None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000754#undef UTIME_ARG
755#undef ATIME
756#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000757}
758
Guido van Rossum85e3b011991-06-03 12:42:10 +0000759
Guido van Rossum3b066191991-06-04 19:40:25 +0000760/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000761
762static object *
763posix__exit(self, args)
764 object *self;
765 object *args;
766{
767 int sts;
768 if (!getintarg(args, &sts))
769 return NULL;
770 _exit(sts);
771 /* NOTREACHED */
772}
773
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000774#ifdef HAVE_EXECV
Guido van Rossum85e3b011991-06-03 12:42:10 +0000775static object *
Guido van Rossum89b33251993-10-22 14:26:06 +0000776posix_execv(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +0000777 object *self;
778 object *args;
779{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000780 char *path;
781 object *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000782 char **argvlist;
783 int i, argc;
784 object *(*getitem) PROTO((object *, int));
785
Guido van Rossum89b33251993-10-22 14:26:06 +0000786 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +0000787 argv is a list or tuple of strings. */
788
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000789 if (!getargs(args, "(sO)", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000790 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000791 if (is_listobject(argv)) {
792 argc = getlistsize(argv);
793 getitem = getlistitem;
794 }
795 else if (is_tupleobject(argv)) {
796 argc = gettuplesize(argv);
797 getitem = gettupleitem;
798 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000799 else {
800 badarg:
801 err_badarg();
802 return NULL;
803 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000804
805 argvlist = NEW(char *, argc+1);
806 if (argvlist == NULL)
807 return NULL;
808 for (i = 0; i < argc; i++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000809 if (!getargs((*getitem)(argv, i), "s", &argvlist[i])) {
Guido van Rossum85e3b011991-06-03 12:42:10 +0000810 DEL(argvlist);
811 goto badarg;
812 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000813 }
814 argvlist[argc] = NULL;
815
Guido van Rossumb6775db1994-08-01 11:34:53 +0000816#ifdef BAD_EXEC_PROTOTYPES
817 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000818#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000819 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000820#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000821
Guido van Rossum85e3b011991-06-03 12:42:10 +0000822 /* If we get here it's definitely an error */
823
824 DEL(argvlist);
825 return posix_error();
826}
827
828static object *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000829posix_execve(self, args)
830 object *self;
831 object *args;
832{
833 char *path;
834 object *argv, *env;
835 char **argvlist;
836 char **envlist;
837 object *key, *val;
838 int i, pos, argc, envc;
839 object *(*getitem) PROTO((object *, int));
840
841 /* execve has three arguments: (path, argv, env), where
842 argv is a list or tuple of strings and env is a dictionary
843 like posix.environ. */
844
845 if (!getargs(args, "(sOO)", &path, &argv, &env))
846 return NULL;
847 if (is_listobject(argv)) {
848 argc = getlistsize(argv);
849 getitem = getlistitem;
850 }
851 else if (is_tupleobject(argv)) {
852 argc = gettuplesize(argv);
853 getitem = gettupleitem;
854 }
855 else {
856 err_setstr(TypeError, "argv must be tuple or list");
857 return NULL;
858 }
859 if (!is_dictobject(env)) {
860 err_setstr(TypeError, "env must be dictionary");
861 return NULL;
862 }
863
864 argvlist = NEW(char *, argc+1);
865 if (argvlist == NULL) {
866 err_nomem();
867 return NULL;
868 }
869 for (i = 0; i < argc; i++) {
870 if (!getargs((*getitem)(argv, i),
871 "s;argv must be list of strings",
872 &argvlist[i])) {
873 goto fail_1;
874 }
875 }
876 argvlist[argc] = NULL;
877
878 i = getmappingsize(env);
879 envlist = NEW(char *, i + 1);
880 if (envlist == NULL) {
881 err_nomem();
882 goto fail_1;
883 }
884 pos = 0;
885 envc = 0;
886 while (mappinggetnext(env, &pos, &key, &val)) {
887 char *p, *k, *v;
888 if (!getargs(key, "s;non-string key in env", &k) ||
889 !getargs(val, "s;non-string value in env", &v)) {
890 goto fail_2;
891 }
892 p = NEW(char, getstringsize(key) + getstringsize(val) + 2);
893 if (p == NULL) {
894 err_nomem();
895 goto fail_2;
896 }
897 sprintf(p, "%s=%s", k, v);
898 envlist[envc++] = p;
899 }
900 envlist[envc] = 0;
901
Guido van Rossumb6775db1994-08-01 11:34:53 +0000902
903#ifdef BAD_EXEC_PROTOTYPES
904 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000905#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000906 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000907#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000908
909 /* If we get here it's definitely an error */
910
911 (void) posix_error();
912
913 fail_2:
914 while (--envc >= 0)
915 DEL(envlist[envc]);
916 DEL(envlist);
917 fail_1:
918 DEL(argvlist);
919
920 return NULL;
921}
Guido van Rossuma4916fa1996-05-23 22:58:55 +0000922#endif /* HAVE_EXECV */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000923
Guido van Rossumad0ee831995-03-01 10:34:45 +0000924#ifdef HAVE_FORK
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000925static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000926posix_fork(self, args)
927 object *self;
928 object *args;
929{
930 int pid;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000931 if (!getnoarg(args))
932 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000933 pid = fork();
934 if (pid == -1)
935 return posix_error();
936 return newintobject((long)pid);
937}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000938#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000939
Guido van Rossumad0ee831995-03-01 10:34:45 +0000940#ifdef HAVE_GETEGID
Guido van Rossum85e3b011991-06-03 12:42:10 +0000941static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000942posix_getegid(self, args)
943 object *self;
944 object *args;
945{
946 if (!getnoarg(args))
947 return NULL;
948 return newintobject((long)getegid());
949}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000950#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000951
Guido van Rossumad0ee831995-03-01 10:34:45 +0000952#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000953static object *
954posix_geteuid(self, args)
955 object *self;
956 object *args;
957{
958 if (!getnoarg(args))
959 return NULL;
960 return newintobject((long)geteuid());
961}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000962#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000963
Guido van Rossumad0ee831995-03-01 10:34:45 +0000964#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000965static object *
966posix_getgid(self, args)
967 object *self;
968 object *args;
969{
970 if (!getnoarg(args))
971 return NULL;
972 return newintobject((long)getgid());
973}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000974#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000975
976static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000977posix_getpid(self, args)
978 object *self;
979 object *args;
980{
Guido van Rossum04814471991-06-04 20:23:49 +0000981 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000982 return NULL;
983 return newintobject((long)getpid());
984}
985
Guido van Rossumb6775db1994-08-01 11:34:53 +0000986#ifdef HAVE_GETPGRP
Guido van Rossum85e3b011991-06-03 12:42:10 +0000987static object *
Guido van Rossum04814471991-06-04 20:23:49 +0000988posix_getpgrp(self, args)
989 object *self;
990 object *args;
991{
992 if (!getnoarg(args))
993 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000994#ifdef GETPGRP_HAVE_ARG
Guido van Rossum971443b1991-06-07 13:59:29 +0000995 return newintobject((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000996#else /* GETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000997 return newintobject((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000998#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +0000999}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001000#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +00001001
Guido van Rossumb6775db1994-08-01 11:34:53 +00001002#ifdef HAVE_SETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001003static object *
Guido van Rossumc2670a01992-09-13 20:07:29 +00001004posix_setpgrp(self, args)
1005 object *self;
1006 object *args;
1007{
1008 if (!getnoarg(args))
1009 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +00001010#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +00001011 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001012#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001013 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +00001014#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +00001015 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001016 INCREF(None);
1017 return None;
1018}
1019
Guido van Rossumb6775db1994-08-01 11:34:53 +00001020#endif /* HAVE_SETPGRP */
1021
Guido van Rossumad0ee831995-03-01 10:34:45 +00001022#ifdef HAVE_GETPPID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001023static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001024posix_getppid(self, args)
1025 object *self;
1026 object *args;
1027{
Guido van Rossum04814471991-06-04 20:23:49 +00001028 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001029 return NULL;
1030 return newintobject((long)getppid());
1031}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001032#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001033
Guido van Rossumad0ee831995-03-01 10:34:45 +00001034#ifdef HAVE_GETUID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001035static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +00001036posix_getuid(self, args)
1037 object *self;
1038 object *args;
1039{
1040 if (!getnoarg(args))
1041 return NULL;
1042 return newintobject((long)getuid());
1043}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001044#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +00001045
Guido van Rossumad0ee831995-03-01 10:34:45 +00001046#ifdef HAVE_KILL
Guido van Rossum46003ff1992-05-15 11:05:24 +00001047static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +00001048posix_kill(self, args)
1049 object *self;
1050 object *args;
1051{
1052 int pid, sig;
Guido van Rossum234f9421993-06-17 12:35:49 +00001053 if (!getargs(args, "(ii)", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +00001054 return NULL;
1055 if (kill(pid, sig) == -1)
1056 return posix_error();
1057 INCREF(None);
1058 return None;
1059}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001060#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001061
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001062#ifdef HAVE_POPEN
Guido van Rossum85e3b011991-06-03 12:42:10 +00001063static object *
Guido van Rossum3b066191991-06-04 19:40:25 +00001064posix_popen(self, args)
1065 object *self;
1066 object *args;
1067{
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001068 char *name;
1069 char *mode = "r";
1070 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +00001071 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001072 object *f;
1073 if (!newgetargs(args, "s|si", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +00001074 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001075 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001076 fp = popen(name, mode);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001077 END_SAVE
Guido van Rossum3b066191991-06-04 19:40:25 +00001078 if (fp == NULL)
1079 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001080 f = newopenfileobject(fp, name, mode, pclose);
1081 if (f != NULL)
1082 setfilebufsize(f, bufsize);
1083 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +00001084}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001085#endif /* HAVE_POPEN */
Guido van Rossum3b066191991-06-04 19:40:25 +00001086
Guido van Rossumb6775db1994-08-01 11:34:53 +00001087#ifdef HAVE_SETUID
Guido van Rossum3b066191991-06-04 19:40:25 +00001088static object *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001089posix_setuid(self, args)
1090 object *self;
1091 object *args;
1092{
1093 int uid;
1094 if (!getargs(args, "i", &uid))
1095 return NULL;
1096 if (setuid(uid) < 0)
1097 return posix_error();
1098 INCREF(None);
1099 return None;
1100}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001101#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001102
Guido van Rossumb6775db1994-08-01 11:34:53 +00001103#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001104static object *
1105posix_setgid(self, args)
1106 object *self;
1107 object *args;
1108{
1109 int gid;
1110 if (!getargs(args, "i", &gid))
1111 return NULL;
1112 if (setgid(gid) < 0)
1113 return posix_error();
1114 INCREF(None);
1115 return None;
1116}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001117#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001118
Guido van Rossumb6775db1994-08-01 11:34:53 +00001119#ifdef HAVE_WAITPID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001120static object *
Guido van Rossum21803b81992-08-09 12:55:27 +00001121posix_waitpid(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +00001122 object *self;
1123 object *args;
1124{
Guido van Rossum21803b81992-08-09 12:55:27 +00001125 int pid, options, sts;
1126 if (!getargs(args, "(ii)", &pid, &options))
1127 return NULL;
1128 BGN_SAVE
1129 pid = waitpid(pid, &sts, options);
1130 END_SAVE
Guido van Rossum85e3b011991-06-03 12:42:10 +00001131 if (pid == -1)
1132 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00001133 else
1134 return mkvalue("ii", pid, sts);
Guido van Rossum21803b81992-08-09 12:55:27 +00001135}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001136#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00001137
Guido van Rossumad0ee831995-03-01 10:34:45 +00001138#ifdef HAVE_WAIT
Guido van Rossum21803b81992-08-09 12:55:27 +00001139static object *
1140posix_wait(self, args)
1141 object *self;
1142 object *args;
1143{
1144 int pid, sts;
Guido van Rossum21803b81992-08-09 12:55:27 +00001145 BGN_SAVE
1146 pid = wait(&sts);
1147 END_SAVE
1148 if (pid == -1)
1149 return posix_error();
1150 else
1151 return mkvalue("ii", pid, sts);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001152}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001153#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001154
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001155static object *
1156posix_lstat(self, args)
1157 object *self;
1158 object *args;
1159{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001160#ifdef HAVE_LSTAT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001161 return posix_do_stat(self, args, lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001162#else /* !HAVE_LSTAT */
1163 return posix_do_stat(self, args, stat);
1164#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001165}
1166
Guido van Rossumb6775db1994-08-01 11:34:53 +00001167#ifdef HAVE_READLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001168static object *
1169posix_readlink(self, args)
1170 object *self;
1171 object *args;
1172{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001173 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001174 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001175 int n;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001176 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001177 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001178 BGN_SAVE
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001179 n = readlink(path, buf, (int) sizeof buf);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001180 END_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001181 if (n < 0)
1182 return posix_error();
1183 return newsizedstringobject(buf, n);
1184}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001185#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001186
Guido van Rossumb6775db1994-08-01 11:34:53 +00001187#ifdef HAVE_SYMLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001188static object *
1189posix_symlink(self, args)
1190 object *self;
1191 object *args;
1192{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001193 return posix_2str(args, symlink);
1194}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001195#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001196
Guido van Rossumb6775db1994-08-01 11:34:53 +00001197#ifdef HAVE_TIMES
1198#ifndef HZ
1199#define HZ 60 /* Universal constant :-) */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001200#endif /* HZ */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001201static object *
1202posix_times(self, args)
1203 object *self;
1204 object *args;
1205{
1206 struct tms t;
1207 clock_t c;
Guido van Rossum22db57e1992-04-05 14:25:30 +00001208 if (!getnoarg(args))
1209 return NULL;
1210 errno = 0;
1211 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00001212 if (c == (clock_t) -1)
1213 return posix_error();
Guido van Rossumbbc34101995-09-13 17:39:51 +00001214 return mkvalue("ddddd",
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001215 (double)t.tms_utime / HZ,
1216 (double)t.tms_stime / HZ,
1217 (double)t.tms_cutime / HZ,
Guido van Rossumbbc34101995-09-13 17:39:51 +00001218 (double)t.tms_cstime / HZ,
1219 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00001220}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001221#endif /* HAVE_TIMES */
Guido van Rossum6f4f5f71995-03-10 15:14:41 +00001222#if defined(NT) && !defined(HAVE_TIMES)
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001223#define HAVE_TIMES /* so the method table will pick it up */
1224static object *
1225posix_times(self, args)
1226 object *self;
1227 object *args;
1228{
1229 FILETIME create, exit, kernel, user;
1230 HANDLE hProc;
1231 if (!getnoarg(args))
1232 return NULL;
1233 hProc = GetCurrentProcess();
1234 GetProcessTimes(hProc,&create, &exit, &kernel, &user);
Guido van Rossumbbc34101995-09-13 17:39:51 +00001235 return mkvalue("ddddd",
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001236 (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime) / 2E6,
1237 (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6,
1238 (double)0,
Guido van Rossumbbc34101995-09-13 17:39:51 +00001239 (double)0,
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001240 (double)0);
1241}
1242#endif /* NT */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001243
Guido van Rossumb6775db1994-08-01 11:34:53 +00001244#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001245static object *
1246posix_setsid(self, args)
1247 object *self;
1248 object *args;
1249{
1250 if (!getnoarg(args))
1251 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001252 if (setsid() < 0)
1253 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001254 INCREF(None);
1255 return None;
1256}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001257#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001258
Guido van Rossumb6775db1994-08-01 11:34:53 +00001259#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001260static object *
1261posix_setpgid(self, args)
1262 object *self;
1263 object *args;
1264{
1265 int pid, pgrp;
1266 if (!getargs(args, "(ii)", &pid, &pgrp))
1267 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001268 if (setpgid(pid, pgrp) < 0)
1269 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001270 INCREF(None);
1271 return None;
1272}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001273#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001274
Guido van Rossumb6775db1994-08-01 11:34:53 +00001275#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001276static object *
1277posix_tcgetpgrp(self, args)
1278 object *self;
1279 object *args;
1280{
1281 int fd, pgid;
1282 if (!getargs(args, "i", &fd))
1283 return NULL;
1284 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001285 if (pgid < 0)
1286 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001287 return newintobject((long)pgid);
1288}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001289#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00001290
Guido van Rossumb6775db1994-08-01 11:34:53 +00001291#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001292static object *
1293posix_tcsetpgrp(self, args)
1294 object *self;
1295 object *args;
1296{
1297 int fd, pgid;
1298 if (!getargs(args, "(ii)", &fd, &pgid))
1299 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001300 if (tcsetpgrp(fd, pgid) < 0)
1301 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001302 INCREF(None);
1303 return None;
1304}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001305#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001306
Guido van Rossum687dd131993-05-17 08:34:16 +00001307/* Functions acting on file descriptors */
1308
Guido van Rossum234f9421993-06-17 12:35:49 +00001309static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001310posix_open(self, args)
1311 object *self;
1312 object *args;
1313{
1314 char *file;
1315 int flag;
1316 int mode = 0777;
1317 int fd;
1318 if (!getargs(args, "(si)", &file, &flag)) {
1319 err_clear();
1320 if (!getargs(args, "(sii)", &file, &flag, &mode))
1321 return NULL;
1322 }
1323 BGN_SAVE
1324 fd = open(file, flag, mode);
1325 END_SAVE
1326 if (fd < 0)
1327 return posix_error();
1328 return newintobject((long)fd);
1329}
1330
Guido van Rossum234f9421993-06-17 12:35:49 +00001331static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001332posix_close(self, args)
1333 object *self;
1334 object *args;
1335{
1336 int fd, res;
1337 if (!getargs(args, "i", &fd))
1338 return NULL;
1339 BGN_SAVE
1340 res = close(fd);
1341 END_SAVE
1342 if (res < 0)
1343 return posix_error();
1344 INCREF(None);
1345 return None;
1346}
1347
Guido van Rossum234f9421993-06-17 12:35:49 +00001348static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001349posix_dup(self, args)
1350 object *self;
1351 object *args;
1352{
1353 int fd;
1354 if (!getargs(args, "i", &fd))
1355 return NULL;
1356 BGN_SAVE
1357 fd = dup(fd);
1358 END_SAVE
1359 if (fd < 0)
1360 return posix_error();
1361 return newintobject((long)fd);
1362}
1363
Guido van Rossum234f9421993-06-17 12:35:49 +00001364static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001365posix_dup2(self, args)
1366 object *self;
1367 object *args;
1368{
1369 int fd, fd2, res;
1370 if (!getargs(args, "(ii)", &fd, &fd2))
1371 return NULL;
1372 BGN_SAVE
1373 res = dup2(fd, fd2);
1374 END_SAVE
1375 if (res < 0)
1376 return posix_error();
1377 INCREF(None);
1378 return None;
1379}
1380
Guido van Rossum234f9421993-06-17 12:35:49 +00001381static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001382posix_lseek(self, args)
1383 object *self;
1384 object *args;
1385{
1386 int fd, how;
1387 long pos, res;
1388 if (!getargs(args, "(ili)", &fd, &pos, &how))
1389 return NULL;
1390#ifdef SEEK_SET
1391 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
1392 switch (how) {
1393 case 0: how = SEEK_SET; break;
1394 case 1: how = SEEK_CUR; break;
1395 case 2: how = SEEK_END; break;
1396 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001397#endif /* SEEK_END */
Guido van Rossum687dd131993-05-17 08:34:16 +00001398 BGN_SAVE
1399 res = lseek(fd, pos, how);
1400 END_SAVE
1401 if (res < 0)
1402 return posix_error();
1403 return newintobject(res);
1404}
1405
Guido van Rossum234f9421993-06-17 12:35:49 +00001406static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001407posix_read(self, args)
1408 object *self;
1409 object *args;
1410{
1411 int fd, size;
1412 object *buffer;
1413 if (!getargs(args, "(ii)", &fd, &size))
1414 return NULL;
1415 buffer = newsizedstringobject((char *)NULL, size);
1416 if (buffer == NULL)
1417 return NULL;
1418 BGN_SAVE
1419 size = read(fd, getstringvalue(buffer), size);
1420 END_SAVE
1421 if (size < 0) {
1422 DECREF(buffer);
1423 return posix_error();
1424 }
1425 resizestring(&buffer, size);
1426 return buffer;
1427}
1428
Guido van Rossum234f9421993-06-17 12:35:49 +00001429static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001430posix_write(self, args)
1431 object *self;
1432 object *args;
1433{
1434 int fd, size;
1435 char *buffer;
1436 if (!getargs(args, "(is#)", &fd, &buffer, &size))
1437 return NULL;
1438 BGN_SAVE
1439 size = write(fd, buffer, size);
1440 END_SAVE
1441 if (size < 0)
1442 return posix_error();
1443 return newintobject((long)size);
1444}
1445
Guido van Rossum234f9421993-06-17 12:35:49 +00001446static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001447posix_fstat(self, args)
1448 object *self;
1449 object *args;
1450{
1451 int fd;
1452 struct stat st;
1453 int res;
1454 if (!getargs(args, "i", &fd))
1455 return NULL;
1456 BGN_SAVE
1457 res = fstat(fd, &st);
1458 END_SAVE
1459 if (res != 0)
1460 return posix_error();
1461 return mkvalue("(llllllllll)",
1462 (long)st.st_mode,
1463 (long)st.st_ino,
1464 (long)st.st_dev,
1465 (long)st.st_nlink,
1466 (long)st.st_uid,
1467 (long)st.st_gid,
1468 (long)st.st_size,
1469 (long)st.st_atime,
1470 (long)st.st_mtime,
1471 (long)st.st_ctime);
1472}
1473
1474static object *
1475posix_fdopen(self, args)
1476 object *self;
1477 object *args;
1478{
1479 extern int fclose PROTO((FILE *));
1480 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001481 char *mode = "r";
1482 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00001483 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001484 object *f;
1485 if (!newgetargs(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00001486 return NULL;
1487 BGN_SAVE
1488 fp = fdopen(fd, mode);
1489 END_SAVE
1490 if (fp == NULL)
1491 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001492 f = newopenfileobject(fp, "(fdopen)", mode, fclose);
1493 if (f != NULL)
1494 setfilebufsize(f, bufsize);
1495 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00001496}
1497
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001498#ifdef HAVE_PIPE
Guido van Rossum234f9421993-06-17 12:35:49 +00001499static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001500posix_pipe(self, args)
1501 object *self;
1502 object *args;
1503{
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001504#if !defined(NT)
Guido van Rossum687dd131993-05-17 08:34:16 +00001505 int fds[2];
1506 int res;
1507 if (!getargs(args, ""))
1508 return NULL;
1509 BGN_SAVE
1510 res = pipe(fds);
1511 END_SAVE
1512 if (res != 0)
1513 return posix_error();
1514 return mkvalue("(ii)", fds[0], fds[1]);
Guido van Rossum794d8131994-08-23 13:48:48 +00001515#else /* NT */
1516 HANDLE read, write;
1517 BOOL ok;
1518 if (!getargs(args, ""))
1519 return NULL;
1520 BGN_SAVE
1521 ok = CreatePipe( &read, &write, NULL, 0);
1522 END_SAVE
1523 if (!ok)
1524 return posix_error();
1525 return mkvalue("(ii)", read, write);
1526#endif /* NT */
Guido van Rossum687dd131993-05-17 08:34:16 +00001527}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001528#endif /* HAVE_PIPE */
1529
1530#ifdef HAVE_MKFIFO
1531static object *
1532posix_mkfifo(self, args)
1533 object *self;
1534 object *args;
1535{
1536 char *file;
1537 int mode = 0666;
1538 int res;
1539 if (!newgetargs(args, "s|i", &file, &mode))
1540 return NULL;
1541 BGN_SAVE
1542 res = mkfifo(file, mode);
1543 END_SAVE
1544 if (res < 0)
1545 return posix_error();
1546 INCREF(None);
1547 return None;
1548}
1549#endif
1550
1551#ifdef HAVE_FTRUNCATE
1552static object *
1553posix_ftruncate(self, args)
1554 object *self; /* Not used */
1555 object *args;
1556{
1557 int fd;
1558 long length;
1559 int res;
1560
1561 if (!getargs(args, "(il)", &fd, &length))
1562 return NULL;
1563
1564 BGN_SAVE
1565 res = ftruncate(fd, length);
1566 END_SAVE
1567 if (res < 0) {
1568 err_errno(IOError);
1569 return NULL;
1570 }
1571 INCREF(None);
1572 return None;
1573}
1574#endif
Guido van Rossum22db57e1992-04-05 14:25:30 +00001575
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001576static struct methodlist posix_methods[] = {
1577 {"chdir", posix_chdir},
1578 {"chmod", posix_chmod},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001579#ifdef HAVE_CHOWN
1580 {"chown", posix_chown},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001581#endif /* HAVE_CHOWN */
Guido van Rossum36bc6801995-06-14 22:54:23 +00001582#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001583 {"getcwd", posix_getcwd},
Guido van Rossum36bc6801995-06-14 22:54:23 +00001584#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001585#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001586 {"link", posix_link},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001587#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001588 {"listdir", posix_listdir},
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001589 {"lstat", posix_lstat},
Guido van Rossumb0824db1996-02-25 04:50:32 +00001590 {"mkdir", posix_mkdir, 1},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001591#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +00001592 {"nice", posix_nice},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001593#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001594#ifdef HAVE_READLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001595 {"readlink", posix_readlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001596#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001597 {"rename", posix_rename},
1598 {"rmdir", posix_rmdir},
1599 {"stat", posix_stat},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001600#ifdef HAVE_SYMLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001601 {"symlink", posix_symlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001602#endif /* HAVE_SYMLINK */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001603#ifdef HAVE_SYSTEM
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001604 {"system", posix_system},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001605#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001606 {"umask", posix_umask},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001607#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001608 {"uname", posix_uname},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001609#endif /* HAVE_UNAME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001610 {"unlink", posix_unlink},
Guido van Rossumf4a59121996-02-13 00:12:56 +00001611 {"remove", posix_unlink},
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001612 {"utime", posix_utime},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001613#ifdef HAVE_TIMES
Guido van Rossum22db57e1992-04-05 14:25:30 +00001614 {"times", posix_times},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001615#endif /* HAVE_TIMES */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001616 {"_exit", posix__exit},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001617#ifdef HAVE_EXECV
Guido van Rossum89b33251993-10-22 14:26:06 +00001618 {"execv", posix_execv},
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001619 {"execve", posix_execve},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001620#endif /* HAVE_EXECV */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001621#ifdef HAVE_FORK
Guido van Rossum85e3b011991-06-03 12:42:10 +00001622 {"fork", posix_fork},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001623#endif /* HAVE_FORK */
1624#ifdef HAVE_GETEGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001625 {"getegid", posix_getegid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001626#endif /* HAVE_GETEGID */
1627#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001628 {"geteuid", posix_geteuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001629#endif /* HAVE_GETEUID */
1630#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001631 {"getgid", posix_getgid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001632#endif /* HAVE_GETGID */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001633 {"getpid", posix_getpid},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001634#ifdef HAVE_GETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001635 {"getpgrp", posix_getpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001636#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001637#ifdef HAVE_GETPPID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001638 {"getppid", posix_getppid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001639#endif /* HAVE_GETPPID */
1640#ifdef HAVE_GETUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001641 {"getuid", posix_getuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001642#endif /* HAVE_GETUID */
1643#ifdef HAVE_KILL
Guido van Rossum85e3b011991-06-03 12:42:10 +00001644 {"kill", posix_kill},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001645#endif /* HAVE_KILL */
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001646#ifdef HAVE_POPEN
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001647 {"popen", posix_popen, 1},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001648#endif /* HAVE_POPEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001649#ifdef HAVE_SETUID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001650 {"setuid", posix_setuid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001651#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001652#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001653 {"setgid", posix_setgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001654#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001655#ifdef HAVE_SETPGRP
Guido van Rossumc2670a01992-09-13 20:07:29 +00001656 {"setpgrp", posix_setpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001657#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001658#ifdef HAVE_WAIT
Guido van Rossum85e3b011991-06-03 12:42:10 +00001659 {"wait", posix_wait},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001660#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001661#ifdef HAVE_WAITPID
Guido van Rossum21803b81992-08-09 12:55:27 +00001662 {"waitpid", posix_waitpid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001663#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001664#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001665 {"setsid", posix_setsid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001666#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001667#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001668 {"setpgid", posix_setpgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001669#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001670#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001671 {"tcgetpgrp", posix_tcgetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001672#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001673#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001674 {"tcsetpgrp", posix_tcsetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001675#endif /* HAVE_TCSETPGRP */
Guido van Rossum687dd131993-05-17 08:34:16 +00001676 {"open", posix_open},
1677 {"close", posix_close},
1678 {"dup", posix_dup},
1679 {"dup2", posix_dup2},
1680 {"lseek", posix_lseek},
1681 {"read", posix_read},
1682 {"write", posix_write},
1683 {"fstat", posix_fstat},
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001684 {"fdopen", posix_fdopen, 1},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001685#ifdef HAVE_PIPE
Guido van Rossum687dd131993-05-17 08:34:16 +00001686 {"pipe", posix_pipe},
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001687#endif
1688#ifdef HAVE_MKFIFO
1689 {"mkfifo", posix_mkfifo, 1},
1690#endif
1691#ifdef HAVE_FTRUNCATE
1692 {"ftruncate", posix_ftruncate, 1},
1693#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001694 {NULL, NULL} /* Sentinel */
1695};
1696
1697
Guido van Rossuma0e71301996-05-28 22:30:38 +00001698#if defined(_MSC_VER) || defined(__WATCOMC__)
Guido van Rossumb6775db1994-08-01 11:34:53 +00001699void
1700initnt()
1701{
1702 object *m, *d, *v;
1703
1704 m = initmodule("nt", posix_methods);
1705 d = getmoduledict(m);
1706
1707 /* Initialize nt.environ dictionary */
1708 v = convertenviron();
1709 if (v == NULL || dictinsert(d, "environ", v) != 0)
1710 fatal("can't define nt.environ");
1711 DECREF(v);
1712
1713 /* Initialize nt.error exception */
1714 PosixError = newstringobject("nt.error");
1715 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1716 fatal("can't define nt.error");
1717}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001718#else /* !_MSC_VER */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001719void
1720initposix()
1721{
1722 object *m, *d, *v;
1723
1724 m = initmodule("posix", posix_methods);
1725 d = getmoduledict(m);
1726
1727 /* Initialize posix.environ dictionary */
1728 v = convertenviron();
1729 if (v == NULL || dictinsert(d, "environ", v) != 0)
1730 fatal("can't define posix.environ");
1731 DECREF(v);
1732
Guido van Rossumde4e1241995-03-30 10:56:54 +00001733#ifdef WNOHANG
1734 /* Export WNOHANG symbol */
1735 v = newintobject((long)WNOHANG);
1736 if (v == NULL || dictinsert(d, "WNOHANG", v) != 0)
1737 fatal("can't define posix.WNOHANG");
1738 DECREF(v);
1739#endif
1740
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001741 /* Initialize posix.error exception */
1742 PosixError = newstringobject("posix.error");
1743 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1744 fatal("can't define posix.error");
1745}
Guido van Rossuma4916fa1996-05-23 22:58:55 +00001746#endif /* !_MSC_VER */