- if (sum != recsum && signed_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);
-
- header->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);
-
- userec (header);
- 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
- {
- name = (next_long_name
- ? next_long_name
- : head->header.arch_name);
- if (current_file_name)
- free (current_file_name);
- current_file_name = malloc (strlen (name) + 1);
- strcpy (current_file_name, name);
-
- name = (next_long_link
- ? next_long_link
- : head->header.arch_linkname);
- if (current_link_name)
- free (current_link_name);
- current_link_name = malloc (strlen (name) + 1);
- strcpy (current_link_name, name);
-
- next_long_link = next_long_name = 0;
- return 1;
- }
+ if (unsigned_sum == sizeof header->header.chksum * ' ')
+ {
+ /* This is a zeroed block...whole block is 0's except for the
+ blanks we faked for the checksum field. */
+
+ return HEADER_ZERO_BLOCK;
+ }
+
+ if (unsigned_sum != recorded_sum && signed_sum != recorded_sum)
+ return HEADER_FAILURE;
+
+ /* Good block. Decode file size and return. */
+
+ if (header->header.typeflag == LNKTYPE)
+ current_stat.st_size = 0; /* links 0 size on tape */
+ else
+ current_stat.st_size = from_oct (1 + 12, header->header.size);
+
+ header->header.name[NAME_FIELD_SIZE - 1] = '\0';
+ if (header->header.typeflag == GNUTYPE_LONGNAME
+ || header->header.typeflag == GNUTYPE_LONGLINK)
+ {
+ longp = ((header->header.typeflag == GNUTYPE_LONGNAME)
+ ? &next_long_name
+ : &next_long_link);
+
+ set_next_block_after (header);
+ if (*longp)
+ free (*longp);
+ bp = *longp = (char *) xmalloc ((size_t) current_stat.st_size);
+
+ for (size = current_stat.st_size; size > 0; size -= written)
+ {
+ data_block = find_next_block ();
+ if (data_block == NULL)
+ {
+ ERROR ((0, 0, _("Unexpected EOF on archive file")));
+ break;
+ }
+ written = available_space_after (data_block);
+ if (written > size)
+ written = size;
+
+ memcpy (bp, data_block->buffer, (size_t) written);
+ bp += written;
+ set_next_block_after ((union block *)
+ (data_block->buffer + written - 1));
+ }
+
+ /* Loop! */
+
+ }
+ else
+ {
+ assign_string (¤t_file_name,
+ (next_long_name ? next_long_name
+ : current_header->header.name));
+ assign_string (¤t_link_name,
+ (next_long_link ? next_long_link
+ : current_header->header.linkname));
+ next_long_link = next_long_name = 0;
+ return HEADER_SUCCESS;
+ }
+ }