blob: 69cb7aaccbf6456024ea9de24a699ea1a65a682a [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* System module */
33
34/*
35Various bits of information used by the interpreter are collected in
36module 'sys'.
Guido van Rossum3f5da241990-12-20 15:06:42 +000037Function member:
Guido van Rossumcc8914f1995-03-20 15:09:40 +000038- exit(sts): raise SystemExit
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039Data members:
40- stdin, stdout, stderr: standard file objects
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041- modules: the table of modules (dictionary)
Guido van Rossum3f5da241990-12-20 15:06:42 +000042- path: module search path (list of strings)
43- argv: script arguments (list of strings)
44- ps1, ps2: optional primary and secondary prompts (strings)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045*/
46
Guido van Rossum3f5da241990-12-20 15:06:42 +000047#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049#include "sysmodule.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050#include "import.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051#include "modsupport.h"
Guido van Rossume2437a11992-03-23 18:20:18 +000052#include "osdefs.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000053
Guido van Rossume2437a11992-03-23 18:20:18 +000054object *sys_trace, *sys_profile;
Guido van Rossum9a1f3881995-03-30 11:01:58 +000055int sys_checkinterval = 10;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056
Guido van Rossumc474dea1997-04-25 15:38:31 +000057#if HAVE_UNISTD_H
58#include <unistd.h>
59#endif
60
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000061static object *sysdict;
62
Guido van Rossum9b38a141996-09-11 23:12:24 +000063#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +000064extern void *PyWin_DLLhModule;
65#endif
66
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000067object *
68sysget(name)
69 char *name;
70{
71 return dictlookup(sysdict, name);
72}
73
74FILE *
75sysgetfile(name, def)
76 char *name;
77 FILE *def;
78{
79 FILE *fp = NULL;
80 object *v = sysget(name);
Guido van Rossum3165fe61992-09-25 21:59:05 +000081 if (v != NULL && is_fileobject(v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082 fp = getfilefile(v);
83 if (fp == NULL)
84 fp = def;
85 return fp;
86}
87
88int
89sysset(name, v)
90 char *name;
91 object *v;
92{
Guido van Rossum5ad58c61992-01-26 18:15:48 +000093 if (v == NULL) {
94 if (dictlookup(sysdict, name) == NULL)
95 return 0;
96 else
97 return dictremove(sysdict, name);
98 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099 else
100 return dictinsert(sysdict, name, v);
101}
102
103static object *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104sys_exit(self, args)
105 object *self;
106 object *args;
107{
Guido van Rossum6a468bf1991-12-31 13:15:35 +0000108 /* Raise SystemExit so callers may catch it or clean up. */
109 err_setval(SystemExit, args);
110 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111}
112
Guido van Rossume2437a11992-03-23 18:20:18 +0000113static object *
114sys_settrace(self, args)
115 object *self;
116 object *args;
117{
118 if (args == None)
119 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000120 else
Guido van Rossum5dc8eb01992-06-19 13:57:27 +0000121 XINCREF(args);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000122 XDECREF(sys_trace);
Guido van Rossume2437a11992-03-23 18:20:18 +0000123 sys_trace = args;
124 INCREF(None);
125 return None;
126}
127
128static object *
129sys_setprofile(self, args)
130 object *self;
131 object *args;
132{
133 if (args == None)
134 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000135 else
Guido van Rossum5dc8eb01992-06-19 13:57:27 +0000136 XINCREF(args);
Guido van Rossume765f7d1992-04-05 14:17:55 +0000137 XDECREF(sys_profile);
Guido van Rossume2437a11992-03-23 18:20:18 +0000138 sys_profile = args;
139 INCREF(None);
140 return None;
141}
142
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000143static object *
144sys_setcheckinterval(self, args)
145 object *self;
146 object *args;
147{
148 if (!newgetargs(args, "i", &sys_checkinterval))
149 return NULL;
150 INCREF(None);
151 return None;
152}
153
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000154#ifdef USE_MALLOPT
155/* Link with -lmalloc (or -lmpc) on an SGI */
156#include <malloc.h>
157
158static object *
159sys_mdebug(self, args)
160 object *self;
161 object *args;
162{
163 int flag;
164 if (!getargs(args, "i", &flag))
165 return NULL;
166 mallopt(M_DEBUG, flag);
167 INCREF(None);
168 return None;
169}
170#endif /* USE_MALLOPT */
171
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000172static object *
173sys_getrefcount(self, args)
174 object *self;
175 object *args;
176{
177 object *arg;
178 if (!getargs(args, "O", &arg))
179 return NULL;
180 return newintobject((long) arg->ob_refcnt);
181}
182
183#ifdef COUNT_ALLOCS
184static PyObject *
185sys_getcounts(self, args)
186 PyObject *self, *args;
187{
188 extern PyObject *get_counts Py_PROTO((void));
189
190 if (!PyArg_Parse(args, ""))
191 return NULL;
192 return get_counts();
193}
194#endif
195
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000196#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000197/* Defined in objects.c because it uses static globals if that file */
198extern PyObject *_Py_GetObjects Py_PROTO((PyObject *, PyObject *));
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000199#endif
Guido van Rossumded690f1996-05-24 20:48:31 +0000200
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000201#ifdef DYNAMIC_EXECUTION_PROFILE
202/* Defined in ceval.c because it uses static globals if that file */
203extern PyObject *_Py_GetDXProfile Py_PROTO((PyObject *, PyObject *));
204#endif
205
Guido van Rossum3f5da241990-12-20 15:06:42 +0000206static struct methodlist sys_methods[] = {
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000207 /* Might as well keep this in alphabetic order */
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000208 {"exit", sys_exit, 0},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000209#ifdef COUNT_ALLOCS
210 {"getcounts", sys_getcounts, 0},
211#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000212#ifdef DYNAMIC_EXECUTION_PROFILE
213 {"getdxp", _Py_GetDXProfile, 1},
214#endif
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000215#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000216 {"getobjects", _Py_GetObjects, 1},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000217#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000218 {"getrefcount", sys_getrefcount, 0},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000219#ifdef USE_MALLOPT
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000220 {"mdebug", sys_mdebug, 0},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000221#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000222 {"setcheckinterval", sys_setcheckinterval, 1},
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000223 {"setprofile", sys_setprofile, 0},
224 {"settrace", sys_settrace, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000225 {NULL, NULL} /* sentinel */
226};
227
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228static object *sysin, *sysout, *syserr;
229
Guido van Rossum34679b71993-01-26 13:33:44 +0000230static object *
231list_builtin_module_names()
232{
233 object *list = newlistobject(0);
234 int i;
235 if (list == NULL)
236 return NULL;
237 for (i = 0; inittab[i].name != NULL; i++) {
238 object *name = newstringobject(inittab[i].name);
239 if (name == NULL)
240 break;
241 addlistitem(list, name);
242 DECREF(name);
243 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000244 if (sortlist(list) != 0) {
245 DECREF(list);
246 list = NULL;
247 }
Guido van Rossum8f49e121997-01-06 22:55:54 +0000248 if (list) {
249 object *v = listtuple(list);
250 DECREF(list);
251 list = v;
252 }
Guido van Rossum34679b71993-01-26 13:33:44 +0000253 return list;
254}
255
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000256void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000257initsys()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000258{
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000259 extern long getmaxint PROTO((void));
260 extern char *getversion PROTO((void));
261 extern char *getcopyright PROTO((void));
Guido van Rossumaaf18391995-07-07 22:45:02 +0000262 extern char *getplatform PROTO((void));
Guido van Rossum8fa9b6f1996-06-17 17:02:48 +0000263 extern char *Py_GetPrefix PROTO((void));
264 extern char *Py_GetExecPrefix PROTO((void));
Guido van Rossum3caa6e31991-06-04 19:40:59 +0000265 extern int fclose PROTO((FILE *));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000266 object *m = initmodule("sys", sys_methods);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000267 object *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000268 sysdict = getmoduledict(m);
269 INCREF(sysdict);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000270 /* NB keep an extra ref to the std files to avoid closing them
271 when the user deletes them */
Guido van Rossum3caa6e31991-06-04 19:40:59 +0000272 sysin = newopenfileobject(stdin, "<stdin>", "r", fclose);
273 sysout = newopenfileobject(stdout, "<stdout>", "w", fclose);
274 syserr = newopenfileobject(stderr, "<stderr>", "w", fclose);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275 if (err_occurred())
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000276 fatal("can't initialize sys.std{in,out,err}");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277 dictinsert(sysdict, "stdin", sysin);
278 dictinsert(sysdict, "stdout", sysout);
279 dictinsert(sysdict, "stderr", syserr);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000280 dictinsert(sysdict, "version", v = newstringobject(getversion()));
281 XDECREF(v);
282 dictinsert(sysdict, "copyright", v = newstringobject(getcopyright()));
283 XDECREF(v);
Guido van Rossumaaf18391995-07-07 22:45:02 +0000284 dictinsert(sysdict, "platform", v = newstringobject(getplatform()));
285 XDECREF(v);
Guido van Rossum8fa9b6f1996-06-17 17:02:48 +0000286 dictinsert(sysdict, "prefix", v = newstringobject(Py_GetPrefix()));
287 XDECREF(v);
288 dictinsert(sysdict, "exec_prefix",
289 v = newstringobject(Py_GetExecPrefix()));
290 XDECREF(v);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000291 dictinsert(sysdict, "maxint", v = newintobject(getmaxint()));
292 XDECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000293 dictinsert(sysdict, "modules", get_modules());
Guido van Rossum34679b71993-01-26 13:33:44 +0000294 dictinsert(sysdict, "builtin_module_names",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000295 v = list_builtin_module_names());
296 XDECREF(v);
Guido van Rossum8b9ea871996-08-23 18:14:47 +0000297#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +0000298 dictinsert(sysdict, "dllhandle", v = newintobject((int)PyWin_DLLhModule));
299 XDECREF(v);
Guido van Rossum8b9ea871996-08-23 18:14:47 +0000300 dictinsert(sysdict, "winver", v = newstringobject(MS_DLL_ID));
Guido van Rossumc606fe11996-04-09 02:37:57 +0000301 XDECREF(v);
302#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303 if (err_occurred())
304 fatal("can't insert sys.* objects in sys dict");
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000305}
306
Guido van Rossum3f5da241990-12-20 15:06:42 +0000307static object *
308makepathobject(path, delim)
309 char *path;
310 int delim;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000311{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000312 int i, n;
313 char *p;
314 object *v, *w;
315
316 n = 1;
317 p = path;
318 while ((p = strchr(p, delim)) != NULL) {
319 n++;
320 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000321 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000322 v = newlistobject(n);
323 if (v == NULL)
324 return NULL;
325 for (i = 0; ; i++) {
326 p = strchr(path, delim);
327 if (p == NULL)
328 p = strchr(path, '\0'); /* End of string */
329 w = newsizedstringobject(path, (int) (p - path));
330 if (w == NULL) {
331 DECREF(v);
332 return NULL;
333 }
334 setlistitem(v, i, w);
335 if (*p == '\0')
336 break;
337 path = p+1;
338 }
339 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000340}
341
342void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000343setpythonpath(path)
344 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000346 object *v;
347 if ((v = makepathobject(path, DELIM)) == NULL)
348 fatal("can't create sys.path");
349 if (sysset("path", v) != 0)
350 fatal("can't assign sys.path");
351 DECREF(v);
352}
353
354static object *
355makeargvobject(argc, argv)
356 int argc;
357 char **argv;
358{
359 object *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +0000360 if (argc <= 0 || argv == NULL) {
361 /* Ensure at least one (empty) argument is seen */
362 static char *empty_argv[1] = {""};
363 argv = empty_argv;
364 argc = 1;
365 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000366 av = newlistobject(argc);
367 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000368 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000369 for (i = 0; i < argc; i++) {
370 object *v = newstringobject(argv[i]);
371 if (v == NULL) {
372 DECREF(av);
373 av = NULL;
374 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000375 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000376 setlistitem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000377 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000378 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000379 return av;
380}
381
382void
383setpythonargv(argc, argv)
384 int argc;
385 char **argv;
386{
387 object *av = makeargvobject(argc, argv);
Guido van Rossum94a96671996-07-30 20:35:50 +0000388 object *path = sysget("path");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000389 if (av == NULL)
390 fatal("no mem for sys.argv");
391 if (sysset("argv", av) != 0)
392 fatal("can't assign sys.argv");
Guido van Rossum94a96671996-07-30 20:35:50 +0000393 if (path != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000394 char *argv0 = argv[0];
Guido van Rossum94a96671996-07-30 20:35:50 +0000395 char *p = NULL;
Guido van Rossumcc883411996-09-10 14:44:21 +0000396 int n = 0;
Guido van Rossum94a96671996-07-30 20:35:50 +0000397 object *a;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000398#ifdef HAVE_READLINK
399 char link[MAXPATHLEN+1];
400 char argv0copy[2*MAXPATHLEN+1];
401 int nr = 0;
402 if (argc > 0 && argv0 != NULL)
403 nr = readlink(argv0, link, MAXPATHLEN);
404 if (nr > 0) {
405 /* It's a symlink */
406 link[nr] = '\0';
407 if (link[0] == SEP)
408 argv0 = link; /* Link to absolute path */
409 else if (strchr(link, SEP) == NULL)
410 ; /* Link without path */
411 else {
412 /* Must join(dirname(argv0), link) */
413 char *q = strrchr(argv0, SEP);
414 if (q == NULL)
415 argv0 = link; /* argv0 without path */
416 else {
417 /* Must make a copy */
418 strcpy(argv0copy, argv0);
419 q = strrchr(argv0copy, SEP);
420 strcpy(q+1, link);
421 argv0 = argv0copy;
422 }
423 }
424 }
425#endif /* HAVE_READLINK */
Guido van Rossumcc883411996-09-10 14:44:21 +0000426#if SEP == '\\' /* Special case for MS filename syntax */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000427 if (argc > 0 && argv0 != NULL) {
Guido van Rossumcc883411996-09-10 14:44:21 +0000428 char *q;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000429 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000430 /* Test for alternate separator */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000431 q = strrchr(p ? p : argv0, '/');
Guido van Rossumcc883411996-09-10 14:44:21 +0000432 if (q != NULL)
433 p = q;
434 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000435 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +0000436 if (n > 1 && p[-1] != ':')
437 n--; /* Drop trailing separator */
438 }
439 }
440#else /* All other filename syntaxes */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000441 if (argc > 0 && argv0 != NULL)
442 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000443 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000444 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +0000445#if SEP == '/' /* Special case for Unix filename syntax */
446 if (n > 1)
447 n--; /* Drop trailing separator */
448#endif /* Unix */
449 }
450#endif /* All others */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000451 a = newsizedstringobject(argv0, n);
Guido van Rossum94a96671996-07-30 20:35:50 +0000452 if (a == NULL)
453 fatal("no mem for sys.path insertion");
454 if (inslistitem(path, 0, a) < 0)
455 fatal("sys.path.insert(0) failed");
456 DECREF(a);
Guido van Rossuma63d9f41996-07-24 01:31:37 +0000457 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000458 DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000459}