#include #include #include #include #include #include #include #include #define SOCKET "/var/run/xenstored/socket" #define READ_PATH "/" enum xsd_sockmsg_type { XS_DEBUG, XS_DIRECTORY, XS_READ, XS_GET_PERMS, XS_WATCH, XS_UNWATCH, XS_TRANSACTION_START, XS_TRANSACTION_END, XS_INTRODUCE, XS_RELEASE, XS_GET_DOMAIN_PATH, XS_WRITE, XS_MKDIR, XS_RM, XS_SET_PERMS, XS_WATCH_EVENT, XS_ERROR, XS_IS_DOMAIN_INTRODUCED, XS_RESUME, XS_RESTRICT }; struct xsd_sockmsg { uint32_t type; /* XS_??? */ uint32_t req_id;/* Request identifier, echoed in daemon's response. */ uint32_t tx_id; /* Transaction id (0 if not related to a transaction). */ uint32_t len; /* Length of data following this. */ /* Generally followed by nul-terminated string(s). */ }; int main(void) { struct sockaddr_un addr; int sock, saved_errno, flags; struct xsd_sockmsg hdr; sock = socket(PF_UNIX, SOCK_STREAM, 0); if (sock < 0) return -1; if ((flags = fcntl(sock, F_GETFD)) < 0) goto error; flags |= FD_CLOEXEC; if (fcntl(sock, F_SETFD, flags) < 0) goto error; addr.sun_family = AF_UNIX; strcpy(addr.sun_path, SOCKET); if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) != 0) goto error; hdr.type = XS_READ; hdr.req_id = 1; hdr.tx_id = 0; hdr.len = strlen(READ_PATH); write(sock, &hdr, sizeof(hdr)); write(sock, READ_PATH, strlen(READ_PATH)); return 0; error: perror("main"); abort(); }