320 |
|
|
321 |
/* Good block. Decode file size and return. */ |
/* Good block. Decode file size and return. */ |
322 |
|
|
|
if (header->header.typeflag == XHDTYPE |
|
|
|| header->header.typeflag == XGLTYPE) |
|
|
{ |
|
|
xheader_read (header, OFF_FROM_HEADER (header->header.size)); |
|
|
continue; |
|
|
} |
|
|
|
|
323 |
if (header->header.typeflag == LNKTYPE) |
if (header->header.typeflag == LNKTYPE) |
324 |
current_stat_info.stat.st_size = 0; /* links 0 size on tape */ |
current_stat_info.stat.st_size = 0; /* links 0 size on tape */ |
325 |
else |
else |
326 |
current_stat_info.stat.st_size = OFF_FROM_HEADER (header->header.size); |
current_stat_info.stat.st_size = OFF_FROM_HEADER (header->header.size); |
327 |
|
|
328 |
if (header->header.typeflag == GNUTYPE_LONGNAME |
if (header->header.typeflag == GNUTYPE_LONGNAME |
329 |
|| header->header.typeflag == GNUTYPE_LONGLINK) |
|| header->header.typeflag == GNUTYPE_LONGLINK |
330 |
|
|| header->header.typeflag == XHDTYPE |
331 |
|
|| header->header.typeflag == XGLTYPE) |
332 |
{ |
{ |
333 |
if (raw_extended_headers) |
if (raw_extended_headers) |
334 |
return HEADER_SUCCESS_EXTENDED; |
return HEADER_SUCCESS_EXTENDED; |
335 |
else |
else if (header->header.typeflag == GNUTYPE_LONGNAME |
336 |
|
|| header->header.typeflag == GNUTYPE_LONGLINK) |
337 |
{ |
{ |
338 |
size_t name_size = current_stat_info.stat.st_size; |
size_t name_size = current_stat_info.stat.st_size; |
339 |
size = name_size - name_size % BLOCKSIZE + 2 * BLOCKSIZE; |
size = name_size - name_size % BLOCKSIZE + 2 * BLOCKSIZE; |
340 |
if (name_size != current_stat_info.stat.st_size || size < name_size) |
if (name_size != current_stat_info.stat.st_size |
341 |
|
|| size < name_size) |
342 |
xalloc_die (); |
xalloc_die (); |
|
} |
|
343 |
|
|
344 |
header_copy = xmalloc (size + 1); |
header_copy = xmalloc (size + 1); |
345 |
|
|
346 |
if (header->header.typeflag == GNUTYPE_LONGNAME) |
if (header->header.typeflag == GNUTYPE_LONGNAME) |
|
{ |
|
|
if (next_long_name) |
|
|
free (next_long_name); |
|
|
next_long_name = header_copy; |
|
|
next_long_name_blocks = size / BLOCKSIZE; |
|
|
} |
|
|
else |
|
|
{ |
|
|
if (next_long_link) |
|
|
free (next_long_link); |
|
|
next_long_link = header_copy; |
|
|
next_long_link_blocks = size / BLOCKSIZE; |
|
|
} |
|
|
|
|
|
set_next_block_after (header); |
|
|
*header_copy = *header; |
|
|
bp = header_copy->buffer + BLOCKSIZE; |
|
|
|
|
|
for (size -= BLOCKSIZE; size > 0; size -= written) |
|
|
{ |
|
|
data_block = find_next_block (); |
|
|
if (! data_block) |
|
347 |
{ |
{ |
348 |
ERROR ((0, 0, _("Unexpected EOF in archive"))); |
if (next_long_name) |
349 |
break; |
free (next_long_name); |
350 |
|
next_long_name = header_copy; |
351 |
|
next_long_name_blocks = size / BLOCKSIZE; |
352 |
} |
} |
353 |
written = available_space_after (data_block); |
else |
354 |
if (written > size) |
{ |
355 |
written = size; |
if (next_long_link) |
356 |
|
free (next_long_link); |
357 |
memcpy (bp, data_block->buffer, written); |
next_long_link = header_copy; |
358 |
bp += written; |
next_long_link_blocks = size / BLOCKSIZE; |
359 |
set_next_block_after ((union block *) |
} |
360 |
(data_block->buffer + written - 1)); |
|
361 |
} |
set_next_block_after (header); |
362 |
|
*header_copy = *header; |
363 |
|
bp = header_copy->buffer + BLOCKSIZE; |
364 |
|
|
365 |
*bp = '\0'; |
for (size -= BLOCKSIZE; size > 0; size -= written) |
366 |
|
{ |
367 |
|
data_block = find_next_block (); |
368 |
|
if (! data_block) |
369 |
|
{ |
370 |
|
ERROR ((0, 0, _("Unexpected EOF in archive"))); |
371 |
|
break; |
372 |
|
} |
373 |
|
written = available_space_after (data_block); |
374 |
|
if (written > size) |
375 |
|
written = size; |
376 |
|
|
377 |
|
memcpy (bp, data_block->buffer, written); |
378 |
|
bp += written; |
379 |
|
set_next_block_after ((union block *) |
380 |
|
(data_block->buffer + written - 1)); |
381 |
|
} |
382 |
|
|
383 |
|
*bp = '\0'; |
384 |
|
} |
385 |
|
else if (header->header.typeflag == XHDTYPE |
386 |
|
|| header->header.typeflag == XGLTYPE) |
387 |
|
xheader_read (header, OFF_FROM_HEADER (header->header.size)); |
388 |
|
|
389 |
/* Loop! */ |
/* Loop! */ |
390 |
|
|
391 |
} |
} |