linux-hotplug.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Kay Sievers <kay.sievers@vrfy.org>
To: linux-hotplug@vger.kernel.org
Subject: Re: [PATCH] udev - reverse user query options
Date: Sat, 17 Jan 2004 11:49:22 +0000	[thread overview]
Message-ID: <20040117114922.GA20301@vrfy.org> (raw)
In-Reply-To: <20040116095433.GA17756@vrfy.org>

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

On Fri, Jan 16, 2004 at 02:02:41PM -0800, Greg KH wrote:
> On Fri, Jan 16, 2004 at 10:54:33AM +0100, Kay Sievers wrote:
> > Here we get the ability to query with the name of the node instead of
> > the device path. It uses a linear search over the whole database.
> > 
> >   kay@pim:~/src/udev.kay$ ./udev -q path -n video/webcam0
> >   /class/video4linux/video0
> 
> Nice, but I think it still needs some tweaking:
> 
> $ ./udev -q path -n foo
> /block/fd0

So here we go to compare more than the first char :)
The man page update is also included.

thanks,
Kay

[-- Attachment #2: 00-reverse-query.patch --]
[-- Type: text/plain, Size: 7181 bytes --]

diff -Nru a/udev.8 b/udev.8
--- a/udev.8	Sat Jan 17 12:45:06 2004
+++ b/udev.8	Sat Jan 17 12:45:06 2004
@@ -50,10 +50,13 @@
 .BI -q " query_type"
 Query the database for specified value of a created device node.
 Valid types are:
-.BR name ", " symlink ", " owner " or " group .
+.BR name ", " symlink ", " owner " , " group " or " path.
 .TP
 .BI -p " sysfs_path"
-Specify the sysfs path needed for the query.
+Specify the sysfs path of the device to query.
+.TP
+.BI -n " name"
+Specify the name of the node for the device to query.
 .TP
 .B -d
 Dump the whole database.
diff -Nru a/udev.c b/udev.c
--- a/udev.c	Sat Jan 17 12:45:06 2004
+++ b/udev.c	Sat Jan 17 12:45:06 2004
@@ -83,7 +83,8 @@
 	return seqnum;
 }
 
