merge FreeBSD stuff
diff --git a/lib/fuse.c b/lib/fuse.c
index 5c5eb0a..8966fab 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -18,6 +18,7 @@
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
+#include <fcntl.h>
#include <limits.h>
#include <errno.h>
#include <assert.h>
@@ -804,7 +805,18 @@
fflush(stdout);
}
err = -ENOSYS;
- if (f->op.mknod && f->op.getattr) {
+ if (S_ISREG(mode) && f->op.create && f->op.getattr) {
+ struct fuse_file_info fi;
+
+ memset(&fi, 0, sizeof(fi));
+ fi.flags = O_CREAT | O_EXCL | O_WRONLY;
+ err = f->op.create(path, mode, &fi);
+ if (!err) {
+ err = lookup_path(f, parent, name, path, &e, &fi);
+ if (f->op.release)
+ f->op.release(path, &fi);
+ }
+ } else if (f->op.mknod && f->op.getattr) {
err = f->op.mknod(path, mode, rdev);
if (!err)
err = lookup_path(f, parent, name, path, &e, NULL);
@@ -1937,6 +1949,13 @@
else
free(xopts);
}
+#ifdef __FreeBSD__
+ /*
+ * In FreeBSD, we always use these settings as inode numbers are needed to
+ * make getcwd(3) work.
+ */
+ f->flags |= FUSE_READDIR_INO;
+#endif
return 0;
}