From bf8b2ae177fd016d03349b3aa881b72afd7d037d Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Fri, 2 Jan 2009 04:14:47 +0100 Subject: [PATCH] libudev: device - add devtype support --- udev/lib/exported_symbols | 2 ++ udev/lib/libudev-device.c | 53 +++++++++++++++++++++++++++++++++++++- udev/lib/libudev-monitor.c | 2 ++ udev/lib/libudev-private.h | 1 + udev/lib/libudev.h | 2 ++ udev/lib/test-libudev.c | 4 +++ 6 files changed, 63 insertions(+), 1 deletion(-) diff --git a/udev/lib/exported_symbols b/udev/lib/exported_symbols index a2f0ca7c..6b07842a 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 055263bb..06227be3 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); @@ -723,6 +744,25 @@ const char *udev_device_get_subsystem(struct udev_device *udev_device) return udev_device->subsystem; } +/** + * 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 502fe24c..e4cb8076 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 5e09188f..0d752bb1 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 a9e399c4..b96e4942 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 51206265..fd12bd93 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); -- 2.39.5