[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;
}
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 @@ enum query_type {
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 @@ static inline int udev_user(int argc, char **argv)
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 @@ static inline int udev_user(int argc, char **argv)
}
help:
printf("Usage: [-qrVh]\n"
" -q <name> query database for the specified value\n"
" -p <path> 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;
}

View File

@ -124,7 +124,7 @@ int udevdb_init(int init_flag)
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 @@ int udevdb_open_ro(void)
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 -EINVAL;
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;
}

View File

@ -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);