util: introduce readlink_and_make_absolute()
This commit is contained in:
parent
b08a35509c
commit
2c7108c40a
|
@ -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. */
|
* reached by a symlink. The old string will be freed. */
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
char *target, *k, *name;
|
char *target, *name;
|
||||||
|
|
||||||
if (c++ >= FOLLOW_MAX)
|
if (c++ >= FOLLOW_MAX)
|
||||||
return -ELOOP;
|
return -ELOOP;
|
||||||
|
@ -1189,17 +1189,11 @@ static int open_follow(char **filename, FILE **_f, Set *names, char **_final) {
|
||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
/* Hmm, so this is a symlink. Let's read the name, and follow it manually */
|
/* 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;
|
return r;
|
||||||
|
|
||||||
k = file_in_same_dir(*filename, target);
|
|
||||||
free(target);
|
|
||||||
|
|
||||||
if (!k)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
free(*filename);
|
free(*filename);
|
||||||
*filename = k;
|
*filename = target;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(f = fdopen(fd, "r"))) {
|
if (!(f = fdopen(fd, "r"))) {
|
||||||
|
|
20
src/util.c
20
src/util.c
|
@ -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 *file_name_from_path(const char *p) {
|
||||||
char *r;
|
char *r;
|
||||||
|
|
||||||
|
|
|
@ -139,6 +139,7 @@ int read_one_line_file(const char *fn, char **line);
|
||||||
char *strappend(const char *s, const char *suffix);
|
char *strappend(const char *s, const char *suffix);
|
||||||
|
|
||||||
int readlink_malloc(const char *p, char **r);
|
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);
|
char *file_name_from_path(const char *p);
|
||||||
bool is_path(const char *p);
|
bool is_path(const char *p);
|
||||||
|
|
Loading…
Reference in a new issue