Support for nanosec times on FBSD and other FBSD fixes
diff --git a/lib/fuse.c b/lib/fuse.c
index 16eb7ad..14789b7 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -702,16 +702,16 @@
 static int mtime_eq(const struct stat *stbuf, const struct timespec *ts)
 {
     return stbuf->st_mtime == ts->tv_sec
-#ifdef HAVE_STRUCT_STAT_ST_ATIM
-        && stbuf->st_mtim.tv_nsec == ts->tv_nsec
+#ifdef FUSE_STAT_HAS_NANOSEC
+        && ST_MTIM(stbuf).tv_nsec == ts->tv_nsec
 #endif
         ;
 }
 
 static void mtime_set(const struct stat *stbuf, struct timespec *ts)
 {
-#ifdef HAVE_STRUCT_STAT_ST_ATIM
-    *ts = stbuf->st_mtim;
+#ifdef FUSE_STAT_HAS_NANOSEC
+    *ts = ST_MTIM(stbuf);
 #else
     ts->tv_sec = stbuf->st_mtime;
 #endif
@@ -1027,8 +1027,15 @@
     err = -ENOSYS;
     if (f->op.utimens) {
         struct timespec tv[2];
-        tv[0] = attr->st_atim;
-        tv[1] = attr->st_mtim;
+#ifdef FUSE_STAT_HAS_NANOSEC
+        tv[0] = ST_ATIM(attr);
+        tv[1] = ST_MTIM(attr);
+#else
+        tv[0].tv_sec = attr->st_atime;
+        tv[0].tv_nsec = 0;
+        tv[1].tv_sec = attr->st_mtime;
+        tv[1].tv_nsec = 0;
+#endif
         fuse_prepare_interrupt(f, req, &d);
         err = f->op.utimens(path, tv);
         fuse_finish_interrupt(f, req, &d);
@@ -2973,7 +2980,7 @@
     return fuse_do_opendir(f, req, path, fi);
 }
 
-static int fuse_do_statfs(struct fuse *f, fuse_req_t req, struct statvfs *buf)
+static int fuse_compat_statfs(struct fuse *f, fuse_req_t req, struct statvfs *buf)
 {
     return fuse_do_statfs(f, req, "/", buf);
 }