#include #include #include #include #include #include int main(int argc, char *argv[]) { if (argc < 2) { dprintf(2, "usage: rvnitctl COMMAND [SERVICE]\n"); exit(2); } static const char default_sock[] = "/run/rvnit/rvnit.sock"; const char *path = getenv("RVNIT_SOCK"); if (!path || !*path) path = default_sock; struct sockaddr_un addr = { 0 }; addr.sun_family = AF_UNIX; strncpy(addr.sun_path, path, sizeof addr.sun_path - 1); int connfd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0); if (connfd < 0) { perror("socket"); exit(111); } if (connect(connfd, (struct sockaddr *)&addr, sizeof addr) < 0) { perror("connect"); exit(111); } dprintf(connfd, "%c%s", *argv[1], argv[2] ? argv[2] : ""); int status = 1; ssize_t rd; do { char buf[4096]; rd = read(connfd, buf, sizeof buf); if (rd < 0) { perror("read"); exit(111); } if (rd > 0) status = 0; write(1, buf, rd); } while (rd > 0); return status; }