diff --git a/src/main.c b/src/main.c
index 592ed50..40eef65 100644
--- a/src/main.c
+++ b/src/main.c
@@ -44,7 +44,10 @@ int main(int argc, const char **argv) {
cleanup(simple_archiver_free_parsed))) SDArchiverParsed parsed =
simple_archiver_create_parsed();
- simple_archiver_parse_args(argc, argv, &parsed);
+ if (simple_archiver_parse_args(argc, argv, &parsed)) {
+ fprintf(stderr, "Failed to parse args.\n");
+ return 7;
+ }
if (!parsed.filename && (parsed.flags & 0x10) == 0) {
fprintf(stderr, "ERROR: Filename not specified!\n");
diff --git a/src/parser.c b/src/parser.c
index bb7c8c0..747e1ae 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -153,6 +153,9 @@ void simple_archiver_print_usage(void) {
fprintf(stderr, "--overwrite-extract : allows overwriting when extracting\n");
fprintf(stderr,
"--no-abs-symlink : do not store absolute paths for symlinks\n");
+ fprintf(stderr,
+ "--temp-files-dir
: where to store temporary files created "
+ "when compressing (defaults to current working directory)\n");
fprintf(stderr,
"-- : specifies remaining arguments are files to archive/extract\n");
fprintf(
@@ -214,7 +217,12 @@ int simple_archiver_parse_args(int argc, const char **argv,
out->flags &= 0xFFFFFFFC;
// set second bit.
out->flags |= 0x2;
- } else if (strcmp(argv[0], "-f") == 0 && argc > 1) {
+ } else if (strcmp(argv[0], "-f") == 0) {
+ if (argc < 2) {
+ fprintf(stderr, "ERROR: -f specified but missing argument!\n");
+ simple_archiver_print_usage();
+ return 1;
+ }
if (strcmp(argv[1], "-") == 0) {
out->flags |= 0x10;
if (out->filename) {
@@ -229,13 +237,23 @@ int simple_archiver_parse_args(int argc, const char **argv,
}
--argc;
++argv;
- } else if (strcmp(argv[0], "--compressor") == 0 && argc > 1) {
+ } else if (strcmp(argv[0], "--compressor") == 0) {
+ if (argc < 2) {
+ fprintf(stderr, "--compressor specfied but missing argument!\n");
+ simple_archiver_print_usage();
+ return 1;
+ }
int size = strlen(argv[1]) + 1;
out->compressor = malloc(size);
strncpy(out->compressor, argv[1], size);
--argc;
++argv;
- } else if (strcmp(argv[0], "--decompressor") == 0 && argc > 1) {
+ } else if (strcmp(argv[0], "--decompressor") == 0) {
+ if (argc < 2) {
+ fprintf(stderr, "--decompressor specfied but missing argument!\n");
+ simple_archiver_print_usage();
+ return 1;
+ }
int size = strlen(argv[1]) + 1;
out->decompressor = malloc(size);
strncpy(out->decompressor, argv[1], size);
@@ -247,6 +265,15 @@ int simple_archiver_parse_args(int argc, const char **argv,
out->flags |= 0x8;
} else if (strcmp(argv[0], "--no-abs-symlink") == 0) {
out->flags |= 0x20;
+ } else if (strcmp(argv[0], "--temp-files-dir") == 0) {
+ if (argc < 2) {
+ fprintf(stderr, "ERROR: --temp-files-dir is missing an argument!\n");
+ simple_archiver_print_usage();
+ return 1;
+ }
+ out->temp_dir = argv[1];
+ --argc;
+ ++argv;
} else if (argv[0][0] == '-' && argv[0][1] == '-' && argv[0][2] == 0) {
is_remaining_args = 1;
} else if (argv[0][0] != '-') {
diff --git a/src/parser.h b/src/parser.h
index f5a8400..9ba42a7 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -42,6 +42,9 @@ typedef struct SDArchiverParsed {
/// Last entry should be NULL.
/// Determines a "white-list" of files to extract when extracting.
char **working_files;
+ /// Determines where to place temporary files. If NULL, temporary files are
+ /// created in the current working directory.
+ const char *temp_dir;
} SDArchiverParsed;
typedef struct SDArchiverFileInfo {
@@ -57,6 +60,7 @@ SDArchiverParsed simple_archiver_create_parsed(void);
/// Expects the user to pass a pointer to an SDArchiverParsed.
/// This means the user should have a SDArchiverParsed variable
/// and it should be passed with e.g. "&var".
+/// Returns 0 on success.
int simple_archiver_parse_args(int argc, const char **argv,
SDArchiverParsed *out);