blob: 830fb5d68b351c75d295aac79dd7f25936a06caa [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 Rossum65bf9f21997-04-29 18:33:38 +000051PyObject *_PySys_TraceFunc, *_PySys_ProfileFunc;
52int _PySys_CheckInterval = 10;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053
Guido van Rossumc474dea1997-04-25 15:38:31 +000054#if HAVE_UNISTD_H
55#include <unistd.h>
56#endif
57
Guido van Rossum65bf9f21997-04-29 18:33:38 +000058static PyObject *sysdict;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059
Guido van Rossum9b38a141996-09-11 23:12:24 +000060#ifdef MS_COREDLL
Guido van Rossumc606fe11996-04-09 02:37:57 +000061extern void *PyWin_DLLhModule;
62#endif
63
Guido van Rossum65bf9f21997-04-29 18:33:38 +000064PyObject *
65PySys_GetObject(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066 char *name;
67{
Guido van Rossum65bf9f21997-04-29 18:33:38 +000068 return PyDict_GetItemString(sysdict, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000069}
70
71FILE *
Guido van Rossum65bf9f21997-04-29 18:33:38 +000072PySys_GetFile(name, def)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073 char *name;
74 FILE *def;
75{
76 FILE *fp = NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +000077 PyObject *v = PySys_GetObject(name);
78 if (v != NULL && PyFile_Check(v))
79 fp = PyFile_AsFile(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000080 if (fp == NULL)
81 fp = def;
82 return fp;
83}
84
85int
Guido van Rossum65bf9f21997-04-29 18:33:38 +000086PySys_SetObject(name, v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087 char *name;
Guido van Rossum65bf9f21997-04-29 18:33:38 +000088 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089{
Guido van Rossum5ad58c61992-01-26 18:15:48 +000090 if (v == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +000091 if (PyDict_GetItemString(sysdict, name) == NULL)
Guido van Rossum5ad58c61992-01-26 18:15:48 +000092 return 0;
93 else
Guido van Rossum65bf9f21997-04-29 18:33:38 +000094 return PyDict_DelItemString(sysdict, name);
Guido van Rossum5ad58c61992-01-26 18:15:48 +000095 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096 else
Guido van Rossum65bf9f21997-04-29 18:33:38 +000097 return PyDict_SetItemString(sysdict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098}
99
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000100static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101sys_exit(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000102 PyObject *self;
103 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104{
Guido van Rossum6a468bf1991-12-31 13:15:35 +0000105 /* Raise SystemExit so callers may catch it or clean up. */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000106 PyErr_SetObject(PyExc_SystemExit, args);
Guido van Rossum6a468bf1991-12-31 13:15:35 +0000107 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000108}
109
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000110static PyObject *
Guido van Rossume2437a11992-03-23 18:20:18 +0000111sys_settrace(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000112 PyObject *self;
113 PyObject *args;
Guido van Rossume2437a11992-03-23 18:20:18 +0000114{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000115 if (args == Py_None)
Guido van Rossume2437a11992-03-23 18:20:18 +0000116 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000117 else
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000118 Py_XINCREF(args);
119 Py_XDECREF(_PySys_TraceFunc);
120 _PySys_TraceFunc = args;
121 Py_INCREF(Py_None);
122 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000123}
124
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000125static PyObject *
Guido van Rossume2437a11992-03-23 18:20:18 +0000126sys_setprofile(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000127 PyObject *self;
128 PyObject *args;
Guido van Rossume2437a11992-03-23 18:20:18 +0000129{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000130 if (args == Py_None)
Guido van Rossume2437a11992-03-23 18:20:18 +0000131 args = NULL;
Guido van Rossume765f7d1992-04-05 14:17:55 +0000132 else
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000133 Py_XINCREF(args);
134 Py_XDECREF(_PySys_ProfileFunc);
135 _PySys_ProfileFunc = args;
136 Py_INCREF(Py_None);
137 return Py_None;
Guido van Rossume2437a11992-03-23 18:20:18 +0000138}
139
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000140static PyObject *
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000141sys_setcheckinterval(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000142 PyObject *self;
143 PyObject *args;
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000144{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000145 if (!PyArg_ParseTuple(args, "i", &_PySys_CheckInterval))
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000146 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000147 Py_INCREF(Py_None);
148 return Py_None;
Guido van Rossuma0d7a231995-01-09 17:46:13 +0000149}
150
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000151#ifdef USE_MALLOPT
152/* Link with -lmalloc (or -lmpc) on an SGI */
153#include <malloc.h>
154
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000155static PyObject *
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000156sys_mdebug(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000157 PyObject *self;
158 PyObject *args;
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000159{
160 int flag;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000161 if (!PyArg_Parse(args, "i", &flag))
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000162 return NULL;
163 mallopt(M_DEBUG, flag);
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000164 Py_INCREF(Py_None);
165 return Py_None;
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000166}
167#endif /* USE_MALLOPT */
168
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000169static PyObject *
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000170sys_getrefcount(self, args)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000171 PyObject *self;
172 PyObject *args;
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000173{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000174 PyObject *arg;
175 if (!PyArg_Parse(args, "O", &arg))
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000176 return NULL;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000177 return PyInt_FromLong((long) arg->ob_refcnt);
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000178}
179
180#ifdef COUNT_ALLOCS
181static PyObject *
182sys_getcounts(self, args)
183 PyObject *self, *args;
184{
185 extern PyObject *get_counts Py_PROTO((void));
186
187 if (!PyArg_Parse(args, ""))
188 return NULL;
189 return get_counts();
190}
191#endif
192
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000193#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000194/* Defined in objects.c because it uses static globals if that file */
195extern PyObject *_Py_GetObjects Py_PROTO((PyObject *, PyObject *));
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000196#endif
Guido van Rossumded690f1996-05-24 20:48:31 +0000197
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000198#ifdef DYNAMIC_EXECUTION_PROFILE
199/* Defined in ceval.c because it uses static globals if that file */
200extern PyObject *_Py_GetDXProfile Py_PROTO((PyObject *, PyObject *));
201#endif
202
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000203static PyMethodDef sys_methods[] = {
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000204 /* Might as well keep this in alphabetic order */
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000205 {"exit", sys_exit, 0},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000206#ifdef COUNT_ALLOCS
207 {"getcounts", sys_getcounts, 0},
208#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000209#ifdef DYNAMIC_EXECUTION_PROFILE
210 {"getdxp", _Py_GetDXProfile, 1},
211#endif
Guido van Rossum7f3f2c11996-05-23 22:45:41 +0000212#ifdef Py_TRACE_REFS
Guido van Rossumded690f1996-05-24 20:48:31 +0000213 {"getobjects", _Py_GetObjects, 1},
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000214#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000215 {"getrefcount", sys_getrefcount, 0},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000216#ifdef USE_MALLOPT
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000217 {"mdebug", sys_mdebug, 0},
Guido van Rossum14b4adb1992-09-03 20:25:30 +0000218#endif
Guido van Rossum43f1b8d1997-01-24 04:07:45 +0000219 {"setcheckinterval", sys_setcheckinterval, 1},
Guido van Rossum4f508cc1995-02-21 21:03:24 +0000220 {"setprofile", sys_setprofile, 0},
221 {"settrace", sys_settrace, 0},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000222 {NULL, NULL} /* sentinel */
223};
224
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000225static PyObject *sysin, *sysout, *syserr;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000227static PyObject *
Guido van Rossum34679b71993-01-26 13:33:44 +0000228list_builtin_module_names()
229{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000230 PyObject *list = PyList_New(0);
Guido van Rossum34679b71993-01-26 13:33:44 +0000231 int i;
232 if (list == NULL)
233 return NULL;
Guido van Rossumbb5c6f81997-04-29 20:42:30 +0000234 for (i = 0; _PyImport_Inittab[i].name != NULL; i++) {
235 PyObject *name = PyString_FromString(_PyImport_Inittab[i].name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000236 if (name == NULL)
237 break;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000238 PyList_Append(list, name);
239 Py_DECREF(name);
Guido van Rossum34679b71993-01-26 13:33:44 +0000240 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000241 if (PyList_Sort(list) != 0) {
242 Py_DECREF(list);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000243 list = NULL;
244 }
Guido van Rossum8f49e121997-01-06 22:55:54 +0000245 if (list) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000246 PyObject *v = PyList_AsTuple(list);
247 Py_DECREF(list);
Guido van Rossum8f49e121997-01-06 22:55:54 +0000248 list = v;
249 }
Guido van Rossum34679b71993-01-26 13:33:44 +0000250 return list;
251}
252
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000253void
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000254PySys_Init()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000255{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000256 extern long PyInt_GetMax Py_PROTO((void));
257 extern char *Py_GetVersion Py_PROTO((void));
258 extern char *Py_GetCopyright Py_PROTO((void));
259 extern char *Py_GetPlatform Py_PROTO((void));
260 extern char *Py_GetPrefix Py_PROTO((void));
261 extern char *Py_GetExecPrefix Py_PROTO((void));
262 extern int fclose Py_PROTO((FILE *));
263 PyObject *m = Py_InitModule("sys", sys_methods);
264 PyObject *v;
265 sysdict = PyModule_GetDict(m);
266 Py_INCREF(sysdict);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000267 /* NB keep an extra ref to the std files to avoid closing them
268 when the user deletes them */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000269 sysin = PyFile_FromFile(stdin, "<stdin>", "r", fclose);
270 sysout = PyFile_FromFile(stdout, "<stdout>", "w", fclose);
271 syserr = PyFile_FromFile(stderr, "<stderr>", "w", fclose);
272 if (PyErr_Occurred())
273 Py_FatalError("can't initialize sys.std{in,out,err}");
274 PyDict_SetItemString(sysdict, "stdin", sysin);
275 PyDict_SetItemString(sysdict, "stdout", sysout);
276 PyDict_SetItemString(sysdict, "stderr", syserr);
277 PyDict_SetItemString(sysdict, "version",
278 v = PyString_FromString(Py_GetVersion()));
279 Py_XDECREF(v);
280 PyDict_SetItemString(sysdict, "copyright",
281 v = PyString_FromString(Py_GetCopyright()));
282 Py_XDECREF(v);
283 PyDict_SetItemString(sysdict, "platform",
284 v = PyString_FromString(Py_GetPlatform()));
285 Py_XDECREF(v);
286 PyDict_SetItemString(sysdict, "prefix",
287 v = PyString_FromString(Py_GetPrefix()));
288 Py_XDECREF(v);
289 PyDict_SetItemString(sysdict, "exec_prefix",
290 v = PyString_FromString(Py_GetExecPrefix()));
291 Py_XDECREF(v);
292 PyDict_SetItemString(sysdict, "maxint",
293 v = PyInt_FromLong(PyInt_GetMax()));
294 Py_XDECREF(v);
295 PyDict_SetItemString(sysdict, "modules", PyImport_GetModuleDict());
296 PyDict_SetItemString(sysdict, "builtin_module_names",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000297 v = list_builtin_module_names());
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000298 Py_XDECREF(v);
Guido van Rossum8b9ea871996-08-23 18:14:47 +0000299#ifdef MS_COREDLL
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000300 PyDict_SetItemString(sysdict, "dllhandle",
301 v = PyInt_FromLong((int)PyWin_DLLhModule));
302 Py_XDECREF(v);
303 PyDict_SetItemString(sysdict, "winver",
304 v = PyString_FromString(MS_DLL_ID));
305 Py_XDECREF(v);
Guido van Rossumc606fe11996-04-09 02:37:57 +0000306#endif
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000307 if (PyErr_Occurred())
308 Py_FatalError("can't insert sys.* objects in sys dict");
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000309}
310
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000311static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000312makepathobject(path, delim)
313 char *path;
314 int delim;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000315{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000316 int i, n;
317 char *p;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000318 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000319
320 n = 1;
321 p = path;
322 while ((p = strchr(p, delim)) != NULL) {
323 n++;
324 p++;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000325 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000326 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000327 if (v == NULL)
328 return NULL;
329 for (i = 0; ; i++) {
330 p = strchr(path, delim);
331 if (p == NULL)
332 p = strchr(path, '\0'); /* End of string */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000333 w = PyString_FromStringAndSize(path, (int) (p - path));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000334 if (w == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000335 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000336 return NULL;
337 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000338 PyList_SetItem(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000339 if (*p == '\0')
340 break;
341 path = p+1;
342 }
343 return v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000344}
345
346void
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000347PySys_SetPath(path)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000348 char *path;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000350 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000351 if ((v = makepathobject(path, DELIM)) == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000352 Py_FatalError("can't create sys.path");
353 if (PySys_SetObject("path", v) != 0)
354 Py_FatalError("can't assign sys.path");
355 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000356}
357
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000358static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000359makeargvobject(argc, argv)
360 int argc;
361 char **argv;
362{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000363 PyObject *av;
Guido van Rossumee3a2991992-01-14 18:42:53 +0000364 if (argc <= 0 || argv == NULL) {
365 /* Ensure at least one (empty) argument is seen */
366 static char *empty_argv[1] = {""};
367 argv = empty_argv;
368 argc = 1;
369 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000370 av = PyList_New(argc);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000371 if (av != NULL) {
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000372 int i;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000373 for (i = 0; i < argc; i++) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000374 PyObject *v = PyString_FromString(argv[i]);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000375 if (v == NULL) {
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000376 Py_DECREF(av);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000377 av = NULL;
378 break;
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000379 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000380 PyList_SetItem(av, i, v);
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000381 }
Guido van Rossum5b3138b1990-11-18 17:41:40 +0000382 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000383 return av;
384}
385
386void
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000387PySys_SetArgv(argc, argv)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000388 int argc;
389 char **argv;
390{
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000391 PyObject *av = makeargvobject(argc, argv);
392 PyObject *path = PySys_GetObject("path");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000393 if (av == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000394 Py_FatalError("no mem for sys.argv");
395 if (PySys_SetObject("argv", av) != 0)
396 Py_FatalError("can't assign sys.argv");
Guido van Rossum94a96671996-07-30 20:35:50 +0000397 if (path != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000398 char *argv0 = argv[0];
Guido van Rossum94a96671996-07-30 20:35:50 +0000399 char *p = NULL;
Guido van Rossumcc883411996-09-10 14:44:21 +0000400 int n = 0;
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000401 PyObject *a;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000402#ifdef HAVE_READLINK
403 char link[MAXPATHLEN+1];
404 char argv0copy[2*MAXPATHLEN+1];
405 int nr = 0;
406 if (argc > 0 && argv0 != NULL)
407 nr = readlink(argv0, link, MAXPATHLEN);
408 if (nr > 0) {
409 /* It's a symlink */
410 link[nr] = '\0';
411 if (link[0] == SEP)
412 argv0 = link; /* Link to absolute path */
413 else if (strchr(link, SEP) == NULL)
414 ; /* Link without path */
415 else {
416 /* Must join(dirname(argv0), link) */
417 char *q = strrchr(argv0, SEP);
418 if (q == NULL)
419 argv0 = link; /* argv0 without path */
420 else {
421 /* Must make a copy */
422 strcpy(argv0copy, argv0);
423 q = strrchr(argv0copy, SEP);
424 strcpy(q+1, link);
425 argv0 = argv0copy;
426 }
427 }
428 }
429#endif /* HAVE_READLINK */
Guido van Rossumcc883411996-09-10 14:44:21 +0000430#if SEP == '\\' /* Special case for MS filename syntax */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000431 if (argc > 0 && argv0 != NULL) {
Guido van Rossumcc883411996-09-10 14:44:21 +0000432 char *q;
Guido van Rossumc474dea1997-04-25 15:38:31 +0000433 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000434 /* Test for alternate separator */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000435 q = strrchr(p ? p : argv0, '/');
Guido van Rossumcc883411996-09-10 14:44:21 +0000436 if (q != NULL)
437 p = q;
438 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000439 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +0000440 if (n > 1 && p[-1] != ':')
441 n--; /* Drop trailing separator */
442 }
443 }
444#else /* All other filename syntaxes */
Guido van Rossumc474dea1997-04-25 15:38:31 +0000445 if (argc > 0 && argv0 != NULL)
446 p = strrchr(argv0, SEP);
Guido van Rossumcc883411996-09-10 14:44:21 +0000447 if (p != NULL) {
Guido van Rossumc474dea1997-04-25 15:38:31 +0000448 n = p + 1 - argv0;
Guido van Rossumcc883411996-09-10 14:44:21 +0000449#if SEP == '/' /* Special case for Unix filename syntax */
450 if (n > 1)
451 n--; /* Drop trailing separator */
452#endif /* Unix */
453 }
454#endif /* All others */
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000455 a = PyString_FromStringAndSize(argv0, n);
Guido van Rossum94a96671996-07-30 20:35:50 +0000456 if (a == NULL)
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000457 Py_FatalError("no mem for sys.path insertion");
458 if (PyList_Insert(path, 0, a) < 0)
459 Py_FatalError("sys.path.insert(0) failed");
460 Py_DECREF(a);
Guido van Rossuma63d9f41996-07-24 01:31:37 +0000461 }
Guido van Rossum65bf9f21997-04-29 18:33:38 +0000462 Py_DECREF(av);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463}