summaryrefslogtreecommitdiff
path: root/src/shared/base-filesystem.c
diff options
context:
space:
mode:
authorKay Sievers <kay@vrfy.org>2014-07-01 12:12:40 +0200
committerKay Sievers <kay@vrfy.org>2014-07-01 12:12:40 +0200
commit3fd165e53a90dd30af00ec0e963d8e132e3506f9 (patch)
treef977cb4950ef88e1546d4fd6e6e7f62025d9e5e3 /src/shared/base-filesystem.c
parente1ae9755ab70a58b8fb84973e084296b1d2df3d5 (diff)
base-filesystem: explicitely check existence of the platform's ABI dynamic loader
Diffstat (limited to 'src/shared/base-filesystem.c')
-rw-r--r--src/shared/base-filesystem.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/shared/base-filesystem.c b/src/shared/base-filesystem.c
index 682155bb45..f68386b8e3 100644
--- a/src/shared/base-filesystem.c
+++ b/src/shared/base-filesystem.c
@@ -38,16 +38,17 @@ typedef struct BaseFilesystem {
const char *dir;
mode_t mode;
const char *target;
+ const char *exists;
} BaseFilesystem;
static const BaseFilesystem table[] = {
- { "bin", 0, "usr/bin" },
- { "lib", 0, "usr/lib" },
+ { "bin", 0, "usr/bin", NULL },
+ { "lib", 0, "usr/lib", NULL },
+ { "root", 0755, NULL, NULL },
+ { "sbin", 0, "usr/sbin", NULL },
#if defined(__i386__) || defined(__x86_64__)
- { "lib64", 0, "usr/lib/x86_64-linux-gnu\0usr/lib64" },
+ { "lib64", 0, "usr/lib/x86_64-linux-gnu\0usr/lib64", "ld-linux-x86-64.so.2" },
#endif
- { "root", 0755, NULL },
- { "sbin", 0, "usr/sbin" },
};
int base_filesystem_create(const char *root) {
@@ -69,6 +70,18 @@ int base_filesystem_create(const char *root) {
if (faccessat(fd, s, F_OK, AT_SYMLINK_NOFOLLOW) < 0)
continue;
+ /* check if a specific file exists at the target path */
+ if (table[i].exists) {
+ _cleanup_free_ char *p = NULL;
+
+ p = strjoin(s, "/", table[i].exists, NULL);
+ if (!p)
+ return log_oom();
+
+ if (faccessat(fd, p, F_OK, AT_SYMLINK_NOFOLLOW) < 0)
+ continue;
+ }
+
target = s;
break;
}