Mods to tar (--fast-read) to cause it to stop looking for exact-matching
file specifications when they've been extracted (enabling you to get a file fast if it occurs somewhere close to the front). Submitted by: Marc van Kempen <wmbfmk@urc.tue.nl>
This commit is contained in:
parent
edd2e07c91
commit
2fdc8f6375
@ -95,6 +95,11 @@ read_and (do_something)
|
||||
{
|
||||
prev_status = status;
|
||||
status = read_header ();
|
||||
/* check if the namelist got emptied during the course of reading */
|
||||
/* the tape, if so stop by setting status to EOF */
|
||||
if ((namelist == NULL) && nlpsfreed) {
|
||||
status = EOF;
|
||||
}
|
||||
switch (status)
|
||||
{
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
.\"
|
||||
.\" Written by John F. Woods <jfw@jfwhome.funhouse.com>
|
||||
.\"
|
||||
.\" $Id: tar.1,v 1.1 1995/01/26 00:14:11 jkh Exp $
|
||||
.\" $Id: tar.1,v 1.2 1995/01/31 04:36:48 jkh Exp $
|
||||
.\"
|
||||
.Dd 6 August 1994
|
||||
.Os FreeBSD
|
||||
@ -158,6 +158,9 @@ on a remote machine.
|
||||
.It Fl -new-volume-script Ar file
|
||||
Run a script at the end of each archive volume (implies
|
||||
.Fl M ) .
|
||||
.It Fl -fast-read
|
||||
Stop after all non-wildcard extraction targets have been found
|
||||
in the archive.
|
||||
.It Fl G
|
||||
.It Fl -incremental
|
||||
Create/list/extract old GNU-format incremental backup.
|
||||
|
@ -84,6 +84,7 @@ void name_add ();
|
||||
void name_init ();
|
||||
void options ();
|
||||
char *un_quote_string ();
|
||||
int nlpsfreed = 0;
|
||||
|
||||
#ifndef S_ISLNK
|
||||
#define lstat stat
|
||||
@ -182,6 +183,7 @@ struct option long_options[] =
|
||||
{"atime-preserve", 0, &f_atime_preserve, 1},
|
||||
|
||||
{"unlink", 0, &f_unlink, 1},
|
||||
{"fast-read", 0, &f_fast_read, 1},
|
||||
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
@ -199,7 +201,7 @@ main (argc, argv)
|
||||
tar = argv[0]; /* JF: was "tar" Set program name */
|
||||
filename_terminator = '\n';
|
||||
errors = 0;
|
||||
|
||||
|
||||
options (argc, argv);
|
||||
|
||||
if (!n_argv)
|
||||
@ -760,6 +762,7 @@ Other options:\n\
|
||||
--block-compress block the output of compression program for tapes\n\
|
||||
-[0-7][lmh] specify drive and density\n\
|
||||
--unlink unlink files before creating them\n\
|
||||
--fast-read stop after desired names in archive have been found\n\
|
||||
", stdout);
|
||||
}
|
||||
|
||||
@ -1123,6 +1126,7 @@ name_match (p)
|
||||
register char *p;
|
||||
{
|
||||
register struct name *nlp;
|
||||
struct name *tmpnlp;
|
||||
register int len;
|
||||
|
||||
again:
|
||||
@ -1174,7 +1178,36 @@ name_match (p)
|
||||
}
|
||||
if (nlp->change_dir && chdir (nlp->change_dir))
|
||||
msg_perror ("Can't change to directory %s", nlp->change_dir);
|
||||
if (f_fast_read) {
|
||||
if (strcmp(p, nlp->name) == 0) {
|
||||
/* remove the current entry, since we found a match */
|
||||
/* use brute force, this code is a mess anyway */
|
||||
if (namelist->next == NULL) {
|
||||
/* the list contains one element */
|
||||
free(namelist);
|
||||
namelist = NULL;
|
||||
} else {
|
||||
if (nlp == namelist) {
|
||||
/* the first element is the one */
|
||||
tmpnlp = namelist->next;
|
||||
free(namelist);
|
||||
namelist = tmpnlp;
|
||||
} else {
|
||||
tmpnlp = namelist;
|
||||
while (tmpnlp->next != nlp) {
|
||||
tmpnlp = tmpnlp->next;
|
||||
}
|
||||
tmpnlp->next = nlp->next;
|
||||
free(nlp);
|
||||
}
|
||||
}
|
||||
/* set a boolean to decide wether we started with a */
|
||||
/* non-empty namelist, that was emptied */
|
||||
nlpsfreed = 1;
|
||||
}
|
||||
}
|
||||
return 1; /* We got a match */
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -232,6 +232,7 @@ TAR_EXTERN int f_force_local; /* --force-local */
|
||||
TAR_EXTERN int f_atime_preserve;/* --atime-preserve */
|
||||
TAR_EXTERN int f_compress_block; /* --compress-block */
|
||||
TAR_EXTERN int f_unlink; /* --unlink */
|
||||
TAR_EXTERN int f_fast_read; /* --fast-read */
|
||||
|
||||
/*
|
||||
* We default to Unix Standard format rather than 4.2BSD tar format.
|
||||
@ -274,6 +275,10 @@ TAR_EXTERN char *gnu_dumpfile;
|
||||
*/
|
||||
TAR_EXTERN char read_error_flag;
|
||||
|
||||
/*
|
||||
* global boolean, see name_match in tar.c
|
||||
*/
|
||||
extern int nlpsfreed;
|
||||
|
||||
/*
|
||||
* Declarations of functions available to the world.
|
||||
|
Loading…
Reference in New Issue
Block a user