#include <dirent.h>
#include <errno.h>
#include <libgen.h>
+#include <libudev.h>
#include "checkers.h"
#include "vector.h"
int
path_discovery (vector pathvec, struct config * conf, int flag)
{
- DIR *blkdir;
- struct dirent *blkdev;
- struct stat statbuf;
- char devpath[PATH_MAX];
+ struct udev_enumerate *udev_iter;
+ struct udev_list_entry *entry;
+ char *devpath;
char *devptr;
int r = 0;
- if (!(blkdir = opendir("/sys/block")))
+ udev_iter = udev_enumerate_new(conf->udev);
+ if (!udev_iter)
return 1;
- strcpy(devpath,"/sys/block");
- while ((blkdev = readdir(blkdir)) != NULL) {
- if ((strcmp(blkdev->d_name,".") == 0) ||
- (strcmp(blkdev->d_name,"..") == 0))
- continue;
-
- devptr = devpath + 10;
- *devptr = '\0';
- strcat(devptr,"/");
- strcat(devptr,blkdev->d_name);
- if (stat(devpath, &statbuf) < 0)
- continue;
-
- if (S_ISDIR(statbuf.st_mode) == 0)
- continue;
+ udev_enumerate_add_match_subsystem(udev_iter, "block");
+ udev_enumerate_scan_devices(udev_iter);
+ udev_list_entry_foreach(entry,
+ udev_enumerate_get_list_entry(udev_iter)) {
+ devpath = udev_list_entry_get_name(entry);
condlog(4, "Discover device %s", devpath);
+ devptr = strrchr(devpath, '/');
+ if (devptr)
+ devptr++;
+ else
+ devptr = devpath;
- r += path_discover(pathvec, conf, blkdev->d_name, flag);
+ r += path_discover(pathvec, conf, devptr, flag);
}
- closedir(blkdir);
+ udev_enumerate_unref(udev_iter);
condlog(4, "Discovery status %d", r);
return r;
}