mirror of
https://github.com/systemd/systemd.git
synced 2024-12-25 01:34:28 +03:00
[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:
parent
a2505f4d1d
commit
ee1db00d07
39
udev.c
39
udev.c
@ -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;
|
||||
}
|
||||
|
27
udevdb.c
27
udevdb.c
@ -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;
|
||||
}
|
||||
|
1
udevdb.h
1
udevdb.h
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user