代码拉取完成,页面将自动刷新
From b816b986f063f2f7ba5f517669a1d36d1c40ce16 Mon Sep 17 00:00:00 2001
From: Dave Dykstra <[email protected]>
Date: Thu, 6 Oct 2022 18:21:57 -0500
Subject: [PATCH] add low-level uid=N and gid=N options, better help
---
fs.h | 2 ++
fuseprivate.c | 12 ++++++++++--
fuseprivate.h | 4 +++-
hl.c | 4 ++--
ll_main.c | 12 +++++++++---
stat.c | 24 ++++++++++++++++--------
6 files changed, 42 insertions(+), 16 deletions(-)
diff --git a/fs.h b/fs.h
index d300a3bb..dc00d54a 100644
--- a/fs.h
+++ b/fs.h
@@ -36,6 +36,8 @@
struct sqfs {
sqfs_fd_t fd;
size_t offset;
+ int uid;
+ int gid;
struct squashfs_super_block sb;
sqfs_table id_table;
sqfs_table frag_table;
diff --git a/fuseprivate.c b/fuseprivate.c
index a8e71191..b9a10182 100644
--- a/fuseprivate.c
+++ b/fuseprivate.c
@@ -59,12 +59,20 @@ int sqfs_listxattr(sqfs *fs, sqfs_inode *inode, char *buf, size_t *size) {
return 0;
}
-void sqfs_usage(char *progname, bool fuse_usage) {
+void sqfs_usage(char *progname, bool fuse_usage, bool ll_usage) {
fprintf(stderr, "%s (c) 2012 Dave Vasilevsky\n\n", PACKAGE_STRING);
fprintf(stderr, "Usage: %s [options] ARCHIVE MOUNTPOINT\n",
progname ? progname : PACKAGE_NAME);
+ fprintf(stderr, "\n%s options:\n", progname);
+ fprintf(stderr, " -o offset offset into ARCHIVE to mount\n");
+ fprintf(stderr, " -o timeout idle seconds for automatic unmount\n");
+ if (ll_usage) {
+ fprintf(stderr, " -o uid=N set file owner\n");
+ fprintf(stderr, " -o gid=N set file group\n");
+ }
if (fuse_usage) {
#if FUSE_USE_VERSION >= 30
+ fprintf(stderr, "\nFUSE options:\n");
fuse_cmdline_help();
#else
struct fuse_args args = FUSE_ARGS_INIT(0, NULL);
@@ -92,7 +100,7 @@ int sqfs_opt_proc(void *data, const char *arg, int key,
}
} else if (key == FUSE_OPT_KEY_OPT) {
if (strncmp(arg, "-h", 2) == 0 || strncmp(arg, "--h", 3) == 0)
- sqfs_usage(opts->progname, true);
+ return -1;
}
return 1; /* Keep */
}
diff --git a/fuseprivate.h b/fuseprivate.h
index c978076c..29974b86 100644
--- a/fuseprivate.h
+++ b/fuseprivate.h
@@ -40,7 +40,7 @@
int sqfs_listxattr(sqfs *fs, sqfs_inode *inode, char *buf, size_t *size);
/* Print a usage string */
-void sqfs_usage(char *progname, bool fuse_usage);
+void sqfs_usage(char *progname, bool fuse_usage, bool ll_usage);
/* Parse command-line arguments */
typedef struct {
@@ -49,6 +49,8 @@ typedef struct {
int mountpoint;
size_t offset;
unsigned int idle_timeout_secs;
+ int uid;
+ int gid;
} sqfs_opts;
int sqfs_opt_proc(void *data, const char *arg, int key,
struct fuse_args *outargs);
diff --git a/hl.c b/hl.c
index 49673913..aa71e4e0 100644
--- a/hl.c
+++ b/hl.c
@@ -325,9 +325,9 @@ int main(int argc, char *argv[]) {
opts.mountpoint = 0;
opts.offset = 0;
if (fuse_opt_parse(&args, &opts, fuse_opts, sqfs_opt_proc) == -1)
- sqfs_usage(argv[0], true);
+ sqfs_usage(argv[0], true, false);
if (!opts.image)
- sqfs_usage(argv[0], true);
+ sqfs_usage(argv[0], true, false);
hl = sqfs_hl_open(opts.image, opts.offset);
if (!hl)
diff --git a/ll_main.c b/ll_main.c
index aca76935..5bc57abd 100644
--- a/ll_main.c
+++ b/ll_main.c
@@ -55,6 +55,8 @@ int main(int argc, char *argv[]) {
struct fuse_opt fuse_opts[] = {
{"offset=%zu", offsetof(sqfs_opts, offset), 0},
{"timeout=%u", offsetof(sqfs_opts, idle_timeout_secs), 0},
+ {"uid=%d", offsetof(sqfs_opts, uid), 0},
+ {"gid=%d", offsetof(sqfs_opts, gid), 0},
FUSE_OPT_END
};
@@ -85,8 +87,10 @@ int main(int argc, char *argv[]) {
opts.mountpoint = 0;
opts.offset = 0;
opts.idle_timeout_secs = 0;
+ opts.uid = 0;
+ opts.gid = 0;
if (fuse_opt_parse(&args, &opts, fuse_opts, sqfs_opt_proc) == -1)
- sqfs_usage(argv[0], true);
+ sqfs_usage(argv[0], true, true);
#if FUSE_USE_VERSION >= 30
if (fuse_parse_cmdline(&args, &fuse_cmdline_opts) != 0)
@@ -96,9 +100,9 @@ int main(int argc, char *argv[]) {
&fuse_cmdline_opts.mt,
&fuse_cmdline_opts.foreground) == -1)
#endif
- sqfs_usage(argv[0], true);
+ sqfs_usage(argv[0], true, true);
if (fuse_cmdline_opts.mountpoint == NULL)
- sqfs_usage(argv[0], true);
+ sqfs_usage(argv[0], true, true);
/* fuse_daemonize() will unconditionally clobber fds 0-2.
*
@@ -128,6 +132,8 @@ int main(int argc, char *argv[]) {
/* STARTUP FUSE */
if (!err) {
+ ll->fs.uid = opts.uid;
+ ll->fs.gid = opts.gid;
sqfs_ll_chan ch;
err = -1;
if (sqfs_ll_mount(
diff --git a/stat.c b/stat.c
index 29923f37..b425c0c0 100644
--- a/stat.c
+++ b/stat.c
@@ -49,14 +49,22 @@ sqfs_err sqfs_stat(sqfs *fs, sqfs_inode *inode, struct stat *st) {
st->st_blksize = fs->sb.block_size; /* seriously? */
- err = sqfs_id_get(fs, inode->base.uid, &id);
- if (err)
- return err;
- st->st_uid = id;
- err = sqfs_id_get(fs, inode->base.guid, &id);
- st->st_gid = id;
- if (err)
- return err;
+ if (fs->uid > 0) {
+ st->st_uid = fs->uid;
+ } else {
+ err = sqfs_id_get(fs, inode->base.uid, &id);
+ if (err)
+ return err;
+ st->st_uid = id;
+ }
+ if (fs->gid > 0) {
+ st->st_gid = fs->gid;
+ } else {
+ err = sqfs_id_get(fs, inode->base.guid, &id);
+ st->st_gid = id;
+ if (err)
+ return err;
+ }
return SQFS_OK;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。