base-filesystem: explicitely check existence of the platform's ABI dynamic loader

This commit is contained in:
Kay Sievers 2014-07-01 12:12:40 +02:00
parent e1ae9755ab
commit 3fd165e53a
1 changed files with 18 additions and 5 deletions

View File

@ -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;
}