chiark / gitweb /
util: introduce readlink_and_make_absolute()
authorLennart Poettering <lennart@poettering.net>
Tue, 15 Jun 2010 23:56:00 +0000 (01:56 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 15 Jun 2010 23:56:00 +0000 (01:56 +0200)
src/load-fragment.c
src/util.c
src/util.h

index 79b0893addef64adcf7500a20fbbd3e68a933381..793c9525941a9c4fc307a10de93f342966e655be 100644 (file)
@@ -1160,7 +1160,7 @@ static int open_follow(char **filename, FILE **_f, Set *names, char **_final) {
          * reached by a symlink. The old string will be freed. */
 
         for (;;) {
-                char *target, *k, *name;
+                char *target, *name;
 
                 if (c++ >= FOLLOW_MAX)
                         return -ELOOP;
@@ -1189,17 +1189,11 @@ static int open_follow(char **filename, FILE **_f, Set *names, char **_final) {
                         return -errno;
 
                 /* Hmm, so this is a symlink. Let's read the name, and follow it manually */
-                if ((r = readlink_malloc(*filename, &target)) < 0)
+                if ((r = readlink_and_make_absolute(*filename, &target)) < 0)
                         return r;
 
-                k = file_in_same_dir(*filename, target);
-                free(target);
-
-                if (!k)
-                        return -ENOMEM;
-
                 free(*filename);
-                *filename = k;
+                *filename = target;
         }
 
         if (!(f = fdopen(fd, "r"))) {
index 7664df59d06359150f0a5c1a82d13b16800038ed..2bc90da3d2b20bf92ad239c265d42f924e968e77 100644 (file)
@@ -582,6 +582,26 @@ int readlink_malloc(const char *p, char **r) {
         }
 }
 
+int readlink_and_make_absolute(const char *p, char **r) {
+        char *target, *k;
+        int j;
+
+        assert(p);
+        assert(r);
+
+        if ((j = readlink_malloc(p, &target)) < 0)
+                return j;
+
+        k = file_in_same_dir(p, target);
+        free(target);
+
+        if (!k)
+                return -ENOMEM;
+
+        *r = k;
+        return 0;
+}
+
 char *file_name_from_path(const char *p) {
         char *r;
 
index efc993c370488a6bfea6dda302ad0b7f3949495f..cacc3969b2e9f3e28cd7a5587b63d6165c10def2 100644 (file)
@@ -139,6 +139,7 @@ int read_one_line_file(const char *fn, char **line);
 char *strappend(const char *s, const char *suffix);
 
 int readlink_malloc(const char *p, char **r);
+int readlink_and_make_absolute(const char *p, char **r);
 
 char *file_name_from_path(const char *p);
 bool is_path(const char *p);