]> git.wh0rd.org - dump.git/blobdiff - restore/dirs.c
Fixed restore of Solaris 7 ufsdump.
[dump.git] / restore / dirs.c
index 45d4cbe0743981208e96fa82ce6544ee4deb83de..239248809daf0ac99630721b753c5499ba9e9d24 100644 (file)
  * 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.
  *
 
 #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 <config.h>
+#include <sys/types.h>
 #include <sys/param.h>
 #include <sys/file.h>
 #include <sys/stat.h>
@@ -62,8 +59,13 @@ static const char rcsid[] =
 #endif
 #include <bsdcompat.h>
 #else  /* __linux__ */
+#ifdef sunos
+#include <sys/fcntl.h>
+#include <bsdcompat.h>
+#else
 #include <ufs/ufs/dinode.h>
 #include <ufs/ufs/dir.h>
+#endif
 #endif /* __linux__ */
 #include <protocols/dumprestore.h>
 
@@ -77,8 +79,12 @@ static const char rcsid[] =
 #ifdef __linux__
 #include <endian.h>
 #else
+#ifdef sunos
+#include <arpa/nameser_compat.h>
+#else
 #include <machine/endian.h>
 #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;