| 330 |
{ |
{ |
| 331 |
to_chars (0, v, sizeof v, 0, p, s, "uintmax_t"); |
to_chars (0, v, sizeof v, 0, p, s, "uintmax_t"); |
| 332 |
} |
} |
| 333 |
|
|
| 334 |
|
void |
| 335 |
|
string_to_chars (char *str, char *p, size_t s) |
| 336 |
|
{ |
| 337 |
|
strncpy (p, str, s); |
| 338 |
|
p[s-1] = 0; |
| 339 |
|
} |
| 340 |
|
|
| 341 |
|
|
| 342 |
/* Writing routines. */ |
/* Writing routines. */ |
| 343 |
|
|
| 401 |
memset (header->buffer + size, 0, bufsize - size); |
memset (header->buffer + size, 0, bufsize - size); |
| 402 |
set_next_block_after (header + (size - 1) / BLOCKSIZE); |
set_next_block_after (header + (size - 1) / BLOCKSIZE); |
| 403 |
} |
} |
| 404 |
|
|
| 405 |
|
/* NOTE: Cross recursion between start_header and write_extended */ |
| 406 |
|
|
| 407 |
|
static union block * |
| 408 |
|
write_extended (union block *old_header, char type) |
| 409 |
|
{ |
| 410 |
|
union block *header, hp; |
| 411 |
|
struct tar_stat_info foo; |
| 412 |
|
size_t size; |
| 413 |
|
size_t bufsize; |
| 414 |
|
char *p; |
| 415 |
|
|
| 416 |
|
if (extended_header.buffer || extended_header.stk == NULL) |
| 417 |
|
return old_header; /* Prevent recursion */ |
| 418 |
|
|
| 419 |
|
xheader_finish (&extended_header); |
| 420 |
|
size = extended_header.size; |
| 421 |
|
memset (&foo, 0, sizeof foo); |
| 422 |
|
foo.stat.st_mode = S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH; |
| 423 |
|
time (&foo.stat.st_ctime); |
| 424 |
|
foo.stat.st_atime = foo.stat.st_ctime; |
| 425 |
|
foo.stat.st_mtime = foo.stat.st_ctime; |
| 426 |
|
foo.stat.st_size = size; |
| 427 |
|
|
| 428 |
|
memcpy (hp.buffer, old_header, sizeof (hp)); |
| 429 |
|
|
| 430 |
|
header = start_header ("././@PaxHeader", &foo); |
| 431 |
|
header->header.typeflag = type; |
| 432 |
|
|
| 433 |
|
finish_header (header, -1); |
| 434 |
|
|
| 435 |
|
p = extended_header.buffer; |
| 436 |
|
|
| 437 |
|
do |
| 438 |
|
{ |
| 439 |
|
size_t len; |
| 440 |
|
|
| 441 |
|
header = find_next_block (); |
| 442 |
|
len = BLOCKSIZE; |
| 443 |
|
if (len > size) |
| 444 |
|
len = size; |
| 445 |
|
memcpy (header->buffer, p, len); |
| 446 |
|
if (len < BLOCKSIZE) |
| 447 |
|
memset (header->buffer + len, 0, BLOCKSIZE - len); |
| 448 |
|
p += len; |
| 449 |
|
size -= len; |
| 450 |
|
set_next_block_after (header); |
| 451 |
|
} |
| 452 |
|
while (size > 0); |
| 453 |
|
|
| 454 |
|
xheader_destroy (&extended_header); |
| 455 |
|
header = find_next_block (); |
| 456 |
|
memcpy (header, &hp.buffer, sizeof (hp.buffer)); |
| 457 |
|
return header; |
| 458 |
|
} |
| 459 |
|
|
| 460 |
|
|
| 461 |
/* Header handling. */ |
/* Header handling. */ |
| 462 |
|
|
| 472 |
|
|
| 473 |
if (sizeof header->header.name <= strlen (name)) |
if (sizeof header->header.name <= strlen (name)) |
| 474 |
write_long (name, GNUTYPE_LONGNAME); |
write_long (name, GNUTYPE_LONGNAME); |
| 475 |
|
|
| 476 |
header = find_next_block (); |
header = find_next_block (); |
| 477 |
memset (header->buffer, 0, sizeof (union block)); |
memset (header->buffer, 0, sizeof (union block)); |
| 478 |
|
|
| 480 |
|
|
| 481 |
strncpy (header->header.name, name, NAME_FIELD_SIZE); |
strncpy (header->header.name, name, NAME_FIELD_SIZE); |
| 482 |
header->header.name[NAME_FIELD_SIZE - 1] = '\0'; |
header->header.name[NAME_FIELD_SIZE - 1] = '\0'; |
| 483 |
|
|
| 484 |
/* Override some stat fields, if requested to do so. */ |
/* Override some stat fields, if requested to do so. */ |
| 485 |
|
|
| 486 |
if (owner_option != (uid_t) -1) |
if (owner_option != (uid_t) -1) |
| 519 |
else |
else |
| 520 |
MODE_TO_CHARS (st->stat.st_mode, header->header.mode); |
MODE_TO_CHARS (st->stat.st_mode, header->header.mode); |
| 521 |
|
|
| 522 |
UID_TO_CHARS (st->stat.st_uid, header->header.uid); |
if (st->stat.st_uid > MAXOCTAL7 && archive_format == POSIX_FORMAT) |
| 523 |
GID_TO_CHARS (st->stat.st_gid, header->header.gid); |
xheader_store ("uid", st); |
| 524 |
OFF_TO_CHARS (st->stat.st_size, header->header.size); |
else |
| 525 |
|
UID_TO_CHARS (st->stat.st_uid, header->header.uid); |
| 526 |
|
|
| 527 |
|
if (st->stat.st_gid > MAXOCTAL7 && archive_format == POSIX_FORMAT) |
| 528 |
|
xheader_store ("gid", st); |
| 529 |
|
else |
| 530 |
|
GID_TO_CHARS (st->stat.st_gid, header->header.gid); |
| 531 |
|
|
| 532 |
|
if (st->stat.st_size > MAXOCTAL11 && archive_format == POSIX_FORMAT) |
| 533 |
|
xheader_store ("size", st); |
| 534 |
|
else |
| 535 |
|
OFF_TO_CHARS (st->stat.st_size, header->header.size); |
| 536 |
|
|
| 537 |
TIME_TO_CHARS (st->stat.st_mtime, header->header.mtime); |
TIME_TO_CHARS (st->stat.st_mtime, header->header.mtime); |
|
MAJOR_TO_CHARS (0, header->header.devmajor); |
|
|
MINOR_TO_CHARS (0, header->header.devminor); |
|
| 538 |
|
|
| 539 |
if (incremental_option) |
/* FIXME */ |
| 540 |
|
if (S_ISCHR (st->stat.st_mode) |
| 541 |
|
|| S_ISBLK (st->stat.st_mode)) |
| 542 |
|
{ |
| 543 |
|
st->devmajor = major (st->stat.st_rdev); |
| 544 |
|
st->devminor = minor (st->stat.st_rdev); |
| 545 |
|
|
| 546 |
|
if (st->devmajor > MAXOCTAL7 && archive_format == POSIX_FORMAT) |
| 547 |
|
xheader_store ("devmajor", st); |
| 548 |
|
else |
| 549 |
|
MAJOR_TO_CHARS (st->devmajor, header->header.devmajor); |
| 550 |
|
|
| 551 |
|
if (st->devminor > MAXOCTAL7 && archive_format == POSIX_FORMAT) |
| 552 |
|
xheader_store ("devminor", st); |
| 553 |
|
else |
| 554 |
|
MAJOR_TO_CHARS (st->devminor, header->header.devminor); |
| 555 |
|
} |
| 556 |
|
else |
| 557 |
|
{ |
| 558 |
|
MAJOR_TO_CHARS (0, header->header.devmajor); |
| 559 |
|
MINOR_TO_CHARS (0, header->header.devminor); |
| 560 |
|
} |
| 561 |
|
|
| 562 |
|
if (archive_format == POSIX_FORMAT) |
| 563 |
|
{ |
| 564 |
|
xheader_store ("atime", st); |
| 565 |
|
xheader_store ("ctime", st); |
| 566 |
|
} |
| 567 |
|
else if (incremental_option) |
| 568 |
if (archive_format == OLDGNU_FORMAT) |
if (archive_format == OLDGNU_FORMAT) |
| 569 |
{ |
{ |
| 570 |
TIME_TO_CHARS (st->stat.st_atime, header->oldgnu_header.atime); |
TIME_TO_CHARS (st->stat.st_atime, header->oldgnu_header.atime); |
| 599 |
} |
} |
| 600 |
else |
else |
| 601 |
{ |
{ |
| 602 |
uid_to_uname (st->stat.st_uid, header->header.uname); |
uid_to_uname (st->stat.st_uid, &st->uname); |
| 603 |
gid_to_gname (st->stat.st_gid, header->header.gname); |
gid_to_gname (st->stat.st_gid, &st->gname); |
| 604 |
|
|
| 605 |
|
if (archive_format == POSIX_FORMAT |
| 606 |
|
&& strlen (st->uname) > UNAME_FIELD_SIZE) |
| 607 |
|
xheader_store ("uname", st); |
| 608 |
|
else |
| 609 |
|
UNAME_TO_CHARS (st->uname, header->header.uname); |
| 610 |
|
|
| 611 |
|
if (archive_format == POSIX_FORMAT |
| 612 |
|
&& strlen (st->gname) > GNAME_FIELD_SIZE) |
| 613 |
|
xheader_store ("gname", st); |
| 614 |
|
else |
| 615 |
|
GNAME_TO_CHARS (st->gname, header->header.gname); |
| 616 |
} |
} |
| 617 |
|
|
| 618 |
return header; |
return header; |
| 629 |
int sum; |
int sum; |
| 630 |
char *p; |
char *p; |
| 631 |
|
|
| 632 |
|
header = write_extended (header, XHDTYPE); |
| 633 |
|
|
| 634 |
memcpy (header->header.chksum, CHKBLANKS, sizeof header->header.chksum); |
memcpy (header->header.chksum, CHKBLANKS, sizeof header->header.chksum); |
| 635 |
|
|
| 636 |
sum = 0; |
sum = 0; |