From f37ddd57014f51c88ef36050ed08b4c6e226e094 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 20 Oct 1995 14:02:40 +0000 Subject: [PATCH] First version of WWW gateway with embedded Tcl. --- www/Makefile | 26 +++++-- www/egwindex.html | 11 +++ www/egwscript | 11 +++ www/whtml.c | 91 +++++++++++++++++++++++ www/winterp.c | 68 ++++++++++++++++++ www/winterp.h | 72 +++++++++++++++++++ www/wsh.c | 30 +++++--- www/wtcl.c | 208 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 502 insertions(+), 15 deletions(-) create mode 100644 www/egwindex.html create mode 100644 www/egwscript create mode 100644 www/whtml.c create mode 100644 www/winterp.c create mode 100644 www/winterp.h create mode 100644 www/wtcl.c diff --git a/www/Makefile b/www/Makefile index 36772bd..4420d24 100644 --- a/www/Makefile +++ b/www/Makefile @@ -2,18 +2,24 @@ # Europagate, 1995 # # $Log: Makefile,v $ -# Revision 1.1 1995/10/20 11:49:24 adam +# Revision 1.2 1995/10/20 14:02:40 adam +# First version of WWW gateway with embedded Tcl. +# +# Revision 1.1 1995/10/20 11:49:24 adam # First version of www gateway. # SHELL=/bin/sh INCLUDE=-I../include #CFLAGS=-g -Wall -pedantic -ansi OLIB=../lib/libres+log.a +TCLLIB=/usr/local/lib/libtcl7.5.a +WSCRIPTS=egwscript +HSCRIPTS=egwindex.html TPROG1=egwcgi TPROG2=egwsh TPROG3=wtest P1=wcgi.o -P2=wproto.o wsh.o +P2=wproto.o winterp.o wsh.o wtcl.o whtml.o P3=wproto.o wtest.o CPP=$(CC) -E DEFS=$(INCLUDE) @@ -22,23 +28,31 @@ HTTPDDIR=/usr/local/etc/httpd CGIBIN=$(HTTPDDIR)/cgi-bin HTDOCS=$(HTTPDDIR)/htdocs -all: $(TPROG1) $(TPROG2) $(TPROG3) +all: $(TPROG1) $(TPROG2) $(TPROG1): $(P1) $(CC) $(CFLAGS) -o $(TPROG1) $(P1) $(OLIB) $(TPROG2): $(P2) - $(CC) $(CFLAGS) -o $(TPROG2) $(P2) $(OLIB) + $(CC) $(CFLAGS) -o $(TPROG2) $(P2) $(OLIB) $(TCLLIB) -lm $(TPROG3): $(P3) $(CC) $(CFLAGS) -o $(TPROG3) $(P3) $(OLIB) -install: $(TPROG1) $(TPROG2) $(TPROG3) - @for x in $(TPROG1) $(TPROG2) $(TPROG3); do \ +install: $(TPROG1) $(TPROG2) + @for x in $(TPROG1) $(TPROG2); do \ echo Installing $$x; \ cp $$x $(CGIBIN); \ chmod +x $(CGIBIN)/$$x; \ done + @for x in $(WSCRIPTS); do \ + echo Installing $$x; \ + cp $$x $(CGIBIN); \ + done + @for x in $(HSCRIPTS); do \ + echo Installing $$x; \ + cp $$x $(HTDOCS); \ + done .c.o: $(CC) -c $(DEFS) $(CFLAGS) $< diff --git a/www/egwindex.html b/www/egwindex.html new file mode 100644 index 0000000..b7b1d17 --- /dev/null +++ b/www/egwindex.html @@ -0,0 +1,11 @@ + + +Europagate WWW index + + +

Europagate WWW index, $Id: egwindex.html,v 1.1 1995/10/20 14:02:41 adam Exp $

+

