From: Martin Wilck <mwi...@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 <mwi...@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


--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to