diff options
author | mischief <mischief@offblast.org> | 2014-06-24 18:02:25 -0700 |
---|---|---|
committer | mischief <mischief@offblast.org> | 2014-06-24 18:02:25 -0700 |
commit | 5ba95fdb07ddc2c32111a1b2f57f17aa27fcbbf5 (patch) | |
tree | c1ec54cb9ecff85b0b820a26d26a10a32a118d0c /sys/src/9/xen/xenstore.c | |
parent | fa03455b5057675b18d1c87aef2d1071b2088de0 (diff) |
import xen 32 bit paravirtual kernel from /n/sources/xen.
Diffstat (limited to 'sys/src/9/xen/xenstore.c')
-rw-r--r-- | sys/src/9/xen/xenstore.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/sys/src/9/xen/xenstore.c b/sys/src/9/xen/xenstore.c new file mode 100644 index 000000000..856975903 --- /dev/null +++ b/sys/src/9/xen/xenstore.c @@ -0,0 +1,130 @@ +#include <u.h> +#include <libc.h> + +typedef ulong uint32_t; + +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 +}; + +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). */ +}; + +char* +xscmd(int fd, enum xsd_sockmsg_type cmd, char *s, char *val) +{ + static char buf[512]; + struct xsd_sockmsg *msg; + char *arg; + static ulong reqid = 1; + int n; + + msg = (struct xsd_sockmsg*)buf; + arg = buf + sizeof(*msg); + if(cmd != XS_WATCH_EVENT){ + msg->type = cmd; + msg->req_id = reqid++; + msg->tx_id = 0; + msg->len = strlen(s)+1; + if (val != 0) { + msg->len += strlen(val); + if (msg->type == XS_WATCH) + msg->len++; + } + strcpy(arg, s); + if (val != 0) + strcpy(arg+strlen(s)+1, val); + if (write(fd, buf, sizeof(*msg)+msg->len) < 0) + sysfatal("write: %r"); + } + if ((n = read(fd, buf, sizeof(*msg))) != sizeof(*msg)) + sysfatal("read hdr %d: %r", n); + fprint(2, "type %lud req_id %lud len %lud\n", msg->type, msg->req_id, msg->len); + if ((n = read(fd, arg, msg->len)) != msg->len) + sysfatal("read data %d: %r", n); + if (cmd == XS_DIRECTORY || cmd == XS_WATCH_EVENT) { + for (s = arg; s < arg+msg->len; s++) { + if (*s == 0) *s = ','; + else if (*s < 32) *s += '0'; + } + } + arg[msg->len] = 0; + return arg; +} + +void +usage(void) +{ + sysfatal("Usage: xenstore [lrwdme] path [value]\n"); +} + +void +main(int argc, char *argv[]) +{ + int fd; + + if (argc != 3 && argc != 4) + usage(); + if(access("/dev/xenstore", AEXIST) < 0) + bind("#x", "/dev", MAFTER); + fd = open("/dev/xenstore", ORDWR); + if (fd < 0) + sysfatal("/dev/xenstore: %r"); + switch (argv[1][0]) { + default: + usage(); + break; + case 'r': + print("%s\n", xscmd(fd, XS_READ, argv[2], 0)); + break; + case 'l': + print("%s\n", xscmd(fd, XS_DIRECTORY, argv[2], 0)); + break; + case 'm': + print("%s\n", xscmd(fd, XS_MKDIR, argv[2], 0)); + break; + case 'd': + print("%s\n", xscmd(fd, XS_RM, argv[2], 0)); + break; + case 'w': + if (argc != 4) + usage(); + print("%s\n", xscmd(fd, XS_WRITE, argv[2], argv[3])); + break; + case 'e': + if (argc != 4) + usage(); + print("%s\n", xscmd(fd, XS_WATCH, argv[2], argv[3])); + close(fd); + fd = open("/dev/xenwatch", OREAD); + if (fd < 0) + sysfatal("/dev/xenwatch: %r"); + for (;;) + print("%s\n", xscmd(fd, XS_WATCH_EVENT, 0, 0)); + } +} |