X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udevdb.c;h=f2469367109870009786cd6f5241c246ada8fafb;hp=8d077ea94fc766b652cdd0af705210867e23218f;hb=bbbe503ec1a5623a5a8abd003f46fdd8c3581054;hpb=ee1db00d07ed1db55061ba5e2cb54800cc3e2495 diff --git a/udevdb.c b/udevdb.c index 8d077ea94..f24693671 100644 --- a/udevdb.c +++ b/udevdb.c @@ -1,5 +1,5 @@ /* - * udevdb.c + * udevdb.c - udev database library * * Userspace devfs * @@ -21,24 +21,25 @@ * */ -/* - * udev database library - */ #define _KLIBC_HAS_ARCH_SIG_ATOMIC_T #include #include +#include +#include #include #include #include #include #include -#include "udev_version.h" +#include "libsysfs/sysfs/libsysfs.h" #include "udev.h" +#include "udev_lib.h" +#include "udev_version.h" +#include "logging.h" #include "namedev.h" #include "udevdb.h" #include "tdb/tdb.h" -#include "libsysfs/libsysfs.h" static TDB_CONTEXT *udevdb; @@ -52,13 +53,14 @@ int udevdb_add_dev(const char *path, const struct udevice *dev) return -ENODEV; memset(keystr, 0, NAME_SIZE); - strcpy(keystr, path); + strfieldcpy(keystr, path); key.dptr = keystr; key.dsize = strlen(keystr) + 1; data.dptr = (void *)dev; - data.dsize = sizeof(*dev); - + data.dsize = UDEVICE_LEN; + dbg("store key '%s' for device '%s'", path, dev->name); + return tdb_store(udevdb, key, data, TDB_REPLACE); } @@ -76,7 +78,8 @@ int udevdb_get_dev(const char *path, struct udevice *dev) if (data.dptr == NULL || data.dsize == 0) return -ENODEV; - memcpy(dev, data.dptr, sizeof(*dev)); + memset(dev, 0, sizeof(struct udevice)); + memcpy(dev, data.dptr, UDEVICE_LEN); return 0; } @@ -89,7 +92,7 @@ int udevdb_delete_dev(const char *path) return -EINVAL; memset(keystr, 0, sizeof(keystr)); - strcpy(keystr, path); + strfieldcpy(keystr, path); key.dptr = keystr; key.dsize = strlen(keystr) + 1; @@ -142,25 +145,78 @@ int udevdb_open_ro(void) return 0; } -void (*user_record_callback) (char *path, struct udevice *dev); +static int (*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; + return user_record_callback((char*) key.dptr, (struct udevice*) dbuf.dptr); } /** - * udevdb_dump: dumps whole database by passing record data to user function + * udevdb_call_foreach: 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)) +int udevdb_call_foreach(int (*user_record_handler) (char *path, struct udevice *dev)) { + int retval = 0; + 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); + retval = tdb_traverse(udevdb, traverse_callback, NULL); + if (retval < 0) + return -ENODEV; + else + return 0; +} + +static struct udevice *find_dev; +static char *find_path; +static const char *find_name; +static int find_found; + +static int find_device_by_name(char *path, struct udevice *dev) +{ + char *pos; + int len; + + if (strncmp(dev->name, find_name, sizeof(dev->name)) == 0) { + memcpy(find_dev, dev, sizeof(struct udevice)); + strfieldcpymax(find_path, path, NAME_SIZE); + find_found = 1; + /* stop search */ + return 1; + } + /* look for matching symlink*/ + foreach_strpart(dev->symlink, " ", pos, len) { + if (strncmp(pos, find_name, len) != 0) + continue; + + if (len != strlen(find_name)) + continue; + + memcpy(find_dev, dev, sizeof(struct udevice)); + strfieldcpymax(find_path, path, NAME_SIZE); + find_found = 1; + return 1; + } return 0; } + +/** + * udevdb_get_dev_byname: search device with given name by traversing the whole database + */ +int udevdb_get_dev_byname(const char *name, char *path, struct udevice *dev) +{ + find_found = 0; + find_path = path; + find_dev = dev; + find_name = name; + udevdb_call_foreach(find_device_by_name); + if (find_found == 1) + return 0; + else + return -1; +}