chiark / gitweb /
always include config.h from Makefile
[elogind.git] / udev / lib / libudev-util.c
index 7aea8c67fba38ad464895b4889f5bbf397a90403..7eadc7f2961270842691b12b0b223dee5174a095 100644 (file)
@@ -17,8 +17,6 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "config.h"
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <stddef.h>
 #include <string.h>
 #include <dirent.h>
 #include <ctype.h>
+#include <fcntl.h>
 #include <sys/stat.h>
 
 #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 *subsystem, 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));
@@ -50,54 +48,52 @@ static ssize_t get_sys_link(struct udev *udev, const char *slink, const char *de
        if (pos == NULL)
                return -1;
        pos = &pos[1];
+       info(udev, "resolved link to: '%s'\n", pos);
        return util_strlcpy(subsystem, 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, int sort)
+                                          const char *name, const char *value, int sort)
 {
        struct util_name_entry *name_loop;
        struct util_name_entry *name_new;
@@ -126,7 +122,14 @@ struct util_name_entry *util_name_list_add(struct udev *udev, struct list_head *
                free(name_new);
                return NULL;
        }
-       dbg(udev, "adding '%s'\n", name_new->name);
+       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;
 }
@@ -139,6 +142,7 @@ void util_name_list_cleanup(struct udev *udev, struct list_head *name_list)
        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);
        }
 }