// SPDX-License-Identifier: AGPL-3.0-or-later /* PASST - Plug A Simple Socket Transport * * qrap.c - qemu wrapper connecting UNIX domain socket to socket file descriptor * * Copyright (c) 2020-2021 Red Hat GmbH * Author: Stefano Brivio * * TODO: Implement this functionality directly in qemu: we have TCP and UDP * socket back-ends already. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "passt.h" /** * usage() - Print usage and exit * @name: Executable name */ void usage(const char *name) { fprintf(stderr, "Usage: %s FDNUM QEMU_CMD ...\n", name); exit(EXIT_FAILURE); } /** * main() - Entry point and main loop * @argc: Argument count * @argv: File descriptor number, then qemu with arguments * * Return: 0 once interrupted, non-zero on failure */ int main(int argc, char **argv) { struct sockaddr_un addr = { .sun_family = AF_UNIX, .sun_path = UNIX_SOCK_PATH, }; long fd; int s; if (argc < 3) usage(argv[0]); fd = strtol(argv[1], NULL, 0); if (fd < 3 || fd > INT_MAX || errno) usage(argv[0]); s = socket(AF_UNIX, SOCK_STREAM, 0); if (s < 0) { perror("socket"); exit(EXIT_FAILURE); } if (connect(s, (const struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("connect"); exit(EXIT_FAILURE); } if (dup2(s, (int)fd) < 0) { perror("dup"); exit(EXIT_FAILURE); } close(s); execvp(argv[2], argv + 2); perror("execvp"); return EXIT_FAILURE; }