+
+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);
+}