/* * ========================================================================= */ am_sl_t * calc_load_file( char * filename) { char pattern[1025]; am_sl_t *sl_list; FILE *file = fopen(filename, "r"); if (!file) { return NULL; } sl_list = new_sl(); while(fgets(pattern, 1025, file)) { if(strlen(pattern)>0 && pattern[strlen(pattern)-1] == '\n') pattern[strlen(pattern)-1] = '\0'; sl_list = append_sl(sl_list, pattern); } fclose(file); return sl_list; }
am_sl_t * insert_sort_sl( am_sl_t * sl, char * name) { sle_t *a, *b; if(!sl) { sl = new_sl(); } for(b=sl->first; b != NULL; b=b->next) { int i = strcmp(b->name, name); if(i==0) return(sl); /* already there, no need to insert */ if(i>0) break; } if(b == sl->first) return insert_sl(sl, name); if(b == NULL) return append_sl(sl, name); a = g_malloc(sizeof(sle_t)); a->name = g_strdup(name); /* insert before b */ a->next = b; a->prev = b->prev; b->prev->next = a; b->prev = a; sl->nb_element++; return(sl); }
am_sl_t * duplicate_sl( am_sl_t * sl) { am_sl_t *new_sl = NULL; sle_t *a; if(!sl) return new_sl; for(a = sl->first; a != NULL; a = a->next) { new_sl = append_sl(new_sl, a->name); } return new_sl; }
/* text is not nul-terminated */ static void amtext( G_GNUC_UNUSED GMarkupParseContext *context, const gchar *text, gsize text_len, gpointer user_data, GError **gerror) { char *tt; amgxml_t *data_user = user_data; GSList *last_element = data_user->element_names; char *last_element_name; GSList *last_element2; char *last_element2_name; dle_t *dle = data_user->dle; int i; if (!last_element) { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: Invalid text"); return; } last_element_name = last_element->data; tt = malloc(text_len + 1); strncpy(tt,text,text_len); tt[text_len] = '\0'; //check if it is only space if (match_no_newline("^[ \f\n\r\t\v]*$", tt)) { amfree(tt); return; } if (data_user->raw) { amfree(tt); tt = stralloc(data_user->raw); } //check if it is only space if (match_no_newline("^[ \f\n\r\t\v]*$", tt)) { amfree(tt); return; } if (strcmp(last_element_name, "dle") == 0 || strcmp(last_element_name, "backup-program") == 0 || strcmp(last_element_name, "exclude") == 0 || strcmp(last_element_name, "include") == 0) { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: %s doesn't have text '%s'", last_element_name, tt); return; } else if(strcmp(last_element_name, "disk") == 0) { if (dle->disk != NULL) { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: multiple text in %s", last_element_name); return; } dle->disk = tt; } else if(strcmp(last_element_name, "diskdevice") == 0) { if (dle->device != NULL) { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: multiple text in %s", last_element_name); return; } dle->device = tt; } else if(strcmp(last_element_name, "calcsize") == 0) { if (strcasecmp(tt,"yes") == 0) { dle->estimatelist = g_slist_append(dle->estimatelist, GINT_TO_POINTER(ES_CALCSIZE)); } amfree(tt); } else if(strcmp(last_element_name, "estimate") == 0) { char *ttt = tt; while (strlen(ttt) > 0) { if (BSTRNCMP(ttt,"CLIENT") == 0) { dle->estimatelist = g_slist_append(dle->estimatelist, GINT_TO_POINTER(ES_CLIENT)); ttt += strlen("client"); } else if (BSTRNCMP(ttt,"CALCSIZE") == 0) { if (!data_user->has_calcsize) dle->estimatelist = g_slist_append(dle->estimatelist, GINT_TO_POINTER(ES_CALCSIZE)); ttt += strlen("calcsize"); } else if (BSTRNCMP(ttt,"SERVER") == 0) { dle->estimatelist = g_slist_append(dle->estimatelist, GINT_TO_POINTER(ES_SERVER)); ttt += strlen("server"); } else { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: bad estimate: %s", tt); return; } while (*ttt == ' ') ttt++; } amfree(tt); } else if(strcmp(last_element_name, "program") == 0) { if (dle->program != NULL) { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: multiple text in %s", last_element_name); return; } dle->program = tt; if (strcmp(tt, "APPLICATION") == 0) { dle->program_is_application_api = 1; dle->program = NULL; } } else if(strcmp(last_element_name, "plugin") == 0) { last_element2 = g_slist_nth(data_user->element_names, 1); if (!last_element2) { error("Invalid name text"); } last_element2_name = last_element2->data; if (strcmp(last_element2_name, "backup-program") == 0) { dle->program = tt; } else if (strcmp(last_element2_name, "script") == 0) { data_user->script->plugin = tt; } else { error("plugin outside of backup-program"); } data_user->has_plugin = 1; } else if(strcmp(last_element_name, "name") == 0) { last_element2 = g_slist_nth(data_user->element_names, 1); if (!last_element2) { error("Invalid name text"); } last_element2_name = last_element2->data; if (strcmp(last_element2_name, "property") == 0) { data_user->property_name = tt; } else { error("name outside of property"); } } else if(strcmp(last_element_name, "priority") == 0) { last_element2 = g_slist_nth(data_user->element_names, 1); if (!last_element2) { error("Invalid priority text"); } last_element2_name = last_element2->data; if (strcmp(last_element2_name, "property") == 0) { if (strcasecmp(tt,"yes") == 0) { data_user->property_data->priority = 1; } } else { error("priority outside of property"); } } else if(strcmp(last_element_name, "value") == 0) { last_element2 = g_slist_nth(data_user->element_names, 1); if (!last_element2) { error("Invalid name text"); } last_element2_name = last_element2->data; if (strcmp(last_element2_name, "property") == 0) { data_user->property_data->values = g_slist_append(data_user->property_data->values, tt); } else { error("value outside of property"); } } else if(strcmp(last_element_name, "auth") == 0) { if (dle->auth != NULL) { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: multiple text in %s", last_element_name); return; } dle->auth = tt; } else if(strcmp(last_element_name, "level") == 0) { data_user->alevel->level = atoi(tt); amfree(tt); } else if (strcmp(last_element_name, "server") == 0) { if (strcasecmp(tt,"no") == 0) { data_user->alevel->server = 0; } else if (strcasecmp(tt,"yes") == 0) { data_user->alevel->server = 1; } else { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: Invalid %s (%s)", last_element_name, tt); amfree(tt); return; } amfree(tt); } else if(strcmp(last_element_name, "index") == 0) { if (strcasecmp(tt,"no") == 0) { dle->create_index = 0; } else if (strcasecmp(tt,"yes") == 0) { dle->create_index = 1; } else { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: Invalid %s (%s)", last_element_name, tt); amfree(tt); return; } amfree(tt); } else if(strcmp(last_element_name, "dumpdate") == 0) { if (dle->dumpdate != NULL) { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: multiple text in %s", last_element_name); amfree(tt); return; } dle->dumpdate = tt; } else if(strcmp(last_element_name, "record") == 0) { if (strcasecmp(tt, "no") == 0) { dle->record = 0; } else if (strcasecmp(tt, "yes") == 0) { dle->record = 1; } else { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: Invalid %s (%s)", last_element_name, tt); return; } } else if(strcmp(last_element_name, "spindle") == 0) { dle->spindle = atoi(tt); } else if(strcmp(last_element_name, "compress") == 0) { if (strcmp(tt, "FAST") == 0) { dle->compress = COMP_FAST; } else if (strcmp(tt, "BEST") == 0) { dle->compress = COMP_BEST; } else if (BSTRNCMP(tt, "CUSTOM") == 0) { dle->compress = COMP_CUST; } else if (strcmp(tt, "SERVER-FAST") == 0) { dle->compress = COMP_SERVER_FAST; } else if (strcmp(tt, "SERVER-BEST") == 0) { dle->compress = COMP_SERVER_BEST; } else if (BSTRNCMP(tt, "SERVER-CUSTOM") == 0) { dle->compress = COMP_SERVER_CUST; } else { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: Invalid %s (%s)", last_element_name, tt); amfree(tt); return; } amfree(tt); } else if(strcmp(last_element_name, "custom-compress-program") == 0) { if (dle->compprog != NULL) { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: multiple text in %s", last_element_name); amfree(tt); return; } dle->compprog = tt; } else if(strcmp(last_element_name, "encrypt") == 0) { if (BSTRNCMP(tt,"NO") == 0) { dle->encrypt = ENCRYPT_NONE; } else if (BSTRNCMP(tt, "CUSTOM") == 0) { dle->encrypt = ENCRYPT_CUST; } else if (BSTRNCMP(tt, "SERVER-CUSTOM") == 0) { dle->encrypt = ENCRYPT_SERV_CUST; } else { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: Invalid %s (%s)", last_element_name, tt); amfree(tt); return; } amfree(tt); } else if(strcmp(last_element_name, "kencrypt") == 0) { if (strcasecmp(tt,"no") == 0) { dle->kencrypt = 0; } else if (strcasecmp(tt,"yes") == 0) { dle->kencrypt = 1; } else { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: Invalid %s (%s)", last_element_name, tt); amfree(tt); return; } amfree(tt); } else if(strcmp(last_element_name, "custom-encrypt-program") == 0) { last_element2 = g_slist_nth(data_user->element_names, 1); if (!last_element2) { error("XML: optional"); } last_element2_name = last_element2->data; dle->clnt_encrypt = tt; } else if(strcmp(last_element_name, "decrypt-option") == 0) { last_element2 = g_slist_nth(data_user->element_names, 1); if (!last_element2) { error("XML: optional"); } last_element2_name = last_element2->data; dle->clnt_decrypt_opt = tt; } else if(strcmp(last_element_name, "exclude") == 0 || strcmp(last_element_name, "include") == 0) { data_user->has_optional = 0; } else if(strcmp(last_element_name, "file") == 0) { last_element2 = g_slist_nth(data_user->element_names, 1); if (!last_element2) { error("XML: optional"); } last_element2_name = last_element2->data; if (strcmp(last_element2_name, "exclude") == 0) { dle->exclude_file = append_sl(dle->exclude_file, tt); } else if (strcmp(last_element2_name, "include") == 0) { dle->include_file = append_sl(dle->include_file, tt); } else { error("bad file"); } } else if(strcmp(last_element_name, "list") == 0) { last_element2 = g_slist_nth(data_user->element_names, 1); if (!last_element2) { error("XML: optional"); } last_element2_name = last_element2->data; if (strcmp(last_element2_name, "exclude") == 0) { dle->exclude_list = append_sl(dle->exclude_list, tt); } else if (strcmp(last_element2_name, "include") == 0) { dle->include_list = append_sl(dle->include_list, tt); } else { error("bad list"); } } else if(strcmp(last_element_name, "optional") == 0) { i = atoi(tt); last_element2 = g_slist_nth(data_user->element_names, 1); if (!last_element2) { error("XML: optional"); } last_element2_name = last_element2->data; if (strcmp(last_element2_name, "exclude") == 0) { dle->exclude_optional = 1; } else if (strcmp(last_element2_name, "include") == 0) { dle->include_optional = 1; } else { error("bad optional"); } data_user->has_optional = 1; amfree(tt); } else if(strcmp(last_element_name, "script") == 0) { } else if(strcmp(last_element_name, "execute_on") == 0) { char *sep; char *tt1 = tt; do { sep = strchr(tt1,','); if (sep) *sep = '\0'; if (strcmp(tt1,"PRE-DLE-AMCHECK") == 0) data_user->script->execute_on |= EXECUTE_ON_PRE_DLE_AMCHECK; else if (strcmp(tt1,"PRE-HOST-AMCHECK") == 0) data_user->script->execute_on |= EXECUTE_ON_PRE_HOST_AMCHECK; else if (strcmp(tt1,"POST-DLE-AMCHECK") == 0) data_user->script->execute_on |= EXECUTE_ON_POST_DLE_AMCHECK; else if (strcmp(tt1,"POST-HOST-AMCHECK") == 0) data_user->script->execute_on |= EXECUTE_ON_POST_HOST_AMCHECK; else if (strcmp(tt1,"PRE-DLE-ESTIMATE") == 0) data_user->script->execute_on |= EXECUTE_ON_PRE_DLE_ESTIMATE; else if (strcmp(tt1,"PRE-HOST-ESTIMATE") == 0) data_user->script->execute_on |= EXECUTE_ON_PRE_HOST_ESTIMATE; else if (strcmp(tt1,"POST-DLE-ESTIMATE") == 0) data_user->script->execute_on |= EXECUTE_ON_POST_DLE_ESTIMATE; else if (strcmp(tt1,"POST-HOST-ESTIMATE") == 0) data_user->script->execute_on |= EXECUTE_ON_POST_HOST_ESTIMATE; else if (strcmp(tt1,"PRE-DLE-BACKUP") == 0) data_user->script->execute_on |= EXECUTE_ON_PRE_DLE_BACKUP; else if (strcmp(tt1,"PRE-HOST-BACKUP") == 0) data_user->script->execute_on |= EXECUTE_ON_PRE_HOST_BACKUP; else if (strcmp(tt1,"POST-DLE-BACKUP") == 0) data_user->script->execute_on |= EXECUTE_ON_POST_DLE_BACKUP; else if (strcmp(tt1,"POST-HOST-BACKUP") == 0) data_user->script->execute_on |= EXECUTE_ON_POST_HOST_BACKUP; else if (strcmp(tt1,"PRE-RECOVER") == 0) data_user->script->execute_on |= EXECUTE_ON_PRE_RECOVER; else if (strcmp(tt1,"POST-RECOVER") == 0) data_user->script->execute_on |= EXECUTE_ON_POST_RECOVER; else if (strcmp(tt1,"PRE-LEVEL-RECOVER") == 0) data_user->script->execute_on |= EXECUTE_ON_PRE_LEVEL_RECOVER; else if (strcmp(tt1,"POST-LEVEL-RECOVER") == 0) data_user->script->execute_on |= EXECUTE_ON_POST_LEVEL_RECOVER; else if (strcmp(tt1,"INTER-LEVEL-RECOVER") == 0) data_user->script->execute_on |= EXECUTE_ON_INTER_LEVEL_RECOVER; else dbprintf("BAD EXECUTE_ON: %s\n", tt1); if (sep) tt1 = sep+1; } while (sep); amfree(tt); } else if(strcmp(last_element_name, "execute_where") == 0) { if (strcmp(tt, "CLIENT") == 0) { data_user->script->execute_where = ES_CLIENT; } else { data_user->script->execute_where = ES_SERVER; } } else { g_set_error(gerror, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "XML: amtext not defined for '%s'", last_element_name); return; } }
int main( int argc, char ** argv) { int c; char *command; application_argument_t argument; int i; #ifdef GNUTAR gnutar_path = GNUTAR; #else gnutar_path = NULL; #endif gnutar_directory = NULL; gnutar_onefilesystem = 1; gnutar_atimepreserve = 1; gnutar_checkdevice = 1; gnutar_sparse = 1; gnutar_no_unquote = 0; exit_handling = NULL; /* initialize */ /* * Configure program for internationalization: * 1) Only set the message locale for now. * 2) Set textdomain for all amanda related programs to "amanda" * We don't want to be forced to support dozens of message catalogs. */ setlocale(LC_MESSAGES, "C"); textdomain("amanda"); if (argc < 2) { printf("ERROR no command given to amgtar\n"); error(_("No command given to amgtar")); } /* drop root privileges */ if (!set_root_privs(0)) { if (strcmp(argv[1], "selfcheck") == 0) { printf("ERROR amgtar must be run setuid root\n"); } error(_("amgtar must be run setuid root")); } safe_fd(3, 2); set_pname("amgtar"); /* Don't die when child closes pipe */ signal(SIGPIPE, SIG_IGN); #if defined(USE_DBMALLOC) malloc_size_1 = malloc_inuse(&malloc_hist_1); #endif add_amanda_log_handler(amanda_log_stderr); add_amanda_log_handler(amanda_log_syslog); dbopen(DBG_SUBDIR_CLIENT); startclock(); dbprintf(_("version %s\n"), version()); config_init(CONFIG_INIT_CLIENT, NULL); //check_running_as(RUNNING_AS_DUMPUSER_PREFERRED); //root for amrecover //RUNNING_AS_CLIENT_LOGIN from selfcheck, sendsize, sendbackup /* parse argument */ command = argv[1]; argument.config = NULL; argument.host = NULL; argument.message = 0; argument.collection = 0; argument.calcsize = 0; argument.tar_blocksize = NULL; argument.level = NULL; init_dle(&argument.dle); while (1) { int option_index = 0; c = getopt_long (argc, argv, "", long_options, &option_index); if (c == -1) { break; } switch (c) { case 1: argument.config = stralloc(optarg); break; case 2: argument.host = stralloc(optarg); break; case 3: argument.dle.disk = stralloc(optarg); break; case 4: argument.dle.device = stralloc(optarg); break; case 5: argument.level = g_slist_append(argument.level, GINT_TO_POINTER(atoi(optarg))); break; case 6: argument.dle.create_index = 1; break; case 7: argument.message = 1; break; case 8: argument.collection = 1; break; case 9: argument.dle.record = 1; break; case 10: gnutar_path = stralloc(optarg); break; case 11: gnutar_listdir = stralloc(optarg); break; case 12: if (optarg && strcasecmp(optarg, "NO") == 0) gnutar_onefilesystem = 0; else if (optarg && strcasecmp(optarg, "YES") == 0) gnutar_onefilesystem = 1; else if (strcasecmp(command, "selfcheck") == 0) printf(_("ERROR [%s: bad ONE-FILE-SYSTEM property value (%s)]\n"), get_pname(), optarg); break; case 13: if (optarg && strcasecmp(optarg, "NO") == 0) gnutar_sparse = 0; else if (optarg && strcasecmp(optarg, "YES") == 0) gnutar_sparse = 1; else if (strcasecmp(command, "selfcheck") == 0) printf(_("ERROR [%s: bad SPARSE property value (%s)]\n"), get_pname(), optarg); break; case 14: if (optarg && strcasecmp(optarg, "NO") == 0) gnutar_atimepreserve = 0; else if (optarg && strcasecmp(optarg, "YES") == 0) gnutar_atimepreserve = 1; else if (strcasecmp(command, "selfcheck") == 0) printf(_("ERROR [%s: bad ATIME-PRESERVE property value (%s)]\n"), get_pname(), optarg); break; case 15: if (optarg && strcasecmp(optarg, "NO") == 0) gnutar_checkdevice = 0; else if (optarg && strcasecmp(optarg, "YES") == 0) gnutar_checkdevice = 1; else if (strcasecmp(command, "selfcheck") == 0) printf(_("ERROR [%s: bad CHECK-DEVICE property value (%s)]\n"), get_pname(), optarg); break; case 16: if (optarg) argument.dle.include_file = append_sl(argument.dle.include_file, optarg); break; case 17: if (optarg) argument.dle.include_list = append_sl(argument.dle.include_list, optarg); break; case 18: argument.dle.include_optional = 1; break; case 19: if (optarg) argument.dle.exclude_file = append_sl(argument.dle.exclude_file, optarg); break; case 20: if (optarg) argument.dle.exclude_list = append_sl(argument.dle.exclude_list, optarg); break; case 21: argument.dle.exclude_optional = 1; break; case 22: gnutar_directory = stralloc(optarg); break; case 23: if (optarg) normal_message = g_slist_append(normal_message, optarg); break; case 24: if (optarg) ignore_message = g_slist_append(ignore_message, optarg); break; case 25: if (optarg) strange_message = g_slist_append(strange_message, optarg); break; case 26: if (optarg) exit_handling = stralloc(optarg); break; case 27: argument.calcsize = 1; break; case 28: argument.tar_blocksize = stralloc(optarg); break; case 29: if (optarg && strcasecmp(optarg, "NO") == 0) gnutar_no_unquote = 0; else if (optarg && strcasecmp(optarg, "YES") == 0) gnutar_no_unquote = 1; else if (strcasecmp(command, "selfcheck") == 0) printf(_("ERROR [%s: bad No_UNQUOTE property value (%s)]\n"), get_pname(), optarg); break; case ':': case '?': break; } } argument.argc = argc - optind; argument.argv = argv + optind; if (argument.config) { config_init(CONFIG_INIT_CLIENT | CONFIG_INIT_EXPLICIT_NAME | CONFIG_INIT_OVERLAY, argument.config); dbrename(get_config_name(), DBG_SUBDIR_CLIENT); } if (config_errors(NULL) >= CFGERR_ERRORS) { g_critical(_("errors processing config file")); } re_table = build_re_table(init_re_table, normal_message, ignore_message, strange_message); for(i=0;i<256;i++) exit_value[i] = 1; /* BAD */ exit_value[0] = 0; /* GOOD */ exit_value[1] = 0; /* GOOD */ if (exit_handling) { char *s = exit_handling; while (s) { char *r = strchr(s, '='); if (r) { int j = atoi(s); if (j >= 0 && j < 256) { r++; if (strncasecmp(r, "GOOD", 4) == 0) { exit_value[j] = 0; } } } s = strchr(s+1, ' '); } } gnutar_listdir = getconf_str(CNF_GNUTAR_LIST_DIR); if (strlen(gnutar_listdir) == 0) gnutar_listdir = NULL; if (gnutar_path) { dbprintf("GNUTAR-PATH %s\n", gnutar_path); } else { dbprintf("GNUTAR-PATH is not set\n"); } if (gnutar_listdir) { dbprintf("GNUTAR-LISTDIR %s\n", gnutar_listdir); } else { dbprintf("GNUTAR-LISTDIR is not set\n"); } if (gnutar_directory) { dbprintf("DIRECTORY %s\n", gnutar_directory); } dbprintf("ONE-FILE-SYSTEM %s\n", gnutar_onefilesystem? "yes":"no"); dbprintf("SPARSE %s\n", gnutar_sparse? "yes":"no"); dbprintf("NO-UNQUOTE %s\n", gnutar_no_unquote? "yes":"no"); dbprintf("ATIME-PRESERVE %s\n", gnutar_atimepreserve? "yes":"no"); dbprintf("CHECK-DEVICE %s\n", gnutar_checkdevice? "yes":"no"); { amregex_t *rp; for (rp = re_table; rp->regex != NULL; rp++) { switch (rp->typ) { case DMP_NORMAL : dbprintf("NORMAL %s\n", rp->regex); break; case DMP_IGNORE : dbprintf("IGNORE %s\n", rp->regex); break; case DMP_STRANGE: dbprintf("STRANGE %s\n", rp->regex); break; case DMP_SIZE : dbprintf("SIZE %s\n", rp->regex); break; case DMP_ERROR : dbprintf("ERROR %s\n", rp->regex); break; } } } if (strcmp(command, "support") == 0) { amgtar_support(&argument); } else if (strcmp(command, "selfcheck") == 0) { amgtar_selfcheck(&argument); } else if (strcmp(command, "estimate") == 0) { amgtar_estimate(&argument); } else if (strcmp(command, "backup") == 0) { amgtar_backup(&argument); } else if (strcmp(command, "restore") == 0) { amgtar_restore(&argument); } else if (strcmp(command, "validate") == 0) { amgtar_validate(&argument); } else { dbprintf("Unknown command `%s'.\n", command); fprintf(stderr, "Unknown command `%s'.\n", command); exit (1); } return 0; }
int main( int argc, char ** argv) { int c; char *command; application_argument_t argument; #ifdef STAR star_path = STAR; #else star_path = NULL; #endif star_tardumps = "/etc/tardumps"; star_dle_tardumps = 0; star_onefilesystem = 1; star_sparse = 1; star_directory = NULL; /* initialize */ /* * Configure program for internationalization: * 1) Only set the message locale for now. * 2) Set textdomain for all amanda related programs to "amanda" * We don't want to be forced to support dozens of message catalogs. */ setlocale(LC_MESSAGES, "C"); textdomain("amanda"); if (argc < 2) { printf("ERROR no command given to amstar\n"); error(_("No command given to amstar")); } /* drop root privileges */ if (!set_root_privs(0)) { if (strcmp(argv[1], "selfcheck") == 0) { printf("ERROR amstar must be run setuid root\n"); } error(_("amstar must be run setuid root")); } safe_fd(3, 2); set_pname("amstar"); /* Don't die when child closes pipe */ signal(SIGPIPE, SIG_IGN); #if defined(USE_DBMALLOC) malloc_size_1 = malloc_inuse(&malloc_hist_1); #endif add_amanda_log_handler(amanda_log_stderr); add_amanda_log_handler(amanda_log_syslog); dbopen(DBG_SUBDIR_CLIENT); startclock(); dbprintf(_("version %s\n"), VERSION); config_init(CONFIG_INIT_CLIENT, NULL); //check_running_as(RUNNING_AS_DUMPUSER_PREFERRED); //root for amrecover //RUNNING_AS_CLIENT_LOGIN from selfcheck, sendsize, sendbackup /* parse argument */ command = argv[1]; argument.config = NULL; argument.host = NULL; argument.message = 0; argument.collection = 0; argument.calcsize = 0; argument.level = NULL; argument.command_options = NULL; init_dle(&argument.dle); opterr = 0; while (1) { int option_index = 0; c = getopt_long (argc, argv, "", long_options, &option_index); if (c == -1) break; switch (c) { case 1: argument.config = stralloc(optarg); break; case 2: argument.host = stralloc(optarg); break; case 3: argument.dle.disk = stralloc(optarg); break; case 4: argument.dle.device = stralloc(optarg); break; case 5: argument.level = g_slist_append(argument.level, GINT_TO_POINTER(atoi(optarg))); break; case 6: argument.dle.create_index = 1; break; case 7: argument.message = 1; break; case 8: argument.collection = 1; break; case 9: argument.dle.record = 1; break; case 10: star_path = stralloc(optarg); break; case 11: star_tardumps = stralloc(optarg); break; case 12: if (optarg && strcasecmp(optarg, "NO") == 0) star_dle_tardumps = 0; else if (optarg && strcasecmp(optarg, "YES") == 0) star_dle_tardumps = 1; else if (strcasecmp(command, "selfcheck") == 0) printf(_("ERROR [%s: bad STAR-DLE-TARDUMP property value (%s)]\n"), get_pname(), optarg); break; case 13: if (optarg && strcasecmp(optarg, "YES") != 0) { /* This option is required to be YES */ /* star_onefilesystem = 0; */ } break; case 14: if (optarg && strcasecmp(optarg, "NO") == 0) star_sparse = 0; else if (optarg && strcasecmp(optarg, "YES") == 0) star_sparse = 1; else if (strcasecmp(command, "selfcheck") == 0) printf(_("ERROR [%s: bad SPARSE property value (%s)]\n"), get_pname(), optarg); break; case 15: argument.calcsize = 1; break; case 16: if (optarg) normal_message = g_slist_append(normal_message, optarg); break; case 17: if (optarg) ignore_message = g_slist_append(ignore_message, optarg); break; case 18: if (optarg) strange_message = g_slist_append(strange_message, optarg); break; case 19: if (optarg) argument.dle.include_list = append_sl(argument.dle.include_list, optarg); break; case 20: if (optarg) argument.dle.exclude_list = append_sl(argument.dle.exclude_list, optarg); break; case 21: if (optarg) star_directory = stralloc(optarg); break; case 22: argument.command_options = g_slist_append(argument.command_options, stralloc(optarg)); case 23: if (optarg) argument.dle.exclude_file = append_sl(argument.dle.exclude_file, optarg); break; case ':': case '?': break; } } if (!argument.dle.disk && argument.dle.device) argument.dle.disk = stralloc(argument.dle.device); if (!argument.dle.device && argument.dle.disk) argument.dle.device = stralloc(argument.dle.disk); argument.argc = argc - optind; argument.argv = argv + optind; if (argument.config) { /* overlay this configuration on the existing (nameless) configuration */ config_init(CONFIG_INIT_CLIENT | CONFIG_INIT_EXPLICIT_NAME | CONFIG_INIT_OVERLAY, argument.config); dbrename(get_config_name(), DBG_SUBDIR_CLIENT); } if (config_errors(NULL) >= CFGERR_ERRORS) { g_critical(_("errors processing config file")); } re_table = build_re_table(init_re_table, normal_message, ignore_message, strange_message); if (strcmp(command, "support") == 0) { amstar_support(&argument); } else if (strcmp(command, "selfcheck") == 0) { amstar_selfcheck(&argument); } else if (strcmp(command, "estimate") == 0) { amstar_estimate(&argument); } else if (strcmp(command, "backup") == 0) { amstar_backup(&argument); } else if (strcmp(command, "restore") == 0) { amstar_restore(&argument); } else if (strcmp(command, "validate") == 0) { amstar_validate(&argument); } else { fprintf(stderr, "Unknown command `%s'.\n", command); exit (1); } return 0; }