Implemented a new command, egw_clear, to clear http output cache.
authorAdam Dickmeiss <adam@indexdata.dk>
Mon, 27 Jan 1997 11:27:14 +0000 (11:27 +0000)
committerAdam Dickmeiss <adam@indexdata.dk>
Mon, 27 Jan 1997 11:27:14 +0000 (11:27 +0000)
Changed prototype for function wo_clear.

www/wproto.c
www/wproto.h
www/wshmain.c
www/wtcl.c
www/wtest.c

index 62448aa..eedbe74 100644 (file)
  * USE OR PERFORMANCE OF THIS SOFTWARE.
  *
  * $Log: wproto.c,v $
+ * Revision 1.23  1997/01/27 11:27:14  adam
+ * Implemented a new command, egw_clear, to clear http output cache.
+ * Changed prototype for function wo_clear.
+ *
  * Revision 1.22  1997/01/24 13:13:11  adam
  * Implemnted egw_source and added a "raw" option to the URL.
  * Fixed a bug in the buffering system of wproto; the macro wo_putc could
@@ -180,36 +184,11 @@ void wo_printf (WCLIENT wc, const char *fmt, ...)
     va_end(ap);
 }
 
-void wo_clear (WCLIENT wc, const char *type)
+void wo_clear (WCLIENT wc)
 {
     if (!wc->outbuffer)
         wc->outbuffer = malloc (wc->outbuffer_size = OUTBUFFER_CHUNK);
     wc->outbuffer_offset = 0;
-    if (type)
-        wo_printf(wc, "Content-type: %s\n\n", type);
-}
-
-int wo_puthtml (WCLIENT wc, char *name)
-{
-    FILE *f; 
-    char ch;
-
-    wo_clear(wc, "text/html");
-    if (!(f = fopen(name, "r")))
-    {
-       wo_printf(wc, "<BR>Failed to open file: %s<BR>", name);
-       return 0;
-    }
-    while (ch = getc(f), !feof(f))
-    {
-       if (wo_putc(wc, ch) < 0)
-       {
-           fclose(f);
-           return -1;
-       }
-    }
-    fclose(f);
-    return 0;
 }
 
 int wo_flush(WCLIENT wc)
@@ -443,11 +422,11 @@ int wproto_process(WCLIENT wc, int timeout)
 WCLIENT wproto_init (const char *fifoDir, const char *prog)
 {
     char *val, path2[256];
-    wclient_data *new;
+    wclient_data *newp;
 
     gw_log (GW_LOG_DEBUG, mod, "wproto_init");
     close(1);    /* release us from the wserver */
-    if (!(new = malloc(sizeof(*new))))
+    if (!(newp = malloc(sizeof(*newp))))
     {
         gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "malloc");
         exit (1);
@@ -457,49 +436,49 @@ WCLIENT wproto_init (const char *fifoDir, const char *prog)
         gw_log (GW_LOG_FATAL, mod, "GWID not set");
         exit (1);
     }
-    if (!(new->prog = malloc (strlen(prog)+1)))
+    if (!(newp->prog = malloc (strlen(prog)+1)))
     {
         gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "malloc");
         exit (1);
     }
-    strcpy (new->prog, prog);
-    new->fifoDir = fifoDir;
-    new->id = atoi (val);
-    sprintf(new->path, "%s/clt%d", new->fifoDir, new->id);
-    if (mkfifo(new->path, 0666 | S_IFIFO) < 0)
-       gw_log (GW_LOG_WARN|GW_LOG_ERRNO, mod, "mkfifo(%s)", new->path);
+    strcpy (newp->prog, prog);
+    newp->fifoDir = fifoDir;
+    newp->id = atoi (val);
+    sprintf(newp->path, "%s/clt%d", newp->fifoDir, newp->id);
+    if (mkfifo(newp->path, 0666 | S_IFIFO) < 0)
+       gw_log (GW_LOG_WARN|GW_LOG_ERRNO, mod, "mkfifo(%s)", newp->path);
     gw_log (GW_LOG_DEBUG, mod, "Synchronizing with server.");
-    sprintf(path2, "%s/srv%d", new->fifoDir, getppid());
-    if ((new->lineout = open(path2, O_WRONLY)) < 0)
+    sprintf(path2, "%s/srv%d", newp->fifoDir, getppid());
+    if ((newp->lineout = open(path2, O_WRONLY)) < 0)
     {
        gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open out %s", path2);
        exit(1);
     }
-    if (write(new->lineout, "OK", 2) < 2)
+    if (write(newp->lineout, "OK", 2) < 2)
     {
        gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "write");
        exit(1);
     }
     gw_log (GW_LOG_DEBUG, mod, "Synchronized.");
