summaryrefslogtreecommitdiff
path: root/src/list.c
diff options
context:
space:
mode:
authorFrançois Pinard <pinard@iro.umontreal.ca>1994-11-16 02:55:45 +0000
committerFrançois Pinard <pinard@iro.umontreal.ca>1994-11-16 02:55:45 +0000
commita6961b8e22d52438c1f132c89588d089e3fad5ff (patch)
treeeb137e472027cb60b9a1563c4d68e470dd3d93b6 /src/list.c
parent5aac7fa0e7b3ff355d23f8f27f6eee25452fd56a (diff)
downloadtar-a6961b8e22d52438c1f132c89588d089e3fad5ff.tar.gz
Initial revision
Diffstat (limited to 'src/list.c')
-rw-r--r--src/list.c147
1 files changed, 41 insertions, 106 deletions
diff --git a/src/list.c b/src/list.c
index 9bd7c606..251a768a 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_mtime<new_time)
- || (f_exclude && check_exclude(current_file_name))) {
+ || (f_exclude && check_exclude(head->header.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;