[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH hurd] netfs and diskfs: make showtrans work correctly when transl
From: |
Flavio Cruz |
Subject: |
[PATCH hurd] netfs and diskfs: make showtrans work correctly when translators are set on top of sylink/device/fifo/socket files. |
Date: |
Wed, 10 Jul 2024 17:05:34 +0100 |
While these are short-circuited translators and simply change st_mode,
actual translators can be set on top. We want `showtrans` to
show the actual passive translator, not the short-circuited one.
---
libdiskfs/file-get-trans.c | 37 ++++++++++++++++------------------
libnetfs/file-get-translator.c | 30 +++++++++++++--------------
2 files changed, 32 insertions(+), 35 deletions(-)
diff --git a/libdiskfs/file-get-trans.c b/libdiskfs/file-get-trans.c
index b1ca6c0..7b204b7 100644
--- a/libdiskfs/file-get-trans.c
+++ b/libdiskfs/file-get-trans.c
@@ -37,8 +37,22 @@ diskfs_S_file_get_translator (struct protid *cred,
pthread_mutex_lock (&np->lock);
- /* First look for short-circuited translators. */
- if (S_ISLNK (np->dn_stat.st_mode))
+ if (np->dn_stat.st_mode & S_IPTRANS)
+ {
+ char *string;
+ mach_msg_type_number_t len;
+ err = diskfs_get_translator (np, &string, &len);
+ if (!err)
+ {
+ if (len > *translen)
+ *trans = mmap (0, len, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
+ memcpy (*trans, string, len);
+ *translen = len;
+ free (string);
+ }
+ }
+ /* Check for short-circuited translators. */
+ else if (S_ISLNK (np->dn_stat.st_mode))
{
unsigned int len = sizeof _HURD_SYMLINK + np->dn_stat.st_size + 1;
mach_msg_type_number_t amt;
@@ -113,24 +127,7 @@ diskfs_S_file_get_translator (struct protid *cred,
err = 0;
}
else
- {
- if (! (np->dn_stat.st_mode & S_IPTRANS))
- err = EINVAL;
- else
- {
- char *string;
- mach_msg_type_number_t len;
- err = diskfs_get_translator (np, &string, &len);
- if (!err)
- {
- if (len > *translen)
- *trans = mmap (0, len, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
- memcpy (*trans, string, len);
- *translen = len;
- free (string);
- }
- }
- }
+ err = EINVAL;
pthread_mutex_unlock (&np->lock);
diff --git a/libnetfs/file-get-translator.c b/libnetfs/file-get-translator.c
index f402250..63c74c0 100644
--- a/libnetfs/file-get-translator.c
+++ b/libnetfs/file-get-translator.c
@@ -47,7 +47,21 @@ netfs_S_file_get_translator (struct protid *user,
return err;
}
- if (S_ISLNK (np->nn_stat.st_mode))
+ if (np->nn_translated & S_IPTRANS)
+ {
+ char *string = NULL;
+ mach_msg_type_number_t len = 0;
+ err = netfs_get_translator (np, &string, &len);
+ if (!err)
+ {
+ if (len > *translen)
+ *trans = mmap (0, len, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
+ memcpy (*trans, string, len);
+ *translen = len;
+ free (string);
+ }
+ }
+ else if (S_ISLNK (np->nn_stat.st_mode))
{
unsigned int len = sizeof _HURD_SYMLINK + np->nn_stat.st_size + 1;
@@ -113,20 +127,6 @@ netfs_S_file_get_translator (struct protid *user,
*translen = len;
err = 0;
}
- else if (np->nn_translated & S_IPTRANS)
- {
- char *string = NULL;
- mach_msg_type_number_t len = 0;
- err = netfs_get_translator (np, &string, &len);
- if (!err)
- {
- if (len > *translen)
- *trans = mmap (0, len, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
- memcpy (*trans, string, len);
- *translen = len;
- free (string);
- }
- }
else
err = EINVAL;
--
2.45.2
- [PATCH hurd] netfs and diskfs: make showtrans work correctly when translators are set on top of sylink/device/fifo/socket files.,
Flavio Cruz <=