chiark / gitweb /
libudev: device - read database only when needed
[elogind.git] / udev / lib / libudev-util.c
index 7053a2f82554726508bd39110f526233b7a1259d..0e5bc37d4395cc2cd66e79e9aec67739c89bc494 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>
@@ -50,6 +48,7 @@ static ssize_t get_sys_link(struct udev *udev, const char *slink, const char *sy
        if (pos == NULL)
                return -1;
        pos = &pos[1];
+       info(udev, "resolved link to: '%s'\n", pos);
        return util_strlcpy(subsystem, pos, size);
 }
 
@@ -65,12 +64,17 @@ ssize_t util_get_sys_driver(struct udev *udev, const char *syspath, char *driver
 
 int util_resolve_sys_link(struct udev *udev, char *syspath, size_t size)
 {
+       struct stat statbuf;
        char link_target[UTIL_PATH_SIZE];
 
        int len;
        int i;
        int back;
 
+       if (lstat(syspath, &statbuf) < 0)
+               return -1;
+       if (!S_ISLNK(statbuf.st_mode))
+               return -1;
        len = readlink(syspath, link_target, sizeof(link_target));
        if (len <= 0)
                return -1;
@@ -93,61 +97,6 @@ int util_resolve_sys_link(struct udev *udev, char *syspath, size_t 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;