X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=restore%2Fsymtab.c;h=35d0064cb09e958467f40ec2b198ba7b40bfcb24;hp=d9d9a2e2ca6d3776d998b5db77e2ae4561fe9dd0;hb=ec387a1267f4cac7625cd5b6d1c1f080d39085b3;hpb=1227625a12a66e0ded78a1997c2d23f23202a382 diff --git a/restore/symtab.c b/restore/symtab.c index d9d9a2e..35d0064 100644 --- a/restore/symtab.c +++ b/restore/symtab.c @@ -1,7 +1,8 @@ /* * Ported to Linux's Second Extended File System as part of the * dump and restore backup suit - * Remy Card , 1994, 1995, 1996 + * Remy Card , 1994-1997 + * Stelian Pop , 1999 * */ @@ -36,12 +37,10 @@ * 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 char sccsid[] = "@(#)symtab.c 8.3 (Berkeley) 4/28/95"; -#endif /* not lint */ - /* * These routines maintain the symbol table which tracks the state * of the file system being restored. They provide lookup by either @@ -63,6 +62,7 @@ static char sccsid[] = "@(#)symtab.c 8.3 (Berkeley) 4/28/95"; #endif /* __linux__ */ #include +#include #include #include #include @@ -95,8 +95,7 @@ static void removeentry __P((struct entry *)); * Look up an entry by inode number */ struct entry * -lookupino(inum) - ino_t inum; +lookupino(ino_t inum) { register struct entry *ep; @@ -112,9 +111,7 @@ lookupino(inum) * Add an entry into the entry table */ static void -addino(inum, np) - ino_t inum; - struct entry *np; +addino(ino_t inum, struct entry *np) { struct entry **epp; @@ -134,8 +131,7 @@ addino(inum, np) * Delete an entry from the entry table */ void -deleteino(inum) - ino_t inum; +deleteino(ino_t inum) { register struct entry *next; struct entry **prev; @@ -158,8 +154,7 @@ deleteino(inum) * Look up an entry by name */ struct entry * -lookupname(name) - char *name; +lookupname(char *name) { register struct entry *ep; register char *np, *cp; @@ -167,8 +162,11 @@ lookupname(name) cp = name; for (ep = lookupino(ROOTINO); ep != NULL; ep = ep->e_entries) { - for (np = buf; *cp != '/' && *cp != '\0'; ) + for (np = buf; *cp != '/' && *cp != '\0' && + np < &buf[sizeof(buf)]; ) *np++ = *cp++; + if (np == &buf[sizeof(buf)]) + break; *np = '\0'; for ( ; ep != NULL; ep = ep->e_sibling) if (strcmp(ep->e_name, buf) == 0) @@ -185,8 +183,7 @@ lookupname(name) * Look up the parent of a pathname */ static struct entry * -lookupparent(name) - char *name; +lookupparent(char *name) { struct entry *ep; char *tailindex; @@ -208,15 +205,14 @@ lookupparent(name) * Determine the current pathname of a node or leaf */ char * -myname(ep) - register struct entry *ep; +myname(struct entry *ep) { register char *cp; static char namebuf[MAXPATHLEN]; for (cp = &namebuf[MAXPATHLEN - 2]; cp > &namebuf[ep->e_namlen]; ) { cp -= ep->e_namlen; - memmove(cp, ep->e_name, (long)ep->e_namlen); + memmove(cp, ep->e_name, (size_t)ep->e_namlen); if (ep == lookupino(ROOTINO)) return (cp); *(--cp) = '/'; @@ -227,7 +223,7 @@ myname(ep) } /* - * Unused symbol table entries are linked together on a freelist + * Unused symbol table entries are linked together on a free list * headed by the following pointer. */ static struct entry *freelist = NULL; @@ -236,17 +232,14 @@ static struct entry *freelist = NULL; * add an entry to the symbol table */ struct entry * -addentry(name, inum, type) - char *name; - ino_t inum; - int type; +addentry(char *name, ino_t inum, int type) { register struct entry *np, *ep; if (freelist != NULL) { np = freelist; freelist = np->e_next; - memset(np, 0, (long)sizeof(struct entry)); + memset(np, 0, sizeof(struct entry)); } else { np = (struct entry *)calloc(1, sizeof(struct entry)); if (np == NULL) @@ -271,7 +264,7 @@ addentry(name, inum, type) if (type & LINK) { ep = lookupino(inum); if (ep == NULL) - panic("link to non-existant name\n"); + panic("link to non-existent name\n"); np->e_ino = inum; np->e_links = ep->e_links; ep->e_links = np; @@ -287,8 +280,7 @@ addentry(name, inum, type) * delete an entry from the symbol table */ void -freeentry(ep) - register struct entry *ep; +freeentry(struct entry *ep) { register struct entry *np; ino_t inum; @@ -331,9 +323,7 @@ freeentry(ep) * Relocate an entry in the tree structure */ void -moveentry(ep, newname) - register struct entry *ep; - char *newname; +moveentry(struct entry *ep, char *newname) { struct entry *np; char *cp; @@ -361,8 +351,7 @@ moveentry(ep, newname) * Remove an entry in the tree structure */ static void -removeentry(ep) - register struct entry *ep; +removeentry(struct entry *ep) { register struct entry *np; @@ -383,12 +372,12 @@ removeentry(ep) /* * Table of unused string entries, sorted by length. - * + * * Entries are allocated in STRTBLINCR sized pieces so that names * of similar lengths can use the same entry. The value of STRTBLINCR * is chosen so that every entry has at least enough space to hold * a "struct strtbl" header. Thus every entry can be linked onto an - * apprpriate free list. + * appropriate free list. * * NB. The macro "allocsize" below assumes that "struct strhdr" * has a size that is a power of two. @@ -407,8 +396,7 @@ static struct strhdr strtblhdr[allocsize(NAME_MAX) / STRTBLINCR]; * has an appropriate sized entry, and if not allocates a new one. */ char * -savename(name) - char *name; +savename(char *name) { struct strhdr *np; long len; @@ -435,11 +423,10 @@ savename(name) * appropriate free list. */ void -freename(name) - char *name; +freename(char *name) { struct strhdr *tp, *np; - + tp = &strtblhdr[strlen(name) / STRTBLINCR]; np = (struct strhdr *)name; np->next = tp->next; @@ -450,22 +437,20 @@ freename(name) * Useful quantities placed at the end of a dumped symbol table. */ struct symtableheader { - long volno; - long stringsize; - long entrytblsize; + int32_t volno; + int32_t stringsize; + int32_t entrytblsize; time_t dumptime; time_t dumpdate; ino_t maxino; - long ntrec; + int32_t ntrec; }; /* * dump a snapshot of the symbol table */ void -dumpsymtable(filename, checkpt) - char *filename; - long checkpt; +dumpsymtable(char *filename, long checkpt) { register struct entry *ep, *tep; register ino_t i; @@ -474,20 +459,20 @@ dumpsymtable(filename, checkpt) FILE *fd; struct symtableheader hdr; - vprintf(stdout, "Check pointing the restore\n"); + Vprintf(stdout, "Check pointing the restore\n"); if (Nflag) return; if ((fd = fopen(filename, "w")) == NULL) { - fprintf(stderr, "fopen: %s\n", strerror(errno)); + warn("fopen"); panic("cannot create save file %s for symbol table\n", filename); } clearerr(fd); /* - * Assign indicies to each entry + * Assign indices to each entry * Write out the string entries */ - for (i = WINO; i < maxino; i++) { + for (i = WINO; i <= maxino; i++) { for (ep = lookupino(i); ep != NULL; ep = ep->e_links) { ep->e_index = mynum++; (void) fwrite(ep->e_name, sizeof(char), @@ -499,9 +484,9 @@ dumpsymtable(filename, checkpt) */ tep = &temp; stroff = 0; - for (i = WINO; i < maxino; i++) { + for (i = WINO; i <= maxino; i++) { for (ep = lookupino(i); ep != NULL; ep = ep->e_links) { - memmove(tep, ep, (long)sizeof(struct entry)); + memmove(tep, ep, sizeof(struct entry)); tep->e_name = (char *)stroff; stroff += allocsize(ep->e_namlen); tep->e_parent = (struct entry *)ep->e_parent->e_index; @@ -539,7 +524,7 @@ dumpsymtable(filename, checkpt) hdr.ntrec = ntrec; (void) fwrite((char *)&hdr, sizeof(struct symtableheader), 1, fd); if (ferror(fd)) { - fprintf(stderr, "fwrite: %s\n", strerror(errno)); + warn("fwrite"); panic("output error to file %s writing symbol table\n", filename); } @@ -550,8 +535,7 @@ dumpsymtable(filename, checkpt) * Initialize a symbol table from a file */ void -initsymtable(filename) - char *filename; +initsymtable(char *filename) { char *base; long tblsize; @@ -562,7 +546,7 @@ initsymtable(filename) register long i; int fd; - vprintf(stdout, "Initialize symbol table.\n"); + Vprintf(stdout, "Initialize symbol table.\n"); if (filename == NULL) { entrytblsize = maxino / HASHFACTOR; entry = (struct entry **) @@ -574,11 +558,11 @@ initsymtable(filename) return; } if ((fd = open(filename, O_RDONLY, 0)) < 0) { - fprintf(stderr, "open: %s\n", strerror(errno)); + warn("open"); panic("cannot open symbol table file %s\n", filename); } if (fstat(fd, &stbuf) < 0) { - fprintf(stderr, "stat: %s\n", strerror(errno)); + warn("stat"); panic("cannot stat symbol table file %s\n", filename); } tblsize = stbuf.st_size - sizeof(struct symtableheader); @@ -587,7 +571,7 @@ initsymtable(filename) panic("cannot allocate space for symbol table\n"); if (read(fd, base, (int)tblsize) < 0 || read(fd, (char *)&hdr, sizeof(struct symtableheader)) < 0) { - fprintf(stderr, "read: %s\n", strerror(errno)); + warn("read"); panic("cannot read symbol table file %s\n", filename); } switch (command) { @@ -596,13 +580,9 @@ initsymtable(filename) * For normal continuation, insure that we are using * the next incremental tape */ - if (hdr.dumpdate != dumptime) { - if (hdr.dumpdate < dumptime) - fprintf(stderr, "Incremental tape too low\n"); - else - fprintf(stderr, "Incremental tape too high\n"); - done(1); - } + if (hdr.dumpdate != dumptime) + errx(1, "Incremental tape too %s", + (hdr.dumpdate < dumptime) ? "low" : "high"); break; case 'R': /*