* file named AUTHORS, in the root directory of this distribution.
*/
/*
- * $Id: amrestore.c,v 1.56.2.1 2006/04/07 10:52:17 martinea Exp $
+ * $Id: amrestore.c,v 1.63 2006/07/25 18:58:10 martinea Exp $
*
* retrieves files from an amanda tape
*/
#define CREAT_MODE 0640
-static int file_number;
+static off_t file_number;
static pid_t comp_enc_pid = -1;
static int tapedev;
-static long filefsf = -1;
+static off_t filefsf = (off_t)-1;
/* local functions */
-static void errexit P((void));
-static void usage P((void));
-int main P((int argc, char **argv));
+static void errexit(void);
+static void usage(void);
+int main(int argc, char **argv);
-static void errexit()
/*
* Do exit(2) after an error, rather than exit(1).
*/
+
+static void
+errexit(void)
{
exit(2);
}
-static void usage()
/*
* Print usage message and terminate.
*/
+
+static void
+usage(void)
{
- error("Usage: amrestore [-b blocksize] [-r|-c] [-p] [-h] [-f fileno] [-l label] tape-device|holdingfile [hostname [diskname [datestamp [hostname [diskname [datestamp ... ]]]]]]");
+ error("Usage: amrestore [-b blocksize] [-r|-c] [-p] [-h] [-f fileno] "
+ "[-l label] tape-device|holdingfile [hostname [diskname [datestamp "
+ "[hostname [diskname [datestamp ... ]]]]]]");
+ /*NOTREACHED*/
}
-int main(argc, argv)
-int argc;
-char **argv;
+
/*
* Parses command line, then loops through all files on tape, restoring
* files that match the command line criteria.
*/
+
+int
+main(
+ int argc,
+ char ** argv)
{
extern int optind;
int opt;
char *label = NULL;
rst_flags_t *rst_flags;
int count_error;
- size_t read_result;
+ long tmplong;
+ ssize_t read_result;
safe_fd(-1, 0);
set_pname("amrestore");
+ dbopen(DBG_SUBDIR_SERVER);
+
/* Don't die when child closes pipe */
signal(SIGPIPE, SIG_IGN);
while( (opt = getopt(argc, argv, "b:cCd:rphf:l:")) != -1) {
switch(opt) {
case 'b':
- rst_flags->blocksize = strtol(optarg, &e, 10);
+ tmplong = strtol(optarg, &e, 10);
+ rst_flags->blocksize = (ssize_t)tmplong;
if(*e == 'k' || *e == 'K') {
rst_flags->blocksize *= 1024;
} else if(*e == 'm' || *e == 'M') {
rst_flags->blocksize *= 1024 * 1024;
} else if(*e != '\0') {
error("invalid rst_flags->blocksize value \"%s\"", optarg);
+ /*NOTREACHED*/
}
if(rst_flags->blocksize < DISK_BLOCK_BYTES) {
error("minimum block size is %dk", DISK_BLOCK_BYTES / 1024);
+ /*NOTREACHED*/
+ }
+ if(rst_flags->blocksize > MAX_TAPE_BLOCK_KB * 1024) {
+ fprintf(stderr,"maximum block size is %dk, using it\n",
+ MAX_TAPE_BLOCK_KB);
+ rst_flags->blocksize = MAX_TAPE_BLOCK_KB * 1024;
+ /*NOTREACHED*/
}
break;
case 'c': rst_flags->compress = 1; break;
case 'p': rst_flags->pipe_to_fd = fileno(stdout); break;
case 'h': rst_flags->headers = 1; break;
case 'f':
- filefsf = strtol(optarg, &e, 10);
+ filefsf = (off_t)strtoll(optarg, &e, 10);
+ /*@ignore@*/
if(*e != '\0') {
error("invalid fileno value \"%s\"", optarg);
+ /*NOTREACHED*/
}
+ /*@end@*/
break;
case 'l':
label = stralloc(optarg);
}
if(rst_flags->compress && rst_flags->raw) {
- fprintf(stderr,
+ fprintf(stderr,
"Cannot specify both -r (raw) and -c (compressed) output.\n");
usage();
}
/*
* This is a new host/disk/date triple, so allocate a match_list.
*/
- me = alloc(sizeof(*me));
+ me = alloc(SIZEOF(*me));
me->hostname = argv[optind++];
me->diskname = "";
me->datestamp = "";
}
}
if(match_list == NULL) {
- match_list = alloc(sizeof(*match_list));
+ match_list = alloc(SIZEOF(*match_list));
match_list->hostname = "";
match_list->diskname = "";
match_list->datestamp = "";
if(tape_stat(tapename,&stat_tape)!=0) {
error("could not stat %s: %s", tapename, strerror(errno));
+ /*NOTREACHED*/
}
isafile=S_ISREG((stat_tape.st_mode));
else {
if((err = tape_rewind(tapename)) != NULL) {
error("Could not rewind device '%s': %s", tapename, err);
+ /*NOTREACHED*/
}
if ((tapedev = tape_open(tapename, 0)) == -1) {;
error("Could not open device '%s': %s", tapename, err);
+ /*NOTREACHED*/
}
read_file_header(&file, tapedev, isafile, rst_flags);
if(file.type != F_TAPESTART) {
tapefd_close(tapedev);
if((err = tape_rewind(tapename)) != NULL) {
error("Could not rewind device '%s': %s", tapename, err);
+ /*NOTREACHED*/
}
}
}
- file_number = 0;
- if(filefsf != -1) {
+ file_number = (off_t)0;
+ if(filefsf != (off_t)-1) {
if(isafile) {
fprintf(stderr,"%s: ignoring -f flag when restoring from a file.\n",
get_pname());
else {
if((err = tape_rewind(tapename)) != NULL) {
error("Could not rewind device '%s': %s", tapename, err);
+ /*NOTREACHED*/
}
- if((err = tape_fsf(tapename,filefsf)) != NULL) {
+ if((err = tape_fsf(tapename, filefsf)) != NULL) {
error("Could not fsf device '%s': %s", tapename, err);
+ /*NOTREACHED*/
}
file_number = filefsf;
}
}
if(tapedev < 0) {
error("could not open %s: %s", tapename, strerror(errno));
+ /*NOTREACHED*/
}
- read_file_header(&file, tapedev, isafile, rst_flags);
-
- if(file.type != F_TAPESTART && !isafile && filefsf == -1) {
+ read_result = read_file_header(&file, tapedev, isafile, rst_flags);
+ if(file.type != F_TAPESTART && !isafile && filefsf == (off_t)-1) {
fprintf(stderr, "%s: WARNING: not at start of tape, file numbers will be offset\n",
get_pname());
}
- count_error=0;
- read_result = 0;
+ count_error = 0;
while(count_error < 10) {
if(file.type == F_TAPEEND) break;
found_match = 0;
break;
}
}
- fprintf(stderr, "%s: %3d: %s ",
+ fprintf(stderr, "%s: " OFF_T_FMT ": %s ",
get_pname(),
- file_number,
+ (OFF_T_FMT_TYPE)file_number,
found_match ? "restoring" : "skipping");
if(file.type != F_DUMPFILE && file.type != F_SPLIT_DUMPFILE) {
print_header(stderr, &file);
tapefd_close(tapedev);
if((tapedev = tape_open(tapename, 0)) < 0) {
error("could not open %s: %s", tapename, strerror(errno));
+ /*NOTREACHED*/
}
count_error++;
} else {
* If the last read got something (even an error), we can
* do an fsf to get to the next file.
*/
- if(tapefd_fsf(tapedev, 1) < 0) {
+ if(tapefd_fsf(tapedev, (off_t)1) < 0) {
error("could not fsf %s: %s", tapename, strerror(errno));
+ /*NOTREACHED*/
}
count_error=0;
}
file_number++;
- read_file_header(&file, tapedev, isafile, rst_flags);
+ read_result = read_file_header(&file, tapedev, isafile, rst_flags);
}
if(isafile) {
close(tapedev);
tapefd_close(tapedev);
if((tapedev = tape_open(tapename, 0)) < 0) {
error("could not open %s: %s", tapename, strerror(errno));
+ /*NOTREACHED*/
}
} else {
- if(tapefd_fsf(tapedev, 1) < 0) {
+ if(tapefd_fsf(tapedev, (off_t)1) < 0) {
error("could not fsf %s: %s", tapename, strerror(errno));
+ /*NOTREACHED*/
}
}
tapefd_close(tapedev);
}
if((read_result <= 0 || file.type == F_TAPEEND) && !isafile) {
- fprintf(stderr, "%s: %3d: reached ", get_pname(), file_number);
+ fprintf(stderr, "%s: " OFF_T_FMT ": reached ",
+ get_pname(), (OFF_T_FMT_TYPE)file_number);
if(read_result <= 0) {
fprintf(stderr, "end of information\n");
} else {