[dm-devel] [PATCH 28/35] libmultipath: snprint_devices(): use udev_enumerate
mwilck at suse.com
mwilck at suse.com
Thu Jul 9 10:16:13 UTC 2020
From: Martin Wilck <mwilck at suse.com>
Rather than hand-coding the device enumeration, use udev as we do elsewhere,
too. While at it, improve the overflow detection.
Signed-off-by: Martin Wilck <mwilck at suse.com>
---
libmultipath/print.c | 75 ++++++++++++++++++++------------------------
libmultipath/print.h | 2 +-
2 files changed, 35 insertions(+), 42 deletions(-)
diff --git a/libmultipath/print.c b/libmultipath/print.c
index 298b376..fb94f86 100644
--- a/libmultipath/print.c
+++ b/libmultipath/print.c
@@ -2026,65 +2026,58 @@ int snprint_status(char *buff, int len, const struct vectors *vecs)
return fwd;
}
-int snprint_devices(struct config *conf, char * buff, int len,
+int snprint_devices(struct config *conf, char *buff, size_t len,
const struct vectors *vecs)
{
- DIR *blkdir;
- struct dirent *blkdev;
- struct stat statbuf;
- char devpath[PATH_MAX];
- int threshold = MAX_LINE_LEN;
- int fwd = 0;
+ size_t fwd = 0;
int r;
+ struct udev_enumerate *enm;
+ struct udev_list_entry *item, *first;
struct path * pp;
- if (!(blkdir = opendir("/sys/block")))
+ enm = udev_enumerate_new(udev);
+ if (!enm)
return 1;
+ udev_enumerate_add_match_subsystem(enm, "block");
- if ((len - fwd - threshold) <= 0) {
- closedir(blkdir);
- return len;
- }
fwd += snprintf(buff + fwd, len - fwd, "available block devices:\n");
+ r = udev_enumerate_scan_devices(enm);
+ if (r < 0)
+ goto out;
- while ((blkdev = readdir(blkdir)) != NULL) {
- if ((strcmp(blkdev->d_name,".") == 0) ||
- (strcmp(blkdev->d_name,"..") == 0))
- continue;
-
- if (safe_sprintf(devpath, "/sys/block/%s", blkdev->d_name))
- continue;
-
- if (stat(devpath, &statbuf) < 0)
- continue;
+ first = udev_enumerate_get_list_entry(enm);
+ udev_list_entry_foreach(item, first) {
+ const char *path, *devname, *status;
+ struct udev_device *u_dev;
- if (S_ISDIR(statbuf.st_mode) == 0)
- continue;
+ path = udev_list_entry_get_name(item);
+ u_dev = udev_device_new_from_syspath(udev, path);
+ devname = udev_device_get_sysname(u_dev);
- if ((len - fwd - threshold) <= 0) {
- closedir(blkdir);
- return len;
- }
+ fwd += snprintf(buff + fwd, len - fwd, " %s", devname);
+ if (fwd >= len)
+ break;
- fwd += snprintf(buff + fwd, len - fwd, " %s",
- blkdev->d_name);
- pp = find_path_by_dev(vecs->pathvec, blkdev->d_name);
+ pp = find_path_by_dev(vecs->pathvec, devname);
if (!pp) {
r = filter_devnode(conf->blist_devnode,
- conf->elist_devnode, blkdev->d_name);
+ conf->elist_devnode,
+ devname);
if (r > 0)
- fwd += snprintf(buff + fwd, len - fwd,
- " devnode blacklisted, unmonitored");
- else if (r <= 0)
- fwd += snprintf(buff + fwd, len - fwd,
- " devnode whitelisted, unmonitored");
+ status = "devnode blacklisted, unmonitored";
+ else
+ status = "devnode whitelisted, unmonitored";
} else
- fwd += snprintf(buff + fwd, len - fwd,
- " devnode whitelisted, monitored");
- fwd += snprintf(buff + fwd, len - fwd, "\n");
+ status = " devnode whitelisted, monitored";
+
+ fwd += snprintf(buff + fwd, len - fwd, " %s\n", status);
+ udev_device_unref(u_dev);
+ if (fwd >= len)
+ break;
}
- closedir(blkdir);
+out:
+ udev_enumerate_unref(enm);
if (fwd >= len)
return len;
diff --git a/libmultipath/print.h b/libmultipath/print.h
index e8260d0..0042cef 100644
--- a/libmultipath/print.h
+++ b/libmultipath/print.h
@@ -129,7 +129,7 @@ int snprint_multipath_map_json (char * buff, int len,
int snprint_blacklist_report (struct config *, char *, int);
int snprint_wildcards (char *, int);
int snprint_status (char *, int, const struct vectors *);
-int snprint_devices (struct config *, char *, int, const struct vectors *);
+int snprint_devices (struct config *, char *, size_t, const struct vectors *);
int snprint_path_serial (char *, size_t, const struct path *);
int snprint_host_wwnn (char *, size_t, const struct path *);
int snprint_host_wwpn (char *, size_t, const struct path *);
--
2.26.2
More information about the dm-devel
mailing list