From ddcdee9147b9d49eace7293cf60b7a7e4da959f4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zolt=C3=A1n=20B=C3=B6sz=C3=B6rm=C3=A9nyi?= Date: Tue, 2 Feb 2021 09:42:37 +0100 Subject: [PATCH] fix(dracut-install): allow globbing for multiple sources MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Zoltán Böszörményi --- install/dracut-install.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/install/dracut-install.c b/install/dracut-install.c index 17544ac68..24c5287f5 100644 --- a/install/dracut-install.c +++ b/install/dracut-install.c @@ -1318,8 +1318,30 @@ static int install_all(int argc, char **argv) } } else { - _cleanup_free_ char *dest = strdup(argv[i]); - ret = dracut_install(argv[i], dest, arg_createdir, arg_resolvedeps, true); + if (strchr(argv[i], '*') == NULL) { + _cleanup_free_ char *dest = strdup(argv[i]); + ret = dracut_install(argv[i], dest, arg_createdir, arg_resolvedeps, true); + } else { + _cleanup_free_ char *realsrc = NULL; + _cleanup_globfree_ glob_t globbuf; + + ret = asprintf(&realsrc, "%s%s", sysrootdir ? sysrootdir : "", argv[i]); + if (ret < 0) { + log_error("Out of memory!"); + exit(EXIT_FAILURE); + } + + ret = glob(realsrc, 0, NULL, &globbuf); + if (ret == 0) { + int j; + + for (j = 0; j < globbuf.gl_pathc; j++) { + char *dest = strdup(globbuf.gl_pathv[j] + sysrootdirlen); + ret |= dracut_install(globbuf.gl_pathv[j] + sysrootdirlen, dest, arg_createdir, arg_resolvedeps, true); + free(dest); + } + } + } } if ((ret != 0) && (!arg_optional)) { -- 2.47.3