[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 04/11] 9p: darwin: Handle struct dirent differences
From: |
Will Cohen |
Subject: |
[PATCH 04/11] 9p: darwin: Handle struct dirent differences |
Date: |
Wed, 13 Oct 2021 19:03:58 -0400 |
From: Keno Fischer <keno@juliacomputing.com>
On darwin d_seekoff exists, but is optional and does not seem to
be commonly used by file systems. Use `telldir` instead to obtain
the seek offset.
Signed-off-by: Keno Fischer <keno@juliacomputing.com>
Signed-off-by: Michael Roitzsch <reactorcontrol@icloud.com>
---
hw/9pfs/9p-synth.c | 2 ++
hw/9pfs/9p.c | 33 +++++++++++++++++++++++++++++++--
hw/9pfs/codir.c | 4 ++++
3 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/hw/9pfs/9p-synth.c b/hw/9pfs/9p-synth.c
index 4a4a776d06..09b9c25288 100644
--- a/hw/9pfs/9p-synth.c
+++ b/hw/9pfs/9p-synth.c
@@ -222,7 +222,9 @@ static void synth_direntry(V9fsSynthNode *node,
{
strcpy(entry->d_name, node->name);
entry->d_ino = node->attr->inode;
+#ifndef CONFIG_DARWIN
entry->d_off = off + 1;
+#endif
}
static struct dirent *synth_get_dentry(V9fsSynthNode *dir,
diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c
index 17b62d72fc..2464ffeb94 100644
--- a/hw/9pfs/9p.c
+++ b/hw/9pfs/9p.c
@@ -2202,6 +2202,25 @@ static int v9fs_xattr_read(V9fsState *s, V9fsPDU *pdu,
V9fsFidState *fidp,
return offset;
}
+/**
+ * Get the seek offset of a dirent. If not available from the structure itself,
+ * obtain it by calling telldir.
+ */
+static int v9fs_dent_telldir(V9fsPDU *pdu, V9fsFidState *fidp,
+ struct dirent *dent)
+{
+#ifdef CONFIG_DARWIN
+ /*
+ * Darwin has d_seekoff, which appears to function similarly to d_off.
+ * However, it does not appear to be supported on all file systems,
+ * so use telldir for correctness.
+ */
+ return telldir(fidp->fs.dir.stream);
+#else
+ return dent->d_off;
+#endif
+}
+
static int coroutine_fn v9fs_do_readdir_with_stat(V9fsPDU *pdu,
V9fsFidState *fidp,
uint32_t max_count)
@@ -2265,7 +2284,11 @@ static int coroutine_fn
v9fs_do_readdir_with_stat(V9fsPDU *pdu,
count += len;
v9fs_stat_free(&v9stat);
v9fs_path_free(&path);
- saved_dir_pos = dent->d_off;
+ saved_dir_pos = v9fs_dent_telldir(pdu, fidp, dent);
+ if (saved_dir_pos < 0) {
+ err = saved_dir_pos;
+ break;
+ }
}
v9fs_readdir_unlock(&fidp->fs.dir);
@@ -2404,6 +2427,7 @@ static int coroutine_fn v9fs_do_readdir(V9fsPDU *pdu,
V9fsFidState *fidp,
V9fsString name;
int len, err = 0;
int32_t count = 0;
+ off_t off;
struct dirent *dent;
struct stat *st;
struct V9fsDirEnt *entries = NULL;
@@ -2464,12 +2488,17 @@ static int coroutine_fn v9fs_do_readdir(V9fsPDU *pdu,
V9fsFidState *fidp,
qid.version = 0;
}
+ off = v9fs_dent_telldir(pdu, fidp, dent);
+ if (off < 0) {
+ err = off;
+ break;
+ }
v9fs_string_init(&name);
v9fs_string_sprintf(&name, "%s", dent->d_name);
/* 11 = 7 + 4 (7 = start offset, 4 = space for storing count) */
len = pdu_marshal(pdu, 11 + count, "Qqbs",
- &qid, dent->d_off,
+ &qid, off,
dent->d_type, &name);
v9fs_string_free(&name);
diff --git a/hw/9pfs/codir.c b/hw/9pfs/codir.c
index 032cce04c4..78aca1d98b 100644
--- a/hw/9pfs/codir.c
+++ b/hw/9pfs/codir.c
@@ -167,7 +167,11 @@ static int do_readdir_many(V9fsPDU *pdu, V9fsFidState
*fidp,
}
size += len;
+#ifdef CONFIG_DARWIN
+ saved_dir_pos = telldir(fidp->fs.dir.stream);
+#else
saved_dir_pos = dent->d_off;
+#endif
}
/* restore (last) saved position */
--
2.33.0
- [PATCH 00/11] 9p: Add support for Darwin, Will Cohen, 2021/10/13
- [PATCH 00/11] 9p: Add support for Darwin, Will Cohen, 2021/10/13
- [PATCH 00/11] 9p: Add support for Darwin, Will Cohen, 2021/10/13
- [PATCH 02/11] 9p: Rename 9p-util -> 9p-util-linux, Will Cohen, 2021/10/13
- [PATCH 03/11] 9p: darwin: Handle struct stat(fs) differences, Will Cohen, 2021/10/13
- [PATCH 04/11] 9p: darwin: Handle struct dirent differences,
Will Cohen <=
- [PATCH 09/11] 9p: darwin: Provide a fallback implementation for utimensat, Will Cohen, 2021/10/13
- [PATCH 10/11] 9p: darwin: Implement compatibility for mknodat, Will Cohen, 2021/10/13
- [PATCH 07/11] 9p: darwin: *xattr_nofollow implementations, Will Cohen, 2021/10/13
- [PATCH 11/11] 9p: darwin: meson: Allow VirtFS on Darwin, Will Cohen, 2021/10/13
- [PATCH 01/11] 9p: linux: Fix a couple Linux assumptions, Will Cohen, 2021/10/13
- [PATCH 06/11] 9p: darwin: Compatibility defn for XATTR_SIZE_MAX, Will Cohen, 2021/10/13
- [PATCH 08/11] 9p: darwin: Compatibility for f/l*xattr, Will Cohen, 2021/10/13
- [PATCH 05/11] 9p: darwin: Ignore O_{NOATIME, DIRECT}, Will Cohen, 2021/10/13
- Re: [PATCH 00/11] 9p: Add support for Darwin, Greg Kurz, 2021/10/14