#ifndef lint
static const char rcsid[] =
- "$Id: utilities.c,v 1.24 2003/11/22 16:52:16 stelian Exp $";
+ "$Id: utilities.c,v 1.29 2005/07/07 09:16:08 stelian Exp $";
#endif /* not lint */
#include <config.h>
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);
*/
#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
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)
if (yflag)
return;
if (reply("abort") == GOOD) {
- if (reply("dump core") == GOOD)
+ if (reply("dump core") == GOOD) {
+ fchdir(wdfd);
abort();
+ }
exit(1);
}
}
(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);
+}