--- a/src/libudev.c +++ b/src/libudev.c @@ -35,6 +35,7 @@ struct udev_device { struct udev *udev; int refcount; char syspath[32]; + char sysfspath[64]; dev_t devnum; char const *sysname; char const *action; @@ -124,6 +125,29 @@ udev_device_new_from_devnum(struct udev return NULL; } +struct udev_device * +udev_device_new_from_subsystem_sysname( + struct udev *udev, const char *subsystem, const char *sysname) +{ + struct udev_device *u; + char sysfsname[64]; + struct stat st; + + snprintf(sysfsname, sizeof(sysfsname), "/sys/bus/%s/devices/%s/", subsystem, sysname); + if (stat(sysfsname, &st) == 0) + { + char sysfsdev[64]; + u = calloc(1, sizeof(struct udev_device)); + strncpy(u->sysfspath, sysfsname, sizeof(u->sysfspath)); + + return u; + } + else + { + return NULL; + } +} + char const * udev_device_get_devnode(struct udev_device *udev_device) { @@ -141,6 +165,20 @@ udev_device_get_devnum(struct udev_devic char const * udev_device_get_driver(struct udev_device *udev_device) { + if (udev_device->sysfspath) + { + char driverlnp[64]; + char driverlnk[32]; + snprintf(driverlnp, sizeof(driverlnp), "%s/driver", + udev_device->sysfspath); + if (readlink(driverlnp, driverlnk, sizeof(driver))) + { + char *drivernm; + drivernm = strrchr(driverlnk, '/'); + if (drivernm) + return ++drivernm; + } + } return NULL; } --- a/src/libudev.h +++ b/src/libudev.h @@ -31,6 +31,8 @@ struct udev_device *udev_device_new_from struct udev *udev, char const *syspath); struct udev_device *udev_device_new_from_devnum( struct udev *udev, char type, dev_t devnum); +struct udev_device *udev_device_new_from_subsystem_sysname( + struct udev *udev, const char *subsystem, const char *sysname); char const *udev_device_get_driver(struct udev_device *udev_device); char const *udev_device_get_syspath(struct udev_device *udev_device); char const *udev_device_get_sysname(struct udev_device *udev_device);