/*
* Amanda, The Advanced Maryland Automatic Network Disk Archiver
* Copyright (c) 1991-1998 University of Maryland at College Park
+ * Copyright (c) 2007-2012 Zmanda, Inc. All Rights Reserved.
* All Rights Reserved.
*
* Permission to use, copy, modify, distribute, and sell this software and its
int argc;
char **argv;
int verbose;
+ int ignore_zeros;
} application_argument_t;
enum { CMD_ESTIMATE, CMD_BACKUP };
int *nb_include, char **file_include);
static char *amgtar_get_incrname(application_argument_t *argument, int level,
FILE *mesgstream, int command);
+static void check_no_check_device(void);
static GPtrArray *amgtar_build_argv(application_argument_t *argument,
char *incrname, char **file_exclude,
char **file_include, int command);
{"include-list-glob", 1, NULL, 34},
{"exclude-list-glob", 1, NULL, 35},
{"verbose" , 1, NULL, 36},
+ {"ignore-zeros" , 1, NULL, 37},
{NULL, 0, NULL, 0}
};
#else
gnutar_path = NULL;
#endif
+ gnutar_listdir = NULL;
gnutar_directory = NULL;
gnutar_onefilesystem = 1;
gnutar_atimepreserve = 1;
argument.include_list_glob = NULL;
argument.exclude_list_glob = NULL;
argument.verbose = 0;
+ argument.ignore_zeros = 1;
init_dle(&argument.dle);
+ argument.dle.record = 0;
while (1) {
int option_index = 0;
case 36: if (optarg && strcasecmp(optarg, "YES") == 0)
argument.verbose = 1;
break;
+ case 37: if (strcasecmp(optarg, "YES") != 0)
+ argument.ignore_zeros = 0;
+ break;
case ':':
case '?':
break;
g_critical(_("errors processing config file"));
}
+ if (!gnutar_listdir) {
+ gnutar_listdir = g_strdup(getconf_str(CNF_GNUTAR_LIST_DIR));
+ }
+
re_table = build_re_table(init_re_table, normal_message, ignore_message,
strange_message);
}
}
- gnutar_listdir = getconf_str(CNF_GNUTAR_LIST_DIR);
if (strlen(gnutar_listdir) == 0)
gnutar_listdir = NULL;
amgtar_selfcheck(
application_argument_t *argument)
{
+ if (argument->dle.disk) {
+ char *qdisk = quote_string(argument->dle.disk);
+ fprintf(stdout, "OK disk %s\n", qdisk);
+ amfree(qdisk);
+ }
+
+ printf("OK amgtar version %s\n", VERSION);
amgtar_build_exinclude(&argument->dle, 1, NULL, NULL, NULL, NULL);
printf("OK amgtar\n");
if (gnutar_path) {
- check_file(gnutar_path, X_OK);
+ if (check_file(gnutar_path, X_OK)) {
+ char *gtar_version;
+ GPtrArray *argv_ptr = g_ptr_array_new();
+
+ g_ptr_array_add(argv_ptr, gnutar_path);
+ g_ptr_array_add(argv_ptr, "--version");
+ g_ptr_array_add(argv_ptr, NULL);
+
+ gtar_version = get_first_line(argv_ptr);
+ if (gtar_version) {
+ char *gv;
+ for (gv = gtar_version; *gv && !g_ascii_isdigit(*gv); gv++);
+ printf("OK amgtar gtar-version %s\n", gv);
+ } else {
+ printf(_("ERROR [Can't get %s version]\n"), gnutar_path);
+ }
+
+ g_ptr_array_free(argv_ptr, TRUE);
+ amfree(gtar_version);
+ }
} else {
printf(_("ERROR [GNUTAR program not available]\n"));
}
printf(_("ERROR [No GNUTAR-LISTDIR]\n"));
}
- if (argument->dle.disk) {
- char *qdisk = quote_string(argument->dle.disk);
- fprintf(stdout, "OK %s\n", qdisk);
- amfree(qdisk);
- }
if (gnutar_directory) {
check_dir(gnutar_directory, R_OK);
} else if (argument->dle.device) {
}
if (!errmsg && incrname && strlen(incrname) > 4) {
- char *nodotnew;
- nodotnew = stralloc(incrname);
- nodotnew[strlen(nodotnew)-4] = '\0';
- if (rename(incrname, nodotnew)) {
- dbprintf(_("%s: warning [renaming %s to %s: %s]\n"),
- get_pname(), incrname, nodotnew, strerror(errno));
- g_fprintf(mesgstream, _("? warning [renaming %s to %s: %s]\n"),
- incrname, nodotnew, strerror(errno));
+ if (argument->dle.record) {
+ char *nodotnew;
+ nodotnew = stralloc(incrname);
+ nodotnew[strlen(nodotnew)-4] = '\0';
+ if (rename(incrname, nodotnew)) {
+ dbprintf(_("%s: warning [renaming %s to %s: %s]\n"),
+ get_pname(), incrname, nodotnew, strerror(errno));
+ g_fprintf(mesgstream, _("? warning [renaming %s to %s: %s]\n"),
+ incrname, nodotnew, strerror(errno));
+ }
+ amfree(nodotnew);
+ } else {
+ if (unlink(incrname) == -1) {
+ dbprintf(_("%s: warning [unlink %s: %s]\n"),
+ get_pname(), incrname, strerror(errno));
+ g_fprintf(mesgstream, _("? warning [unlink %s: %s]\n"),
+ incrname, strerror(errno));
+ }
}
- amfree(nodotnew);
}
dbprintf("sendbackup: size %lld\n", (long long)dump_size);
if (gnutar_xattrs)
g_ptr_array_add(argv_ptr, stralloc("--xattrs"));
/* ignore trailing zero blocks on input (this was the default until tar-1.21) */
- g_ptr_array_add(argv_ptr, stralloc("--ignore-zeros"));
+ if (argument->ignore_zeros) {
+ g_ptr_array_add(argv_ptr, stralloc("--ignore-zeros"));
+ }
+ if (argument->tar_blocksize) {
+ g_ptr_array_add(argv_ptr, stralloc("--blocking-factor"));
+ g_ptr_array_add(argv_ptr, stralloc(argument->tar_blocksize));
+ }
g_ptr_array_add(argv_ptr, stralloc("-xpGvf"));
g_ptr_array_add(argv_ptr, stralloc("-"));
if (gnutar_directory) {
return incrname;
}
+static void
+check_no_check_device(void)
+{
+ if (gnutar_checkdevice == 0) {
+ GPtrArray *argv_ptr = g_ptr_array_new();
+ int dumpin;
+ int dataf;
+ int outf;
+ int size;
+ char buf[32768];
+
+ g_ptr_array_add(argv_ptr, gnutar_path);
+ g_ptr_array_add(argv_ptr, "-x");
+ g_ptr_array_add(argv_ptr, "--no-check-device");
+ g_ptr_array_add(argv_ptr, "-f");
+ g_ptr_array_add(argv_ptr, "-");
+ g_ptr_array_add(argv_ptr, NULL);
+
+ pipespawnv(gnutar_path, STDIN_PIPE|STDOUT_PIPE|STDERR_PIPE, 0,
+ &dumpin, &dataf, &outf, (char **)argv_ptr->pdata);
+ aclose(dumpin);
+ aclose(dataf);
+ size = read(outf, buf, 32767);
+ if (size > 0) {
+ buf[size] = '\0';
+ if (strstr(buf, "--no-check-device")) {
+ g_debug("disabling --no-check-device since '%s' doesn't support it", gnutar_path);
+ gnutar_checkdevice = 1;
+ }
+ }
+ aclose(outf);
+ g_ptr_array_free(argv_ptr, TRUE);
+ }
+}
+
GPtrArray *amgtar_build_argv(
application_argument_t *argument,
char *incrname,
GPtrArray *argv_ptr = g_ptr_array_new();
GSList *copt;
+ check_no_check_device();
amgtar_build_exinclude(&argument->dle, 1,
&nb_exclude, file_exclude,
&nb_include, file_include);