aboutsummaryrefslogtreecommitdiffstats
path: root/udev/zvol_id.c
diff options
context:
space:
mode:
authorнаб <[email protected]>2022-05-11 19:58:19 +0200
committerGitHub <[email protected]>2022-05-11 10:58:19 -0700
commit5a142533f8b117f6ac3ad7490ae4ac2cef3d78e9 (patch)
tree1c921f07d95baec0a73fe742f9e106c425924e03 /udev/zvol_id.c
parent1f5bc12893eefb0e3a247c2266c94a6f7f2b3364 (diff)
udev: zvol_id: simplify/modernise
zero-alloc, sensibler errors, don't close (or free) before exit. Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Ahelenia Ziemiańska <[email protected]> Closes #13337
Diffstat (limited to 'udev/zvol_id.c')
-rw-r--r--udev/zvol_id.c103
1 files changed, 30 insertions, 73 deletions
diff --git a/udev/zvol_id.c b/udev/zvol_id.c
index 929a1a6e7..ea38ac8cd 100644
--- a/udev/zvol_id.c
+++ b/udev/zvol_id.c
@@ -24,16 +24,14 @@
*/
#include <ctype.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
+#include <errno.h>
#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
#include <unistd.h>
-#include <linux/ioctl.h>
-#include <sys/stat.h>
-#include <sys/ioctl.h>
-#include <sys/zfs_znode.h>
#include <sys/fs/zfs.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
#if defined(ZFS_ASAN_ENABLED)
/*
@@ -50,80 +48,39 @@ const char *__asan_default_options(void) {
}
#endif
-static int
-ioctl_get_msg(char *var, int fd)
-{
- int ret;
- char msg[ZFS_MAX_DATASET_NAME_LEN];
-
- ret = ioctl(fd, BLKZNAME, msg);
- if (ret < 0) {
- return (ret);
- }
-
- snprintf(var, ZFS_MAX_DATASET_NAME_LEN, "%s", msg);
- return (ret);
-}
-
int
-main(int argc, char **argv)
+main(int argc, const char *const *argv)
{
- int fd = -1, ret = 0, status = EXIT_FAILURE;
- char zvol_name[ZFS_MAX_DATASET_NAME_LEN];
- char *zvol_name_part = NULL;
- char *dev_name;
- struct stat64 statbuf;
- int dev_minor, dev_part;
- int i;
-
- if (argc < 2) {
- fprintf(stderr, "Usage: %s /dev/zvol_device_node\n", argv[0]);
- goto fail;
- }
-
- dev_name = argv[1];
- ret = stat64(dev_name, &statbuf);
- if (ret != 0) {
- fprintf(stderr, "Unable to access device file: %s\n", dev_name);
- goto fail;
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s /dev/zdX\n", argv[0]);
+ return (1);
}
-
- dev_minor = minor(statbuf.st_rdev);
- dev_part = dev_minor % ZVOL_MINORS;
-
- fd = open(dev_name, O_RDONLY);
- if (fd < 0) {
- fprintf(stderr, "Unable to open device file: %s\n", dev_name);
- goto fail;
+ const char *dev_name = argv[1];
+
+ int fd;
+ struct stat sb;
+ if ((fd = open(dev_name, O_RDONLY|O_CLOEXEC)) == -1 ||
+ fstat(fd, &sb) != 0) {
+ fprintf(stderr, "%s: %s\n", dev_name, strerror(errno));
+ return (1);
}
- ret = ioctl_get_msg(zvol_name, fd);
- if (ret < 0) {
- fprintf(stderr, "ioctl_get_msg failed: %s\n", strerror(errno));
- goto fail;
+ char zvol_name[MAXNAMELEN + strlen("-part") + 10];
+ if (ioctl(fd, BLKZNAME, zvol_name) == -1) {
+ fprintf(stderr, "%s: BLKZNAME: %s\n",
+ dev_name, strerror(errno));
+ return (1);
}
- if (dev_part > 0)
- ret = asprintf(&zvol_name_part, "%s-part%d", zvol_name,
- dev_part);
- else
- ret = asprintf(&zvol_name_part, "%s", zvol_name);
- if (ret == -1 || zvol_name_part == NULL)
- goto fail;
-
- for (i = 0; i < strlen(zvol_name_part); i++) {
- if (isblank(zvol_name_part[i]))
- zvol_name_part[i] = '+';
- }
+ unsigned int dev_part = minor(sb.st_rdev) % ZVOL_MINORS;
+ if (dev_part != 0)
+ sprintf(zvol_name + strlen(zvol_name), "-part%u", dev_part);
- printf("%s\n", zvol_name_part);
- status = EXIT_SUCCESS;
+ for (size_t i = 0; i < strlen(zvol_name); ++i)
+ if (isblank(zvol_name[i]))
+ zvol_name[i] = '+';
-fail:
- if (zvol_name_part)
- free(zvol_name_part);
- if (fd >= 0)
- close(fd);
+ puts(zvol_name);
- return (status);
+ return (0);
}