]> git.wh0rd.org - dump.git/blobdiff - restore/utilities.c
Fix a small bug on an error path introduced by the hashtree patch.
[dump.git] / restore / utilities.c
index d0539383a306ab194ae13c51998100acc2c2d5b3..f17bd9ce458a7214ab50050f787c794d79a033a1 100644 (file)
@@ -37,7 +37,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: utilities.c,v 1.23 2003/10/26 16:05:48 stelian Exp $";
+       "$Id: utilities.c,v 1.28 2005/03/30 13:21:45 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
@@ -187,8 +187,13 @@ removenode(struct entry *ep)
 
        if (ep->e_type != NODE)
                badentry(ep, "removenode: not a node");
-       if (ep->e_entries != NULL)
-               badentry(ep, "removenode: non-empty directory");
+       if (ep->e_entries != NULL) {
+               int i;
+               for (i = 0; i < DIRHASH_SIZE; i++) {
+                       if (ep->e_entries[i] != NULL)
+                               badentry(ep, "removenode: non-empty directory");
+               }
+       }
        ep->e_flags |= REMOVED;
        ep->e_flags &= ~TMPNAME;
        cp = myname(ep);
@@ -264,10 +269,10 @@ linkit(char *existing, char *new, int type)
                         */
 #ifdef sunos
 #else
-                       if (fgetflags (existing, &s) != -1 &&
-                           fsetflags (existing, 0) != -1) {
+                       if (lgetflags (existing, &s) != -1 &&
+                           lsetflags (existing, 0) != -1) {
                                ret = link(existing, new);
-                               fsetflags(existing, s);
+                               lsetflags(existing, s);
                        }
 #endif
 #endif
@@ -371,8 +376,15 @@ badentry(struct entry *ep, const char *msg)
        fprintf(stderr, "parent name %s\n", myname(ep->e_parent));
        if (ep->e_sibling != NULL)
                fprintf(stderr, "sibling name: %s\n", myname(ep->e_sibling));
-       if (ep->e_entries != NULL)
-               fprintf(stderr, "next entry name: %s\n", myname(ep->e_entries));
+       if (ep->e_entries != NULL) {
+               int i;
+               for (i = 0; i < DIRHASH_SIZE; i++) {
+                       if (ep->e_entries[i] != NULL) {
+                               fprintf(stderr, "next entry name: %s\n", myname(ep->e_entries[i]));
+                               break;
+                       }
+               }
+       }
        if (ep->e_links != NULL)
                fprintf(stderr, "next link name: %s\n", myname(ep->e_links));
        if (ep->e_next != NULL)
@@ -475,8 +487,10 @@ panic(fmt, va_alist)
        if (yflag)
                return;
        if (reply("abort") == GOOD) {
-               if (reply("dump core") == GOOD)
+               if (reply("dump core") == GOOD) {
+                       fchdir(wdfd);
                        abort();
+               }
                exit(1);
        }
 }
@@ -506,7 +520,7 @@ void resizemaps(dump_ino_t oldmax, dump_ino_t newmax)
 void
 GetPathFile(char *source, char *path, char *fname)
 {
-       char    *p, *s;
+       char *p, *s;
 
        *path = 0;
        *fname = 0;
@@ -606,13 +620,13 @@ Inode2Tapepos(dump_ino_t ino, long *tnum, long long *tpos, int exactmatch)
 int
 GetSCSIIDFromPath(char *devPath, long *id)
 {
-       int                             len;
-       char                    fbuff[2048];
-       char                    path[2048];
-       char                    fname[2048];
-       char                    *fpn = fname;
-       char                    idstr[32];
-       char                    *ip = idstr;
+       int     len;
+       char    fbuff[2048];
+       char    path[2048];
+       char    fname[2048];
+       char    *fpn = fname;
+       char    idstr[32];
+       char    *ip = idstr;
 
        bzero(fbuff, sizeof(fbuff));
        if ((len = readlink(devPath, fbuff, 2048)) == -1) {
@@ -643,17 +657,14 @@ int
 CreateAppleDoubleFileRes(char *oFile, FndrFileInfo *finderinfo, mode_t mode, int flags,
                struct timeval *timep, u_int32_t uid, u_int32_t gid)
 {
-       int                             err = 0;
-       int                             fdout;
-       char                    *p;
-       char                    *f;
-       char                    *pp;
+       int             err = 0;
+       int             fdout;
+       char            *p;
+       char            *pp;
        ASDHeaderPtr    hp;
-       ASDEntryPtr             ep;
-       long                    thesize;
-       long                    n;
-       long                    loops;
-       long                    remain;
+       ASDEntryPtr     ep;
+       long            thesize;
+       long            n;
 
 
        n = 1;  /* number of entries in double file ._ only finderinfo */
@@ -715,9 +726,46 @@ CreateAppleDoubleFileRes(char *oFile, FndrFileInfo *finderinfo, mode_t mode, int
        (void)fchown(fdout, uid, gid);
        (void)fchmod(fdout, mode);
        close(fdout);
-       (void)fsetflags(oFile, flags);
+       (void)lsetflags(oFile, flags);
        utimes(oFile, timep);
        free(pp);
        return err;
 }
 #endif /* DUMP_MACOSX */
+
+int
+lgetflags(const char *path, unsigned long *flags)
+{
+       int err;
+       struct STAT sb;
+
+       err = LSTAT(path, &sb);
+       if (err < 0)
+               return err;
+
+       if (S_ISLNK(sb.st_mode) || S_ISFIFO(sb.st_mode)) {
+               // no way to get/set flags on a symlink
+               *flags = 0;
+               return 0;
+       }
+       else
+               return fgetflags(path, flags);
+}
+
+int
+lsetflags(const char *path, unsigned long flags)
+{
+       int err;
+       struct STAT sb;
+
+       err = LSTAT(path, &sb);
+       if (err < 0)
+               return err;
+
+       if (S_ISLNK(sb.st_mode) || S_ISFIFO(sb.st_mode)) {
+               // no way to get/set flags on a symlink
+               return 0;
+       }
+       else
+               return fsetflags(path, flags);
+}