| 107 |
void |
void |
| 108 |
xheader_decode (struct tar_stat_info *st) |
xheader_decode (struct tar_stat_info *st) |
| 109 |
{ |
{ |
| 110 |
char *p = extended_header.buffer; |
char *p = extended_header.buffer + BLOCKSIZE; |
| 111 |
char *endp = &extended_header.buffer[extended_header.size-1]; |
char *endp = &extended_header.buffer[extended_header.size-1]; |
| 112 |
|
|
| 113 |
while (p < endp) |
while (p < endp) |
| 136 |
void |
void |
| 137 |
xheader_read (union block *p, size_t size) |
xheader_read (union block *p, size_t size) |
| 138 |
{ |
{ |
| 139 |
size_t i, j; |
size_t j = 0; |
| 140 |
size_t nblocks; |
size_t nblocks; |
| 141 |
|
|
| 142 |
free (extended_header.buffer); |
free (extended_header.buffer); |
| 143 |
|
size += BLOCKSIZE; |
| 144 |
extended_header.size = size; |
extended_header.size = size; |
| 145 |
nblocks = (size + BLOCKSIZE - 1) / BLOCKSIZE; |
nblocks = (size + BLOCKSIZE - 1) / BLOCKSIZE; |
| 146 |
extended_header.buffer = xmalloc (size + 1); |
extended_header.buffer = xmalloc (size + 1); |
| 147 |
|
|
| 148 |
set_next_block_after (p); |
do |
|
for (i = j = 0; i < nblocks; i++) |
|
| 149 |
{ |
{ |
| 150 |
size_t len; |
size_t len = size; |
| 151 |
|
|
|
p = find_next_block (); |
|
|
len = size; |
|
| 152 |
if (len > BLOCKSIZE) |
if (len > BLOCKSIZE) |
| 153 |
len = BLOCKSIZE; |
len = BLOCKSIZE; |
| 154 |
|
|
| 155 |
memcpy (&extended_header.buffer[j], p->buffer, len); |
memcpy (&extended_header.buffer[j], p->buffer, len); |
| 156 |
set_next_block_after (p); |
set_next_block_after (p); |
| 157 |
|
|
| 158 |
|
p = find_next_block (); |
| 159 |
|
|
| 160 |
j += len; |
j += len; |
| 161 |
size -= len; |
size -= len; |
| 162 |
} |
} |
| 163 |
|
while (size > 0); |
| 164 |
} |
} |
| 165 |
|
|
| 166 |
static size_t |
static size_t |