mirror of
https://github.com/systemd/systemd.git
synced 2024-12-26 03:22:00 +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;
|
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;
|
||||||
}
|
}
|
||||||
|
27
udevdb.c
27
udevdb.c
@ -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;
|
||||||
|
}
|
||||||
|
1
udevdb.h
1
udevdb.h
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user