return S_ISBLK(nvme_stat.st_mode);
}
-static int open_dev(char *dev)
+static int open_dev(char *dev, int flags)
{
int err, fd;
devicename = basename(dev);
- err = open(dev, O_RDONLY);
+ err = open(dev, flags);
if (err < 0)
goto perror;
fd = err;
return 0;
}
-static int get_dev(int argc, char **argv)
+static int get_dev(int argc, char **argv, int flags)
{
int ret;
if (ret)
return ret;
- return open_dev(argv[optind]);
+ return open_dev(argv[optind], flags);
}
int parse_and_open(int argc, char **argv, const char *desc,
if (ret)
return ret;
- ret = get_dev(argc, argv);
+ ret = get_dev(argc, argv, O_RDONLY);
if (ret < 0)
argconfig_print_help(desc, opts);
return ret;
}
+int open_exclusive(int argc, char **argv, int force)
+{
+ int flags = O_RDONLY;
+
+ if (!force)
+ flags |= O_EXCL;
+
+ return get_dev(argc, argv, flags);
+}
+
enum nvme_print_flags validate_output_format(const char *format)
{
if (!format)
OPT_END()
};
+ err = argconfig_parse(argc, argv, desc, opts);
+ if (err)
+ goto ret;
+
+ err = fd = open_exclusive(argc, argv, cfg.force);
+ if (fd < 0) {
+ if (errno == EBUSY) {
+ fprintf(stderr, "Failed to open %s.\n",
+ basename(argv[optind]));
+ fprintf(stderr,
+ "Namespace is currently busy.\n"
+ "Use the force [--force|-f] option to ignore that.\n");
+ } else {
+ argconfig_print_help(desc, opts);
+ }
+ goto ret;
+ }
+
err = fd = parse_and_open(argc, argv, desc, opts);
if (fd < 0)
goto ret;