X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=restore%2Fdirs.c;h=b15b1d0a6d1282594b0752b2ba78bf45f05c7955;hp=524128406100a486274603a54bb606cbdf785f3e;hb=e4a8bde40a6d8319d1b28e054e1a419ba3df2363;hpb=109e9e1d1a904627eeae4d519a0f694795b2892c diff --git a/restore/dirs.c b/restore/dirs.c index 5241284..b15b1d0 100644 --- a/restore/dirs.c +++ b/restore/dirs.c @@ -46,15 +46,20 @@ #ifndef lint static const char rcsid[] = - "$Id: dirs.c,v 1.11 2000/12/04 15:43:17 stelian Exp $"; + "$Id: dirs.c,v 1.15 2001/06/18 10:58:28 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 @@ -86,7 +91,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; }; @@ -96,7 +101,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; @@ -136,19 +141,19 @@ struct odirect { }; #ifdef __linux__ -static struct inotab *allocinotab __P((ino_t, struct new_bsd_inode *, long)); +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 @@ -208,12 +213,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"); @@ -244,7 +250,7 @@ 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; @@ -309,7 +315,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]; @@ -332,7 +338,7 @@ 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; @@ -439,7 +445,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); @@ -454,8 +461,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; } @@ -541,7 +551,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) { @@ -662,7 +672,7 @@ 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; int ofile, dp, i, size; @@ -699,7 +709,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; @@ -715,9 +725,9 @@ 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; @@ -748,7 +758,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); } @@ -756,7 +767,7 @@ 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;