152 lines
4.4 KiB
Diff
152 lines
4.4 KiB
Diff
|
From 065f95e7afa45bf465e8799baa11c019f9403bd6 Mon Sep 17 00:00:00 2001
|
||
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
||
|
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 <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
+#include <unistd.h>
|
||
|
|
||
|
/* 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');
|