From 352a1226f9bef8aa7f000ea6c25a6d2a2b6adeec Mon Sep 17 00:00:00 2001 From: Dongju Chae Date: Thu, 15 Jul 2021 15:11:28 +0900 Subject: [PATCH] [CUSE] Change permissions of created device node This patch changes permissioss of created device node. Signed-off-by: Dongju Chae --- utils/trinity_cuse/trinity-cuse.cc | 51 ++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/utils/trinity_cuse/trinity-cuse.cc b/utils/trinity_cuse/trinity-cuse.cc index 86bb69c..5356ef5 100644 --- a/utils/trinity_cuse/trinity-cuse.cc +++ b/utils/trinity_cuse/trinity-cuse.cc @@ -28,6 +28,9 @@ #include #include "trinity-cuse.h" +/* the created device node's permissions */ +#define DEV_PERMS (0666) + static trinity_cuse_ioctl_vtable *vtable; extern bool set_ioctl_vtable_triv2 (trinity_cuse_ioctl_vtable **); @@ -371,7 +374,11 @@ main (int argc, char **argv) { struct fuse_args args = FUSE_ARGS_INIT (argc, argv); struct trinity_cuse_param param = {0}; struct cuse_info ci = {0}; - std::string dev_name ("DEVNAME="); + + if (geteuid () != 0) { + std::cerr << "[Error] Permission denied: use the sudo command\n"; + return -EPERM; + } if (fuse_opt_parse (&args, ¶m, trinity_cuse_opts, trinity_cuse_parse_args)) { @@ -394,16 +401,40 @@ main (int argc, char **argv) { return -ENOENT; } - dev_name += param.dev_name; + std::string dev_name (param.dev_name); dev_name += "-0"; - const char *dev_info_argv[] = {dev_name.c_str ()}; - ci.dev_major = param.major; - ci.dev_minor = param.minor; - ci.dev_info_argc = 1; - ci.dev_info_argv = dev_info_argv; - ci.flags = CUSE_UNRESTRICTED_IOCTL; + pid_t pid = fork (); + if (pid == -1) { + std::cerr << "[Error] Failed to create a child process: " << errno << "\n"; + return -errno; + } + + if (pid != 0) { + std::string dev_path ("/dev/"); + dev_path += dev_name; - return cuse_lowlevel_main (args.argc, args.argv, &ci, &trinity_cuse_clop, - NULL); + std::cerr << "Creating a device node: " << dev_path << "... "; + sleep (1); + if (fchmodat (AT_FDCWD, dev_path.c_str (), DEV_PERMS, 0) < 0) { + std::cerr << "failed to change permissions (only user can access)\n"; + return -errno; + } + std::cerr << "done\n"; + return 0; + } else { + std::string arg_dev_name ("DEVNAME="); + arg_dev_name += dev_name; + + const char *dev_info_argv[] = {arg_dev_name.c_str ()}; + + ci.dev_major = param.major; + ci.dev_minor = param.minor; + ci.dev_info_argc = 1; + ci.dev_info_argv = dev_info_argv; + ci.flags = CUSE_UNRESTRICTED_IOCTL; + + return cuse_lowlevel_main (args.argc, args.argv, &ci, &trinity_cuse_clop, + NULL); + } } -- 2.7.4