chiark / gitweb /
Merge and end branch-hostside-wip-2008-01-25 PROPERLY; cvs up -j branch-hostside...
[trains.git] / hostside / cmdinput.c
1 /*
2  * realtime & multiplexer
3  * reading and parsing commands from some fd
4  */
5
6 #include "daemons.h"
7
8 static void *cmdi_exception(oop_source *evts, int fd,
9                             oop_event evt, void *cmdi_v) {
10   CommandInput *cmdi= cmdi_v;
11   cmdi->out.error(&cmdi->out, "error by command source",
12                   "exceptional condition");
13   return OOP_CONTINUE;
14 }
15
16 static void *cmdi_iferr(oop_source *evts, oop_read *cl_read,
17                         oop_rd_event evt, const char *errmsg, int errnoval,
18                         const char *data, size_t recsz, void *cmdi_v) {
19   CommandInput *cmdi= cmdi_v;
20
21   cmdi->out.error(&cmdi->out, "read",
22                 oop_rd_errmsg(cl_read, evt,
23                               errnoval, OOP_RD_STYLE_GETLINE));
24   return OOP_CONTINUE;
25 }
26
27 static void *cmdi_ifok(oop_source *evts, oop_read *cl_read,
28                        oop_rd_event evt, const char *errmsg, int errnoval,
29                        const char *data, size_t recsz, void *cmdi_v) {
30   CommandInput *cmdi= cmdi_v;
31   ParseState ps;
32
33   if (evt == OOP_RD_EOF) {
34     cmdi->out.error(&cmdi->out,0,0);
35     return OOP_CONTINUE;
36   }
37   
38   if (evt != OOP_RD_OK)
39     return cmdi_iferr(evts,cl_read,evt,errmsg,errnoval,data,recsz,cmdi_v);
40
41   ps.cl= 0;
42   ps.remain= data;
43   cmdi->doline(&ps, cmdi);
44   return OOP_CONTINUE;
45 }
46
47 void cmdin_new(CommandInput *cmdi, int readfd) {
48   int r;
49
50   obc_init(&cmdi->out);
51
52   events->on_fd(events, readfd, OOP_EXCEPTION, cmdi_exception, cmdi);
53
54   cmdi->rd= oop_rd_new_fd(events, readfd, 0,0);
55   if (!cmdi->rd) diee("oop_rd_new_fd");
56   r= oop_rd_read(cmdi->rd, OOP_RD_STYLE_GETLINE, 1024,
57                  cmdi_ifok, cmdi,
58                  cmdi_iferr, cmdi);
59   if (r) diee("oop_rd_read");  
60 }