]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/xen/xenstore.c
bcm: flush out early boot messages on uart and screen initialization
[plan9front.git] / sys / src / 9 / xen / xenstore.c
1 #include <u.h>
2 #include <libc.h>
3
4 typedef ulong uint32_t;
5
6 enum xsd_sockmsg_type
7 {
8     XS_DEBUG,
9     XS_DIRECTORY,
10     XS_READ,
11     XS_GET_PERMS,
12     XS_WATCH,
13     XS_UNWATCH,
14     XS_TRANSACTION_START,
15     XS_TRANSACTION_END,
16     XS_INTRODUCE,
17     XS_RELEASE,
18     XS_GET_DOMAIN_PATH,
19     XS_WRITE,
20     XS_MKDIR,
21     XS_RM,
22     XS_SET_PERMS,
23     XS_WATCH_EVENT,
24     XS_ERROR,
25     XS_IS_DOMAIN_INTRODUCED
26 };
27
28 struct xsd_sockmsg
29 {
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. */
34
35     /* Generally followed by nul-terminated string(s). */
36 };
37
38 char*
39 xscmd(int fd, enum xsd_sockmsg_type cmd, char *s, char *val)
40 {
41         static char buf[512];
42         struct xsd_sockmsg *msg;
43         char *arg;
44         static ulong reqid = 1;
45         int n;
46
47         msg = (struct xsd_sockmsg*)buf;
48         arg = buf + sizeof(*msg);
49         if(cmd != XS_WATCH_EVENT){
50                 msg->type = cmd;
51                 msg->req_id = reqid++;
52                 msg->tx_id = 0;
53                 msg->len = strlen(s)+1;
54                 if (val != 0) {
55                         msg->len += strlen(val);
56                         if (msg->type == XS_WATCH)
57                                 msg->len++;
58                 }
59                 strcpy(arg, s);
60                 if (val != 0)
61                         strcpy(arg+strlen(s)+1, val);
62                 if (write(fd, buf, sizeof(*msg)+msg->len) < 0)
63                         sysfatal("write: %r");
64         }
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';
74                 }
75         }
76         arg[msg->len] = 0;
77         return arg;
78 }
79
80 void
81 usage(void)
82 {
83         sysfatal("Usage: xenstore [lrwdme] path [value]\n");
84 }
85
86 void
87 main(int argc, char *argv[])
88 {
89         int fd;
90
91         if (argc != 3 && argc != 4)
92                 usage();
93         if(access("/dev/xenstore", AEXIST) < 0)
94                 bind("#x", "/dev", MAFTER);
95         fd = open("/dev/xenstore", ORDWR);
96         if (fd < 0)
97                 sysfatal("/dev/xenstore: %r");
98         switch (argv[1][0]) {
99         default:
100                 usage();
101                 break;
102         case 'r':
103                 print("%s\n", xscmd(fd, XS_READ, argv[2], 0));
104                 break;
105         case 'l':
106                 print("%s\n", xscmd(fd, XS_DIRECTORY, argv[2], 0));
107                 break;
108         case 'm':
109                 print("%s\n", xscmd(fd, XS_MKDIR, argv[2], 0));
110                 break;
111         case 'd':
112                 print("%s\n", xscmd(fd, XS_RM, argv[2], 0));
113                 break;
114         case 'w':
115                 if (argc != 4)
116                         usage();
117                 print("%s\n", xscmd(fd, XS_WRITE, argv[2], argv[3]));
118                 break;
119         case 'e':
120                 if (argc != 4)
121                         usage();
122                 print("%s\n", xscmd(fd, XS_WATCH, argv[2], argv[3]));
123                 close(fd);
124                 fd = open("/dev/xenwatch", OREAD);
125                 if (fd < 0)
126                         sysfatal("/dev/xenwatch: %r");
127                 for (;;)
128                         print("%s\n", xscmd(fd, XS_WATCH_EVENT, 0, 0));
129         }
130 }