+egwcgi ref: egwcgi + + + diff --git a/www/egwscript b/www/egwscript new file mode 100644 index 0000000..94303b7 --- /dev/null +++ b/www/egwscript @@ -0,0 +1,11 @@ + +Europgate WWW gateway test script $Id: egwscript,v 1.1 1995/10/20 14:02:41 adam Exp $ + +howdi +{ + set f [open mylog a+] + puts $f "Hello world" + close $f +} + + diff --git a/www/whtml.c b/www/whtml.c new file mode 100644 index 0000000..3c1e080 --- /dev/null +++ b/www/whtml.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 1995, the EUROPAGATE consortium (see below). + * + * The EUROPAGATE consortium members are: + * + * University College Dublin + * Danmarks Teknologiske Videnscenter + * An Chomhairle Leabharlanna + * Consejo Superior de Investigaciones Cientificas + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation, in whole or in part, for any purpose, is hereby granted, + * provided that: + * + * 1. This copyright and permission notice appear in all copies of the + * software and its documentation. Notices of copyright or attribution + * which appear at the beginning of any file must remain unchanged. + * + * 2. The names of EUROPAGATE or the project partners may not be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * 3. Users of this software (implementors and gateway operators) agree to + * inform the EUROPAGATE consortium of their use of the software. This + * information will be used to evaluate the EUROPAGATE project and the + * software, and to plan further developments. The consortium may use + * the information in later publications. + * + * 4. Users of this software agree to make their best efforts, when + * documenting their use of the software, to acknowledge the EUROPAGATE + * consortium, and the role played by the software in their work. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE + * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF + * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA + * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND + * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Log: whtml.c,v $ + * Revision 1.1 1995/10/20 14:02:41 adam + * First version of WWW gateway with embedded Tcl. + * + */ + +#include +#include +#include +#include +#include + +#include "wproto.h" +#include "winterp.h" + +static void *do_create (void *args); +static int do_exec (WCLIENT wcl, const char *fname, char *parms, void *mydata); + +static struct w_interp_type w_interp_t = { + "html", + do_create, + do_exec +}; + +W_Interp_Type w_interp_html = &w_interp_t; + +static char *mod = "whtml"; + +static void *do_create (void *args) +{ + return NULL; +} + +static int do_exec (WCLIENT wcl, const char *fname, char *parms, void *mydata) +{ + int c; + FILE *inf = fopen (fname, "r"); + + gw_log (GW_LOG_DEBUG, mod, "executing %s", fname); + if (!inf) + { + gw_log (GW_LOG_WARN|GW_LOG_ERRNO, mod, "open %s", fname); + return -1; + } + while ((c = getc (inf)) != EOF) + wo_putc (wcl, c); + fclose (inf); + return 0; +} diff --git a/www/winterp.c b/www/winterp.c new file mode 100644 index 0000000..61b0388 --- /dev/null +++ b/www/winterp.c @@ -0,0 +1,68 @@ +/* + * Copyright (c) 1995, the EUROPAGATE consortium (see below). + * + * The EUROPAGATE consortium members are: + * + * University College Dublin + * Danmarks Teknologiske Videnscenter + * An Chomhairle Leabharlanna + * Consejo Superior de Investigaciones Cientificas + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation, in whole or in part, for any purpose, is hereby granted, + * provided that: + * + * 1. This copyright and permission notice appear in all copies of the + * software and its documentation. Notices of copyright or attribution + * which appear at the beginning of any file must remain unchanged. + * + * 2. The names of EUROPAGATE or the project partners may not be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * 3. Users of this software (implementors and gateway operators) agree to + * inform the EUROPAGATE consortium of their use of the software. This + * information will be used to evaluate the EUROPAGATE project and the + * software, and to plan further developments. The consortium may use + * the information in later publications. + * + * 4. Users of this software agree to make their best efforts, when + * documenting their use of the software, to acknowledge the EUROPAGATE + * consortium, and the role played by the software in their work. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE + * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF + * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA + * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND + * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Log: winterp.c,v $ + * Revision 1.1 1995/10/20 14:02:41 adam + * First version of WWW gateway with embedded Tcl. + * + */ + +#include + +#include "wproto.h" +#include "winterp.h" + +static char *mod = "winterp"; + +W_Interp w_interp_create (W_Interp_Type type, void *args) +{ + W_Interp p = malloc (sizeof(*p)); + gw_log (GW_LOG_DEBUG, mod, "Creating w_interp: %s", type->name); + if (!p) + { + gw_log (GW_LOG_FATAL, mod, "Out of memory in w_interp_create"); + exit (1); + } + p->ctrl = type; + p->mydata = (*p->ctrl->create)(args); + return p; +} diff --git a/www/winterp.h b/www/winterp.h new file mode 100644 index 0000000..272446d --- /dev/null +++ b/www/winterp.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 1995, the EUROPAGATE consortium (see below). + * + * The EUROPAGATE consortium members are: + * + * University College Dublin + * Danmarks Teknologiske Videnscenter + * An Chomhairle Leabharlanna + * Consejo Superior de Investigaciones Cientificas + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation, in whole or in part, for any purpose, is hereby granted, + * provided that: + * + * 1. This copyright and permission notice appear in all copies of the + * software and its documentation. Notices of copyright or attribution + * which appear at the beginning of any file must remain unchanged. + * + * 2. The names of EUROPAGATE or the project partners may not be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * 3. Users of this software (implementors and gateway operators) agree to + * inform the EUROPAGATE consortium of their use of the software. This + * information will be used to evaluate the EUROPAGATE project and the + * software, and to plan further developments. The consortium may use + * the information in later publications. + * + * 4. Users of this software agree to make their best efforts, when + * documenting their use of the software, to acknowledge the EUROPAGATE + * consortium, and the role played by the software in their work. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE + * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF + * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA + * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND + * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Log: winterp.h,v $ + * Revision 1.1 1995/10/20 14:02:42 adam + * First version of WWW gateway with embedded Tcl. + * + */ + +#ifndef WINTERP_H +#define WINTERP_H + +#include "wproto.h" + +typedef struct w_interp_type { + char *name; + void *(*create)(void *args); + int (*exec)(WCLIENT wcl, const char *fname, char *parms, void *private); +} *W_Interp_Type; + +typedef struct w_interp { + void *mydata; + W_Interp_Type ctrl; +} *W_Interp; + +W_Interp w_interp_create (W_Interp_Type type, void *args); +#define w_interp_exec(w,c,f,p) (*(w)->ctrl->exec)((c),(f),(p), (w)->mydata) +#define w_interp_name(w) ((w)->ctrl.name) + +W_Interp_Type w_interp_tcl; +W_Interp_Type w_interp_html; + +#endif diff --git a/www/wsh.c b/www/wsh.c index f36d42e..4bd4257 100644 --- a/www/wsh.c +++ b/www/wsh.c @@ -41,21 +41,24 @@ * USE OR PERFORMANCE OF THIS SOFTWARE. * * $Log: wsh.c,v $ - * Revision 1.1 1995/10/20 11:49:28 adam + * Revision 1.2 1995/10/20 14:02:42 adam + * First version of WWW gateway with embedded Tcl. + * + * Revision 1.1 1995/10/20 11:49:28 adam * First version of www gateway. * */ #include #include -#include +#include #include #include #include -#include "wproto.h" +#include "winterp.h" -#define TIMEOUT_SHORT 300 +#define TIMEOUT_SHORT 60 #define TIMEOUT_MEDIUM 1800 #define TIMEOUT_LONG 7200 @@ -64,8 +67,9 @@ static char *mod = "wsh"; int main (int argc, char **argv) { - char *argument, *p, parms[512]; + char *script, *p, parms[512]; int timeout = TIMEOUT_SHORT; + W_Interp tcl_interp, html_interp; chdir("/usr/local/etc/httpd/cgi-bin"); gw_log_init ("egw"); @@ -78,20 +82,28 @@ int main (int argc, char **argv) gw_log (GW_LOG_FATAL, mod, "init"); exit(1); } + tcl_interp = w_interp_create (w_interp_tcl, NULL); + html_interp = w_interp_create (w_interp_html, NULL); while (wproto_process(wcl, timeout) > 0) { wo_clear(wcl, "text/html"); - wo_printf(wcl, "INDEX\n"); strcpy(parms, wcl->wf_parms); - argument = p = parms; + script = p = parms; while (*p && *p != '/') p++; if (*p == '/') *(p++) = '\0'; - gw_log (GW_LOG_DEBUG, mod, "command: %s", argument); - wo_printf (wcl, "hej - %s\n", argument); + gw_log (GW_LOG_DEBUG, mod, "script: %s", script); + gw_log (GW_LOG_DEBUG, mod, "parms: %s", p); + if (w_interp_exec (tcl_interp, wcl, script, p)) + { + wo_printf (wcl, "wsh error\n"); + wo_printf (wcl, "Couldn't execute script %s", + script); + } wo_finish(wcl); } wproto_terminate(wcl); return 0; } + diff --git a/www/wtcl.c b/www/wtcl.c new file mode 100644 index 0000000..ebdabb5 --- /dev/null +++ b/www/wtcl.c @@ -0,0 +1,208 @@ +/* + * Copyright (c) 1995, the EUROPAGATE consortium (see below). + * + * The EUROPAGATE consortium members are: + * + * University College Dublin + * Danmarks Teknologiske Videnscenter + * An Chomhairle Leabharlanna + * Consejo Superior de Investigaciones Cientificas + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation, in whole or in part, for any purpose, is hereby granted, + * provided that: + * + * 1. This copyright and permission notice appear in all copies of the + * software and its documentation. Notices of copyright or attribution + * which appear at the beginning of any file must remain unchanged. + * + * 2. The names of EUROPAGATE or the project partners may not be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * 3. Users of this software (implementors and gateway operators) agree to + * inform the EUROPAGATE consortium of their use of the software. This + * information will be used to evaluate the EUROPAGATE project and the + * software, and to plan further developments. The consortium may use + * the information in later publications. + * + * 4. Users of this software agree to make their best efforts, when + * documenting their use of the software, to acknowledge the EUROPAGATE + * consortium, and the role played by the software in their work. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE + * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF + * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA + * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND + * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Log: wtcl.c,v $ + * Revision 1.1 1995/10/20 14:02:42 adam + * First version of WWW gateway with embedded Tcl. + * + */ + +#include +#include +#include +#include +#include + +#include + +#include "wproto.h" +#include "winterp.h" + +static void *do_create (void *args); +static int do_exec (WCLIENT wcl, const char *fname, char *parms, void *mydata); + +static struct w_interp_type w_interp_t = { + "tcl", + do_create, + do_exec +}; + +W_Interp_Type w_interp_tcl = &w_interp_t; + + +static char *mod = "wtcl"; + +struct tcl_info { + Tcl_Interp *interp; + char *fbuf; + int fbuf_size; + int fbuf_ptr; +}; + +static void *do_create (void *args) +{ + struct tcl_info *p; + + if (!(p = malloc (sizeof(*p)))) + { + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "malloc: tcl_info"); + exit (1); + } + if (!(p->interp = Tcl_CreateInterp ())) + { + gw_log (GW_LOG_FATAL, mod, "Cannot make Tcl_Interp"); + exit (1); + } + p->fbuf_size = 1024; + if (!(p->fbuf = malloc (p->fbuf_size))) + { + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "malloc: tcl_info fbuf"); + exit (1); + } + return p; +} + +static int tcl_exec (WCLIENT wcl, const char *fname, char *parms, + struct tcl_info *p, FILE *inf, int *lineno) +{ + int c, escape = 0, level = 0; + int r, fbuf_ptr = 0; + int local_line = 0; + + gw_log (GW_LOG_DEBUG, mod, "tcl_exec. line %d", *lineno); + while (1) + { + if (fbuf_ptr == p->fbuf_size-1) + { + char *newb; + + if (!(newb = malloc (p->fbuf_size += 16384))) + { + gw_log (GW_LOG_FATAL|GW_LOG_ERRNO, mod, "malloc: fbuf"); + exit (1); + } + memcpy (newb, p->fbuf, fbuf_ptr); + free (p->fbuf); + p->fbuf = newb; + } + c = getc (inf); + if (c == EOF) + { + gw_log (GW_LOG_WARN, mod, "Unexpected EOF: unbalanced braces"); + return -1; + } + if (c == '\\') + escape = 1; + else if (c == '{' && !escape) + { + level++; + escape = 0; + } + else if (c == '}' && !escape) + { + if (--level < 0) + break; + escape = 0; + } + else + { + if (c == '\n') + local_line++; + escape = 0; + } + p->fbuf[fbuf_ptr++] = c; + } + p->fbuf[fbuf_ptr] = '\0'; + gw_log (GW_LOG_DEBUG, mod, "Tcl_Eval. %d lines", local_line); + r = Tcl_Eval (p->interp, p->fbuf); + if (r != TCL_OK) + { + gw_log (GW_LOG_WARN, mod, "Error in Tcl script starting on line %d", + *lineno); + } + (*lineno) += local_line; + return 0; +} + +static int do_exec (WCLIENT wcl, const char *fname, char *parms, + void *mydata) +{ + struct tcl_info *p = mydata; + int c, escape = 0; + int lineno = 1; + FILE *inf = fopen (fname, "r"); + + gw_log (GW_LOG_DEBUG, mod, "Executing %s", fname); + if (!inf) + { + gw_log (GW_LOG_WARN|GW_LOG_ERRNO, mod, "open %s", fname); + return -1; + } + while ((c = getc(inf)) != EOF) + { + if (c == '\\') + escape = 1; + else if (c == '{') + { + if (escape) + wo_putc (wcl, c); + else + { + if (tcl_exec (wcl, fname, parms, p, inf, &lineno)) + { + fclose (inf); + return -2; + } + } + escape = 0; + } + else + { + if (c == '\n') + lineno++; + escape = 0; + wo_putc (wcl, c); + } + } + fclose (inf); + return 0; +} -- 1.7.10.4