X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=restore%2Fdirs.c;h=dc45e7c7545b4b140c415f5f3f6f743e6e2bf149;hp=60f5b23673b15eebe42576aa3887ded3b2e8c894;hb=83a6b4df0b7b7aecc0d3940549d0d480adff35a6;hpb=5d2a3d246d400d45dfd4c49ddb588c69fb60873d diff --git a/restore/dirs.c b/restore/dirs.c index 60f5b23..dc45e7c 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,7 +42,7 @@ #ifndef lint static const char rcsid[] = - "$Id: dirs.c,v 1.17 2002/01/25 15:08:59 stelian Exp $"; + "$Id: dirs.c,v 1.23 2003/03/30 15:40:38 stelian Exp $"; #endif /* not lint */ #include @@ -140,7 +136,7 @@ struct odirect { char d_name[ODIRSIZ]; }; -#ifdef __linux__ +#if defined(__linux__) || defined(sunos) static struct inotab *allocinotab __P((dump_ino_t, struct new_bsd_inode *, long)); #else static struct inotab *allocinotab __P((dump_ino_t, struct dinode *, long)); @@ -165,7 +161,7 @@ void extractdirs(int genmode) { int i; -#ifdef __linux__ +#if defined(__linux__) || defined(sunos) struct new_bsd_inode *ip; #else struct dinode *ip; @@ -276,7 +272,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 +292,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 { @@ -325,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; @@ -377,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", @@ -393,6 +393,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 @@ -431,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. @@ -581,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); } /* @@ -643,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; }