-static void print_record(char *path, struct udevice *dev)
+/* callback for database dump */
+static int print_record(char *path, struct udevice *dev)
 {
 	printf("P: %s\n", path);
 	printf("N: %s\n", dev->name);
@@ -91,11 +92,13 @@
 	printf("O: %s\n", dev->owner);
 	printf("G: %s\n", dev->group);
 	printf("\n");
+	return 0;
 }
 
 enum query_type {
 	NONE,
 	NAME,
+	PATH,
 	SYMLINK,
 	OWNER,
 	GROUP
@@ -103,7 +106,7 @@
 
 static inline int udev_user(int argc, char **argv)
 {
-	static const char short_options[] = "dp:q:rVh";
+	static const char short_options[] = "dn:p:q:rVh";
 	int option;
 	int retval = -EINVAL;
 	struct udevice dev;
@@ -120,6 +123,11 @@
 
 		dbg("option '%c'", option);
 		switch (option) {
+		case 'n':
+			dbg("udev name: %s\n", optarg);
+			strfieldcpy(dev.name, optarg);
+			break;
+
 		case 'p':
 			dbg("udev path: %s\n", optarg);
 			strfieldcpy(path, optarg);
@@ -148,6 +156,11 @@
 				break;
 			}
 
+			if (strcmp(optarg, "path") == 0) {
+				query = PATH;
+				break;
+			}
+
 			printf("unknown query type\n");
 			return -EINVAL;
 
@@ -161,7 +174,7 @@
 				printf("unable to open udev database\n");
 				return -EACCES;
 			}
-			retval = udevdb_dump(print_record);
+			retval = udevdb_call_foreach(print_record);
 			udevdb_exit();
 			return retval;
 
@@ -179,44 +192,63 @@
 
 	/* process options */
 	if (query != NONE) {
-		if (path[0] == '\0') {
-			printf("query needs device path specified\n");
-			return -EINVAL;
-		}
-
 		retval = udevdb_open_ro();
 		if (retval != 0) {
 			printf("unable to open udev database\n");
 			return -EACCES;
 		}
-		retval = udevdb_get_dev(path, &dev);
-		if (retval == 0) {
-			switch(query) {
-			case NAME:
-				if (root)
-				strfieldcpy(result, udev_root);
-				strncat(result, dev.name, sizeof(result));
-				break;
 
-			case SYMLINK:
-				strfieldcpy(result, dev.symlink);
-				break;
+		if (path[0] != '\0') {
+			retval = udevdb_get_dev(path, &dev);
+			if (retval != 0) {
+				printf("device not found in database\n");
+				goto exit;
+			}
+			goto print;
+		}
 
-			case GROUP:
-				strfieldcpy(result, dev.group);
-				break;
+		if (dev.name[0] != '\0') {
+			retval = udevdb_get_dev_byname(dev.name, path, &dev);
+			if (retval != 0) {
+				printf("device not found in database\n");
+				goto exit;
+			}
+			goto print;
+		}
 
-			case OWNER:
-				strfieldcpy(result, dev.owner);
-				break;
+		printf("query needs device path(-p) or node name(-n) specified\n");
+		goto exit;
 
-			default:
-				break;
-			}
-			printf("%s\n", result);
-		} else {
-			printf("device not found in udev database\n");
+print:
+		switch(query) {
+		case NAME:
+			if (root)
+			strfieldcpy(result, udev_root);
+			strncat(result, dev.name, sizeof(result));
+			break;
+
+		case SYMLINK:
+			strfieldcpy(result, dev.symlink);
+			break;
+
+		case GROUP:
+			strfieldcpy(result, dev.group);
+			break;
+
+		case OWNER:
+			strfieldcpy(result, dev.owner);
+			break;
+
+		case PATH:
+			strfieldcpy(result, path);
+			break;
+
+		default:
+			goto exit;
 		}
+		printf("%s\n", result);
+
+exit:
 		udevdb_exit();
 		return retval;
 	}
@@ -227,13 +259,16 @@
 	}
 
 help:
-	printf("Usage: [-pqrdVh]\n"
+	printf("Usage: [-npqrdVh]\n"
 	       "  -q TYPE  query database for the specified value:\n"
 	       "             'name'    name of device node\n"
 	       "             'symlink' pointing to node\n"
 	       "             'owner'   of node\n"
 	       "             'group'   of node\n"
+	       "             'path'    sysfs device path\n"
 	       "  -p PATH  sysfs device path used for query\n"
+	       "  -n NAME  node name used for query\n"
+	       "\n"
 	       "  -r       print udev root\n"
 	       "  -d       dump whole database\n"
 	       "  -V       print udev version\n"
diff -Nru a/udevdb.c b/udevdb.c
--- a/udevdb.c	Sat Jan 17 12:45:06 2004
+++ b/udevdb.c	Sat Jan 17 12:45:06 2004
@@ -143,25 +143,55 @@
 	return 0;
 }
 
-void (*user_record_callback) (char *path, struct udevice *dev);
+static int (*user_record_callback) (char *path, struct udevice *dev);
 
 static int traverse_callback(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA dbuf, void *state)
 {
-	user_record_callback((char*) key.dptr, (struct udevice*) dbuf.dptr);
-	return 0;
+	return user_record_callback((char*) key.dptr, (struct udevice*) dbuf.dptr);
 }
 
 /**
- * udevdb_dump: dumps whole database by passing record data to user function
+ * udevdb_call_foreach: dumps whole database by passing record data to user function
  * @user_record_handler: user function called for every record in the database
  */
-int udevdb_dump(void (*user_record_handler) (char *path, struct udevice *dev))
+int udevdb_call_foreach(int (*user_record_handler) (char *path, struct udevice *dev))
 {
+	int retval = 0;
+
 	if (user_record_handler == NULL) {
 		dbg("invalid user record handling function");
 		return -EINVAL;
 	}
 	user_record_callback = user_record_handler;
-	tdb_traverse(udevdb, traverse_callback, NULL);
+	retval = tdb_traverse(udevdb, traverse_callback, NULL);
+	if (retval < 0)
+		return -ENODEV;
+	else
+		return 0;
+}
+
+static struct udevice *find_dev;
+static char *find_path;
+static const char *find_name;
+
+static int find_device_by_name(char *path, struct udevice *dev)
+{
+	if (strncmp(dev->name, find_name, sizeof(dev->name)) == 0) {
+		memcpy(find_dev, dev, sizeof(*find_dev));
+		strncpy(find_path, path, NAME_SIZE);
+		/* stop search */
+		return -1;
+	}
 	return 0;
+}
+
+/**
+ * udevdb_get_dev_byname: search device with given name by traversing the whole database
+ */
+int udevdb_get_dev_byname(const char *name, char *path, struct udevice *dev)
+{
+	find_path = path;
+	find_dev = dev;
+	find_name = name;
+	return udevdb_call_foreach(find_device_by_name);
 }
diff -Nru a/udevdb.h b/udevdb.h
--- a/udevdb.h	Sat Jan 17 12:45:06 2004
+++ b/udevdb.h	Sat Jan 17 12:45:06 2004
@@ -12,10 +12,11 @@
 extern void udevdb_exit(void);
 extern int udevdb_init(int init_flag);
 extern int udevdb_open_ro(void);
-extern int udevdb_dump(void (*user_record_handler) (char *path, struct udevice *dev));
+extern int udevdb_call_foreach(int (*user_record_handler) (char *path, struct udevice *dev));
 
 extern int udevdb_add_dev(const char *path, const struct udevice *dev);
 extern int udevdb_get_dev(const char *path, struct udevice *dev);
 extern int udevdb_delete_dev(const char *path);
+extern int udevdb_get_dev_byname(const char *name, char *path, struct udevice *dev);
 
 #endif /* _UDEVDB_H_ */

  parent reply	other threads:[~2004-01-17 11:49 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-01-16  9:54 [PATCH] udev - reverse user query options Kay Sievers
2004-01-16 22:02 ` Greg KH
2004-01-17 11:49 ` Kay Sievers [this message]
2004-01-17 13:51 ` Kay Sievers
2004-01-19 19:41 ` Greg KH
2004-01-19 19:42 ` Greg KH

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040117114922.GA20301@vrfy.org \
    --to=kay.sievers@vrfy.org \
    --cc=linux-hotplug@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).