blob: 76ba388f9f9da41e980623f65480a146ef44b412 [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
65#endif
66
67#ifndef NT
Guido van Rossumb6775db1994-08-01 11:34:53 +000068#ifdef HAVE_UNISTD_H
Guido van Rossum0b0db8e1993-01-21 16:07:51 +000069#include <unistd.h>
Guido van Rossumad0ee831995-03-01 10:34:45 +000070/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
71extern int rename();
72extern int pclose();
73extern int lstat();
74extern int symlink();
Guido van Rossumb6775db1994-08-01 11:34:53 +000075#else /* !HAVE_UNISTD_H */
Guido van Rossuma2b7f401993-01-04 09:09:59 +000076extern int mkdir PROTO((const char *, mode_t));
77extern int chdir PROTO((const char *));
Guido van Rossume22e6441993-07-09 10:51:31 +000078extern int rmdir PROTO((const char *));
79extern int chmod PROTO((const char *, mode_t));
Guido van Rossumb6775db1994-08-01 11:34:53 +000080extern int chown PROTO((const char *, uid_t, gid_t));
81extern char *getcwd PROTO((char *, int));
Guido van Rossume22e6441993-07-09 10:51:31 +000082extern char *strerror PROTO((int));
Guido van Rossuma2b7f401993-01-04 09:09:59 +000083extern int link PROTO((const char *, const char *));
84extern int rename PROTO((const char *, const char *));
Guido van Rossuma2b7f401993-01-04 09:09:59 +000085extern int stat PROTO((const char *, struct stat *));
86extern int unlink PROTO((const char *));
87extern int pclose PROTO((FILE *));
Guido van Rossumb6775db1994-08-01 11:34:53 +000088#ifdef HAVE_SYMLINK
Guido van Rossuma2b7f401993-01-04 09:09:59 +000089extern int symlink PROTO((const char *, const char *));
Guido van Rossuma38a5031995-02-17 15:11:36 +000090#endif /* HAVE_SYMLINK */
Guido van Rossumb6775db1994-08-01 11:34:53 +000091#ifdef HAVE_LSTAT
92extern int lstat PROTO((const char *, struct stat *));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000093#endif /* HAVE_LSTAT */
Guido van Rossumb6775db1994-08-01 11:34:53 +000094#endif /* !HAVE_UNISTD_H */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000095#endif /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096
Guido van Rossumb6775db1994-08-01 11:34:53 +000097#ifdef HAVE_UTIME_H
98#include <utime.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +000099#endif /* HAVE_UTIME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000100
Guido van Rossum14ed0b21994-09-29 09:50:09 +0000101#ifdef HAVE_SYS_UTIME_H
102#include <sys/utime.h>
103#define HAVE_UTIME_H /* pretend we do for the rest of this file */
104#endif /* HAVE_SYS_UTIME_H */
105
Guido van Rossumb6775db1994-08-01 11:34:53 +0000106#ifdef HAVE_SYS_TIMES_H
107#include <sys/times.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000108#endif /* HAVE_SYS_TIMES_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000109
110#ifdef HAVE_SYS_PARAM_H
111#include <sys/param.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000112#endif /* HAVE_SYS_PARAM_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000113
114#ifdef HAVE_SYS_UTSNAME_H
115#include <sys/utsname.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000116#endif /* HAVE_SYS_UTSNAME_H */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000117
118#ifndef MAXPATHLEN
119#define MAXPATHLEN 1024
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000120#endif /* MAXPATHLEN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000121
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000122#ifdef HAVE_DIRENT_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000123#include <dirent.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000124#define NAMLEN(dirent) strlen((dirent)->d_name)
125#else
Guido van Rossumb6775db1994-08-01 11:34:53 +0000126#define dirent direct
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000127#define NAMLEN(dirent) (dirent)->d_namlen
128#ifdef HAVE_SYS_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000129#include <sys/ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000130#endif
131#ifdef HAVE_SYS_DIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000132#include <sys/dir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000133#endif
134#ifdef HAVE_NDIR_H
Guido van Rossumb6775db1994-08-01 11:34:53 +0000135#include <ndir.h>
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000136#endif
137#endif
Guido van Rossumb6775db1994-08-01 11:34:53 +0000138
139#ifdef NT
140#include <direct.h>
141#include <io.h>
142#include <process.h>
143#include <windows.h>
144#define popen _popen
Guido van Rossum794d8131994-08-23 13:48:48 +0000145#define pclose _pclose
Guido van Rossumb6775db1994-08-01 11:34:53 +0000146#endif /* NT */
147
148#ifdef OS2
149#include <io.h>
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000150#endif /* OS2 */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151
152/* Return a dictionary corresponding to the POSIX environment table */
153
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000154#ifndef NT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000155extern char **environ;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000156#endif /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157
158static object *
159convertenviron()
160{
161 object *d;
162 char **e;
163 d = newdictobject();
164 if (d == NULL)
165 return NULL;
166 if (environ == NULL)
167 return d;
168 /* XXX This part ignores errors */
169 for (e = environ; *e != NULL; e++) {
170 object *v;
171 char *p = strchr(*e, '=');
172 if (p == NULL)
173 continue;
174 v = newstringobject(p+1);
175 if (v == NULL)
176 continue;
177 *p = '\0';
178 (void) dictinsert(d, *e, v);
179 *p = '=';
180 DECREF(v);
181 }
182 return d;
183}
184
185
186static object *PosixError; /* Exception posix.error */
187
188/* Set a POSIX-specific error from errno, and return NULL */
189
Guido van Rossumad0ee831995-03-01 10:34:45 +0000190static object * posix_error()
191{
192 return err_errno(PosixError);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193}
194
195
196/* POSIX generic methods */
197
198static object *
199posix_1str(args, func)
200 object *args;
201 int (*func) FPROTO((const char *));
202{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000203 char *path1;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000204 int res;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000205 if (!getargs(args, "s", &path1))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000206 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000207 BGN_SAVE
208 res = (*func)(path1);
209 END_SAVE
210 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211 return posix_error();
212 INCREF(None);
213 return None;
214}
215
216static object *
217posix_2str(args, func)
218 object *args;
219 int (*func) FPROTO((const char *, const char *));
220{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000221 char *path1, *path2;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000222 int res;
Guido van Rossum234f9421993-06-17 12:35:49 +0000223 if (!getargs(args, "(ss)", &path1, &path2))
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, path2);
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_strint(args, func)
236 object *args;
237 int (*func) FPROTO((const char *, int));
238{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000239 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000240 int i;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000241 int res;
Guido van Rossum234f9421993-06-17 12:35:49 +0000242 if (!getargs(args, "(si)", &path, &i))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000243 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000244 BGN_SAVE
245 res = (*func)(path, i);
246 END_SAVE
247 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248 return posix_error();
249 INCREF(None);
250 return None;
251}
252
253static object *
Guido van Rossumb6775db1994-08-01 11:34:53 +0000254posix_strintint(args, func)
255 object *args;
256 int (*func) FPROTO((const char *, int, int));
257{
258 char *path;
259 int i,i2;
260 int res;
261 if (!getargs(args, "(sii)", &path, &i, &i2))
262 return NULL;
263 BGN_SAVE
264 res = (*func)(path, i, i2);
265 END_SAVE
266 if (res < 0)
267 return posix_error();
268 INCREF(None);
269 return None;
270}
271
272static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000273posix_do_stat(self, args, statfunc)
274 object *self;
275 object *args;
276 int (*statfunc) FPROTO((const char *, struct stat *));
277{
278 struct stat st;
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000279 char *path;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000280 int res;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000281 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000283 BGN_SAVE
284 res = (*statfunc)(path, &st);
285 END_SAVE
286 if (res != 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000287 return posix_error();
Guido van Rossum687dd131993-05-17 08:34:16 +0000288 return mkvalue("(llllllllll)",
Guido van Rossume5372401993-03-16 12:15:04 +0000289 (long)st.st_mode,
290 (long)st.st_ino,
291 (long)st.st_dev,
292 (long)st.st_nlink,
293 (long)st.st_uid,
294 (long)st.st_gid,
295 (long)st.st_size,
296 (long)st.st_atime,
297 (long)st.st_mtime,
298 (long)st.st_ctime);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299}
300
301
302/* POSIX methods */
303
304static object *
305posix_chdir(self, args)
306 object *self;
307 object *args;
308{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309 return posix_1str(args, chdir);
310}
311
312static object *
313posix_chmod(self, args)
314 object *self;
315 object *args;
316{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000317 return posix_strint(args, chmod);
318}
319
Guido van Rossumb6775db1994-08-01 11:34:53 +0000320#ifdef HAVE_CHOWN
321static object *
322posix_chown(self, args)
323 object *self;
324 object *args;
325{
326 return posix_strintint(args, chown);
327}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000328#endif /* HAVE_CHOWN */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000329
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000330static object *
331posix_getcwd(self, args)
332 object *self;
333 object *args;
334{
335 char buf[1026];
Guido van Rossumff4949e1992-08-05 19:58:53 +0000336 char *res;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000337 if (!getnoarg(args))
338 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000339 BGN_SAVE
340 res = getcwd(buf, sizeof buf);
341 END_SAVE
342 if (res == NULL)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343 return posix_error();
344 return newstringobject(buf);
345}
346
Guido van Rossumb6775db1994-08-01 11:34:53 +0000347#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000348static object *
349posix_link(self, args)
350 object *self;
351 object *args;
352{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353 return posix_2str(args, link);
354}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000355#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000356
Guido van Rossumb6775db1994-08-01 11:34:53 +0000357static object *
358posix_listdir(self, args)
359 object *self;
360 object *args;
361{
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000362#ifdef NT
363
Guido van Rossumb6775db1994-08-01 11:34:53 +0000364 char *name;
365 int len;
366 object *d, *v;
367 HANDLE hFindFile;
368 WIN32_FIND_DATA FileData;
369 char namebuf[MAX_PATH+5];
370
371 if (!getargs(args, "s#", &name, &len))
372 return NULL;
373 if (len >= MAX_PATH) {
374 err_setstr(ValueError, "path too long");
375 return NULL;
376 }
377 strcpy(namebuf, name);
378 if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
379 namebuf[len++] = '/';
380 strcpy(namebuf + len, "*.*");
381
382 if ((d = newlistobject(0)) == NULL)
383 return NULL;
384
385 hFindFile = FindFirstFile(namebuf, &FileData);
386 if (hFindFile == INVALID_HANDLE_VALUE) {
387 errno = GetLastError();
388 return posix_error();
389 }
390 do {
391 v = newstringobject(FileData.cFileName);
392 if (v == NULL) {
393 DECREF(d);
394 d = NULL;
395 break;
396 }
397 if (addlistitem(d, v) != 0) {
398 DECREF(v);
399 DECREF(d);
400 d = NULL;
401 break;
402 }
403 DECREF(v);
404 } while (FindNextFile(hFindFile, &FileData) == TRUE);
405
406 if (FindClose(hFindFile) == FALSE) {
407 errno = GetLastError();
408 return posix_error();
409 }
410
411 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000412
413#else /* !NT */
414
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000415 char *name;
416 object *d, *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000417 DIR *dirp;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000418 struct dirent *ep;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000419 if (!getargs(args, "s", &name))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000421 BGN_SAVE
422 if ((dirp = opendir(name)) == NULL) {
423 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424 return posix_error();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000425 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426 if ((d = newlistobject(0)) == NULL) {
427 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000428 RET_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000429 return NULL;
430 }
431 while ((ep = readdir(dirp)) != NULL) {
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000432 v = newsizedstringobject(ep->d_name, NAMLEN(ep));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000433 if (v == NULL) {
434 DECREF(d);
435 d = NULL;
436 break;
437 }
438 if (addlistitem(d, v) != 0) {
439 DECREF(v);
440 DECREF(d);
441 d = NULL;
442 break;
443 }
444 DECREF(v);
445 }
446 closedir(dirp);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000447 END_SAVE
Guido van Rossum0ee42cd1991-04-08 21:01:03 +0000448
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000449 return d;
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000450
451#endif /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452}
453
454static object *
455posix_mkdir(self, args)
456 object *self;
457 object *args;
458{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459 return posix_strint(args, mkdir);
460}
461
Guido van Rossumb6775db1994-08-01 11:34:53 +0000462#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +0000463static object *
464posix_nice(self, args)
465 object *self;
466 object *args;
467{
468 int increment, value;
469
470 if (!getargs(args, "i", &increment))
471 return NULL;
472 value = nice(increment);
473 if (value == -1)
474 return posix_error();
475 return newintobject((long) value);
476}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000477#endif /* HAVE_NICE */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000478
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000479static object *
480posix_rename(self, args)
481 object *self;
482 object *args;
483{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000484 return posix_2str(args, rename);
485}
486
487static object *
488posix_rmdir(self, args)
489 object *self;
490 object *args;
491{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000492 return posix_1str(args, rmdir);
493}
494
495static object *
496posix_stat(self, args)
497 object *self;
498 object *args;
499{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000500 return posix_do_stat(self, args, stat);
501}
502
503static object *
504posix_system(self, args)
505 object *self;
506 object *args;
507{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000508 char *command;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000509 long sts;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000510 if (!getargs(args, "s", &command))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000511 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000512 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000513 sts = system(command);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000514 END_SAVE
515 return newintobject(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000516}
517
518static object *
519posix_umask(self, args)
520 object *self;
521 object *args;
522{
523 int i;
524 if (!getintarg(args, &i))
525 return NULL;
526 i = umask(i);
527 if (i < 0)
528 return posix_error();
529 return newintobject((long)i);
530}
531
532static object *
533posix_unlink(self, args)
534 object *self;
535 object *args;
536{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000537 return posix_1str(args, unlink);
538}
539
Guido van Rossumb6775db1994-08-01 11:34:53 +0000540#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000541static object *
542posix_uname(self, args)
543 object *self;
544 object *args;
545{
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000546 struct utsname u;
547 object *v;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000548 int res;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000549 if (!getnoarg(args))
550 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000551 BGN_SAVE
552 res = uname(&u);
553 END_SAVE
554 if (res < 0)
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000555 return posix_error();
Guido van Rossume5372401993-03-16 12:15:04 +0000556 return mkvalue("(sssss)",
557 u.sysname,
558 u.nodename,
559 u.release,
560 u.version,
561 u.machine);
Guido van Rossumc39de5f1992-02-05 11:15:54 +0000562}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000563#endif /* HAVE_UNAME */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000564
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565static object *
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000566posix_utime(self, args)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000567 object *self;
568 object *args;
569{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000570 char *path;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000571 long atime, mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000572 int res;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000573
Guido van Rossumb6775db1994-08-01 11:34:53 +0000574#ifdef HAVE_UTIME_H
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000575 struct utimbuf buf;
576#define ATIME buf.actime
577#define MTIME buf.modtime
578#define UTIME_ARG &buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000579#else /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000580 time_t buf[2];
581#define ATIME buf[0]
582#define MTIME buf[1]
583#define UTIME_ARG buf
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000584#endif /* HAVE_UTIME_H */
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000585
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000586 if (!getargs(args, "(s(ll))", &path, &atime, &mtime))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000587 return NULL;
Guido van Rossumf8803dd1995-01-26 00:37:45 +0000588 ATIME = atime;
Guido van Rossumd1b34811995-02-07 15:39:29 +0000589 MTIME = mtime;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000590 BGN_SAVE
591 res = utime(path, UTIME_ARG);
592 END_SAVE
593 if (res < 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000594 return posix_error();
595 INCREF(None);
596 return None;
Guido van Rossum1ff6cb41991-04-08 20:59:13 +0000597#undef UTIME_ARG
598#undef ATIME
599#undef MTIME
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000600}
601
Guido van Rossum85e3b011991-06-03 12:42:10 +0000602
Guido van Rossum3b066191991-06-04 19:40:25 +0000603/* Process operations */
Guido van Rossum85e3b011991-06-03 12:42:10 +0000604
605static object *
606posix__exit(self, args)
607 object *self;
608 object *args;
609{
610 int sts;
611 if (!getintarg(args, &sts))
612 return NULL;
613 _exit(sts);
614 /* NOTREACHED */
615}
616
Guido van Rossum85e3b011991-06-03 12:42:10 +0000617static object *
Guido van Rossum89b33251993-10-22 14:26:06 +0000618posix_execv(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +0000619 object *self;
620 object *args;
621{
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000622 char *path;
623 object *argv;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000624 char **argvlist;
625 int i, argc;
626 object *(*getitem) PROTO((object *, int));
627
Guido van Rossum89b33251993-10-22 14:26:06 +0000628 /* execv has two arguments: (path, argv), where
Guido van Rossum85e3b011991-06-03 12:42:10 +0000629 argv is a list or tuple of strings. */
630
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000631 if (!getargs(args, "(sO)", &path, &argv))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000632 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000633 if (is_listobject(argv)) {
634 argc = getlistsize(argv);
635 getitem = getlistitem;
636 }
637 else if (is_tupleobject(argv)) {
638 argc = gettuplesize(argv);
639 getitem = gettupleitem;
640 }
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000641 else {
642 badarg:
643 err_badarg();
644 return NULL;
645 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000646
647 argvlist = NEW(char *, argc+1);
648 if (argvlist == NULL)
649 return NULL;
650 for (i = 0; i < argc; i++) {
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000651 if (!getargs((*getitem)(argv, i), "s", &argvlist[i])) {
Guido van Rossum85e3b011991-06-03 12:42:10 +0000652 DEL(argvlist);
653 goto badarg;
654 }
Guido van Rossum85e3b011991-06-03 12:42:10 +0000655 }
656 argvlist[argc] = NULL;
657
Guido van Rossumb6775db1994-08-01 11:34:53 +0000658#ifdef BAD_EXEC_PROTOTYPES
659 execv(path, (const char **) argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000660#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000661 execv(path, argvlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000662#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000663
Guido van Rossum85e3b011991-06-03 12:42:10 +0000664 /* If we get here it's definitely an error */
665
666 DEL(argvlist);
667 return posix_error();
668}
669
670static object *
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000671posix_execve(self, args)
672 object *self;
673 object *args;
674{
675 char *path;
676 object *argv, *env;
677 char **argvlist;
678 char **envlist;
679 object *key, *val;
680 int i, pos, argc, envc;
681 object *(*getitem) PROTO((object *, int));
682
683 /* execve has three arguments: (path, argv, env), where
684 argv is a list or tuple of strings and env is a dictionary
685 like posix.environ. */
686
687 if (!getargs(args, "(sOO)", &path, &argv, &env))
688 return NULL;
689 if (is_listobject(argv)) {
690 argc = getlistsize(argv);
691 getitem = getlistitem;
692 }
693 else if (is_tupleobject(argv)) {
694 argc = gettuplesize(argv);
695 getitem = gettupleitem;
696 }
697 else {
698 err_setstr(TypeError, "argv must be tuple or list");
699 return NULL;
700 }
701 if (!is_dictobject(env)) {
702 err_setstr(TypeError, "env must be dictionary");
703 return NULL;
704 }
705
706 argvlist = NEW(char *, argc+1);
707 if (argvlist == NULL) {
708 err_nomem();
709 return NULL;
710 }
711 for (i = 0; i < argc; i++) {
712 if (!getargs((*getitem)(argv, i),
713 "s;argv must be list of strings",
714 &argvlist[i])) {
715 goto fail_1;
716 }
717 }
718 argvlist[argc] = NULL;
719
720 i = getmappingsize(env);
721 envlist = NEW(char *, i + 1);
722 if (envlist == NULL) {
723 err_nomem();
724 goto fail_1;
725 }
726 pos = 0;
727 envc = 0;
728 while (mappinggetnext(env, &pos, &key, &val)) {
729 char *p, *k, *v;
730 if (!getargs(key, "s;non-string key in env", &k) ||
731 !getargs(val, "s;non-string value in env", &v)) {
732 goto fail_2;
733 }
734 p = NEW(char, getstringsize(key) + getstringsize(val) + 2);
735 if (p == NULL) {
736 err_nomem();
737 goto fail_2;
738 }
739 sprintf(p, "%s=%s", k, v);
740 envlist[envc++] = p;
741 }
742 envlist[envc] = 0;
743
Guido van Rossumb6775db1994-08-01 11:34:53 +0000744
745#ifdef BAD_EXEC_PROTOTYPES
746 execve(path, (const char **)argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000747#else /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000748 execve(path, argvlist, envlist);
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000749#endif /* BAD_EXEC_PROTOTYPES */
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000750
751 /* If we get here it's definitely an error */
752
753 (void) posix_error();
754
755 fail_2:
756 while (--envc >= 0)
757 DEL(envlist[envc]);
758 DEL(envlist);
759 fail_1:
760 DEL(argvlist);
761
762 return NULL;
763}
764
Guido van Rossumad0ee831995-03-01 10:34:45 +0000765#ifdef HAVE_FORK
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +0000766static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000767posix_fork(self, args)
768 object *self;
769 object *args;
770{
771 int pid;
Guido van Rossum50e61dc1992-03-27 17:22:31 +0000772 if (!getnoarg(args))
773 return NULL;
Guido van Rossum85e3b011991-06-03 12:42:10 +0000774 pid = fork();
775 if (pid == -1)
776 return posix_error();
777 return newintobject((long)pid);
778}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000779#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000780
Guido van Rossumad0ee831995-03-01 10:34:45 +0000781#ifdef HAVE_GETEGID
Guido van Rossum85e3b011991-06-03 12:42:10 +0000782static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000783posix_getegid(self, args)
784 object *self;
785 object *args;
786{
787 if (!getnoarg(args))
788 return NULL;
789 return newintobject((long)getegid());
790}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000791#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000792
Guido van Rossumad0ee831995-03-01 10:34:45 +0000793#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000794static object *
795posix_geteuid(self, args)
796 object *self;
797 object *args;
798{
799 if (!getnoarg(args))
800 return NULL;
801 return newintobject((long)geteuid());
802}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000803#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000804
Guido van Rossumad0ee831995-03-01 10:34:45 +0000805#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +0000806static object *
807posix_getgid(self, args)
808 object *self;
809 object *args;
810{
811 if (!getnoarg(args))
812 return NULL;
813 return newintobject((long)getgid());
814}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000815#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000816
817static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000818posix_getpid(self, args)
819 object *self;
820 object *args;
821{
Guido van Rossum04814471991-06-04 20:23:49 +0000822 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000823 return NULL;
824 return newintobject((long)getpid());
825}
826
Guido van Rossumb6775db1994-08-01 11:34:53 +0000827#ifdef HAVE_GETPGRP
Guido van Rossum85e3b011991-06-03 12:42:10 +0000828static object *
Guido van Rossum04814471991-06-04 20:23:49 +0000829posix_getpgrp(self, args)
830 object *self;
831 object *args;
832{
833 if (!getnoarg(args))
834 return NULL;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000835#ifdef GETPGRP_HAVE_ARG
Guido van Rossum971443b1991-06-07 13:59:29 +0000836 return newintobject((long)getpgrp(0));
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000837#else /* GETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000838 return newintobject((long)getpgrp());
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000839#endif /* GETPGRP_HAVE_ARG */
Guido van Rossum04814471991-06-04 20:23:49 +0000840}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000841#endif /* HAVE_GETPGRP */
Guido van Rossum04814471991-06-04 20:23:49 +0000842
Guido van Rossumb6775db1994-08-01 11:34:53 +0000843#ifdef HAVE_SETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +0000844static object *
Guido van Rossumc2670a01992-09-13 20:07:29 +0000845posix_setpgrp(self, args)
846 object *self;
847 object *args;
848{
849 if (!getnoarg(args))
850 return NULL;
Guido van Rossum64933891994-10-20 21:56:42 +0000851#ifdef SETPGRP_HAVE_ARG
Guido van Rossumc2670a01992-09-13 20:07:29 +0000852 if (setpgrp(0, 0) < 0)
Guido van Rossum64933891994-10-20 21:56:42 +0000853#else /* SETPGRP_HAVE_ARG */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000854 if (setpgrp() < 0)
Guido van Rossum64933891994-10-20 21:56:42 +0000855#endif /* SETPGRP_HAVE_ARG */
Guido van Rossum687dd131993-05-17 08:34:16 +0000856 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +0000857 INCREF(None);
858 return None;
859}
860
Guido van Rossumb6775db1994-08-01 11:34:53 +0000861#endif /* HAVE_SETPGRP */
862
Guido van Rossumad0ee831995-03-01 10:34:45 +0000863#ifdef HAVE_GETPPID
Guido van Rossumc2670a01992-09-13 20:07:29 +0000864static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000865posix_getppid(self, args)
866 object *self;
867 object *args;
868{
Guido van Rossum04814471991-06-04 20:23:49 +0000869 if (!getnoarg(args))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000870 return NULL;
871 return newintobject((long)getppid());
872}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000873#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000874
Guido van Rossumad0ee831995-03-01 10:34:45 +0000875#ifdef HAVE_GETUID
Guido van Rossum85e3b011991-06-03 12:42:10 +0000876static object *
Guido van Rossum46003ff1992-05-15 11:05:24 +0000877posix_getuid(self, args)
878 object *self;
879 object *args;
880{
881 if (!getnoarg(args))
882 return NULL;
883 return newintobject((long)getuid());
884}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000885#endif
Guido van Rossum46003ff1992-05-15 11:05:24 +0000886
Guido van Rossumad0ee831995-03-01 10:34:45 +0000887#ifdef HAVE_KILL
Guido van Rossum46003ff1992-05-15 11:05:24 +0000888static object *
Guido van Rossum85e3b011991-06-03 12:42:10 +0000889posix_kill(self, args)
890 object *self;
891 object *args;
892{
893 int pid, sig;
Guido van Rossum234f9421993-06-17 12:35:49 +0000894 if (!getargs(args, "(ii)", &pid, &sig))
Guido van Rossum85e3b011991-06-03 12:42:10 +0000895 return NULL;
896 if (kill(pid, sig) == -1)
897 return posix_error();
898 INCREF(None);
899 return None;
900}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000901#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000902
903static object *
Guido van Rossum3b066191991-06-04 19:40:25 +0000904posix_popen(self, args)
905 object *self;
906 object *args;
907{
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000908 char *name;
909 char *mode = "r";
910 int bufsize = -1;
Guido van Rossum3b066191991-06-04 19:40:25 +0000911 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000912 object *f;
913 if (!newgetargs(args, "s|si", &name, &mode, &bufsize))
Guido van Rossum3b066191991-06-04 19:40:25 +0000914 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000915 BGN_SAVE
Guido van Rossumef0a00e1992-01-27 16:51:30 +0000916 fp = popen(name, mode);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000917 END_SAVE
Guido van Rossum3b066191991-06-04 19:40:25 +0000918 if (fp == NULL)
919 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +0000920 f = newopenfileobject(fp, name, mode, pclose);
921 if (f != NULL)
922 setfilebufsize(f, bufsize);
923 return f;
Guido van Rossum3b066191991-06-04 19:40:25 +0000924}
925
Guido van Rossumb6775db1994-08-01 11:34:53 +0000926#ifdef HAVE_SETUID
Guido van Rossum3b066191991-06-04 19:40:25 +0000927static object *
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000928posix_setuid(self, args)
929 object *self;
930 object *args;
931{
932 int uid;
933 if (!getargs(args, "i", &uid))
934 return NULL;
935 if (setuid(uid) < 0)
936 return posix_error();
937 INCREF(None);
938 return None;
939}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000940#endif /* HAVE_SETUID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000941
Guido van Rossumb6775db1994-08-01 11:34:53 +0000942#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000943static object *
944posix_setgid(self, args)
945 object *self;
946 object *args;
947{
948 int gid;
949 if (!getargs(args, "i", &gid))
950 return NULL;
951 if (setgid(gid) < 0)
952 return posix_error();
953 INCREF(None);
954 return None;
955}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +0000956#endif /* HAVE_SETGID */
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000957
Guido van Rossumb6775db1994-08-01 11:34:53 +0000958#ifdef HAVE_WAITPID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +0000959static object *
Guido van Rossum21803b81992-08-09 12:55:27 +0000960posix_waitpid(self, args)
Guido van Rossum85e3b011991-06-03 12:42:10 +0000961 object *self;
962 object *args;
963{
Guido van Rossum21803b81992-08-09 12:55:27 +0000964 int pid, options, sts;
965 if (!getargs(args, "(ii)", &pid, &options))
966 return NULL;
967 BGN_SAVE
968 pid = waitpid(pid, &sts, options);
969 END_SAVE
Guido van Rossum85e3b011991-06-03 12:42:10 +0000970 if (pid == -1)
971 return posix_error();
Guido van Rossum21803b81992-08-09 12:55:27 +0000972 else
973 return mkvalue("ii", pid, sts);
Guido van Rossum21803b81992-08-09 12:55:27 +0000974}
Guido van Rossumb6775db1994-08-01 11:34:53 +0000975#endif /* HAVE_WAITPID */
Guido van Rossum21803b81992-08-09 12:55:27 +0000976
Guido van Rossumad0ee831995-03-01 10:34:45 +0000977#ifdef HAVE_WAIT
Guido van Rossum21803b81992-08-09 12:55:27 +0000978static object *
979posix_wait(self, args)
980 object *self;
981 object *args;
982{
983 int pid, sts;
Guido van Rossum21803b81992-08-09 12:55:27 +0000984 BGN_SAVE
985 pid = wait(&sts);
986 END_SAVE
987 if (pid == -1)
988 return posix_error();
989 else
990 return mkvalue("ii", pid, sts);
Guido van Rossum85e3b011991-06-03 12:42:10 +0000991}
Guido van Rossumad0ee831995-03-01 10:34:45 +0000992#endif
Guido van Rossum85e3b011991-06-03 12:42:10 +0000993
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000994static object *
995posix_lstat(self, args)
996 object *self;
997 object *args;
998{
Guido van Rossumb6775db1994-08-01 11:34:53 +0000999#ifdef HAVE_LSTAT
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001000 return posix_do_stat(self, args, lstat);
Guido van Rossumb6775db1994-08-01 11:34:53 +00001001#else /* !HAVE_LSTAT */
1002 return posix_do_stat(self, args, stat);
1003#endif /* !HAVE_LSTAT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001004}
1005
Guido van Rossumb6775db1994-08-01 11:34:53 +00001006#ifdef HAVE_READLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001007static object *
1008posix_readlink(self, args)
1009 object *self;
1010 object *args;
1011{
Guido van Rossumb6775db1994-08-01 11:34:53 +00001012 char buf[MAXPATHLEN];
Guido van Rossumef0a00e1992-01-27 16:51:30 +00001013 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001014 int n;
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001015 if (!getargs(args, "s", &path))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001016 return NULL;
Guido van Rossumff4949e1992-08-05 19:58:53 +00001017 BGN_SAVE
Guido van Rossum50e61dc1992-03-27 17:22:31 +00001018 n = readlink(path, buf, (int) sizeof buf);
Guido van Rossumff4949e1992-08-05 19:58:53 +00001019 END_SAVE
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001020 if (n < 0)
1021 return posix_error();
1022 return newsizedstringobject(buf, n);
1023}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001024#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001025
Guido van Rossumb6775db1994-08-01 11:34:53 +00001026#ifdef HAVE_SYMLINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001027static object *
1028posix_symlink(self, args)
1029 object *self;
1030 object *args;
1031{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001032 return posix_2str(args, symlink);
1033}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001034#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001035
Guido van Rossumb6775db1994-08-01 11:34:53 +00001036#ifdef HAVE_TIMES
1037#ifndef HZ
1038#define HZ 60 /* Universal constant :-) */
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001039#endif /* HZ */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001040static object *
1041posix_times(self, args)
1042 object *self;
1043 object *args;
1044{
1045 struct tms t;
1046 clock_t c;
Guido van Rossum22db57e1992-04-05 14:25:30 +00001047 if (!getnoarg(args))
1048 return NULL;
1049 errno = 0;
1050 c = times(&t);
Guido van Rossum687dd131993-05-17 08:34:16 +00001051 if (c == (clock_t) -1)
1052 return posix_error();
Guido van Rossum0b0db8e1993-01-21 16:07:51 +00001053 return mkvalue("dddd",
1054 (double)t.tms_utime / HZ,
1055 (double)t.tms_stime / HZ,
1056 (double)t.tms_cutime / HZ,
1057 (double)t.tms_cstime / HZ);
Guido van Rossum22db57e1992-04-05 14:25:30 +00001058}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001059#endif /* HAVE_TIMES */
Guido van Rossum14ed0b21994-09-29 09:50:09 +00001060#ifdef NT
1061#define HAVE_TIMES /* so the method table will pick it up */
1062static object *
1063posix_times(self, args)
1064 object *self;
1065 object *args;
1066{
1067 FILETIME create, exit, kernel, user;
1068 HANDLE hProc;
1069 if (!getnoarg(args))
1070 return NULL;
1071 hProc = GetCurrentProcess();
1072 GetProcessTimes(hProc,&create, &exit, &kernel, &user);
1073 return mkvalue("dddd",
1074 (double)(kernel.dwHighDateTime*2E32+kernel.dwLowDateTime) / 2E6,
1075 (double)(user.dwHighDateTime*2E32+user.dwLowDateTime) / 2E6,
1076 (double)0,
1077 (double)0);
1078}
1079#endif /* NT */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001080
Guido van Rossumb6775db1994-08-01 11:34:53 +00001081#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001082static object *
1083posix_setsid(self, args)
1084 object *self;
1085 object *args;
1086{
1087 if (!getnoarg(args))
1088 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001089 if (setsid() < 0)
1090 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001091 INCREF(None);
1092 return None;
1093}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001094#endif /* HAVE_SETSID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001095
Guido van Rossumb6775db1994-08-01 11:34:53 +00001096#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001097static object *
1098posix_setpgid(self, args)
1099 object *self;
1100 object *args;
1101{
1102 int pid, pgrp;
1103 if (!getargs(args, "(ii)", &pid, &pgrp))
1104 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001105 if (setpgid(pid, pgrp) < 0)
1106 return posix_error();
Guido van Rossumc2670a01992-09-13 20:07:29 +00001107 INCREF(None);
1108 return None;
1109}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001110#endif /* HAVE_SETPGID */
Guido van Rossumc2670a01992-09-13 20:07:29 +00001111
Guido van Rossumb6775db1994-08-01 11:34:53 +00001112#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001113static object *
1114posix_tcgetpgrp(self, args)
1115 object *self;
1116 object *args;
1117{
1118 int fd, pgid;
1119 if (!getargs(args, "i", &fd))
1120 return NULL;
1121 pgid = tcgetpgrp(fd);
Guido van Rossum687dd131993-05-17 08:34:16 +00001122 if (pgid < 0)
1123 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001124 return newintobject((long)pgid);
1125}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001126#endif /* HAVE_TCGETPGRP */
Guido van Rossum7066dd71992-09-17 17:54:56 +00001127
Guido van Rossumb6775db1994-08-01 11:34:53 +00001128#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001129static object *
1130posix_tcsetpgrp(self, args)
1131 object *self;
1132 object *args;
1133{
1134 int fd, pgid;
1135 if (!getargs(args, "(ii)", &fd, &pgid))
1136 return NULL;
Guido van Rossum687dd131993-05-17 08:34:16 +00001137 if (tcsetpgrp(fd, pgid) < 0)
1138 return posix_error();
Guido van Rossum7066dd71992-09-17 17:54:56 +00001139 INCREF(None);
1140 return None;
1141}
Guido van Rossumb6775db1994-08-01 11:34:53 +00001142#endif /* HAVE_TCSETPGRP */
Guido van Rossum22db57e1992-04-05 14:25:30 +00001143
Guido van Rossum687dd131993-05-17 08:34:16 +00001144/* Functions acting on file descriptors */
1145
Guido van Rossum234f9421993-06-17 12:35:49 +00001146static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001147posix_open(self, args)
1148 object *self;
1149 object *args;
1150{
1151 char *file;
1152 int flag;
1153 int mode = 0777;
1154 int fd;
1155 if (!getargs(args, "(si)", &file, &flag)) {
1156 err_clear();
1157 if (!getargs(args, "(sii)", &file, &flag, &mode))
1158 return NULL;
1159 }
1160 BGN_SAVE
1161 fd = open(file, flag, mode);
1162 END_SAVE
1163 if (fd < 0)
1164 return posix_error();
1165 return newintobject((long)fd);
1166}
1167
Guido van Rossum234f9421993-06-17 12:35:49 +00001168static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001169posix_close(self, args)
1170 object *self;
1171 object *args;
1172{
1173 int fd, res;
1174 if (!getargs(args, "i", &fd))
1175 return NULL;
1176 BGN_SAVE
1177 res = close(fd);
1178 END_SAVE
1179 if (res < 0)
1180 return posix_error();
1181 INCREF(None);
1182 return None;
1183}
1184
Guido van Rossum234f9421993-06-17 12:35:49 +00001185static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001186posix_dup(self, args)
1187 object *self;
1188 object *args;
1189{
1190 int fd;
1191 if (!getargs(args, "i", &fd))
1192 return NULL;
1193 BGN_SAVE
1194 fd = dup(fd);
1195 END_SAVE
1196 if (fd < 0)
1197 return posix_error();
1198 return newintobject((long)fd);
1199}
1200
Guido van Rossum234f9421993-06-17 12:35:49 +00001201static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001202posix_dup2(self, args)
1203 object *self;
1204 object *args;
1205{
1206 int fd, fd2, res;
1207 if (!getargs(args, "(ii)", &fd, &fd2))
1208 return NULL;
1209 BGN_SAVE
1210 res = dup2(fd, fd2);
1211 END_SAVE
1212 if (res < 0)
1213 return posix_error();
1214 INCREF(None);
1215 return None;
1216}
1217
Guido van Rossum234f9421993-06-17 12:35:49 +00001218static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001219posix_lseek(self, args)
1220 object *self;
1221 object *args;
1222{
1223 int fd, how;
1224 long pos, res;
1225 if (!getargs(args, "(ili)", &fd, &pos, &how))
1226 return NULL;
1227#ifdef SEEK_SET
1228 /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */
1229 switch (how) {
1230 case 0: how = SEEK_SET; break;
1231 case 1: how = SEEK_CUR; break;
1232 case 2: how = SEEK_END; break;
1233 }
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001234#endif /* SEEK_END */
Guido van Rossum687dd131993-05-17 08:34:16 +00001235 BGN_SAVE
1236 res = lseek(fd, pos, how);
1237 END_SAVE
1238 if (res < 0)
1239 return posix_error();
1240 return newintobject(res);
1241}
1242
Guido van Rossum234f9421993-06-17 12:35:49 +00001243static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001244posix_read(self, args)
1245 object *self;
1246 object *args;
1247{
1248 int fd, size;
1249 object *buffer;
1250 if (!getargs(args, "(ii)", &fd, &size))
1251 return NULL;
1252 buffer = newsizedstringobject((char *)NULL, size);
1253 if (buffer == NULL)
1254 return NULL;
1255 BGN_SAVE
1256 size = read(fd, getstringvalue(buffer), size);
1257 END_SAVE
1258 if (size < 0) {
1259 DECREF(buffer);
1260 return posix_error();
1261 }
1262 resizestring(&buffer, size);
1263 return buffer;
1264}
1265
Guido van Rossum234f9421993-06-17 12:35:49 +00001266static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001267posix_write(self, args)
1268 object *self;
1269 object *args;
1270{
1271 int fd, size;
1272 char *buffer;
1273 if (!getargs(args, "(is#)", &fd, &buffer, &size))
1274 return NULL;
1275 BGN_SAVE
1276 size = write(fd, buffer, size);
1277 END_SAVE
1278 if (size < 0)
1279 return posix_error();
1280 return newintobject((long)size);
1281}
1282
Guido van Rossum234f9421993-06-17 12:35:49 +00001283static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001284posix_fstat(self, args)
1285 object *self;
1286 object *args;
1287{
1288 int fd;
1289 struct stat st;
1290 int res;
1291 if (!getargs(args, "i", &fd))
1292 return NULL;
1293 BGN_SAVE
1294 res = fstat(fd, &st);
1295 END_SAVE
1296 if (res != 0)
1297 return posix_error();
1298 return mkvalue("(llllllllll)",
1299 (long)st.st_mode,
1300 (long)st.st_ino,
1301 (long)st.st_dev,
1302 (long)st.st_nlink,
1303 (long)st.st_uid,
1304 (long)st.st_gid,
1305 (long)st.st_size,
1306 (long)st.st_atime,
1307 (long)st.st_mtime,
1308 (long)st.st_ctime);
1309}
1310
1311static object *
1312posix_fdopen(self, args)
1313 object *self;
1314 object *args;
1315{
1316 extern int fclose PROTO((FILE *));
1317 int fd;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001318 char *mode = "r";
1319 int bufsize = -1;
Guido van Rossum687dd131993-05-17 08:34:16 +00001320 FILE *fp;
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001321 object *f;
1322 if (!newgetargs(args, "i|si", &fd, &mode, &bufsize))
Guido van Rossum687dd131993-05-17 08:34:16 +00001323 return NULL;
1324 BGN_SAVE
1325 fp = fdopen(fd, mode);
1326 END_SAVE
1327 if (fp == NULL)
1328 return posix_error();
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001329 f = newopenfileobject(fp, "(fdopen)", mode, fclose);
1330 if (f != NULL)
1331 setfilebufsize(f, bufsize);
1332 return f;
Guido van Rossum687dd131993-05-17 08:34:16 +00001333}
1334
Guido van Rossum234f9421993-06-17 12:35:49 +00001335static object *
Guido van Rossum687dd131993-05-17 08:34:16 +00001336posix_pipe(self, args)
1337 object *self;
1338 object *args;
1339{
Guido van Rossum794d8131994-08-23 13:48:48 +00001340#ifndef NT
Guido van Rossum687dd131993-05-17 08:34:16 +00001341 int fds[2];
1342 int res;
1343 if (!getargs(args, ""))
1344 return NULL;
1345 BGN_SAVE
1346 res = pipe(fds);
1347 END_SAVE
1348 if (res != 0)
1349 return posix_error();
1350 return mkvalue("(ii)", fds[0], fds[1]);
Guido van Rossum794d8131994-08-23 13:48:48 +00001351#else /* NT */
1352 HANDLE read, write;
1353 BOOL ok;
1354 if (!getargs(args, ""))
1355 return NULL;
1356 BGN_SAVE
1357 ok = CreatePipe( &read, &write, NULL, 0);
1358 END_SAVE
1359 if (!ok)
1360 return posix_error();
1361 return mkvalue("(ii)", read, write);
1362#endif /* NT */
Guido van Rossum687dd131993-05-17 08:34:16 +00001363}
Guido van Rossum22db57e1992-04-05 14:25:30 +00001364
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001365static struct methodlist posix_methods[] = {
1366 {"chdir", posix_chdir},
1367 {"chmod", posix_chmod},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001368#ifdef HAVE_CHOWN
1369 {"chown", posix_chown},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001370#endif /* HAVE_CHOWN */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001371 {"getcwd", posix_getcwd},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001372#ifdef HAVE_LINK
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001373 {"link", posix_link},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001374#endif /* HAVE_LINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001375 {"listdir", posix_listdir},
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001376 {"lstat", posix_lstat},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001377 {"mkdir", posix_mkdir},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001378#ifdef HAVE_NICE
Guido van Rossum775f4da1993-01-09 17:18:52 +00001379 {"nice", posix_nice},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001380#endif /* HAVE_NICE */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001381#ifdef HAVE_READLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001382 {"readlink", posix_readlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001383#endif /* HAVE_READLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001384 {"rename", posix_rename},
1385 {"rmdir", posix_rmdir},
1386 {"stat", posix_stat},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001387#ifdef HAVE_SYMLINK
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001388 {"symlink", posix_symlink},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001389#endif /* HAVE_SYMLINK */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001390 {"system", posix_system},
1391 {"umask", posix_umask},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001392#ifdef HAVE_UNAME
Guido van Rossumc39de5f1992-02-05 11:15:54 +00001393 {"uname", posix_uname},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001394#endif /* HAVE_UNAME */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001395 {"unlink", posix_unlink},
Guido van Rossum1ff6cb41991-04-08 20:59:13 +00001396 {"utime", posix_utime},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001397#ifdef HAVE_TIMES
Guido van Rossum22db57e1992-04-05 14:25:30 +00001398 {"times", posix_times},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001399#endif /* HAVE_TIMES */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001400 {"_exit", posix__exit},
Guido van Rossum89b33251993-10-22 14:26:06 +00001401 {"execv", posix_execv},
Guido van Rossumc6dcc9f1993-11-05 10:15:19 +00001402 {"execve", posix_execve},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001403#ifdef HAVE_FORK
Guido van Rossum85e3b011991-06-03 12:42:10 +00001404 {"fork", posix_fork},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001405#endif /* HAVE_FORK */
1406#ifdef HAVE_GETEGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001407 {"getegid", posix_getegid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001408#endif /* HAVE_GETEGID */
1409#ifdef HAVE_GETEUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001410 {"geteuid", posix_geteuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001411#endif /* HAVE_GETEUID */
1412#ifdef HAVE_GETGID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001413 {"getgid", posix_getgid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001414#endif /* HAVE_GETGID */
Guido van Rossum85e3b011991-06-03 12:42:10 +00001415 {"getpid", posix_getpid},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001416#ifdef HAVE_GETPGRP
Guido van Rossum04814471991-06-04 20:23:49 +00001417 {"getpgrp", posix_getpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001418#endif /* HAVE_GETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001419#ifdef HAVE_GETPPID
Guido van Rossum85e3b011991-06-03 12:42:10 +00001420 {"getppid", posix_getppid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001421#endif /* HAVE_GETPPID */
1422#ifdef HAVE_GETUID
Guido van Rossum46003ff1992-05-15 11:05:24 +00001423 {"getuid", posix_getuid},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001424#endif /* HAVE_GETUID */
1425#ifdef HAVE_KILL
Guido van Rossum85e3b011991-06-03 12:42:10 +00001426 {"kill", posix_kill},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001427#endif /* HAVE_KILL */
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001428 {"popen", posix_popen, 1},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001429#ifdef HAVE_SETUID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001430 {"setuid", posix_setuid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001431#endif /* HAVE_SETUID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001432#ifdef HAVE_SETGID
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001433 {"setgid", posix_setgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001434#endif /* HAVE_SETGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001435#ifdef HAVE_SETPGRP
Guido van Rossumc2670a01992-09-13 20:07:29 +00001436 {"setpgrp", posix_setpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001437#endif /* HAVE_SETPGRP */
Guido van Rossumad0ee831995-03-01 10:34:45 +00001438#ifdef HAVE_WAIT
Guido van Rossum85e3b011991-06-03 12:42:10 +00001439 {"wait", posix_wait},
Guido van Rossumad0ee831995-03-01 10:34:45 +00001440#endif /* HAVE_WAIT */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001441#ifdef HAVE_WAITPID
Guido van Rossum21803b81992-08-09 12:55:27 +00001442 {"waitpid", posix_waitpid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001443#endif /* HAVE_WAITPID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001444#ifdef HAVE_SETSID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001445 {"setsid", posix_setsid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001446#endif /* HAVE_SETSID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001447#ifdef HAVE_SETPGID
Guido van Rossumc2670a01992-09-13 20:07:29 +00001448 {"setpgid", posix_setpgid},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001449#endif /* HAVE_SETPGID */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001450#ifdef HAVE_TCGETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001451 {"tcgetpgrp", posix_tcgetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001452#endif /* HAVE_TCGETPGRP */
Guido van Rossumb6775db1994-08-01 11:34:53 +00001453#ifdef HAVE_TCSETPGRP
Guido van Rossum7066dd71992-09-17 17:54:56 +00001454 {"tcsetpgrp", posix_tcsetpgrp},
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001455#endif /* HAVE_TCSETPGRP */
Guido van Rossum687dd131993-05-17 08:34:16 +00001456 {"open", posix_open},
1457 {"close", posix_close},
1458 {"dup", posix_dup},
1459 {"dup2", posix_dup2},
1460 {"lseek", posix_lseek},
1461 {"read", posix_read},
1462 {"write", posix_write},
1463 {"fstat", posix_fstat},
Guido van Rossuma6a1e531995-01-10 15:36:38 +00001464 {"fdopen", posix_fdopen, 1},
Guido van Rossum687dd131993-05-17 08:34:16 +00001465 {"pipe", posix_pipe},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001466 {NULL, NULL} /* Sentinel */
1467};
1468
1469
Guido van Rossumb6775db1994-08-01 11:34:53 +00001470#ifdef NT
1471void
1472initnt()
1473{
1474 object *m, *d, *v;
1475
1476 m = initmodule("nt", posix_methods);
1477 d = getmoduledict(m);
1478
1479 /* Initialize nt.environ dictionary */
1480 v = convertenviron();
1481 if (v == NULL || dictinsert(d, "environ", v) != 0)
1482 fatal("can't define nt.environ");
1483 DECREF(v);
1484
1485 /* Initialize nt.error exception */
1486 PosixError = newstringobject("nt.error");
1487 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1488 fatal("can't define nt.error");
1489}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001490#else /* !NT */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001491void
1492initposix()
1493{
1494 object *m, *d, *v;
1495
1496 m = initmodule("posix", posix_methods);
1497 d = getmoduledict(m);
1498
1499 /* Initialize posix.environ dictionary */
1500 v = convertenviron();
1501 if (v == NULL || dictinsert(d, "environ", v) != 0)
1502 fatal("can't define posix.environ");
1503 DECREF(v);
1504
1505 /* Initialize posix.error exception */
1506 PosixError = newstringobject("posix.error");
1507 if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
1508 fatal("can't define posix.error");
1509}
Guido van Rossum6a3eb5f1994-08-18 15:42:46 +00001510#endif /* !NT */