diff options
author | Tom Gundersen <teg@jklm.no> | 2014-11-07 19:19:02 +0100 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2014-11-07 19:46:14 +0100 |
commit | 9a67bcf27554ee0688198e4d4eb5e541861bf7cb (patch) | |
tree | 8aab119116fc451053cf1bde4d14e1ce960d1ec5 /src/shared | |
parent | f06863bde5de49a503cb8028e89d4b30790f2cbf (diff) |
shared: add readlink_value
Reads the basename of the target of a symlink.
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/util.c | 22 | ||||
-rw-r--r-- | src/shared/util.h | 1 |
2 files changed, 23 insertions, 0 deletions
diff --git a/src/shared/util.c b/src/shared/util.c index 3411cea343..f0e0c0dd3d 100644 --- a/src/shared/util.c +++ b/src/shared/util.c @@ -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; diff --git a/src/shared/util.h b/src/shared/util.h index 24480be682..04f2d8a564 100644 --- a/src/shared/util.h +++ b/src/shared/util.h @@ -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); |