@@ -32,8 +32,9 @@ static void print_help(char *const name)
32
32
fprintf (stderr ,
33
33
"Usage: %s [OPTIONS] NEWROOT COMMAND [COMMAND_ARGS...]\n"
34
34
"OPTIONS: \n"
35
- " -h --help Show help\n"
36
- " --net=NET_MODE Set network mode\n"
35
+ " -h --help Show help\n"
36
+ " --net=NET_MODE Set network mode\n"
37
+ " --passt-socket=PATH Instead of starting passt, connect to passt socket at PATH"
37
38
"NET_MODE can be either TSI (default) or PASST\n"
38
39
"\n"
39
40
"NEWROOT: the root directory of the vm\n"
@@ -46,12 +47,14 @@ static void print_help(char *const name)
46
47
static const struct option long_options [] = {
47
48
{ "help" , no_argument , NULL , 'h' },
48
49
{ "net_mode" , required_argument , NULL , 'N' },
50
+ { "passt-socket" , required_argument , NULL , 'P' },
49
51
{ NULL , 0 , NULL , 0 }
50
52
};
51
53
52
54
struct cmdline {
53
55
bool show_help ;
54
56
enum net_mode net_mode ;
57
+ char const * passt_socket_path ;
55
58
char const * new_root ;
56
59
char * const * guest_argv ;
57
60
};
@@ -64,6 +67,7 @@ bool parse_cmdline(int argc, char *const argv[], struct cmdline *cmdline)
64
67
* cmdline = (struct cmdline ){
65
68
.show_help = false,
66
69
.net_mode = NET_MODE_TSI ,
70
+ .passt_socket_path = NULL ,
67
71
.new_root = NULL ,
68
72
.guest_argv = NULL ,
69
73
};
@@ -86,6 +90,9 @@ bool parse_cmdline(int argc, char *const argv[], struct cmdline *cmdline)
86
90
return false;
87
91
}
88
92
break ;
93
+ case 'P' :
94
+ cmdline -> passt_socket_path = optarg ;
95
+ break ;
89
96
case '?' :
90
97
return false;
91
98
default :
@@ -132,6 +139,47 @@ int connect_to_passt()
132
139
return socket_fd ;
133
140
}
134
141
142
+ int start_passt ()
143
+ {
144
+ int socket_fds [2 ];
145
+ const int PARENT = 0 ;
146
+ const int CHILD = 1 ;
147
+
148
+ if (socketpair (AF_UNIX , SOCK_STREAM , 0 , socket_fds ) < 0 ) {
149
+ perror ("Failed to create passt socket fd" );
150
+ return -1 ;
151
+ }
152
+
153
+ int pid = fork ();
154
+ if (pid < 0 ) {
155
+ perror ("fork" );
156
+ return -1 ;
157
+ }
158
+
159
+ if (pid == 0 ) { // child
160
+ if (close (socket_fds [PARENT ]) < 0 ) {
161
+ perror ("close PARENT" );
162
+ }
163
+
164
+ char fd_as_str [16 ];
165
+ snprintf (fd_as_str , sizeof (fd_as_str ), "%d" , socket_fds [CHILD ]);
166
+
167
+ printf ("passing fd %s to passt" , fd_as_str );
168
+
169
+ if (execlp ("passt" , "passt" , "-f" , "--fd" , fd_as_str , NULL ) < 0 ) {
170
+ perror ("execlp" );
171
+ return -1 ;
172
+ }
173
+
174
+ } else { // parent
175
+ if (close (socket_fds [CHILD ]) < 0 ) {
176
+ perror ("close CHILD" );
177
+ }
178
+
179
+ return socket_fds [PARENT ];
180
+ }
181
+ }
182
+
135
183
136
184
int main (int argc , char * const argv [])
137
185
{
@@ -233,7 +281,8 @@ int main(int argc, char *const argv[])
233
281
return -1 ;
234
282
}
235
283
} else {
236
- int passt_fd = connect_to_passt ();
284
+ int passt_fd = cmdline .passt_socket_path ? connect_to_passt (cmdline .passt_socket_path ) : start_passt ();
285
+
237
286
if (passt_fd < 0 ) {
238
287
return -1 ;
239
288
}
0 commit comments