blob: 3d4bdcf9eae65db935a292cb746c9dc1e53dd1b5 [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 {
411 v = newstringobject(FileData.cFileName);
412 if (v == NULL) {
413 DECREF(d);
414 d = NULL;
415 break;
416 }
417 if (addlistitem(d, v) != 0) {
418 DECREF(v);
419 DECREF(d);
420 d = NULL;
421 break;
422 }
423 DECREF(v);
424 } while (FindNextFile(hFindFile, &FileData) == TRUE);
425
426 if (FindClose(hFindFile) == FALSE) {
427 errno = GetLastError();
428 return posix_error();
429 }
430
431 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000432
433#else /* !NT */
434
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000435 char *name;
436 object *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000438 struct dirent *ep;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000439 if (!getargs(args, "s", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000441 BGN_SAVE
442 if ((dirp = opendir(name)) == NULL) {
443 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000444 return posix_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000445 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446 if ((d = newlistobject(0)) == NULL) {
447 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000448 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449 return NULL;
450 }
451 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000452 v = newsizedstringobject(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453 if (v == NULL) {
454 DECREF(d);
455 d = NULL;
456 break;
457 }
458 if (addlistitem(d, v) != 0) {
459 DECREF(v);
460 DECREF(d);
461 d = NULL;
462 break;
463 }
464 DECREF(v);
465 }
466 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000467 END_SAVE
Guido van Rossum0ee42cd1991-04-08 21:01:03 +0000468
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000470
471#endif /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000472}
473
474static object *
475posix_mkdir(self, args)
476 object *self;
477 object *args;
478{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000479 return posix_strint(args, mkdir);
480}
481
Guido van Rossumb6775db1994-08-01 11:34:53 +0000482#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +0000483static object *
484posix_nice(self, args)
485 object *self;
486 object *args;
487{
488 int increment, value;
489
490 if (!getargs(args, "i", &increment))
491 return NULL;
492 value = nice(increment);
493 if (value == -1)
494 return posix_error();
495 return newintobject((long) value);
496}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000497#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000498
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000499static object *
500posix_rename(self, args)
501 object *self;
502 object *args;
503{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000504 return posix_2str(args, rename);
505}
506
507static object *
508posix_rmdir(self, args)
509 object *self;
510 object *args;
511{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000512 return posix_1str(args, rmdir);
513}
514
515static object *
516posix_stat(self, args)
517 object *self;
518 object *args;
519{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000520 return posix_do_stat(self, args, stat);
521}
522
523static object *
524posix_system(self, args)
525 object *self;
526 object *args;
527{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000528 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000529 long sts;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000530 if (!getargs(args, "s", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000531 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000532 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000533 sts = system(command);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000534 END_SAVE
535 return newintobject(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000536}
537
538static object *
539posix_umask(self, args)
540 object *self;
541 object *args;
542{
543 int i;
544 if (!getintarg(args, &i))
545 return NULL;
546 i = umask(i);
547 if (i < 0)
548 return posix_error();
549 return newintobject((long)i);
550}
551
552static object *
553posix_unlink(self, args)
554 object *self;
555 object *args;
556{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000557 return posix_1str(args, unlink);
558}
559
Guido van Rossumb6775db1994-08-01 11:34:53 +0000560#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000561static object *
562posix_uname(self, args)
563 object *self;
564 object *args;
565{
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000566 struct utsname u;
567 object *v;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000568 int res;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000569 if (!getnoarg(args))
570 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000571 BGN_SAVE
572 res = uname(&u);
573 END_SAVE
574 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000575 return posix_error();
Guido van Rossume5372401993-03-16 12:15:04 +0000576 return mkvalue("(sssss)",
577 u.sysname,
578 u.nodename,
579 u.release,
580 u.version,
581 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000582}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000583#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000584
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000585static object *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000586posix_utime(self, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000587 object *self;
588 object *args;
589{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000590 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000591 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000592 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000593
Guido van Rossumb6775db1994-08-01 11:34:53 +0000594#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000595 struct utimbuf buf;
596#define ATIME buf.actime
597#define MTIME buf.modtime
598#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000599#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000600 time_t buf[2];
601#define ATIME buf[0]
602#define MTIME buf[1]
603#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000604#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000605
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000606 if (!getargs(args, "(s(ll))", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000607 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000608 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +0000609 MTIME = mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000610 BGN_SAVE
611 res = utime(path, UTIME_ARG);
612 END_SAVE
613 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000614 return posix_error();
615 INCREF(None);
616 return None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000617#undef UTIME_ARG
618#undef ATIME
619#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000620}
621
Guido van Rossum85e3b011991-06-03 12:42:10 +0000622
Guido van Rossum3b066191991-06-04 19:40:25 +0000623/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000624
625static object *
626posix__exit(self, args)
627 object *self;
628 object *args;
629{
630 int sts;
631 if (!getintarg(args, &sts))
632 return NULL;
633 _exit(sts);
634 /* NOTREACHED */
635}
636
Guido van Rossum85e3b011991-06-03 12:42:10 +0000637static object *
Guido van Rossum89b33251993-10-22 14:26:06 +0000638posix_execv(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +0000639 object *self;
640 object *args;
641{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000642 char *path;
643 object *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000644 char **argvlist;
645 int i, argc;
646 object *(*getitem) PROTO((object *, int));
647
Guido van Rossum89b33251993-10-22 14:26:06 +0000648 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +0000649 argv is a list or tuple of strings. */
650
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000651 if (!getargs(args, "(sO)", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000652 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000653 if (is_listobject(argv)) {
654 argc = getlistsize(argv);
655 getitem = getlistitem;
656 }
657 else if (is_tupleobject(argv)) {
658 argc = gettuplesize(argv);
659 getitem = gettupleitem;
660 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000661 else {
662 badarg:
663 err_badarg();
664 return NULL;
665 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000666
667 argvlist = NEW(char *, argc+1);
668 if (argvlist == NULL)
669 return NULL;
670 for (i = 0; i < argc; i++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000671 if (!getargs((*getitem)(argv, i), "s", &argvlist[i])) {
Guido van Rossum85e3b011991-06-03 12:42:10 +0000672 DEL(argvlist);
673 goto badarg;
674 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000675 }
676 argvlist[argc] = NULL;
677
Guido van Rossumb6775db1994-08-01 11:34:53 +0000678#ifdef BAD_EXEC_PROTOTYPES
679 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000680#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000681 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000682#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000683
Guido van Rossum85e3b011991-06-03 12:42:10 +0000684 /* If we get here it's definitely an error */
685
686 DEL(argvlist);
687 return posix_error();
688}
689
690static object *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000691posix_execve(self, args)
692 object *self;
693 object *args;
694{
695 char *path;
696 object *argv, *env;
697 char **argvlist;
698 char **envlist;
699 object *key, *val;
700 int i, pos, argc, envc;
701 object *(*getitem) PROTO((object *, int));
702
703 /* execve has three arguments: (path, argv, env), where
704 argv is a list or tuple of strings and env is a dictionary
705 like posix.environ. */
706
707 if (!getargs(args, "(sOO)", &path, &argv, &env))
708 return NULL;
709 if (is_listobject(argv)) {
710 argc = getlistsize(argv);
711 getitem = getlistitem;
712 }
713 else if (is_tupleobject(argv)) {
714 argc = gettuplesize(argv);
715 getitem = gettupleitem;
716 }
717 else {
718 err_setstr(TypeError, "argv must be tuple or list");
719 return NULL;
720 }
721 if (!is_dictobject(env)) {
722 err_setstr(TypeError, "env must be dictionary");
723 return NULL;
724 }
725
726 argvlist = NEW(char *, argc+1);
727 if (argvlist == NULL) {
728 err_nomem();
729 return NULL;
730 }
731 for (i = 0; i < argc; i++) {
732 if (!getargs((*getitem)(argv, i),
733 "s;argv must be list of strings",
734 &argvlist[i])) {
735 goto fail_1;
736 }
737 }
738 argvlist[argc] = NULL;
739
740 i = getmappingsize(env);
741 envlist = NEW(char *, i + 1);
742 if (envlist == NULL) {
743 err_nomem();
744 goto fail_1;
745 }
746 pos = 0;
747 envc = 0;
748 while (mappinggetnext(env, &pos, &key, &val)) {
749 char *p, *k, *v;
750 if (!getargs(key, "s;non-string key in env", &k) ||
751 !getargs(val, "s;non-string value in env", &v)) {
752 goto fail_2;
753 }
754 p = NEW(char, getstringsize(key) + getstringsize(val) + 2);
755 if (p == NULL) {
756 err_nomem();
757 goto fail_2;
758 }
759 sprintf(p, "%s=%s", k, v);
760 envlist[envc++] = p;
761 }
762 envlist[envc] = 0;
763
Guido van Rossumb6775db1994-08-01 11:34:53 +0000764
765#ifdef BAD_EXEC_PROTOTYPES
766 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000767#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000768 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000769#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000770
771 /* If we get here it's definitely an error */
772
773 (void) posix_error();
774
775 fail_2:
776 while (--envc >= 0)
777 DEL(envlist[envc]);
778 DEL(envlist);
779 fail_1:
780 DEL(argvlist);
781
782 return NULL;
783}
784
Guido van Rossumad0ee831995-03-01 10:34:45 +0000785#ifdef HAVE_FORK
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000786static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000787posix_fork(self, args)
788 object *self;
789 object *args;
790{
791 int pid;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000792 if (!getnoarg(args))
793 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000794 pid = fork();
795 if (pid == -1)
796 return posix_error();
797 return newintobject((long)pid);
798}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000799#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000800
Guido van Rossumad0ee831995-03-01 10:34:45 +0000801#ifdef HAVE_GETEGID
Guido van Rossum85e3b011991-06-03 12:42:10 +0000802static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000803posix_getegid(self, args)
804 object *self;
805 object *args;
806{
807 if (!getnoarg(args))
808 return NULL;
809 return newintobject((long)getegid());
810}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000811#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000812
Guido van Rossumad0ee831995-03-01 10:34:45 +0000813#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000814static object *
815posix_geteuid(self, args)
816 object *self;
817 object *args;
818{
819 if (!getnoarg(args))
820 return NULL;
821 return newintobject((long)geteuid());
822}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000823#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000824
Guido van Rossumad0ee831995-03-01 10:34:45 +0000825#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000826static object *
827posix_getgid(self, args)
828 object *self;
829 object *args;
830{
831 if (!getnoarg(args))
832 return NULL;
833 return newintobject((long)getgid());
834}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000835#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000836
837static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000838posix_getpid(self, args)
839 object *self;
840 object *args;
841{
Guido van Rossum04814471991-06-04 20:23:49 +0000842 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000843 return NULL;
844 return newintobject((long)getpid());
845}
846
Guido van Rossumb6775db1994-08-01 11:34:53 +0000847#ifdef HAVE_GETPGRP
Guido van Rossum85e3b011991-06-03 12:42:10 +0000848static object *
Guido van Rossum04814471991-06-04 20:23:49 +0000849posix_getpgrp(self, args)
850 object *self;
851 object *args;
852{
853 if (!getnoarg(args))
854 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000855#ifdef GETPGRP_HAVE_ARG
Guido van Rossum971443b1991-06-07 13:59:29 +0000856 return newintobject((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000857#else /* GETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000858 return newintobject((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000859#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +0000860}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000861#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +0000862
Guido van Rossumb6775db1994-08-01 11:34:53 +0000863#ifdef HAVE_SETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +0000864static object *
Guido van Rossumc2670a01992-09-13 20:07:29 +0000865posix_setpgrp(self, args)
866 object *self;
867 object *args;
868{
869 if (!getnoarg(args))
870 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +0000871#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +0000872 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +0000873#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000874 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +0000875#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +0000876 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +0000877 INCREF(None);
878 return None;
879}
880
Guido van Rossumb6775db1994-08-01 11:34:53 +0000881#endif /* HAVE_SETPGRP */
882
Guido van Rossumad0ee831995-03-01 10:34:45 +0000883#ifdef HAVE_GETPPID
Guido van Rossumc2670a01992-09-13 20:07:29 +0000884static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000885posix_getppid(self, args)
886 object *self;
887 object *args;
888{
Guido van Rossum04814471991-06-04 20:23:49 +0000889 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000890 return NULL;
891 return newintobject((long)getppid());
892}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000893#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000894
Guido van Rossumad0ee831995-03-01 10:34:45 +0000895#ifdef HAVE_GETUID
Guido van Rossum85e3b011991-06-03 12:42:10 +0000896static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000897posix_getuid(self, args)
898 object *self;
899 object *args;
900{
901 if (!getnoarg(args))
902 return NULL;
903 return newintobject((long)getuid());
904}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000905#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000906
Guido van Rossumad0ee831995-03-01 10:34:45 +0000907#ifdef HAVE_KILL
Guido van Rossum46003ff1992-05-15 11:05:24 +0000908static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000909posix_kill(self, args)
910 object *self;
911 object *args;
912{
913 int pid, sig;
Guido van Rossum234f9421993-06-17 12:35:49 +0000914 if (!getargs(args, "(ii)", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000915 return NULL;
916 if (kill(pid, sig) == -1)
917 return posix_error();
918 INCREF(None);
919 return None;
920}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000921#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000922
923static object *
Guido van Rossum3b066191991-06-04 19:40:25 +0000924posix_popen(self, args)
925 object *self;
926 object *args;
927{
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000928 char *name;
929 char *mode = "r";
930 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +0000931 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000932 object *f;
933 if (!newgetargs(args, "s|si", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +0000934 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000935 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000936 fp = popen(name, mode);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000937 END_SAVE
Guido van Rossum3b066191991-06-04 19:40:25 +0000938 if (fp == NULL)
939 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000940 f = newopenfileobject(fp, name, mode, pclose);
941 if (f != NULL)
942 setfilebufsize(f, bufsize);
943 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +0000944}
945
Guido van Rossumb6775db1994-08-01 11:34:53 +0000946#ifdef HAVE_SETUID
Guido van Rossum3b066191991-06-04 19:40:25 +0000947static object *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000948posix_setuid(self, args)
949 object *self;
950 object *args;
951{
952 int uid;
953 if (!getargs(args, "i", &uid))
954 return NULL;
955 if (setuid(uid) < 0)
956 return posix_error();
957 INCREF(None);
958 return None;
959}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000960#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000961
Guido van Rossumb6775db1994-08-01 11:34:53 +0000962#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000963static object *
964posix_setgid(self, args)
965 object *self;
966 object *args;
967{
968 int gid;
969 if (!getargs(args, "i", &gid))
970 return NULL;
971 if (setgid(gid) < 0)
972 return posix_error();
973 INCREF(None);
974 return None;
975}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000976#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000977
Guido van Rossumb6775db1994-08-01 11:34:53 +0000978#ifdef HAVE_WAITPID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000979static object *
Guido van Rossum21803b81992-08-09 12:55:27 +0000980posix_waitpid(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +0000981 object *self;
982 object *args;
983{
Guido van Rossum21803b81992-08-09 12:55:27 +0000984 int pid, options, sts;
985 if (!getargs(args, "(ii)", &pid, &options))
986 return NULL;
987 BGN_SAVE
988 pid = waitpid(pid, &sts, options);
989 END_SAVE
Guido van Rossum85e3b011991-06-03 12:42:10 +0000990 if (pid == -1)
991 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +0000992 else
993 return mkvalue("ii", pid, sts);
Guido van Rossum21803b81992-08-09 12:55:27 +0000994}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000995#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +0000996
Guido van Rossumad0ee831995-03-01 10:34:45 +0000997#ifdef HAVE_WAIT
Guido van Rossum21803b81992-08-09 12:55:27 +0000998static object *
999posix_wait(self, args)
1000 object *self;
1001 object *args;
1002{
1003 int pid, sts;
Guido van Rossum21803b81992-08-09 12:55:27 +00001004 BGN_SAVE
1005 pid = wait(&sts);
1006 END_SAVE
1007 if (pid == -1)
1008 return posix_error();
1009 else
1010 return mkvalue("ii", pid, sts);
Guido van Rossum85e3b011991-06-03 12:42:10 +00001011}
Guido van Rossumad0ee831995-03-01 10:34:45 +00001012#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +00001013
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001014static object *
1015posix_lstat(self, args)
1016 object *self;
1017 object *args;
1018{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001019#ifdef HAVE_LSTAT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001020 return posix_do_stat(self, args, lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001021#else /* !HAVE_LSTAT */
1022 return posix_do_stat(self, args, stat);
1023#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001024}
1025
Guido van Rossumb6775db1994-08-01 11:34:53 +00001026#ifdef HAVE_READLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001027static object *
1028posix_readlink(self, args)
1029 object *self;
1030 object *args;
1031{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001032 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001033 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001034 int n;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001035 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001036 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001037 BGN_SAVE
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001038 n = readlink(path, buf, (int) sizeof buf);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001039 END_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001040 if (n < 0)
1041 return posix_error();
1042 return newsizedstringobject(buf, n);
1043}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001044#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001045
Guido van Rossumb6775db1994-08-01 11:34:53 +00001046#ifdef HAVE_SYMLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001047static object *
1048posix_symlink(self, args)
1049 object *self;
1050 object *args;
1051{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001052 return posix_2str(args, symlink);
1053}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001054#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001055
Guido van Rossumb6775db1994-08-01 11:34:53 +00001056#ifdef HAVE_TIMES
1057#ifndef HZ
1058#define HZ 60 /* Universal constant :-) */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001059#endif /* HZ */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001060static object *
1061posix_times(self, args)
1062 object *self;
1063 object *args;
1064{
1065 struct tms t;
1066 clock_t c;
Guido van Rossum22db57e1992-04-05 14:25:30 +00001067 if (!getnoarg(args))
1068 return NULL;
1069 errno = 0;
1070 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00001071 if (c == (clock_t) -1)
1072 return posix_error();
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001073 return mkvalue("dddd",
1074 (double)t.tms_utime / HZ,
1075 (double)t.tms_stime / HZ,
1076 (double)t.tms_cutime / HZ,
1077 (double)t.tms_cstime / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00001078}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001079#endif /* HAVE_TIMES */
Guido van Rossum6f4f5f71995-03-10 15:14:41 +00001080#if defined(NT) && !defined(HAVE_TIMES)
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001081#define HAVE_TIMES /* so the method table will pick it up */
1082static object *
1083posix_times(self, args)
1084 object *self;
1085 object *args;
1086{
1087 FILETIME create, exit, kernel, user;
1088 HANDLE hProc;
1089 if (!getnoarg(args))
1090 return NULL;
1091 hProc = GetCurrentProcess();
1092 GetProcessTimes(hProc,&create, &exit, &kernel, &user);
1093 return mkvalue("dddd",
1094 (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime) / 2E6,
1095 (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6,
1096 (double)0,
1097 (double)0);
1098}
1099#endif /* NT */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001100
Guido van Rossumb6775db1994-08-01 11:34:53 +00001101#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001102static object *
1103posix_setsid(self, args)
1104 object *self;
1105 object *args;
1106{
1107 if (!getnoarg(args))
1108 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001109 if (setsid() < 0)
1110 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001111 INCREF(None);
1112 return None;
1113}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001114#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001115
Guido van Rossumb6775db1994-08-01 11:34:53 +00001116#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001117static object *
1118posix_setpgid(self, args)
1119 object *self;
1120 object *args;
1121{
1122 int pid, pgrp;
1123 if (!getargs(args, "(ii)", &pid, &pgrp))
1124 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001125 if (setpgid(pid, pgrp) < 0)
1126 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001127 INCREF(None);
1128 return None;
1129}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001130#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001131
Guido van Rossumb6775db1994-08-01 11:34:53 +00001132#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001133static object *
1134posix_tcgetpgrp(self, args)
1135 object *self;
1136 object *args;
1137{
1138 int fd, pgid;
1139 if (!getargs(args, "i", &fd))
1140 return NULL;
1141 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001142 if (pgid < 0)
1143 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001144 return newintobject((long)pgid);
1145}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001146#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00001147
Guido van Rossumb6775db1994-08-01 11:34:53 +00001148#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001149static object *
1150posix_tcsetpgrp(self, args)
1151 object *self;
1152 object *args;
1153{
1154 int fd, pgid;
1155 if (!getargs(args, "(ii)", &fd, &pgid))
1156 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001157 if (tcsetpgrp(fd, pgid) < 0)
1158 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001159 INCREF(None);
1160 return None;
1161}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001162#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001163
Guido van Rossum687dd131993-05-17 08:34:16 +00001164/* Functions acting on file descriptors */
1165
Guido van Rossum234f9421993-06-17 12:35:49 +00001166static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001167posix_open(self, args)
1168 object *self;
1169 object *args;
1170{
1171 char *file;
1172 int flag;
1173 int mode = 0777;
1174 int fd;
1175 if (!getargs(args, "(si)", &file, &flag)) {
1176 err_clear();
1177 if (!getargs(args, "(sii)", &file, &flag, &mode))
1178 return NULL;
1179 }
1180 BGN_SAVE
1181 fd = open(file, flag, mode);
1182 END_SAVE
1183 if (fd < 0)
1184 return posix_error();
1185 return newintobject((long)fd);
1186}
1187
Guido van Rossum234f9421993-06-17 12:35:49 +00001188static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001189posix_close(self, args)
1190 object *self;
1191 object *args;
1192{
1193 int fd, res;
1194 if (!getargs(args, "i", &fd))
1195 return NULL;
1196 BGN_SAVE
1197 res = close(fd);
1198 END_SAVE
1199 if (res < 0)
1200 return posix_error();
1201 INCREF(None);
1202 return None;
1203}
1204
Guido van Rossum234f9421993-06-17 12:35:49 +00001205static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001206posix_dup(self, args)
1207 object *self;
1208 object *args;
1209{
1210 int fd;
1211 if (!getargs(args, "i", &fd))
1212 return NULL;
1213 BGN_SAVE
1214 fd = dup(fd);
1215 END_SAVE
1216 if (fd < 0)
1217 return posix_error();
1218 return newintobject((long)fd);
1219}
1220
Guido van Rossum234f9421993-06-17 12:35:49 +00001221static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001222posix_dup2(self, args)
1223 object *self;
1224 object *args;
1225{
1226 int fd, fd2, res;
1227 if (!getargs(args, "(ii)", &fd, &fd2))
1228 return NULL;
1229 BGN_SAVE
1230 res = dup2(fd, fd2);
1231 END_SAVE
1232 if (res < 0)
1233 return posix_error();
1234 INCREF(None);
1235 return None;
1236}
1237
Guido van Rossum234f9421993-06-17 12:35:49 +00001238static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001239posix_lseek(self, args)
1240 object *self;
1241 object *args;
1242{
1243 int fd, how;
1244 long pos, res;
1245 if (!getargs(args, "(ili)", &fd, &pos, &how))
1246 return NULL;
1247#ifdef SEEK_SET
1248 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
1249 switch (how) {
1250 case 0: how = SEEK_SET; break;
1251 case 1: how = SEEK_CUR; break;
1252 case 2: how = SEEK_END; break;
1253 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001254#endif /* SEEK_END */
Guido van Rossum687dd131993-05-17 08:34:16 +00001255 BGN_SAVE
1256 res = lseek(fd, pos, how);
1257 END_SAVE
1258 if (res < 0)
1259 return posix_error();
1260 return newintobject(res);
1261}
1262
Guido van Rossum234f9421993-06-17 12:35:49 +00001263static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001264posix_read(self, args)
1265 object *self;
1266 object *args;
1267{
1268 int fd, size;
1269 object *buffer;
1270 if (!getargs(args, "(ii)", &fd, &size))
1271 return NULL;
1272 buffer = newsizedstringobject((char *)NULL, size);
1273 if (buffer == NULL)
1274 return NULL;
1275 BGN_SAVE
1276 size = read(fd, getstringvalue(buffer), size);
1277 END_SAVE
1278 if (size < 0) {
1279 DECREF(buffer);
1280 return posix_error();
1281 }
1282 resizestring(&buffer, size);
1283 return buffer;
1284}
1285
Guido van Rossum234f9421993-06-17 12:35:49 +00001286static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001287posix_write(self, args)
1288 object *self;
1289 object *args;
1290{
1291 int fd, size;
1292 char *buffer;
1293 if (!getargs(args, "(is#)", &fd, &buffer, &size))
1294 return NULL;
1295 BGN_SAVE
1296 size = write(fd, buffer, size);
1297 END_SAVE
1298 if (size < 0)
1299 return posix_error();
1300 return newintobject((long)size);
1301}
1302
Guido van Rossum234f9421993-06-17 12:35:49 +00001303static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001304posix_fstat(self, args)
1305 object *self;
1306 object *args;
1307{
1308 int fd;
1309 struct stat st;
1310 int res;
1311 if (!getargs(args, "i", &fd))
1312 return NULL;
1313 BGN_SAVE
1314 res = fstat(fd, &st);
1315 END_SAVE
1316 if (res != 0)
1317 return posix_error();
1318 return mkvalue("(llllllllll)",
1319 (long)st.st_mode,
1320 (long)st.st_ino,
1321 (long)st.st_dev,
1322 (long)st.st_nlink,
1323 (long)st.st_uid,
1324 (long)st.st_gid,
1325 (long)st.st_size,
1326 (long)st.st_atime,
1327 (long)st.st_mtime,
1328 (long)st.st_ctime);
1329}
1330
1331static object *
1332posix_fdopen(self, args)
1333 object *self;
1334 object *args;
1335{
1336 extern int fclose PROTO((FILE *));
1337 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001338 char *mode = "r";
1339 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00001340 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001341 object *f;
1342 if (!newgetargs(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00001343 return NULL;
1344 BGN_SAVE
1345 fp = fdopen(fd, mode);
1346 END_SAVE
1347 if (fp == NULL)
1348 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001349 f = newopenfileobject(fp, "(fdopen)", mode, fclose);
1350 if (f != NULL)
1351 setfilebufsize(f, bufsize);
1352 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00001353}
1354
Guido van Rossum234f9421993-06-17 12:35:49 +00001355static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001356posix_pipe(self, args)
1357 object *self;
1358 object *args;
1359{
Guido van Rossum6f4f5f71995-03-10 15:14:41 +00001360#if !defined(NT) || defined(HAVE_PIPE)
Guido van Rossum687dd131993-05-17 08:34:16 +00001361 int fds[2];
1362 int res;
1363 if (!getargs(args, ""))
1364 return NULL;
1365 BGN_SAVE
1366 res = pipe(fds);
1367 END_SAVE
1368 if (res != 0)
1369 return posix_error();
1370 return mkvalue("(ii)", fds[0], fds[1]);
Guido van Rossum794d8131994-08-23 13:48:48 +00001371#else /* NT */
1372 HANDLE read, write;
1373 BOOL ok;
1374 if (!getargs(args, ""))
1375 return NULL;
1376 BGN_SAVE
1377 ok = CreatePipe( &read, &write, NULL, 0);
1378 END_SAVE
1379 if (!ok)
1380 return posix_error();
1381 return mkvalue("(ii)", read, write);
1382#endif /* NT */
Guido van Rossum687dd131993-05-17 08:34:16 +00001383}
Guido van Rossum22db57e1992-04-05 14:25:30 +00001384
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001385static struct methodlist posix_methods[] = {
1386 {"chdir", posix_chdir},
1387 {"chmod", posix_chmod},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001388#ifdef HAVE_CHOWN
1389 {"chown", posix_chown},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001390#endif /* HAVE_CHOWN */
Guido van Rossum36bc6801995-06-14 22:54:23 +00001391#ifdef HAVE_GETCWD
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001392 {"getcwd", posix_getcwd},
Guido van Rossum36bc6801995-06-14 22:54:23 +00001393#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +00001394#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001395 {"link", posix_link},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001396#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001397 {"listdir", posix_listdir},
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001398 {"lstat", posix_lstat},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001399 {"mkdir", posix_mkdir},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001400#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +00001401 {"nice", posix_nice},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001402#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001403#ifdef HAVE_READLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001404 {"readlink", posix_readlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001405#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001406 {"rename", posix_rename},
1407 {"rmdir", posix_rmdir},
1408 {"stat", posix_stat},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001409#ifdef HAVE_SYMLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001410 {"symlink", posix_symlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001411#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001412 {"system", posix_system},
1413 {"umask", posix_umask},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001414#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001415 {"uname", posix_uname},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001416#endif /* HAVE_UNAME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001417 {"unlink", posix_unlink},
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001418 {"utime", posix_utime},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001419#ifdef HAVE_TIMES
Guido van Rossum22db57e1992-04-05 14:25:30 +00001420 {"times", posix_times},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001421#endif /* HAVE_TIMES */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001422 {"_exit", posix__exit},
Guido van Rossum89b33251993-10-22 14:26:06 +00001423 {"execv", posix_execv},
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001424 {"execve", posix_execve},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001425#ifdef HAVE_FORK
Guido van Rossum85e3b011991-06-03 12:42:10 +00001426 {"fork", posix_fork},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001427#endif /* HAVE_FORK */
1428#ifdef HAVE_GETEGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001429 {"getegid", posix_getegid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001430#endif /* HAVE_GETEGID */
1431#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001432 {"geteuid", posix_geteuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001433#endif /* HAVE_GETEUID */
1434#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001435 {"getgid", posix_getgid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001436#endif /* HAVE_GETGID */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001437 {"getpid", posix_getpid},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001438#ifdef HAVE_GETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001439 {"getpgrp", posix_getpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001440#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001441#ifdef HAVE_GETPPID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001442 {"getppid", posix_getppid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001443#endif /* HAVE_GETPPID */
1444#ifdef HAVE_GETUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001445 {"getuid", posix_getuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001446#endif /* HAVE_GETUID */
1447#ifdef HAVE_KILL
Guido van Rossum85e3b011991-06-03 12:42:10 +00001448 {"kill", posix_kill},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001449#endif /* HAVE_KILL */
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001450 {"popen", posix_popen, 1},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001451#ifdef HAVE_SETUID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001452 {"setuid", posix_setuid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001453#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001454#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001455 {"setgid", posix_setgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001456#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001457#ifdef HAVE_SETPGRP
Guido van Rossumc2670a01992-09-13 20:07:29 +00001458 {"setpgrp", posix_setpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001459#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001460#ifdef HAVE_WAIT
Guido van Rossum85e3b011991-06-03 12:42:10 +00001461 {"wait", posix_wait},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001462#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001463#ifdef HAVE_WAITPID
Guido van Rossum21803b81992-08-09 12:55:27 +00001464 {"waitpid", posix_waitpid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001465#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001466#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001467 {"setsid", posix_setsid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001468#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001469#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001470 {"setpgid", posix_setpgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001471#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001472#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001473 {"tcgetpgrp", posix_tcgetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001474#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001475#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001476 {"tcsetpgrp", posix_tcsetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001477#endif /* HAVE_TCSETPGRP */
Guido van Rossum687dd131993-05-17 08:34:16 +00001478 {"open", posix_open},
1479 {"close", posix_close},
1480 {"dup", posix_dup},
1481 {"dup2", posix_dup2},
1482 {"lseek", posix_lseek},
1483 {"read", posix_read},
1484 {"write", posix_write},
1485 {"fstat", posix_fstat},
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001486 {"fdopen", posix_fdopen, 1},
Guido van Rossum687dd131993-05-17 08:34:16 +00001487 {"pipe", posix_pipe},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001488 {NULL, NULL} /* Sentinel */
1489};
1490
1491
Guido van Rossumb6775db1994-08-01 11:34:53 +00001492#ifdef NT
1493void
1494initnt()
1495{
1496 object *m, *d, *v;
1497
1498 m = initmodule("nt", posix_methods);
1499 d = getmoduledict(m);
1500
1501 /* Initialize nt.environ dictionary */
1502 v = convertenviron();
1503 if (v == NULL || dictinsert(d, "environ", v) != 0)
1504 fatal("can't define nt.environ");
1505 DECREF(v);
1506
1507 /* Initialize nt.error exception */
1508 PosixError = newstringobject("nt.error");
1509 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1510 fatal("can't define nt.error");
1511}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001512#else /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001513void
1514initposix()
1515{
1516 object *m, *d, *v;
1517
1518 m = initmodule("posix", posix_methods);
1519 d = getmoduledict(m);
1520
1521 /* Initialize posix.environ dictionary */
1522 v = convertenviron();
1523 if (v == NULL || dictinsert(d, "environ", v) != 0)
1524 fatal("can't define posix.environ");
1525 DECREF(v);
1526
Guido van Rossumde4e1241995-03-30 10:56:54 +00001527#ifdef WNOHANG
1528 /* Export WNOHANG symbol */
1529 v = newintobject((long)WNOHANG);
1530 if (v == NULL || dictinsert(d, "WNOHANG", v) != 0)
1531 fatal("can't define posix.WNOHANG");
1532 DECREF(v);
1533#endif
1534
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001535 /* Initialize posix.error exception */
1536 PosixError = newstringobject("posix.error");
1537 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1538 fatal("can't define posix.error");
1539}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001540#endif /* !NT */