blob: ca311c4402d19c5af7d2e571b142d01ce8f68d61 [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 Rossum85a5fbb1990-10-14 12:07:46 +0000488 return posix_strint(args, mkdir);
489}
490
Guido van Rossumb6775db1994-08-01 11:34:53 +0000491#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +0000492static object *
493posix_nice(self, args)
494 object *self;
495 object *args;
496{
497 int increment, value;
498
499 if (!getargs(args, "i", &increment))
500 return NULL;
501 value = nice(increment);
502 if (value == -1)
503 return posix_error();
504 return newintobject((long) value);
505}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000506#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000507
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000508static object *
509posix_rename(self, args)
510 object *self;
511 object *args;
512{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000513 return posix_2str(args, rename);
514}
515
516static object *
517posix_rmdir(self, args)
518 object *self;
519 object *args;
520{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000521 return posix_1str(args, rmdir);
522}
523
524static object *
525posix_stat(self, args)
526 object *self;
527 object *args;
528{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000529 return posix_do_stat(self, args, stat);
530}
531
532static object *
533posix_system(self, args)
534 object *self;
535 object *args;
536{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000537 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000538 long sts;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000539 if (!getargs(args, "s", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000540 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000541 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000542 sts = system(command);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000543 END_SAVE
544 return newintobject(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000545}
546
547static object *
548posix_umask(self, args)
549 object *self;
550 object *args;
551{
552 int i;
553 if (!getintarg(args, &i))
554 return NULL;
555 i = umask(i);
556 if (i < 0)
557 return posix_error();
558 return newintobject((long)i);
559}
560
561static object *
562posix_unlink(self, args)
563 object *self;
564 object *args;
565{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000566 return posix_1str(args, unlink);
567}
568
Guido van Rossumb6775db1994-08-01 11:34:53 +0000569#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000570static object *
571posix_uname(self, args)
572 object *self;
573 object *args;
574{
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000575 struct utsname u;
576 object *v;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000577 int res;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000578 if (!getnoarg(args))
579 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000580 BGN_SAVE
581 res = uname(&u);
582 END_SAVE
583 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000584 return posix_error();
Guido van Rossume5372401993-03-16 12:15:04 +0000585 return mkvalue("(sssss)",
586 u.sysname,
587 u.nodename,
588 u.release,
589 u.version,
590 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000591}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000592#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000593
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000594static object *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000595posix_utime(self, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000596 object *self;
597 object *args;
598{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000599 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000600 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000601 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000602
Guido van Rossumb6775db1994-08-01 11:34:53 +0000603#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000604 struct utimbuf buf;
605#define ATIME buf.actime
606#define MTIME buf.modtime
607#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000608#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000609 time_t buf[2];
610#define ATIME buf[0]
611#define MTIME buf[1]
612#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000613#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000614
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000615 if (!getargs(args, "(s(ll))", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000616 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000617 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +0000618 MTIME = mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000619 BGN_SAVE
620 res = utime(path, UTIME_ARG);
621 END_SAVE
622 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000623 return posix_error();
624 INCREF(None);
625 return None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000626#undef UTIME_ARG
627#undef ATIME
628#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000629}
630
Guido van Rossum85e3b011991-06-03 12:42:10 +0000631
Guido van Rossum3b066191991-06-04 19:40:25 +0000632/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000633
634static object *
635posix__exit(self, args)
636 object *self;
637 object *args;
638{
639 int sts;
640 if (!getintarg(args, &sts))
641 return NULL;
642 _exit(sts);
643 /* NOTREACHED */
644}
645
Guido van Rossum85e3b011991-06-03 12:42:10 +0000646static object *
Guido van Rossum89b33251993-10-22 14:26:06 +0000647posix_execv(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +0000648 object *self;
649 object *args;
650{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000651 char *path;
652 object *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000653 char **argvlist;
654 int i, argc;
655 object *(*getitem) PROTO((object *, int));
656
Guido van Rossum89b33251993-10-22 14:26:06 +0000657 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +0000658 argv is a list or tuple of strings. */
659
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000660 if (!getargs(args, "(sO)", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000661 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000662 if (is_listobject(argv)) {
663 argc = getlistsize(argv);
664 getitem = getlistitem;
665 }
666 else if (is_tupleobject(argv)) {
667 argc = gettuplesize(argv);
668 getitem = gettupleitem;
669 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000670 else {
671 badarg:
672 err_badarg();
673 return NULL;
674 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000675
676 argvlist = NEW(char *, argc+1);
677 if (argvlist == NULL)
678 return NULL;
679 for (i = 0; i < argc; i++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000680 if (!getargs((*getitem)(argv, i), "s", &argvlist[i])) {
Guido van Rossum85e3b011991-06-03 12:42:10 +0000681 DEL(argvlist);
682 goto badarg;
683 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000684 }
685 argvlist[argc] = NULL;
686
Guido van Rossumb6775db1994-08-01 11:34:53 +0000687#ifdef BAD_EXEC_PROTOTYPES
688 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000689#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000690 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000691#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000692
Guido van Rossum85e3b011991-06-03 12:42:10 +0000693 /* If we get here it's definitely an error */
694
695 DEL(argvlist);
696 return posix_error();
697}
698
699static object *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000700posix_execve(self, args)
701 object *self;
702 object *args;
703{
704 char *path;
705 object *argv, *env;
706 char **argvlist;
707 char **envlist;
708 object *key, *val;
709 int i, pos, argc, envc;
710 object *(*getitem) PROTO((object *, int));
711
712 /* execve has three arguments: (path, argv, env), where
713 argv is a list or tuple of strings and env is a dictionary
714 like posix.environ. */
715
716 if (!getargs(args, "(sOO)", &path, &argv, &env))
717 return NULL;
718 if (is_listobject(argv)) {
719 argc = getlistsize(argv);
720 getitem = getlistitem;
721 }
722 else if (is_tupleobject(argv)) {
723 argc = gettuplesize(argv);
724 getitem = gettupleitem;
725 }
726 else {
727 err_setstr(TypeError, "argv must be tuple or list");
728 return NULL;
729 }
730 if (!is_dictobject(env)) {
731 err_setstr(TypeError, "env must be dictionary");
732 return NULL;
733 }
734
735 argvlist = NEW(char *, argc+1);
736 if (argvlist == NULL) {
737 err_nomem();
738 return NULL;
739 }
740 for (i = 0; i < argc; i++) {
741 if (!getargs((*getitem)(argv, i),
742 "s;argv must be list of strings",
743 &argvlist[i])) {
744 goto fail_1;
745 }
746 }
747 argvlist[argc] = NULL;
748
749 i = getmappingsize(env);
750 envlist = NEW(char *, i + 1);
751 if (envlist == NULL) {
752 err_nomem();
753 goto fail_1;
754 }
755 pos = 0;
756 envc = 0;
757 while (mappinggetnext(env, &pos, &key, &val)) {
758 char *p, *k, *v;
759 if (!getargs(key, "s;non-string key in env", &k) ||
760 !getargs(val, "s;non-string value in env", &v)) {
761 goto fail_2;
762 }
763 p = NEW(char, getstringsize(key) + getstringsize(val) + 2);
764 if (p == NULL) {
765 err_nomem();
766 goto fail_2;
767 }
768 sprintf(p, "%s=%s", k, v);
769 envlist[envc++] = p;
770 }
771 envlist[envc] = 0;
772
Guido van Rossumb6775db1994-08-01 11:34:53 +0000773
774#ifdef BAD_EXEC_PROTOTYPES
775 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000776#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000777 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000778#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000779
780 /* If we get here it's definitely an error */
781
782 (void) posix_error();
783
784 fail_2:
785 while (--envc >= 0)
786 DEL(envlist[envc]);
787 DEL(envlist);
788 fail_1:
789 DEL(argvlist);
790
791 return NULL;
792}
793
Guido van Rossumad0ee831995-03-01 10:34:45 +0000794#ifdef HAVE_FORK
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000795static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000796posix_fork(self, args)
797 object *self;
798 object *args;
799{
800 int pid;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000801 if (!getnoarg(args))
802 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000803 pid = fork();
804 if (pid == -1)
805 return posix_error();
806 return newintobject((long)pid);
807}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000808#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000809
Guido van Rossumad0ee831995-03-01 10:34:45 +0000810#ifdef HAVE_GETEGID
Guido van Rossum85e3b011991-06-03 12:42:10 +0000811static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000812posix_getegid(self, args)
813 object *self;
814 object *args;
815{
816 if (!getnoarg(args))
817 return NULL;
818 return newintobject((long)getegid());
819}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000820#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000821
Guido van Rossumad0ee831995-03-01 10:34:45 +0000822#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000823static object *
824posix_geteuid(self, args)
825 object *self;
826 object *args;
827{
828 if (!getnoarg(args))
829 return NULL;
830 return newintobject((long)geteuid());
831}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000832#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000833
Guido van Rossumad0ee831995-03-01 10:34:45 +0000834#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000835static object *
836posix_getgid(self, args)
837 object *self;
838 object *args;
839{
840 if (!getnoarg(args))
841 return NULL;
842 return newintobject((long)getgid());
843}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000844#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000845
846static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000847posix_getpid(self, args)
848 object *self;
849 object *args;
850{
Guido van Rossum04814471991-06-04 20:23:49 +0000851 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000852 return NULL;
853 return newintobject((long)getpid());
854}
855
Guido van Rossumb6775db1994-08-01 11:34:53 +0000856#ifdef HAVE_GETPGRP
Guido van Rossum85e3b011991-06-03 12:42:10 +0000857static object *
Guido van Rossum04814471991-06-04 20:23:49 +0000858posix_getpgrp(self, args)
859 object *self;
860 object *args;
861{
862 if (!getnoarg(args))
863 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000864#ifdef GETPGRP_HAVE_ARG
Guido van Rossum971443b1991-06-07 13:59:29 +0000865 return newintobject((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000866#else /* GETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000867 return newintobject((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000868#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +0000869}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000870#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +0000871
Guido van Rossumb6775db1994-08-01 11:34:53 +0000872#ifdef HAVE_SETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +0000873static object *
Guido van Rossumc2670a01992-09-13 20:07:29 +0000874posix_setpgrp(self, args)
875 object *self;
876 object *args;
877{
878 if (!getnoarg(args))
879 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +0000880#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +0000881 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +0000882#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000883 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +0000884#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +0000885 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +0000886 INCREF(None);
887 return None;
888}
889
Guido van Rossumb6775db1994-08-01 11:34:53 +0000890#endif /* HAVE_SETPGRP */
891
Guido van Rossumad0ee831995-03-01 10:34:45 +0000892#ifdef HAVE_GETPPID
Guido van Rossumc2670a01992-09-13 20:07:29 +0000893static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000894posix_getppid(self, args)
895 object *self;
896 object *args;
897{
Guido van Rossum04814471991-06-04 20:23:49 +0000898 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000899 return NULL;
900 return newintobject((long)getppid());
901}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000902#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000903
Guido van Rossumad0ee831995-03-01 10:34:45 +0000904#ifdef HAVE_GETUID
Guido van Rossum85e3b011991-06-03 12:42:10 +0000905static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000906posix_getuid(self, args)
907 object *self;
908 object *args;
909{
910 if (!getnoarg(args))
911 return NULL;
912 return newintobject((long)getuid());
913}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000914#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000915
Guido van Rossumad0ee831995-03-01 10:34:45 +0000916#ifdef HAVE_KILL
Guido van Rossum46003ff1992-05-15 11:05:24 +0000917static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000918posix_kill(self, args)
919 object *self;
920 object *args;
921{
922 int pid, sig;
Guido van Rossum234f9421993-06-17 12:35:49 +0000923 if (!getargs(args, "(ii)", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000924 return NULL;
925 if (kill(pid, sig) == -1)
926 return posix_error();
927 INCREF(None);
928 return None;
929}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000930#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000931
932static object *
Guido van Rossum3b066191991-06-04 19:40:25 +0000933posix_popen(self, args)
934 object *self;
935 object *args;
936{
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000937 char *name;
938 char *mode = "r";
939 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +0000940 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000941 object *f;
942 if (!newgetargs(args, "s|si", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +0000943 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000944 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000945 fp = popen(name, mode);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000946 END_SAVE
Guido van Rossum3b066191991-06-04 19:40:25 +0000947 if (fp == NULL)
948 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000949 f = newopenfileobject(fp, name, mode, pclose);
950 if (f != NULL)
951 setfilebufsize(f, bufsize);
952 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +0000953}
954
Guido van Rossumb6775db1994-08-01 11:34:53 +0000955#ifdef HAVE_SETUID
Guido van Rossum3b066191991-06-04 19:40:25 +0000956static object *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000957posix_setuid(self, args)
958 object *self;
959 object *args;
960{
961 int uid;
962 if (!getargs(args, "i", &uid))
963 return NULL;
964 if (setuid(uid) < 0)
965 return posix_error();
966 INCREF(None);
967 return None;
968}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000969#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000970
Guido van Rossumb6775db1994-08-01 11:34:53 +0000971#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000972static object *
973posix_setgid(self, args)
974 object *self;
975 object *args;
976{
977 int gid;
978 if (!getargs(args, "i", &gid))
979 return NULL;
980 if (setgid(gid) < 0)
981 return posix_error();
982 INCREF(None);
983 return None;
984}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000985#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000986
Guido van Rossumb6775db1994-08-01 11:34:53 +0000987#ifdef HAVE_WAITPID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000988static object *
Guido van Rossum21803b81992-08-09 12:55:27 +0000989posix_waitpid(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +0000990 object *self;
991 object *args;
992{
Guido van Rossum21803b81992-08-09 12:55:27 +0000993 int pid, options, sts;
994 if (!getargs(args, "(ii)", &pid, &options))
995 return NULL;
996 BGN_SAVE
997 pid = waitpid(pid, &sts, options);
998 END_SAVE
Guido van Rossum85e3b011991-06-03 12:42:10 +0000999 if (pid == -1)
1000 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +00001001 else
1002 return mkvalue("ii", pid, sts);
Guido van Rossum21803b81992-08-09 12:55:27 +00001003}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001004#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +00001005
Guido van Rossumad0ee831995-03-01 10:34:45 +00001006#ifdef HAVE_WAIT
Guido van Rossum21803b81992-08-09 12:55:27 +00001007static object *
1008posix_wait(self, args)
1009 object *self;
1010 object *args;
1011{
1012 int pid, sts;
Guido van Rossum21803b81992-08-09 12:55:27 +00001013 BGN_SAVE
1014 pid = wait(&sts);
1015 END_SAVE
1016 if (pid == -1)
1017 return posix_error();
1018 else
1019 return mkvalue("ii", pid, sts);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001020}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001021#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001022
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001023static object *
1024posix_lstat(self, args)
1025 object *self;
1026 object *args;
1027{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001028#ifdef HAVE_LSTAT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001029 return posix_do_stat(self, args, lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001030#else /* !HAVE_LSTAT */
1031 return posix_do_stat(self, args, stat);
1032#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001033}
1034
Guido van Rossumb6775db1994-08-01 11:34:53 +00001035#ifdef HAVE_READLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001036static object *
1037posix_readlink(self, args)
1038 object *self;
1039 object *args;
1040{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001041 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001042 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001043 int n;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001044 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001045 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001046 BGN_SAVE
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001047 n = readlink(path, buf, (int) sizeof buf);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001048 END_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001049 if (n < 0)
1050 return posix_error();
1051 return newsizedstringobject(buf, n);
1052}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001053#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001054
Guido van Rossumb6775db1994-08-01 11:34:53 +00001055#ifdef HAVE_SYMLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001056static object *
1057posix_symlink(self, args)
1058 object *self;
1059 object *args;
1060{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001061 return posix_2str(args, symlink);
1062}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001063#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001064
Guido van Rossumb6775db1994-08-01 11:34:53 +00001065#ifdef HAVE_TIMES
1066#ifndef HZ
1067#define HZ 60 /* Universal constant :-) */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001068#endif /* HZ */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001069static object *
1070posix_times(self, args)
1071 object *self;
1072 object *args;
1073{
1074 struct tms t;
1075 clock_t c;
Guido van Rossum22db57e1992-04-05 14:25:30 +00001076 if (!getnoarg(args))
1077 return NULL;
1078 errno = 0;
1079 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00001080 if (c == (clock_t) -1)
1081 return posix_error();
Guido van Rossumbbc34101995-09-13 17:39:51 +00001082 return mkvalue("ddddd",
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001083 (double)t.tms_utime / HZ,
1084 (double)t.tms_stime / HZ,
1085 (double)t.tms_cutime / HZ,
Guido van Rossumbbc34101995-09-13 17:39:51 +00001086 (double)t.tms_cstime / HZ,
1087 (double)c / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00001088}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001089#endif /* HAVE_TIMES */
Guido van Rossum6f4f5f71995-03-10 15:14:41 +00001090#if defined(NT) && !defined(HAVE_TIMES)
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001091#define HAVE_TIMES /* so the method table will pick it up */
1092static object *
1093posix_times(self, args)
1094 object *self;
1095 object *args;
1096{
1097 FILETIME create, exit, kernel, user;
1098 HANDLE hProc;
1099 if (!getnoarg(args))
1100 return NULL;
1101 hProc = GetCurrentProcess();
1102 GetProcessTimes(hProc,&create, &exit, &kernel, &user);
Guido van Rossumbbc34101995-09-13 17:39:51 +00001103 return mkvalue("ddddd",
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001104 (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime) / 2E6,
1105 (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6,
1106 (double)0,
Guido van Rossumbbc34101995-09-13 17:39:51 +00001107 (double)0,
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001108 (double)0);
1109}
1110#endif /* NT */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001111
Guido van Rossumb6775db1994-08-01 11:34:53 +00001112#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001113static object *
1114posix_setsid(self, args)
1115 object *self;
1116 object *args;
1117{
1118 if (!getnoarg(args))
1119 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001120 if (setsid() < 0)
1121 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001122 INCREF(None);
1123 return None;
1124}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001125#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001126
Guido van Rossumb6775db1994-08-01 11:34:53 +00001127#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001128static object *
1129posix_setpgid(self, args)
1130 object *self;
1131 object *args;
1132{
1133 int pid, pgrp;
1134 if (!getargs(args, "(ii)", &pid, &pgrp))
1135 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001136 if (setpgid(pid, pgrp) < 0)
1137 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001138 INCREF(None);
1139 return None;
1140}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001141#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001142
Guido van Rossumb6775db1994-08-01 11:34:53 +00001143#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001144static object *
1145posix_tcgetpgrp(self, args)
1146 object *self;
1147 object *args;
1148{
1149 int fd, pgid;
1150 if (!getargs(args, "i", &fd))
1151 return NULL;
1152 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001153 if (pgid < 0)
1154 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001155 return newintobject((long)pgid);
1156}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001157#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00001158
Guido van Rossumb6775db1994-08-01 11:34:53 +00001159#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001160static object *
1161posix_tcsetpgrp(self, args)
1162 object *self;
1163 object *args;
1164{
1165 int fd, pgid;
1166 if (!getargs(args, "(ii)", &fd, &pgid))
1167 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001168 if (tcsetpgrp(fd, pgid) < 0)
1169 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001170 INCREF(None);
1171 return None;
1172}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001173#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001174
Guido van Rossum687dd131993-05-17 08:34:16 +00001175/* Functions acting on file descriptors */
1176
Guido van Rossum234f9421993-06-17 12:35:49 +00001177static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001178posix_open(self, args)
1179 object *self;
1180 object *args;
1181{
1182 char *file;
1183 int flag;
1184 int mode = 0777;
1185 int fd;
1186 if (!getargs(args, "(si)", &file, &flag)) {
1187 err_clear();
1188 if (!getargs(args, "(sii)", &file, &flag, &mode))
1189 return NULL;
1190 }
1191 BGN_SAVE
1192 fd = open(file, flag, mode);
1193 END_SAVE
1194 if (fd < 0)
1195 return posix_error();
1196 return newintobject((long)fd);
1197}
1198
Guido van Rossum234f9421993-06-17 12:35:49 +00001199static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001200posix_close(self, args)
1201 object *self;
1202 object *args;
1203{
1204 int fd, res;
1205 if (!getargs(args, "i", &fd))
1206 return NULL;
1207 BGN_SAVE
1208 res = close(fd);
1209 END_SAVE
1210 if (res < 0)
1211 return posix_error();
1212 INCREF(None);
1213 return None;
1214}
1215
Guido van Rossum234f9421993-06-17 12:35:49 +00001216static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001217posix_dup(self, args)
1218 object *self;
1219 object *args;
1220{
1221 int fd;
1222 if (!getargs(args, "i", &fd))
1223 return NULL;
1224 BGN_SAVE
1225 fd = dup(fd);
1226 END_SAVE
1227 if (fd < 0)
1228 return posix_error();
1229 return newintobject((long)fd);
1230}
1231
Guido van Rossum234f9421993-06-17 12:35:49 +00001232static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001233posix_dup2(self, args)
1234 object *self;
1235 object *args;
1236{
1237 int fd, fd2, res;
1238 if (!getargs(args, "(ii)", &fd, &fd2))
1239 return NULL;
1240 BGN_SAVE
1241 res = dup2(fd, fd2);
1242 END_SAVE
1243 if (res < 0)
1244 return posix_error();
1245 INCREF(None);
1246 return None;
1247}
1248
Guido van Rossum234f9421993-06-17 12:35:49 +00001249static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001250posix_lseek(self, args)
1251 object *self;
1252 object *args;
1253{
1254 int fd, how;
1255 long pos, res;
1256 if (!getargs(args, "(ili)", &fd, &pos, &how))
1257 return NULL;
1258#ifdef SEEK_SET
1259 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
1260 switch (how) {
1261 case 0: how = SEEK_SET; break;
1262 case 1: how = SEEK_CUR; break;
1263 case 2: how = SEEK_END; break;
1264 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001265#endif /* SEEK_END */
Guido van Rossum687dd131993-05-17 08:34:16 +00001266 BGN_SAVE
1267 res = lseek(fd, pos, how);
1268 END_SAVE
1269 if (res < 0)
1270 return posix_error();
1271 return newintobject(res);
1272}
1273
Guido van Rossum234f9421993-06-17 12:35:49 +00001274static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001275posix_read(self, args)
1276 object *self;
1277 object *args;
1278{
1279 int fd, size;
1280 object *buffer;
1281 if (!getargs(args, "(ii)", &fd, &size))
1282 return NULL;
1283 buffer = newsizedstringobject((char *)NULL, size);
1284 if (buffer == NULL)
1285 return NULL;
1286 BGN_SAVE
1287 size = read(fd, getstringvalue(buffer), size);
1288 END_SAVE
1289 if (size < 0) {
1290 DECREF(buffer);
1291 return posix_error();
1292 }
1293 resizestring(&buffer, size);
1294 return buffer;
1295}
1296
Guido van Rossum234f9421993-06-17 12:35:49 +00001297static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001298posix_write(self, args)
1299 object *self;
1300 object *args;
1301{
1302 int fd, size;
1303 char *buffer;
1304 if (!getargs(args, "(is#)", &fd, &buffer, &size))
1305 return NULL;
1306 BGN_SAVE
1307 size = write(fd, buffer, size);
1308 END_SAVE
1309 if (size < 0)
1310 return posix_error();
1311 return newintobject((long)size);
1312}
1313
Guido van Rossum234f9421993-06-17 12:35:49 +00001314static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001315posix_fstat(self, args)
1316 object *self;
1317 object *args;
1318{
1319 int fd;
1320 struct stat st;
1321 int res;
1322 if (!getargs(args, "i", &fd))
1323 return NULL;
1324 BGN_SAVE
1325 res = fstat(fd, &st);
1326 END_SAVE
1327 if (res != 0)
1328 return posix_error();
1329 return mkvalue("(llllllllll)",
1330 (long)st.st_mode,
1331 (long)st.st_ino,
1332 (long)st.st_dev,
1333 (long)st.st_nlink,
1334 (long)st.st_uid,
1335 (long)st.st_gid,
1336 (long)st.st_size,
1337 (long)st.st_atime,
1338 (long)st.st_mtime,
1339 (long)st.st_ctime);
1340}
1341
1342static object *
1343posix_fdopen(self, args)
1344 object *self;
1345 object *args;
1346{
1347 extern int fclose PROTO((FILE *));
1348 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001349 char *mode = "r";
1350 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00001351 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001352 object *f;
1353 if (!newgetargs(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00001354 return NULL;
1355 BGN_SAVE
1356 fp = fdopen(fd, mode);
1357 END_SAVE
1358 if (fp == NULL)
1359 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001360 f = newopenfileobject(fp, "(fdopen)", mode, fclose);
1361 if (f != NULL)
1362 setfilebufsize(f, bufsize);
1363 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00001364}
1365
Guido van Rossum234f9421993-06-17 12:35:49 +00001366static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001367posix_pipe(self, args)
1368 object *self;
1369 object *args;
1370{
Guido van Rossum6f4f5f71995-03-10 15:14:41 +00001371#if !defined(NT) || defined(HAVE_PIPE)
Guido van Rossum687dd131993-05-17 08:34:16 +00001372 int fds[2];
1373 int res;
1374 if (!getargs(args, ""))
1375 return NULL;
1376 BGN_SAVE
1377 res = pipe(fds);
1378 END_SAVE
1379 if (res != 0)
1380 return posix_error();
1381 return mkvalue("(ii)", fds[0], fds[1]);
Guido van Rossum794d8131994-08-23 13:48:48 +00001382#else /* NT */
1383 HANDLE read, write;
1384 BOOL ok;
1385 if (!getargs(args, ""))
1386 return NULL;
1387 BGN_SAVE
1388 ok = CreatePipe( &read, &write, NULL, 0);
1389 END_SAVE
1390 if (!ok)
1391 return posix_error();
1392 return mkvalue("(ii)", read, write);
1393#endif /* NT */
Guido van Rossum687dd131993-05-17 08:34:16 +00001394}
Guido van Rossum22db57e1992-04-05 14:25:30 +00001395
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001396static struct methodlist posix_methods[] = {
1397 {"chdir", posix_chdir},
1398 {"chmod", posix_chmod},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001399#ifdef HAVE_CHOWN
1400 {"chown", posix_chown},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001401#endif /* HAVE_CHOWN */
Guido van Rossum36bc6801995-06-14 22:54:23 +00001402#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001403 {"getcwd", posix_getcwd},
Guido van Rossum36bc6801995-06-14 22:54:23 +00001404#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001405#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001406 {"link", posix_link},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001407#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001408 {"listdir", posix_listdir},
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001409 {"lstat", posix_lstat},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001410 {"mkdir", posix_mkdir},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001411#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +00001412 {"nice", posix_nice},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001413#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001414#ifdef HAVE_READLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001415 {"readlink", posix_readlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001416#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001417 {"rename", posix_rename},
1418 {"rmdir", posix_rmdir},
1419 {"stat", posix_stat},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001420#ifdef HAVE_SYMLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001421 {"symlink", posix_symlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001422#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001423 {"system", posix_system},
1424 {"umask", posix_umask},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001425#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001426 {"uname", posix_uname},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001427#endif /* HAVE_UNAME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001428 {"unlink", posix_unlink},
Guido van Rossumf4a59121996-02-13 00:12:56 +00001429 {"remove", posix_unlink},
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001430 {"utime", posix_utime},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001431#ifdef HAVE_TIMES
Guido van Rossum22db57e1992-04-05 14:25:30 +00001432 {"times", posix_times},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001433#endif /* HAVE_TIMES */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001434 {"_exit", posix__exit},
Guido van Rossum89b33251993-10-22 14:26:06 +00001435 {"execv", posix_execv},
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001436 {"execve", posix_execve},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001437#ifdef HAVE_FORK
Guido van Rossum85e3b011991-06-03 12:42:10 +00001438 {"fork", posix_fork},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001439#endif /* HAVE_FORK */
1440#ifdef HAVE_GETEGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001441 {"getegid", posix_getegid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001442#endif /* HAVE_GETEGID */
1443#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001444 {"geteuid", posix_geteuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001445#endif /* HAVE_GETEUID */
1446#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001447 {"getgid", posix_getgid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001448#endif /* HAVE_GETGID */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001449 {"getpid", posix_getpid},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001450#ifdef HAVE_GETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001451 {"getpgrp", posix_getpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001452#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001453#ifdef HAVE_GETPPID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001454 {"getppid", posix_getppid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001455#endif /* HAVE_GETPPID */
1456#ifdef HAVE_GETUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001457 {"getuid", posix_getuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001458#endif /* HAVE_GETUID */
1459#ifdef HAVE_KILL
Guido van Rossum85e3b011991-06-03 12:42:10 +00001460 {"kill", posix_kill},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001461#endif /* HAVE_KILL */
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001462 {"popen", posix_popen, 1},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001463#ifdef HAVE_SETUID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001464 {"setuid", posix_setuid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001465#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001466#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001467 {"setgid", posix_setgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001468#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001469#ifdef HAVE_SETPGRP
Guido van Rossumc2670a01992-09-13 20:07:29 +00001470 {"setpgrp", posix_setpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001471#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001472#ifdef HAVE_WAIT
Guido van Rossum85e3b011991-06-03 12:42:10 +00001473 {"wait", posix_wait},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001474#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001475#ifdef HAVE_WAITPID
Guido van Rossum21803b81992-08-09 12:55:27 +00001476 {"waitpid", posix_waitpid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001477#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001478#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001479 {"setsid", posix_setsid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001480#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001481#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001482 {"setpgid", posix_setpgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001483#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001484#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001485 {"tcgetpgrp", posix_tcgetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001486#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001487#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001488 {"tcsetpgrp", posix_tcsetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001489#endif /* HAVE_TCSETPGRP */
Guido van Rossum687dd131993-05-17 08:34:16 +00001490 {"open", posix_open},
1491 {"close", posix_close},
1492 {"dup", posix_dup},
1493 {"dup2", posix_dup2},
1494 {"lseek", posix_lseek},
1495 {"read", posix_read},
1496 {"write", posix_write},
1497 {"fstat", posix_fstat},
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001498 {"fdopen", posix_fdopen, 1},
Guido van Rossum687dd131993-05-17 08:34:16 +00001499 {"pipe", posix_pipe},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001500 {NULL, NULL} /* Sentinel */
1501};
1502
1503
Guido van Rossumb6775db1994-08-01 11:34:53 +00001504#ifdef NT
1505void
1506initnt()
1507{
1508 object *m, *d, *v;
1509
1510 m = initmodule("nt", posix_methods);
1511 d = getmoduledict(m);
1512
1513 /* Initialize nt.environ dictionary */
1514 v = convertenviron();
1515 if (v == NULL || dictinsert(d, "environ", v) != 0)
1516 fatal("can't define nt.environ");
1517 DECREF(v);
1518
1519 /* Initialize nt.error exception */
1520 PosixError = newstringobject("nt.error");
1521 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1522 fatal("can't define nt.error");
1523}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001524#else /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001525void
1526initposix()
1527{
1528 object *m, *d, *v;
1529
1530 m = initmodule("posix", posix_methods);
1531 d = getmoduledict(m);
1532
1533 /* Initialize posix.environ dictionary */
1534 v = convertenviron();
1535 if (v == NULL || dictinsert(d, "environ", v) != 0)
1536 fatal("can't define posix.environ");
1537 DECREF(v);
1538
Guido van Rossumde4e1241995-03-30 10:56:54 +00001539#ifdef WNOHANG
1540 /* Export WNOHANG symbol */
1541 v = newintobject((long)WNOHANG);
1542 if (v == NULL || dictinsert(d, "WNOHANG", v) != 0)
1543 fatal("can't define posix.WNOHANG");
1544 DECREF(v);
1545#endif
1546
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001547 /* Initialize posix.error exception */
1548 PosixError = newstringobject("posix.error");
1549 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1550 fatal("can't define posix.error");
1551}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001552#endif /* !NT */