-    if ((new->linein = open(new->path, O_RDONLY)) < 0)
+    if ((newp->linein = open(newp->path, O_RDONLY)) < 0)
     {
-       gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open input %s", new->path);
+       gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open input %s", newp->path);
        exit(1);
     }
     gw_log (GW_LOG_DEBUG, mod, "init. linein=%d lineout=%d",
-            new->linein, new->lineout);
+            newp->linein, newp->lineout);
     /* we put a handle on this so we get a blocking read when no peer */
-    if (open(new->path, O_WRONLY | O_NDELAY) < 0)
+    if (open(newp->path, O_WRONLY | O_NDELAY) < 0)
     {
-       gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open dummy %s", new->path);
+       gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "open dummy %s", newp->path);
        exit(1);
     }
-    new->outbuffer = 0;
-    new->outbuffer_size = 0;
-    new->outbuffer_offset = 0;
-    new->cache_level = -1;
-    new->cache_fd = -1;
-    return new;
+    newp->outbuffer = 0;
+    newp->outbuffer_size = 0;
+    newp->outbuffer_offset = 0;
+    newp->cache_level = -1;
+    newp->cache_fd = -1;
+    return newp;
 }
 
 static void wproto_uncache(WCLIENT wc, int level)
index 988fa8f..deb3006 100644 (file)
  * USE OR PERFORMANCE OF THIS SOFTWARE.
  *
  * $Log: wproto.h,v $
+ * Revision 1.13  1997/01/27 11:27:15  adam
+ * Implemented a new command, egw_clear, to clear http output cache.
+ * Changed prototype for function wo_clear.
+ *
  * Revision 1.12  1997/01/24 13:13:12  adam
  * Implemnted egw_source and added a "raw" option to the URL.
  * Fixed a bug in the buffering system of wproto; the macro wo_putc could
@@ -157,15 +161,13 @@ int wproto_process (WCLIENT wc, int timeout);
 /* wproto_init: initializes communication with egwcgi. */
 WCLIENT wproto_init (const char *fifoDir, const char *prog);
 
-
 void wo_printf (WCLIENT wc, const char *fmt, ...);
-void wo_clear (WCLIENT wc, const char *type);
+void wo_clear (WCLIENT wc);
 int wo_finish (WCLIENT wc);
 int wo_flush (WCLIENT wc);
 int wo_overflow (WCLIENT wc, char ch);
 void wproto_terminate (WCLIENT wc);
 int wproto_cache (WCLIENT wc, int level);
-int wo_puthtml (WCLIENT wc, char *name);
 void wo_puts (WCLIENT wc, const char *s);
 void wo_write (WCLIENT wc, const char *s, size_t len);
 
index ea6edfe..a3120bd 100644 (file)
  * USE OR PERFORMANCE OF THIS SOFTWARE.
  *
  * $Log: wshmain.c,v $
+ * Revision 1.6  1997/01/27 11:27:16  adam
+ * Implemented a new command, egw_clear, to clear http output cache.
+ * Changed prototype for function wo_clear.
+ *
  * Revision 1.5  1997/01/24 13:13:12  adam
  * Implemnted egw_source and added a "raw" option to the URL.
  * Fixed a bug in the buffering system of wproto; the macro wo_putc could
@@ -140,7 +144,7 @@ void wshmain (int argc, char **argv, W_Interp_Type w_interp_type)
         timeout = atoi (gw_res_get (shRes, "timeout", "120"));
         if (timeout < 1)
             timeout = 1;
-       wo_clear (wcl, NULL);
+       wo_clear (wcl);
        strcpy (parms_buf, wcl->wf_parms);
         parms = parms_buf;
 
index a3fa1f6..8053f24 100644 (file)
  * USE OR PERFORMANCE OF THIS SOFTWARE.
  *
  * $Log: wtcl.c,v $
+ * Revision 1.19  1997/01/27 11:27:17  adam
+ * Implemented a new command, egw_clear, to clear http output cache.
+ * Changed prototype for function wo_clear.
+ *
  * Revision 1.18  1997/01/24 13:13:13  adam
  * Implemnted egw_source and added a "raw" option to the URL.
  * Fixed a bug in the buffering system of wproto; the macro wo_putc could
@@ -404,6 +408,14 @@ static int proc_source (ClientData clientData, Tcl_Interp *interp,
     return TCL_OK;
 }
 
