linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] libudev: device - add devtype support
@ 2009-01-02  3:22 Marcel Holtmann
  2009-01-02  3:42 ` Kay Sievers
                   ` (11 more replies)
  0 siblings, 12 replies; 13+ messages in thread
From: Marcel Holtmann @ 2009-01-02  3:22 UTC (permalink / raw)
  To: linux-hotplug

[-- Attachment #1: Type: text/plain, Size: 361 bytes --]

Hi Kay,

I was playing a little bit with libudev and I actually need the DEVTYPE
from uevent for various tasks. Especially with USB and Bluetooth, the
subsystem value is too generic.

Attached is a patch that implements udev_device_get_devtype() and also
udev_device_get_parent_with_devtype(). Please double check that I did it
the right way.

Regards

Marcel


[-- Attachment #2: 0001-libudev-device-add-devtype-support.patch --]
[-- Type: text/x-patch, Size: 7783 bytes --]

From 9a1f276ac8f47e082512a938deb2f04b62b63f5c Mon Sep 17 00:00:00 2001
From: Marcel Holtmann <marcel@holtmann.org>
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 deletions(-)

diff --git a/udev/lib/exported_symbols b/udev/lib/exported_symbols
index a2f0ca7..6b07842 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 055263b..06227be 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 502fe24..e4cb807 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 5e09188..0d752bb 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 a9e399c..b96e494 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 5120626..fd12bd9 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);
-- 
1.5.6.3


^ permalink raw reply related	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2009-01-03 18:28 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-02  3:22 [PATCH] libudev: device - add devtype support Marcel Holtmann
2009-01-02  3:42 ` Kay Sievers
2009-01-02  8:22 ` Marcel Holtmann
2009-01-02 11:25 ` Kay Sievers
2009-01-02 13:46 ` Marcel Holtmann
2009-01-02 14:03 ` Kay Sievers
2009-01-02 16:17 ` David Zeuthen
2009-01-02 16:27 ` Kay Sievers
2009-01-02 17:57 ` Marcel Holtmann
2009-01-03  4:26 ` Kay Sievers
2009-01-03 10:19 ` Marcel Holtmann
2009-01-03 15:34 ` Kay Sievers
2009-01-03 18:28 ` Marcel Holtmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).