chiark / gitweb /
hostside: more length for bavarian
[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 oop_source *events;
9
10 static void *cmdi_exception(oop_source *evts, int fd,
11                             oop_event evt, void *cmdi_v) {
12   CommandInput *cmdi= cmdi_v;
13   cmdi->out.error(&cmdi->out, "error by command source",
14                   "exceptional condition");
15   return OOP_CONTINUE;
16 }
17
18 static void *cmdi_iferr(oop_source *evts, oop_read *cl_read,
19                         oop_rd_event evt, const char *errmsg, int errnoval,
20                         const char *data, size_t recsz, void *cmdi_v) {
21   CommandInput *cmdi= cmdi_v;
22
23   cmdi->out.error(&cmdi->out, "read",
24                 oop_rd_errmsg(cl_read, evt,
25                               errnoval, OOP_RD_STYLE_GETLINE));
26   return OOP_CONTINUE;
27 }
28
29 static void *cmdi_ifok(oop_source *evts, oop_read *cl_read,
30                        oop_rd_event evt, const char *errmsg, int errnoval,
31                        const char *data, size_t recsz, void *cmdi_v) {
32   CommandInput *cmdi= cmdi_v;
33   ParseState ps;
34
35   if (evt == OOP_RD_EOF) {
36     cmdi->out.error(&cmdi->out,0,0);
37     return OOP_CONTINUE;
38   }
39   
40   if (evt != OOP_RD_OK)
41     return cmdi_iferr(evts,cl_read,evt,errmsg,errnoval,data,recsz,cmdi_v);
42
43   ps.remain= data;
44   cmdi->doline(&ps, cmdi);
45   return OOP_CONTINUE;
46 }
47
48 void cmdin_new(CommandInput *cmdi, int readfd) {
49   int r;
50
51   obc_init(&cmdi->out);
52
53   events->on_fd(events, readfd, OOP_EXCEPTION, cmdi_exception, cmdi);
54
55   cmdi->rd= oop_rd_new_fd(events, readfd, 0,0);
56   if (!cmdi->rd) diee("oop_rd_new_fd");
57   r= oop_rd_read(cmdi->rd, OOP_RD_STYLE_GETLINE, 1024,
58                  cmdi_ifok, cmdi,
59                  cmdi_iferr, cmdi);
60   if (r) diee("oop_rd_read");  
61 }