From: François Pinard Date: Wed, 16 Nov 1994 02:55:45 +0000 (+0000) Subject: Initial revision X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=a6961b8e22d52438c1f132c89588d089e3fad5ff;p=chaz%2Ftar Initial revision --- diff --git a/src/list.c b/src/list.c index 9bd7c60..251a768 100644 --- a/src/list.c +++ b/src/list.c @@ -97,10 +97,11 @@ read_and(do_something) case 1: /* Valid header */ /* We should decode next field (mode) first... */ /* Ensure incoming names are null terminated. */ + head->header.name[NAMSIZ-1] = '\0'; - if ( !name_match(current_file_name) + if ( !name_match(head->header.name) || (f_new_files && hstat.st_mtimeheader.name))) { int isextended = 0; @@ -112,7 +113,7 @@ read_and(do_something) } if (f_show_omitted_dirs && head->header.linkflag == LF_DIR) - msg ("Omitting %s\n", current_file_name); + msg ("Omitting %s\n", head->header.name); /* Skip past it in the archive */ if (head->header.isextended) isextended = 1; @@ -171,7 +172,6 @@ read_and(do_something) break; }; - restore_saved_dir_info (); close_archive(); names_notfound(); /* Print names not found */ } @@ -204,7 +204,7 @@ list_archive() userec(head); if(f_multivol) { - save_name = current_file_name; + save_name = head->header.name; save_totsize=hstat.st_size; } for(size = hstat.st_size;size>0;size-=written) { @@ -222,7 +222,7 @@ list_archive() check=fwrite(data,sizeof(char), written, msg_file); userec((union record *)(data+written - 1)); if(check!=written) { - msg_perror("only wrote %ld of %ld bytes to file %s",check, written,current_file_name); + msg_perror("only wrote %ld of %ld bytes to file %s",check, written,head->header.name); skip_file((long)(size)-written); break; } @@ -264,7 +264,7 @@ list_archive() } if(f_multivol) - save_name=current_file_name; + save_name=head->header.name; /* Skip to the next header on the archive */ skip_file((long) hstat.st_size); @@ -293,13 +293,7 @@ read_header() register char *p; register union record *header; long from_oct(); - char **longp; - char *bp, *data; - int size, written; - static char *next_long_name, *next_long_link; - recurse: - header = findrec(); head = header; /* This is our current header */ if (NULL == header) @@ -322,6 +316,17 @@ read_header() sum -= 0xFF & header->header.chksum[i]; sum += ' '* sizeof header->header.chksum; + if (sum == recsum) { + /* + * Good record. Decode file size and return. + */ + if (header->header.linkflag == LF_LINK) + hstat.st_size = 0; /* Links 0 size on tape */ + else + hstat.st_size = from_oct(1+12, header->header.size); + return 1; + } + if (sum == 8*' ') { /* * This is a zeroed record...whole record is 0's except @@ -330,60 +335,7 @@ read_header() return 2; } - if (sum != recsum) - return 0; - - /* - * Good record. Decode file size and return. - */ - if (header->header.linkflag == LF_LINK) - hstat.st_size = 0; /* Links 0 size on tape */ - else - hstat.st_size = from_oct(1+12, header->header.size); - - head->header.arch_name[NAMSIZ-1] = '\0'; - if (header->header.linkflag == LF_LONGNAME - || header->header.linkflag == LF_LONGLINK) - { - longp = ((header->header.linkflag == LF_LONGNAME) - ? &next_long_name - : &next_long_link); - - if (*longp) - free (*longp); - bp = *longp = (char *) ck_malloc (hstat.st_size); - - for (size = hstat.st_size; - size > 0; - size -= written) - { - data = findrec ()->charptr; - if (data == NULL) - { - msg ("Unexpected EOF on archive file"); - break; - } - written = endofrecs () ->charptr - data; - if (written > size) - written = size; - - bcopy (data, bp, written); - bp += written; - userec ((union record *) (data + written - 1)); - } - goto recurse; - } - else - { - current_file_name = (next_long_name - ? next_long_name - : header->header.arch_name); - current_link_name = (next_long_link - ? next_long_link - : header->header.arch_linkname); - next_long_link = next_long_name = 0; - return 1; - } + return 0; } @@ -410,10 +362,8 @@ decode_header(header, st, stdp, wantug) int *stdp; int wantug; { + long from_oct(); - char **longp; - char *bp, *data; - int size, written; st->st_mode = from_oct(8, header->header.mode); st->st_mtime = from_oct(1+12, header->header.mtime); @@ -430,14 +380,8 @@ decode_header(header, st, stdp, wantug) st->st_uid = from_oct(8, header->header.uid); st->st_gid = from_oct(8, header->header.gid); #else - st->st_uid = - (*header->header.uname - ? finduid (header->header.uname) - : from_oct (8, header->header.uid)); - st->st_gid = - (*header->header.gname - ? findgid (header->header.gname) - : from_oct (8, header->header.gid)); + st->st_uid = finduid(header->header.uname); + st->st_gid = findgid(header->header.gname); #endif } #if defined(S_IFBLK) || defined(S_IFCHR) @@ -520,23 +464,20 @@ print_header() int pad; char *name; extern long baserec; - static char *longname; - static char *longlink; - int bumplongs; if(f_sayblock) fprintf(msg_file,"rec %10d: ",baserec + (ar_record - ar_block)); /* annofile(msg_file, (char *)NULL); */ - + if (f_verbose <= 1) { /* Just the fax, mam. */ char *name; - name=quote_copy_string(current_file_name); + name=quote_copy_string(head->header.name); if(name==0) - name=current_file_name; + name=head->header.name; fprintf(msg_file, "%s\n", name); - if(name!=current_file_name) + if(name!=head->header.name) free(name); } else { /* File type and modes */ @@ -554,17 +495,12 @@ print_header() modes[0]='N'; break; - case LF_LONGNAME: - case LF_LONGLINK: - msg ("Visible longname error\n"); - break; - case LF_SPARSE: case LF_NORMAL: case LF_OLDNORMAL: case LF_LINK: modes[0] = '-'; - if ('/' == current_file_name[strlen(current_file_name)-1]) + if ('/' == head->header.name[strlen(head->header.name)-1]) modes[0] = 'd'; break; case LF_DUMPDIR:modes[0] = 'd'; break; @@ -589,15 +525,13 @@ print_header() user = head->header.uname; } else { user = uform; - (void)sprintf(uform, "%d", - from_oct (8, head->header.uid)); + (void)sprintf(uform, "%d", (int)hstat.st_uid); } if (*head->header.gname && head_standard) { group = head->header.gname; } else { group = gform; - (void)sprintf(gform, "%d", - from_oct (8, head->header.gid)); + (void)sprintf(gform, "%d", (int)hstat.st_gid); } /* Format the file size or major/minor device numbers */ @@ -622,10 +556,10 @@ print_header() pad = strlen(user) + strlen(group) + strlen(size) + 1; if (pad > ugswidth) ugswidth = pad; - name = quote_copy_string(current_file_name); + name = quote_copy_string(head->header.name); if(!name) - name=current_file_name; - fprintf(msg_file, "%s %s/%s %*s%s %s %s %s", + name=head->header.name; + fprintf(msg_file, "%s %s/%s %*s%s %s %s %.*s", modes, user, group, @@ -633,26 +567,27 @@ print_header() "", size, timestamp+4, timestamp+20, + sizeof(head->header.name), name); - if(name!=current_file_name) + if(name!=head->header.name) free(name); switch (head->header.linkflag) { case LF_SYMLINK: - name=quote_copy_string(current_link_name); + name=quote_copy_string(head->header.linkname); if(!name) - name=current_link_name; + name=head->header.linkname; fprintf(msg_file, " -> %s\n", name); - if(name!=current_link_name) + if(name!=head->header.linkname) free(name); break; case LF_LINK: - name=quote_copy_string(current_link_name); + name=quote_copy_string(head->header.linkname); if(!name) - name=current_link_name; - fprintf(msg_file, " link to %s\n", current_link_name); - if(name!=current_link_name) + name=head->header.linkname; + fprintf(msg_file, " link to %s\n", head->header.linkname); + if(name!=head->header.linkname) free(name); break;