X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=restore%2Fsymtab.c;h=3e6d3fc2b6674a31a076dcb2eb3204790e1159d3;hp=27343d9d319a3089471613f6c548e8fbad2832f1;hb=585ca01a9a2ed1ce197c44a33f5a1fde06adbef7;hpb=ddd2ef55b78a62c4bc3daad18bef8a90e85a2052 diff --git a/restore/symtab.c b/restore/symtab.c index 27343d9..3e6d3fc 100644 --- a/restore/symtab.c +++ b/restore/symtab.c @@ -2,8 +2,8 @@ * Ported to Linux's Second Extended File System as part of the * dump and restore backup suit * Remy Card , 1994-1997 - * Stelian Pop , 1999 - * + * Stelian Pop , 1999-2000 + * Stelian Pop - AlcĂ´ve , 2000-2002 */ /* @@ -18,11 +18,7 @@ * 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. * @@ -40,11 +36,8 @@ */ #ifndef lint -#if 0 -static char sccsid[] = "@(#)symtab.c 8.3 (Berkeley) 4/28/95"; -#endif static const char rcsid[] = - "$Id: symtab.c,v 1.3 1999/10/11 12:59:20 stelian Exp $"; + "$Id: symtab.c,v 1.22 2003/10/26 16:05:48 stelian Exp $"; #endif /* not lint */ /* @@ -56,15 +49,26 @@ static const char rcsid[] = * are needed, by calling "myname". */ +#include #include #include #ifdef __linux__ #include +#include +#ifdef HAVE_EXT2FS_EXT2_FS_H +#include +#else #include +#endif #include #else /* __linux__ */ +#ifdef sunos +#include +#include +#else #include +#endif #endif /* __linux__ */ #include @@ -93,7 +97,7 @@ static const char rcsid[] = 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 *)); @@ -101,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); @@ -117,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; @@ -137,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) @@ -162,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; @@ -213,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]; ) { @@ -238,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; @@ -249,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); @@ -288,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"); @@ -359,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) { @@ -395,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 @@ -418,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); @@ -448,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; }; /* @@ -458,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; @@ -514,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 @@ -528,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"); @@ -545,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"); @@ -558,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': @@ -597,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); @@ -605,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 **)