X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=restore%2Fdirs.c;h=239248809daf0ac99630721b753c5499ba9e9d24;hb=d435f57f01229cd9fa358abe32c4a93077d9090d;hp=45d4cbe0743981208e96fa82ce6544ee4deb83de;hpb=fe0e02857a1ff7db4bf8cb28780de7ecf2f24234;p=dump.git diff --git a/restore/dirs.c b/restore/dirs.c index 45d4cbe..2392488 100644 --- a/restore/dirs.c +++ b/restore/dirs.c @@ -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. * @@ -46,10 +42,11 @@ #ifndef lint static const char rcsid[] = - "$Id: dirs.c,v 1.18 2002/02/04 11:18:46 stelian Exp $"; + "$Id: dirs.c,v 1.24 2003/10/26 16:05:47 stelian Exp $"; #endif /* not lint */ #include +#include #include #include #include @@ -62,8 +59,13 @@ static const char rcsid[] = #endif #include #else /* __linux__ */ +#ifdef sunos +#include +#include +#else #include #include +#endif #endif /* __linux__ */ #include @@ -77,8 +79,12 @@ static const char rcsid[] = #ifdef __linux__ #include #else +#ifdef sunos +#include +#else #include #endif +#endif #include "pathnames.h" #include "restore.h" @@ -155,6 +161,10 @@ static void rst_seekdir __P((RST_DIR *, long, long)); static long rst_telldir __P((RST_DIR *)); static struct direct *searchdir __P((dump_ino_t, char *)); +#ifdef sunos +extern int fdsmtc; +#endif + /* * Extract directory contents, building up a directory structure * on disk for extraction by name. @@ -276,7 +286,7 @@ treescan(char *pname, dump_ino_t ino, long (*todo) __P((char *, dump_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); /* "." */ @@ -296,7 +306,7 @@ treescan(char *pname, dump_ino_t ino, long (*todo) __P((char *, dump_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 { @@ -381,7 +391,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", @@ -397,6 +407,8 @@ putdir(char *buf, size_t size) if (!Bcvt) dp->d_namlen = dp->d_type; # endif + if (dp->d_namlen == 0 && dp->d_type != 0) + dp->d_namlen = dp->d_type; dp->d_type = DT_UNKNOWN; } #ifdef DIRDEBUG @@ -585,7 +597,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); } /* @@ -647,7 +659,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; } @@ -660,8 +673,11 @@ setdirmodes(int flags) if (node.flags) #ifdef __linux__ (void) fsetflags(cp, node.flags); +#else +#ifdef sunos #else (void) chflags(cp, node.flags); +#endif #endif utimes(cp, node.timep); ep->e_flags &= ~NEW; @@ -728,7 +744,7 @@ inodetype(dump_ino_t ino) * If requested, save its pertinent mode, owner, and time info. */ static struct inotab * -#ifdef __linux__ +#if defined(__linux__) || defined(sunos) allocinotab(dump_ino_t ino, struct new_bsd_inode *dip, long seekpt) #else allocinotab(dump_ino_t ino, struct dinode *dip, long seekpt) @@ -747,17 +763,17 @@ allocinotab(dump_ino_t ino, struct dinode *dip, long seekpt) if (mf == NULL) return (itp); node.ino = ino; -#ifdef __linux__ +#if defined(__linux__) || defined(sunos) node.timep[0].tv_sec = dip->di_atime.tv_sec; node.timep[0].tv_usec = dip->di_atime.tv_usec; node.timep[1].tv_sec = dip->di_mtime.tv_sec; node.timep[1].tv_usec = dip->di_mtime.tv_usec; -#else /* __linux__ */ +#else /* __linux__ || sunos */ node.timep[0].tv_sec = dip->di_atime; node.timep[0].tv_usec = dip->di_atimensec / 1000; node.timep[1].tv_sec = dip->di_mtime; node.timep[1].tv_usec = dip->di_mtimensec / 1000; -#endif /* __linux__ */ +#endif /* __linux__ || sunos */ node.mode = dip->di_mode; node.flags = dip->di_flags; node.uid = dip->di_uid;