From e1119791504bc5cc2302a844232dd469408b769d Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Wed, 18 Feb 2015 19:50:37 +0100 Subject: [PATCH 1/1] libfstools: extroot: rework libdir and block tool discovery Account for new upper/ directory component in recent overlayfs versions. Signed-off-by: Jo-Philipp Wich --- libfstools/extroot.c | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/libfstools/extroot.c b/libfstools/extroot.c index ca38ce1..4225d8b 100644 --- a/libfstools/extroot.c +++ b/libfstools/extroot.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "libfstools.h" @@ -32,29 +33,43 @@ int mount_extroot(void) { char ldlib_path[32]; char block_path[32]; - char kmod_loader[64]; + char kmod_loader[128]; + char *kmod_prefix; struct stat s; pid_t pid; if (!extroot_prefix) return -1; - sprintf(ldlib_path, "%s/lib", extroot_prefix); - sprintf(block_path, "%s/sbin/block", extroot_prefix); + /* try finding the library directory */ + snprintf(ldlib_path, sizeof(ldlib_path), "%s/upper/lib", extroot_prefix); - if (stat(block_path, &s)) { - sprintf(block_path, "/sbin/block"); - if (stat(block_path, &s)) - return -1; - } + if (stat(ldlib_path, &s) || !S_ISDIR(s.st_mode)) + snprintf(ldlib_path, sizeof(ldlib_path), "%s/lib", extroot_prefix); + + /* try finding the block executable */ + snprintf(block_path, sizeof(block_path), "%s/upper/sbin/block", extroot_prefix); + + if (stat(block_path, &s) || !S_ISREG(s.st_mode)) + snprintf(block_path, sizeof(block_path), "%s/sbin/block", extroot_prefix); - sprintf(kmod_loader, "/sbin/kmodloader %s/etc/modules-boot.d/ %s", extroot_prefix, extroot_prefix); - system(kmod_loader); + if (stat(block_path, &s) || !S_ISREG(s.st_mode)) + snprintf(block_path, sizeof(block_path), "/sbin/block"); + + if (stat(block_path, &s) || !S_ISREG(s.st_mode)) + return -1; + + /* set LD_LIBRARY_PATH env var and load kmods from overlay if we found a lib directory there */ + if (!stat(ldlib_path, &s) && S_ISDIR(s.st_mode)) { + setenv("LD_LIBRARY_PATH", ldlib_path, 1); + kmod_prefix = dirname(ldlib_path); + sprintf(kmod_loader, "/sbin/kmodloader %s/etc/modules-boot.d/ %s", kmod_prefix, kmod_prefix); + system(kmod_loader); + } pid = fork(); if (!pid) { mkdir("/tmp/extroot", 0755); - setenv("LD_LIBRARY_PATH", ldlib_path, 1); execl(block_path, block_path, "extroot", NULL); exit(-1); } else if (pid > 0) { -- 2.11.0