1 #define WL_DEFINE_TABLES
10 typedef int (*callback_t)(void *obj, uint16_t op, void *data);
28 int step(int fd, msg_t *msg)
33 int hlen = sizeof(msg->head);
34 if (read(fd, &msg->head, hlen) < hlen)
35 warn("short head read");
38 int id = msg->head.id;
39 int len = msg->head.len;
40 int op = msg->head.op;
45 msg->data = realloc(msg->data, len);
51 if (read(fd, msg->data, len) < len)
52 warn("short data read");
57 int iface = obj->iface;
58 callback_t func = obj->func;
61 if (!wl_rarray[iface] || !wl_rarray[iface][op])
62 return func(obj, op, msg->data);
65 const char *info = wl_rarray[iface][op];
66 uint32_t *sptr = (uint32_t*) msg->data;
67 uint32_t *dptr = (uint32_t*)&msg->req;
68 for (int i = 0; info[i]; i++) {
71 *dptr++ = *sptr++; // data
74 *dptr++ = *sptr++; // length
75 *(void**)dptr = sptr; // pointer
76 dptr += (((len/4)+1)/4);
77 sptr += (sizeof(void*)/4);
80 *dptr++ = *sptr++; // length
81 *(void**)dptr = sptr; // pointer
82 dptr += ((((len-1)/4)+1)/4);
83 sptr += (sizeof(void*)/4);
90 return func(obj, op, &msg->req);
93 int main(int argc, char **argv)
99 // Find file descriptor
101 // warn("error in select");;
105 warn("error stepping");
112 while ((msg = wl_run())) {