chiark / gitweb /
merge changes from trunk into our branch; cvs up -j branchpoint-hostside-wip-2006...
[trains.git] / hostside / client.c
index 989f782af553abcfe9eb607b6b20083780e3b50e..8b3a24ade01a448fa2006ad281a67c92c4b90331 100644 (file)
 #include <stdlib.h>
 #include <errno.h>
 
-#include "hostside.h"
+#include "multiplex.h"
 #include "../layout/dlist.h"
 
 struct ClientList clients;
 
-void vbadcmd(ParseState *ps, const char *fmt, va_list al) {
-  oprintf(&ps->cl->ch,"error ");
-  ovprintf(&ps->cl->ch,fmt,al);
-  owrite(&ps->cl->ch,"\n",1);
-}
-
-const void *any_lookup(ParseState *ps, const void *inf, size_t sz) {
-  const char *tname;
-  
-  for (;
-       (tname= *(const char *const*)inf);
-       inf= (const char*)inf + sz)
-    if (!thiswordstrcmp(ps,tname))
-      return inf;
-  return 0;
-}
-
-const void *any_needword_lookup(ParseState *ps, const void *infs,
-                               size_t sz, const char *what) {
-  const void *r;
-  if (!ps_needword(ps)) return 0;
-  r= any_lookup(ps,infs,sz);
-  if (!r) { badcmd(ps,"unknown %s",what); return 0; }
-  return r;
-}
-
-void ps_callword(ParseState *ps, const CmdInfo *infs, const char *what) {
-  const CmdInfo *ci;
-  ci= some_needword_lookup(ps,infs,what);
-  if (ci) ci->fn(ps,ci);
-}
-
-static void *client_iferr(oop_source *evts, oop_read *cl_read,
-                         oop_rd_event evt, const char *errmsg, int errnoval,
-                         const char *data, size_t recsz, void *cl_v) {
-  Client *cl= cl_v;
-
-  cl->ch.error(&cl->ch, "read",
-              oop_rd_errmsg(cl_read, evt,
-                            errnoval, OOP_RD_STYLE_GETLINE));
-  return OOP_CONTINUE;
-}
-
-static void *client_ifok(oop_source *evts, oop_read *cl_read,
-                        oop_rd_event evt, const char *errmsg, int errnoval,
-                        const char *data, size_t recsz, void *cl_v) {
-  Client *cl= cl_v;
-  ParseState ps;
-
-  if (evt == OOP_RD_EOF) {
-    cl->ch.error(&cl->ch,0,0);
-    return OOP_CONTINUE;
-  }
-  
-  if (evt != OOP_RD_OK)
-    return client_iferr(evts,cl_read,evt,errmsg,errnoval,data,recsz,cl_v);
-
-  ps.cl= cl;
-  ps.remain= data;
-  ps_callword(&ps, toplevel_cmds, "command");
-  return OOP_CONTINUE;
-}
-
-static void *client_exception(oop_source *evts, int fd,
-                             oop_event evt, void *cl_v) {
-  Client *cl= cl_v;
-  cl->ch.error(&cl->ch,"comms error","exception");
-  return OOP_CONTINUE;
-}
-
 static void new_client(int fd, OutBufferError error,
                       char *desc, Selector default_selectors) {
   Client *cl;
   int r;
   
   cl= mmalloc(sizeof(*cl));
-
   cl->sel= default_selectors;
-  cl->ch.desc= desc;
-  cl->ch.fd= fd;
-  cl->ch.error= error;
-  obc_init(&cl->ch);
-
-  events->on_fd(events, fd, OOP_EXCEPTION, client_exception, cl);
-
-  cl->rd= oop_rd_new_fd(events, fd, 0,0);
-  if (!cl->rd) diee("oop_rd_new_fd");
-  r= oop_rd_read(cl->rd, OOP_RD_STYLE_GETLINE, 1024,
-                client_ifok, cl,
-                client_iferr, cl);
-  if (r) diee("oop_rd_read");
+  
+  cl->ci.out.desc= desc;
+  cl->ci.out.fd= fd;
+  cl->ci.out.error= error;
+  cmdin_new(&cl->ci);
 
   LIST_LINK_TAIL(clients, cl);
 }