X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fbuffer.c;h=f2b2d64aef563463fde6cd2a95160e150247a5f6;hb=0eceef9ba14ca872e57ecd2f4ca4f5893b78bac8;hp=eb38704b7b0b1bba3f18929137fba243c5b7b534;hpb=c59c86911b8af1e6fb469b444d5ee610c4753f6a;p=chaz%2Ftar diff --git a/src/buffer.c b/src/buffer.c index eb38704..f2b2d64 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -33,7 +33,7 @@ extern int errno; #include time_t time(); -#ifndef NO_MTIO +#ifdef HAVE_SYS_MTIO_H #include #include #endif @@ -258,6 +258,7 @@ child_open() { int pipe[2]; int err = 0; + int nar; int kidpipe[2]; int kidchildpid; @@ -301,24 +302,24 @@ child_open() 2: the file is to be accessed by rmt (compress doesn't know how) 3: the file is not a plain file */ #ifdef NO_REMOTE - if(!(ar_file[0]=='-' && ar_file[1]=='\0') && isfile(ar_file)) + if(!(ar_files[0][0]=='-' && ar_files[0][1]=='\0') && isfile(ar_files[0])) #else - if(!(ar_file[0]=='-' && ar_file[1]=='\0') && !_remdev(ar_file) && isfile(ar_file)) + if(!(ar_files[0][0]=='-' && ar_files[0][1]=='\0') && !_remdev(ar_files[0]) && isfile(ar_files[0])) #endif { /* We don't need a child tar. Open the archive */ if(ar_reading) { - archive=open(ar_file, O_RDONLY|O_BINARY, 0666); + archive=open(ar_files[0], O_RDONLY|O_BINARY, 0666); if(archive<0) { - msg_perror("can't open archive %s",ar_file); + msg_perror("can't open archive %s",ar_files[0]); exit(EX_BADARCH); } dupto(archive,STDIN,"archive to stdin"); /* close(archive); */ } else { - archive=creat(ar_file,0666); + archive=creat(ar_files[0],0666); if(archive<0) { - msg_perror("can't open archive %s",ar_file); + msg_perror("can't open archive %s",ar_files[0]); exit(EX_BADARCH); } dupto(archive,STDOUT,"archive to stdout"); @@ -361,20 +362,20 @@ child_open() ck_close(kidpipe[WRITE]); } - if (ar_file[0] == '-' && ar_file[1] == '\0') { + if (ar_files[0][0] == '-' && ar_files[0][1] == '\0') { if (ar_reading) archive = STDIN; else archive = STDOUT; } else /* This can't happen if (ar_reading==2) - archive = rmtopen(ar_file, O_RDWR|O_CREAT|O_BINARY, 0666); + archive = rmtopen(ar_files[0], O_RDWR|O_CREAT|O_BINARY, 0666); else */if(ar_reading) - archive = rmtopen(ar_file, O_RDONLY|O_BINARY, 0666); + archive = rmtopen(ar_files[0], O_RDONLY|O_BINARY, 0666); else - archive = rmtcreat(ar_file, 0666); + archive = rmtcreat(ar_files[0], 0666); if (archive < 0) { - msg_perror("can't open archive %s",ar_file); + msg_perror("can't open archive %s",ar_files[0]); exit(EX_BADARCH); } @@ -492,7 +493,7 @@ open_archive(reading) exit(EX_ARGSBAD); } - if(ar_file==0) { + if(n_ar_files==0) { msg("No archive name given, what should I do?"); exit(EX_BADARCH); } @@ -514,16 +515,26 @@ open_archive(reading) ar_last = ar_block + blocking; ar_reading = reading; + if (f_multivol && f_verify) + { + msg ("cannot verify multi-volume archives"); + exit (EX_ARGSBAD); + } + if (f_compress) { if(reading==2 || f_verify) { msg("cannot update or verify compressed archives"); exit(EX_ARGSBAD); } + if (f_multivol) { + msg ("cannot use multi-volume compressed archives"); + exit (EX_ARGSBAD); + } child_open(); - if(!reading && ar_file[0]=='-' && ar_file[1]=='\0') + if(!reading && ar_files[0][0]=='-' && ar_files[0][1]=='\0') msg_file = stderr; /* child_open(rem_host, rem_file); */ - } else if (ar_file[0] == '-' && ar_file[1] == '\0') { + } else if (ar_files[0][0] == '-' && ar_files[0][1] == '\0') { f_reblock++; /* Could be a pipe, be safe */ if(f_verify) { msg("can't verify stdin/stdout archive"); @@ -540,14 +551,14 @@ open_archive(reading) msg_file = stderr; } } else if (reading==2 || f_verify) { - archive = rmtopen(ar_file, O_RDWR|O_CREAT|O_BINARY, 0666); + archive = rmtopen(ar_files[0], O_RDWR|O_CREAT|O_BINARY, 0666); } else if(reading) { - archive = rmtopen(ar_file, O_RDONLY|O_BINARY, 0666); + archive = rmtopen(ar_files[0], O_RDONLY|O_BINARY, 0666); } else { - archive = rmtcreat(ar_file, 0666); + archive = rmtcreat(ar_files[0], 0666); } if (archive < 0) { - msg_perror("can't open %s",ar_file); + msg_perror("can't open %s",ar_files[0]); exit(EX_BADARCH); } #ifndef __MSDOS__ @@ -586,10 +597,10 @@ open_archive(reading) msg("Archive not labelled to match %s",f_volhdr); exit(EX_BADVOL); } - if (re_match (label_pattern, head->header.name, - strlen (head->header.name), 0, 0) < 0) { + if (re_match (label_pattern, head->header.arch_name, + strlen (head->header.arch_name), 0, 0) < 0) { msg ("Volume mismatch! %s!=%s", f_volhdr, - head->header.name); + head->header.arch_name); exit (EX_BADVOL); } #if 0 @@ -604,9 +615,9 @@ open_archive(reading) } else if(f_volhdr) { bzero((void *)ar_block,RECORDSIZE); if(f_multivol) - sprintf(ar_block->header.name,"%s Volume 1",f_volhdr); + sprintf(ar_block->header.arch_name,"%s Volume 1",f_volhdr); else - strcpy(ar_block->header.name,f_volhdr); + strcpy(ar_block->header.arch_name,f_volhdr); ar_block->header.linkflag = LF_VOLHDR; to_oct(time(0), 1+12, ar_block->header.mtime); finish_header(ar_block); @@ -710,7 +721,7 @@ fl_write() copy_back = 0; if(f_volhdr) { bzero((void *)ar_block,RECORDSIZE); - sprintf(ar_block->header.name,"%s Volume %d",f_volhdr,volno); + sprintf(ar_block->header.arch_name,"%s Volume %d",f_volhdr,volno); to_oct(time(0), 1+12, ar_block->header.mtime); ar_block->header.linkflag = LF_VOLHDR; finish_header(ar_block); @@ -721,7 +732,7 @@ fl_write() if(f_volhdr) ar_block++; bzero((void *)ar_block,RECORDSIZE); - strcpy(ar_block->header.name,real_s_name); + strcpy(ar_block->header.arch_name,real_s_name); ar_block->header.linkflag = LF_MULTIVOL; to_oct((long)real_s_sizeleft,1+12, ar_block->header.size); @@ -779,10 +790,10 @@ writeerror(err) int err; { if (err < 0) { - msg_perror("can't write to %s",ar_file); + msg_perror("can't write to %s",ar_files[cur_ar_file]); exit(EX_BADARCH); } else { - msg("only wrote %u of %u bytes to %s",err,blocksize,ar_file); + msg("only wrote %u of %u bytes to %s",err,blocksize,ar_files[cur_ar_file]); exit(EX_BADARCH); } } @@ -799,7 +810,7 @@ readerror() read_error_flag++; /* Tell callers */ - msg_perror("read error on %s",ar_file); + msg_perror("read error on %s",ar_files[cur_ar_file]); if (baserec == 0) { /* First block of tape. Probably stupidity error */ @@ -908,11 +919,11 @@ error_loop: ptr=(char *)malloc(strlen(f_volhdr)+20); sprintf(ptr,"%s Volume %d",f_volhdr,volno); #endif - if (re_match (label_pattern, head->header.name, - strlen (head->header.name), + if (re_match (label_pattern, head->header.arch_name, + strlen (head->header.arch_name), 0, 0) < 0) { msg("Volume mismatch! %s!=%s",f_volhdr, - head->header.name); + head->header.arch_name); --volno; --global_volno; goto try_volume; @@ -930,7 +941,7 @@ error_loop: #endif } if(f_verbose) - fprintf(msg_file,"Reading %s\n",head->header.name); + fprintf(msg_file,"Reading %s\n",head->header.arch_name); head++; } else if(f_volhdr) { msg("Warning: No volume header!"); @@ -939,7 +950,7 @@ error_loop: if(real_s_name[0]) { long from_oct(); - if(head->header.linkflag!=LF_MULTIVOL || strcmp(head->header.name,real_s_name)) { + if(head->header.linkflag!=LF_MULTIVOL || strcmp(head->header.arch_name,real_s_name)) { msg("%s is not continued on this volume!",real_s_name); --volno; --global_volno; @@ -947,7 +958,7 @@ error_loop: } if(real_s_totsize!=from_oct(1+12,head->header.size)+from_oct(1+12,head->header.offset)) { msg("%s is the wrong size (%ld!=%ld+%ld)", - head->header.name,save_totsize, + head->header.arch_name,save_totsize, from_oct(1+12,head->header.size), from_oct(1+12,head->header.offset)); --volno; @@ -997,7 +1008,7 @@ error2loop: goto error2loop; /* Try again */ } if (err == 0) { - msg("archive %s EOF not on block boundary",ar_file); + msg("archive %s EOF not on block boundary",ar_files[cur_ar_file]); exit(EX_BADARCH); } left -= err; @@ -1005,7 +1016,7 @@ error2loop: goto again; } } else { - msg("only read %d bytes from archive %s",err,ar_file); + msg("only read %d bytes from archive %s",err,ar_files[cur_ar_file]); exit(EX_BADARCH); } } @@ -1030,7 +1041,7 @@ flush_archive() if(file_to_switch_to>=0) { if((c=rmtclose(archive))<0) - msg_perror("Warning: can't close %s(%d,%d)",ar_file,archive,c); + msg_perror("Warning: can't close %s(%d,%d)",ar_files[cur_ar_file],archive,c); archive=file_to_switch_to; } else @@ -1107,7 +1118,7 @@ close_archive() verify_volume(); if((c=rmtclose(archive))<0) - msg_perror("Warning: can't close %s(%d,%d)",ar_file,archive,c); + msg_perror("Warning: can't close %s(%d,%d)",ar_files[cur_ar_file],archive,c); #ifndef __MSDOS__ if (childpid) { @@ -1249,6 +1260,7 @@ int type; extern int now_verifying; extern char TTY_NAME[]; char *getenv(); + static int looped = 0; if(!read_file && !f_run_script_at_end) read_file = (archive==0) ? fopen(TTY_NAME, "r") : stdin; @@ -1258,99 +1270,109 @@ int type; if(f_verify) verify_volume(); if((c=rmtclose(archive))<0) - msg_perror("Warning: can't close %s(%d,%d)",ar_file,archive,c); + msg_perror("Warning: can't close %s(%d,%d)",ar_files[cur_ar_file],archive,c); global_volno++; volno++; + cur_ar_file++; + if (cur_ar_file == n_ar_files) + { + cur_ar_file = 0; + looped = 1; + } + tryagain: - if (f_run_script_at_end) - system(info_script); - else for(;;) { - fprintf(msg_file,"\007Prepare volume #%d and hit return: ",global_volno); - fflush(msg_file); - if(fgets(inbuf,sizeof(inbuf),read_file)==0) { - fprintf(msg_file,"EOF? What does that mean?"); - if(cmd_mode!=CMD_EXTRACT && cmd_mode!=CMD_LIST && cmd_mode!=CMD_DIFF) - msg("Warning: Archive is INCOMPLETE!"); - exit(EX_BADARCH); - } - if(inbuf[0]=='\n' || inbuf[0]=='y' || inbuf[0]=='Y') - break; - - switch(inbuf[0]) { - case '?': - { - fprintf(msg_file,"\ + if (looped) + { + /* We have to prompt from now on. */ + if (f_run_script_at_end) + system(info_script); + else for(;;) { + fprintf(msg_file,"\007Prepare volume #%d for %s and hit return: ",global_volno, ar_files[cur_ar_file]); + fflush(msg_file); + if(fgets(inbuf,sizeof(inbuf),read_file)==0) { + fprintf(msg_file,"EOF? What does that mean?"); + if(cmd_mode!=CMD_EXTRACT && cmd_mode!=CMD_LIST && cmd_mode!=CMD_DIFF) + msg("Warning: Archive is INCOMPLETE!"); + exit(EX_BADARCH); + } + if(inbuf[0]=='\n' || inbuf[0]=='y' || inbuf[0]=='Y') + break; + + switch(inbuf[0]) { + case '?': + { + fprintf(msg_file,"\ n [name] Give a new filename for the next (and subsequent) volume(s)\n\ q Abort tar\n\ ! Spawn a subshell\n\ ? Print this list\n"); - } - break; - - case 'q': /* Quit */ - fprintf(msg_file,"No new volume; exiting.\n"); - if(cmd_mode!=CMD_EXTRACT && cmd_mode!=CMD_LIST && cmd_mode!=CMD_DIFF) - msg("Warning: Archive is INCOMPLETE!"); - exit(EX_BADARCH); - - case 'n': /* Get new file name */ - { - char *q,*r; - static char *old_name; - - for(q= &inbuf[1];*q==' ' || *q=='\t';q++) - ; - for(r=q;*r;r++) - if(*r=='\n') - *r='\0'; - if(old_name) - free(old_name); - old_name=p=(char *)malloc((unsigned)(strlen(q)+2)); - if(p==0) { - msg("Can't allocate memory for name"); - exit(EX_SYSTEM); - } - (void) strcpy(p,q); - ar_file=p; - } - break; - - case '!': -#ifdef __MSDOS__ - spawnl(P_WAIT,getenv("COMSPEC"),"-",0); -#else - /* JF this needs work! */ - switch(fork()) { - case -1: - msg_perror("can't fork!"); - break; - case 0: - p=getenv("SHELL"); - if(p==0) p="/bin/sh"; - execlp(p,"-sh","-i",0); - msg_perror("can't exec a shell %s",p); - _exit(55); - default: - wait(0); - break; - } -#endif - break; - } + } + break; + + case 'q': /* Quit */ + fprintf(msg_file,"No new volume; exiting.\n"); + if(cmd_mode!=CMD_EXTRACT && cmd_mode!=CMD_LIST && cmd_mode!=CMD_DIFF) + msg("Warning: Archive is INCOMPLETE!"); + exit(EX_BADARCH); + + case 'n': /* Get new file name */ + { + char *q,*r; + static char *old_name; + + for(q= &inbuf[1];*q==' ' || *q=='\t';q++) + ; + for(r=q;*r;r++) + if(*r=='\n') + *r='\0'; + old_name=p=(char *)malloc((unsigned)(strlen(q)+2)); + if(p==0) { + msg("Can't allocate memory for name"); + exit(EX_SYSTEM); + } + (void) strcpy(p,q); + ar_files[cur_ar_file]=p; + } + break; + + case '!': + #ifdef __MSDOS__ + spawnl(P_WAIT,getenv("COMSPEC"),"-",0); + #else + /* JF this needs work! */ + switch(fork()) { + case -1: + msg_perror("can't fork!"); + break; + case 0: + p=getenv("SHELL"); + if(p==0) p="/bin/sh"; + execlp(p,"-sh","-i",0); + msg_perror("can't exec a shell %s",p); + _exit(55); + default: + wait(0); + break; + } + #endif + break; + } + } } + if(type==2 || f_verify) - archive=rmtopen(ar_file,O_RDWR|O_CREAT,0666); + archive=rmtopen(ar_files[cur_ar_file],O_RDWR|O_CREAT,0666); else if(type==1) - archive=rmtopen(ar_file,O_RDONLY,0666); + archive=rmtopen(ar_files[cur_ar_file],O_RDONLY,0666); else if(type==0) - archive=rmtcreat(ar_file,0666); + archive=rmtcreat(ar_files[cur_ar_file],0666); else archive= -1; if(archive<0) { - msg_perror("can't open %s",ar_file); + msg_perror("can't open %s",ar_files[cur_ar_file]); goto tryagain; } #ifdef __MSDOS__