#include #include #include #include #include #include #include #define DEBUG_TCPCTRL static int qemu_connect(const char *path) { int fd; struct sockaddr_un addr; fd = socket(PF_UNIX, SOCK_STREAM, 0); if (fd < 0) { fprintf(stderr, "Failed to create unix socket\n"); return (-1); } memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strncpy(&addr.sun_path[0], path, (sizeof(addr) - 4) - 1); while (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) { if (errno != EINTR) { fprintf(stderr, "Failed to connect to unix socket %s\n", path); close(fd); unlink(path); return (-1); } } #ifdef DEBUG_TCPCTRL fprintf(stderr, "Connected to socket %s : %d\n", path, fd); #endif return(fd); } static int qemu_command(int fd, const char *command) { int ret, written, sent = 0, len, tot = 0; char answer[4096 + 11]; len = strlen(command); retry_write: written = write(fd, &command[sent], len - sent); if (written < 0) { if ((errno == EINTR) || (errno == EAGAIN)) goto retry_write; fprintf(stderr, "Failed to write message to socket %d\n", fd); return (-1); } if (written + sent < len) { sent += written; goto retry_write; } retry_read: while (tot < sizeof(answer) - 11) { ret = read(fd, &answer[tot], sizeof(answer) - 11 - tot); if (ret < 0) { if ((errno == EINTR) || (errno == EAGAIN)) goto retry_read; return (-1); } if (ret == 0) break; tot += ret; answer[tot] = 0; if (memcmp(&answer[tot - 10], "<<>>", 10) == 0) { answer[tot - 10] = 0; break; } } printf("%s\n", answer); return(0); } static void usage(const char *progname) { printf("Usage %s socket_path [command]\n", progname); exit(1); } int main(int argc, char **argv) { const char *path, *command; int fd; int ret; if ((argc < 2) || (argc > 3)) usage(argv[0]); path = argv[1]; if (argc == 3) command = argv[2]; else command = "help"; fd = qemu_connect(path); if (fd < 0) exit(1); ret = qemu_command(fd, command); return(ret); }