X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=www%2Fwirtcl.c;h=9939df8b53d3808407d7b773d1f57c4158406e3e;hb=6c6f3deb01675917b3c73cca50dd20d738593a47;hp=cae84ee908844c9bee5f58f00ff8ac114a38faba;hpb=fb42e8909c46dfe29d2b8d8852e0ebf297eb2963;p=egate.git diff --git a/www/wirtcl.c b/www/wirtcl.c index cae84ee..9939df8 100644 --- a/www/wirtcl.c +++ b/www/wirtcl.c @@ -41,7 +41,29 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. * * $Log: wirtcl.c,v $ - * Revision 1.3 1995/10/30 17:35:18 adam + * Revision 1.9 1995/11/07 14:56:59 adam + * Work on search in multiple targets. + * New wtcl command: wlog. + * Optional timeout parameter to zwait. + * + * Revision 1.8 1995/11/06 17:44:22 adam + * State reestablised when shell restarts. History of previous + * result sets. + * + * Revision 1.7 1995/11/02 16:35:37 adam + * Bug fixes and select on FIFOs in wcgi - doesn't really work! + * + * Revision 1.6 1995/11/01 16:15:47 adam + * Better presentation of records. Query/set number persistent. + * + * Revision 1.5 1995/10/31 16:56:24 adam + * Record presentation. + * + * Revision 1.4 1995/10/31 10:03:53 adam + * Work on queries. + * New command implemented - aborts script. + * + * Revision 1.3 1995/10/30 17:35:18 adam * New function zwait that waits for a variable change - due to i/o events * that invoke callback routines. * @@ -67,16 +89,21 @@ #include #include +#include #include "wtcl.h" #include "wirtcl.h" static void *do_create (WCLIENT wcl, void *args); static int do_exec (const char *fname, char *parms, void *mydata); +static int do_load (char *parms, void *mydata); +static int do_save (char *parms, void *mydata); static struct w_interp_type w_interp_t = { "irtcl", do_create, - do_exec + do_exec, + do_load, + do_save }; W_Interp_Type w_interp_irtcl = &w_interp_t; @@ -91,7 +118,7 @@ struct tcl_info { }; -static int events (struct tcl_info *p, char *waitVar); +static int events (struct tcl_info *p, char *waitVar, int tout); static int proc_zwait_invoke (ClientData clientData, Tcl_Interp *interp, int argc, char **argv) @@ -100,8 +127,7 @@ static int proc_zwait_invoke (ClientData clientData, Tcl_Interp *interp, if (argc < 2) return TCL_OK; - events (p, argv[1]); - return TCL_OK; + return events (p, argv[1], (argc == 3) ? atoi(argv[2]) : 0); } @@ -140,6 +166,7 @@ static void *do_create (WCLIENT wcl, void *args) gw_log (GW_LOG_FATAL, mod, "Cannot make Irtcl_Interp"); exit (1); } + log_init(LOG_ALL, "irtcl", "/usr/local/etc/httpd/logs/irtcl_log"); /* initialize irtcl */ Tcl_CreateCommand (p->interp, "zwait", proc_zwait_invoke, p, NULL); for (i=0; iwcl->linein; + if (fifo_in > max_fd) + max_fd = fifo_in; assert (waitVar); if ((cp = Tcl_GetVar (p->interp, waitVar, 0))) @@ -179,24 +209,39 @@ static int events (struct tcl_info *p, char *waitVar) } else { - gw_log (GW_LOG_WARN, mod, "Variable %s doesn't exist", waitVar); - return 0; + char msg[128]; + + sprintf (msg, "Variable %s doesn't exist", waitVar); + gw_log (GW_LOG_WARN, mod, "%s", msg); + Tcl_AppendResult (p->interp, msg, NULL); + return TCL_ERROR; } - gw_log (GW_LOG_DEBUG, mod, "Waiting for variable %s=%s", - waitVar, waitVarVal); + gw_log (GW_LOG_DEBUG, mod, "Waiting %s=%s", waitVar, waitVarVal); while (1) { + struct timeval to, *top; + if (tout > 0) + { + to.tv_usec = 0; + to.tv_sec = tout; + top = &to; + } + else + top = 0; + if (!(cp = Tcl_GetVar (p->interp, waitVar, 0)) || strcmp (cp, waitVarVal)) { + gw_log (GW_LOG_DEBUG, mod, "Changed to %s", cp); + Tcl_AppendResult (p->interp, cp, NULL); free (waitVarVal); - return 0; + return TCL_OK; } FD_ZERO (&fdset_tcl_r); FD_ZERO (&fdset_tcl_w); FD_ZERO (&fdset_tcl_x); - for (r=0, i=min_fd; i<=max_fd; i++) + for (r=0, i=0; i<=max_fd; i++) { if (callback_table[i].w_handle) { @@ -216,15 +261,29 @@ static int events (struct tcl_info *p, char *waitVar) } if (!r) break; +#if 1 + gw_log (GW_LOG_DEBUG, mod, "fifo select %d", fifo_in); + FD_SET (fifo_in, &fdset_tcl_r); +#endif if ((r = select(max_fd+1, &fdset_tcl_r, &fdset_tcl_w, - &fdset_tcl_x, 0)) < 0) + &fdset_tcl_x, top)) < 0) { - perror("select"); + gw_log (GW_LOG_ERRNO|GW_LOG_FATAL, mod, "select"); exit(1); } if (!r) - continue; - for (i=min_fd; i<=max_fd; i++) + { + gw_log (GW_LOG_DEBUG, mod, "timeout"); + free (waitVarVal); + return TCL_ERROR; + } + if (FD_ISSET (fifo_in, &fdset_tcl_r)) + { + gw_log (GW_LOG_DEBUG, mod, "FIFO closed"); + free (waitVarVal); + return TCL_ERROR; + } + for (i=0; i<=max_fd; i++) { if (FD_ISSET (i, &fdset_tcl_r)) { @@ -244,7 +303,7 @@ static int events (struct tcl_info *p, char *waitVar) } } free (waitVarVal); - return 0; + return TCL_OK; } void ir_select_add (int fd, void *obj) @@ -275,3 +334,18 @@ void ir_select_remove (int fd, void *obj) callback_table[fd].w_handle = NULL; callback_table[fd].x_handle = NULL; } + +static int do_load (char *parms, void *mydata) +{ + struct tcl_info *p = mydata; + + return w_interp_load_state (p->w_interp, parms); +} + +static int do_save (char *parms, void *mydata) +{ + struct tcl_info *p = mydata; + + return w_interp_save_state (p->w_interp, parms); +} +