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

📄 display_commands.c

📁 开源备份软件源码 AMANDA, the Advanced Maryland Automatic Network Disk Archiver, is a backup system that a
💻 C
字号:
/* * 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: display_commands.c,v 1.22 2006/07/05 19:42:17 martinea Exp $ * * implements the directory-display related commands in amrecover */#include "amanda.h"#include "amrecover.h"#include "util.h"DIR_ITEM *get_dir_list(void);DIR_ITEM *get_next_dir_item(DIR_ITEM *this);void clear_dir_list(void);void free_dir_item(DIR_ITEM *item);static int add_dir_list_item(char *date,				int level,				char *tape,				off_t fileno,				char *path);void list_disk_history(void);void suck_dir_list_from_server(void);void list_directory(void);static DIR_ITEM *dir_list = NULL;DIR_ITEM *get_dir_list(void){    return dir_list;}DIR_ITEM *get_next_dir_item(    DIR_ITEM *	this){    /*@ignore@*/    return this->next;    /*@end@*/}voidclear_dir_list(void){    free_dir_item(dir_list); /* Frees all items from dir_list to end of list */    dir_list = NULL;}voidfree_dir_item(    DIR_ITEM *	item){    DIR_ITEM *next;    while (item != NULL) {	next = item->next;        amfree(item->date);        amfree(item->tape);        amfree(item->path);        amfree(item);	item = next;    }}/* add item to list if path not already on list */static intadd_dir_list_item(    char *	date,    int		level,    char *	tape,    off_t	fileno,    char *	path){    DIR_ITEM *next;    dbprintf(_("add_dir_list_item: Adding \"%s\" \"%d\" \"%s\" \"%lld\" \"%s\"\n"),	      date, level, tape, (long long)fileno, path);    next = (DIR_ITEM *)alloc(sizeof(DIR_ITEM));    memset(next, 0, sizeof(DIR_ITEM));    next->date = stralloc(date);    next->level = level;    next->tape = stralloc(tape);    next->fileno = fileno;    next->path = stralloc(path);    next->next = dir_list;    dir_list = next;    return 0;}voidlist_disk_history(void){    if (converse("DHST") == -1)	exit(1);}voidsuck_dir_list_from_server(void){    char *cmd = NULL;    char *err = NULL;    int i;    char *l = NULL;    char *date;    int level = 0;    off_t fileno = (off_t)-1;    char *tape, *tape_undo, tape_undo_ch = '\0';    char *dir, *qdir;    char *disk_path_slash = NULL;    char *disk_path_slash_dot = NULL;    char *s;    int ch;    char *qdisk_path;    if (disk_path == NULL) {	g_printf(_("Directory must be set before getting listing\n"));	return;    } else if(strcmp(disk_path, "/") == 0) {	disk_path_slash = stralloc(disk_path);    } else {	disk_path_slash = stralloc2(disk_path, "/");    }    clear_dir_list();    qdisk_path = quote_string(disk_path);    cmd = stralloc2("OLSD ", qdisk_path);    amfree(qdisk_path);    if (send_command(cmd) == -1) {	amfree(cmd);	amfree(disk_path_slash);	exit(1);    }    amfree(cmd);    /* skip preamble */    if ((i = get_reply_line()) == -1) {	amfree(disk_path_slash);	exit(1);    }    if (i == 0)				/* assume something wrong! */    {	amfree(disk_path_slash);	l = reply_line();	g_printf("%s\n", l);	return;    }    disk_path_slash_dot = stralloc2(disk_path_slash, ".");    amfree(cmd);    amfree(err);    tape_undo = NULL;    /* skip the last line -- duplicate of the preamble */    while ((i = get_reply_line()) != 0)    {	if (i == -1) {	    amfree(disk_path_slash_dot);	    amfree(disk_path_slash);	    exit(1);	}	if(err) {	    if(cmd == NULL) {		if(tape_undo) *tape_undo = tape_undo_ch;		tape_undo = NULL;		cmd = stralloc(l);	/* save for the error report */	    }	    continue;			/* throw the rest of the lines away */	}	l = reply_line();	if (!server_happy())	{	    g_printf("%s\n", l);	    continue;	}	s = l;	if (strncmp_const_skip(l, "201-", s, ch) != 0) {	    err = _("bad reply: not 201-");	    continue;	}	ch = *s++;	skip_whitespace(s, ch);	if(ch == '\0') {	    err = _("bad reply: missing date field");	    continue;	}	date = s - 1;	skip_non_whitespace(s, ch);	*(s - 1) = '\0';	skip_whitespace(s, ch);	if(ch == '\0' || sscanf(s - 1, "%d", &level) != 1) {	    err = _("bad reply: cannot parse level field");	    continue;	}	skip_integer(s, ch);	skip_whitespace(s, ch);	if(ch == '\0') {	    err = _("bad reply: missing tape field");	    continue;	}	tape = s - 1;	skip_non_whitespace(s, ch);	tape_undo = s - 1;	tape_undo_ch = *tape_undo;	*tape_undo = '\0';	if(am_has_feature(indexsrv_features, fe_amindexd_fileno_in_OLSD)) {	    long long fileno_ = (long long)0;	    skip_whitespace(s, ch);	    if(ch == '\0' || sscanf(s - 1, "%lld", &fileno_) != 1) {		err = _("bad reply: cannot parse fileno field");		continue;	    }	    fileno = (off_t)fileno_;	    skip_integer(s, ch);	}	else {	    fileno = (off_t)-1;	}	skip_whitespace(s, ch);	if(ch == '\0') {	    err = _("bad reply: missing directory field");	    continue;	}	qdir = s - 1;	dir = unquote_string(qdir);	/* add a '.' if it a the entry for the current directory */	if((strcmp(disk_path,dir)==0) || (strcmp(disk_path_slash,dir)==0)) {	    amfree(dir);	    dir = stralloc(disk_path_slash_dot);	}	add_dir_list_item(date, level, tape, fileno, dir);	amfree(dir);    }    amfree(disk_path_slash_dot);    amfree(disk_path_slash);    if(!server_happy()) {	puts(reply_line());    } else if(err) {	if(*err) {	    puts(err);	}	if (cmd)	    puts(cmd);	clear_dir_list();    }    amfree(cmd);}voidlist_directory(void){    size_t i;    DIR_ITEM *item;    FILE *fp;    char *pager;    char *pager_command;    char *quoted;    if (disk_path == NULL) {	g_printf(_("Must select a disk before listing files; use the setdisk command.\n"));	return;    }    if ((pager = getenv("PAGER")) == NULL)    {	pager = "more";    }    /*     * Set up the pager command so if the pager is terminated, we do     * not get a SIGPIPE back.     */    pager_command = stralloc2(pager, " ; /bin/cat > /dev/null");    if ((fp = popen(pager_command, "w")) == NULL)    {	g_printf(_("Warning - can't pipe through %s\n"), pager);	fp = stdout;    }    amfree(pager_command);    i = strlen(disk_path);    if (i != 1)	i++;				/* so disk_path != "/" */    for (item = get_dir_list(); item != NULL; item=get_next_dir_item(item)) {	quoted = quote_string(item->path + i);	g_fprintf(fp, "%s %s\n", item->date, quoted);	amfree(quoted);    }    apclose(fp);}

⌨️ 快捷键说明

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