diff options
Diffstat (limited to 'udev/lib')
-rw-r--r-- | udev/lib/exported_symbols | 2 | ||||
-rw-r--r-- | udev/lib/libudev-device.c | 53 | ||||
-rw-r--r-- | udev/lib/libudev-monitor.c | 2 | ||||
-rw-r--r-- | udev/lib/libudev-private.h | 1 | ||||
-rw-r--r-- | udev/lib/libudev.h | 2 | ||||
-rw-r--r-- | udev/lib/test-libudev.c | 4 |
6 files changed, 63 insertions, 1 deletions
diff --git a/udev/lib/exported_symbols b/udev/lib/exported_symbols index a2f0ca7cb3..6b07842a81 100644 --- a/udev/lib/exported_symbols +++ b/udev/lib/exported_symbols @@ -17,6 +17,7 @@ udev_device_new_from_devnum udev_device_new_from_subsystem_sysname udev_device_get_parent udev_device_get_parent_with_subsystem +udev_device_get_parent_with_devtype udev_device_ref udev_device_unref udev_device_get_udev @@ -26,6 +27,7 @@ udev_device_get_devnode udev_device_get_sysname udev_device_get_sysnum udev_device_get_subsystem +udev_device_get_devtype udev_device_get_devlinks_list_entry udev_device_get_properties_list_entry udev_device_get_action diff --git a/udev/lib/libudev-device.c b/udev/lib/libudev-device.c index 055263bbef..06227be328 100644 --- a/udev/lib/libudev-device.c +++ b/udev/lib/libudev-device.c @@ -40,6 +40,7 @@ struct udev_device { const char *sysnum; char *devnode; char *subsystem; + char *devtype; char *driver; char *action; char *devpath_old; @@ -59,6 +60,7 @@ struct udev_device { dev_t devnum; unsigned int parent_set:1; unsigned int subsystem_set:1; + unsigned int devtype_set:1; unsigned int devlinks_uptodate:1; unsigned int envp_uptodate:1; unsigned int driver_set:1; @@ -204,7 +206,9 @@ int udev_device_read_uevent_file(struct udev_device *udev_device) continue; pos[0] = '\0'; - if (strncmp(line, "MAJOR=", 6) == 0) + if (strncmp(line, "DEVTYPE=", 8) == 0) + udev_device_set_devtype(udev_device, &line[8]); + else if (strncmp(line, "MAJOR=", 6) == 0) maj = strtoull(&line[6], NULL, 10); else if (strncmp(line, "MINOR=", 6) == 0) min = strtoull(&line[6], NULL, 10); @@ -553,6 +557,22 @@ struct udev_device *udev_device_get_parent_with_subsystem(struct udev_device *ud return parent; } +struct udev_device *udev_device_get_parent_with_devtype(struct udev_device *udev_device, const char *devtype) +{ + struct udev_device *parent; + + parent = udev_device_get_parent(udev_device); + while (parent != NULL) { + const char *parent_devtype; + + parent_devtype = udev_device_get_devtype(parent); + if (parent_devtype != NULL && strcmp(parent_devtype, devtype) == 0) + break; + parent = udev_device_get_parent(parent); + } + return parent; +} + /** * udev_device_get_udev: * @udev_device: udev device @@ -605,6 +625,7 @@ void udev_device_unref(struct udev_device *udev_device) free(udev_device->sysname); free(udev_device->devnode); free(udev_device->subsystem); + free(udev_device->devtype); udev_list_cleanup_entries(udev_device->udev, &udev_device->devlinks_list); udev_list_cleanup_entries(udev_device->udev, &udev_device->properties_list); free(udev_device->action); @@ -724,6 +745,25 @@ const char *udev_device_get_subsystem(struct udev_device *udev_device) } /** + * udev_device_get_devtype: + * @udev_device: udev device + * + * Retrieve the devtype string of the udev device. + * + * Returns: the devtype name of the udev device, or #NULL if it can not be determined + **/ +const char *udev_device_get_devtype(struct udev_device *udev_device) +{ + if (udev_device == NULL) + return NULL; + if (!udev_device->devtype_set) { + udev_device->devtype_set = 1; + udev_device_read_uevent_file(udev_device); + } + return udev_device->devtype; +} + +/** * udev_device_get_devlinks_list_entry: * @udev_device: udev device * @@ -963,6 +1003,17 @@ int udev_device_set_subsystem(struct udev_device *udev_device, const char *subsy return 0; } +int udev_device_set_devtype(struct udev_device *udev_device, const char *devtype) +{ + free(udev_device->devtype); + udev_device->devtype = strdup(devtype); + if (udev_device->devtype == NULL) + return -ENOMEM; + udev_device->devtype_set = 1; + udev_device_add_property(udev_device, "DEVTYPE", udev_device->devtype); + return 0; +} + int udev_device_set_devnode(struct udev_device *udev_device, const char *devnode) { free(udev_device->devnode); diff --git a/udev/lib/libudev-monitor.c b/udev/lib/libudev-monitor.c index 502fe24ce1..e4cb80769c 100644 --- a/udev/lib/libudev-monitor.c +++ b/udev/lib/libudev-monitor.c @@ -325,6 +325,8 @@ struct udev_device *udev_monitor_receive_device(struct udev_monitor *udev_monito } else if (strncmp(key, "SUBSYSTEM=", 10) == 0) { udev_device_set_subsystem(udev_device, &key[10]); subsystem_set = 1; + } else if (strncmp(key, "DEVTYPE=", 8) == 0) { + udev_device_set_devtype(udev_device, &key[8]); } else if (strncmp(key, "DEVNAME=", 8) == 0) { udev_device_set_devnode(udev_device, &key[8]); } else if (strncmp(key, "DEVLINKS=", 9) == 0) { diff --git a/udev/lib/libudev-private.h b/udev/lib/libudev-private.h index 5e09188f08..0d752bb1e5 100644 --- a/udev/lib/libudev-private.h +++ b/udev/lib/libudev-private.h @@ -56,6 +56,7 @@ extern struct udev_list_entry *udev_get_properties_list_entry(struct udev *udev) /* libudev-device */ extern int udev_device_set_syspath(struct udev_device *udev_device, const char *syspath); extern int udev_device_set_subsystem(struct udev_device *udev_device, const char *subsystem); +extern int udev_device_set_devtype(struct udev_device *udev_device, const char *devtype); extern int udev_device_set_devnode(struct udev_device *udev_device, const char *devnode); extern int udev_device_add_devlink(struct udev_device *udev_device, const char *devlink); extern void udev_device_cleanup_devlinks_list(struct udev_device *udev_device); diff --git a/udev/lib/libudev.h b/udev/lib/libudev.h index a9e399c4b4..b96e49429b 100644 --- a/udev/lib/libudev.h +++ b/udev/lib/libudev.h @@ -63,11 +63,13 @@ extern struct udev_device *udev_device_new_from_devnum(struct udev *udev, char t extern struct udev_device *udev_device_new_from_subsystem_sysname(struct udev *udev, const char *subsystem, const char *sysname); extern struct udev_device *udev_device_get_parent(struct udev_device *udev_device); extern struct udev_device *udev_device_get_parent_with_subsystem(struct udev_device *udev_device, const char *subsystem); +extern struct udev_device *udev_device_get_parent_with_devtype(struct udev_device *udev_device, const char *devtype); extern struct udev_device *udev_device_ref(struct udev_device *udev_device); extern void udev_device_unref(struct udev_device *udev_device); extern struct udev *udev_device_get_udev(struct udev_device *udev_device); extern const char *udev_device_get_devpath(struct udev_device *udev_device); extern const char *udev_device_get_subsystem(struct udev_device *udev_device); +extern const char *udev_device_get_devtype(struct udev_device *udev_device); extern const char *udev_device_get_syspath(struct udev_device *udev_device); extern const char *udev_device_get_sysname(struct udev_device *udev_device); extern const char *udev_device_get_sysnum(struct udev_device *udev_device); diff --git a/udev/lib/test-libudev.c b/udev/lib/test-libudev.c index 5120626520..fd12bd9344 100644 --- a/udev/lib/test-libudev.c +++ b/udev/lib/test-libudev.c @@ -67,6 +67,10 @@ static void print_device(struct udev_device *device) if (str != NULL) printf("subsystem: '%s'\n", str); + str = udev_device_get_devtype(device); + if (str != NULL) + printf("devtype: '%s'\n", str); + str = udev_device_get_driver(device); if (str != NULL) printf("driver: '%s'\n", str); |