#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 **);
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)) {
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);
+ }
}