/* Decide if the dependency identified by item is in a onedir or onfile archive * then call the appropriate function. */ static int _extract_dependency(ARCHIVE_STATUS *archive_pool[], const char *item) { ARCHIVE_STATUS *status = NULL; ARCHIVE_STATUS *archive_status = archive_pool[0]; char path[PATH_MAX]; char filename[PATH_MAX]; char srcpath[PATH_MAX]; char archive_path[PATH_MAX]; char dirname[PATH_MAX]; VS("LOADER: Extracting dependencies\n"); if (splitName(path, filename, item) == -1) return -1; pyi_path_dirname(dirname, path); /* We need to identify three situations: 1) dependecies are in a onedir archive * next to the current onefile archive, 2) dependencies are in a onedir/onefile * archive next to the current onedir archive, 3) dependencies are in a onefile * archive next to the current onefile archive. */ VS("LOADER: Checking if file exists\n"); // TODO implement pyi_path_join to accept variable length of arguments for this case. if (checkFile(srcpath, "%s%s%s%s%s", archive_status->homepath, PYI_SEPSTR, dirname, PYI_SEPSTR, filename) == 0) { VS("LOADER: File %s found, assuming is onedir\n", srcpath); if (copyDependencyFromDir(archive_status, srcpath, filename) == -1) { FATALERROR("Error coping %s\n", filename); return -1; } // TODO implement pyi_path_join to accept variable length of arguments for this case. } else if (checkFile(srcpath, "%s%s%s%s%s%s%s", archive_status->homepath, PYI_SEPSTR, "..", PYI_SEPSTR, dirname, PYI_SEPSTR, filename) == 0) { VS("LOADER: File %s found, assuming is onedir\n", srcpath); if (copyDependencyFromDir(archive_status, srcpath, filename) == -1) { FATALERROR("Error coping %s\n", filename); return -1; } } else { VS("LOADER: File %s not found, assuming is onefile.\n", srcpath); // TODO implement pyi_path_join to accept variable length of arguments for this case. if ((checkFile(archive_path, "%s%s%s.pkg", archive_status->homepath, PYI_SEPSTR, path) != 0) && (checkFile(archive_path, "%s%s%s.exe", archive_status->homepath, PYI_SEPSTR, path) != 0) && (checkFile(archive_path, "%s%s%s", archive_status->homepath, PYI_SEPSTR, path) != 0)) { FATALERROR("Archive not found: %s\n", archive_path); return -1; } if ((status = _get_archive(archive_pool, archive_path)) == NULL) { FATALERROR("Archive not found: %s\n", archive_path); return -1; } if (extractDependencyFromArchive(status, filename) == -1) { FATALERROR("Error extracting %s\n", filename); free(status); return -1; } } return 0; }
/* Decide if the dependency identified by item is in a onedir or onfile archive * then call the appropriate function. */ static int extractDependency(ARCHIVE_STATUS *status_list[], const char *item) { ARCHIVE_STATUS *status = NULL; char path[_MAX_PATH + 1]; char filename[_MAX_PATH + 1]; char srcpath[_MAX_PATH + 1]; char archive_path[_MAX_PATH + 1]; char *dirname = NULL; VS("Extracting dependencies\n"); if (splitName(path, filename, item) == -1) return -1; dirname = dirName(path); if (dirname[0] == 0) { free(dirname); return -1; } /* We need to identify three situations: 1) dependecies are in a onedir archive * next to the current onefile archive, 2) dependencies are in a onedir/onefile * archive next to the current onedir archive, 3) dependencies are in a onefile * archive next to the current onefile archive. */ VS("Checking if file exists\n"); if (checkFile(srcpath, "%s/%s/%s", status_list[SELF]->homepath, dirname, filename) == 0) { VS("File %s found, assuming is onedir\n", srcpath); if (copyDependencyFromDir(status_list[SELF], srcpath, filename) == -1) { FATALERROR("Error coping %s\n", filename); free(dirname); return -1; } } else if (checkFile(srcpath, "%s../%s/%s", status_list[SELF]->homepath, dirname, filename) == 0) { VS("File %s found, assuming is onedir\n", srcpath); if (copyDependencyFromDir(status_list[SELF], srcpath, filename) == -1) { FATALERROR("Error coping %s\n", filename); free(dirname); return -1; } } else { VS("File %s not found, assuming is onefile.\n", srcpath); if ((checkFile(archive_path, "%s%s.pkg", status_list[SELF]->homepath, path) != 0) && (checkFile(archive_path, "%s%s.exe", status_list[SELF]->homepath, path) != 0) && (checkFile(archive_path, "%s%s", status_list[SELF]->homepath, path) != 0)) { FATALERROR("Archive not found: %s\n", archive_path); return -1; } if ((status = get_archive(status_list, archive_path)) == NULL) { FATALERROR("Archive not found: %s\n", archive_path); return -1; } if (extractDependencyFromArchive(status, filename) == -1) { FATALERROR("Error extracting %s\n", filename); free(status); return -1; } } free(dirname); return 0; }