]> git.wh0rd.org - dump.git/blobdiff - dump/main.c
Refuse incompatible options in dump (-a and -B).
[dump.git] / dump / main.c
index d7462c89fc6030c9c8c8cae93115297aaa17ad69..8f33f95e23847b16977f6776af732f82bb3711a7 100644 (file)
@@ -41,7 +41,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: main.c,v 1.54 2001/07/19 09:49:35 stelian Exp $";
+       "$Id: main.c,v 1.58 2001/08/16 13:12:30 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
@@ -88,6 +88,68 @@ static const char rcsid[] =
 #define SBOFF (SBLOCK * DEV_BSIZE)
 #endif
 
+/*
+ * Dump maps used to describe what is to be dumped.
+ */
+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 */
+
+const char *disk;      /* name of the disk file */
+char   tape[MAXPATHLEN];/* name of the tape file */
+char   *tapeprefix;    /* prefix of the tape file */
+char   *dumpdates;     /* name of the file containing dump date information*/
+char   lastlevel;      /* dump level of previous dump */
+char   level;          /* dump level of this dump */
+int    uflag;          /* update flag */
+int    Mflag;          /* multi-volume flag */
+int    qflag;          /* quit on errors flag */
+char   *eot_script;    /* end of volume script fiag */
+int    diskfd;         /* disk file descriptor */
+int    tapefd;         /* tape file descriptor */
+int    pipeout;        /* true => output to standard output */
+int    fifoout;        /* true => output to fifo */
+dump_ino_t curino;     /* current inumber; used globally */
+int    newtape;        /* new tape flag */
+int    density;        /* density in 0.1" units */
+long   tapesize;       /* estimated tape size, blocks */
+long   tsize;          /* tape size in 0.1" units */
+long   asize;          /* number of 0.1" units written on current tape */
+int    etapes;         /* estimated number of tapes */
+int    nonodump;       /* if set, do not honor UF_NODUMP user flags */
+int    unlimited;      /* if set, write to end of medium */
+int    compressed;     /* if set, dump is to be compressed */
+long long bytes_written;/* total bytes written to tape */
+long   uncomprblks;    /* uncompressed blocks written to tape */
+int    notify;         /* notify operator flag */
+int    blockswritten;  /* number of blocks written on current tape */
+int    tapeno;         /* current tape number */
+time_t tstart_writing; /* when started writing the first tape block */
+time_t tend_writing;   /* after writing the last tape block */
+#ifdef __linux__
+ext2_filsys fs;
+#else
+struct fs *sblock;     /* the file system super block */
+char   sblock_buf[MAXBSIZE];
+#endif
+long   xferrate;       /* averaged transfer rate of all volumes */
+long   dev_bsize;      /* block size of underlying disk device */
+int    dev_bshift;     /* log2(dev_bsize) */
+int    tp_bshift;      /* log2(TP_BSIZE) */
+
+#ifdef USE_QFA
+int    gTapeposfd;
+char   *gTapeposfile;
+char   gTps[255];
+int32_t        gThisDumpDate;
+#endif /* USE_QFA */
+
+struct dumptime *dthead;       /* head of the list version */
+int    nddates;                /* number of records (might be zero) */
+int    ddates_in;              /* we have read the increment file */
+struct dumpdates **ddatev;     /* the arrayfied version */
+
 int    notify = 0;     /* notify operator flag */
 int    blockswritten = 0;      /* number of blocks written on current tape */
 int    tapeno = 0;     /* current tape number */
@@ -116,6 +178,7 @@ 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 *));
+static void incompat_flags __P((int, char, char));
 
 static dump_ino_t iexclude_list[IEXCLUDE_MAXNUM];/* the inode exclude list */
 static int iexclude_num = 0;                   /* number of elements in the list */
@@ -129,7 +192,8 @@ main(int argc, char *argv[])
        register struct fstab *dt;
        register char *map;
        register int ch;
-       int i, anydirskipped, bflag = 0, Tflag = 0, honorlevel = 1;
+       int i, anydirskipped;
+       int aflag = 0, bflag = 0, Tflag = 0, honorlevel = 1;
        dump_ino_t maxino;
        struct STAT statbuf;
        dev_t filedev = 0;
@@ -174,7 +238,7 @@ main(int argc, char *argv[])
 #ifdef KERBEROS
                            "k"
 #endif
-                           "Mn"
+                           "Mnq"
 #ifdef USE_QFA
                            "Q:"
 #endif
@@ -192,6 +256,7 @@ main(int argc, char *argv[])
 
                case 'a':               /* `auto-size', Write to EOM. */
                        unlimited = 1;
+                       aflag = 1;
                        break;
 
                case 'B':               /* blocks per output file */
@@ -284,6 +349,10 @@ main(int argc, char *argv[])
                        notify = 1;
                        break;
 
+               case 'q':
+                       qflag = 1;
+                       break;
+
 #ifdef USE_QFA
                case 'Q':               /* create tapeposfile */
                        gTapeposfile = optarg;
@@ -345,11 +414,12 @@ main(int argc, char *argv[])
                exit(X_STARTUP);
        }
        argc--;
-       if (Tflag && uflag) {
-               msg("You cannot use the T and u flags together.\n");
-               msg("The ENTIRE dump is aborted.\n");
-               exit(X_STARTUP);
-       }
+       incompat_flags(Tflag && uflag, 'T', 'u');
+       incompat_flags(aflag && blocksperfile, 'a', 'B');
+       incompat_flags(aflag && cartridge, 'a', 'c');
+       incompat_flags(aflag && density, 'a', 'd');
+       incompat_flags(aflag && tsize, 'a', 's');
+
        if (strcmp(tapeprefix, "-") == 0) {
                pipeout++;
                tapeprefix = "standard output";
@@ -745,7 +815,7 @@ main(int argc, char *argv[])
 #ifdef USE_QFA
        if (tapepos) {
                msg("writing QFA positions to %s\n", gTapeposfile);
-               if ((gTapeposfd = open(gTapeposfile, O_RDWR|O_CREAT)) < 0)
+               if ((gTapeposfd = open(gTapeposfile, O_RDWR|O_CREAT, S_IRUSR | S_IWUSR)) < 0)
                        quit("can't open tapeposfile\n");
                /* print QFA-file header */
                sprintf(gTps, "%s\n%s\n%ld\n\n", QFA_MAGIC, QFA_VERSION, (unsigned long)spcl.c_date);
@@ -888,7 +958,7 @@ usage(void)
 #ifdef KERBEROS
                "k"
 #endif
-               "MnSu"
+               "MnqSu"
                "] [-B records] [-b blocksize] [-d density]\n"
                "\t%s [-e inode#,inode#,...] [-E file] [-f file] [-h level] "
 #ifdef USE_QFA
@@ -1118,3 +1188,12 @@ do_exclude_from_file(char *file) {
        }
        fclose(f);
 }
+
+static void incompat_flags(int cond, char flag1, char flag2) {
+       if (cond) {
+               msg("You cannot use the %c and %c flags together.\n", 
+                   flag1, flag2);
+               msg("The ENTIRE dump is aborted.\n");
+               exit(X_STARTUP);
+       }
+}