blob: 38615283cd5316766ea9df9e6f397a27edd8f95d [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 Rossumb6775db1994-08-01 11:34:53 +000044
45#include "mytime.h" /* For clock_t on some systems */
46
47#ifdef HAVE_FCNTL_H
48#include <fcntl.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000049#endif /* HAVE_FCNTL_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +000050
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000051#ifndef NT
Guido van Rossumad0ee831995-03-01 10:34:45 +000052#define HAVE_FORK 1
53#endif
54
55#if !defined(NT) || defined(__BORLANDC__)
56/* Unix functions that the configure script doesn't check for
57 and that aren't easily available under NT except with Borland C */
58#define HAVE_GETEGID 1
59#define HAVE_GETEUID 1
60#define HAVE_GETGID 1
61#define HAVE_GETPPID 1
62#define HAVE_GETUID 1
63#define HAVE_KILL 1
64#define HAVE_WAIT 1
Guido van Rossum6f4f5f71995-03-10 15:14:41 +000065#define HAVE_OPENDIR 1
66#define HAVE_PIPE 1
Guido van Rossumad0ee831995-03-01 10:34:45 +000067#endif
68
69#ifndef NT
Guido van Rossumb6775db1994-08-01 11:34:53 +000070#ifdef HAVE_UNISTD_H
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000071#include <unistd.h>
Guido van Rossumad0ee831995-03-01 10:34:45 +000072/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
73extern int rename();
74extern int pclose();
75extern int lstat();
76extern int symlink();
Guido van Rossumb6775db1994-08-01 11:34:53 +000077#else /* !HAVE_UNISTD_H */
Guido van Rossuma2b7f401993-01-04 09:09:59 +000078extern int mkdir PROTO((const char *, mode_t));
79extern int chdir PROTO((const char *));
Guido van Rossume22e6441993-07-09 10:51:31 +000080extern int rmdir PROTO((const char *));
81extern int chmod PROTO((const char *, mode_t));
Guido van Rossumb6775db1994-08-01 11:34:53 +000082extern int chown PROTO((const char *, uid_t, gid_t));
83extern char *getcwd PROTO((char *, int));
Guido van Rossume22e6441993-07-09 10:51:31 +000084extern char *strerror PROTO((int));
Guido van Rossuma2b7f401993-01-04 09:09:59 +000085extern int link PROTO((const char *, const char *));
86extern int rename PROTO((const char *, const char *));
Guido van Rossuma2b7f401993-01-04 09:09:59 +000087extern int stat PROTO((const char *, struct stat *));
88extern int unlink PROTO((const char *));
89extern int pclose PROTO((FILE *));
Guido van Rossumb6775db1994-08-01 11:34:53 +000090#ifdef HAVE_SYMLINK
Guido van Rossuma2b7f401993-01-04 09:09:59 +000091extern int symlink PROTO((const char *, const char *));
Guido van Rossuma38a5031995-02-17 15:11:36 +000092#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +000093#ifdef HAVE_LSTAT
94extern int lstat PROTO((const char *, struct stat *));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000095#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +000096#endif /* !HAVE_UNISTD_H */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000097#endif /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098
Guido van Rossumb6775db1994-08-01 11:34:53 +000099#ifdef HAVE_UTIME_H
100#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000101#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000102
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000103#ifdef HAVE_SYS_UTIME_H
104#include <sys/utime.h>
105#define HAVE_UTIME_H /* pretend we do for the rest of this file */
106#endif /* HAVE_SYS_UTIME_H */
107
Guido van Rossumb6775db1994-08-01 11:34:53 +0000108#ifdef HAVE_SYS_TIMES_H
109#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000110#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000111
112#ifdef HAVE_SYS_PARAM_H
113#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000114#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000115
116#ifdef HAVE_SYS_UTSNAME_H
117#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000118#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000119
120#ifndef MAXPATHLEN
121#define MAXPATHLEN 1024
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000122#endif /* MAXPATHLEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000123
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000124#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000125#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000126#define NAMLEN(dirent) strlen((dirent)->d_name)
127#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000128#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000129#define NAMLEN(dirent) (dirent)->d_namlen
130#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000131#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000132#endif
133#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000134#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000135#endif
136#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000137#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000138#endif
139#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000140
141#ifdef NT
142#include <direct.h>
143#include <io.h>
144#include <process.h>
145#include <windows.h>
146#define popen _popen
Guido van Rossum794d8131994-08-23 13:48:48 +0000147#define pclose _pclose
Guido van Rossumb6775db1994-08-01 11:34:53 +0000148#endif /* NT */
149
150#ifdef OS2
151#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000152#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153
154/* Return a dictionary corresponding to the POSIX environment table */
155
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000156#ifndef NT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157extern char **environ;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000158#endif /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159
160static object *
161convertenviron()
162{
163 object *d;
164 char **e;
165 d = newdictobject();
166 if (d == NULL)
167 return NULL;
168 if (environ == NULL)
169 return d;
170 /* XXX This part ignores errors */
171 for (e = environ; *e != NULL; e++) {
172 object *v;
173 char *p = strchr(*e, '=');
174 if (p == NULL)
175 continue;
176 v = newstringobject(p+1);
177 if (v == NULL)
178 continue;
179 *p = '\0';
180 (void) dictinsert(d, *e, v);
181 *p = '=';
182 DECREF(v);
183 }
184 return d;
185}
186
187
188static object *PosixError; /* Exception posix.error */
189
190/* Set a POSIX-specific error from errno, and return NULL */
191
Guido van Rossumad0ee831995-03-01 10:34:45 +0000192static object * posix_error()
193{
194 return err_errno(PosixError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195}
196
197
198/* POSIX generic methods */
199
200static object *
201posix_1str(args, func)
202 object *args;
203 int (*func) FPROTO((const char *));
204{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000205 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000206 int res;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000207 if (!getargs(args, "s", &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000209 BGN_SAVE
210 res = (*func)(path1);
211 END_SAVE
212 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000213 return posix_error();
214 INCREF(None);
215 return None;
216}
217
218static object *
219posix_2str(args, func)
220 object *args;
221 int (*func) FPROTO((const char *, const char *));
222{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000223 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000224 int res;
Guido van Rossum234f9421993-06-17 12:35:49 +0000225 if (!getargs(args, "(ss)", &path1, &path2))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000227 BGN_SAVE
228 res = (*func)(path1, path2);
229 END_SAVE
230 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231 return posix_error();
232 INCREF(None);
233 return None;
234}
235
236static object *
237posix_strint(args, func)
238 object *args;
239 int (*func) FPROTO((const char *, int));
240{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000241 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000243 int res;
Guido van Rossum234f9421993-06-17 12:35:49 +0000244 if (!getargs(args, "(si)", &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000246 BGN_SAVE
247 res = (*func)(path, i);
248 END_SAVE
249 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250 return posix_error();
251 INCREF(None);
252 return None;
253}
254
255static object *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000256posix_strintint(args, func)
257 object *args;
258 int (*func) FPROTO((const char *, int, int));
259{
260 char *path;
261 int i,i2;
262 int res;
263 if (!getargs(args, "(sii)", &path, &i, &i2))
264 return NULL;
265 BGN_SAVE
266 res = (*func)(path, i, i2);
267 END_SAVE
268 if (res < 0)
269 return posix_error();
270 INCREF(None);
271 return None;
272}
273
274static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275posix_do_stat(self, args, statfunc)
276 object *self;
277 object *args;
278 int (*statfunc) FPROTO((const char *, struct stat *));
279{
280 struct stat st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000281 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000282 int res;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000283 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000284 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000285 BGN_SAVE
286 res = (*statfunc)(path, &st);
287 END_SAVE
288 if (res != 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289 return posix_error();
Guido van Rossum687dd131993-05-17 08:34:16 +0000290 return mkvalue("(llllllllll)",
Guido van Rossume5372401993-03-16 12:15:04 +0000291 (long)st.st_mode,
292 (long)st.st_ino,
293 (long)st.st_dev,
294 (long)st.st_nlink,
295 (long)st.st_uid,
296 (long)st.st_gid,
297 (long)st.st_size,
298 (long)st.st_atime,
299 (long)st.st_mtime,
300 (long)st.st_ctime);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000301}
302
303
304/* POSIX methods */
305
306static object *
307posix_chdir(self, args)
308 object *self;
309 object *args;
310{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311 return posix_1str(args, chdir);
312}
313
314static object *
315posix_chmod(self, args)
316 object *self;
317 object *args;
318{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319 return posix_strint(args, chmod);
320}
321
Guido van Rossumb6775db1994-08-01 11:34:53 +0000322#ifdef HAVE_CHOWN
323static object *
324posix_chown(self, args)
325 object *self;
326 object *args;
327{
328 return posix_strintint(args, chown);
329}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000330#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000331
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332static object *
333posix_getcwd(self, args)
334 object *self;
335 object *args;
336{
337 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000338 char *res;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000339 if (!getnoarg(args))
340 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000341 BGN_SAVE
342 res = getcwd(buf, sizeof buf);
343 END_SAVE
344 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345 return posix_error();
346 return newstringobject(buf);
347}
348
Guido van Rossumb6775db1994-08-01 11:34:53 +0000349#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000350static object *
351posix_link(self, args)
352 object *self;
353 object *args;
354{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355 return posix_2str(args, link);
356}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000357#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358
Guido van Rossumb6775db1994-08-01 11:34:53 +0000359static object *
360posix_listdir(self, args)
361 object *self;
362 object *args;
363{
Guido van Rossum6f4f5f71995-03-10 15:14:41 +0000364#if defined(NT) && !defined(HAVE_OPENDIR)
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000365
Guido van Rossumb6775db1994-08-01 11:34:53 +0000366 char *name;
367 int len;
368 object *d, *v;
369 HANDLE hFindFile;
370 WIN32_FIND_DATA FileData;
371 char namebuf[MAX_PATH+5];
372
373 if (!getargs(args, "s#", &name, &len))
374 return NULL;
375 if (len >= MAX_PATH) {
376 err_setstr(ValueError, "path too long");
377 return NULL;
378 }
379 strcpy(namebuf, name);
380 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
381 namebuf[len++] = '/';
382 strcpy(namebuf + len, "*.*");
383
384 if ((d = newlistobject(0)) == NULL)
385 return NULL;
386
387 hFindFile = FindFirstFile(namebuf, &FileData);
388 if (hFindFile == INVALID_HANDLE_VALUE) {
389 errno = GetLastError();
390 return posix_error();
391 }
392 do {
393 v = newstringobject(FileData.cFileName);
394 if (v == NULL) {
395 DECREF(d);
396 d = NULL;
397 break;
398 }
399 if (addlistitem(d, v) != 0) {
400 DECREF(v);
401 DECREF(d);
402 d = NULL;
403 break;
404 }
405 DECREF(v);
406 } while (FindNextFile(hFindFile, &FileData) == TRUE);
407
408 if (FindClose(hFindFile) == FALSE) {
409 errno = GetLastError();
410 return posix_error();
411 }
412
413 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000414
415#else /* !NT */
416
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000417 char *name;
418 object *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000419 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000420 struct dirent *ep;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000421 if (!getargs(args, "s", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000423 BGN_SAVE
424 if ((dirp = opendir(name)) == NULL) {
425 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426 return posix_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000427 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000428 if ((d = newlistobject(0)) == NULL) {
429 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000430 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431 return NULL;
432 }
433 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000434 v = newsizedstringobject(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000435 if (v == NULL) {
436 DECREF(d);
437 d = NULL;
438 break;
439 }
440 if (addlistitem(d, v) != 0) {
441 DECREF(v);
442 DECREF(d);
443 d = NULL;
444 break;
445 }
446 DECREF(v);
447 }
448 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000449 END_SAVE
Guido van Rossum0ee42cd1991-04-08 21:01:03 +0000450
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000451 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000452
453#endif /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454}
455
456static object *
457posix_mkdir(self, args)
458 object *self;
459 object *args;
460{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000461 return posix_strint(args, mkdir);
462}
463
Guido van Rossumb6775db1994-08-01 11:34:53 +0000464#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +0000465static object *
466posix_nice(self, args)
467 object *self;
468 object *args;
469{
470 int increment, value;
471
472 if (!getargs(args, "i", &increment))
473 return NULL;
474 value = nice(increment);
475 if (value == -1)
476 return posix_error();
477 return newintobject((long) value);
478}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000479#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000480
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000481static object *
482posix_rename(self, args)
483 object *self;
484 object *args;
485{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486 return posix_2str(args, rename);
487}
488
489static object *
490posix_rmdir(self, args)
491 object *self;
492 object *args;
493{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000494 return posix_1str(args, rmdir);
495}
496
497static object *
498posix_stat(self, args)
499 object *self;
500 object *args;
501{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000502 return posix_do_stat(self, args, stat);
503}
504
505static object *
506posix_system(self, args)
507 object *self;
508 object *args;
509{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000510 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000511 long sts;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000512 if (!getargs(args, "s", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000513 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000514 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000515 sts = system(command);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000516 END_SAVE
517 return newintobject(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000518}
519
520static object *
521posix_umask(self, args)
522 object *self;
523 object *args;
524{
525 int i;
526 if (!getintarg(args, &i))
527 return NULL;
528 i = umask(i);
529 if (i < 0)
530 return posix_error();
531 return newintobject((long)i);
532}
533
534static object *
535posix_unlink(self, args)
536 object *self;
537 object *args;
538{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000539 return posix_1str(args, unlink);
540}
541
Guido van Rossumb6775db1994-08-01 11:34:53 +0000542#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000543static object *
544posix_uname(self, args)
545 object *self;
546 object *args;
547{
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000548 struct utsname u;
549 object *v;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000550 int res;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000551 if (!getnoarg(args))
552 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000553 BGN_SAVE
554 res = uname(&u);
555 END_SAVE
556 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000557 return posix_error();
Guido van Rossume5372401993-03-16 12:15:04 +0000558 return mkvalue("(sssss)",
559 u.sysname,
560 u.nodename,
561 u.release,
562 u.version,
563 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000564}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000565#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000566
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000567static object *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000568posix_utime(self, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000569 object *self;
570 object *args;
571{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000572 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000573 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000574 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000575
Guido van Rossumb6775db1994-08-01 11:34:53 +0000576#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000577 struct utimbuf buf;
578#define ATIME buf.actime
579#define MTIME buf.modtime
580#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000581#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000582 time_t buf[2];
583#define ATIME buf[0]
584#define MTIME buf[1]
585#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000586#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000587
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000588 if (!getargs(args, "(s(ll))", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000589 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000590 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +0000591 MTIME = mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000592 BGN_SAVE
593 res = utime(path, UTIME_ARG);
594 END_SAVE
595 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000596 return posix_error();
597 INCREF(None);
598 return None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000599#undef UTIME_ARG
600#undef ATIME
601#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000602}
603
Guido van Rossum85e3b011991-06-03 12:42:10 +0000604
Guido van Rossum3b066191991-06-04 19:40:25 +0000605/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000606
607static object *
608posix__exit(self, args)
609 object *self;
610 object *args;
611{
612 int sts;
613 if (!getintarg(args, &sts))
614 return NULL;
615 _exit(sts);
616 /* NOTREACHED */
617}
618
Guido van Rossum85e3b011991-06-03 12:42:10 +0000619static object *
Guido van Rossum89b33251993-10-22 14:26:06 +0000620posix_execv(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +0000621 object *self;
622 object *args;
623{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000624 char *path;
625 object *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000626 char **argvlist;
627 int i, argc;
628 object *(*getitem) PROTO((object *, int));
629
Guido van Rossum89b33251993-10-22 14:26:06 +0000630 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +0000631 argv is a list or tuple of strings. */
632
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000633 if (!getargs(args, "(sO)", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000634 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000635 if (is_listobject(argv)) {
636 argc = getlistsize(argv);
637 getitem = getlistitem;
638 }
639 else if (is_tupleobject(argv)) {
640 argc = gettuplesize(argv);
641 getitem = gettupleitem;
642 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000643 else {
644 badarg:
645 err_badarg();
646 return NULL;
647 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000648
649 argvlist = NEW(char *, argc+1);
650 if (argvlist == NULL)
651 return NULL;
652 for (i = 0; i < argc; i++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000653 if (!getargs((*getitem)(argv, i), "s", &argvlist[i])) {
Guido van Rossum85e3b011991-06-03 12:42:10 +0000654 DEL(argvlist);
655 goto badarg;
656 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000657 }
658 argvlist[argc] = NULL;
659
Guido van Rossumb6775db1994-08-01 11:34:53 +0000660#ifdef BAD_EXEC_PROTOTYPES
661 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000662#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000663 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000664#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000665
Guido van Rossum85e3b011991-06-03 12:42:10 +0000666 /* If we get here it's definitely an error */
667
668 DEL(argvlist);
669 return posix_error();
670}
671
672static object *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000673posix_execve(self, args)
674 object *self;
675 object *args;
676{
677 char *path;
678 object *argv, *env;
679 char **argvlist;
680 char **envlist;
681 object *key, *val;
682 int i, pos, argc, envc;
683 object *(*getitem) PROTO((object *, int));
684
685 /* execve has three arguments: (path, argv, env), where
686 argv is a list or tuple of strings and env is a dictionary
687 like posix.environ. */
688
689 if (!getargs(args, "(sOO)", &path, &argv, &env))
690 return NULL;
691 if (is_listobject(argv)) {
692 argc = getlistsize(argv);
693 getitem = getlistitem;
694 }
695 else if (is_tupleobject(argv)) {
696 argc = gettuplesize(argv);
697 getitem = gettupleitem;
698 }
699 else {
700 err_setstr(TypeError, "argv must be tuple or list");
701 return NULL;
702 }
703 if (!is_dictobject(env)) {
704 err_setstr(TypeError, "env must be dictionary");
705 return NULL;
706 }
707
708 argvlist = NEW(char *, argc+1);
709 if (argvlist == NULL) {
710 err_nomem();
711 return NULL;
712 }
713 for (i = 0; i < argc; i++) {
714 if (!getargs((*getitem)(argv, i),
715 "s;argv must be list of strings",
716 &argvlist[i])) {
717 goto fail_1;
718 }
719 }
720 argvlist[argc] = NULL;
721
722 i = getmappingsize(env);
723 envlist = NEW(char *, i + 1);
724 if (envlist == NULL) {
725 err_nomem();
726 goto fail_1;
727 }
728 pos = 0;
729 envc = 0;
730 while (mappinggetnext(env, &pos, &key, &val)) {
731 char *p, *k, *v;
732 if (!getargs(key, "s;non-string key in env", &k) ||
733 !getargs(val, "s;non-string value in env", &v)) {
734 goto fail_2;
735 }
736 p = NEW(char, getstringsize(key) + getstringsize(val) + 2);
737 if (p == NULL) {
738 err_nomem();
739 goto fail_2;
740 }
741 sprintf(p, "%s=%s", k, v);
742 envlist[envc++] = p;
743 }
744 envlist[envc] = 0;
745
Guido van Rossumb6775db1994-08-01 11:34:53 +0000746
747#ifdef BAD_EXEC_PROTOTYPES
748 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000749#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000750 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000751#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000752
753 /* If we get here it's definitely an error */
754
755 (void) posix_error();
756
757 fail_2:
758 while (--envc >= 0)
759 DEL(envlist[envc]);
760 DEL(envlist);
761 fail_1:
762 DEL(argvlist);
763
764 return NULL;
765}
766
Guido van Rossumad0ee831995-03-01 10:34:45 +0000767#ifdef HAVE_FORK
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000768static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000769posix_fork(self, args)
770 object *self;
771 object *args;
772{
773 int pid;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000774 if (!getnoarg(args))
775 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000776 pid = fork();
777 if (pid == -1)
778 return posix_error();
779 return newintobject((long)pid);
780}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000781#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000782
Guido van Rossumad0ee831995-03-01 10:34:45 +0000783#ifdef HAVE_GETEGID
Guido van Rossum85e3b011991-06-03 12:42:10 +0000784static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000785posix_getegid(self, args)
786 object *self;
787 object *args;
788{
789 if (!getnoarg(args))
790 return NULL;
791 return newintobject((long)getegid());
792}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000793#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000794
Guido van Rossumad0ee831995-03-01 10:34:45 +0000795#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000796static object *
797posix_geteuid(self, args)
798 object *self;
799 object *args;
800{
801 if (!getnoarg(args))
802 return NULL;
803 return newintobject((long)geteuid());
804}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000805#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000806
Guido van Rossumad0ee831995-03-01 10:34:45 +0000807#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000808static object *
809posix_getgid(self, args)
810 object *self;
811 object *args;
812{
813 if (!getnoarg(args))
814 return NULL;
815 return newintobject((long)getgid());
816}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000817#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000818
819static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000820posix_getpid(self, args)
821 object *self;
822 object *args;
823{
Guido van Rossum04814471991-06-04 20:23:49 +0000824 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000825 return NULL;
826 return newintobject((long)getpid());
827}
828
Guido van Rossumb6775db1994-08-01 11:34:53 +0000829#ifdef HAVE_GETPGRP
Guido van Rossum85e3b011991-06-03 12:42:10 +0000830static object *
Guido van Rossum04814471991-06-04 20:23:49 +0000831posix_getpgrp(self, args)
832 object *self;
833 object *args;
834{
835 if (!getnoarg(args))
836 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000837#ifdef GETPGRP_HAVE_ARG
Guido van Rossum971443b1991-06-07 13:59:29 +0000838 return newintobject((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000839#else /* GETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000840 return newintobject((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000841#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +0000842}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000843#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +0000844
Guido van Rossumb6775db1994-08-01 11:34:53 +0000845#ifdef HAVE_SETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +0000846static object *
Guido van Rossumc2670a01992-09-13 20:07:29 +0000847posix_setpgrp(self, args)
848 object *self;
849 object *args;
850{
851 if (!getnoarg(args))
852 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +0000853#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +0000854 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +0000855#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000856 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +0000857#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +0000858 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +0000859 INCREF(None);
860 return None;
861}
862
Guido van Rossumb6775db1994-08-01 11:34:53 +0000863#endif /* HAVE_SETPGRP */
864
Guido van Rossumad0ee831995-03-01 10:34:45 +0000865#ifdef HAVE_GETPPID
Guido van Rossumc2670a01992-09-13 20:07:29 +0000866static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000867posix_getppid(self, args)
868 object *self;
869 object *args;
870{
Guido van Rossum04814471991-06-04 20:23:49 +0000871 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000872 return NULL;
873 return newintobject((long)getppid());
874}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000875#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000876
Guido van Rossumad0ee831995-03-01 10:34:45 +0000877#ifdef HAVE_GETUID
Guido van Rossum85e3b011991-06-03 12:42:10 +0000878static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000879posix_getuid(self, args)
880 object *self;
881 object *args;
882{
883 if (!getnoarg(args))
884 return NULL;
885 return newintobject((long)getuid());
886}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000887#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000888
Guido van Rossumad0ee831995-03-01 10:34:45 +0000889#ifdef HAVE_KILL
Guido van Rossum46003ff1992-05-15 11:05:24 +0000890static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000891posix_kill(self, args)
892 object *self;
893 object *args;
894{
895 int pid, sig;
Guido van Rossum234f9421993-06-17 12:35:49 +0000896 if (!getargs(args, "(ii)", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000897 return NULL;
898 if (kill(pid, sig) == -1)
899 return posix_error();
900 INCREF(None);
901 return None;
902}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000903#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000904
905static object *
Guido van Rossum3b066191991-06-04 19:40:25 +0000906posix_popen(self, args)
907 object *self;
908 object *args;
909{
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000910 char *name;
911 char *mode = "r";
912 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +0000913 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000914 object *f;
915 if (!newgetargs(args, "s|si", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +0000916 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000917 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000918 fp = popen(name, mode);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000919 END_SAVE
Guido van Rossum3b066191991-06-04 19:40:25 +0000920 if (fp == NULL)
921 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000922 f = newopenfileobject(fp, name, mode, pclose);
923 if (f != NULL)
924 setfilebufsize(f, bufsize);
925 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +0000926}
927
Guido van Rossumb6775db1994-08-01 11:34:53 +0000928#ifdef HAVE_SETUID
Guido van Rossum3b066191991-06-04 19:40:25 +0000929static object *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000930posix_setuid(self, args)
931 object *self;
932 object *args;
933{
934 int uid;
935 if (!getargs(args, "i", &uid))
936 return NULL;
937 if (setuid(uid) < 0)
938 return posix_error();
939 INCREF(None);
940 return None;
941}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000942#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000943
Guido van Rossumb6775db1994-08-01 11:34:53 +0000944#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000945static object *
946posix_setgid(self, args)
947 object *self;
948 object *args;
949{
950 int gid;
951 if (!getargs(args, "i", &gid))
952 return NULL;
953 if (setgid(gid) < 0)
954 return posix_error();
955 INCREF(None);
956 return None;
957}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000958#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000959
Guido van Rossumb6775db1994-08-01 11:34:53 +0000960#ifdef HAVE_WAITPID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000961static object *
Guido van Rossum21803b81992-08-09 12:55:27 +0000962posix_waitpid(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +0000963 object *self;
964 object *args;
965{
Guido van Rossum21803b81992-08-09 12:55:27 +0000966 int pid, options, sts;
967 if (!getargs(args, "(ii)", &pid, &options))
968 return NULL;
969 BGN_SAVE
970 pid = waitpid(pid, &sts, options);
971 END_SAVE
Guido van Rossum85e3b011991-06-03 12:42:10 +0000972 if (pid == -1)
973 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +0000974 else
975 return mkvalue("ii", pid, sts);
Guido van Rossum21803b81992-08-09 12:55:27 +0000976}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000977#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +0000978
Guido van Rossumad0ee831995-03-01 10:34:45 +0000979#ifdef HAVE_WAIT
Guido van Rossum21803b81992-08-09 12:55:27 +0000980static object *
981posix_wait(self, args)
982 object *self;
983 object *args;
984{
985 int pid, sts;
Guido van Rossum21803b81992-08-09 12:55:27 +0000986 BGN_SAVE
987 pid = wait(&sts);
988 END_SAVE
989 if (pid == -1)
990 return posix_error();
991 else
992 return mkvalue("ii", pid, sts);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000993}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000994#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000995
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000996static object *
997posix_lstat(self, args)
998 object *self;
999 object *args;
1000{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001001#ifdef HAVE_LSTAT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001002 return posix_do_stat(self, args, lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001003#else /* !HAVE_LSTAT */
1004 return posix_do_stat(self, args, stat);
1005#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001006}
1007
Guido van Rossumb6775db1994-08-01 11:34:53 +00001008#ifdef HAVE_READLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001009static object *
1010posix_readlink(self, args)
1011 object *self;
1012 object *args;
1013{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001014 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001015 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001016 int n;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001017 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001018 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001019 BGN_SAVE
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001020 n = readlink(path, buf, (int) sizeof buf);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001021 END_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001022 if (n < 0)
1023 return posix_error();
1024 return newsizedstringobject(buf, n);
1025}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001026#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001027
Guido van Rossumb6775db1994-08-01 11:34:53 +00001028#ifdef HAVE_SYMLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001029static object *
1030posix_symlink(self, args)
1031 object *self;
1032 object *args;
1033{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001034 return posix_2str(args, symlink);
1035}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001036#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001037
Guido van Rossumb6775db1994-08-01 11:34:53 +00001038#ifdef HAVE_TIMES
1039#ifndef HZ
1040#define HZ 60 /* Universal constant :-) */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001041#endif /* HZ */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001042static object *
1043posix_times(self, args)
1044 object *self;
1045 object *args;
1046{
1047 struct tms t;
1048 clock_t c;
Guido van Rossum22db57e1992-04-05 14:25:30 +00001049 if (!getnoarg(args))
1050 return NULL;
1051 errno = 0;
1052 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00001053 if (c == (clock_t) -1)
1054 return posix_error();
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001055 return mkvalue("dddd",
1056 (double)t.tms_utime / HZ,
1057 (double)t.tms_stime / HZ,
1058 (double)t.tms_cutime / HZ,
1059 (double)t.tms_cstime / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00001060}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001061#endif /* HAVE_TIMES */
Guido van Rossum6f4f5f71995-03-10 15:14:41 +00001062#if defined(NT) && !defined(HAVE_TIMES)
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001063#define HAVE_TIMES /* so the method table will pick it up */
1064static object *
1065posix_times(self, args)
1066 object *self;
1067 object *args;
1068{
1069 FILETIME create, exit, kernel, user;
1070 HANDLE hProc;
1071 if (!getnoarg(args))
1072 return NULL;
1073 hProc = GetCurrentProcess();
1074 GetProcessTimes(hProc,&create, &exit, &kernel, &user);
1075 return mkvalue("dddd",
1076 (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime) / 2E6,
1077 (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6,
1078 (double)0,
1079 (double)0);
1080}
1081#endif /* NT */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001082
Guido van Rossumb6775db1994-08-01 11:34:53 +00001083#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001084static object *
1085posix_setsid(self, args)
1086 object *self;
1087 object *args;
1088{
1089 if (!getnoarg(args))
1090 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001091 if (setsid() < 0)
1092 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001093 INCREF(None);
1094 return None;
1095}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001096#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001097
Guido van Rossumb6775db1994-08-01 11:34:53 +00001098#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001099static object *
1100posix_setpgid(self, args)
1101 object *self;
1102 object *args;
1103{
1104 int pid, pgrp;
1105 if (!getargs(args, "(ii)", &pid, &pgrp))
1106 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001107 if (setpgid(pid, pgrp) < 0)
1108 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001109 INCREF(None);
1110 return None;
1111}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001112#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001113
Guido van Rossumb6775db1994-08-01 11:34:53 +00001114#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001115static object *
1116posix_tcgetpgrp(self, args)
1117 object *self;
1118 object *args;
1119{
1120 int fd, pgid;
1121 if (!getargs(args, "i", &fd))
1122 return NULL;
1123 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001124 if (pgid < 0)
1125 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001126 return newintobject((long)pgid);
1127}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001128#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00001129
Guido van Rossumb6775db1994-08-01 11:34:53 +00001130#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001131static object *
1132posix_tcsetpgrp(self, args)
1133 object *self;
1134 object *args;
1135{
1136 int fd, pgid;
1137 if (!getargs(args, "(ii)", &fd, &pgid))
1138 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001139 if (tcsetpgrp(fd, pgid) < 0)
1140 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001141 INCREF(None);
1142 return None;
1143}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001144#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001145
Guido van Rossum687dd131993-05-17 08:34:16 +00001146/* Functions acting on file descriptors */
1147
Guido van Rossum234f9421993-06-17 12:35:49 +00001148static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001149posix_open(self, args)
1150 object *self;
1151 object *args;
1152{
1153 char *file;
1154 int flag;
1155 int mode = 0777;
1156 int fd;
1157 if (!getargs(args, "(si)", &file, &flag)) {
1158 err_clear();
1159 if (!getargs(args, "(sii)", &file, &flag, &mode))
1160 return NULL;
1161 }
1162 BGN_SAVE
1163 fd = open(file, flag, mode);
1164 END_SAVE
1165 if (fd < 0)
1166 return posix_error();
1167 return newintobject((long)fd);
1168}
1169
Guido van Rossum234f9421993-06-17 12:35:49 +00001170static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001171posix_close(self, args)
1172 object *self;
1173 object *args;
1174{
1175 int fd, res;
1176 if (!getargs(args, "i", &fd))
1177 return NULL;
1178 BGN_SAVE
1179 res = close(fd);
1180 END_SAVE
1181 if (res < 0)
1182 return posix_error();
1183 INCREF(None);
1184 return None;
1185}
1186
Guido van Rossum234f9421993-06-17 12:35:49 +00001187static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001188posix_dup(self, args)
1189 object *self;
1190 object *args;
1191{
1192 int fd;
1193 if (!getargs(args, "i", &fd))
1194 return NULL;
1195 BGN_SAVE
1196 fd = dup(fd);
1197 END_SAVE
1198 if (fd < 0)
1199 return posix_error();
1200 return newintobject((long)fd);
1201}
1202
Guido van Rossum234f9421993-06-17 12:35:49 +00001203static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001204posix_dup2(self, args)
1205 object *self;
1206 object *args;
1207{
1208 int fd, fd2, res;
1209 if (!getargs(args, "(ii)", &fd, &fd2))
1210 return NULL;
1211 BGN_SAVE
1212 res = dup2(fd, fd2);
1213 END_SAVE
1214 if (res < 0)
1215 return posix_error();
1216 INCREF(None);
1217 return None;
1218}
1219
Guido van Rossum234f9421993-06-17 12:35:49 +00001220static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001221posix_lseek(self, args)
1222 object *self;
1223 object *args;
1224{
1225 int fd, how;
1226 long pos, res;
1227 if (!getargs(args, "(ili)", &fd, &pos, &how))
1228 return NULL;
1229#ifdef SEEK_SET
1230 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
1231 switch (how) {
1232 case 0: how = SEEK_SET; break;
1233 case 1: how = SEEK_CUR; break;
1234 case 2: how = SEEK_END; break;
1235 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001236#endif /* SEEK_END */
Guido van Rossum687dd131993-05-17 08:34:16 +00001237 BGN_SAVE
1238 res = lseek(fd, pos, how);
1239 END_SAVE
1240 if (res < 0)
1241 return posix_error();
1242 return newintobject(res);
1243}
1244
Guido van Rossum234f9421993-06-17 12:35:49 +00001245static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001246posix_read(self, args)
1247 object *self;
1248 object *args;
1249{
1250 int fd, size;
1251 object *buffer;
1252 if (!getargs(args, "(ii)", &fd, &size))
1253 return NULL;
1254 buffer = newsizedstringobject((char *)NULL, size);
1255 if (buffer == NULL)
1256 return NULL;
1257 BGN_SAVE
1258 size = read(fd, getstringvalue(buffer), size);
1259 END_SAVE
1260 if (size < 0) {
1261 DECREF(buffer);
1262 return posix_error();
1263 }
1264 resizestring(&buffer, size);
1265 return buffer;
1266}
1267
Guido van Rossum234f9421993-06-17 12:35:49 +00001268static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001269posix_write(self, args)
1270 object *self;
1271 object *args;
1272{
1273 int fd, size;
1274 char *buffer;
1275 if (!getargs(args, "(is#)", &fd, &buffer, &size))
1276 return NULL;
1277 BGN_SAVE
1278 size = write(fd, buffer, size);
1279 END_SAVE
1280 if (size < 0)
1281 return posix_error();
1282 return newintobject((long)size);
1283}
1284
Guido van Rossum234f9421993-06-17 12:35:49 +00001285static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001286posix_fstat(self, args)
1287 object *self;
1288 object *args;
1289{
1290 int fd;
1291 struct stat st;
1292 int res;
1293 if (!getargs(args, "i", &fd))
1294 return NULL;
1295 BGN_SAVE
1296 res = fstat(fd, &st);
1297 END_SAVE
1298 if (res != 0)
1299 return posix_error();
1300 return mkvalue("(llllllllll)",
1301 (long)st.st_mode,
1302 (long)st.st_ino,
1303 (long)st.st_dev,
1304 (long)st.st_nlink,
1305 (long)st.st_uid,
1306 (long)st.st_gid,
1307 (long)st.st_size,
1308 (long)st.st_atime,
1309 (long)st.st_mtime,
1310 (long)st.st_ctime);
1311}
1312
1313static object *
1314posix_fdopen(self, args)
1315 object *self;
1316 object *args;
1317{
1318 extern int fclose PROTO((FILE *));
1319 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001320 char *mode = "r";
1321 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00001322 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001323 object *f;
1324 if (!newgetargs(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00001325 return NULL;
1326 BGN_SAVE
1327 fp = fdopen(fd, mode);
1328 END_SAVE
1329 if (fp == NULL)
1330 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001331 f = newopenfileobject(fp, "(fdopen)", mode, fclose);
1332 if (f != NULL)
1333 setfilebufsize(f, bufsize);
1334 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00001335}
1336
Guido van Rossum234f9421993-06-17 12:35:49 +00001337static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001338posix_pipe(self, args)
1339 object *self;
1340 object *args;
1341{
Guido van Rossum6f4f5f71995-03-10 15:14:41 +00001342#if !defined(NT) || defined(HAVE_PIPE)
Guido van Rossum687dd131993-05-17 08:34:16 +00001343 int fds[2];
1344 int res;
1345 if (!getargs(args, ""))
1346 return NULL;
1347 BGN_SAVE
1348 res = pipe(fds);
1349 END_SAVE
1350 if (res != 0)
1351 return posix_error();
1352 return mkvalue("(ii)", fds[0], fds[1]);
Guido van Rossum794d8131994-08-23 13:48:48 +00001353#else /* NT */
1354 HANDLE read, write;
1355 BOOL ok;
1356 if (!getargs(args, ""))
1357 return NULL;
1358 BGN_SAVE
1359 ok = CreatePipe( &read, &write, NULL, 0);
1360 END_SAVE
1361 if (!ok)
1362 return posix_error();
1363 return mkvalue("(ii)", read, write);
1364#endif /* NT */
Guido van Rossum687dd131993-05-17 08:34:16 +00001365}
Guido van Rossum22db57e1992-04-05 14:25:30 +00001366
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001367static struct methodlist posix_methods[] = {
1368 {"chdir", posix_chdir},
1369 {"chmod", posix_chmod},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001370#ifdef HAVE_CHOWN
1371 {"chown", posix_chown},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001372#endif /* HAVE_CHOWN */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001373 {"getcwd", posix_getcwd},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001374#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001375 {"link", posix_link},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001376#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001377 {"listdir", posix_listdir},
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001378 {"lstat", posix_lstat},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001379 {"mkdir", posix_mkdir},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001380#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +00001381 {"nice", posix_nice},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001382#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001383#ifdef HAVE_READLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001384 {"readlink", posix_readlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001385#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001386 {"rename", posix_rename},
1387 {"rmdir", posix_rmdir},
1388 {"stat", posix_stat},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001389#ifdef HAVE_SYMLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001390 {"symlink", posix_symlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001391#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001392 {"system", posix_system},
1393 {"umask", posix_umask},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001394#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001395 {"uname", posix_uname},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001396#endif /* HAVE_UNAME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001397 {"unlink", posix_unlink},
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001398 {"utime", posix_utime},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001399#ifdef HAVE_TIMES
Guido van Rossum22db57e1992-04-05 14:25:30 +00001400 {"times", posix_times},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001401#endif /* HAVE_TIMES */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001402 {"_exit", posix__exit},
Guido van Rossum89b33251993-10-22 14:26:06 +00001403 {"execv", posix_execv},
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001404 {"execve", posix_execve},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001405#ifdef HAVE_FORK
Guido van Rossum85e3b011991-06-03 12:42:10 +00001406 {"fork", posix_fork},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001407#endif /* HAVE_FORK */
1408#ifdef HAVE_GETEGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001409 {"getegid", posix_getegid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001410#endif /* HAVE_GETEGID */
1411#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001412 {"geteuid", posix_geteuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001413#endif /* HAVE_GETEUID */
1414#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001415 {"getgid", posix_getgid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001416#endif /* HAVE_GETGID */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001417 {"getpid", posix_getpid},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001418#ifdef HAVE_GETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001419 {"getpgrp", posix_getpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001420#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001421#ifdef HAVE_GETPPID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001422 {"getppid", posix_getppid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001423#endif /* HAVE_GETPPID */
1424#ifdef HAVE_GETUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001425 {"getuid", posix_getuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001426#endif /* HAVE_GETUID */
1427#ifdef HAVE_KILL
Guido van Rossum85e3b011991-06-03 12:42:10 +00001428 {"kill", posix_kill},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001429#endif /* HAVE_KILL */
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001430 {"popen", posix_popen, 1},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001431#ifdef HAVE_SETUID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001432 {"setuid", posix_setuid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001433#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001434#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001435 {"setgid", posix_setgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001436#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001437#ifdef HAVE_SETPGRP
Guido van Rossumc2670a01992-09-13 20:07:29 +00001438 {"setpgrp", posix_setpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001439#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001440#ifdef HAVE_WAIT
Guido van Rossum85e3b011991-06-03 12:42:10 +00001441 {"wait", posix_wait},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001442#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001443#ifdef HAVE_WAITPID
Guido van Rossum21803b81992-08-09 12:55:27 +00001444 {"waitpid", posix_waitpid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001445#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001446#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001447 {"setsid", posix_setsid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001448#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001449#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001450 {"setpgid", posix_setpgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001451#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001452#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001453 {"tcgetpgrp", posix_tcgetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001454#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001455#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001456 {"tcsetpgrp", posix_tcsetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001457#endif /* HAVE_TCSETPGRP */
Guido van Rossum687dd131993-05-17 08:34:16 +00001458 {"open", posix_open},
1459 {"close", posix_close},
1460 {"dup", posix_dup},
1461 {"dup2", posix_dup2},
1462 {"lseek", posix_lseek},
1463 {"read", posix_read},
1464 {"write", posix_write},
1465 {"fstat", posix_fstat},
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001466 {"fdopen", posix_fdopen, 1},
Guido van Rossum687dd131993-05-17 08:34:16 +00001467 {"pipe", posix_pipe},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001468 {NULL, NULL} /* Sentinel */
1469};
1470
1471
Guido van Rossumb6775db1994-08-01 11:34:53 +00001472#ifdef NT
1473void
1474initnt()
1475{
1476 object *m, *d, *v;
1477
1478 m = initmodule("nt", posix_methods);
1479 d = getmoduledict(m);
1480
1481 /* Initialize nt.environ dictionary */
1482 v = convertenviron();
1483 if (v == NULL || dictinsert(d, "environ", v) != 0)
1484 fatal("can't define nt.environ");
1485 DECREF(v);
1486
1487 /* Initialize nt.error exception */
1488 PosixError = newstringobject("nt.error");
1489 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1490 fatal("can't define nt.error");
1491}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001492#else /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001493void
1494initposix()
1495{
1496 object *m, *d, *v;
1497
1498 m = initmodule("posix", posix_methods);
1499 d = getmoduledict(m);
1500
1501 /* Initialize posix.environ dictionary */
1502 v = convertenviron();
1503 if (v == NULL || dictinsert(d, "environ", v) != 0)
1504 fatal("can't define posix.environ");
1505 DECREF(v);
1506
1507 /* Initialize posix.error exception */
1508 PosixError = newstringobject("posix.error");
1509 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1510 fatal("can't define posix.error");
1511}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001512#endif /* !NT */