chiark / gitweb /
shared: add readlink_value
authorTom Gundersen <teg@jklm.no>
Fri, 7 Nov 2014 18:19:02 +0000 (19:19 +0100)
committerTom Gundersen <teg@jklm.no>
Fri, 7 Nov 2014 18:46:14 +0000 (19:46 +0100)
Reads the basename of the target of a symlink.

src/shared/util.c
src/shared/util.h

index 3411cea34305b783420ec88f2f3cb91dd2a9e6bf..f0e0c0dd3d0c6f1ea9583a0ac49d361034aae0aa 100644 (file)
@@ -893,6 +893,28 @@ int readlink_malloc(const char *p, char **ret) {
         return readlinkat_malloc(AT_FDCWD, p, ret);
 }
 
+int readlink_value(const char *p, char **ret) {
+        _cleanup_free_ char *link = NULL;
+        char *value;
+        int r;
+
+        r = readlink_malloc(p, &link);
+        if (r < 0)
+                return r;
+
+        value = basename(link);
+        if (!value)
+                return -ENOENT;
+
+        value = strdup(value);
+        if (!value)
+                return -ENOMEM;
+
+        *ret = value;
+
+        return 0;
+}
+
 int readlink_and_make_absolute(const char *p, char **r) {
         _cleanup_free_ char *target = NULL;
         char *k;
index 24480be682c3f51d8f83a7586a8102b52ed2ce51..04f2d8a5647bcd54dbdd53e57ecae382aa8d28a4 100644 (file)
@@ -270,6 +270,7 @@ char **replace_env_argv(char **argv, char **env);
 
 int readlinkat_malloc(int fd, const char *p, char **ret);
 int readlink_malloc(const char *p, char **r);
+int readlink_value(const char *p, char **ret);
 int readlink_and_make_absolute(const char *p, char **r);
 int readlink_and_canonicalize(const char *p, char **r);