]> git.wh0rd.org - dump.git/blobdiff - restore/symtab.c
Exclude directory entries to non-dumped inodes from the dump.
[dump.git] / restore / symtab.c
index 35d0064cb09e958467f40ec2b198ba7b40bfcb24..3e6d3fc2b6674a31a076dcb2eb3204790e1159d3 100644 (file)
@@ -2,8 +2,8 @@
  *     Ported to Linux's Second Extended File System as part of the
  *     dump and restore backup suit
  *     Remy Card <card@Linux.EU.Org>, 1994-1997
- *      Stelian Pop <pop@cybercable.fr>, 1999 
- *
+ *     Stelian Pop <stelian@popies.net>, 1999-2000
+ *     Stelian Pop <stelian@popies.net> - AlcĂ´ve <www.alcove.com>, 2000-2002
  */
 
 /*
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  *
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- *
- * $Id: symtab.c,v 1.5 1999/10/11 13:31:13 stelian Exp $
  */
 
+#ifndef lint
+static const char rcsid[] =
+       "$Id: symtab.c,v 1.22 2003/10/26 16:05:48 stelian Exp $";
+#endif /* not lint */
+
 /*
  * These routines maintain the symbol table which tracks the state
  * of the file system being restored. They provide lookup by either
  * are needed, by calling "myname".
  */
 
+#include <config.h>
 #include <sys/param.h>
 #include <sys/stat.h>
 
 #ifdef __linux__
 #include <sys/time.h>
+#include <time.h>
+#ifdef HAVE_EXT2FS_EXT2_FS_H
+#include <ext2fs/ext2_fs.h>
+#else
 #include <linux/ext2_fs.h>
+#endif
 #include <bsdcompat.h>
 #else  /* __linux__ */
+#ifdef sunos
+#include <sys/fcntl.h>
+#include <bsdcompat.h>
+#else
 #include <ufs/ufs/dinode.h>
+#endif
 #endif /* __linux__ */
 
 #include <errno.h>
@@ -87,7 +97,7 @@
 static struct entry **entry;
 static long entrytblsize;
 
-static void             addino __P((ino_t, struct entry *));
+static void             addino __P((dump_ino_t, struct entry *));
 static struct entry    *lookupparent __P((char *));
 static void             removeentry __P((struct entry *));
 
@@ -95,9 +105,9 @@ static void           removeentry __P((struct entry *));
  * Look up an entry by inode number
  */
 struct entry *
