[PATCH] more advanced user query options

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:
This commit is contained in:
kay.sievers@vrfy.org 2004-01-13 01:01:19 -08:00 committed by Greg KH
parent a2505f4d1d
commit ee1db00d07
3 changed files with 58 additions and 9 deletions

39
udev.c
View File

@ -82,6 +82,16 @@ static inline char *get_seqnum(void)
return seqnum; 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 { enum query_type {
NONE, NONE,
NAME, NAME,
@ -92,7 +102,7 @@ enum query_type {
static inline int udev_user(int argc, char **argv) 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 option;
int retval = -EINVAL; int retval = -EINVAL;
struct udevice dev; struct udevice dev;
@ -144,6 +154,16 @@ static inline int udev_user(int argc, char **argv)
root = 1; root = 1;
break; 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': case 'V':
printf("udev, version %s\n", UDEV_VERSION); printf("udev, version %s\n", UDEV_VERSION);
return 0; return 0;
@ -206,12 +226,17 @@ static inline int udev_user(int argc, char **argv)
} }
help: help:
printf("Usage: [-qrVh]\n" printf("Usage: [-pqrdVh]\n"
" -q <name> query database for the specified value\n" " -q TYPE query database for the specified value:\n"
" -p <path> device path used for query\n" " 'name' name of device node\n"
" -r print udev root\n" " 'symlink' pointing to node\n"
" -V print udev version\n" " 'owner' of node\n"
" -h print this help text\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"); "\n");
return retval; return retval;
} }

View File

@ -124,7 +124,7 @@ int udevdb_init(int init_flag)
dbg("unable to initialize in-memory database"); dbg("unable to initialize in-memory database");
else else
dbg("unable to initialize database at '%s'", udev_db_filename); dbg("unable to initialize database at '%s'", udev_db_filename);
return -EINVAL; return -EACCES;
} }
return 0; return 0;
} }
@ -137,7 +137,30 @@ int udevdb_open_ro(void)
udevdb = tdb_open(udev_db_filename, 0, 0, O_RDONLY, 0); udevdb = tdb_open(udev_db_filename, 0, 0, O_RDONLY, 0);
if (udevdb == NULL) { if (udevdb == NULL) {
dbg("unable to open database at '%s'", udev_db_filename); dbg("unable to open database at '%s'", udev_db_filename);
return -EINVAL; return -EACCES;
} }
return 0; 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;
}

View File

@ -12,6 +12,7 @@
extern void udevdb_exit(void); extern void udevdb_exit(void);
extern int udevdb_init(int init_flag); extern int udevdb_init(int init_flag);
extern int udevdb_open_ro(void); 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_add_dev(const char *path, const struct udevice *dev);
extern int udevdb_get_dev(const char *path, struct udevice *dev); extern int udevdb_get_dev(const char *path, struct udevice *dev);