sysmodule.c revision a71b5f4e1d39cda3d78a20a1c41056d362c56630
1/***********************************************************
2Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
4
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 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.
16
17While 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.
29
30******************************************************************/
31
32/* System module */
33
34/*
35Various bits of information used by the interpreter are collected in
36module 'sys'.
37Function member:
38- exit(sts): raise SystemExit
39Data members:
40- stdin, stdout, stderr: standard file objects
41- modules: the table of modules (dictionary)
42- path: module search path (list of strings)
43- argv: script arguments (list of strings)
44- ps1, ps2: optional primary and secondary prompts (strings)
45*/
46
47#include "Python.h"
48
49#include "osdefs.h"
50
51#ifdef HAVE_UNISTD_H
52#include <unistd.h>
53#endif
54
55#ifdef MS_COREDLL
56extern void *PyWin_DLLhModule;
57/* A string loaded from the DLL at startup: */
58extern const char *PyWin_DLLVersionString;
59#endif
60
61PyObject *
62PySys_GetObject(name)
63	char *name;
64{
65	PyThreadState *tstate = PyThreadState_Get();
66	PyObject *sd = tstate->interp->sysdict;
67	return PyDict_GetItemString(sd, name);
68}
69
70FILE *
71PySys_GetFile(name, def)
72	char *name;
73	FILE *def;
74{
75	FILE *fp = NULL;
76	PyObject *v = PySys_GetObject(name);
77	if (v != NULL && PyFile_Check(v))
78		fp = PyFile_AsFile(v);
79	if (fp == NULL)
80		fp = def;
81	return fp;
82}
83
84int
85PySys_SetObject(name, v)
86	char *name;
87	PyObject *v;
88{
89	PyThreadState *tstate = PyThreadState_Get();
90	PyObject *sd = tstate->interp->sysdict;
91	if (v == NULL) {
92		if (PyDict_GetItemString(sd, name) == NULL)
93			return 0;
94		else
95			return PyDict_DelItemString(sd, name);
96	}
97	else
98		return PyDict_SetItemString(sd, name, v);
99}
100
101static PyObject *
102sys_exc_info(self, args)
103	PyObject *self;
104	PyObject *args;
105{
106	PyThreadState *tstate;
107	if (!PyArg_Parse(args, ""))
108		return NULL;
109	tstate = PyThreadState_Get();
110	return Py_BuildValue(
111		"(OOO)",
112		tstate->exc_type != NULL ? tstate->exc_type : Py_None,
113		tstate->exc_value != NULL ? tstate->exc_value : Py_None,
114		tstate->exc_traceback != NULL ?
115			tstate->exc_traceback : Py_None);
116}
117
118static char exc_info_doc[] =
119"exc_info() -> (type, value, traceback)\n\
120\n\
121Return information about the exception that is currently being handled.\n\
122This should be called from inside an except clause only.";
123
124static PyObject *
125sys_exit(self, args)
126	PyObject *self;
127	PyObject *args;
128{
129	/* Raise SystemExit so callers may catch it or clean up. */
130	PyErr_SetObject(PyExc_SystemExit, args);
131	return NULL;
132}
133
134static char exit_doc[] =
135"exit([status])\n\
136\n\
137Exit the interpreter by raising SystemExit(status).\n\
138If the status is omitted or None, it defaults to zero (i.e., success).\n\
139If the status numeric, it will be used as the system exit status.\n\
140If it is another kind of object, it will be printed and the system\n\
141exit status will be one (i.e., failure).";
142
143static PyObject *
144sys_settrace(self, args)
145	PyObject *self;
146	PyObject *args;
147{
148	PyThreadState *tstate = PyThreadState_Get();
149	if (args == Py_None)
150		args = NULL;
151	else
152		Py_XINCREF(args);
153	Py_XDECREF(tstate->sys_tracefunc);
154	tstate->sys_tracefunc = args;
155	Py_INCREF(Py_None);
156	return Py_None;
157}
158
159static char settrace_doc[] =
160"settrace(function)\n\
161\n\
162Set the global debug tracing function.  It will be called on each\n\
163function call.  See the debugger chapter in the library manual.";
164
165static PyObject *
166sys_setprofile(self, args)
167	PyObject *self;
168	PyObject *args;
169{
170	PyThreadState *tstate = PyThreadState_Get();
171	if (args == Py_None)
172		args = NULL;
173	else
174		Py_XINCREF(args);
175	Py_XDECREF(tstate->sys_profilefunc);
176	tstate->sys_profilefunc = args;
177	Py_INCREF(Py_None);
178	return Py_None;
179}
180
181static char setprofile_doc[] =
182"setprofile(function)\n\
183\n\
184Set the profiling function.  It will be called on each function call\n\
185and return.  See the profiler chapter in the library manual.";
186
187static PyObject *
188sys_setcheckinterval(self, args)
189	PyObject *self;
190	PyObject *args;
191{
192	PyThreadState *tstate = PyThreadState_Get();
193	if (!PyArg_ParseTuple(args, "i", &tstate->interp->checkinterval))
194		return NULL;
195	Py_INCREF(Py_None);
196	return Py_None;
197}
198
199static char setcheckinterval_doc[] =
200"setcheckinterval(n)\n\
201\n\
202Tell the Python interpreter to check for asynchronous events every\n\
203n instructions.  This also affects how often thread switches occur.";
204
205#ifdef USE_MALLOPT
206/* Link with -lmalloc (or -lmpc) on an SGI */
207#include <malloc.h>
208
209static PyObject *
210sys_mdebug(self, args)
211	PyObject *self;
212	PyObject *args;
213{
214	int flag;
215	if (!PyArg_Parse(args, "i", &flag))
216		return NULL;
217	mallopt(M_DEBUG, flag);
218	Py_INCREF(Py_None);
219	return Py_None;
220}
221#endif /* USE_MALLOPT */
222
223static PyObject *
224sys_getrefcount(self, args)
225	PyObject *self;
226	PyObject *args;
227{
228	PyObject *arg;
229	if (!PyArg_Parse(args, "O", &arg))
230		return NULL;
231	return PyInt_FromLong((long) arg->ob_refcnt);
232}
233
234static char getrefcount_doc[] =
235"getrefcount(object) -> integer\n\
236\n\
237Return the current reference count for the object.  This includes the\n\
238temporary reference in the argument list, so it is at least 2.";
239
240#ifdef COUNT_ALLOCS
241static PyObject *
242sys_getcounts(self, args)
243	PyObject *self, *args;
244{
245	extern PyObject *get_counts Py_PROTO((void));
246
247	if (!PyArg_Parse(args, ""))
248		return NULL;
249	return get_counts();
250}
251#endif
252
253#ifdef Py_TRACE_REFS
254/* Defined in objects.c because it uses static globals if that file */
255extern PyObject *_Py_GetObjects Py_PROTO((PyObject *, PyObject *));
256#endif
257
258#ifdef DYNAMIC_EXECUTION_PROFILE
259/* Defined in ceval.c because it uses static globals if that file */
260extern PyObject *_Py_GetDXProfile Py_PROTO((PyObject *,  PyObject *));
261#endif
262
263static PyMethodDef sys_methods[] = {
264	/* Might as well keep this in alphabetic order */
265	{"exc_info",	sys_exc_info, 0, exc_info_doc},
266	{"exit",	sys_exit, 0, exit_doc},
267#ifdef COUNT_ALLOCS
268	{"getcounts",	sys_getcounts, 0},
269#endif
270#ifdef DYNAMIC_EXECUTION_PROFILE
271	{"getdxp",	_Py_GetDXProfile, 1},
272#endif
273#ifdef Py_TRACE_REFS
274	{"getobjects",	_Py_GetObjects, 1},
275#endif
276	{"getrefcount",	sys_getrefcount, 0, getrefcount_doc},
277#ifdef USE_MALLOPT
278	{"mdebug",	sys_mdebug, 0},
279#endif
280	{"setcheckinterval",	sys_setcheckinterval, 1, setcheckinterval_doc},
281	{"setprofile",	sys_setprofile, 0, setprofile_doc},
282	{"settrace",	sys_settrace, 0, settrace_doc},
283	{NULL,		NULL}		/* sentinel */
284};
285
286static PyObject *
287list_builtin_module_names()
288{
289	PyObject *list = PyList_New(0);
290	int i;
291	if (list == NULL)
292		return NULL;
293	for (i = 0; PyImport_Inittab[i].name != NULL; i++) {
294		PyObject *name = PyString_FromString(
295			PyImport_Inittab[i].name);
296		if (name == NULL)
297			break;
298		PyList_Append(list, name);
299		Py_DECREF(name);
300	}
301	if (PyList_Sort(list) != 0) {
302		Py_DECREF(list);
303		list = NULL;
304	}
305	if (list) {
306		PyObject *v = PyList_AsTuple(list);
307		Py_DECREF(list);
308		list = v;
309	}
310	return list;
311}
312
313/* XXX This doc string is too long to be a single string literal in VC++ 5.0.
314   Two literals concatenated works just fine.  If you have a K&R compiler
315   or other abomination that however *does* understand longer strings,
316   get rid of the !!! comment in the middle and the quotes that surround it. */
317static char sys_doc[] =
318"This module provides access to some objects used or maintained by the\n\
319interpreter and to functions that interact strongly with the interpreter.\n\
320\n\
321Dynamic objects:\n\
322\n\
323argv -- command line arguments; argv[0] is the script pathname if known\n\
324path -- module search path; path[0] is the script directory, else ''\n\
325modules -- dictionary of loaded modules\n\
326exitfunc -- you may set this to a function to be called when Python exits\n\
327\n\
328stdin -- standard input file object; used by raw_input() and input()\n\
329stdout -- standard output file object; used by the print statement\n\
330stderr -- standard error object; used for error messages\n\
331  By assigning another file object (or an object that behaves like a file)\n\
332  to one of these, it is possible to redirect all of the interpreter's I/O.\n\
333\n\
334last_type -- type of last uncaught exception\n\
335last_value -- value of last uncaught exception\n\
336last_traceback -- traceback of last uncaught exception\n\
337  These three are only available in an interactive session after a\n\
338  traceback has been printed.\n\
339\n\
340exc_type -- type of exception currently being handled\n\
341exc_value -- value of exception currently being handled\n\
342exc_traceback -- traceback of exception currently being handled\n\
343  The function exc_info() should be used instead of these three,\n\
344  because it is thread-safe.\n\
345"
346#ifndef MS_WIN16
347/* Concatenating string here */
348"\n\
349Static objects:\n\
350\n\
351maxint -- the largest supported integer (the smallest is -maxint-1)\n\
352builtin_module_names -- tuple of module names built into this intepreter\n\
353version -- the version of this interpreter\n\
354copyright -- copyright notice pertaining to this interpreter\n\
355platform -- platform identifier\n\
356executable -- pathname of this Python interpreter\n\
357prefix -- prefix used to find the Python library\n\
358exec_prefix -- prefix used to find the machine-specific Python library\n\
359dllhandle -- [Windows only] integer handle of the Python DLL\n\
360winver -- [Windows only] version number of the Python DLL\n\
361__stdin__ -- the original stdin; don't use!\n\
362__stdout__ -- the original stdout; don't use!\n\
363__stderr__ -- the original stderr; don't use!\n\
364\n\
365Functions:\n\
366\n\
367exc_info() -- return thread-safe information about the current exception\n\
368exit() -- exit the interpreter by raising SystemExit\n\
369getrefcount() -- return the reference count for an object (plus one :-)\n\
370setcheckinterval() -- control how often the interpreter checks for events\n\
371setprofile() -- set the global profiling function\n\
372settrace() -- set the global debug tracing function\n\
373";
374#endif
375
376PyObject *
377_PySys_Init()
378{
379	extern int fclose Py_PROTO((FILE *));
380	PyObject *m, *v, *sysdict;
381	PyObject *sysin, *sysout, *syserr;
382
383	m = Py_InitModule3("sys", sys_methods, sys_doc);
384	sysdict = PyModule_GetDict(m);
385
386	sysin = PyFile_FromFile(stdin, "<stdin>", "r", NULL);
387	sysout = PyFile_FromFile(stdout, "<stdout>", "w", NULL);
388	syserr = PyFile_FromFile(stderr, "<stderr>", "w", NULL);
389	if (PyErr_Occurred())
390		return NULL;
391	PyDict_SetItemString(sysdict, "stdin", sysin);
392	PyDict_SetItemString(sysdict, "stdout", sysout);
393	PyDict_SetItemString(sysdict, "stderr", syserr);
394	/* Make backup copies for cleanup */
395	PyDict_SetItemString(sysdict, "__stdin__", sysin);
396	PyDict_SetItemString(sysdict, "__stdout__", sysout);
397	PyDict_SetItemString(sysdict, "__stderr__", syserr);
398	Py_XDECREF(sysin);
399	Py_XDECREF(sysout);
400	Py_XDECREF(syserr);
401	PyDict_SetItemString(sysdict, "version",
402			     v = PyString_FromString(Py_GetVersion()));
403	PyDict_SetItemString(sysdict, "hexversion",
404			     v = PyInt_FromLong(PY_VERSION_HEX));
405	Py_XDECREF(v);
406	PyDict_SetItemString(sysdict, "copyright",
407			     v = PyString_FromString(Py_GetCopyright()));
408	Py_XDECREF(v);
409	PyDict_SetItemString(sysdict, "platform",
410			     v = PyString_FromString(Py_GetPlatform()));
411	Py_XDECREF(v);
412	PyDict_SetItemString(sysdict, "executable",
413			     v = PyString_FromString(Py_GetProgramFullPath()));
414	Py_XDECREF(v);
415	PyDict_SetItemString(sysdict, "prefix",
416			     v = PyString_FromString(Py_GetPrefix()));
417	Py_XDECREF(v);
418	PyDict_SetItemString(sysdict, "exec_prefix",
419		   v = PyString_FromString(Py_GetExecPrefix()));
420	Py_XDECREF(v);
421	PyDict_SetItemString(sysdict, "maxint",
422			     v = PyInt_FromLong(PyInt_GetMax()));
423	Py_XDECREF(v);
424	PyDict_SetItemString(sysdict, "builtin_module_names",
425		   v = list_builtin_module_names());
426	Py_XDECREF(v);
427#ifdef MS_COREDLL
428	PyDict_SetItemString(sysdict, "dllhandle",
429			     v = PyInt_FromLong((int)PyWin_DLLhModule));
430	Py_XDECREF(v);
431	PyDict_SetItemString(sysdict, "winver",
432			     v = PyString_FromString(PyWin_DLLVersionString));
433	Py_XDECREF(v);
434#endif
435	if (PyErr_Occurred())
436		return NULL;
437	return m;
438}
439
440static PyObject *
441makepathobject(path, delim)
442	char *path;
443	int delim;
444{
445	int i, n;
446	char *p;
447	PyObject *v, *w;
448
449	n = 1;
450	p = path;
451	while ((p = strchr(p, delim)) != NULL) {
452		n++;
453		p++;
454	}
455	v = PyList_New(n);
456	if (v == NULL)
457		return NULL;
458	for (i = 0; ; i++) {
459		p = strchr(path, delim);
460		if (p == NULL)
461			p = strchr(path, '\0'); /* End of string */
462		w = PyString_FromStringAndSize(path, (int) (p - path));
463		if (w == NULL) {
464			Py_DECREF(v);
465			return NULL;
466		}
467		PyList_SetItem(v, i, w);
468		if (*p == '\0')
469			break;
470		path = p+1;
471	}
472	return v;
473}
474
475void
476PySys_SetPath(path)
477	char *path;
478{
479	PyObject *v;
480	if ((v = makepathobject(path, DELIM)) == NULL)
481		Py_FatalError("can't create sys.path");
482	if (PySys_SetObject("path", v) != 0)
483		Py_FatalError("can't assign sys.path");
484	Py_DECREF(v);
485}
486
487static PyObject *
488makeargvobject(argc, argv)
489	int argc;
490	char **argv;
491{
492	PyObject *av;
493	if (argc <= 0 || argv == NULL) {
494		/* Ensure at least one (empty) argument is seen */
495		static char *empty_argv[1] = {""};
496		argv = empty_argv;
497		argc = 1;
498	}
499	av = PyList_New(argc);
500	if (av != NULL) {
501		int i;
502		for (i = 0; i < argc; i++) {
503			PyObject *v = PyString_FromString(argv[i]);
504			if (v == NULL) {
505				Py_DECREF(av);
506				av = NULL;
507				break;
508			}
509			PyList_SetItem(av, i, v);
510		}
511	}
512	return av;
513}
514
515void
516PySys_SetArgv(argc, argv)
517	int argc;
518	char **argv;
519{
520	PyObject *av = makeargvobject(argc, argv);
521	PyObject *path = PySys_GetObject("path");
522	if (av == NULL)
523		Py_FatalError("no mem for sys.argv");
524	if (PySys_SetObject("argv", av) != 0)
525		Py_FatalError("can't assign sys.argv");
526	if (path != NULL) {
527		char *argv0 = argv[0];
528		char *p = NULL;
529		int n = 0;
530		PyObject *a;
531#ifdef HAVE_READLINK
532		char link[MAXPATHLEN+1];
533		char argv0copy[2*MAXPATHLEN+1];
534		int nr = 0;
535		if (argc > 0 && argv0 != NULL)
536			nr = readlink(argv0, link, MAXPATHLEN);
537		if (nr > 0) {
538			/* It's a symlink */
539			link[nr] = '\0';
540			if (link[0] == SEP)
541				argv0 = link; /* Link to absolute path */
542			else if (strchr(link, SEP) == NULL)
543				; /* Link without path */
544			else {
545				/* Must join(dirname(argv0), link) */
546				char *q = strrchr(argv0, SEP);
547				if (q == NULL)
548					argv0 = link; /* argv0 without path */
549				else {
550					/* Must make a copy */
551					strcpy(argv0copy, argv0);
552					q = strrchr(argv0copy, SEP);
553					strcpy(q+1, link);
554					argv0 = argv0copy;
555				}
556			}
557		}
558#endif /* HAVE_READLINK */
559#if SEP == '\\' /* Special case for MS filename syntax */
560		if (argc > 0 && argv0 != NULL) {
561			char *q;
562			p = strrchr(argv0, SEP);
563			/* Test for alternate separator */
564			q = strrchr(p ? p : argv0, '/');
565			if (q != NULL)
566				p = q;
567			if (p != NULL) {
568				n = p + 1 - argv0;
569				if (n > 1 && p[-1] != ':')
570					n--; /* Drop trailing separator */
571			}
572		}
573#else /* All other filename syntaxes */
574		if (argc > 0 && argv0 != NULL)
575			p = strrchr(argv0, SEP);
576		if (p != NULL) {
577			n = p + 1 - argv0;
578#if SEP == '/' /* Special case for Unix filename syntax */
579			if (n > 1)
580				n--; /* Drop trailing separator */
581#endif /* Unix */
582		}
583#endif /* All others */
584		a = PyString_FromStringAndSize(argv0, n);
585		if (a == NULL)
586			Py_FatalError("no mem for sys.path insertion");
587		if (PyList_Insert(path, 0, a) < 0)
588			Py_FatalError("sys.path.insert(0) failed");
589		Py_DECREF(a);
590	}
591	Py_DECREF(av);
592}
593
594
595/* APIs to write to sys.stdout or sys.stderr using a printf-like interface.
596   Adapted from code submitted by Just van Rossum.
597
598   PySys_WriteStdout(format, ...)
599   PySys_WriteStderr(format, ...)
600
601      The first function writes to sys.stdout; the second to sys.stderr.  When
602      there is a problem, they write to the real (C level) stdout or stderr;
603      no exceptions are raised.
604
605      Both take a printf-style format string as their first argument followed
606      by a variable length argument list determined by the format string.
607
608      *** WARNING ***
609
610      The format should limit the total size of the formatted output string to
611      1000 bytes.  In particular, this means that no unrestricted "%s" formats
612      should occur; these should be limited using "%.<N>s where <N> is a
613      decimal number calculated so that <N> plus the maximum size of other
614      formatted text does not exceed 1000 bytes.  Also watch out for "%f",
615      which can print hundreds of digits for very large numbers.
616
617 */
618
619static void
620mywrite(name, fp, format, va)
621	char *name;
622	FILE *fp;
623	const char *format;
624	va_list va;
625{
626	PyObject *file;
627	PyObject *error_type, *error_value, *error_traceback;
628
629	PyErr_Fetch(&error_type, &error_value, &error_traceback);
630	file = PySys_GetObject(name);
631	if (file == NULL || PyFile_AsFile(file) == fp)
632		vfprintf(fp, format, va);
633	else {
634		char buffer[1001];
635		if (vsprintf(buffer, format, va) >= sizeof(buffer))
636		    Py_FatalError("PySys_WriteStdout/err: buffer overrun");
637		if (PyFile_WriteString(buffer, file) != 0) {
638			PyErr_Clear();
639			fputs(buffer, fp);
640		}
641	}
642	PyErr_Restore(error_type, error_value, error_traceback);
643}
644
645void
646#ifdef HAVE_STDARG_PROTOTYPES
647PySys_WriteStdout(const char *format, ...)
648#else
649PySys_WriteStdout(va_alist)
650	va_dcl
651#endif
652{
653	va_list va;
654
655#ifdef HAVE_STDARG_PROTOTYPES
656	va_start(va, format);
657#else
658	char *format;
659	va_start(va);
660	format = va_arg(va, char *);
661#endif
662	mywrite("stdout", stdout, format, va);
663	va_end(va);
664}
665
666void
667#ifdef HAVE_STDARG_PROTOTYPES
668PySys_WriteStderr(const char *format, ...)
669#else
670PySys_WriteStderr(va_alist)
671	va_dcl
672#endif
673{
674	va_list va;
675
676#ifdef HAVE_STDARG_PROTOTYPES
677	va_start(va, format);
678#else
679	char *format;
680	va_start(va);
681	format = va_arg(va, char *);
682#endif
683	mywrite("stderr", stderr, format, va);
684	va_end(va);
685}
686