+static int proc_clear (ClientData clientData, Tcl_Interp *interp,
+                        int argc, char **argv)
+{
+    struct tcl_info *p = (struct tcl_info*) clientData;
+
+    wo_clear (p->wcl);
+    return TCL_OK;
+}
 
 int Tcl_AppInit (Tcl_Interp *interp)
 {
@@ -445,6 +457,7 @@ static void *do_create (WCLIENT wcl, void *args)
     Tcl_CreateCommand (p->interp, "egw_dec", proc_dec, p, NULL);
     Tcl_CreateCommand (p->interp, "egw_prog", proc_prog, p, NULL);
     Tcl_CreateCommand (p->interp, "egw_source", proc_source, p, NULL);
+    Tcl_CreateCommand (p->interp, "egw_clear", proc_clear, p, NULL);
     sprintf (tmp_str, "%d", wcl->id);
     Tcl_SetVar (p->interp, "sessionId", tmp_str, TCL_GLOBAL_ONLY);
     return p;
@@ -524,6 +537,45 @@ static int tcl_exec (const char *fname, struct tcl_info *p, FILE *inf,
     return r;
 }
 
+static int var_ref (struct tcl_info *p, FILE *inf)
+{
+    int c, i = 0;
+    char name[32], *vp;
+
+    c = getc (inf);
+    if (c == '{')
+    {
+        while ((c = getc(inf)) != EOF)
+        {
+            if (c == '\n')
+                break;
+            if (c == '}')
+            {
+                c = getc (inf);
+                break;
+            }
+            if (i < 31)
+                name[i++] = c;
+        }
+    } 
+    else
+    {
+        while (c != EOF)
+        {
+            if (c != '(' && c != ')' && c != '-' && c != '_' && !isalnum(c))
+                break;
+            if (i < 31)
+                name[i++] = c;
+            c = getc (inf);
+        }
+    }
+    name[i] = '\0';
+    vp = Tcl_GetVar (p->interp, name, 0);
+    if (vp)
+        wo_puts (p->wcl, vp);
+    return c;
+}
+
 static int exec_file (const char *fname, struct tcl_info *p)
 {
     int c, escape = 0;
@@ -536,12 +588,25 @@ static int exec_file (const char *fname, struct tcl_info *p)
         gw_log (GW_LOG_WARN|GW_LOG_ERRNO, mod, "open %s", fname);
         return -1;
     }
-    while ((c = getc(inf)) != EOF)
+    c = getc (inf);
+    while (c != EOF)
     {
-        if (c == '\\')
-            escape = 1;
-        else if (c == '{')
+        switch (c)
         {
+        case '\\':
+            escape = 1;
+            c = getc (inf);
+            break;
+        case '$':
+            if (escape)
+            {
+                c = getc (inf);
+                wo_putc (p->wcl, c);
+            }
+            else
+                c = var_ref (p, inf);
+            break;
+        case '{':
             if (escape)
                 wo_putc (p->wcl, c);
             else
@@ -559,13 +624,14 @@ static int exec_file (const char *fname, struct tcl_info *p)
                 }
             }
             escape = 0;
-        }
-        else
-        {
+            c = getc (inf);
+            break;
+        default:
             if (c == '\n')
                 lineno++;
             escape = 0;
             wo_putc (p->wcl, c);
+            c = getc (inf);
         }
     }
     fclose (inf);
index acc5658..a84621f 100644 (file)
  * USE OR PERFORMANCE OF THIS SOFTWARE.
  *
  * $Log: wtest.c,v $
+ * Revision 1.4  1997/01/27 11:27:18  adam
+ * Implemented a new command, egw_clear, to clear http output cache.
+ * Changed prototype for function wo_clear.
+ *
  * Revision 1.3  1996/02/12 10:10:33  adam
  * Resource/config system used by the gateway.
  *
@@ -72,7 +76,7 @@ int main()
     gw_log_file (GW_LOG_ALL, "wtest_log");
     gw_log (GW_LOG_STAT, mod, "Europagate www test");
 
-    if (!(wcl = wproto_init ("/tmp/egw")))
+    if (!(wcl = wproto_init ("/tmp/egw", "wtest")))
     {
         gw_log (GW_LOG_FATAL, mod, "init");
         exit (1);
@@ -80,7 +84,8 @@ int main()
     while (wproto_process(wcl, timeout) > 0)
     {
         gw_log (GW_LOG_DEBUG, mod, "Process input");
-       wo_clear (wcl, "text/html");
+       wo_clear (wcl);
+        wo_printf (wcl, "Content-type: text/html\n\n");
        wo_printf (wcl, "<HTML><TITLE>Test page</TITLE>\n");
        wo_printf (wcl, "Hello from the test program.<BR>\n");
        wo_printf (wcl, "This is #%d time that you call me!!<BR>\n", ++counter);