-lookupino(ino_t inum)
+lookupino(dump_ino_t inum)
 {
-       register struct entry *ep;
+       struct entry *ep;
 
        if (inum < WINO || inum >= maxino)
                return (NULL);
@@ -111,7 +121,7 @@ lookupino(ino_t inum)
  * Add an entry into the entry table
  */
 static void
-addino(ino_t inum, struct entry *np)
+addino(dump_ino_t inum, struct entry *np)
 {
        struct entry **epp;
 
@@ -131,9 +141,9 @@ addino(ino_t inum, struct entry *np)
  * Delete an entry from the entry table
  */
 void
-deleteino(ino_t inum)
+deleteino(dump_ino_t inum)
 {
-       register struct entry *next;
+       struct entry *next;
        struct entry **prev;
 
        if (inum < WINO || inum >= maxino)
@@ -156,8 +166,8 @@ deleteino(ino_t inum)
 struct entry *
 lookupname(char *name)
 {
-       register struct entry *ep;
-       register char *np, *cp;
+       struct entry *ep;
+       char *np, *cp;
        char buf[MAXPATHLEN];
 
        cp = name;
@@ -207,7 +217,7 @@ lookupparent(char *name)
 char *
 myname(struct entry *ep)
 {
-       register char *cp;
+       char *cp;
        static char namebuf[MAXPATHLEN];
 
        for (cp = &namebuf[MAXPATHLEN - 2]; cp > &namebuf[ep->e_namlen]; ) {
@@ -232,9 +242,9 @@ static struct entry *freelist = NULL;
  * add an entry to the symbol table
  */
 struct entry *
-addentry(char *name, ino_t inum, int type)
+addentry(char *name, dump_ino_t inum, int type)
 {
-       register struct entry *np, *ep;
+       struct entry *np, *ep;
 
        if (freelist != NULL) {
                np = freelist;
@@ -243,7 +253,7 @@ addentry(char *name, ino_t inum, int type)
        } else {
                np = (struct entry *)calloc(1, sizeof(struct entry));
                if (np == NULL)
-                       panic("no memory to extend symbol table\n");
+                       errx(1, "no memory to extend symbol table");
        }
        np->e_type = type & ~LINK;
        ep = lookupparent(name);
@@ -282,8 +292,8 @@ addentry(char *name, ino_t inum, int type)
 void
 freeentry(struct entry *ep)
 {
-       register struct entry *np;
-       ino_t inum;
+       struct entry *np;
+       dump_ino_t inum;
 
        if (ep->e_flags != REMOVED)
                badentry(ep, "not marked REMOVED");
@@ -353,7 +363,7 @@ moveentry(struct entry *ep, char *newname)
 static void
 removeentry(struct entry *ep)
 {
-       register struct entry *np;
+       struct entry *np;
 
        np = ep->e_parent;
        if (np->e_entries == ep) {
@@ -389,7 +399,7 @@ struct strhdr {
 #define STRTBLINCR     (sizeof(struct strhdr))
 #define allocsize(size)        (((size) + 1 + STRTBLINCR - 1) & ~(STRTBLINCR - 1))
 
-static struct strhdr strtblhdr[allocsize(NAME_MAX) / STRTBLINCR];
+static struct strhdr strtblhdr[allocsize(MAXNAMLEN) / STRTBLINCR];
 
 /*
  * Allocate space for a name. It first looks to see if it already
@@ -412,7 +422,7 @@ savename(char *name)
        } else {
                cp = malloc((unsigned)allocsize(len));
                if (cp == NULL)
-                       panic("no space for string table\n");
+                       errx(1, "no space for string table");
        }
        (void) strcpy(cp, name);
        return (cp);
@@ -442,8 +452,9 @@ struct symtableheader {
        int32_t entrytblsize;
        time_t  dumptime;
        time_t  dumpdate;
-       ino_t   maxino;
+       dump_ino_t maxino;
        int32_t ntrec;
+       int32_t zflag;
 };
 
 /*
@@ -452,8 +463,8 @@ struct symtableheader {
 void
 dumpsymtable(char *filename, long checkpt)
 {
-       register struct entry *ep, *tep;
-       register ino_t i;
+       struct entry *ep, *tep;
+       dump_ino_t i;
        struct entry temp, *tentry;
        long mynum = 1, stroff = 0;
        FILE *fd;
@@ -508,7 +519,7 @@ dumpsymtable(char *filename, long checkpt)
        /*
         * Convert entry pointers to indexes, and output
         */
-       for (i = 0; i < entrytblsize; i++) {
+       for (i = 0; (long)i < entrytblsize; i++) {
                if (entry[i] == NULL)
                        tentry = NULL;
                else
@@ -522,6 +533,7 @@ dumpsymtable(char *filename, long checkpt)
        hdr.dumptime = dumptime;
        hdr.dumpdate = dumpdate;
        hdr.ntrec = ntrec;
+       hdr.zflag = zflag;
        (void) fwrite((char *)&hdr, sizeof(struct symtableheader), 1, fd);
        if (ferror(fd)) {
                warn("fwrite");
@@ -539,11 +551,11 @@ initsymtable(char *filename)
 {
        char *base;
        long tblsize;
-       register struct entry *ep;
+       struct entry *ep;
        struct entry *baseep, *lep;
        struct symtableheader hdr;
        struct stat stbuf;
-       register long i;
+       long i;
        int fd;
 
        Vprintf(stdout, "Initialize symbol table.\n");
@@ -552,27 +564,27 @@ initsymtable(char *filename)
                entry = (struct entry **)
                        calloc((unsigned)entrytblsize, sizeof(struct entry *));
                if (entry == (struct entry **)NULL)
-                       panic("no memory for entry table\n");
+                       errx(1, "no memory for entry table");
                ep = addentry(".", ROOTINO, NODE);
                ep->e_flags |= NEW;
                return;
        }
        if ((fd = open(filename, O_RDONLY, 0)) < 0) {
                warn("open");
-               panic("cannot open symbol table file %s\n", filename);
+               errx(1, "cannot open symbol table file %s", filename);
        }
        if (fstat(fd, &stbuf) < 0) {
                warn("stat");
-               panic("cannot stat symbol table file %s\n", filename);
+               errx(1, "cannot stat symbol table file %s", filename);
        }
        tblsize = stbuf.st_size - sizeof(struct symtableheader);
        base = calloc(sizeof(char), (unsigned)tblsize);
        if (base == NULL)
-               panic("cannot allocate space for symbol table\n");
+               errx(1, "cannot allocate space for symbol table");
        if (read(fd, base, (int)tblsize) < 0 ||
            read(fd, (char *)&hdr, sizeof(struct symtableheader)) < 0) {
                warn("read");
-               panic("cannot read symbol table file %s\n", filename);
+               errx(1, "cannot read symbol table file %s", filename);
        }
        switch (command) {
        case 'r':
@@ -591,6 +603,7 @@ initsymtable(char *filename)
                curfile.action = SKIP;
                dumptime = hdr.dumptime;
                dumpdate = hdr.dumpdate;
+               zflag = hdr.zflag;
                if (!bflag)
                        newtapebuf(hdr.ntrec);
                getvol(hdr.volno);
@@ -599,6 +612,7 @@ initsymtable(char *filename)
                panic("initsymtable called from command %c\n", command);
                break;
        }
+       resizemaps(maxino, hdr.maxino);
        maxino = hdr.maxino;
        entrytblsize = hdr.entrytblsize;
        entry = (struct entry **)