aboutsummaryrefslogtreecommitdiffstats
path: root/example
diff options
context:
space:
mode:
authorBernd Schubert <bernd@bsbernd.com>2024-12-28 15:10:03 +0100
committerBernd Schubert <bernd@bsbernd.com>2024-12-30 23:04:11 +0100
commit24f5b129c4e1b03ebbd05ac0c7673f306facea1a (patch)
treee16f5b02a829457efab3f98ebbe54271e581a7f6 /example
parent3d90402f9084edb90ddb00d6ccd8c2183e6df140 (diff)
downloadlibfuse-24f5b129c4e1b03ebbd05ac0c7673f306facea1a.tar.gz
Add 64-bit conn::{capable,want}_ext fields
The previous fields are left for ABI compatibility, although it is not beautiful to add that complexity when we have to increase the so-version as we had ABI breakage anyway. example/printcap is simplified to use an array, as every line would have needed to be modified anyway. Missing 'FUSE_CAP_PASSTHROUGH' was added. Signed-off-by: Bernd Schubert <bernd@bsbernd.com>
Diffstat (limited to 'example')
-rw-r--r--example/passthrough_ll.c22
-rw-r--r--example/printcap.c113
2 files changed, 66 insertions, 69 deletions
diff --git a/example/passthrough_ll.c b/example/passthrough_ll.c
index 309d8dd..5f1fde9 100644
--- a/example/passthrough_ll.c
+++ b/example/passthrough_ll.c
@@ -168,18 +168,20 @@ static bool lo_debug(fuse_req_t req)
static void lo_init(void *userdata,
struct fuse_conn_info *conn)
{
- struct lo_data *lo = (struct lo_data*) userdata;
-
- if (lo->writeback &&
- conn->capable & FUSE_CAP_WRITEBACK_CACHE) {
- if (lo->debug)
- fuse_log(FUSE_LOG_DEBUG, "lo_init: activating writeback\n");
- conn->want |= FUSE_CAP_WRITEBACK_CACHE;
+ struct lo_data *lo = (struct lo_data *)userdata;
+ bool has_flag;
+
+ if (lo->writeback) {
+ has_flag = fuse_set_feature_flag(conn, FUSE_CAP_WRITEBACK_CACHE);
+ if (lo->debug && has_flag)
+ fuse_log(FUSE_LOG_DEBUG,
+ "lo_init: activating writeback\n");
}
if (lo->flock && conn->capable & FUSE_CAP_FLOCK_LOCKS) {
- if (lo->debug)
- fuse_log(FUSE_LOG_DEBUG, "lo_init: activating flock locks\n");
- conn->want |= FUSE_CAP_FLOCK_LOCKS;
+ has_flag = fuse_set_feature_flag(conn, FUSE_CAP_FLOCK_LOCKS);
+ if (lo->debug && has_flag)
+ fuse_log(FUSE_LOG_DEBUG,
+ "lo_init: activating flock locks\n");
}
/* Disable the receiving and processing of FUSE_INTERRUPT requests */
diff --git a/example/printcap.c b/example/printcap.c
index 01b4d3f..82a7598 100644
--- a/example/printcap.c
+++ b/example/printcap.c
@@ -29,68 +29,63 @@
struct fuse_session *se;
-static void pc_init(void *userdata,
- struct fuse_conn_info *conn)
+// Define a structure to hold capability information
+struct cap_info {
+ uint64_t flag;
+ const char *name;
+};
+
+// Define an array of all capabilities
+static const struct cap_info capabilities[] = {
+ {FUSE_CAP_ASYNC_READ, "FUSE_CAP_ASYNC_READ"},
+ {FUSE_CAP_POSIX_LOCKS, "FUSE_CAP_POSIX_LOCKS"},
+ {FUSE_CAP_ATOMIC_O_TRUNC, "FUSE_CAP_ATOMIC_O_TRUNC"},
+ {FUSE_CAP_EXPORT_SUPPORT, "FUSE_CAP_EXPORT_SUPPORT"},
+ {FUSE_CAP_DONT_MASK, "FUSE_CAP_DONT_MASK"},
+ {FUSE_CAP_SPLICE_MOVE, "FUSE_CAP_SPLICE_MOVE"},
+ {FUSE_CAP_SPLICE_READ, "FUSE_CAP_SPLICE_READ"},
+ {FUSE_CAP_SPLICE_WRITE, "FUSE_CAP_SPLICE_WRITE"},
+ {FUSE_CAP_FLOCK_LOCKS, "FUSE_CAP_FLOCK_LOCKS"},
+ {FUSE_CAP_IOCTL_DIR, "FUSE_CAP_IOCTL_DIR"},
+ {FUSE_CAP_AUTO_INVAL_DATA, "FUSE_CAP_AUTO_INVAL_DATA"},
+ {FUSE_CAP_READDIRPLUS, "FUSE_CAP_READDIRPLUS"},
+ {FUSE_CAP_READDIRPLUS_AUTO, "FUSE_CAP_READDIRPLUS_AUTO"},
+ {FUSE_CAP_ASYNC_DIO, "FUSE_CAP_ASYNC_DIO"},
+ {FUSE_CAP_WRITEBACK_CACHE, "FUSE_CAP_WRITEBACK_CACHE"},
+ {FUSE_CAP_NO_OPEN_SUPPORT, "FUSE_CAP_NO_OPEN_SUPPORT"},
+ {FUSE_CAP_PARALLEL_DIROPS, "FUSE_CAP_PARALLEL_DIROPS"},
+ {FUSE_CAP_POSIX_ACL, "FUSE_CAP_POSIX_ACL"},
+ {FUSE_CAP_CACHE_SYMLINKS, "FUSE_CAP_CACHE_SYMLINKS"},
+ {FUSE_CAP_NO_OPENDIR_SUPPORT, "FUSE_CAP_NO_OPENDIR_SUPPORT"},
+ {FUSE_CAP_EXPLICIT_INVAL_DATA, "FUSE_CAP_EXPLICIT_INVAL_DATA"},
+ {FUSE_CAP_EXPIRE_ONLY, "FUSE_CAP_EXPIRE_ONLY"},
+ {FUSE_CAP_SETXATTR_EXT, "FUSE_CAP_SETXATTR_EXT"},
+ {FUSE_CAP_HANDLE_KILLPRIV, "FUSE_CAP_HANDLE_KILLPRIV"},
+ {FUSE_CAP_HANDLE_KILLPRIV_V2, "FUSE_CAP_HANDLE_KILLPRIV_V2"},
+ {FUSE_CAP_DIRECT_IO_ALLOW_MMAP, "FUSE_CAP_DIRECT_IO_ALLOW_MMAP"},
+ {FUSE_CAP_NO_EXPORT_SUPPORT, "FUSE_CAP_NO_EXPORT_SUPPORT"},
+ {FUSE_CAP_PASSTHROUGH, "FUSE_CAP_PASSTHROUGH"},
+ // Add any new capabilities here
+ {0, NULL} // Sentinel to mark the end of the array
+};
+
+static void print_capabilities(struct fuse_conn_info *conn)
+{
+ printf("Capabilities:\n");
+ for (const struct cap_info *cap = capabilities; cap->name != NULL; cap++) {
+ if (fuse_get_feature_flag(conn, cap->flag)) {
+ printf("\t%s\n", cap->name);
+ }
+ }
+}
+
+static void pc_init(void *userdata, struct fuse_conn_info *conn)
{
(void) userdata;
-
+
printf("Protocol version: %d.%d\n", conn->proto_major,
conn->proto_minor);
- printf("Capabilities:\n");
- if(conn->capable & FUSE_CAP_ASYNC_READ)
- printf("\tFUSE_CAP_ASYNC_READ\n");
- if(conn->capable & FUSE_CAP_POSIX_LOCKS)
- printf("\tFUSE_CAP_POSIX_LOCKS\n");
- if(conn->capable & FUSE_CAP_ATOMIC_O_TRUNC)
- printf("\tFUSE_CAP_ATOMIC_O_TRUNC\n");
- if(conn->capable & FUSE_CAP_EXPORT_SUPPORT)
- printf("\tFUSE_CAP_EXPORT_SUPPORT\n");
- if(conn->capable & FUSE_CAP_DONT_MASK)
- printf("\tFUSE_CAP_DONT_MASK\n");
- if(conn->capable & FUSE_CAP_SPLICE_MOVE)
- printf("\tFUSE_CAP_SPLICE_MOVE\n");
- if(conn->capable & FUSE_CAP_SPLICE_READ)
- printf("\tFUSE_CAP_SPLICE_READ\n");
- if(conn->capable & FUSE_CAP_SPLICE_WRITE)
- printf("\tFUSE_CAP_SPLICE_WRITE\n");
- if(conn->capable & FUSE_CAP_FLOCK_LOCKS)
- printf("\tFUSE_CAP_FLOCK_LOCKS\n");
- if(conn->capable & FUSE_CAP_IOCTL_DIR)
- printf("\tFUSE_CAP_IOCTL_DIR\n");
- if(conn->capable & FUSE_CAP_AUTO_INVAL_DATA)
- printf("\tFUSE_CAP_AUTO_INVAL_DATA\n");
- if(conn->capable & FUSE_CAP_READDIRPLUS)
- printf("\tFUSE_CAP_READDIRPLUS\n");
- if(conn->capable & FUSE_CAP_READDIRPLUS_AUTO)
- printf("\tFUSE_CAP_READDIRPLUS_AUTO\n");
- if(conn->capable & FUSE_CAP_ASYNC_DIO)
- printf("\tFUSE_CAP_ASYNC_DIO\n");
- if(conn->capable & FUSE_CAP_WRITEBACK_CACHE)
- printf("\tFUSE_CAP_WRITEBACK_CACHE\n");
- if(conn->capable & FUSE_CAP_NO_OPEN_SUPPORT)
- printf("\tFUSE_CAP_NO_OPEN_SUPPORT\n");
- if(conn->capable & FUSE_CAP_PARALLEL_DIROPS)
- printf("\tFUSE_CAP_PARALLEL_DIROPS\n");
- if(conn->capable & FUSE_CAP_POSIX_ACL)
- printf("\tFUSE_CAP_POSIX_ACL\n");
- if(conn->capable & FUSE_CAP_CACHE_SYMLINKS)
- printf("\tFUSE_CAP_CACHE_SYMLINKS\n");
- if(conn->capable & FUSE_CAP_NO_OPENDIR_SUPPORT)
- printf("\tFUSE_CAP_NO_OPENDIR_SUPPORT\n");
- if(conn->capable & FUSE_CAP_EXPLICIT_INVAL_DATA)
- printf("\tFUSE_CAP_EXPLICIT_INVAL_DATA\n");
- if(conn->capable & FUSE_CAP_EXPIRE_ONLY)
- printf("\tFUSE_CAP_EXPIRE_ONLY\n");
- if(conn->capable & FUSE_CAP_SETXATTR_EXT)
- printf("\tFUSE_CAP_SETXATTR_EXT\n");
- if(conn->capable & FUSE_CAP_HANDLE_KILLPRIV)
- printf("\tFUSE_CAP_HANDLE_KILLPRIV\n");
- if(conn->capable & FUSE_CAP_HANDLE_KILLPRIV_V2)
- printf("\tFUSE_CAP_HANDLE_KILLPRIV_V2\n");
- if(conn->capable & FUSE_CAP_DIRECT_IO_ALLOW_MMAP)
- printf("\tFUSE_CAP_DIRECT_IO_ALLOW_MMAP\n");
- if (conn->capable & FUSE_CAP_NO_EXPORT_SUPPORT)
- printf("\tFUSE_CAP_NO_EXPORT_SUPPORT\n");
+ print_capabilities(conn);
fuse_session_exit(se);
}
@@ -110,7 +105,7 @@ int main(int argc, char **argv)
perror("mkdtemp");
return 1;
}
-
+
printf("FUSE library version %s\n", fuse_pkgversion());
fuse_lowlevel_version();