]> git.wh0rd.org - dump.git/blobdiff - restore/utilities.c
Regenerate configure.
[dump.git] / restore / utilities.c
index e96dcf319fd97d70251005edc8a1539bba79edaf..67b223ee26542298de4794621dfb8d3fb000fb3f 100644 (file)
@@ -37,7 +37,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-       "$Id: utilities.c,v 1.25 2004/12/14 14:07:58 stelian Exp $";
+       "$Id: utilities.c,v 1.30 2010/06/11 11:19:17 stelian Exp $";
 #endif /* not lint */
 
 #include <config.h>
@@ -189,7 +189,7 @@ removenode(struct entry *ep)
                badentry(ep, "removenode: not a node");
        if (ep->e_entries != NULL) {
                int i;
-               for (i = 0; i < DIRHASH_SIZE; i++) {
+               for (i = 0; i < dirhash_size; i++) {
                        if (ep->e_entries[i] != NULL)
                                badentry(ep, "removenode: non-empty directory");
                }
@@ -269,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
@@ -378,9 +378,9 @@ badentry(struct entry *ep, const char *msg)
                fprintf(stderr, "sibling name: %s\n", myname(ep->e_sibling));
        if (ep->e_entries != NULL) {
                int i;
-               for (i = 0; i < DIRHASH_SIZE; 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[0]));
+                               fprintf(stderr, "next entry name: %s\n", myname(ep->e_entries[i]));
                                break;
                        }
                }
@@ -487,8 +487,11 @@ panic(fmt, va_alist)
        if (yflag)
                return;
        if (reply("abort") == GOOD) {
-               if (reply("dump core") == GOOD)
+               if (reply("dump core") == GOOD) {
+                       if (fchdir(wdfd) < 0)
+                               warn("fchdir");
                        abort();
+               }
                exit(1);
        }
 }
@@ -724,9 +727,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);
+}