From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kay Sievers Date: Mon, 12 Jan 2004 23:56:27 +0000 Subject: Re: [PATCH] udev - advanced user query options Message-Id: <20040112235627.GA9432@vrfy.org> MIME-Version: 1 Content-Type: multipart/mixed; boundary="ikeVEW9yuYc//A+q" List-Id: References: <20040111023300.GA4762@vrfy.org> In-Reply-To: <20040111023300.GA4762@vrfy.org> To: linux-hotplug@vger.kernel.org --ikeVEW9yuYc//A+q Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, Jan 12, 2004 at 01:21:30PM -0800, Greg KH wrote: > On Sun, Jan 11, 2004 at 03:33:00AM +0100, Kay Sievers wrote: > > This patch improves the user options for udev. > > It is possible now to query for the name, the symlinks or owner/group. > > If asked for the name of the node we are able to prepend the udev_root > > with the -r option. > > > > SAMPLE: > > > > kay@pim:~/src/udev.test$ ./udev -V > > udev, version 012_bk > > > > kay@pim:~/src/udev.test$ ./udev -h > > Usage: [-qrVh] > > -q query database for the specified value > > -p device path used for query > > -r print udev root > > -V print udev version > > -h print this help text > > > > kay@pim:~/src/udev.test$ ./udev -r > > /udev/ > > > > kay@pim:~/src/udev.test$ ./udev -q name -p /class/video4linux/video0 > > video/webcam0 > > > > kay@pim:~/src/udev.test$ ./udev -q symlink -p /class/video4linux/video0 > > camera0 kamera0 > > > > kay@pim:~/src/udev.test$ ./udev -q owner -p /class/video4linux/video0 > > 501 > > > > kay@pim:~/src/udev.test$ ./udev -r -q name -p /class/video4linux/video0 > > /udev/video/webcam0 > > Very nice, applied, thanks. > > Hm, care to update the man page with this information, and the '-h' > option to explain queries a bit more? Yes, I'll take the man page in the next two hours. Here is the '-h' and a '-d' to dump the whole database: kay@pim:~/src/udev.kay$ ./udev -d P: /block/hdb/hdb1 N: hdb1 S: O: G: P: /class/video4linux/video0 N: video/webcam0 S: camera0 kamera0 O: 500 G: 500 P: /block/hdc N: hdc S: O: G: thanks, Kay --ikeVEW9yuYc//A+q Content-Type: text/plain; charset=us-ascii Content-Disposition: inline; filename="00-dumpdb.diff" diff -Nru a/udev.c b/udev.c --- a/udev.c Tue Jan 13 00:40:56 2004 +++ b/udev.c Tue Jan 13 00:40:56 2004 @@ -82,6 +82,16 @@ return seqnum; } +static void print_record(char *path, struct udevice *dev) +{ + printf("P: %s\n", path); + printf("N: %s\n", dev->name); + printf("S: %s\n", dev->symlink); + printf("O: %s\n", dev->owner); + printf("G: %s\n", dev->group); + printf("\n"); +} + enum query_type { NONE, NAME, @@ -92,7 +102,7 @@ static inline int udev_user(int argc, char **argv) { - static const char short_options[] = "p:q:rVh"; + static const char short_options[] = "dp:q:rVh"; int option; int retval = -EINVAL; struct udevice dev; @@ -144,6 +154,16 @@ root = 1; break; + case 'd': + retval = udevdb_open_ro(); + if (retval != 0) { + printf("unable to open udev database\n"); + return -EACCES; + } + retval = udevdb_dump(print_record); + udevdb_exit(); + return retval; + case 'V': printf("udev, version %s\n", UDEV_VERSION); return 0; @@ -206,12 +226,17 @@ } help: - printf("Usage: [-qrVh]\n" - " -q query database for the specified value\n" - " -p device path used for query\n" - " -r print udev root\n" - " -V print udev version\n" - " -h print this help text\n" + printf("Usage: [-pqrdVh]\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" + " -p PATH sysfs device path used for query\n" + " -r print udev root\n" + " -d dump whole database\n" + " -V print udev version\n" + " -h print this help text\n" "\n"); return retval; } diff -Nru a/udevdb.c b/udevdb.c --- a/udevdb.c Tue Jan 13 00:40:56 2004 +++ b/udevdb.c Tue Jan 13 00:40:56 2004 @@ -124,7 +124,7 @@ dbg("unable to initialize in-memory database"); else dbg("unable to initialize database at '%s'", udev_db_filename); - return -EINVAL; + return -EACCES; } return 0; } @@ -137,7 +137,30 @@ udevdb = tdb_open(udev_db_filename, 0, 0, O_RDONLY, 0); if (udevdb == NULL) { dbg("unable to open database at '%s'", udev_db_filename); + return -EACCES; + } + return 0; +} + +void (*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; +} + +/** + * udevdb_dump: 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)) +{ + 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); return 0; } diff -Nru a/udevdb.h b/udevdb.h --- a/udevdb.h Tue Jan 13 00:40:56 2004 +++ b/udevdb.h Tue Jan 13 00:40:56 2004 @@ -12,6 +12,7 @@ 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_add_dev(const char *path, const struct udevice *dev); extern int udevdb_get_dev(const char *path, struct udevice *dev); --ikeVEW9yuYc//A+q-- ------------------------------------------------------- This SF.net email is sponsored by: Perforce Software. Perforce is the Fast Software Configuration Management System offering advanced branching capabilities and atomic changes on 50+ platforms. Free Eval! http://www.perforce.com/perforce/loadprog.html _______________________________________________ Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net Linux-hotplug-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel