From: Adam Dickmeiss Date: Mon, 27 Jan 1997 11:27:14 +0000 (+0000) Subject: Implemented a new command, egw_clear, to clear http output cache. X-Git-Url: http://sru.miketaylor.org.uk/cgi-bin?a=commitdiff_plain;h=1140389ab96fc8ca7bc9c8dc642adbcec625f4a6;p=egate.git Implemented a new command, egw_clear, to clear http output cache. Changed prototype for function wo_clear. --- diff --git a/www/wproto.c b/www/wproto.c index 62448aa..eedbe74 100644 --- a/www/wproto.c +++ b/www/wproto.c @@ -41,6 +41,10 @@ * 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, "
Failed to open file: %s
", 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) diff --git a/www/wproto.h b/www/wproto.h index 988fa8f..deb3006 100644 --- a/www/wproto.h +++ b/www/wproto.h @@ -41,6 +41,10 @@ * 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); diff --git a/www/wshmain.c b/www/wshmain.c index ea6edfe..a3120bd 100644 --- a/www/wshmain.c +++ b/www/wshmain.c @@ -41,6 +41,10 @@ * 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; diff --git a/www/wtcl.c b/www/wtcl.c index a3fa1f6..8053f24 100644 --- a/www/wtcl.c +++ b/www/wtcl.c @@ -41,6 +41,10 @@ * 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); diff --git a/www/wtest.c b/www/wtest.c index acc5658..a84621f 100644 --- a/www/wtest.c +++ b/www/wtest.c @@ -41,6 +41,10 @@ * 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, "Test page\n"); wo_printf (wcl, "Hello from the test program.
\n"); wo_printf (wcl, "This is #%d time that you call me!!
\n", ++counter);