⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 amflush.c

📁 开源备份软件源码 AMANDA, the Advanced Maryland Automatic Network Disk Archiver, is a backup system that a
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Amanda, The Advanced Maryland Automatic Network Disk Archiver * Copyright (c) 1991-1998 University of Maryland at College Park * All Rights Reserved. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of U.M. not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission.  U.M. makes no representations about the * suitability of this software for any purpose.  It is provided "as is" * without express or implied warranty. * * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M. * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: the Amanda Development Team.  Its members are listed in a * file named AUTHORS, in the root directory of this distribution. *//* * $Id: amflush.c,v 1.95 2006/07/25 21:41:24 martinea Exp $ * * write files from work directory onto tape */#include "amanda.h"#include "conffile.h"#include "diskfile.h"#include "tapefile.h"#include "logfile.h"#include "clock.h"#include "version.h"#include "holding.h"#include "driverio.h"#include "server_util.h"#include "timestamp.h"static char *conf_logdir;FILE *driver_stream;char *driver_program;char *reporter_program;char *logroll_program;char *datestamp;char *amflush_timestamp;char *amflush_datestamp;/* local functions */void flush_holdingdisk(char *diskdir, char *datestamp);static GSList * pick_datestamp(void);void confirm(GSList *datestamp_list);void redirect_stderr(void);void detach(void);void run_dumps(void);static int get_letter_from_user(void);intmain(    int		argc,    char **	argv){    int foreground;    int batch;    int redirect;    char **datearg = NULL;    int nb_datearg = 0;    char *conf_diskfile;    char *conf_tapelist;    char *conf_logfile;    int conf_usetimestamps;    disklist_t diskq;    disk_t *dp;    pid_t pid;    pid_t driver_pid, reporter_pid;    amwait_t exitcode;    int opt;    dumpfile_t file;    GSList *holding_list=NULL, *holding_file;    int driver_pipe[2];    char date_string[100];    char date_string_standard[100];    time_t today;    char *errstr;    struct tm *tm;    char *tapedev;    char *tpchanger;    char *qdisk, *qhname;    GSList *datestamp_list = NULL;    config_overwrites_t *cfg_ovr;    char **config_options;    /*     * 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");     safe_fd(-1, 0);    safe_cd();    set_pname("amflush");    /* Don't die when child closes pipe */    signal(SIGPIPE, SIG_IGN);    dbopen(DBG_SUBDIR_SERVER);    erroutput_type = ERR_INTERACTIVE;    foreground = 0;    batch = 0;    redirect = 1;    /* process arguments */    cfg_ovr = new_config_overwrites(argc/2);    while((opt = getopt(argc, argv, "bfso:D:")) != EOF) {	switch(opt) {	case 'b': batch = 1;		  break;	case 'f': foreground = 1;		  break;	case 's': redirect = 0;		  break;	case 'o': add_config_overwrite_opt(cfg_ovr, optarg);		  break;	case 'D': if (datearg == NULL)		      datearg = alloc(21*SIZEOF(char *));		  if(nb_datearg == 20) {		      g_fprintf(stderr,_("maximum of 20 -D arguments.\n"));		      exit(1);		  }		  datearg[nb_datearg++] = stralloc(optarg);		  datearg[nb_datearg] = NULL;		  break;	}    }    argc -= optind, argv += optind;    if(!foreground && !redirect) {	g_fprintf(stderr,_("Can't redirect to stdout/stderr if not in forground.\n"));	exit(1);    }    if(argc < 1) {	error(_("Usage: amflush%s [-b] [-f] [-s] [-D date]* <confdir> [host [disk]* ]* [-o configoption]*"), versionsuffix());	/*NOTREACHED*/    }    config_init(CONFIG_INIT_EXPLICIT_NAME | CONFIG_INIT_FATAL,		argv[0]);    apply_config_overwrites(cfg_ovr);    check_running_as(RUNNING_AS_DUMPUSER);    dbrename(config_name, DBG_SUBDIR_SERVER);    conf_diskfile = config_dir_relative(getconf_str(CNF_DISKFILE));    if (read_diskfile(conf_diskfile, &diskq) < 0) {	error(_("could not read disklist file \"%s\""), conf_diskfile);	/*NOTREACHED*/    }    errstr = match_disklist(&diskq, argc-1, argv+1);    if (errstr) {	g_printf(_("%s"),errstr);	amfree(errstr);    }    amfree(conf_diskfile);    conf_tapelist = config_dir_relative(getconf_str(CNF_TAPELIST));    if(read_tapelist(conf_tapelist)) {	error(_("could not load tapelist \"%s\""), conf_tapelist);	/*NOTREACHED*/    }    amfree(conf_tapelist);    conf_usetimestamps = getconf_boolean(CNF_USETIMESTAMPS);    amflush_datestamp = get_datestamp_from_time(0);    if(conf_usetimestamps == 0) {	amflush_timestamp = stralloc(amflush_datestamp);    }    else {	amflush_timestamp = get_timestamp_from_time(0);    }    conf_logdir = config_dir_relative(getconf_str(CNF_LOGDIR));    conf_logfile = vstralloc(conf_logdir, "/log", NULL);    if (access(conf_logfile, F_OK) == 0) {	error(_("%s exists: amdump or amflush is already running, or you must run amcleanup"), conf_logfile);	/*NOTREACHED*/    }    amfree(conf_logfile);    driver_program = vstralloc(amlibexecdir, "/", "driver", versionsuffix(),			       NULL);    reporter_program = vstralloc(sbindir, "/", "amreport", versionsuffix(),				 NULL);    logroll_program = vstralloc(amlibexecdir, "/", "amlogroll", versionsuffix(),				NULL);    tapedev = getconf_str(CNF_TAPEDEV);    tpchanger = getconf_str(CNF_TPCHANGER);    if (tapedev == NULL && tpchanger == NULL) {	error(_("No tapedev or tpchanger specified"));    }    /* if dates were specified (-D), then use match_datestamp     * against the list of all datestamps to turn that list     * into a set of existing datestamps (basically, evaluate the     * expressions into actual datestamps) */    if(datearg) {	GSList *all_datestamps;	GSList *datestamp;	int i, ok;	all_datestamps = holding_get_all_datestamps();	for(datestamp = all_datestamps; datestamp != NULL; datestamp = datestamp->next) {	    ok = 0;	    for(i=0; i<nb_datearg && ok==0; i++) {		ok = match_datestamp(datearg[i], (char *)datestamp->data);	    }	    if (ok)		datestamp_list = g_slist_insert_sorted(datestamp_list,		    stralloc((char *)datestamp->data),		    g_compare_strings);	}	g_slist_free_full(all_datestamps);    }    else {	/* otherwise, in batch mode, use all datestamps */	if(batch) {	    datestamp_list = holding_get_all_datestamps();	}	/* or allow the user to pick datestamps */	else {	    datestamp_list = pick_datestamp();	}    }    if(!datestamp_list) {	g_printf(_("Could not find any Amanda directories to flush.\n"));	exit(1);    }    holding_list = holding_get_files_for_flush(datestamp_list);    if (holding_list == NULL) {	g_printf(_("Could not find any valid dump image, check directory.\n"));	exit(1);    }    if(!batch) confirm(datestamp_list);    for(dp = diskq.head; dp != NULL; dp = dp->next) {	if(dp->todo) {	    char *qname;	    qname = quote_string(dp->name);	    log_add(L_DISK, "%s %s", dp->host->hostname, qname);	    amfree(qname);	}    }    if(!foreground) { /* write it before redirecting stdout */	puts(_("Running in background, you can log off now."));	puts(_("You'll get mail when amflush is finished."));    }    if(redirect) redirect_stderr();    if(!foreground) detach();    erroutput_type = (ERR_AMANDALOG|ERR_INTERACTIVE);    set_logerror(logerror);    today = time(NULL);    tm = localtime(&today);    if (tm) {	strftime(date_string, 100, "%a %b %e %H:%M:%S %Z %Y", tm);	strftime(date_string_standard, 100, "%Y-%m-%d %H:%M:%S %Z", tm);    } else {	error(_("BAD DATE")); /* should never happen */    }    g_fprintf(stderr, _("amflush: start at %s\n"), date_string);    g_fprintf(stderr, _("amflush: datestamp %s\n"), amflush_timestamp);    g_fprintf(stderr, _("amflush: starttime %s\n"), amflush_timestamp);    g_fprintf(stderr, _("amflush: starttime-locale-independent %s\n"),	      date_string_standard);    log_add(L_START, _("date %s"), amflush_timestamp);    /* START DRIVER */    if(pipe(driver_pipe) == -1) {	error(_("error [opening pipe to driver: %s]"), strerror(errno));	/*NOTREACHED*/    }    if((driver_pid = fork()) == 0) {	/*	 * This is the child process.	 */	dup2(driver_pipe[0], 0);	close(driver_pipe[1]);	config_options = get_config_options(3);	config_options[0] = "driver";	config_options[1] = config_name;	config_options[2] = "nodump";	safe_fd(-1, 0);	execve(driver_program, config_options, safe_env());	error(_("cannot exec %s: %s"), driver_program, strerror(errno));	/*NOTREACHED*/    } else if(driver_pid == -1) {	error(_("cannot fork for %s: %s"), driver_program, strerror(errno));	/*NOTREACHED*/    }    driver_stream = fdopen(driver_pipe[1], "w");    if (!driver_stream) {	error(_("Can't fdopen: %s"), strerror(errno));	/*NOTREACHED*/    }    g_fprintf(driver_stream, "DATE %s\n", amflush_timestamp);    for(holding_file=holding_list; holding_file != NULL;				   holding_file = holding_file->next) {	holding_file_get_dumpfile((char *)holding_file->data, &file);	if (holding_file_size((char *)holding_file->data, 1) <= 0) {	    log_add(L_INFO, "%s: removing file with no data.",		    (char *)holding_file->data);	    holding_file_unlink((char *)holding_file->data);	    continue;	}	dp = lookup_disk(file.name, file.disk);	if (!dp) {	    error("dp == NULL");	    /*NOTREACHED*/	}	if (dp->todo == 0) continue;	qdisk = quote_string(file.disk);	qhname = quote_string((char *)holding_file->data);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -