16
16
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
17
*/
18
18
19
- /* This is "just enough" of a binary to look like RPM and dracut, as
20
- * far as virt-v2v is concerned.
19
+ /* This is "just enough" of a binary to look like /bin/sh, RPM and
20
+ * dracut, as far as virt-v2v is concerned.
21
21
*/
22
22
23
23
#include <stdio.h>
24
24
#include <stdlib.h>
25
25
#include <string.h>
26
+ #include <unistd.h>
26
27
27
28
/* NB: This is also defined in make-fedora-img.pl */
28
29
#define KVER "5.19.0-0.rc1.14.fc37.x86_64"
@@ -34,6 +35,27 @@ get_basename (const char *str)
34
35
return ret == NULL ? str : ret + 1 ;
35
36
}
36
37
38
+ static void
39
+ add_str (char * * * argv , size_t * argc , char * str )
40
+ {
41
+ (* argc )++ ;
42
+ (* argv ) = realloc (* argv , * argc * sizeof (char * ));
43
+ (* argv )[* argc - 1 ] = str ;
44
+ }
45
+
46
+ static void
47
+ add_null (char * * * argv , size_t * argc )
48
+ {
49
+ add_str (argv , argc , NULL );
50
+ }
51
+
52
+ static void
53
+ add (char * * * argv , size_t * argc , const char * s , size_t len )
54
+ {
55
+ char * copy = strndup (s , len );
56
+ add_str (argv , argc , copy );
57
+ }
58
+
37
59
int
38
60
main (int argc , char * argv [])
39
61
{
@@ -57,10 +79,54 @@ main (int argc, char *argv[])
57
79
strcmp (get_basename (argv [0 ]), "dracut" ) == 0 ) {
58
80
// do nothing, pretend to rebuild the initramfs
59
81
}
82
+ else if (argc == 3 &&
83
+ strcmp (get_basename (argv [0 ]), "sh" ) == 0 &&
84
+ strcmp (argv [1 ], "-c" ) == 0 ) {
85
+ /* Split the command and execute it. Only handles trivial cases. */
86
+ char * cmd = argv [2 ];
87
+ char * * cmdv = NULL ;
88
+ size_t i , cmdvlen = 0 , n ;
89
+ const size_t len = strlen (cmd );
90
+
91
+ for (i = 0 ; i < len ;) {
92
+ switch (cmd [i ]) {
93
+ case ' ' : case '\t' :
94
+ i ++ ;
95
+ continue ;
96
+
97
+ case '"' :
98
+ n = strcspn (& cmd [i + 1 ], "\"" );
99
+ add (& cmdv , & cmdvlen , & cmd [i + 1 ], n );
100
+ i += n + 2 ;
101
+ break ;
102
+
103
+ case '\'' :
104
+ n = strcspn (& cmd [i + 1 ], "'" );
105
+ add (& cmdv , & cmdvlen , & cmd [i + 1 ], n );
106
+ i += n + 2 ;
107
+ break ;
108
+
109
+ default :
110
+ n = strcspn (& cmd [i ], " \t" );
111
+ add (& cmdv , & cmdvlen , & cmd [i ], n );
112
+ i += n ;
113
+ }
114
+ }
115
+ add_null (& cmdv , & cmdvlen );
116
+
117
+ execvp (cmdv [0 ], cmdv );
118
+ perror (cmdv [0 ]);
119
+ exit (EXIT_FAILURE );
120
+ }
60
121
else {
61
- fprintf (stderr , "phony Fedora: unknown command\n" );
62
- exit (1 );
122
+ int i ;
123
+
124
+ fprintf (stderr , "ERROR: test-data/phony-guests/fedora.c: "
125
+ "unexpected command:\n" );
126
+ for (i = 0 ; i < argc ; ++ i )
127
+ fprintf (stderr , "argv[%d] = %s\n" , i , argv [i ]);
128
+ exit (EXIT_FAILURE );
63
129
}
64
130
65
- exit (0 );
131
+ exit (EXIT_SUCCESS );
66
132
}
0 commit comments