-#define OPT__COMPR(s, v, h, p) \
- { OPTION_SET_INT, (s), NULL, (v), NULL, (h), \
- PARSE_OPT_NOARG | PARSE_OPT_NONEG, NULL, (p) }
-#define OPT__COMPR_HIDDEN(s, v, p) \
- { OPTION_SET_INT, (s), NULL, (v), NULL, "", \
- PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_HIDDEN, NULL, (p) }
+static void extra_file_info_clear(void *util, const char *str)
+{
+ struct extra_file_info *info = util;
+ free(info->base);
+ free(info);
+}
+
+static int add_file_cb(const struct option *opt, const char *arg, int unset)
+{
+ struct archiver_args *args = opt->value;
+ const char **basep = (const char **)opt->defval;
+ const char *base = *basep;
+ char *path;
+ struct string_list_item *item;
+ struct extra_file_info *info;
+
+ if (unset) {
+ string_list_clear_func(&args->extra_files,
+ extra_file_info_clear);
+ return 0;
+ }
+
+ if (!arg)
+ return -1;
+
+ path = prefix_filename(args->prefix, arg);
+ item = string_list_append_nodup(&args->extra_files, path);
+ item->util = info = xmalloc(sizeof(*info));
+ info->base = xstrdup_or_null(base);
+ if (stat(path, &info->stat))
+ die(_("File not found: %s"), path);
+ if (!S_ISREG(info->stat.st_mode))
+ die(_("Not a regular file: %s"), path);
+ return 0;
+}
+
+static int number_callback(const struct option *opt, const char *arg, int unset)
+{
+ BUG_ON_OPT_NEG(unset);
+ *(int *)opt->value = strtol(arg, NULL, 10);
+ return 0;
+}