#include #include #include #include #include "gram.h" typedef map mps; static mps tb; class CLIENT_INFO: public ARRAY_OBJ{ public: enum {idle,receiving} status; string var; strings vals; CLIENT_INFO(){ status = idle; } void process ( const char *line, _F_TCPSERVER_V1 *c, bool &endclient, bool &endserver){ if (status == idle){ SSTRING verb; line = str_copyword (verb,line); line = str_skip(line); if (verb == "get"){ string error; gram_t *g = gram_eval(line,error); if (g == NULL){ c->send ("Not found\n"); }else{ for (unsigned i=0; ires.size(); i++){ c->sendf ("%s\n",g->res[i].c_str()); } } endclient = true; }else if (verb == "list"){ strings vars; gram_getvars(vars); sort(vars.begin(),vars.end()); for (unsigned i=0; isendf ("%s\n",vars[i].c_str()); } endclient = true; }else if (verb == "set"){ status = receiving; var = line; vals.clear(); }else if (verb == "eval"){ string error; gram_eval (line,error); endclient = true; }else{ c->send ("Unknown command\n"); endclient = true; } }else if (status == receiving){ vals.push_back(line); } } void end(){ if (status == receiving){ gram_setvar(var.c_str(),vals); vals.clear(); } } }; static const char *host = "unix:"; static const char *port = "/tmp/elist.sock"; static const char *argv0 = NULL; static int execcmd (const string &cmd, FILE *f) { glocal int ret = -1; glocal const char *cmd = cmd.c_str(); glocal FILE *f = f; for (int i=0; i<2; i++){ (host,port,5); sendf ("%s\n",glocal.cmd); if (glocal.f != NULL){ char buf[1000]; while (fgets(buf,sizeof(buf)-1,glocal.f)!=NULL){ send (buf); } end = true; } glocal.ret = 0; printf ("%s\n",line); if (fork()==0){ SSTRING cmd; cmd.setfromf ("%s --server --port unix:/tmp/elist.sock" ,argv0); system (cmd.c_str()); _exit (-1); }else{ sleep(1); } if (glocal.ret == 0) break; } return glocal.ret; } int main (int argc, char *argv[]) { glocal int ret = -1; glocal bool server = false; glocal const char *saddr = "0.0.0.0"; argv0 = argv[0]; glocal.ret = (argc,argv); setarg ('p',"port","Listen on Unix or TCP port",port,false); setarg ('s',"server","Server mode",glocal.server,false); int ret = -1; if (!glocal.server){ usage(); }else{ (port,5); info.data = new CLIENT_INFO; CLIENT_INFO *cli = (CLIENT_INFO*)info.data; cli->end(); CLIENT_INFO *cli = (CLIENT_INFO*)info.data; cli->process (line,this,endclient,endserver); if (s.is_ok()){ s.loop(); ret = 0; } } return ret; int ret = -1; const char *verb = argv[0]; if(argc == 2 && strcmp(verb,"set")==0){ string cmd = string(verb) + " " + argv[1]; execcmd (cmd,stdin); }else if (argc == 1 && strcmp(verb,"list")==0){ string cmd = string(verb); execcmd (cmd,NULL); }else if (argc > 1 && (strcmp(verb,"eval")==0 || strcmp(verb,"get")==0)){ string cmd = string(verb); for (int i=1; i return glocal.ret; }