/* * Look for the archive identified by path into the ARCHIVE_STATUS pool archive_pool. * If the archive is found, a pointer to the associated ARCHIVE_STATUS is returned * otherwise the needed archive is opened and added to the pool and then returned. * If an error occurs, returns NULL. * * Having several archives is useful for sharing binary dependencies with several * executables (multipackage feature). */ static ARCHIVE_STATUS * _get_archive(ARCHIVE_STATUS *archive_pool[], const char *path) { ARCHIVE_STATUS *archive = NULL; int index = 0; int SELF = 0; VS("LOADER: Getting file from archive.\n"); if (pyi_create_temp_path(archive_pool[SELF]) == -1) { return NULL; } for (index = 1; archive_pool[index] != NULL; index++) { if (strcmp(archive_pool[index]->archivename, path) == 0) { VS("LOADER: Archive found: %s\n", path); return archive_pool[index]; } VS("LOADER: Checking next archive in the list...\n"); } archive = (ARCHIVE_STATUS *) malloc(sizeof(ARCHIVE_STATUS)); if (archive == NULL) { FATAL_PERROR("malloc", "Error allocating memory for status\n"); return NULL; } strncpy(archive->archivename, path, PATH_MAX); strncpy(archive->homepath, archive_pool[SELF]->homepath, PATH_MAX); strncpy(archive->temppath, archive_pool[SELF]->temppath, PATH_MAX); if (archive->archivename[PATH_MAX-1] != '\0' || archive->homepath[PATH_MAX-1] != '\0' || archive->temppath[PATH_MAX-1] != '\0') { FATALERROR("Archive path exceeds PATH_MAX\n"); free(archive); return NULL; } /* * Setting this flag prevents creating another temp directory and * the directory from the main archive status is used. */ archive->has_temp_directory = archive_pool[SELF]->has_temp_directory; if (pyi_arch_open(archive)) { FATAL_PERROR("malloc", "Error opening archive %s\n", path); free(archive); return NULL; } archive_pool[index] = archive; return archive; }
int launch(ARCHIVE_STATUS *status, char const * archivePath, char const * archiveName) { PyObject *obHandle; int loadedNew = 0; char pathnm[PATH_MAX]; VS("START"); strcpy(pathnm, archivePath); strcat(pathnm, archiveName); /* Set up paths */ if (pyi_arch_set_paths(status, archivePath, archiveName)) return -1; VS("Got Paths"); /* Open the archive */ if (pyi_arch_open(status)) return -1; VS("Opened Archive"); /* Load Python DLL */ if (pyi_pylib_attach(status, &loadedNew)) return -1; if (loadedNew) { /* Start Python with silly command line */ PI_PyEval_InitThreads(); if (pyi_pylib_start_python(status)) return -1; VS("Started new Python"); thisthread = PI_PyThreadState_Swap(NULL); PI_PyThreadState_Swap(thisthread); } else { VS("Attached to existing Python"); /* start a mew interp */ thisthread = PI_PyThreadState_Swap(NULL); PI_PyThreadState_Swap(thisthread); if (thisthread == NULL) { thisthread = PI_Py_NewInterpreter(); VS("created thisthread"); } else VS("grabbed thisthread"); PI_PyRun_SimpleString("import sys;sys.argv=[]"); } /* a signal to scripts */ PI_PyRun_SimpleString("import sys;sys.frozen='dll'\n"); VS("set sys.frozen"); /* Create a 'frozendllhandle' as a counterpart to sys.dllhandle (which is the Pythonxx.dll handle) */ obHandle = PI_Py_BuildValue("i", gInstance); PI_PySys_SetObject("frozendllhandle", obHandle); Py_XDECREF(obHandle); /* Import modules from archive - this is to bootstrap */ if (pyi_pylib_import_modules(status)) return -1; VS("Imported Modules"); /* Install zlibs - now import hooks are in place */ if (pyi_pylib_install_zlibs(status)) return -1; VS("Installed Zlibs"); /* Run scripts */ if (pyi_launch_run_scripts(status)) return -1; VS("All scripts run"); if (PI_PyErr_Occurred()) { // PI_PyErr_Print(); //PI_PyErr_Clear(); VS("Some error occurred"); } VS("PGL released"); // Abandon our thread state. PI_PyEval_ReleaseThread(thisthread); VS("OK."); return 0; }