X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=pak.c;h=a9ef112869066920a06b46608926fc3cdf47f823;hp=6595a419d51049f27dadb477c8d91842f932537b;hb=eb2a74f7e7968f99f6a9e01de838a900ebd6efe0;hpb=b0c6dc5ab2fc337a4e04f0c4acb0d2214638d829 diff --git a/pak.c b/pak.c index 6595a41..a9ef112 100644 --- a/pak.c +++ b/pak.c @@ -94,7 +94,6 @@ static void pak_tree_build(const char *entry) { directory = (char *)mem_a(56); memset(pathsplit, 0, 56); - memset(directory, 0, 56); strncpy(directory, entry, 56); for (itr = 0; (token = pak_tree_sep(&directory, "/")) != NULL; itr++) { @@ -260,9 +259,10 @@ bool pak_exists(pak_file_t *pak, const char *file, pak_directory_t **dir) { /* * Extraction abilities. These work as you expect them to. */ -bool pak_extract_one(pak_file_t *pak, const char *file) { - pak_directory_t *dir = NULL; - unsigned char *dat = NULL; +bool pak_extract_one(pak_file_t *pak, const char *file, const char *outdir) { + pak_directory_t *dir = NULL; + unsigned char *dat = NULL; + char *local = NULL; FILE *out; if (!pak_exists(pak, file, &dir)) { @@ -279,15 +279,20 @@ bool pak_extract_one(pak_file_t *pak, const char *file) { */ pak_tree_build(file); + /* TODO portable path seperators */ + util_asprintf(&local, "%s/%s", outdir, file); + /* * Now create the file, if this operation fails. Then abort * It shouldn't fail though. */ - if (!(out = fs_file_open(file, "wb"))) { + if (!(out = fs_file_open(local, "wb"))) { mem_d(dat); return false; } + /* free memory for directory string */ + mem_d(local); /* read */ fs_file_seek (pak->handle, dir->pos, SEEK_SET); @@ -311,11 +316,8 @@ bool pak_extract_all(pak_file_t *pak, const char *dir) { if (!fs_dir_make(dir)) return false; - if (fs_dir_change(dir)) - return false; - for (itr = 0; itr < vec_size(pak->directories); itr++) { - if (!pak_extract_one(pak, pak->directories[itr].name)) + if (!pak_extract_one(pak, pak->directories[itr].name, dir)) return false; } @@ -362,7 +364,7 @@ bool pak_insert_one(pak_file_t *pak, const char *file) { return false; } - strcpy(dir.name, file); + strncpy(dir.name, file, strlen(file)); /* * Allocate some memory for loading in the data that will be @@ -478,7 +480,6 @@ int main(int argc, char **argv) { bool extract = true; char *redirout = (char*)stdout; char *redirerr = (char*)stderr; - char *directory = NULL; char *file = NULL; char **files = NULL; pak_file_t *pak = NULL; @@ -499,8 +500,6 @@ int main(int argc, char **argv) { continue; if (parsecmd("redirerr", &argc, &argv, &redirerr, 1, false)) continue; - if (parsecmd("directory", &argc, &argv, &directory, 1, false)) - continue; if (parsecmd("file", &argc, &argv, &file, 1, false)) continue; @@ -543,7 +542,7 @@ int main(int argc, char **argv) { return EXIT_FAILURE; } - if (!pak_extract_all(pak, (directory) ? directory : "./")) { + if (!pak_extract_all(pak, "./")) { con_err("failed to extract PAK %s (files may be missing)\n", file); pak_close(pak); vec_free(files); @@ -563,13 +562,6 @@ int main(int argc, char **argv) { return EXIT_FAILURE; } - if (directory && !fs_dir_change(directory)) { - con_err("failed to change directory %s\n", directory); - pak_close(pak); - vec_free(files); - return EXIT_FAILURE; - } - for (iter = 0; iter < vec_size(files); iter++) { if (!(pak_insert_one(pak, files[iter]))) { con_err("failed inserting %s for PAK %s\n", files[iter], file);