#include <argp.h>
#include <argp-namefrob.h>
#include <argp-fmtstream.h>
+#include <argp-version-etc.h>
#include <signal.h>
#if ! defined SIGCHLD && defined SIGCLD
EXCLUDE_VCS_OPTION,
FORCE_LOCAL_OPTION,
GROUP_OPTION,
- HANG_OPTION,
IGNORE_CASE_OPTION,
IGNORE_COMMAND_ERROR_OPTION,
IGNORE_FAILED_READ_OPTION,
NO_RECURSION_OPTION,
NO_SAME_OWNER_OPTION,
NO_SAME_PERMISSIONS_OPTION,
+ NO_SEEK_OPTION,
NO_UNQUOTE_OPTION,
NO_WILDCARDS_MATCH_SLASH_OPTION,
NO_WILDCARDS_OPTION,
TO_COMMAND_OPTION,
TRANSFORM_OPTION,
UNQUOTE_OPTION,
- USAGE_OPTION,
UTC_OPTION,
- VERSION_OPTION,
VOLNO_FILE_OPTION,
WARNING_OPTION,
WILDCARDS_MATCH_SLASH_OPTION,
[q alias for --occurrence=1 =/= this would better be used for quiet?]
y per-file gzip compression
- Y per-block gzip compression */
+ Y per-block gzip compression.
+
+ Additionally, the 'n' letter is assigned for option --seek, which
+ is probably not needed and should be marked as deprecated, so that
+ -n may become available in the future.
+*/
static struct argp_option options[] = {
#define GRID 10
" NUMBER defaults to 1"), GRID+1 },
{"seek", 'n', NULL, 0,
N_("archive is seekable"), GRID+1 },
+ {"no-seek", NO_SEEK_OPTION, NULL, 0,
+ N_("archive is not seekable"), GRID+1 },
{"no-check-device", NO_CHECK_DEVICE_OPTION, NULL, 0,
N_("do not check device numbers when creating incremental archives"),
GRID+1 },
{"restrict", RESTRICT_OPTION, 0, 0,
N_("disable use of some potentially harmful options"), -1 },
-
- {"help", '?', 0, 0, N_("give this help list"), -1},
- {"usage", USAGE_OPTION, 0, 0, N_("give a short usage message"), -1},
- {"version", VERSION_OPTION, 0, 0, N_("print program version"), -1},
- /* FIXME -V (--label) conflicts with the default short option for
- --version */
- {"HANG", HANG_OPTION, "SECS", OPTION_ARG_OPTIONAL | OPTION_HIDDEN,
- N_("hang for SECS seconds (default 3600)"), 0},
#undef GRID
{0, 0, 0, 0, 0, 0}
}
\f
-static volatile int _argp_hang;
/* Either NL or NUL, as decided by the --null option. */
static char filename_terminator;
break;
case 'n':
- seekable_archive = true;
+ seek_option = 1;
break;
+ case NO_SEEK_OPTION:
+ seek_option = 0;
+ break;
+
case 'N':
after_date_option = true;
/* Fall through. */
#endif /* not DEVICE_PREFIX */
- case '?':
- tar_help (state);
- close_stdout ();
- exit (0);
-
- case USAGE_OPTION:
- argp_state_help (state, state->out_stream, ARGP_HELP_USAGE);
- close_stdout ();
- exit (0);
-
- case VERSION_OPTION:
- version_etc (state->out_stream, "tar", PACKAGE_NAME, VERSION,
- "John Gilmore", "Jay Fenlason", (char *) NULL);
- close_stdout ();
- exit (0);
-
- case HANG_OPTION:
- _argp_hang = atoi (arg ? arg : "3600");
- while (_argp_hang-- > 0)
- sleep (1);
- break;
-
default:
return ARGP_ERR_UNKNOWN;
}
return NULL;
}
+static const char *tar_authors[] = {
+ "John Gilmore",
+ "Jay Fenlason",
+ NULL
+};
+
static void
decode_options (int argc, char **argv)
{
int idx;
struct tar_args args;
+ argp_version_setup ("tar", tar_authors);
+
/* Set some default option values. */
args.textual_date = NULL;
args.wildcards = default_wildcards;
check_device_option = true;
incremental_level = -1;
+
+ seek_option = -1;
/* Convert old-style tar call by exploding option element and rearranging
options accordingly. */
prepend_default_options (getenv ("TAR_OPTIONS"), &argc, &argv);
- if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER|ARGP_NO_HELP,
- &idx, &args))
+ if (argp_parse (&argp, argc, argv, ARGP_IN_ORDER, &idx, &args))
exit (TAREXIT_FAILURE);
_("--occurrence cannot be used in the requested operation mode")));
}
- if (seekable_archive && subcommand_option == DELETE_SUBCOMMAND)
- {
- /* The current code in delete.c is based on the assumption that
- skip_member() reads all data from the archive. So, we should
- make sure it won't use seeks. On the other hand, the same code
- depends on the ability to backspace a record in the archive,
- so setting seekable_archive to false is technically incorrect.
- However, it is tested only in skip_member(), so it's not a
- problem. */
- seekable_archive = false;
- }
-
if (archive_names == 0)
{
/* If no archive file name given, try TAPE from the environment, or
if (stdlis == stdout)
close_stdout ();
else if (ferror (stderr) || fclose (stderr) != 0)
- exit_status = TAREXIT_FAILURE;
+ set_exit_status (TAREXIT_FAILURE);
return exit_status;
}
a.tv_nsec = b.tv_nsec = 0;
return timespec_cmp (a, b);
}
+
+/* Set tar exit status to VAL, unless it is already indicating
+ a more serious condition. This relies on the fact that the
+ values of TAREXIT_ constants are ranged by severity. */
+void
+set_exit_status (int val)
+{
+ if (val > exit_status)
+ exit_status = val;
+}