1
2 /* Python interpreter main program for frozen scripts */
3
4 #include "Python.h"
5 #include "internal/pystate.h"
6 #include <locale.h>
7
8 #ifdef MS_WINDOWS
9 extern void PyWinFreeze_ExeInit(void);
10 extern void PyWinFreeze_ExeTerm(void);
11 extern int PyInitFrozenExtensions(void);
12 #endif
13
14 /* Main program */
15
16 int
Py_FrozenMain(int argc,char ** argv)17 Py_FrozenMain(int argc, char **argv)
18 {
19 _PyInitError err = _PyRuntime_Initialize();
20 if (_Py_INIT_FAILED(err)) {
21 fprintf(stderr, "Fatal Python error: %s\n", err.msg);
22 fflush(stderr);
23 exit(1);
24 }
25
26 const char *p;
27 int i, n, sts = 1;
28 int inspect = 0;
29 int unbuffered = 0;
30 char *oldloc = NULL;
31 wchar_t **argv_copy = NULL;
32 /* We need a second copies, as Python might modify the first one. */
33 wchar_t **argv_copy2 = NULL;
34
35 if (argc > 0) {
36 argv_copy = PyMem_RawMalloc(sizeof(wchar_t*) * argc);
37 argv_copy2 = PyMem_RawMalloc(sizeof(wchar_t*) * argc);
38 if (!argv_copy || !argv_copy2) {
39 fprintf(stderr, "out of memory\n");
40 goto error;
41 }
42 }
43
44 Py_FrozenFlag = 1; /* Suppress errors from getpath.c */
45
46 if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
47 inspect = 1;
48 if ((p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
49 unbuffered = 1;
50
51 if (unbuffered) {
52 setbuf(stdin, (char *)NULL);
53 setbuf(stdout, (char *)NULL);
54 setbuf(stderr, (char *)NULL);
55 }
56
57 oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
58 if (!oldloc) {
59 fprintf(stderr, "out of memory\n");
60 goto error;
61 }
62
63 setlocale(LC_ALL, "");
64 for (i = 0; i < argc; i++) {
65 argv_copy[i] = Py_DecodeLocale(argv[i], NULL);
66 argv_copy2[i] = argv_copy[i];
67 if (!argv_copy[i]) {
68 fprintf(stderr, "Unable to decode the command line argument #%i\n",
69 i + 1);
70 argc = i;
71 goto error;
72 }
73 }
74 setlocale(LC_ALL, oldloc);
75 PyMem_RawFree(oldloc);
76 oldloc = NULL;
77
78 #ifdef MS_WINDOWS
79 PyInitFrozenExtensions();
80 #endif /* MS_WINDOWS */
81 if (argc >= 1)
82 Py_SetProgramName(argv_copy[0]);
83 Py_Initialize();
84 #ifdef MS_WINDOWS
85 PyWinFreeze_ExeInit();
86 #endif
87
88 if (Py_VerboseFlag)
89 fprintf(stderr, "Python %s\n%s\n",
90 Py_GetVersion(), Py_GetCopyright());
91
92 PySys_SetArgv(argc, argv_copy);
93
94 n = PyImport_ImportFrozenModule("__main__");
95 if (n == 0)
96 Py_FatalError("__main__ not frozen");
97 if (n < 0) {
98 PyErr_Print();
99 sts = 1;
100 }
101 else
102 sts = 0;
103
104 if (inspect && isatty((int)fileno(stdin)))
105 sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
106
107 #ifdef MS_WINDOWS
108 PyWinFreeze_ExeTerm();
109 #endif
110 if (Py_FinalizeEx() < 0) {
111 sts = 120;
112 }
113
114 error:
115 PyMem_RawFree(argv_copy);
116 if (argv_copy2) {
117 for (i = 0; i < argc; i++)
118 PyMem_RawFree(argv_copy2[i]);
119 PyMem_RawFree(argv_copy2);
120 }
121 PyMem_RawFree(oldloc);
122 return sts;
123 }
124