diff options
Diffstat (limited to 'src/unalf.c')
| -rw-r--r-- | src/unalf.c | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/src/unalf.c b/src/unalf.c index ba6405e..9a722f8 100644 --- a/src/unalf.c +++ b/src/unalf.c @@ -2,11 +2,18 @@ #include <unistd.h> #include <stdlib.h> #include <string.h> +#include <errno.h> +#include <sys/stat.h> #include <f65.h> #include "unalf.h" FILE *in_file, *out_file; char *in_filename, *self; +opts_t opts; +const char *exclude_globs[MAX_EXCLUDES]; +int exclude_count; +char * const *include_globs; +static void create_outdir(void); static void usage(void) { printf("usage: %s [-l] file.alf\n", self); @@ -21,35 +28,32 @@ static void set_self(char *argv0) { if(p) self = p + 1; } -int main(int argc, char **argv) { - char opt = 0; - int listonly = 0; +/* like "mkdir -p" (no error if dir already exists), + followed by "cd" (which will error if the existing + "directory" turns out to be a file or broken symlink */ +static void create_outdir(void) { + int r; - set_self(argv[0]); + r = mkdir(opts.outdir, 0777); + if(r < 0 && errno != EEXIST) { + fprintf(stderr, "%s: ", self); + perror(opts.outdir); + exit(1); + } - if(argc == 1) { - fprintf(stderr, "%s: missing required argument(s)\n", self); - usage(); - } else if(argc > 3) { - fprintf(stderr, "%s: too many arguments\n", self); - usage(); - } else if(argc == 2) { - in_filename = argv[1]; - } else { /* argc == 3 */ - in_filename = argv[2]; - if(argv[1][0] == '-') - opt = argv[1][1]; - else - opt = argv[1][0]; - if(opt == 'l' || opt == 'v') { - listonly = 1; - } else if(opt == 'x' || opt == 'e') { - /* NOP */ - } else { - fprintf(stderr, "%s: unknown option '-%c'\n", self, opt); - usage(); - } + if(chdir(opts.outdir) < 0) { + fprintf(stderr, "%s: ", self); + perror(opts.outdir); + exit(1); } +} + +int main(int argc, char **argv) { + set_self(argv[0]); + + if(argc < 2) usage(); + + parse_opts(argc, argv); if(!(in_file = fopen(in_filename, "rb"))) { fprintf(stderr, "%s: ", self); @@ -57,7 +61,9 @@ int main(int argc, char **argv) { exit(1); } - if(listonly) + if(opts.outdir) create_outdir(); + + if(opts.listonly) list_alf(); else extract_alf(); |
