X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev%2Flib%2Flibudev-util.c;h=9353e8eda792ef2bf9a85ebfd607d84c6ef0fc7c;hb=86b5778857522087e74182f26f0e565adea0c699;hp=50eacdd37d760c402b56a1462a8f4708f9b45095;hpb=93b0f384589fce818edb9678571a30e71930d14c;p=elogind.git
diff --git a/udev/lib/libudev-util.c b/udev/lib/libudev-util.c
index 50eacdd37..9353e8eda 100644
--- a/udev/lib/libudev-util.c
+++ b/udev/lib/libudev-util.c
@@ -17,8 +17,6 @@
* along with this program. If not, see .
*/
-#include "config.h"
-
#include
#include
#include
@@ -33,14 +31,13 @@
#include "libudev.h"
#include "libudev-private.h"
-static ssize_t get_sys_link(struct udev *udev, const char *slink, const char *devpath, char *subsystem, size_t size)
+static ssize_t get_sys_link(struct udev *udev, const char *slink, const char *syspath, char *value, size_t size)
{
char path[UTIL_PATH_SIZE];
ssize_t len;
const char *pos;
- util_strlcpy(path, udev_get_sys_path(udev), sizeof(path));
- util_strlcat(path, devpath, sizeof(path));
+ util_strlcpy(path, syspath, sizeof(path));
util_strlcat(path, "/", sizeof(path));
util_strlcat(path, slink, sizeof(path));
len = readlink(path, path, sizeof(path));
@@ -51,107 +48,50 @@ static ssize_t get_sys_link(struct udev *udev, const char *slink, const char *de
if (pos == NULL)
return -1;
pos = &pos[1];
- return util_strlcpy(subsystem, pos, size);
+ dbg(udev, "resolved link to: '%s'\n", pos);
+ return util_strlcpy(value, pos, size);
}
-ssize_t util_get_sys_subsystem(struct udev *udev, const char *devpath, char *subsystem, size_t size)
+ssize_t util_get_sys_subsystem(struct udev *udev, const char *syspath, char *subsystem, size_t size)
{
- return get_sys_link(udev, "subsystem", devpath, subsystem, size);
+ return get_sys_link(udev, "subsystem", syspath, subsystem, size);
}
-ssize_t util_get_sys_driver(struct udev *udev, const char *devpath, char *driver, size_t size)
+ssize_t util_get_sys_driver(struct udev *udev, const char *syspath, char *driver, size_t size)
{
- return get_sys_link(udev, "driver", devpath, driver, size);
+ return get_sys_link(udev, "driver", syspath, driver, size);
}
-int util_resolve_sys_link(struct udev *udev, char *devpath, size_t size)
+int util_resolve_sys_link(struct udev *udev, char *syspath, size_t size)
{
- char link_path[UTIL_PATH_SIZE];
char link_target[UTIL_PATH_SIZE];
int len;
int i;
int back;
- util_strlcpy(link_path, udev_get_sys_path(udev), sizeof(link_path));
- util_strlcat(link_path, devpath, sizeof(link_path));
- len = readlink(link_path, link_target, sizeof(link_target));
+ len = readlink(syspath, link_target, sizeof(link_target));
if (len <= 0)
return -1;
link_target[len] = '\0';
- dbg(udev, "path link '%s' points to '%s'\n", devpath, link_target);
+ dbg(udev, "path link '%s' points to '%s'\n", syspath, link_target);
for (back = 0; strncmp(&link_target[back * 3], "../", 3) == 0; back++)
;
- dbg(udev, "base '%s', tail '%s', back %i\n", devpath, &link_target[back * 3], back);
+ dbg(udev, "base '%s', tail '%s', back %i\n", syspath, &link_target[back * 3], back);
for (i = 0; i <= back; i++) {
- char *pos = strrchr(devpath, '/');
+ char *pos = strrchr(syspath, '/');
if (pos == NULL)
return -1;
pos[0] = '\0';
}
- dbg(udev, "after moving back '%s'\n", devpath);
- util_strlcat(devpath, "/", size);
- util_strlcat(devpath, &link_target[back * 3], size);
+ dbg(udev, "after moving back '%s'\n", syspath);
+ util_strlcat(syspath, "/", size);
+ util_strlcat(syspath, &link_target[back * 3], size);
return 0;
}
-struct util_name_entry *util_name_list_add(struct udev *udev, struct list_head *name_list,
- const char *name, const char *value, int sort)
-{
- struct util_name_entry *name_loop;
- struct util_name_entry *name_new;
-
- /* avoid duplicate entries */
- list_for_each_entry(name_loop, name_list, node) {
- if (strcmp(name_loop->name, name) == 0) {
- dbg(udev, "'%s' is already in the list\n", name);
- return name_loop;
- }
- }
-
- if (sort) {
- list_for_each_entry(name_loop, name_list, node) {
- if (strcmp(name_loop->name, name) > 0)
- break;
- }
- }
-
- name_new = malloc(sizeof(struct util_name_entry));
- if (name_new == NULL)
- return NULL;
- memset(name_new, 0x00, sizeof(struct util_name_entry));
- name_new->name = strdup(name);
- if (name_new->name == NULL) {
- free(name_new);
- return NULL;
- }
- if (value != NULL) {
- name_new->value = strdup(value);
- if (name_new->value == NULL) {
- free(name_new);
- return NULL;
- }
- }
- dbg(udev, "adding '%s=%s'\n", name_new->name, name_new->value);
- list_add_tail(&name_new->node, &name_loop->node);
- return name_new;
-}
-
-void util_name_list_cleanup(struct udev *udev, struct list_head *name_list)
-{
- struct util_name_entry *name_loop;
- struct util_name_entry *name_tmp;
-
- list_for_each_entry_safe(name_loop, name_tmp, name_list, node) {
- list_del(&name_loop->node);
- free(name_loop->name);
- free(name_loop->value);
- free(name_loop);
- }
-}
-
int util_log_priority(const char *priority)
{
char *endptr;
@@ -174,7 +114,6 @@ size_t util_path_encode(char *s, size_t len)
char t[(len * 3)+1];
size_t i, j;
- t[0] = '\0';
for (i = 0, j = 0; s[i] != '\0'; i++) {
if (s[i] == '/') {
memcpy(&t[j], "\\x2f", 4);
@@ -187,8 +126,11 @@ size_t util_path_encode(char *s, size_t len)
j++;
}
}
- t[j] = '\0';
- strncpy(s, t, len);
+ if (len == 0)
+ return j;
+ i = (j < len - 1) ? j : len - 1;
+ memcpy(s, t, i);
+ s[i] = '\0';
return j;
}