blob: b758344f310e8ecd753fdf56766e09dad7dcaf62 [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 Rossum65bf9f21997-04-29 18:33:38 +000047#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048
Guido van Rossume2437a11992-03-23 18:20:18 +000049#include "osdefs.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000050
Guido van Rossumc474dea1997-04-25 15:38:31 +000051#if HAVE_UNISTD_H
52#include <unistd.h>
53#endif
54
Guido van Rossum65bf9f21997-04-29 18:33:38 +000055static PyObject *sysdict;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000056
Guido van Rossum9b38a141996-09-11 23:12:24 +000057#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +000058extern void *PyWin_DLLhModule;
59#endif
60
Guido van Rossum65bf9f21997-04-29 18:33:38 +000061PyObject *
62PySys_GetObject(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000063 char *name;
64{
Guido van Rossum65bf9f21997-04-29 18:33:38 +000065 return PyDict_GetItemString(sysdict, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066}
67
68FILE *
Guido van Rossum65bf9f21997-04-29 18:33:38 +000069PySys_GetFile(name, def)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070 char *name;
71 FILE *def;
72{
73 FILE *fp = NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +000074 PyObject *v = PySys_GetObject(name);
75 if (v != NULL && PyFile_Check(v))
76 fp = PyFile_AsFile(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000077 if (fp == NULL)
78 fp = def;
79 return fp;
80}
81
82int
Guido van Rossum65bf9f21997-04-29 18:33:38 +000083PySys_SetObject(name, v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000084 char *name;
Guido van Rossum65bf9f21997-04-29 18:33:38 +000085 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086{
Guido van Rossum5ad58c61992-01-26 18:15:48 +000087 if (v == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +000088 if (PyDict_GetItemString(sysdict, name) == NULL)
Guido van Rossum5ad58c61992-01-26 18:15:48 +000089 return 0;
90 else
Guido van Rossum65bf9f21997-04-29 18:33:38 +000091 return PyDict_DelItemString(sysdict, name);
Guido van Rossum5ad58c61992-01-26 18:15:48 +000092 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093 else
Guido van Rossum65bf9f21997-04-29 18:33:38 +000094 return PyDict_SetItemString(sysdict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000095}
96
Guido van Rossum65bf9f21997-04-29 18:33:38 +000097static PyObject *
Guido van Rossuma027efa1997-05-05 20:56:21 +000098sys_exc_info(self, args)
99 PyObject *self;
100 PyObject *args;
101{
102 PyThreadState *tstate;
103 if (!PyArg_Parse(args, ""))
104 return NULL;
105 tstate = PyThreadState_Get();
106 if (tstate == NULL)
107 Py_FatalError("sys.exc_info(): no thread state");
108 return Py_BuildValue(
109 "(OOO)",
110 tstate->exc_type != NULL ? tstate->exc_type : Py_None,
111 tstate->exc_value != NULL ? tstate->exc_value : Py_None,
112 tstate->exc_traceback != NULL ?
113 tstate->exc_traceback : Py_None);
114}
115
116static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000117sys_exit(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000118 PyObject *self;
119 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120{
Guido van Rossum6a468bf1991-12-31 13:15:35 +0000121 /* Raise SystemExit so callers may catch it or clean up. */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000122 PyErr_SetObject(PyExc_SystemExit, args);
Guido van Rossum6a468bf1991-12-31 13:15:35 +0000123 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124}
125
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000126static PyObject *
Guido van Rossume2437a11992-03-23 18:20:18 +0000127sys_settrace(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000128 PyObject *self;
129 PyObject *args;
Guido van Rossume2437a11992-03-23 18:20:18 +0000130{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000131 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000132 if (args == Py_None)
Guido van Rossume2437a11992-03-23 18:20:18 +0000133 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000134 else
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000135 Py_XINCREF(args);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000136 Py_XDECREF(tstate->sys_tracefunc);
137 tstate->sys_tracefunc = args;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000138 Py_INCREF(Py_None);
139 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000140}
141
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000142static PyObject *
Guido van Rossume2437a11992-03-23 18:20:18 +0000143sys_setprofile(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000144 PyObject *self;
145 PyObject *args;
Guido van Rossume2437a11992-03-23 18:20:18 +0000146{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000147 PyThreadState *tstate = PyThreadState_Get();
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000148 if (args == Py_None)
Guido van Rossume2437a11992-03-23 18:20:18 +0000149 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000150 else
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000151 Py_XINCREF(args);
Guido van Rossuma027efa1997-05-05 20:56:21 +0000152 Py_XDECREF(tstate->sys_profilefunc);
153 tstate->sys_profilefunc = args;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000154 Py_INCREF(Py_None);
155 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000156}
157
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000158static PyObject *
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000159sys_setcheckinterval(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000160 PyObject *self;
161 PyObject *args;
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000162{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000163 PyThreadState *tstate = PyThreadState_Get();
164 if (!PyArg_ParseTuple(args, "i", &tstate->sys_checkinterval))
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000165 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000166 Py_INCREF(Py_None);
167 return Py_None;
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000168}
169
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000170#ifdef USE_MALLOPT
171/* Link with -lmalloc (or -lmpc) on an SGI */
172#include <malloc.h>
173
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000174static PyObject *
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000175sys_mdebug(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000176 PyObject *self;
177 PyObject *args;
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000178{
179 int flag;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000180 if (!PyArg_Parse(args, "i", &flag))
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000181 return NULL;
182 mallopt(M_DEBUG, flag);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000183 Py_INCREF(Py_None);
184 return Py_None;
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000185}
186#endif /* USE_MALLOPT */
187
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000188static PyObject *
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000189sys_getrefcount(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000190 PyObject *self;
191 PyObject *args;
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000192{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000193 PyObject *arg;
194 if (!PyArg_Parse(args, "O", &arg))
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000195 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000196 return PyInt_FromLong((long) arg->ob_refcnt);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000197}
198
199#ifdef COUNT_ALLOCS
200static PyObject *
201sys_getcounts(self, args)
202 PyObject *self, *args;
203{
204 extern PyObject *get_counts Py_PROTO((void));
205
206 if (!PyArg_Parse(args, ""))
207 return NULL;
208 return get_counts();
209}
210#endif
211
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000212#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000213/* Defined in objects.c because it uses static globals if that file */
214extern PyObject *_Py_GetObjects Py_PROTO((PyObject *, PyObject *));
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000215#endif
Guido van Rossumded690f1996-05-24 20:48:31 +0000216
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000217#ifdef DYNAMIC_EXECUTION_PROFILE
218/* Defined in ceval.c because it uses static globals if that file */
219extern PyObject *_Py_GetDXProfile Py_PROTO((PyObject *, PyObject *));
220#endif
221
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000222static PyMethodDef sys_methods[] = {
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000223 /* Might as well keep this in alphabetic order */
Guido van Rossuma027efa1997-05-05 20:56:21 +0000224 {"exc_info", sys_exc_info, 0},
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000225 {"exit", sys_exit, 0},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000226#ifdef COUNT_ALLOCS
227 {"getcounts", sys_getcounts, 0},
228#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000229#ifdef DYNAMIC_EXECUTION_PROFILE
230 {"getdxp", _Py_GetDXProfile, 1},
231#endif
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000232#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000233 {"getobjects", _Py_GetObjects, 1},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000234#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000235 {"getrefcount", sys_getrefcount, 0},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000236#ifdef USE_MALLOPT
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000237 {"mdebug", sys_mdebug, 0},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000238#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000239 {"setcheckinterval", sys_setcheckinterval, 1},
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000240 {"setprofile", sys_setprofile, 0},
241 {"settrace", sys_settrace, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000242 {NULL, NULL} /* sentinel */
243};
244
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000245static PyObject *sysin, *sysout, *syserr;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000246
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000247static PyObject *
Guido van Rossum34679b71993-01-26 13:33:44 +0000248list_builtin_module_names()
249{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000250 PyObject *list = PyList_New(0);
Guido van Rossum34679b71993-01-26 13:33:44 +0000251 int i;
252 if (list == NULL)
253 return NULL;
Guido van Rossumbb5c6f81997-04-29 20:42:30 +0000254 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000255 PyObject *name = PyString_FromString(
256 _PyImport_Inittab[i].name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000257 if (name == NULL)
258 break;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000259 PyList_Append(list, name);
260 Py_DECREF(name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000261 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000262 if (PyList_Sort(list) != 0) {
263 Py_DECREF(list);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000264 list = NULL;
265 }
Guido van Rossum8f49e121997-01-06 22:55:54 +0000266 if (list) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000267 PyObject *v = PyList_AsTuple(list);
268 Py_DECREF(list);
Guido van Rossum8f49e121997-01-06 22:55:54 +0000269 list = v;
270 }
Guido van Rossum34679b71993-01-26 13:33:44 +0000271 return list;
272}
273
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274void
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000275PySys_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000276{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000277 extern long PyInt_GetMax Py_PROTO((void));
278 extern char *Py_GetVersion Py_PROTO((void));
279 extern char *Py_GetCopyright Py_PROTO((void));
280 extern char *Py_GetPlatform Py_PROTO((void));
281 extern char *Py_GetPrefix Py_PROTO((void));
282 extern char *Py_GetExecPrefix Py_PROTO((void));
283 extern int fclose Py_PROTO((FILE *));
284 PyObject *m = Py_InitModule("sys", sys_methods);
285 PyObject *v;
286 sysdict = PyModule_GetDict(m);
287 Py_INCREF(sysdict);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000288 /* NB keep an extra ref to the std files to avoid closing them
289 when the user deletes them */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000290 sysin = PyFile_FromFile(stdin, "<stdin>", "r", fclose);
291 sysout = PyFile_FromFile(stdout, "<stdout>", "w", fclose);
292 syserr = PyFile_FromFile(stderr, "<stderr>", "w", fclose);
293 if (PyErr_Occurred())
294 Py_FatalError("can't initialize sys.std{in,out,err}");
295 PyDict_SetItemString(sysdict, "stdin", sysin);
296 PyDict_SetItemString(sysdict, "stdout", sysout);
297 PyDict_SetItemString(sysdict, "stderr", syserr);
298 PyDict_SetItemString(sysdict, "version",
299 v = PyString_FromString(Py_GetVersion()));
300 Py_XDECREF(v);
301 PyDict_SetItemString(sysdict, "copyright",
302 v = PyString_FromString(Py_GetCopyright()));
303 Py_XDECREF(v);
304 PyDict_SetItemString(sysdict, "platform",
305 v = PyString_FromString(Py_GetPlatform()));
306 Py_XDECREF(v);
307 PyDict_SetItemString(sysdict, "prefix",
308 v = PyString_FromString(Py_GetPrefix()));
309 Py_XDECREF(v);
310 PyDict_SetItemString(sysdict, "exec_prefix",
311 v = PyString_FromString(Py_GetExecPrefix()));
312 Py_XDECREF(v);
313 PyDict_SetItemString(sysdict, "maxint",
314 v = PyInt_FromLong(PyInt_GetMax()));
315 Py_XDECREF(v);
316 PyDict_SetItemString(sysdict, "modules", PyImport_GetModuleDict());
317 PyDict_SetItemString(sysdict, "builtin_module_names",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000318 v = list_builtin_module_names());
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000319 Py_XDECREF(v);
Guido van Rossum8b9ea871996-08-23 18:14:47 +0000320#ifdef MS_COREDLL
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000321 PyDict_SetItemString(sysdict, "dllhandle",
322 v = PyInt_FromLong((int)PyWin_DLLhModule));
323 Py_XDECREF(v);
324 PyDict_SetItemString(sysdict, "winver",
325 v = PyString_FromString(MS_DLL_ID));
326 Py_XDECREF(v);
Guido van Rossumc606fe11996-04-09 02:37:57 +0000327#endif
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000328 if (PyErr_Occurred())
329 Py_FatalError("can't insert sys.* objects in sys dict");
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000330}
331
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000332static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000333makepathobject(path, delim)
334 char *path;
335 int delim;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000336{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000337 int i, n;
338 char *p;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000339 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000340
341 n = 1;
342 p = path;
343 while ((p = strchr(p, delim)) != NULL) {
344 n++;
345 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000346 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000347 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000348 if (v == NULL)
349 return NULL;
350 for (i = 0; ; i++) {
351 p = strchr(path, delim);
352 if (p == NULL)
353 p = strchr(path, '\0'); /* End of string */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000354 w = PyString_FromStringAndSize(path, (int) (p - path));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000355 if (w == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000356 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000357 return NULL;
358 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000359 PyList_SetItem(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000360 if (*p == '\0')
361 break;
362 path = p+1;
363 }
364 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365}
366
367void
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000368PySys_SetPath(path)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000369 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000370{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000371 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000372 if ((v = makepathobject(path, DELIM)) == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000373 Py_FatalError("can't create sys.path");
374 if (PySys_SetObject("path", v) != 0)
375 Py_FatalError("can't assign sys.path");
376 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000377}
378
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000379static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000380makeargvobject(argc, argv)
381 int argc;
382 char **argv;
383{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000384 PyObject *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +0000385 if (argc <= 0 || argv == NULL) {
386 /* Ensure at least one (empty) argument is seen */
387 static char *empty_argv[1] = {""};
388 argv = empty_argv;
389 argc = 1;
390 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000391 av = PyList_New(argc);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000392 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000393 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000394 for (i = 0; i < argc; i++) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000395 PyObject *v = PyString_FromString(argv[i]);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000396 if (v == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000397 Py_DECREF(av);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000398 av = NULL;
399 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000400 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000401 PyList_SetItem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000402 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000403 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000404 return av;
405}
406
407void
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000408PySys_SetArgv(argc, argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000409 int argc;
410 char **argv;
411{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000412 PyObject *av = makeargvobject(argc, argv);
413 PyObject *path = PySys_GetObject("path");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000414 if (av == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000415 Py_FatalError("no mem for sys.argv");
416 if (PySys_SetObject("argv", av) != 0)
417 Py_FatalError("can't assign sys.argv");
Guido van Rossum94a96671996-07-30 20:35:50 +0000418 if (path != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000419 char *argv0 = argv[0];
Guido van Rossum94a96671996-07-30 20:35:50 +0000420 char *p = NULL;
Guido van Rossumcc883411996-09-10 14:44:21 +0000421 int n = 0;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000422 PyObject *a;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000423#ifdef HAVE_READLINK
424 char link[MAXPATHLEN+1];
425 char argv0copy[2*MAXPATHLEN+1];
426 int nr = 0;
427 if (argc > 0 && argv0 != NULL)
428 nr = readlink(argv0, link, MAXPATHLEN);
429 if (nr > 0) {
430 /* It's a symlink */
431 link[nr] = '\0';
432 if (link[0] == SEP)
433 argv0 = link; /* Link to absolute path */
434 else if (strchr(link, SEP) == NULL)
435 ; /* Link without path */
436 else {
437 /* Must join(dirname(argv0), link) */
438 char *q = strrchr(argv0, SEP);
439 if (q == NULL)
440 argv0 = link; /* argv0 without path */
441 else {
442 /* Must make a copy */
443 strcpy(argv0copy, argv0);
444 q = strrchr(argv0copy, SEP);
445 strcpy(q+1, link);
446 argv0 = argv0copy;
447 }
448 }
449 }
450#endif /* HAVE_READLINK */
Guido van Rossumcc883411996-09-10 14:44:21 +0000451#if SEP == '\\' /* Special case for MS filename syntax */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000452 if (argc > 0 && argv0 != NULL) {
Guido van Rossumcc883411996-09-10 14:44:21 +0000453 char *q;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000454 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000455 /* Test for alternate separator */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000456 q = strrchr(p ? p : argv0, '/');
Guido van Rossumcc883411996-09-10 14:44:21 +0000457 if (q != NULL)
458 p = q;
459 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000460 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +0000461 if (n > 1 && p[-1] != ':')
462 n--; /* Drop trailing separator */
463 }
464 }
465#else /* All other filename syntaxes */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000466 if (argc > 0 && argv0 != NULL)
467 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000468 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000469 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +0000470#if SEP == '/' /* Special case for Unix filename syntax */
471 if (n > 1)
472 n--; /* Drop trailing separator */
473#endif /* Unix */
474 }
475#endif /* All others */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000476 a = PyString_FromStringAndSize(argv0, n);
Guido van Rossum94a96671996-07-30 20:35:50 +0000477 if (a == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000478 Py_FatalError("no mem for sys.path insertion");
479 if (PyList_Insert(path, 0, a) < 0)
480 Py_FatalError("sys.path.insert(0) failed");
481 Py_DECREF(a);
Guido van Rossuma63d9f41996-07-24 01:31:37 +0000482 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000483 Py_DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000484}