]> git.seodisparate.com - SimpleArchiver/commitdiff
Error if "-C <dir>" where "dir" doesn't exist
authorStephen Seo <seo.disparate@gmail.com>
Mon, 30 Sep 2024 10:16:29 +0000 (19:16 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Mon, 30 Sep 2024 10:16:29 +0000 (19:16 +0900)
src/main.c
src/parser.c
src/parser.h

index fef432f0fecfe28d9e39025787a0ff67697aedfd..71c59db3ab85499c757087a5a00c6f2e47111436 100644 (file)
@@ -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;
   }
 
index a69dfbf7d1d1210f737aacffd5e91ed58b1d9707..5da46531396b928cf38f57c1c363978d14b7011c 100644 (file)
@@ -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 <dir>)";
+    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;
 }
index 008e800ea0dcbbbd19832aae856b080ef0602bbb..ad2e472ae125a6c49e25b45b2f73ca4dc0a79e77 100644 (file)
@@ -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