* 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 <pop@noos.fr>, 1999-2000
+ * Stelian Pop <pop@noos.fr> - AlcĂ´ve <www.alcove.fr>, 2000
*/
/*
*/
#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.2 1999/10/11 12:53:24 stelian Exp $";
+ "$Id: symtab.c,v 1.16 2001/06/18 10:58:28 stelian Exp $";
#endif /* not lint */
/*
* 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__ */
#include <ufs/ufs/dinode.h>
#endif /* __linux__ */
#include <errno.h>
+#include <compaterr.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
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 *));
* Look up an entry by inode number
*/
struct entry *
-lookupino(inum)
- ino_t inum;
+lookupino(dump_ino_t inum)
{
register struct entry *ep;
* Add an entry into the entry table
*/
static void
-addino(inum, np)
- ino_t inum;
- struct entry *np;
+addino(dump_ino_t inum, struct entry *np)
{
struct entry **epp;
* Delete an entry from the entry table
*/
void
-deleteino(inum)
- ino_t inum;
+deleteino(dump_ino_t inum)
{
register struct entry *next;
struct entry **prev;
* Look up an entry by name
*/
struct entry *
-lookupname(name)
- char *name;
+lookupname(char *name)
{
register struct entry *ep;
register char *np, *cp;
* Look up the parent of a pathname
*/
static struct entry *
-lookupparent(name)
- char *name;
+lookupparent(char *name)
{
struct entry *ep;
char *tailindex;
* 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) = '/';
* add an entry to the symbol table
*/
struct entry *
-addentry(name, inum, type)
- char *name;
- ino_t inum;
- int type;
+addentry(char *name, dump_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)
- panic("no memory to extend symbol table\n");
+ errx(1, "no memory to extend symbol table");
}
np->e_type = type & ~LINK;
ep = lookupparent(name);
* 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;
+ dump_ino_t inum;
if (ep->e_flags != REMOVED)
badentry(ep, "not marked REMOVED");
* 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;
* Remove an entry in the tree structure
*/
static void
-removeentry(ep)
- register struct entry *ep;
+removeentry(struct entry *ep)
{
register struct entry *np;
#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
* 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;
} 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);
* appropriate free list.
*/
void
-freename(name)
- char *name;
+freename(char *name)
{
struct strhdr *tp, *np;
int32_t entrytblsize;
time_t dumptime;
time_t dumpdate;
- ino_t maxino;
+ dump_ino_t maxino;
int32_t ntrec;
+ int32_t zflag;
};
/*
* 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;
+ register dump_ino_t i;
struct entry temp, *tentry;
long mynum = 1, stroff = 0;
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);
}
stroff = 0;
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;
hdr.dumptime = dumptime;
hdr.dumpdate = dumpdate;
hdr.ntrec = ntrec;
+ hdr.zflag = zflag;
(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);
}
* Initialize a symbol table from a file
*/
void
-initsymtable(filename)
- char *filename;
+initsymtable(char *filename)
{
char *base;
long tblsize;
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 **)
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) {
- fprintf(stderr, "open: %s\n", strerror(errno));
- panic("cannot open symbol table file %s\n", filename);
+ warn("open");
+ errx(1, "cannot open symbol table file %s", filename);
}
if (fstat(fd, &stbuf) < 0) {
- fprintf(stderr, "stat: %s\n", strerror(errno));
- panic("cannot stat symbol table file %s\n", filename);
+ warn("stat");
+ 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) {
- fprintf(stderr, "read: %s\n", strerror(errno));
- panic("cannot read symbol table file %s\n", filename);
+ warn("read");
+ errx(1, "cannot read symbol table file %s", filename);
}
switch (command) {
case 'r':
* 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':
/*
curfile.action = SKIP;
dumptime = hdr.dumptime;
dumpdate = hdr.dumpdate;
+ zflag = hdr.zflag;
if (!bflag)
newtapebuf(hdr.ntrec);
getvol(hdr.volno);