X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=restore%2Fdirs.c;h=dc45e7c7545b4b140c415f5f3f6f743e6e2bf149;hb=83a6b4df0b7b7aecc0d3940549d0d480adff35a6;hp=a6611c678d14a9845a98c186ee6867126f44ce2d;hpb=8d4197bb9ba5bbcef21409231ed8903b0cac353a;p=dump.git diff --git a/restore/dirs.c b/restore/dirs.c index a6611c6..dc45e7c 100644 --- a/restore/dirs.c +++ b/restore/dirs.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 */ /* @@ -23,11 +23,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. * @@ -45,19 +41,21 @@ */ #ifndef lint -#if 0 -static char sccsid[] = "@(#)dirs.c 8.7 (Berkeley) 5/1/95"; -#endif static const char rcsid[] = - "$Id: dirs.c,v 1.4 1999/10/11 13:08:08 stelian Exp $"; + "$Id: dirs.c,v 1.23 2003/03/30 15:40:38 stelian Exp $"; #endif /* not lint */ +#include #include #include #include #ifdef __linux__ +#ifdef HAVE_EXT2FS_EXT2_FS_H +#include +#else #include +#endif #include #else /* __linux__ */ #include @@ -89,7 +87,7 @@ static const char rcsid[] = #define INOHASH(val) (val % HASHSIZE) struct inotab { struct inotab *t_next; - ino_t t_ino; + dump_ino_t t_ino; int32_t t_seekpt; int32_t t_size; }; @@ -99,7 +97,7 @@ static struct inotab *inotab[HASHSIZE]; * Information retained about directories. */ struct modeinfo { - ino_t ino; + dump_ino_t ino; struct timeval timep[2]; mode_t mode; uid_t uid; @@ -138,20 +136,20 @@ struct odirect { char d_name[ODIRSIZ]; }; -#ifdef __linux__ -static struct inotab *allocinotab __P((ino_t, struct new_bsd_inode *, long)); +#if defined(__linux__) || defined(sunos) +static struct inotab *allocinotab __P((dump_ino_t, struct new_bsd_inode *, long)); #else -static struct inotab *allocinotab __P((ino_t, struct dinode *, long)); +static struct inotab *allocinotab __P((dump_ino_t, struct dinode *, long)); #endif static void dcvt __P((struct odirect *, struct direct *)); static void flushent __P((void)); -static struct inotab *inotablookup __P((ino_t)); +static struct inotab *inotablookup __P((dump_ino_t)); static RST_DIR *opendirfile __P((const char *)); static void putdir __P((char *, size_t)); static void putent __P((struct direct *)); static void rst_seekdir __P((RST_DIR *, long, long)); static long rst_telldir __P((RST_DIR *)); -static struct direct *searchdir __P((ino_t, char *)); +static struct direct *searchdir __P((dump_ino_t, char *)); /* * Extract directory contents, building up a directory structure @@ -162,11 +160,11 @@ static struct direct *searchdir __P((ino_t, char *)); void extractdirs(int genmode) { - register int i; -#ifdef __linux__ - register struct new_bsd_inode *ip; + int i; +#if defined(__linux__) || defined(sunos) + struct new_bsd_inode *ip; #else - register struct dinode *ip; + struct dinode *ip; #endif struct inotab *itp; struct direct nulldir; @@ -211,12 +209,13 @@ extractdirs(int genmode) curfile.action = USING; ip = curfile.dip; if (ip == NULL || (ip->di_mode & IFMT) != IFDIR) { - (void) fclose(df); + if ( fclose(df) == EOF ) + err(1, "cannot write to file %s", dirfile); dirp = opendirfile(dirfile); if (dirp == NULL) warn("opendirfile"); - if (mf != NULL) - (void) fclose(mf); + if (mf != NULL && fclose(mf) == EOF ) + err(1, "cannot write to file %s", dirfile); i = dirlookup(dot); if (i == 0) panic("Root directory is not on tape\n"); @@ -247,10 +246,10 @@ skipdirs(void) * pname and pass them off to be processed. */ void -treescan(char *pname, ino_t ino, long (*todo) __P((char *, ino_t, int))) +treescan(char *pname, dump_ino_t ino, long (*todo) __P((char *, dump_ino_t, int))) { - register struct inotab *itp; - register struct direct *dp; + struct inotab *itp; + struct direct *dp; int namelen; long bpt; char locname[MAXPATHLEN + 1]; @@ -273,7 +272,7 @@ treescan(char *pname, ino_t ino, long (*todo) __P((char *, ino_t, int))) * skipping over "." and ".." */ namelen = snprintf(locname, sizeof(locname), "%s/", pname); - if (namelen >= sizeof(locname)) + if (namelen >= (int)sizeof(locname)) namelen = sizeof(locname) - 1; rst_seekdir(dirp, itp->t_seekpt, itp->t_seekpt); dp = rst_readdir(dirp); /* "." */ @@ -293,7 +292,7 @@ treescan(char *pname, ino_t ino, long (*todo) __P((char *, ino_t, int))) */ while (dp != NULL) { locname[namelen] = '\0'; - if (namelen + dp->d_namlen >= sizeof(locname)) { + if (namelen + dp->d_namlen >= (int)sizeof(locname)) { fprintf(stderr, "%s%s: name exceeds %ld char\n", locname, dp->d_name, (long)sizeof(locname) - 1); } else { @@ -312,7 +311,7 @@ treescan(char *pname, ino_t ino, long (*todo) __P((char *, ino_t, int))) struct direct * pathsearch(const char *pathname) { - ino_t ino; + dump_ino_t ino; struct direct *dp; char *path, *name, buffer[MAXPATHLEN]; @@ -322,7 +321,11 @@ pathsearch(const char *pathname) while (*path == '/') path++; dp = NULL; +#ifdef __linux__ while ((name = strsep(&path, "/")) != NULL && *name /* != NULL */) { +#else + while ((name = strtok_r(NULL, "/", &path)) != NULL && *name /* != NULL */) { +#endif if ((dp = searchdir(ino, name)) == NULL) return (NULL); ino = dp->d_ino; @@ -335,10 +338,10 @@ pathsearch(const char *pathname) * Return its inode number if found, zero if it does not exist. */ static struct direct * -searchdir(ino_t inum, char *name) +searchdir(dump_ino_t inum, char *name) { - register struct direct *dp; - register struct inotab *itp; + struct direct *dp; + struct inotab *itp; int len; itp = inotablookup(inum); @@ -361,9 +364,9 @@ static void putdir(char *buf, size_t size) { struct direct cvtbuf; - register struct odirect *odp; + struct odirect *odp; struct odirect *eodp; - register struct direct *dp; + struct direct *dp; long loc, i; if (cvtflag) { @@ -374,7 +377,7 @@ putdir(char *buf, size_t size) putent(&cvtbuf); } } else { - for (loc = 0; loc < size; ) { + for (loc = 0; loc < (long)size; ) { dp = (struct direct *)(buf + loc); #ifdef DIRDEBUG printf ("reclen = %d, namlen = %d, type = %d\n", @@ -383,10 +386,6 @@ putdir(char *buf, size_t size) if (Bcvt) swabst((u_char *)"is", (u_char *) dp); if (oldinofmt && dp->d_ino != 0) { -#ifdef __linux__ - if (Bcvt) - swabst((u_char *)"s", (u_char *)&dp->d_namlen); -#else # if BYTE_ORDER == BIG_ENDIAN if (Bcvt) dp->d_namlen = dp->d_type; @@ -394,16 +393,10 @@ putdir(char *buf, size_t size) if (!Bcvt) dp->d_namlen = dp->d_type; # endif -#endif /* __linux__ */ + if (dp->d_namlen == 0 && dp->d_type != 0) + dp->d_namlen = dp->d_type; dp->d_type = DT_UNKNOWN; } -#ifdef __linux__ - /* - * Horrible hack to read FreeBSD 2.0 dumps - */ - if (!oldinofmt) - swabst((u_char *)"6bs", (u_char *) dp); -#endif /* __linux__ */ #ifdef DIRDEBUG printf ("reclen = %d, namlen = %d, type = %d\n", dp->d_reclen, dp->d_namlen, dp->d_type); @@ -412,7 +405,7 @@ putdir(char *buf, size_t size) if ((dp->d_reclen & 0x3) != 0 || dp->d_reclen > i || dp->d_reclen < DIRSIZ(0, dp) || - dp->d_namlen > NAME_MAX) { + dp->d_namlen > MAXNAMLEN) { Vprintf(stdout, "Mangled directory: "); if ((dp->d_reclen & 0x3) != 0) Vprintf(stdout, @@ -421,10 +414,10 @@ putdir(char *buf, size_t size) Vprintf(stdout, "reclen less than DIRSIZ (%d < %d) ", dp->d_reclen, DIRSIZ(0, dp)); - if (dp->d_namlen > NAME_MAX) + if (dp->d_namlen > MAXNAMLEN) Vprintf(stdout, "reclen name too big (%d > %d) ", - dp->d_namlen, NAME_MAX); + dp->d_namlen, MAXNAMLEN); Vprintf(stdout, "\n"); loc += i; continue; @@ -440,9 +433,9 @@ putdir(char *buf, size_t size) /* * These variables are "local" to the following two functions. */ -char dirbuf[DIRBLKSIZ]; -long dirloc = 0; -long prev = 0; +static char dirbuf[DIRBLKSIZ]; +static long dirloc = 0; +static long prev = 0; /* * add a new directory entry to a file. @@ -454,7 +447,8 @@ putent(struct direct *dp) if (dirloc + dp->d_reclen > DIRBLKSIZ) { ((struct direct *)(dirbuf + prev))->d_reclen = DIRBLKSIZ - prev; - (void) fwrite(dirbuf, 1, DIRBLKSIZ, df); + if ( fwrite(dirbuf, 1, DIRBLKSIZ, df) != DIRBLKSIZ ) + err(1,"cannot write to file %s", dirfile); dirloc = 0; } memmove(dirbuf + dirloc, dp, (size_t)dp->d_reclen); @@ -469,8 +463,11 @@ static void flushent(void) { ((struct direct *)(dirbuf + prev))->d_reclen = DIRBLKSIZ - prev; - (void) fwrite(dirbuf, (int)dirloc, 1, df); + if ( fwrite(dirbuf, (int)dirloc, 1, df) != 1 ) + err(1, "cannot write to file %s", dirfile); seekpt = ftell(df); + if (seekpt == -1) + err(1, "cannot write to file %s", dirfile); dirloc = 0; } @@ -514,7 +511,7 @@ rst_seekdir(RST_DIR *dirp, long loc, long base) struct direct * rst_readdir(RST_DIR *dirp) { - register struct direct *dp; + struct direct *dp; for (;;) { if (dirp->dd_loc == 0) { @@ -556,7 +553,7 @@ rst_opendir(const char *name) { struct inotab *itp; RST_DIR *dirp; - ino_t ino; + dump_ino_t ino; if ((ino = dirlookup(name)) > 0 && (itp = inotablookup(ino)) != NULL) { @@ -586,7 +583,7 @@ static long rst_telldir(RST_DIR *dirp) { return ((long)lseek(dirp->dd_fd, - (off_t)0, SEEK_CUR) - dirp->dd_size + dirp->dd_loc); + (OFF_T)0, SEEK_CUR) - dirp->dd_size + dirp->dd_loc); } /* @@ -595,8 +592,8 @@ rst_telldir(RST_DIR *dirp) static RST_DIR * opendirfile(const char *name) { - register RST_DIR *dirp; - register int fd; + RST_DIR *dirp; + int fd; if ((fd = open(name, O_RDONLY)) == -1) return (NULL); @@ -648,7 +645,8 @@ setdirmodes(int flags) ep->e_flags &= ~NEW; continue; } - if (node.ino == ROOTINO && + if ((flags & FORCE) == 0 && + node.ino == ROOTINO && reply("set owner/mode for '.'") == FAIL) continue; } @@ -677,9 +675,9 @@ setdirmodes(int flags) * Generate a literal copy of a directory. */ int -genliteraldir(char *name, ino_t ino) +genliteraldir(char *name, dump_ino_t ino) { - register struct inotab *itp; + struct inotab *itp; int ofile, dp, i, size; char buf[BUFSIZ]; @@ -714,7 +712,7 @@ genliteraldir(char *name, ino_t ino) * Determine the type of an inode */ int -inodetype(ino_t ino) +inodetype(dump_ino_t ino) { struct inotab *itp; @@ -730,12 +728,12 @@ inodetype(ino_t ino) */ static struct inotab * #ifdef __linux__ -allocinotab(ino_t ino, struct new_bsd_inode *dip, long seekpt) +allocinotab(dump_ino_t ino, struct new_bsd_inode *dip, long seekpt) #else -allocinotab(ino_t ino, struct dinode *dip, long seekpt) +allocinotab(dump_ino_t ino, struct dinode *dip, long seekpt) #endif { - register struct inotab *itp; + struct inotab *itp; struct modeinfo node; itp = calloc(1, sizeof(struct inotab)); @@ -763,7 +761,8 @@ allocinotab(ino_t ino, struct dinode *dip, long seekpt) node.flags = dip->di_flags; node.uid = dip->di_uid; node.gid = dip->di_gid; - (void) fwrite((char *)&node, 1, sizeof(struct modeinfo), mf); + if ( fwrite((char *)&node, 1, sizeof(struct modeinfo), mf) != sizeof(struct modeinfo) ) + err(1,"cannot write to file %s", modefile); return (itp); } @@ -771,9 +770,9 @@ allocinotab(ino_t ino, struct dinode *dip, long seekpt) * Look up an inode in the table of directories */ static struct inotab * -inotablookup(ino_t ino) +inotablookup(dump_ino_t ino) { - register struct inotab *itp; + struct inotab *itp; for (itp = inotab[INOHASH(ino)]; itp != NULL; itp = itp->t_next) if (itp->t_ino == ino)