X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=recover-src%2Famrecover.c;h=b44724d12a4c42ee76f8faa8b54debaf76f442ab;hb=HEAD;hp=2764abbbbb2dbff4a0e8d201c5471ddd791d5ec9;hpb=b116e9366c7b2ea2c2eb53b0a13df4090e176235;p=debian%2Famanda diff --git a/recover-src/amrecover.c b/recover-src/amrecover.c index 2764abb..b44724d 100644 --- a/recover-src/amrecover.c +++ b/recover-src/amrecover.c @@ -1,6 +1,7 @@ /* * Amanda, The Advanced Maryland Automatic Network Disk Archiver * Copyright (c) 1991-1998, 2000 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 @@ -41,6 +42,7 @@ #include "event.h" #include "security.h" #include "conffile.h" +#include "getopt.h" #define amrecover_debug(i, ...) do { \ if ((i) <= debug_amrecover) { \ @@ -48,13 +50,18 @@ } \ } while (0) +static struct option long_options[] = { + {"version" , 0, NULL, 1}, + {NULL, 0, NULL, 0} +}; + extern int process_line(char *line); int get_line(void); int grab_reply(int show); void sigint_handler(int signum); int main(int argc, char **argv); -#define USAGE _("Usage: amrecover [[-C] ] [-s ] [-t ] [-d ] [-o ]*\n") +#define USAGE _("Usage: amrecover [--version] [[-C] ] [-s ] [-t ] [-d ] [-o ]*\n") char *server_name = NULL; int server_socket; @@ -65,6 +72,7 @@ char *disk_name = NULL; /* disk we are restoring */ dle_t *dump_dle = NULL; char *mount_point = NULL; /* where disk was mounted */ char *disk_path = NULL; /* path relative to mount point */ +char *disk_tpath = NULL; /* translated path relative to mount point */ char dump_date[STR_SIZE]; /* date on which we are restoring */ int quit_prog; /* set when time to exit parser */ char *tape_server_name = NULL; @@ -272,7 +280,7 @@ sigint_handler( } -void +char * clean_pathname( char * s) { @@ -290,6 +298,8 @@ clean_pathname( /* remove "/." at end of path */ if(strcmp(&(s[length-2]),"/.")==0) s[length-2]='\0'; + + return s; } @@ -360,8 +370,12 @@ main( } /* now parse regular command-line '-' options */ - while ((i = getopt(argc, argv, "o:C:s:t:d:Uh:")) != EOF) { + while ((i = getopt_long(argc, argv, "o:C:s:t:d:Uh:", long_options, NULL)) != EOF) { switch (i) { + case 1: + printf("amrecover-%s\n", VERSION); + return(0); + break; case 'C': add_config_override(cfg_ovr, "conf", optarg); break; @@ -487,6 +501,7 @@ main( amfree(disk_name); amfree(mount_point); amfree(disk_path); + amfree(disk_tpath); dump_date[0] = '\0'; /* Don't die when child closes pipe */ @@ -831,3 +846,40 @@ stop_amindexd(void) } } } + + +char * +translate_octal( + char *line) +{ + char *s = line, *s1, *s2; + char *p = line; + int i; + + if (!translate_mode) + return strdup(line); + + while(*s != '\0') { + if ((s == line || *(s-1) != '\\') && *s == '\\') { + s++; + s1 = s+1; + s2 = s+2; + if (g_ascii_isdigit(*s) && *s1 != '\0' && + g_ascii_isdigit(*s1) && + g_ascii_isdigit(*s2)) { + i = ((*s)-'0')*64 + ((*s1)-'0')*8 + ((*s2)-'0'); + *p++ = i; + s += 3; + } else { + *p++ = *s++; + } + + } else { + *p++ = *s++; + } + } + *p = '\0'; + + return line; +} +