| 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 |
} |
} |