From b098fd6d694906855dac35fae4aea122011d4877 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Mon, 30 Sep 2024 19:16:29 +0900 Subject: [PATCH] Error if "-C " where "dir" doesn't exist --- src/main.c | 9 +++++---- src/parser.c | 19 ++++++++++++++++++- src/parser.h | 10 +++++++++- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/main.c b/src/main.c index fef432f..71c59db 100644 --- a/src/main.c +++ b/src/main.c @@ -67,12 +67,13 @@ int main(int argc, const char **argv) { } } + SDArchiverParsedStatus parsed_status; __attribute__((cleanup(simple_archiver_list_free))) SDArchiverLinkedList *filenames = - simple_archiver_parsed_to_filenames(&parsed); - if (!filenames) { - fprintf(stderr, - "ERROR: Failed to resolve filenames from positional arguments!\n"); + simple_archiver_parsed_to_filenames(&parsed, &parsed_status); + if (!filenames || parsed_status != SDAPS_SUCCESS) { + fprintf(stderr, "ERROR: %s!\n", + simple_archiver_parsed_status_to_str(parsed_status)); return 8; } diff --git a/src/parser.c b/src/parser.c index a69dfbf..5da4653 100644 --- a/src/parser.c +++ b/src/parser.c @@ -131,6 +131,17 @@ int list_remove_same_str_fn(void *data, void *ud) { return 0; } +char *simple_archiver_parsed_status_to_str(SDArchiverParsedStatus status) { + switch (status) { + case SDAPS_SUCCESS: + return "Success"; + case SDAPS_NO_USER_CWD: + return "No user current working directory (-C )"; + default: + return "Unknown error"; + } +} + void simple_archiver_print_usage(void) { fprintf(stderr, "Usage flags:\n"); fprintf(stderr, "-c : create archive file\n"); @@ -367,7 +378,7 @@ void simple_archiver_free_parsed(SDArchiverParsed *parsed) { } SDArchiverLinkedList *simple_archiver_parsed_to_filenames( - const SDArchiverParsed *parsed) { + const SDArchiverParsed *parsed, SDArchiverParsedStatus *status_out) { SDArchiverLinkedList *files_list = simple_archiver_list_init(); __attribute__((cleanup(simple_archiver_hash_map_free))) SDArchiverHashMap *hash_map = simple_archiver_hash_map_init(); @@ -381,6 +392,9 @@ SDArchiverLinkedList *simple_archiver_parsed_to_filenames( original_cwd = realpath(".", NULL); if (chdir(parsed->user_cwd)) { simple_archiver_list_free(&files_list); + if (status_out) { + *status_out = SDAPS_NO_USER_CWD; + } return NULL; } } @@ -607,5 +621,8 @@ SDArchiverLinkedList *simple_archiver_parsed_to_filenames( } } + if (status_out) { + *status_out = SDAPS_SUCCESS; + } return files_list; } diff --git a/src/parser.h b/src/parser.h index 008e800..ad2e472 100644 --- a/src/parser.h +++ b/src/parser.h @@ -59,6 +59,14 @@ typedef struct SDArchiverFileInfo { char *link_dest; } SDArchiverFileInfo; +typedef enum SDArchiverParsedStatus { + SDAPS_SUCCESS, + SDAPS_NO_USER_CWD, +} SDArchiverParsedStatus; + +/// Returned c-string does not need to be free'd. +char *simple_archiver_parsed_status_to_str(SDArchiverParsedStatus status); + void simple_archiver_print_usage(void); SDArchiverParsed simple_archiver_create_parsed(void); @@ -74,6 +82,6 @@ void simple_archiver_free_parsed(SDArchiverParsed *parsed); /// Each entry in the linked list is an SDArchiverFileInfo object. SDArchiverLinkedList *simple_archiver_parsed_to_filenames( - const SDArchiverParsed *parsed); + const SDArchiverParsed *parsed, SDArchiverParsedStatus *status_out); #endif