qrap: Adapt -net/-netdev command-line mangling to existing arguments

If a socket netdev parameter is already passed, don't touch the command
line. If it's not, add it, taking the id= reference from a netdev=
parameter, if any.

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
Stefano Brivio 2021-05-11 17:08:15 +02:00
parent f98e3589b4
commit 7503332a1e

36
qrap.c
View file

@ -64,11 +64,11 @@ void usage(const char *name)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
char *qemu_argv[ARG_MAX], net_id[ARG_MAX] = { 0 }, *net_id_end; char *qemu_argv[ARG_MAX], net_id[ARG_MAX] = { 0 }, *net_id_end;
int i, s, qemu_argc = 0, in_netdev = 0, has_socket = 0;
struct sockaddr_un addr = { struct sockaddr_un addr = {
.sun_family = AF_UNIX, .sun_family = AF_UNIX,
.sun_path = UNIX_SOCK_PATH, .sun_path = UNIX_SOCK_PATH,
}; };
int i, s, qemu_argc = 0;
char fd_str[ARG_MAX]; char fd_str[ARG_MAX];
long fd; long fd;
@ -93,9 +93,14 @@ int main(int argc, char **argv)
for (qemu_argc = 1, i = 1; i < argc; i++) { for (qemu_argc = 1, i = 1; i < argc; i++) {
char *p; char *p;
if (!strcmp(argv[i], "-net") || (!strcmp(argv[i], "-netdev"))) { if (in_netdev) {
i++; in_netdev = 0;
continue; if (strstr(argv[i], ",socket") ||
strstr(argv[i], "socket,"))
has_socket = 1;
} else if (!strcmp(argv[i], "-net") ||
!strcmp(argv[i], "-netdev")) {
in_netdev = 1;
} }
if (!*net_id && (p = strstr(argv[i], ",netdev="))) if (!*net_id && (p = strstr(argv[i], ",netdev=")))
@ -104,17 +109,20 @@ int main(int argc, char **argv)
qemu_argv[qemu_argc++] = argv[i]; qemu_argv[qemu_argc++] = argv[i];
} }
if (*net_id) {
net_id_end = strpbrk(net_id, ", ");
if (net_id_end)
*net_id_end = 0;
}
qemu_argv[qemu_argc++] = "-netdev"; if (!has_socket) {
snprintf(fd_str, ARG_MAX, "socket,fd=%u,id=%s", DEFAULT_FD, if (*net_id) {
*net_id ? net_id : "hostnet0"); net_id_end = strpbrk(net_id, ", ");
qemu_argv[qemu_argc++] = fd_str; if (net_id_end)
qemu_argv[qemu_argc] = NULL; *net_id_end = 0;
}
qemu_argv[qemu_argc++] = "-netdev";
snprintf(fd_str, ARG_MAX, "socket,fd=%u,id=%s", DEFAULT_FD,
*net_id ? net_id : "hostnet0");
qemu_argv[qemu_argc++] = fd_str;
qemu_argv[qemu_argc] = NULL;
}
valid_args: valid_args:
s = socket(AF_UNIX, SOCK_STREAM, 0); s = socket(AF_UNIX, SOCK_STREAM, 0);