4 typedef ulong uint32_t;
25 XS_IS_DOMAIN_INTRODUCED
30 uint32_t type; /* XS_??? */
31 uint32_t req_id;/* Request identifier, echoed in daemon's response. */
32 uint32_t tx_id; /* Transaction id (0 if not related to a transaction). */
33 uint32_t len; /* Length of data following this. */
35 /* Generally followed by nul-terminated string(s). */
39 xscmd(int fd, enum xsd_sockmsg_type cmd, char *s, char *val)
42 struct xsd_sockmsg *msg;
44 static ulong reqid = 1;
47 msg = (struct xsd_sockmsg*)buf;
48 arg = buf + sizeof(*msg);
49 if(cmd != XS_WATCH_EVENT){
51 msg->req_id = reqid++;
53 msg->len = strlen(s)+1;
55 msg->len += strlen(val);
56 if (msg->type == XS_WATCH)
61 strcpy(arg+strlen(s)+1, val);
62 if (write(fd, buf, sizeof(*msg)+msg->len) < 0)
63 sysfatal("write: %r");
65 if ((n = read(fd, buf, sizeof(*msg))) != sizeof(*msg))
66 sysfatal("read hdr %d: %r", n);
67 fprint(2, "type %lud req_id %lud len %lud\n", msg->type, msg->req_id, msg->len);
68 if ((n = read(fd, arg, msg->len)) != msg->len)
69 sysfatal("read data %d: %r", n);
70 if (cmd == XS_DIRECTORY || cmd == XS_WATCH_EVENT) {
71 for (s = arg; s < arg+msg->len; s++) {
72 if (*s == 0) *s = ',';
73 else if (*s < 32) *s += '0';
83 sysfatal("Usage: xenstore [lrwdme] path [value]\n");
87 main(int argc, char *argv[])
91 if (argc != 3 && argc != 4)
93 if(access("/dev/xenstore", AEXIST) < 0)
94 bind("#x", "/dev", MAFTER);
95 fd = open("/dev/xenstore", ORDWR);
97 sysfatal("/dev/xenstore: %r");
103 print("%s\n", xscmd(fd, XS_READ, argv[2], 0));
106 print("%s\n", xscmd(fd, XS_DIRECTORY, argv[2], 0));
109 print("%s\n", xscmd(fd, XS_MKDIR, argv[2], 0));
112 print("%s\n", xscmd(fd, XS_RM, argv[2], 0));
117 print("%s\n", xscmd(fd, XS_WRITE, argv[2], argv[3]));
122 print("%s\n", xscmd(fd, XS_WATCH, argv[2], argv[3]));
124 fd = open("/dev/xenwatch", OREAD);
126 sysfatal("/dev/xenwatch: %r");
128 print("%s\n", xscmd(fd, XS_WATCH_EVENT, 0, 0));