#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; char answer[200]; 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: ret = read(fd, &answer[0], sizeof(answer) - 1); if (ret < 0) { if ((errno == EINTR) || (errno == EAGAIN)) goto retry_read; return (-1); } answer[ret] = 0; 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); }