tar2qfile: use lseek() to skip unwanted data if possible

When reading from file it is much faster.
This commit is contained in:
Marek Marczykowski-Górecki 2013-11-25 02:28:35 +01:00
parent 3c92cdba22
commit 6c3c3e717d

View File

@ -168,6 +168,7 @@ static unsigned long tar_chksm (char *, int);
char *gnu_hack_string; /* GNU ././@LongLink hackery */
char untrusted_namebuf[MAX_PATH_LENGTH];
int use_seek = 1;
extern int ignore_quota_error;
struct filters {
@ -914,12 +915,27 @@ void tar_file_processor(int fd, struct filters *filters)
if (to_skip%BLKMULT > 0) {
to_skip += BLKMULT-(to_skip%BLKMULT);
}
while (to_skip > 0) {
ret = read_all(fd, &buf, MIN(to_skip,BLKMULT));
if (ret <= 0) {
exit(1);
if (use_seek) {
ret = lseek(fd, to_skip, SEEK_CUR);
if (ret < 0) {
if (errno == ESPIPE) {
// fallback to read()
use_seek = 0;
} else {
perror("lseek");
exit(1);
}
}
}
// not using "else" because above can fallback to read() method
if (!use_seek) {
while (to_skip > 0) {
ret = read_all(fd, &buf, MIN(to_skip,BLKMULT));
if (ret <= 0) {
exit(1);
}
to_skip -= MIN(to_skip,BLKMULT);
}
to_skip -= MIN(to_skip,BLKMULT);
}
current = NEED_SYNC_TRAIL;