New function zwait that waits for a variable change - due to i/o events
[egate.git] / www / wirtcl.c
index f05500f..cae84ee 100644 (file)
  * USE OR PERFORMANCE OF THIS SOFTWARE.
  *
  * $Log: wirtcl.c,v $
- * Revision 1.2  1995/10/27 17:30:16  adam
+ * 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.
+ *
+ * Revision 1.2  1995/10/27  17:30:16  adam
  * First search request/response that works.
  *
  * Revision 1.1  1995/10/27  15:12:08  adam
@@ -87,6 +91,21 @@ struct tcl_info {
 };
 
 
+static int events (struct tcl_info *p, char *waitVar);
+
+static int proc_zwait_invoke (ClientData clientData, Tcl_Interp *interp,
+                              int argc, char **argv)
+{
+    struct tcl_info *p = (struct tcl_info*) clientData;
+    
+    if (argc < 2)
+        return TCL_OK;
+    events (p, argv[1]);
+    return TCL_OK;
+}
+
+
+
 /* select(2) callbacks */
 struct callback {
     void (*r_handle)(ClientData);
@@ -122,6 +141,7 @@ static void *do_create (WCLIENT wcl, void *args)
         exit (1);
     }
     /* initialize irtcl */
+    Tcl_CreateCommand (p->interp, "zwait", proc_zwait_invoke, p, NULL);
     for (i=0; i<MAX_CALLBACK; i++)
     {
         callback_table[i].r_handle = NULL;
@@ -135,22 +155,47 @@ static void *do_create (WCLIENT wcl, void *args)
 static int do_exec (const char *fname, char *parms, void *mydata)
 {
     struct tcl_info *p = mydata;
-    int i, r, min_fd = 0;
-    const char *cp;
+    int r;
+    if ((r = w_interp_exec (p->w_interp, fname, parms)))
+        return r;
+    return 0;
+}
+
+
+static int events (struct tcl_info *p, char *waitVar)
+{
+    int r, i, min_fd = 0;
+    char *cp;
+    char *waitVarVal;
     static fd_set fdset_tcl_r;
     static fd_set fdset_tcl_w;
     static fd_set fdset_tcl_x;
 
-    if ((r = w_interp_exec (p->w_interp, fname, parms)))
-        return r;
+    assert (waitVar);
+    if ((cp = Tcl_GetVar (p->interp, waitVar, 0)))
+    {
+        waitVarVal = malloc (strlen(cp)+1);
+        strcpy (waitVarVal, cp);
+    }
+    else
+    {
+        gw_log (GW_LOG_WARN, mod, "Variable %s doesn't exist", waitVar);
+        return 0;
+    }
+    gw_log (GW_LOG_DEBUG, mod, "Waiting for variable %s=%s",
+            waitVar, waitVarVal);
     while (1)
     {
+        if (!(cp = Tcl_GetVar (p->interp, waitVar, 0)) ||
+            strcmp (cp, waitVarVal))
+        {
+            free (waitVarVal);
+            return 0;
+        }
         FD_ZERO (&fdset_tcl_r);
         FD_ZERO (&fdset_tcl_w);
         FD_ZERO (&fdset_tcl_x);
-
-       if ((cp=Tcl_GetVar (p->interp, "sessionWait", 0)) && !strcmp (cp, "0"))
-            return 0;
+        
         for (r=0, i=min_fd; i<=max_fd; i++)
         {
             if (callback_table[i].w_handle)
@@ -170,7 +215,7 @@ static int do_exec (const char *fname, char *parms, void *mydata)
             }
         }
         if (!r)
-            return 0;
+            break;
         if ((r = select(max_fd+1, &fdset_tcl_r, &fdset_tcl_w, 
                           &fdset_tcl_x, 0)) < 0)
         {
@@ -198,6 +243,7 @@ static int do_exec (const char *fname, char *parms, void *mydata)
             }
         }
     }
+    free (waitVarVal);
     return 0;
 }