From efffb8c1473378dcd5f2bddc17f7ec9d2d11c644 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 11 Jul 2024 16:56:23 +0900 Subject: [PATCH] Add "--overwrite-create" Default behavior is now to NOT overwrite existing archive files for storing output unless "--overwrite-create" is specified. --- src/main.c | 19 +++++++++++++++---- src/parser.c | 3 +++ src/parser.h | 6 ++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c index b5f2c37..da67c9d 100644 --- a/src/main.c +++ b/src/main.c @@ -32,13 +32,24 @@ int print_list_fn(void *data, __attribute__((unused)) void *ud) { } int main(int argc, const char **argv) { - simple_archiver_print_usage(); - - __attribute__((cleanup(simple_archiver_free_parsed))) - SDArchiverParsed parsed = simple_archiver_create_parsed(); + __attribute__(( + cleanup(simple_archiver_free_parsed))) SDArchiverParsed parsed = + simple_archiver_create_parsed(); simple_archiver_parse_args(argc, argv, &parsed); + if ((parsed.flags & 0x2) == 0) { + FILE *file = fopen(parsed.filename, "r"); + if (file != NULL) { + fclose(file); + fprintf( + stderr, + "ERROR: Archive file exists but --overwrite-create not specified!\n"); + simple_archiver_print_usage(); + return 1; + } + } + __attribute__((cleanup(simple_archiver_list_free))) SDArchiverLinkedList *filenames = simple_archiver_parsed_to_filenames(&parsed); diff --git a/src/parser.c b/src/parser.c index c14f2aa..37e174e 100644 --- a/src/parser.c +++ b/src/parser.c @@ -140,6 +140,7 @@ void simple_archiver_print_usage(void) { puts("-f : filename to work on"); puts("--compressor : requires --decompressor"); puts("--decompressor : requires --compressor"); + puts("--overwrite-create : allows overwriting an archive file"); puts("-- : specifies remaining arguments are files to archive/extract"); puts("If creating archive file, remaining args specify files to archive."); puts("If extracting archive file, remaining args specify files to extract."); @@ -204,6 +205,8 @@ int simple_archiver_parse_args(int argc, const char **argv, strncpy(out->decompressor, argv[1], size); --argc; ++argv; + } else if (strcmp(argv[0], "--overwrite-create") == 0) { + out->flags |= 0x2; } 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 19630d0..7e582e4 100644 --- a/src/parser.h +++ b/src/parser.h @@ -23,8 +23,10 @@ typedef struct SDArchiverParsed { /// Each bit is a flag. - /// 0b0 - is creating. - /// 0b1 - is extracting. + /// 0b0 - is creating. + /// 0b1 - is extracting. + /// 0b0x - Do NOT allow create archive overwrite. + /// 0b1x - Allow create archive overwrite. unsigned int flags; /// Null-terminated string. char *filename;