[CUSE] Change permissions of created device node
authorDongju Chae <dongju.chae@samsung.com>
Thu, 15 Jul 2021 06:11:28 +0000 (15:11 +0900)
committer채동주/On-Device Lab(SR)/Staff Engineer/삼성전자 <dongju.chae@samsung.com>
Fri, 16 Jul 2021 02:30:07 +0000 (11:30 +0900)
This patch changes permissioss of created device node.

Signed-off-by: Dongju Chae <dongju.chae@samsung.com>
utils/trinity_cuse/trinity-cuse.cc

index 86bb69c..5356ef5 100644 (file)
@@ -28,6 +28,9 @@
 #include <ne-conf.h>
 #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, &param, 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);
+  }
 }