blob: 68b176f43075e7fac94732b781907e2055b32fa8 [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 Rossum1254d791997-05-20 15:57:25 +000051#ifdef HAVE_UNISTD_H
Guido van Rossumc474dea1997-04-25 15:38:31 +000052#include <unistd.h>
53#endif
54
Guido van Rossum9b38a141996-09-11 23:12:24 +000055#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +000056extern void *PyWin_DLLhModule;
57#endif
58
Guido van Rossum65bf9f21997-04-29 18:33:38 +000059PyObject *
60PySys_GetObject(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000061 char *name;
62{
Guido van Rossum25ce5661997-08-02 03:10:38 +000063 PyThreadState *tstate = PyThreadState_Get();
64 PyObject *sd = tstate->interp->sysdict;
65 return PyDict_GetItemString(sd, 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 Rossum25ce5661997-08-02 03:10:38 +000087 PyThreadState *tstate = PyThreadState_Get();
88 PyObject *sd = tstate->interp->sysdict;
Guido van Rossum5ad58c61992-01-26 18:15:48 +000089 if (v == NULL) {
Guido van Rossum25ce5661997-08-02 03:10:38 +000090 if (PyDict_GetItemString(sd, name) == NULL)
Guido van Rossum5ad58c61992-01-26 18:15:48 +000091 return 0;
92 else
Guido van Rossum25ce5661997-08-02 03:10:38 +000093 return PyDict_DelItemString(sd, name);
Guido van Rossum5ad58c61992-01-26 18:15:48 +000094 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000095 else
Guido van Rossum25ce5661997-08-02 03:10:38 +000096 return PyDict_SetItemString(sd, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097}
98
Guido van Rossum65bf9f21997-04-29 18:33:38 +000099static PyObject *
Guido van Rossuma027efa1997-05-05 20:56:21 +0000100sys_exc_info(self, args)
101 PyObject *self;
102 PyObject *args;
103{
104 PyThreadState *tstate;
105 if (!PyArg_Parse(args, ""))
106 return NULL;
107 tstate = PyThreadState_Get();
Guido van Rossuma027efa1997-05-05 20:56:21 +0000108 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();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000164 if (!PyArg_ParseTuple(args, "i", &tstate->interp->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 *
Guido van Rossum34679b71993-01-26 13:33:44 +0000246list_builtin_module_names()
247{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000248 PyObject *list = PyList_New(0);
Guido van Rossum34679b71993-01-26 13:33:44 +0000249 int i;
250 if (list == NULL)
251 return NULL;
Guido van Rossumbb5c6f81997-04-29 20:42:30 +0000252 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
Guido van Rossuma027efa1997-05-05 20:56:21 +0000253 PyObject *name = PyString_FromString(
254 _PyImport_Inittab[i].name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000255 if (name == NULL)
256 break;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000257 PyList_Append(list, name);
258 Py_DECREF(name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000259 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000260 if (PyList_Sort(list) != 0) {
261 Py_DECREF(list);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000262 list = NULL;
263 }
Guido van Rossum8f49e121997-01-06 22:55:54 +0000264 if (list) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000265 PyObject *v = PyList_AsTuple(list);
266 Py_DECREF(list);
Guido van Rossum8f49e121997-01-06 22:55:54 +0000267 list = v;
268 }
Guido van Rossum34679b71993-01-26 13:33:44 +0000269 return list;
270}
271
Guido van Rossum25ce5661997-08-02 03:10:38 +0000272PyObject *
273_PySys_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000274{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000275 extern int fclose Py_PROTO((FILE *));
Guido van Rossum25ce5661997-08-02 03:10:38 +0000276 PyThreadState *tstate;
277 PyObject *m, *v, *sysdict;
278 PyObject *sysin, *sysout, *syserr;
279
280 m = Py_InitModule("sys", sys_methods);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000281 sysdict = PyModule_GetDict(m);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000282
283 sysin = PyFile_FromFile(stdin, "<stdin>", "r", NULL);
284 sysout = PyFile_FromFile(stdout, "<stdout>", "w", NULL);
285 syserr = PyFile_FromFile(stderr, "<stderr>", "w", NULL);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000286 if (PyErr_Occurred())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000287 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000288 PyDict_SetItemString(sysdict, "stdin", sysin);
289 PyDict_SetItemString(sysdict, "stdout", sysout);
290 PyDict_SetItemString(sysdict, "stderr", syserr);
Guido van Rossum25ce5661997-08-02 03:10:38 +0000291 Py_XDECREF(sysin);
292 Py_XDECREF(sysout);
293 Py_XDECREF(syserr);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000294 PyDict_SetItemString(sysdict, "version",
295 v = PyString_FromString(Py_GetVersion()));
296 Py_XDECREF(v);
297 PyDict_SetItemString(sysdict, "copyright",
298 v = PyString_FromString(Py_GetCopyright()));
299 Py_XDECREF(v);
300 PyDict_SetItemString(sysdict, "platform",
301 v = PyString_FromString(Py_GetPlatform()));
302 Py_XDECREF(v);
Guido van Rossumb2c8ec41997-05-22 20:41:20 +0000303 PyDict_SetItemString(sysdict, "executable",
304 v = PyString_FromString(Py_GetProgramFullPath()));
305 Py_XDECREF(v);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000306 PyDict_SetItemString(sysdict, "prefix",
307 v = PyString_FromString(Py_GetPrefix()));
308 Py_XDECREF(v);
309 PyDict_SetItemString(sysdict, "exec_prefix",
310 v = PyString_FromString(Py_GetExecPrefix()));
311 Py_XDECREF(v);
312 PyDict_SetItemString(sysdict, "maxint",
313 v = PyInt_FromLong(PyInt_GetMax()));
314 Py_XDECREF(v);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000315 PyDict_SetItemString(sysdict, "builtin_module_names",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000316 v = list_builtin_module_names());
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000317 Py_XDECREF(v);
Guido van Rossum8b9ea871996-08-23 18:14:47 +0000318#ifdef MS_COREDLL
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000319 PyDict_SetItemString(sysdict, "dllhandle",
320 v = PyInt_FromLong((int)PyWin_DLLhModule));
321 Py_XDECREF(v);
322 PyDict_SetItemString(sysdict, "winver",
323 v = PyString_FromString(MS_DLL_ID));
324 Py_XDECREF(v);
Guido van Rossumc606fe11996-04-09 02:37:57 +0000325#endif
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000326 if (PyErr_Occurred())
Guido van Rossum25ce5661997-08-02 03:10:38 +0000327 return NULL;
328 return m;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000329}
330
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000331static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000332makepathobject(path, delim)
333 char *path;
334 int delim;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000335{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000336 int i, n;
337 char *p;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000338 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000339
340 n = 1;
341 p = path;
342 while ((p = strchr(p, delim)) != NULL) {
343 n++;
344 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000345 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000346 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000347 if (v == NULL)
348 return NULL;
349 for (i = 0; ; i++) {
350 p = strchr(path, delim);
351 if (p == NULL)
352 p = strchr(path, '\0'); /* End of string */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000353 w = PyString_FromStringAndSize(path, (int) (p - path));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000354 if (w == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000355 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000356 return NULL;
357 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000358 PyList_SetItem(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000359 if (*p == '\0')
360 break;
361 path = p+1;
362 }
363 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364}
365
366void
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000367PySys_SetPath(path)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000368 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000369{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000370 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000371 if ((v = makepathobject(path, DELIM)) == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000372 Py_FatalError("can't create sys.path");
373 if (PySys_SetObject("path", v) != 0)
374 Py_FatalError("can't assign sys.path");
375 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000376}
377
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000378static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000379makeargvobject(argc, argv)
380 int argc;
381 char **argv;
382{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000383 PyObject *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +0000384 if (argc <= 0 || argv == NULL) {
385 /* Ensure at least one (empty) argument is seen */
386 static char *empty_argv[1] = {""};
387 argv = empty_argv;
388 argc = 1;
389 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000390 av = PyList_New(argc);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000391 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000392 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000393 for (i = 0; i < argc; i++) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000394 PyObject *v = PyString_FromString(argv[i]);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000395 if (v == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000396 Py_DECREF(av);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000397 av = NULL;
398 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000399 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000400 PyList_SetItem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000401 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000402 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000403 return av;
404}
405
406void
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000407PySys_SetArgv(argc, argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000408 int argc;
409 char **argv;
410{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000411 PyObject *av = makeargvobject(argc, argv);
412 PyObject *path = PySys_GetObject("path");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000413 if (av == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000414 Py_FatalError("no mem for sys.argv");
415 if (PySys_SetObject("argv", av) != 0)
416 Py_FatalError("can't assign sys.argv");
Guido van Rossum94a96671996-07-30 20:35:50 +0000417 if (path != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000418 char *argv0 = argv[0];
Guido van Rossum94a96671996-07-30 20:35:50 +0000419 char *p = NULL;
Guido van Rossumcc883411996-09-10 14:44:21 +0000420 int n = 0;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000421 PyObject *a;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000422#ifdef HAVE_READLINK
423 char link[MAXPATHLEN+1];
424 char argv0copy[2*MAXPATHLEN+1];
425 int nr = 0;
426 if (argc > 0 && argv0 != NULL)
427 nr = readlink(argv0, link, MAXPATHLEN);
428 if (nr > 0) {
429 /* It's a symlink */
430 link[nr] = '\0';
431 if (link[0] == SEP)
432 argv0 = link; /* Link to absolute path */
433 else if (strchr(link, SEP) == NULL)
434 ; /* Link without path */
435 else {
436 /* Must join(dirname(argv0), link) */
437 char *q = strrchr(argv0, SEP);
438 if (q == NULL)
439 argv0 = link; /* argv0 without path */
440 else {
441 /* Must make a copy */
442 strcpy(argv0copy, argv0);
443 q = strrchr(argv0copy, SEP);
444 strcpy(q+1, link);
445 argv0 = argv0copy;
446 }
447 }
448 }
449#endif /* HAVE_READLINK */
Guido van Rossumcc883411996-09-10 14:44:21 +0000450#if SEP == '\\' /* Special case for MS filename syntax */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000451 if (argc > 0 && argv0 != NULL) {
Guido van Rossumcc883411996-09-10 14:44:21 +0000452 char *q;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000453 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000454 /* Test for alternate separator */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000455 q = strrchr(p ? p : argv0, '/');
Guido van Rossumcc883411996-09-10 14:44:21 +0000456 if (q != NULL)
457 p = q;
458 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000459 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +0000460 if (n > 1 && p[-1] != ':')
461 n--; /* Drop trailing separator */
462 }
463 }
464#else /* All other filename syntaxes */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000465 if (argc > 0 && argv0 != NULL)
466 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000467 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000468 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +0000469#if SEP == '/' /* Special case for Unix filename syntax */
470 if (n > 1)
471 n--; /* Drop trailing separator */
472#endif /* Unix */
473 }
474#endif /* All others */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000475 a = PyString_FromStringAndSize(argv0, n);
Guido van Rossum94a96671996-07-30 20:35:50 +0000476 if (a == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000477 Py_FatalError("no mem for sys.path insertion");
478 if (PyList_Insert(path, 0, a) < 0)
479 Py_FatalError("sys.path.insert(0) failed");
480 Py_DECREF(a);
Guido van Rossuma63d9f41996-07-24 01:31:37 +0000481 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000482 Py_DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000483}