# 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)
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) $<
--- /dev/null
+<html>
+<head>
+<title>Europagate WWW index</title>
+</head>
+<body>
+<h2>Europagate WWW index, $Id: egwindex.html,v 1.1 1995/10/20 14:02:41 adam Exp $</h2>
+<p>
+egwcgi ref: <a href="http://localhost/cgi-bin/egwcgi/egwsh/egwscript">egwcgi</a>
+</body>
+</html>
+
--- /dev/null
+<html>
+<head><title>Europgate WWW gateway test script $Id: egwscript,v 1.1 1995/10/20 14:02:41 adam Exp $</title></head>
+<body>
+howdi
+{
+ set f [open mylog a+]
+ puts $f "Hello world"
+ close $f
+}
+</body>
+</html>
--- /dev/null
+/*
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+
+#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;
+}
--- /dev/null
+/*
+ * 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 <stdlib.h>
+
+#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;
+}
--- /dev/null
+/*
+ * 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
* 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 <stdio.h>
#include <stdlib.h>
-#include <strings.h>
+#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <ctype.h>
-#include "wproto.h"
+#include "winterp.h"
-#define TIMEOUT_SHORT 300
+#define TIMEOUT_SHORT 60
#define TIMEOUT_MEDIUM 1800
#define TIMEOUT_LONG 7200
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");
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, "<HTML><TITLE>INDEX</TITLE>\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, "<BODY>hej - %s</BODY>\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, "<html><head><title>wsh error</title></head>\n");
+ wo_printf (wcl, "<body>Couldn't execute script %s</body></html>",
+ script);
+ }
wo_finish(wcl);
}
wproto_terminate(wcl);
return 0;
}
+
--- /dev/null
+/*
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <ctype.h>
+
+#include <tcl.h>
+
+#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;
+}