blob: 3ecbc3582fb3f457891be87487a63c385237e68d [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 Rossumad0ee831995-03-01 10:34:45 +000027/* This file is also used for Windows NT. In that case the module
28 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
32 test macro, e.g. '__BORLANDC__' or '_MSCVER'. */
33
34/* For MS-DOS and Windows 3.x, use ../Dos/dosmodule.c */
35
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 Rossum6a3eb5f1994-08-18 15:42:46 +000054#ifndef NT
Guido van Rossumad0ee831995-03-01 10:34:45 +000055#define HAVE_FORK 1
56#endif
57
58#if !defined(NT) || defined(__BORLANDC__)
59/* Unix functions that the configure script doesn't check for
60 and that aren't easily available under NT except with Borland C */
61#define HAVE_GETEGID 1
62#define HAVE_GETEUID 1
63#define HAVE_GETGID 1
64#define HAVE_GETPPID 1
65#define HAVE_GETUID 1
66#define HAVE_KILL 1
67#define HAVE_WAIT 1
Guido van Rossum6f4f5f71995-03-10 15:14:41 +000068#define HAVE_OPENDIR 1
69#define HAVE_PIPE 1
Guido van Rossum36bc6801995-06-14 22:54:23 +000070#define HAVE_GETCWD 1
Guido van Rossumad0ee831995-03-01 10:34:45 +000071#endif
72
73#ifndef NT
Guido van Rossum36bc6801995-06-14 22:54:23 +000074
Guido van Rossumb6775db1994-08-01 11:34:53 +000075#ifdef HAVE_UNISTD_H
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000076#include <unistd.h>
Guido van Rossum36bc6801995-06-14 22:54:23 +000077#endif
78
79#ifdef NeXT
80/* NeXT's <unistd.h> and <utime.h> aren't worth much */
81#undef HAVE_UNISTD_H
82#undef HAVE_UTIME_H
83/* #undef HAVE_GETCWD */
84#endif
85
86#ifdef HAVE_UNISTD_H
Guido van Rossumad0ee831995-03-01 10:34:45 +000087/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
88extern int rename();
89extern int pclose();
90extern int lstat();
91extern int symlink();
Guido van Rossumb6775db1994-08-01 11:34:53 +000092#else /* !HAVE_UNISTD_H */
Guido van Rossuma2b7f401993-01-04 09:09:59 +000093extern int mkdir PROTO((const char *, mode_t));
94extern int chdir PROTO((const char *));
Guido van Rossume22e6441993-07-09 10:51:31 +000095extern int rmdir PROTO((const char *));
96extern int chmod PROTO((const char *, mode_t));
Guido van Rossumb6775db1994-08-01 11:34:53 +000097extern int chown PROTO((const char *, uid_t, gid_t));
98extern char *getcwd PROTO((char *, int));
Guido van Rossume22e6441993-07-09 10:51:31 +000099extern char *strerror PROTO((int));
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000100extern int link PROTO((const char *, const char *));
101extern int rename PROTO((const char *, const char *));
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000102extern int stat PROTO((const char *, struct stat *));
103extern int unlink PROTO((const char *));
104extern int pclose PROTO((FILE *));
Guido van Rossumb6775db1994-08-01 11:34:53 +0000105#ifdef HAVE_SYMLINK
Guido van Rossuma2b7f401993-01-04 09:09:59 +0000106extern int symlink PROTO((const char *, const char *));
Guido van Rossuma38a5031995-02-17 15:11:36 +0000107#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000108#ifdef HAVE_LSTAT
109extern int lstat PROTO((const char *, struct stat *));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000110#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000111#endif /* !HAVE_UNISTD_H */
Guido van Rossum36bc6801995-06-14 22:54:23 +0000112
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000113#endif /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000114
Guido van Rossumb6775db1994-08-01 11:34:53 +0000115#ifdef HAVE_UTIME_H
116#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000117#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000118
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000119#ifdef HAVE_SYS_UTIME_H
120#include <sys/utime.h>
121#define HAVE_UTIME_H /* pretend we do for the rest of this file */
122#endif /* HAVE_SYS_UTIME_H */
123
Guido van Rossumb6775db1994-08-01 11:34:53 +0000124#ifdef HAVE_SYS_TIMES_H
125#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000126#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000127
128#ifdef HAVE_SYS_PARAM_H
129#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000130#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000131
132#ifdef HAVE_SYS_UTSNAME_H
133#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000134#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000135
136#ifndef MAXPATHLEN
137#define MAXPATHLEN 1024
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000138#endif /* MAXPATHLEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000139
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000140#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000141#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000142#define NAMLEN(dirent) strlen((dirent)->d_name)
143#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000144#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000145#define NAMLEN(dirent) (dirent)->d_namlen
146#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000147#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000148#endif
149#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000150#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000151#endif
152#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000153#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000154#endif
155#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000156
157#ifdef NT
158#include <direct.h>
159#include <io.h>
160#include <process.h>
161#include <windows.h>
162#define popen _popen
Guido van Rossum794d8131994-08-23 13:48:48 +0000163#define pclose _pclose
Guido van Rossumb6775db1994-08-01 11:34:53 +0000164#endif /* NT */
165
166#ifdef OS2
167#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000168#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169
170/* Return a dictionary corresponding to the POSIX environment table */
171
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000172#ifndef NT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173extern char **environ;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000174#endif /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000175
176static object *
177convertenviron()
178{
179 object *d;
180 char **e;
181 d = newdictobject();
182 if (d == NULL)
183 return NULL;
184 if (environ == NULL)
185 return d;
186 /* XXX This part ignores errors */
187 for (e = environ; *e != NULL; e++) {
188 object *v;
189 char *p = strchr(*e, '=');
190 if (p == NULL)
191 continue;
192 v = newstringobject(p+1);
193 if (v == NULL)
194 continue;
195 *p = '\0';
196 (void) dictinsert(d, *e, v);
197 *p = '=';
198 DECREF(v);
199 }
200 return d;
201}
202
203
204static object *PosixError; /* Exception posix.error */
205
206/* Set a POSIX-specific error from errno, and return NULL */
207
Guido van Rossumad0ee831995-03-01 10:34:45 +0000208static object * posix_error()
209{
210 return err_errno(PosixError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211}
212
213
214/* POSIX generic methods */
215
216static object *
217posix_1str(args, func)
218 object *args;
219 int (*func) FPROTO((const char *));
220{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000221 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000222 int res;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000223 if (!getargs(args, "s", &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000225 BGN_SAVE
226 res = (*func)(path1);
227 END_SAVE
228 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000229 return posix_error();
230 INCREF(None);
231 return None;
232}
233
234static object *
235posix_2str(args, func)
236 object *args;
237 int (*func) FPROTO((const char *, const char *));
238{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000239 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000240 int res;
Guido van Rossum234f9421993-06-17 12:35:49 +0000241 if (!getargs(args, "(ss)", &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000243 BGN_SAVE
244 res = (*func)(path1, path2);
245 END_SAVE
246 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000247 return posix_error();
248 INCREF(None);
249 return None;
250}
251
252static object *
253posix_strint(args, func)
254 object *args;
255 int (*func) FPROTO((const char *, int));
256{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000257 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000258 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000259 int res;
Guido van Rossum234f9421993-06-17 12:35:49 +0000260 if (!getargs(args, "(si)", &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000262 BGN_SAVE
263 res = (*func)(path, i);
264 END_SAVE
265 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000266 return posix_error();
267 INCREF(None);
268 return None;
269}
270
271static object *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000272posix_strintint(args, func)
273 object *args;
274 int (*func) FPROTO((const char *, int, int));
275{
276 char *path;
277 int i,i2;
278 int res;
279 if (!getargs(args, "(sii)", &path, &i, &i2))
280 return NULL;
281 BGN_SAVE
282 res = (*func)(path, i, i2);
283 END_SAVE
284 if (res < 0)
285 return posix_error();
286 INCREF(None);
287 return None;
288}
289
290static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291posix_do_stat(self, args, statfunc)
292 object *self;
293 object *args;
294 int (*statfunc) FPROTO((const char *, struct stat *));
295{
296 struct stat st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000297 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000298 int res;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000299 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000300 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000301 BGN_SAVE
302 res = (*statfunc)(path, &st);
303 END_SAVE
304 if (res != 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305 return posix_error();
Guido van Rossum687dd131993-05-17 08:34:16 +0000306 return mkvalue("(llllllllll)",
Guido van Rossume5372401993-03-16 12:15:04 +0000307 (long)st.st_mode,
308 (long)st.st_ino,
309 (long)st.st_dev,
310 (long)st.st_nlink,
311 (long)st.st_uid,
312 (long)st.st_gid,
313 (long)st.st_size,
314 (long)st.st_atime,
315 (long)st.st_mtime,
316 (long)st.st_ctime);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317}
318
319
320/* POSIX methods */
321
322static object *
323posix_chdir(self, args)
324 object *self;
325 object *args;
326{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000327 return posix_1str(args, chdir);
328}
329
330static object *
331posix_chmod(self, args)
332 object *self;
333 object *args;
334{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000335 return posix_strint(args, chmod);
336}
337
Guido van Rossumb6775db1994-08-01 11:34:53 +0000338#ifdef HAVE_CHOWN
339static object *
340posix_chown(self, args)
341 object *self;
342 object *args;
343{
344 return posix_strintint(args, chown);
345}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000346#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000347
Guido van Rossum36bc6801995-06-14 22:54:23 +0000348#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349static object *
350posix_getcwd(self, args)
351 object *self;
352 object *args;
353{
354 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000355 char *res;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000356 if (!getnoarg(args))
357 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000358 BGN_SAVE
359 res = getcwd(buf, sizeof buf);
360 END_SAVE
361 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362 return posix_error();
363 return newstringobject(buf);
364}
Guido van Rossum36bc6801995-06-14 22:54:23 +0000365#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366
Guido van Rossumb6775db1994-08-01 11:34:53 +0000367#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368static object *
369posix_link(self, args)
370 object *self;
371 object *args;
372{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373 return posix_2str(args, link);
374}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000375#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376
Guido van Rossumb6775db1994-08-01 11:34:53 +0000377static object *
378posix_listdir(self, args)
379 object *self;
380 object *args;
381{
Guido van Rossum6f4f5f71995-03-10 15:14:41 +0000382#if defined(NT) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000383
Guido van Rossumb6775db1994-08-01 11:34:53 +0000384 char *name;
385 int len;
386 object *d, *v;
387 HANDLE hFindFile;
388 WIN32_FIND_DATA FileData;
389 char namebuf[MAX_PATH+5];
390
391 if (!getargs(args, "s#", &name, &len))
392 return NULL;
393 if (len >= MAX_PATH) {
394 err_setstr(ValueError, "path too long");
395 return NULL;
396 }
397 strcpy(namebuf, name);
398 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
399 namebuf[len++] = '/';
400 strcpy(namebuf + len, "*.*");
401
402 if ((d = newlistobject(0)) == NULL)
403 return NULL;
404
405 hFindFile = FindFirstFile(namebuf, &FileData);
406 if (hFindFile == INVALID_HANDLE_VALUE) {
407 errno = GetLastError();
408 return posix_error();
409 }
410 do {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000411 if (FileData.cFileName[0] == '.' &&
412 (FileData.cFileName[1] == '\0' ||
413 FileData.cFileName[1] == '.' &&
414 FileData.cFileName[2] == '\0'))
415 continue;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000416 v = newstringobject(FileData.cFileName);
417 if (v == NULL) {
418 DECREF(d);
419 d = NULL;
420 break;
421 }
422 if (addlistitem(d, v) != 0) {
423 DECREF(v);
424 DECREF(d);
425 d = NULL;
426 break;
427 }
428 DECREF(v);
429 } while (FindNextFile(hFindFile, &FileData) == TRUE);
430
431 if (FindClose(hFindFile) == FALSE) {
432 errno = GetLastError();
433 return posix_error();
434 }
435
436 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000437
438#else /* !NT */
439
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000440 char *name;
441 object *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000443 struct dirent *ep;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000444 if (!getargs(args, "s", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000446 BGN_SAVE
447 if ((dirp = opendir(name)) == NULL) {
448 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449 return posix_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000450 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000451 if ((d = newlistobject(0)) == NULL) {
452 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000453 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454 return NULL;
455 }
456 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum24f42ac1995-07-18 18:16:52 +0000457 if (ep->d_name[0] == '.' &&
458 (NAMLEN(ep) == 1 ||
459 ep->d_name[1] == '.' && NAMLEN(ep) == 2))
460 continue;
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000461 v = newsizedstringobject(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000462 if (v == NULL) {
463 DECREF(d);
464 d = NULL;
465 break;
466 }
467 if (addlistitem(d, v) != 0) {
468 DECREF(v);
469 DECREF(d);
470 d = NULL;
471 break;
472 }
473 DECREF(v);
474 }
475 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000476 END_SAVE
Guido van Rossum0ee42cd1991-04-08 21:01:03 +0000477
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000478 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000479
480#endif /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000481}
482
483static object *
484posix_mkdir(self, args)
485 object *self;
486 object *args;
487{
Guido van Rossumb0824db1996-02-25 04:50:32 +0000488 int res;
489 char *path;
490 int mode = 0777; /* Unused */
491 if (!newgetargs(args, "s|i", &path, &mode))
492 return NULL;
493 BGN_SAVE
494 res = mkdir(path, mode);
495 END_SAVE
496 if (res < 0)
497 return posix_error();
498 INCREF(None);
499 return None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000500}
501
Guido van Rossumb6775db1994-08-01 11:34:53 +0000502#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +0000503static object *
504posix_nice(self, args)
505 object *self;
506 object *args;
507{
508 int increment, value;
509
510 if (!getargs(args, "i", &increment))
511 return NULL;
512 value = nice(increment);
513 if (value == -1)
514 return posix_error();
515 return newintobject((long) value);
516}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000517#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000518
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000519static object *
520posix_rename(self, args)
521 object *self;
522 object *args;
523{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000524 return posix_2str(args, rename);
525}
526
527static object *
528posix_rmdir(self, args)
529 object *self;
530 object *args;
531{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000532 return posix_1str(args, rmdir);
533}
534
535static object *
536posix_stat(self, args)
537 object *self;
538 object *args;
539{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000540 return posix_do_stat(self, args, stat);
541}
542
543static object *
544posix_system(self, args)
545 object *self;
546 object *args;
547{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000548 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000549 long sts;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000550 if (!getargs(args, "s", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000551 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000552 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000553 sts = system(command);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000554 END_SAVE
555 return newintobject(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000556}
557
558static object *
559posix_umask(self, args)
560 object *self;
561 object *args;
562{
563 int i;
564 if (!getintarg(args, &i))
565 return NULL;
566 i = umask(i);
567 if (i < 0)
568 return posix_error();
569 return newintobject((long)i);
570}
571
572static object *
573posix_unlink(self, args)
574 object *self;
575 object *args;
576{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000577 return posix_1str(args, unlink);
578}
579
Guido van Rossumb6775db1994-08-01 11:34:53 +0000580#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000581static object *
582posix_uname(self, args)
583 object *self;
584 object *args;
585{
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000586 struct utsname u;
587 object *v;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000588 int res;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000589 if (!getnoarg(args))
590 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000591 BGN_SAVE
592 res = uname(&u);
593 END_SAVE
594 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000595 return posix_error();
Guido van Rossume5372401993-03-16 12:15:04 +0000596 return mkvalue("(sssss)",
597 u.sysname,
598 u.nodename,
599 u.release,
600 u.version,
601 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000602}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000603#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000604
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000605static object *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000606posix_utime(self, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000607 object *self;
608 object *args;
609{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000610 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000611 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000612 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000613
Guido van Rossumb6775db1994-08-01 11:34:53 +0000614#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000615 struct utimbuf buf;
616#define ATIME buf.actime
617#define MTIME buf.modtime
618#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000619#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000620 time_t buf[2];
621#define ATIME buf[0]
622#define MTIME buf[1]
623#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000624#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000625
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000626 if (!getargs(args, "(s(ll))", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000627 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000628 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +0000629 MTIME = mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000630 BGN_SAVE
631 res = utime(path, UTIME_ARG);
632 END_SAVE
633 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000634 return posix_error();
635 INCREF(None);
636 return None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000637#undef UTIME_ARG
638#undef ATIME
639#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000640}
641
Guido van Rossum85e3b011991-06-03 12:42:10 +0000642
Guido van Rossum3b066191991-06-04 19:40:25 +0000643/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000644
645static object *
646posix__exit(self, args)
647 object *self;
648 object *args;
649{
650 int sts;
651 if (!getintarg(args, &sts))
652 return NULL;
653 _exit(sts);
654 /* NOTREACHED */
655}
656
Guido van Rossum85e3b011991-06-03 12:42:10 +0000657static object *
Guido van Rossum89b33251993-10-22 14:26:06 +0000658posix_execv(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +0000659 object *self;
660 object *args;
661{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000662 char *path;
663 object *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000664 char **argvlist;
665 int i, argc;
666 object *(*getitem) PROTO((object *, int));
667
Guido van Rossum89b33251993-10-22 14:26:06 +0000668 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +0000669 argv is a list or tuple of strings. */
670
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000671 if (!getargs(args, "(sO)", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000672 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000673 if (is_listobject(argv)) {
674 argc = getlistsize(argv);
675 getitem = getlistitem;
676 }
677 else if (is_tupleobject(argv)) {
678 argc = gettuplesize(argv);
679 getitem = gettupleitem;
680 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000681 else {
682 badarg:
683 err_badarg();
684 return NULL;
685 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000686
687 argvlist = NEW(char *, argc+1);
688 if (argvlist == NULL)
689 return NULL;
690 for (i = 0; i < argc; i++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000691 if (!getargs((*getitem)(argv, i), "s", &argvlist[i])) {
Guido van Rossum85e3b011991-06-03 12:42:10 +0000692 DEL(argvlist);
693 goto badarg;
694 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000695 }
696 argvlist[argc] = NULL;
697
Guido van Rossumb6775db1994-08-01 11:34:53 +0000698#ifdef BAD_EXEC_PROTOTYPES
699 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000700#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000701 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000702#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000703
Guido van Rossum85e3b011991-06-03 12:42:10 +0000704 /* If we get here it's definitely an error */
705
706 DEL(argvlist);
707 return posix_error();
708}
709
710static object *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000711posix_execve(self, args)
712 object *self;
713 object *args;
714{
715 char *path;
716 object *argv, *env;
717 char **argvlist;
718 char **envlist;
719 object *key, *val;
720 int i, pos, argc, envc;
721 object *(*getitem) PROTO((object *, int));
722
723 /* execve has three arguments: (path, argv, env), where
724 argv is a list or tuple of strings and env is a dictionary
725 like posix.environ. */
726
727 if (!getargs(args, "(sOO)", &path, &argv, &env))
728 return NULL;
729 if (is_listobject(argv)) {
730 argc = getlistsize(argv);
731 getitem = getlistitem;
732 }
733 else if (is_tupleobject(argv)) {
734 argc = gettuplesize(argv);
735 getitem = gettupleitem;
736 }
737 else {
738 err_setstr(TypeError, "argv must be tuple or list");
739 return NULL;
740 }
741 if (!is_dictobject(env)) {
742 err_setstr(TypeError, "env must be dictionary");
743 return NULL;
744 }
745
746 argvlist = NEW(char *, argc+1);
747 if (argvlist == NULL) {
748 err_nomem();
749 return NULL;
750 }
751 for (i = 0; i < argc; i++) {
752 if (!getargs((*getitem)(argv, i),
753 "s;argv must be list of strings",
754 &argvlist[i])) {
755 goto fail_1;
756 }
757 }
758 argvlist[argc] = NULL;
759
760 i = getmappingsize(env);
761 envlist = NEW(char *, i + 1);
762 if (envlist == NULL) {
763 err_nomem();
764 goto fail_1;
765 }
766 pos = 0;
767 envc = 0;
768 while (mappinggetnext(env, &pos, &key, &val)) {
769 char *p, *k, *v;
770 if (!getargs(key, "s;non-string key in env", &k) ||
771 !getargs(val, "s;non-string value in env", &v)) {
772 goto fail_2;
773 }
774 p = NEW(char, getstringsize(key) + getstringsize(val) + 2);
775 if (p == NULL) {
776 err_nomem();
777 goto fail_2;
778 }
779 sprintf(p, "%s=%s", k, v);
780 envlist[envc++] = p;
781 }
782 envlist[envc] = 0;
783
Guido van Rossumb6775db1994-08-01 11:34:53 +0000784
785#ifdef BAD_EXEC_PROTOTYPES
786 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000787#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000788 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000789#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000790
791 /* If we get here it's definitely an error */
792
793 (void) posix_error();
794
795 fail_2:
796 while (--envc >= 0)
797 DEL(envlist[envc]);
798 DEL(envlist);
799 fail_1:
800 DEL(argvlist);
801
802 return NULL;
803}
804
Guido van Rossumad0ee831995-03-01 10:34:45 +0000805#ifdef HAVE_FORK
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000806static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000807posix_fork(self, args)
808 object *self;
809 object *args;
810{
811 int pid;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000812 if (!getnoarg(args))
813 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000814 pid = fork();
815 if (pid == -1)
816 return posix_error();
817 return newintobject((long)pid);
818}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000819#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000820
Guido van Rossumad0ee831995-03-01 10:34:45 +0000821#ifdef HAVE_GETEGID
Guido van Rossum85e3b011991-06-03 12:42:10 +0000822static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000823posix_getegid(self, args)
824 object *self;
825 object *args;
826{
827 if (!getnoarg(args))
828 return NULL;
829 return newintobject((long)getegid());
830}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000831#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000832
Guido van Rossumad0ee831995-03-01 10:34:45 +0000833#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000834static object *
835posix_geteuid(self, args)
836 object *self;
837 object *args;
838{
839 if (!getnoarg(args))
840 return NULL;
841 return newintobject((long)geteuid());
842}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000843#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000844
Guido van Rossumad0ee831995-03-01 10:34:45 +0000845#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000846static object *
847posix_getgid(self, args)
848 object *self;
849 object *args;
850{
851 if (!getnoarg(args))
852 return NULL;
853 return newintobject((long)getgid());
854}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000855#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000856
857static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000858posix_getpid(self, args)
859 object *self;
860 object *args;
861{
Guido van Rossum04814471991-06-04 20:23:49 +0000862 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000863 return NULL;
864 return newintobject((long)getpid());
865}
866
Guido van Rossumb6775db1994-08-01 11:34:53 +0000867#ifdef HAVE_GETPGRP
Guido van Rossum85e3b011991-06-03 12:42:10 +0000868static object *
Guido van Rossum04814471991-06-04 20:23:49 +0000869posix_getpgrp(self, args)
870 object *self;
871 object *args;
872{
873 if (!getnoarg(args))
874 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000875#ifdef GETPGRP_HAVE_ARG
Guido van Rossum971443b1991-06-07 13:59:29 +0000876 return newintobject((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000877#else /* GETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000878 return newintobject((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000879#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +0000880}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000881#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +0000882
Guido van Rossumb6775db1994-08-01 11:34:53 +0000883#ifdef HAVE_SETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +0000884static object *
Guido van Rossumc2670a01992-09-13 20:07:29 +0000885posix_setpgrp(self, args)
886 object *self;
887 object *args;
888{
889 if (!getnoarg(args))
890 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +0000891#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +0000892 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +0000893#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000894 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +0000895#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +0000896 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +0000897 INCREF(None);
898 return None;
899}
900
Guido van Rossumb6775db1994-08-01 11:34:53 +0000901#endif /* HAVE_SETPGRP */
902
Guido van Rossumad0ee831995-03-01 10:34:45 +0000903#ifdef HAVE_GETPPID
Guido van Rossumc2670a01992-09-13 20:07:29 +0000904static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000905posix_getppid(self, args)
906 object *self;
907 object *args;
908{
Guido van Rossum04814471991-06-04 20:23:49 +0000909 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000910 return NULL;
911 return newintobject((long)getppid());
912}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000913#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000914
Guido van Rossumad0ee831995-03-01 10:34:45 +0000915#ifdef HAVE_GETUID
Guido van Rossum85e3b011991-06-03 12:42:10 +0000916static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000917posix_getuid(self, args)
918 object *self;
919 object *args;
920{
921 if (!getnoarg(args))
922 return NULL;
923 return newintobject((long)getuid());
924}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000925#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000926
Guido van Rossumad0ee831995-03-01 10:34:45 +0000927#ifdef HAVE_KILL
Guido van Rossum46003ff1992-05-15 11:05:24 +0000928static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000929posix_kill(self, args)
930 object *self;
931 object *args;
932{
933 int pid, sig;
Guido van Rossum234f9421993-06-17 12:35:49 +0000934 if (!getargs(args, "(ii)", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000935 return NULL;
936 if (kill(pid, sig) == -1)
937 return posix_error();
938 INCREF(None);
939 return None;
940}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000941#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000942
943static object *
Guido van Rossum3b066191991-06-04 19:40:25 +0000944posix_popen(self, args)
945 object *self;
946 object *args;
947{
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000948 char *name;
949 char *mode = "r";
950 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +0000951 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000952 object *f;
953 if (!newgetargs(args, "s|si", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +0000954 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000955 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000956 fp = popen(name, mode);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000957 END_SAVE
Guido van Rossum3b066191991-06-04 19:40:25 +0000958 if (fp == NULL)
959 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000960 f = newopenfileobject(fp, name, mode, pclose);
961 if (f != NULL)
962 setfilebufsize(f, bufsize);
963 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +0000964}
965
Guido van Rossumb6775db1994-08-01 11:34:53 +0000966#ifdef HAVE_SETUID
Guido van Rossum3b066191991-06-04 19:40:25 +0000967static object *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000968posix_setuid(self, args)
969 object *self;
970 object *args;
971{
972 int uid;
973 if (!getargs(args, "i", &uid))
974 return NULL;
975 if (setuid(uid) < 0)
976 return posix_error();
977 INCREF(None);
978 return None;
979}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000980#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000981
Guido van Rossumb6775db1994-08-01 11:34:53 +0000982#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000983static object *
984posix_setgid(self, args)
985 object *self;
986 object *args;
987{
988 int gid;
989 if (!getargs(args, "i", &gid))
990 return NULL;
991 if (setgid(gid) < 0)
992 return posix_error();
993 INCREF(None);
994 return None;
995}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000996#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000997
Guido van Rossumb6775db1994-08-01 11:34:53 +0000998#ifdef HAVE_WAITPID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000999static object *
Guido van Rossum21803b81992-08-09 12:55:27 +00001000posix_waitpid(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +00001001 object *self;
1002 object *args;
1003{
Guido van Rossum21803b81992-08-09 12:55:27 +00001004 int pid, options, sts;
1005 if (!getargs(args, "(ii)", &pid, &options))
1006 return NULL;
1007 BGN_SAVE
1008 pid = waitpid(pid, &sts, options);
1009 END_SAVE
Guido van Rossum85e3b011991-06-03 12:42:10 +00001010 if (pid == -1)
1011 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00001012 else
1013 return mkvalue("ii", pid, sts);
Guido van Rossum21803b81992-08-09 12:55:27 +00001014}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001015#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00001016
Guido van Rossumad0ee831995-03-01 10:34:45 +00001017#ifdef HAVE_WAIT
Guido van Rossum21803b81992-08-09 12:55:27 +00001018static object *
1019posix_wait(self, args)
1020 object *self;
1021 object *args;
1022{
1023 int pid, sts;
Guido van Rossum21803b81992-08-09 12:55:27 +00001024 BGN_SAVE
1025 pid = wait(&sts);
1026 END_SAVE
1027 if (pid == -1)
1028 return posix_error();
1029 else
1030 return mkvalue("ii", pid, sts);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001031}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001032#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001033
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001034static object *
1035posix_lstat(self, args)
1036 object *self;
1037 object *args;
1038{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001039#ifdef HAVE_LSTAT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001040 return posix_do_stat(self, args, lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001041#else /* !HAVE_LSTAT */
1042 return posix_do_stat(self, args, stat);
1043#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001044}
1045
Guido van Rossumb6775db1994-08-01 11:34:53 +00001046#ifdef HAVE_READLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001047static object *
1048posix_readlink(self, args)
1049 object *self;
1050 object *args;
1051{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001052 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001053 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001054 int n;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001055 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001056 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001057 BGN_SAVE
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001058 n = readlink(path, buf, (int) sizeof buf);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001059 END_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001060 if (n < 0)
1061 return posix_error();
1062 return newsizedstringobject(buf, n);
1063}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001064#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001065
Guido van Rossumb6775db1994-08-01 11:34:53 +00001066#ifdef HAVE_SYMLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001067static object *
1068posix_symlink(self, args)
1069 object *self;
1070 object *args;
1071{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001072 return posix_2str(args, symlink);
1073}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001074#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001075
Guido van Rossumb6775db1994-08-01 11:34:53 +00001076#ifdef HAVE_TIMES
1077#ifndef HZ
1078#define HZ 60 /* Universal constant :-) */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001079#endif /* HZ */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001080static object *
1081posix_times(self, args)
1082 object *self;
1083 object *args;
1084{
1085 struct tms t;
1086 clock_t c;
Guido van Rossum22db57e1992-04-05 14:25:30 +00001087 if (!getnoarg(args))
1088 return NULL;
1089 errno = 0;
1090 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00001091 if (c == (clock_t) -1)
1092 return posix_error();
Guido van Rossumbbc34101995-09-13 17:39:51 +00001093 return mkvalue("ddddd",
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001094 (double)t.tms_utime / HZ,
1095 (double)t.tms_stime / HZ,
1096 (double)t.tms_cutime / HZ,
Guido van Rossumbbc34101995-09-13 17:39:51 +00001097 (double)t.tms_cstime / HZ,
1098 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00001099}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001100#endif /* HAVE_TIMES */
Guido van Rossum6f4f5f71995-03-10 15:14:41 +00001101#if defined(NT) && !defined(HAVE_TIMES)
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001102#define HAVE_TIMES /* so the method table will pick it up */
1103static object *
1104posix_times(self, args)
1105 object *self;
1106 object *args;
1107{
1108 FILETIME create, exit, kernel, user;
1109 HANDLE hProc;
1110 if (!getnoarg(args))
1111 return NULL;
1112 hProc = GetCurrentProcess();
1113 GetProcessTimes(hProc,&create, &exit, &kernel, &user);
Guido van Rossumbbc34101995-09-13 17:39:51 +00001114 return mkvalue("ddddd",
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001115 (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime) / 2E6,
1116 (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6,
1117 (double)0,
Guido van Rossumbbc34101995-09-13 17:39:51 +00001118 (double)0,
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001119 (double)0);
1120}
1121#endif /* NT */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001122
Guido van Rossumb6775db1994-08-01 11:34:53 +00001123#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001124static object *
1125posix_setsid(self, args)
1126 object *self;
1127 object *args;
1128{
1129 if (!getnoarg(args))
1130 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001131 if (setsid() < 0)
1132 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001133 INCREF(None);
1134 return None;
1135}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001136#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001137
Guido van Rossumb6775db1994-08-01 11:34:53 +00001138#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001139static object *
1140posix_setpgid(self, args)
1141 object *self;
1142 object *args;
1143{
1144 int pid, pgrp;
1145 if (!getargs(args, "(ii)", &pid, &pgrp))
1146 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001147 if (setpgid(pid, pgrp) < 0)
1148 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001149 INCREF(None);
1150 return None;
1151}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001152#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001153
Guido van Rossumb6775db1994-08-01 11:34:53 +00001154#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001155static object *
1156posix_tcgetpgrp(self, args)
1157 object *self;
1158 object *args;
1159{
1160 int fd, pgid;
1161 if (!getargs(args, "i", &fd))
1162 return NULL;
1163 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001164 if (pgid < 0)
1165 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001166 return newintobject((long)pgid);
1167}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001168#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00001169
Guido van Rossumb6775db1994-08-01 11:34:53 +00001170#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001171static object *
1172posix_tcsetpgrp(self, args)
1173 object *self;
1174 object *args;
1175{
1176 int fd, pgid;
1177 if (!getargs(args, "(ii)", &fd, &pgid))
1178 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001179 if (tcsetpgrp(fd, pgid) < 0)
1180 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001181 INCREF(None);
1182 return None;
1183}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001184#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001185
Guido van Rossum687dd131993-05-17 08:34:16 +00001186/* Functions acting on file descriptors */
1187
Guido van Rossum234f9421993-06-17 12:35:49 +00001188static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001189posix_open(self, args)
1190 object *self;
1191 object *args;
1192{
1193 char *file;
1194 int flag;
1195 int mode = 0777;
1196 int fd;
1197 if (!getargs(args, "(si)", &file, &flag)) {
1198 err_clear();
1199 if (!getargs(args, "(sii)", &file, &flag, &mode))
1200 return NULL;
1201 }
1202 BGN_SAVE
1203 fd = open(file, flag, mode);
1204 END_SAVE
1205 if (fd < 0)
1206 return posix_error();
1207 return newintobject((long)fd);
1208}
1209
Guido van Rossum234f9421993-06-17 12:35:49 +00001210static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001211posix_close(self, args)
1212 object *self;
1213 object *args;
1214{
1215 int fd, res;
1216 if (!getargs(args, "i", &fd))
1217 return NULL;
1218 BGN_SAVE
1219 res = close(fd);
1220 END_SAVE
1221 if (res < 0)
1222 return posix_error();
1223 INCREF(None);
1224 return None;
1225}
1226
Guido van Rossum234f9421993-06-17 12:35:49 +00001227static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001228posix_dup(self, args)
1229 object *self;
1230 object *args;
1231{
1232 int fd;
1233 if (!getargs(args, "i", &fd))
1234 return NULL;
1235 BGN_SAVE
1236 fd = dup(fd);
1237 END_SAVE
1238 if (fd < 0)
1239 return posix_error();
1240 return newintobject((long)fd);
1241}
1242
Guido van Rossum234f9421993-06-17 12:35:49 +00001243static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001244posix_dup2(self, args)
1245 object *self;
1246 object *args;
1247{
1248 int fd, fd2, res;
1249 if (!getargs(args, "(ii)", &fd, &fd2))
1250 return NULL;
1251 BGN_SAVE
1252 res = dup2(fd, fd2);
1253 END_SAVE
1254 if (res < 0)
1255 return posix_error();
1256 INCREF(None);
1257 return None;
1258}
1259
Guido van Rossum234f9421993-06-17 12:35:49 +00001260static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001261posix_lseek(self, args)
1262 object *self;
1263 object *args;
1264{
1265 int fd, how;
1266 long pos, res;
1267 if (!getargs(args, "(ili)", &fd, &pos, &how))
1268 return NULL;
1269#ifdef SEEK_SET
1270 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
1271 switch (how) {
1272 case 0: how = SEEK_SET; break;
1273 case 1: how = SEEK_CUR; break;
1274 case 2: how = SEEK_END; break;
1275 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001276#endif /* SEEK_END */
Guido van Rossum687dd131993-05-17 08:34:16 +00001277 BGN_SAVE
1278 res = lseek(fd, pos, how);
1279 END_SAVE
1280 if (res < 0)
1281 return posix_error();
1282 return newintobject(res);
1283}
1284
Guido van Rossum234f9421993-06-17 12:35:49 +00001285static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001286posix_read(self, args)
1287 object *self;
1288 object *args;
1289{
1290 int fd, size;
1291 object *buffer;
1292 if (!getargs(args, "(ii)", &fd, &size))
1293 return NULL;
1294 buffer = newsizedstringobject((char *)NULL, size);
1295 if (buffer == NULL)
1296 return NULL;
1297 BGN_SAVE
1298 size = read(fd, getstringvalue(buffer), size);
1299 END_SAVE
1300 if (size < 0) {
1301 DECREF(buffer);
1302 return posix_error();
1303 }
1304 resizestring(&buffer, size);
1305 return buffer;
1306}
1307
Guido van Rossum234f9421993-06-17 12:35:49 +00001308static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001309posix_write(self, args)
1310 object *self;
1311 object *args;
1312{
1313 int fd, size;
1314 char *buffer;
1315 if (!getargs(args, "(is#)", &fd, &buffer, &size))
1316 return NULL;
1317 BGN_SAVE
1318 size = write(fd, buffer, size);
1319 END_SAVE
1320 if (size < 0)
1321 return posix_error();
1322 return newintobject((long)size);
1323}
1324
Guido van Rossum234f9421993-06-17 12:35:49 +00001325static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001326posix_fstat(self, args)
1327 object *self;
1328 object *args;
1329{
1330 int fd;
1331 struct stat st;
1332 int res;
1333 if (!getargs(args, "i", &fd))
1334 return NULL;
1335 BGN_SAVE
1336 res = fstat(fd, &st);
1337 END_SAVE
1338 if (res != 0)
1339 return posix_error();
1340 return mkvalue("(llllllllll)",
1341 (long)st.st_mode,
1342 (long)st.st_ino,
1343 (long)st.st_dev,
1344 (long)st.st_nlink,
1345 (long)st.st_uid,
1346 (long)st.st_gid,
1347 (long)st.st_size,
1348 (long)st.st_atime,
1349 (long)st.st_mtime,
1350 (long)st.st_ctime);
1351}
1352
1353static object *
1354posix_fdopen(self, args)
1355 object *self;
1356 object *args;
1357{
1358 extern int fclose PROTO((FILE *));
1359 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001360 char *mode = "r";
1361 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00001362 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001363 object *f;
1364 if (!newgetargs(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00001365 return NULL;
1366 BGN_SAVE
1367 fp = fdopen(fd, mode);
1368 END_SAVE
1369 if (fp == NULL)
1370 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001371 f = newopenfileobject(fp, "(fdopen)", mode, fclose);
1372 if (f != NULL)
1373 setfilebufsize(f, bufsize);
1374 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00001375}
1376
Guido van Rossum234f9421993-06-17 12:35:49 +00001377static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001378posix_pipe(self, args)
1379 object *self;
1380 object *args;
1381{
Guido van Rossum6f4f5f71995-03-10 15:14:41 +00001382#if !defined(NT) || defined(HAVE_PIPE)
Guido van Rossum687dd131993-05-17 08:34:16 +00001383 int fds[2];
1384 int res;
1385 if (!getargs(args, ""))
1386 return NULL;
1387 BGN_SAVE
1388 res = pipe(fds);
1389 END_SAVE
1390 if (res != 0)
1391 return posix_error();
1392 return mkvalue("(ii)", fds[0], fds[1]);
Guido van Rossum794d8131994-08-23 13:48:48 +00001393#else /* NT */
1394 HANDLE read, write;
1395 BOOL ok;
1396 if (!getargs(args, ""))
1397 return NULL;
1398 BGN_SAVE
1399 ok = CreatePipe( &read, &write, NULL, 0);
1400 END_SAVE
1401 if (!ok)
1402 return posix_error();
1403 return mkvalue("(ii)", read, write);
1404#endif /* NT */
Guido van Rossum687dd131993-05-17 08:34:16 +00001405}
Guido van Rossum22db57e1992-04-05 14:25:30 +00001406
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001407static struct methodlist posix_methods[] = {
1408 {"chdir", posix_chdir},
1409 {"chmod", posix_chmod},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001410#ifdef HAVE_CHOWN
1411 {"chown", posix_chown},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001412#endif /* HAVE_CHOWN */
Guido van Rossum36bc6801995-06-14 22:54:23 +00001413#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001414 {"getcwd", posix_getcwd},
Guido van Rossum36bc6801995-06-14 22:54:23 +00001415#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001416#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001417 {"link", posix_link},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001418#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001419 {"listdir", posix_listdir},
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001420 {"lstat", posix_lstat},
Guido van Rossumb0824db1996-02-25 04:50:32 +00001421 {"mkdir", posix_mkdir, 1},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001422#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +00001423 {"nice", posix_nice},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001424#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001425#ifdef HAVE_READLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001426 {"readlink", posix_readlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001427#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001428 {"rename", posix_rename},
1429 {"rmdir", posix_rmdir},
1430 {"stat", posix_stat},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001431#ifdef HAVE_SYMLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001432 {"symlink", posix_symlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001433#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001434 {"system", posix_system},
1435 {"umask", posix_umask},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001436#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001437 {"uname", posix_uname},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001438#endif /* HAVE_UNAME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001439 {"unlink", posix_unlink},
Guido van Rossumf4a59121996-02-13 00:12:56 +00001440 {"remove", posix_unlink},
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001441 {"utime", posix_utime},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001442#ifdef HAVE_TIMES
Guido van Rossum22db57e1992-04-05 14:25:30 +00001443 {"times", posix_times},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001444#endif /* HAVE_TIMES */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001445 {"_exit", posix__exit},
Guido van Rossum89b33251993-10-22 14:26:06 +00001446 {"execv", posix_execv},
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001447 {"execve", posix_execve},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001448#ifdef HAVE_FORK
Guido van Rossum85e3b011991-06-03 12:42:10 +00001449 {"fork", posix_fork},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001450#endif /* HAVE_FORK */
1451#ifdef HAVE_GETEGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001452 {"getegid", posix_getegid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001453#endif /* HAVE_GETEGID */
1454#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001455 {"geteuid", posix_geteuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001456#endif /* HAVE_GETEUID */
1457#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001458 {"getgid", posix_getgid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001459#endif /* HAVE_GETGID */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001460 {"getpid", posix_getpid},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001461#ifdef HAVE_GETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001462 {"getpgrp", posix_getpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001463#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001464#ifdef HAVE_GETPPID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001465 {"getppid", posix_getppid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001466#endif /* HAVE_GETPPID */
1467#ifdef HAVE_GETUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001468 {"getuid", posix_getuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001469#endif /* HAVE_GETUID */
1470#ifdef HAVE_KILL
Guido van Rossum85e3b011991-06-03 12:42:10 +00001471 {"kill", posix_kill},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001472#endif /* HAVE_KILL */
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001473 {"popen", posix_popen, 1},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001474#ifdef HAVE_SETUID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001475 {"setuid", posix_setuid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001476#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001477#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001478 {"setgid", posix_setgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001479#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001480#ifdef HAVE_SETPGRP
Guido van Rossumc2670a01992-09-13 20:07:29 +00001481 {"setpgrp", posix_setpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001482#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001483#ifdef HAVE_WAIT
Guido van Rossum85e3b011991-06-03 12:42:10 +00001484 {"wait", posix_wait},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001485#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001486#ifdef HAVE_WAITPID
Guido van Rossum21803b81992-08-09 12:55:27 +00001487 {"waitpid", posix_waitpid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001488#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001489#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001490 {"setsid", posix_setsid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001491#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001492#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001493 {"setpgid", posix_setpgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001494#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001495#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001496 {"tcgetpgrp", posix_tcgetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001497#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001498#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001499 {"tcsetpgrp", posix_tcsetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001500#endif /* HAVE_TCSETPGRP */
Guido van Rossum687dd131993-05-17 08:34:16 +00001501 {"open", posix_open},
1502 {"close", posix_close},
1503 {"dup", posix_dup},
1504 {"dup2", posix_dup2},
1505 {"lseek", posix_lseek},
1506 {"read", posix_read},
1507 {"write", posix_write},
1508 {"fstat", posix_fstat},
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001509 {"fdopen", posix_fdopen, 1},
Guido van Rossum687dd131993-05-17 08:34:16 +00001510 {"pipe", posix_pipe},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001511 {NULL, NULL} /* Sentinel */
1512};
1513
1514
Guido van Rossumb6775db1994-08-01 11:34:53 +00001515#ifdef NT
1516void
1517initnt()
1518{
1519 object *m, *d, *v;
1520
1521 m = initmodule("nt", posix_methods);
1522 d = getmoduledict(m);
1523
1524 /* Initialize nt.environ dictionary */
1525 v = convertenviron();
1526 if (v == NULL || dictinsert(d, "environ", v) != 0)
1527 fatal("can't define nt.environ");
1528 DECREF(v);
1529
1530 /* Initialize nt.error exception */
1531 PosixError = newstringobject("nt.error");
1532 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1533 fatal("can't define nt.error");
1534}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001535#else /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001536void
1537initposix()
1538{
1539 object *m, *d, *v;
1540
1541 m = initmodule("posix", posix_methods);
1542 d = getmoduledict(m);
1543
1544 /* Initialize posix.environ dictionary */
1545 v = convertenviron();
1546 if (v == NULL || dictinsert(d, "environ", v) != 0)
1547 fatal("can't define posix.environ");
1548 DECREF(v);
1549
Guido van Rossumde4e1241995-03-30 10:56:54 +00001550#ifdef WNOHANG
1551 /* Export WNOHANG symbol */
1552 v = newintobject((long)WNOHANG);
1553 if (v == NULL || dictinsert(d, "WNOHANG", v) != 0)
1554 fatal("can't define posix.WNOHANG");
1555 DECREF(v);
1556#endif
1557
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001558 /* Initialize posix.error exception */
1559 PosixError = newstringobject("posix.error");
1560 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1561 fatal("can't define posix.error");
1562}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001563#endif /* !NT */