]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
fix(dracut-install): allow globbing for multiple sources
authorZoltán Böszörményi <zboszor@pr.hu>
Tue, 2 Feb 2021 08:42:37 +0000 (09:42 +0100)
committerJóhann B. Guðmundsson <johannbg@gmail.com>
Tue, 9 Feb 2021 07:09:28 +0000 (07:09 +0000)
Signed-off-by: Zoltán Böszörményi <zboszor@pr.hu>
install/dracut-install.c

index 17544ac6839b33a696a4ce30507a9baa52bcca38..24c5287f5602181e1d947dc0493a6320d7dc0bfd 100644 (file)
@@ -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)) {