aboutsummaryrefslogtreecommitdiff
path: root/src/args.c
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-06-22 19:13:19 +0200
committerCharles <sircharlesaze@gmail.com>2020-06-22 19:13:19 +0200
commit88ab5a5273e13066ce3f496a690f10d20a278bb4 (patch)
treed4587015207c4ed0d1872b14b737d0c42d881f33 /src/args.c
parent86e8aeb5bb66ae5625002533b529752a7814e6c0 (diff)
downloadtar-88ab5a5273e13066ce3f496a690f10d20a278bb4.tar.gz
tar-88ab5a5273e13066ce3f496a690f10d20a278bb4.tar.bz2
tar-88ab5a5273e13066ce3f496a690f10d20a278bb4.zip
Added better option handling
Diffstat (limited to 'src/args.c')
-rw-r--r--src/args.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/args.c b/src/args.c
new file mode 100644
index 0000000..1600e0e
--- /dev/null
+++ b/src/args.c
@@ -0,0 +1,45 @@
+#include "tar.h"
+
+bool args_parse(int argc, char **argv, t_args *args)
+{
+ int opt;
+ int action_counter = 0;
+
+ args->archive_name = NULL;
+ args->files = NULL;
+ while ((opt = getopt(argc, argv, "Acdtruxvf:")) != -1)
+ {
+ switch (opt)
+ {
+ case 'A': args->action = ACTION_CONCAT; break;
+ case 'c': args->action = ACTION_CREATE; break;
+ case 'd': args->action = ACTION_DIFF; break;
+ case 't': args->action = ACTION_LIST; break;
+ case 'r': args->action = ACTION_APPEND; break;
+ case 'u': args->action = ACTION_UPDATE; break;
+ case 'x': args->action = ACTION_EXTRACT; break;
+
+ case 'v': args->flags |= FLAG_VERBOSE; break;
+ case 'f':
+ args->flags |= FLAG_FILE;
+ args->archive_name = optarg;
+ break;
+ default:
+ return false;
+ }
+ if (strchr("Acdtrux", opt) != NULL)
+ action_counter++;
+ }
+ if (action_counter != 1)
+ {
+ fprintf(stderr, "%s: You way not specify more than one '-Acdtrux' option\n", argv[0]);
+ return false;
+ }
+ if (!(args->flags & FLAG_FILE) && isatty(STDOUT_FILENO))
+ {
+ fprintf(stderr, "%s: Refusing to write archive contents to terminal (missing -f option?)\n", argv[0]);
+ return false;
+ }
+ args->files = argv + optind;
+ return true;
+}