From 065f95e7afa45bf465e8799baa11c019f9403bd6 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Wed, 19 Feb 2025 15:15:30 +0000 Subject: [PATCH] test-data: phony fedora: Add simple static /bin/sh This is able to do enough to run commands via g#sh and related calls inside the phony Fedora image. (cherry picked from commit 4c5854f54e1da0d96807acb1b047bbf34694a0bb) --- cat/test-virt-ls.sh | 1 + test-data/phony-guests/fedora.c | 76 +++++++++++++++++++++-- test-data/phony-guests/make-fedora-img.pl | 6 +- 3 files changed, 76 insertions(+), 7 deletions(-) diff --git a/cat/test-virt-ls.sh b/cat/test-virt-ls.sh index e98faa42b..577a44860 100755 --- a/cat/test-virt-ls.sh +++ b/cat/test-virt-ls.sh @@ -24,6 +24,7 @@ skip_if_skipped # Read out the test directory using virt-ls. if [ "$($VG virt-ls --format=raw -a ../test-data/phony-guests/fedora.img /bin)" != "ls rpm +sh test1 test2 test3 diff --git a/test-data/phony-guests/fedora.c b/test-data/phony-guests/fedora.c index c57fa57cc..df097e9e6 100644 --- a/test-data/phony-guests/fedora.c +++ b/test-data/phony-guests/fedora.c @@ -16,13 +16,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -/* This is "just enough" of a binary to look like RPM and dracut, as - * far as virt-v2v is concerned. +/* This is "just enough" of a binary to look like /bin/sh, RPM and + * dracut, as far as virt-v2v is concerned. */ #include #include #include +#include /* NB: This is also defined in make-fedora-img.pl */ #define KVER "5.19.0-0.rc1.14.fc37.x86_64" @@ -34,6 +35,27 @@ get_basename (const char *str) return ret == NULL ? str : ret + 1; } +static void +add_str (char ***argv, size_t *argc, char *str) +{ + (*argc)++; + (*argv) = realloc (*argv, *argc * sizeof (char *)); + (*argv)[*argc-1] = str; +} + +static void +add_null (char ***argv, size_t *argc) +{ + add_str (argv, argc, NULL); +} + +static void +add (char ***argv, size_t *argc, const char *s, size_t len) +{ + char *copy = strndup (s, len); + add_str (argv, argc, copy); +} + int main (int argc, char *argv[]) { @@ -57,10 +79,54 @@ main (int argc, char *argv[]) strcmp (get_basename (argv[0]), "dracut") == 0) { // do nothing, pretend to rebuild the initramfs } + else if (argc == 3 && + strcmp (get_basename (argv[0]), "sh") == 0 && + strcmp (argv[1], "-c") == 0) { + /* Split the command and execute it. Only handles trivial cases. */ + char *cmd = argv[2]; + char **cmdv = NULL; + size_t i, cmdvlen = 0, n; + const size_t len = strlen (cmd); + + for (i = 0; i < len;) { + switch (cmd[i]) { + case ' ': case '\t': + i++; + continue; + + case '"': + n = strcspn (&cmd[i+1], "\""); + add (&cmdv, &cmdvlen, &cmd[i+1], n); + i += n+2; + break; + + case '\'': + n = strcspn (&cmd[i+1], "'"); + add (&cmdv, &cmdvlen, &cmd[i+1], n); + i += n+2; + break; + + default: + n = strcspn (&cmd[i], " \t"); + add (&cmdv, &cmdvlen, &cmd[i], n); + i += n; + } + } + add_null (&cmdv, &cmdvlen); + + execvp (cmdv[0], cmdv); + perror (cmdv[0]); + exit (EXIT_FAILURE); + } else { - fprintf (stderr, "phony Fedora: unknown command\n"); - exit (1); + int i; + + fprintf (stderr, "ERROR: test-data/phony-guests/fedora.c: " + "unexpected command:\n"); + for (i = 0; i < argc; ++i) + fprintf (stderr, "argv[%d] = %s\n", i, argv[i]); + exit (EXIT_FAILURE); } - exit (0); + exit (EXIT_SUCCESS); } diff --git a/test-data/phony-guests/make-fedora-img.pl b/test-data/phony-guests/make-fedora-img.pl index 0de506324..fef8ce032 100755 --- a/test-data/phony-guests/make-fedora-img.pl +++ b/test-data/phony-guests/make-fedora-img.pl @@ -369,8 +369,10 @@ $g->ln_s ('/bin/test1', '/bin/test5'); $g->mkfifo (0777, '/bin/test6'); $g->mknod (0777, 10, 10, '/bin/test7'); -# Virt-v2v needs an RPM command, or at least something which acts -# similarly, and also a dracut command. +# Virt-v2v needs a /bin/sh, an RPM command and a dracut command, or at +# least something which acts similarly to those. +$g->upload ('fedora-static-bin', '/bin/sh'); +$g->chmod (0777, '/bin/sh'); $g->upload ('fedora-static-bin', '/bin/rpm'); $g->chmod (0777, '/bin/rpm'); $g->upload ('fedora-static-bin', '/sbin/dracut');