From 6d732772201861bc57348f4ad5c0970ac00b5d93 Mon Sep 17 00:00:00 2001 From: Stelian Pop Date: Thu, 19 Jul 2001 09:03:44 +0000 Subject: [PATCH] -e inode,inode and -E file implementation. --- CHANGES | 8 +++- dump/dump.8.in | 20 ++++++--- dump/dump.h | 4 +- dump/main.c | 109 ++++++++++++++++++++++++++++++++++++++++-------- dump/traverse.c | 30 +++---------- 5 files changed, 121 insertions(+), 50 deletions(-) diff --git a/CHANGES b/CHANGES index 7a4457a..c2280dd 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,4 @@ -$Id: CHANGES,v 1.124 2001/07/18 14:57:46 stelian Exp $ +$Id: CHANGES,v 1.125 2001/07/19 09:03:44 stelian Exp $ Changes between versions 0.4b22 and 0.4b23 (released ????????????) ================================================================== @@ -43,6 +43,12 @@ Changes between versions 0.4b22 and 0.4b23 (released ????????????) to the 'Mount next tape' prompt caused several blocks to be lost. +11. Enhanced the -e option of dump to take as a parameter a + comma separated list of inode numbers. + +12. Added the -E option to dump which specify a file containing + inode numbers to exclude from the dump. + Changes between versions 0.4b21 and 0.4b22 (released May 12, 2001) ================================================================== diff --git a/dump/dump.8.in b/dump/dump.8.in index a3763a5..abbda73 100644 --- a/dump/dump.8.in +++ b/dump/dump.8.in @@ -30,7 +30,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $Id: dump.8.in,v 1.29 2001/07/18 13:12:33 stelian Exp $ +.\" $Id: dump.8.in,v 1.30 2001/07/19 09:03:44 stelian Exp $ .\" .Dd __DATE__ .Dt DUMP 8 @@ -44,7 +44,8 @@ .Op Fl B Ar records .Op Fl b Ar blocksize .Op Fl d Ar density -.Op Fl e Ar inode number +.Op Fl e Ar inode numbers +.Op Fl E Ar file .Op Fl f Ar file .Op Fl F Ar script .Op Fl h Ar level @@ -141,12 +142,21 @@ The default blocksize is 10. Change the defaults for use with a cartridge tape drive, with a density of 8000 bpi, and a length of 1700 feet. Specifying a cartridge drive overrides the end-of-media detection. -.It Fl e Ar inode +.It Fl e Ar inodes Exclude -.Ar inode -from the dump (you can use +.Ar inodes +from the dump. The +.Ar inodes +parameter is a comma separated list of inode numbers (you can use .Ar stat to find the inode number for a file or directory). +.It Fl E Ar file +Read list of inodes to be excluded from the dump from the text file +.Ar file . +The file +.Ar file +should be an ordinary file containing inode numbers separated by +newlines. .It Fl h Ar level Honor the user .Dq nodump diff --git a/dump/dump.h b/dump/dump.h index 2f570ec..825a7fc 100644 --- a/dump/dump.h +++ b/dump/dump.h @@ -5,7 +5,7 @@ * Stelian Pop , 1999-2000 * Stelian Pop - AlcĂ´ve , 2000 * - * $Id: dump.h,v 1.26 2001/07/18 13:12:33 stelian Exp $ + * $Id: dump.h,v 1.27 2001/07/19 09:03:44 stelian Exp $ */ /*- @@ -187,6 +187,8 @@ int rmtioctl __P((int cmd, int count)); #endif /* RDUMP */ void interrupt __P((int signo)); /* in case operator bangs on console */ +int exclude_ino __P((dump_ino_t ino)); +void do_exclude_ino __P((dump_ino_t ino)); /* * Exit status codes diff --git a/dump/main.c b/dump/main.c index 0d1f4fd..2ee429a 100644 --- a/dump/main.c +++ b/dump/main.c @@ -41,7 +41,7 @@ #ifndef lint static const char rcsid[] = - "$Id: main.c,v 1.52 2001/07/18 13:12:33 stelian Exp $"; + "$Id: main.c,v 1.53 2001/07/19 09:03:44 stelian Exp $"; #endif /* not lint */ #include @@ -114,9 +114,11 @@ int maxbsize = 64*1024; /* XXX MAXBSIZE from sys/param.h */ static long numarg __P((const char *, long, long)); static void obsolete __P((int *, char **[])); static void usage __P((void)); +static void do_exclude_from_file __P((char *)); +static void do_exclude_ino_str __P((char *)); -dump_ino_t iexclude_list[IEXCLUDE_MAXNUM];/* the inode exclude list */ -int iexclude_num = 0; /* number of elements in the list */ +static dump_ino_t iexclude_list[IEXCLUDE_MAXNUM];/* the inode exclude list */ +static int iexclude_num = 0; /* number of elements in the list */ int main(int argc, char *argv[]) @@ -168,7 +170,7 @@ main(int argc, char *argv[]) #endif /* USE_QFA */ while ((ch = getopt(argc, argv, - "0123456789aB:b:cd:e:f:F:h:L:" + "0123456789aB:b:cd:e:E:f:F:h:L:" #ifdef KERBEROS "k" #endif @@ -224,19 +226,19 @@ main(int argc, char *argv[]) /* 04-Feb-00 ILC */ case 'e': /* exclude an inode */ - if (iexclude_num == IEXCLUDE_MAXNUM) { - msg("Too many -e options\n"); - msg("The ENTIRE dump is aborted.\n"); - exit(X_STARTUP); + { + char *p = optarg, *q; + while ((q = strchr(p, ','))) { + *q = '\0'; + do_exclude_ino_str(p); + p = q + 1; } - iexclude_list[iexclude_num++] = numarg("inode to exclude",0L,0L); - if (iexclude_list[iexclude_num-1] <= ROOTINO) { - msg("Cannot exclude inode %ld\n", (long)iexclude_list[iexclude_num-1]); - msg("The ENTIRE dump is aborted.\n"); - exit(X_STARTUP); + do_exclude_ino_str(p); } - msg("Added %d to exclude list\n", - iexclude_list[iexclude_num-1]); + break; + + case 'E': /* exclude inodes read from file */ + do_exclude_from_file(optarg); break; case 'f': /* output file */ @@ -888,12 +890,11 @@ usage(void) #endif "MnSu" "] [-B records] [-b blocksize] [-d density]\n" - "\t%s [-e inode#] [-f file] [-h level] " + "\t%s [-e inode#,inode#,...] [-E file] [-f file] [-h level] " #ifdef USE_QFA "[-Q file] " #endif - "[-s feet]\n" - "\t%s [-T date] " + "\n\t%s [-s feet] [-T date] " #ifdef HAVE_ZLIB "[-z zlevel] " #endif @@ -1000,6 +1001,7 @@ obsolete(int *argcp, char **argvp[]) case 'b': case 'd': case 'e': + case 'E': case 'f': case 'F': case 'h': @@ -1041,3 +1043,74 @@ obsolete(int *argcp, char **argvp[]) /* Update argument count. */ *argcp = nargv - *argvp - 1; } + +/* + * This tests whether an inode is in the exclude list + */ +int +exclude_ino(dump_ino_t ino) +{ + /* 04-Feb-00 ILC */ + if (iexclude_num) { /* if there are inodes in the exclude list */ + int idx; /* then check this inode against it */ + for (idx = 0; idx < iexclude_num; idx++) + if (ino == iexclude_list[idx]) + return 1; + } + return 0; +} + +/* + * This tests adds an inode to the exclusion list if it isn't already there + */ +void +do_exclude_ino(dump_ino_t ino) +{ + if (!exclude_ino(ino)) { + if (iexclude_num == IEXCLUDE_MAXNUM) { + msg("Too many exclude options\n"); + msg("The ENTIRE dump is aborted.\n"); + exit(X_STARTUP); + } + msg("Added inode %u to exclude list\n", ino); + iexclude_list[iexclude_num++] = ino; + } +} + +static void +do_exclude_ino_str(char * ino) { + char *r; + unsigned long inod; + + inod = strtoul(ino, &r, 10); + if (*r != '\0' || inod <= ROOTINO) { + msg("Invalid inode argument %s\n", ino); + msg("The ENTIRE dump is aborted.\n"); + exit(X_STARTUP); + } + do_exclude_ino(inod); +} + +/* + * This reads a file containing one inode number per line and exclude them all + */ +static void +do_exclude_from_file(char *file) { + FILE *f; + char *p, fname[MAXPATHLEN]; + + + if (!( f = fopen(file, "r")) ) { + msg("Cannot open file for reading: %s\n", file); + msg("The ENTIRE dump is aborted.\n"); + exit(X_STARTUP); + } + while (( p = fgets(fname, MAXPATHLEN, f))) { + if ( *p && *(p + strlen(p) - 1) == '\n' ) /* possible null string */ + *(p + strlen(p) - 1) = '\0'; + if ( !*p ) /* skip empty lines */ + continue; + do_exclude_ino_str(p); + } + fclose(f); +} diff --git a/dump/traverse.c b/dump/traverse.c index 632a6a3..2a160fa 100644 --- a/dump/traverse.c +++ b/dump/traverse.c @@ -41,7 +41,7 @@ #ifndef lint static const char rcsid[] = - "$Id: traverse.c,v 1.35 2001/07/18 08:50:58 stelian Exp $"; + "$Id: traverse.c,v 1.36 2001/07/19 09:03:44 stelian Exp $"; #endif /* not lint */ #include @@ -102,9 +102,6 @@ static void dmpindir __P((dump_ino_t ino, daddr_t blk, int level, fsizeT *size)) static int searchdir __P((dump_ino_t ino, daddr_t blkno, long size, long filesize)); #endif static void mapfileino __P((dump_ino_t ino, struct dinode const *dp, long *tapesize, int *dirskipped)); -static int exclude_ino __P((dump_ino_t ino)); -extern dump_ino_t iexclude_list[IEXCLUDE_MAXNUM]; /* the inode exclude list */ -extern int iexclude_num; /* number of elements in list */ #ifdef HAVE_EXT2_JOURNAL_INUM #define ext2_journal_ino(sb) (sb->s_journal_inum) @@ -162,13 +159,12 @@ int dump_fs_open(const char *disk, ext2_filsys *fs) else { if (es->s_feature_compat & EXT3_FEATURE_COMPAT_HAS_JOURNAL && - journal_ino && !exclude_ino(journal_ino)) { - iexclude_list[iexclude_num++] = journal_ino; - msg("Exclude ext3 journal inode %u\n", + journal_ino) { + msg("Exclude journal inode %u\n", journal_ino); + do_exclude_ino(journal_ino); } - if (!exclude_ino(EXT2_RESIZE_INO)) - iexclude_list[iexclude_num++] = EXT2_RESIZE_INO; + do_exclude_ino(EXT2_RESIZE_INO); } } return retval; @@ -224,22 +220,6 @@ blockest(struct dinode const *dp) return (blkest + 1); } -/* - * This tests whether an inode is in the exclude list - */ -int -exclude_ino(dump_ino_t ino) -{ - /* 04-Feb-00 ILC */ - if (iexclude_num) { /* if there are inodes in the exclude list */ - int idx; /* then check this inode against it */ - for (idx = 0; idx < iexclude_num; idx++) - if (ino == iexclude_list[idx]) - return 1; - } - return 0; -} - /* Auxiliary macro to pick up files changed since previous dump. */ #define CHANGEDSINCE(dp, t) \ ((dp)->di_mtime >= (t) || (dp)->di_ctime >= (t)) -- 2.39.5