#include <closeout.h>
#include <configmake.h>
#include <exitfail.h>
-#include <getdate.h>
+#include <parse-datetime.h>
#include <rmt.h>
#include <rmt-command.h>
#include <prepargs.h>
};
static void
-add_exclude_array (char const * const * fv)
+add_exclude_array (char const * const * fv, int options)
{
int i;
for (i = 0; fv[i]; i++)
- add_exclude (excluded, fv[i], 0);
+ add_exclude (excluded, fv[i], options);
}
\f
stat_on_signal (int signo)
{
#ifdef HAVE_SIGACTION
+# ifndef SA_RESTART
+# define SA_RESTART 0
+# endif
struct sigaction act;
act.sa_handler = sigstat;
sigemptyset (&act.sa_mask);
- act.sa_flags = 0;
+ act.sa_flags = SA_RESTART;
sigaction (signo, &act, NULL);
#else
signal (signo, sigstat);
|| *str == '.')
{
struct stat st;
- if (deref_stat (dereference_option, str, &st) != 0)
+ if (stat (str, &st) != 0)
{
stat_error (str);
USAGE_ERROR ((0, 0, _("Date sample file not found")));
}
else
{
- if (! get_date (ts, str, NULL))
+ if (! parse_datetime (ts, str, NULL))
{
WARN ((0, 0, _("Substituting %s for unknown date format %s"),
tartime (*ts, false), quote (str)));
}
\f
+static uintmax_t
+parse_owner_group (char *arg, uintmax_t field_max, char const **name_option)
+{
+ strtol_error err;
+ uintmax_t u = UINTMAX_MAX;
+ char *end;
+ char const *name = 0;
+ char const *invalid_num = 0;
+ char *colon = strchr (arg, ':');
+
+ if (colon)
+ {
+ char const *num = colon + 1;
+ *colon = '\0';
+ if (*arg)
+ name = arg;
+ if (num && (! (xstrtoumax (num, &end, 10, &u, "") == LONGINT_OK
+ && u <= field_max)))
+ invalid_num = num;
+ }
+ else
+ {
+ uintmax_t u1;
+ switch ('0' <= *arg && *arg <= '9'
+ ? xstrtoumax (arg, &end, 10, &u1, "")
+ : LONGINT_INVALID)
+ {
+ default:
+ name = arg;
+ break;
+
+ case LONGINT_OK:
+ if (u1 <= field_max)
+ {
+ u = u1;
+ break;
+ }
+ /* Fall through. */
+ case LONGINT_OVERFLOW:
+ invalid_num = arg;
+ break;
+ }
+ }
+
+ if (invalid_num)
+ FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (invalid_num),
+ _("Invalid owner or group ID")));
+ if (name)
+ *name_option = name;
+ return u;
+}
+
#define TAR_SIZE_SUFFIXES "bBcGgkKMmPTtw"
static error_t
break;
case EXCLUDE_BACKUPS_OPTION:
- add_exclude_array (backup_file_table);
+ add_exclude_array (backup_file_table, EXCLUDE_WILDCARDS);
break;
case EXCLUDE_OPTION:
break;
case EXCLUDE_VCS_OPTION:
- add_exclude_array (vcs_file_table);
+ add_exclude_array (vcs_file_table, 0);
break;
case FORCE_LOCAL_OPTION:
break;
case GROUP_OPTION:
- if (! (strlen (arg) < GNAME_FIELD_SIZE
- && gname_to_gid (arg, &group_option)))
- {
- uintmax_t g;
- if (xstrtoumax (arg, 0, 10, &g, "") == LONGINT_OK
- && g == (gid_t) g)
- group_option = g;
- else
- FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
- _("Invalid group")));
- }
+ {
+ uintmax_t u = parse_owner_group (arg, TYPE_MAXIMUM (gid_t),
+ &group_name_option);
+ if (u == UINTMAX_MAX)
+ {
+ group_option = -1;
+ if (group_name_option)
+ gname_to_gid (group_name_option, &group_option);
+ }
+ else
+ group_option = u;
+ }
break;
case MODE_OPTION:
break;
case OWNER_OPTION:
- if (! (strlen (arg) < UNAME_FIELD_SIZE
- && uname_to_uid (arg, &owner_option)))
- {
- uintmax_t u;
- if (xstrtoumax (arg, 0, 10, &u, "") == LONGINT_OK
- && u == (uid_t) u)
- owner_option = u;
- else
- FATAL_ERROR ((0, 0, "%s: %s", quotearg_colon (arg),
- _("Invalid owner")));
- }
+ {
+ uintmax_t u = parse_owner_group (arg, TYPE_MAXIMUM (uid_t),
+ &owner_name_option);
+ if (u == UINTMAX_MAX)
+ {
+ owner_option = -1;
+ if (owner_name_option)
+ uname_to_uid (owner_name_option, &owner_option);
+ }
+ else
+ owner_option = u;
+ }
break;
case QUOTE_CHARS_OPTION:
tar_sparse_major = 1;
tar_sparse_minor = 0;
- owner_option = -1;
- group_option = -1;
+ owner_option = -1; owner_name_option = NULL;
+ group_option = -1; group_name_option = NULL;
check_device_option = true;