- if (dumpmap) {
- map = calloc((unsigned)1, (unsigned)howmany(newmax, NBBY));
- if (map == NULL)
- errx(1, "no memory for file dump list");
- memcpy(map, dumpmap, howmany(oldmax, NBBY));
- free(dumpmap);
- dumpmap = map;
+
+ /* write the ASDHeader */
+ if (write(fdout, pp, sizeof(ASDHeader) - CORRECT) == -1) {
+ err = errno;
+ close(fdout);
+ free(pp);
+ unlink(oFile);
+ return err;
+ }
+ /* write the ASDEntries */
+ if (write(fdout, pp + sizeof(ASDHeader), thesize - sizeof(ASDHeader)) == -1) {
+ err = errno;
+ close(fdout);
+ free(pp);
+ unlink(oFile);
+ return err;
+ }
+
+ (void)fchown(fdout, uid, gid);
+ (void)fchmod(fdout, mode);
+ close(fdout);
+ (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;