diff options
author | Jose Bollo <jose.bollo@iot.bzh> | 2018-07-03 15:53:18 +0200 |
---|---|---|
committer | Jose Bollo <jose.bollo@iot.bzh> | 2018-07-03 19:25:38 +0200 |
commit | 4f7f5ae8e1907b23cb74178dea68790a6fa963fe (patch) | |
tree | 372b70876870158114f64396759186ee9dd03168 /src/afb-api-so.c | |
parent | f645c76e0bfa772aff97141389d45476bf091053 (diff) |
Improve readdirs to follow symbolic links
The use of symbolic links can be helpful in
some cases. That modification takes care of
allowing symbolic links in the exploration
of directories.
Change-Id: I54d9004187ba5942410aca37b890cd4f6925177d
Signed-off-by: Jose Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'src/afb-api-so.c')
-rw-r--r-- | src/afb-api-so.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/afb-api-so.c b/src/afb-api-so.c index 2b71d92f..87281977 100644 --- a/src/afb-api-so.c +++ b/src/afb-api-so.c @@ -152,6 +152,7 @@ static int adddirs(char path[PATH_MAX], size_t end, struct afb_apiset *declare_s { DIR *dir; struct dirent *dent; + struct stat st; size_t len; int rc = 0; @@ -175,12 +176,19 @@ static int adddirs(char path[PATH_MAX], size_t end, struct afb_apiset *declare_s break; } + /* get the name and inspect dereferenced link instead of the directory entry */ len = strlen(dent->d_name); if (len + end >= PATH_MAX) { - ERROR("path too long while scanning bindings for %s", dent->d_name); + ERROR("path too long while scanning bindings for %.*s%s", (int)end, path, dent->d_name); + continue; + } + memcpy(&path[end], dent->d_name, len+1); + rc = stat(path, &st); + if (rc < 0) { + ERROR("getting status of %s failed: %m", path); continue; } - if (dent->d_type == DT_DIR) { + else if (S_ISDIR(st.st_mode)) { /* case of directories */ if (dent->d_name[0] == '.') { /* @@ -213,7 +221,7 @@ debug file made dlopen crashing. See https://sourceware.org/bugzilla/show_bug.cgi?id=22101 */ #if !defined(AFB_API_SO_ACCEPT_DOT_PREFIXED_DIRS) /* not defined by default */ - continue; /* ignore any directory beginnign with a dot */ + continue; /* ignore any directory beginning with a dot */ #else if (len == 1) continue; /* . */ @@ -230,13 +238,11 @@ See https://sourceware.org/bugzilla/show_bug.cgi?id=22101 #endif #endif } - memcpy(&path[end], dent->d_name, len+1); rc = adddirs(path, end+len, declare_set, call_set, failstops); - } else if (dent->d_type == DT_REG || dent->d_type == DT_LNK) { + } else if (S_ISREG(st.st_mode)) { /* case of files */ if (memcmp(&dent->d_name[len - 3], ".so", 4)) continue; - memcpy(&path[end], dent->d_name, len+1); rc = load_binding(path, 0, declare_set, call_set); } if (rc < 0 && failstops) { |