]> git.wh0rd.org - dump.git/blobdiff - dump/main.c
prepare for 0.4b28pre1 release.
[dump.git] / dump / main.c
index ac6a7a14417f0af477a58220a642b6f7af30592f..93c175c73b509e604595f1e874da4890ca4c14aa 100644 (file)
@@ -41,7 +41,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: main.c,v 1.67 2002/01/25 14:59:53 stelian Exp $";
+       "$Id: main.c,v 1.71 2002/04/04 08:20:23 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
@@ -61,7 +61,6 @@ static const char rcsid[] =
 #include <sys/time.h>
 #include <time.h>
 #ifdef __linux__
-#include <linux/fs.h>
 #ifdef HAVE_EXT2FS_EXT2_FS_H
 #include <ext2fs/ext2_fs.h>
 #else
@@ -97,6 +96,8 @@ int   mapsize;        /* size of the state maps */
 char   *usedinomap;    /* map of allocated inodes */
 char   *dumpdirmap;    /* map of directories to be dumped */
 char   *dumpinomap;    /* map of files to be dumped */
+char   *metainomap;    /* which of the inodes in dumpinomap will get
+                          only their metadata dumped */
 
 const char *disk;      /* name of the disk file */
 char   tape[MAXPATHLEN];/* name of the tape file */
@@ -107,6 +108,7 @@ char        level;          /* dump level of this dump */
 int    bzipflag;       /* compression is done using bzlib */
 int    Afile = 0;      /* archive file descriptor */
 int    uflag;          /* update flag */
+int    mflag;          /* dump metadata only if possible */
 int    Mflag;          /* multi-volume flag */
 int    qflag;          /* quit on errors flag */
 int     breademax = 32; /* maximum number of bread errors before we quit */
@@ -192,12 +194,12 @@ static int iexclude_num = 0;                      /* number of elements in the list */
 int
 main(int argc, char *argv[])
 {
-       register dump_ino_t ino;
-       register int dirty;
-       register struct dinode *dp;
-       register struct fstab *dt;
-       register char *map;
-       register int ch;
+       dump_ino_t ino;
+       int dirty;
+       struct dinode *dp;
+       struct  fstab *dt;
+       char *map;
+       int ch;
        int i, anydirskipped;
        int aflag = 0, bflag = 0, Tflag = 0, honorlevel = 1;
        dump_ino_t maxino;
@@ -210,7 +212,7 @@ main(int argc, char *argv[])
 #endif
        time_t tnow;
        char *diskparam;
-       char *Apath;
+       char *Apath = NULL;
 
        spcl.c_label[0] = '\0';
        spcl.c_date = time(NULL);
@@ -249,7 +251,7 @@ main(int argc, char *argv[])
 #ifdef KERBEROS
                            "k"
 #endif
-                           "Mnq"
+                           "mMnq"
 #ifdef USE_QFA
                            "Q:"
 #endif
@@ -378,6 +380,10 @@ main(int argc, char *argv[])
                        }
                        break;
 
+               case 'm':               /* metadata only flag */
+                       mflag = 1;
+                       break;
+
                case 'M':               /* multi-volume flag */
                        Mflag = 1;
                        break;
@@ -531,7 +537,8 @@ main(int argc, char *argv[])
         */
        i = strlen(diskparam) - 1;
        if (i > 1 && diskparam[i] == '/')
-               diskparam[i] = '\0';
+               if (!(i == 6 && !strcmp(diskparam, "LABEL=/")))
+                       diskparam[i] = '\0';
 
        disk = get_device_name(diskparam);
        if (!disk) {            /* null means the disk is some form
@@ -730,7 +737,9 @@ main(int argc, char *argv[])
        usedinomap = (char *)calloc((unsigned) mapsize, sizeof(char));
        dumpdirmap = (char *)calloc((unsigned) mapsize, sizeof(char));
        dumpinomap = (char *)calloc((unsigned) mapsize, sizeof(char));
-       if (usedinomap == NULL || dumpdirmap == NULL || dumpinomap == NULL)
+       metainomap = (char *)calloc((unsigned) mapsize, sizeof(char));
+       if (usedinomap == NULL || dumpdirmap == NULL || 
+           dumpinomap == NULL || metainomap == NULL)
                quit("out of memory allocating inode maps\n");
        tapesize = 2 * (howmany(mapsize * sizeof(char), TP_BSIZE) + 1);
 
@@ -933,7 +942,7 @@ main(int argc, char *argv[])
                 * inodes since this is done in dumpino().
                 */
 #endif
-               (void)dumpino(dp, ino);
+               (void)dumpino(dp, ino, mflag && TSTINO(ino, metainomap));
        }
 
        tend_writing = time(NULL);
@@ -1016,7 +1025,7 @@ usage(void)
 #ifdef KERBEROS
                "k"
 #endif
-               "MnqSu"
+               "mMnqSu"
                "] [-A file] [-B records] [-b blocksize]\n"
                "\t%s [-d density] [-e inode#,inode#,...] [-E file] [-f file]\n"
                "\t%s [-h level] [-I nr errors] "