@@ -21,6 +21,7 @@
#include "checkers.h"
#include "vector.h"
#include "structs.h"
+#include "config.h"
#include "log.h"
size_t
@@ -155,89 +156,23 @@ size_t strlcat(char *dst, const char *src, size_t size)
return bytes;
}
-int devt2devname(char *devname, int devname_len, char *devt)
+int devt2devname(char *devname, int devname_len, const char *devt)
{
- FILE *fd;
- unsigned int tmpmaj, tmpmin, major, minor;
- char dev[FILE_NAME_SIZE];
- char block_path[PATH_SIZE];
- struct stat statbuf;
-
- memset(block_path, 0, sizeof(block_path));
- memset(dev, 0, sizeof(dev));
- if (sscanf(devt, "%u:%u", &major, &minor) != 2) {
- condlog(0, "Invalid device number %s", devt);
- return 1;
- }
+ struct udev_device *u_dev;
+ int r;
- if (devname_len > FILE_NAME_SIZE)
- devname_len = FILE_NAME_SIZE;
-
- if (stat("/sys/dev/block", &statbuf) == 0) {
- /* Newer kernels have /sys/dev/block */
- sprintf(block_path,"/sys/dev/block/%u:%u", major, minor);
- dev[FILE_NAME_SIZE - 1] = '\0';
- if (lstat(block_path, &statbuf) == 0) {
- if (S_ISLNK(statbuf.st_mode) &&
- readlink(block_path, dev, FILE_NAME_SIZE-1) > 0) {
- char *p = strrchr(dev, '/');
-
- if (!p) {
- condlog(0, "No sysfs entry for %s",
- block_path);
- return 1;
- }
- p++;
- strlcpy(devname, p, devname_len);
- return 0;
- }
- }
- condlog(4, "%s is invalid", block_path);
+ if (!devname || !devname_len || !devt)
return 1;
- }
- memset(block_path, 0, sizeof(block_path));
- if (!(fd = fopen("/proc/partitions", "r"))) {
- condlog(0, "Cannot open /proc/partitions");
+ u_dev = udev_device_new_from_devnum(udev, 'b', parse_devt(devt));
+ if (!u_dev) {
+ condlog(0, "\"%s\": invalid major/minor numbers, not found in sysfs", devt);
return 1;
}
+ r = strlcpy(devname, udev_device_get_sysname(u_dev), devname_len);
+ udev_device_unref(u_dev);
- while (!feof(fd)) {
- int r = fscanf(fd,"%u %u %*d %s",&tmpmaj, &tmpmin, dev);
- if (!r) {
- r = fscanf(fd,"%*s\n");
- continue;
- }
- if (r != 3)
- continue;
-
- if ((major == tmpmaj) && (minor == tmpmin)) {
- if (safe_sprintf(block_path, "/sys/block/%s", dev)) {
- condlog(0, "device name %s is too long", dev);
- fclose(fd);
- return 1;
- }
- break;
- }
- }
- fclose(fd);
-
- if (strncmp(block_path,"/sys/block", 10)) {
- condlog(3, "No device found for %u:%u", major, minor);
- return 1;
- }
-
- if (stat(block_path, &statbuf) < 0) {
- condlog(0, "No sysfs entry for %s", block_path);
- return 1;
- }
-
- if (S_ISDIR(statbuf.st_mode) == 0) {
- condlog(0, "sysfs entry %s is not a directory", block_path);
- return 1;
- }
- basenamecpy((const char *)block_path, devname, devname_len);
- return 0;
+ return !(r < devname_len);
}
/* This function returns a pointer inside of the supplied pathname string.
@@ -14,7 +14,7 @@ char *get_next_string(char **temp, char *split_char);
int get_word (char * sentence, char ** word);
size_t strlcpy(char *dst, const char *src, size_t size);
size_t strlcat(char *dst, const char *src, size_t size);
-int devt2devname (char *, int, char *);
+int devt2devname (char *, int, const char *);
dev_t parse_devt(const char *dev_t);
char *convert_dev(char *dev, int is_path_device);
void setup_thread_attr(pthread_attr_t *attr, size_t stacksize, int detached);
@@ -92,7 +92,6 @@ static void test_devt2devname_length_1(void **state)
{
char dummy[] = "";
- skip();
assert_int_equal(devt2devname(dummy, sizeof(dummy), *state), 1);
}
@@ -100,7 +99,6 @@ static void test_devt2devname_devt_null(void **state)
{
char dummy[32];
- skip();
assert_int_equal(devt2devname(dummy, sizeof(dummy), NULL), 1);
}