passthrough_hp: include . and .. in readdir
authorJoanne Koong <joannelkoong@gmail.com>
Fri, 5 Jul 2024 21:54:15 +0000 (14:54 -0700)
committerBernd Schubert <bernd.schubert@fastmail.fm>
Mon, 8 Jul 2024 21:29:57 +0000 (23:29 +0200)
generic/401 fails currently because it checks that "." and ".." are
listed as directory entries.

Include "." and ".." as listed directory entries in passthrough_hp's
readdir implementation.

Signed-off by: Joanne Koong <joannelkoong@gmail.com>

example/passthrough_hp.cc

index 02f77f5ae08bca1bc70a8c5c3bdb278367b69027..e3c82250a3d19962d20e11a6e7445d919e728be9 100644 (file)
@@ -747,15 +747,20 @@ static void do_readdir(fuse_req_t req, fuse_ino_t ino, size_t size,
             break; // End of stream
         }
         d->offset = entry->d_off;
-        if (is_dot_or_dotdot(entry->d_name))
-            continue;
 
         fuse_entry_param e{};
         size_t entsize;
         if (plus) {
-            err = do_lookup(ino, entry->d_name, &e);
-            if (err)
-                goto error;
+            if (is_dot_or_dotdot(entry->d_name)) {
+               /* fuse kernel ignores attributes for these and also does
+                * not increase lookup count (see fuse_direntplus_link) */
+               e.attr.st_ino = entry->d_ino;
+               e.attr.st_mode = entry->d_type << 12;
+            } else {
+                err = do_lookup(ino, entry->d_name, &e);
+                if (err)
+                    goto error;
+            }
             entsize = fuse_add_direntry_plus(req, p, rem, entry->d_name, &e, entry->d_off);
         } else {
             e.attr.st_ino = entry->d_ino;