From susan11@example.net Wed Jan 2 11:00:13 2002 Return-Path: <susan11@example.net> Mailing-List: contact susan11@example.net; run by ezmlm Delivered-To: mailing list susan11@example.net Received: (qmail 37909 invoked from network); 2 Jan 2002 11:00:13 -0000 Received: from ppp-149-8.25-151.libero.it (HELO ashland) (83.161.120.155) by daedalus.apache.org with SMTP; 2 Jan 2002 11:00:13 -0000 Received: by ashland (Postfix, from userid 1000) id 158774C087; Wed, 2 Jan 2002 12:01:34 +0100 (CET) To: Wojciech Kocjan <susan11@example.net> Cc: susan11@example.net, susan11@example.net Subject: Re: "escaping" start/close tags in Tcl sections of tcl/html pages References: <susan11@example.net> <susan11@example.net> From: susan11@example.net (David N. Welton) Date: 02 Jan 2002 12:01:33 +0100 In-Reply-To: <susan11@example.net> Message-ID: <susan11@example.net> Lines: 47 User-Agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N Wojciech Kocjan <susan11@example.net> writes: > >>Which currently cause problems with the parser. Thoughts? Maybe > >>at the same time, I can make it accept <?dtcl as well as <?, > >>also... > > Hrmmm... Couldn't we just check to see if we're already in a > > block of code? > I suppose a counter would be the easiest way to do it - when started > it is 0, on evert "<?rivet" it is incremented by 1, on every "?>" it > is decremented if the counter is >0. Yes, that's how my new parser works. > However, I suppose a problem would be with XML stuff like this: > <?rivet > puts "<?xml version=\"1.0\" encoding=\"$encoding\"?>" > ?> Right..hrm... > It will work with the above example. However, the following is a big > problem: > > <?rivet > proc php_end {} { > puts "?>" > } > proc php_begin {} { > puts "<?php " > } > > php_begin > puts "echo('test')" > php_end > ?> Yuck, I think we are just going to have to tell people to escape it. There are too many sneaky things like that. -- David N. Welton Consulting: http://www.dedasys.com/ Free Software: http://people.debian.org/~davidw/ Apache Tcl: http://tcl.apache.org/ Personal: http://www.efn.org/~davidw/ From susan11@example.net Wed Jan 2 11:24:00 2002 Return-Path: <susan11@example.net> Mailing-List: contact susan11@example.net; run by ezmlm Delivered-To: mailing list susan11@example.net Received: (qmail 42201 invoked from network); 2 Jan 2002 11:24:00 -0000 Received: from ppp-149-8.25-151.libero.it (HELO ashland) (83.161.120.155) by daedalus.apache.org with SMTP; 2 Jan 2002 11:24:00 -0000 Received: by ashland (Postfix, from userid 1000) id 818A04C087; Wed, 2 Jan 2002 12:25:36 +0100 (CET) To: susan11@example.net Cc: susan11@example.net, susan11@example.net, susan11@example.net, susan11@example.net Subject: General mailing list From: susan11@example.net (David N. Welton) Date: 02 Jan 2002 12:25:36 +0100 Message-ID: <susan11@example.net> Lines: 19 User-Agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N Hi everyone, happy new year, and happy Euro, In order to form a more perfect union of apache tcl projects, we are setting up the susan11@example.net mailing list as a place of discussion between all the Apache Tcl groups. We are doing this to foster cross-pollination of ideas and code. Everyone is welcome to join, but it will be a developer-oriented list. Project leads are encouraged to join. Thankyou, -- David N. Welton Consulting: http://www.dedasys.com/ Free Software: http://people.debian.org/~davidw/ Apache Tcl: http://tcl.apache.org/ Personal: http://www.efn.org/~davidw/ From susan11@example.net Fri Jan 4 21:14:44 2002 Return-Path: <susan11@example.net> Mailing-List: contact susan11@example.net; run by ezmlm Delivered-To: mailing list susan11@example.net Received: (qmail 84397 invoked from network); 4 Jan 2002 21:14:44 -0000 Received: from your.unreality.com (83.161.120.155) by daedalus.apache.org with SMTP; 4 Jan 2002 21:14:44 -0000 Received: (qmail 61414 invoked by uid 300); 4 Jan 2002 21:14:43 -0000 Received: from localhost (susan11@example.net) by localhost with SMTP; 4 Jan 2002 21:14:43 -0000 Date: Fri, 4 Jan 2002 15:14:43 -0600 (CST) From: Damon Courtney <susan11@example.net> To: "David N. Welton" <susan11@example.net> cc: Wojciech Kocjan <susan11@example.net>, susan11@example.net, susan11@example.net Subject: Re: "escaping" start/close tags in Tcl sections of tcl/html pages In-Reply-To: <susan11@example.net> Message-ID: <susan11@example.net> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N Ok, So, I'm about to remove all of the upload stuff that has to do with the 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4request888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4UPLOAD array. Any objections? We want the upload command to be the in-point for all of this information anyway, right? Or, do we want to fold it into the var command somehow and even get rid of upload? D From susan11@example.net Fri Jan 4 21:22:50 2002 Return-Path: <susan11@example.net> Mailing-List: contact susan11@example.net; run by ezmlm Delivered-To: mailing list susan11@example.net Received: (qmail 87949 invoked from network); 4 Jan 2002 21:22:50 -0000 Received: from your.unreality.com (83.161.120.155) by daedalus.apache.org with SMTP; 4 Jan 2002 21:22:50 -0000 Received: (qmail 61633 invoked by uid 300); 4 Jan 2002 21:22:55 -0000 Received: from localhost (susan11@example.net) by localhost with SMTP; 4 Jan 2002 21:22:55 -0000 Date: Fri, 4 Jan 2002 15:22:55 -0600 (CST) From: Damon Courtney <susan11@example.net> To: susan11@example.net Subject: env trace Message-ID: <susan11@example.net> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N David, How far did you get with putting a trace on variables in the env() array and loading them on demand? D From susan11@example.net Sat Jan 5 01:02:20 2002 Return-Path: <susan11@example.net> Mailing-List: contact susan11@example.net; run by ezmlm Delivered-To: mailing list susan11@example.net Received: (qmail 79409 invoked from network); 5 Jan 2002 01:02:20 -0000 Received: from ppp-207-9.25-151.libero.it (HELO ashland) (83.161.120.155) by daedalus.apache.org with SMTP; 5 Jan 2002 01:02:20 -0000 Received: by ashland (Postfix, from userid 1000) id 640B84C087; Sat, 5 Jan 2002 02:03:49 +0100 (CET) To: susan11@example.net Subject: Re: env trace References: <susan11@example.net> From: susan11@example.net (David N. Welton) Date: 05 Jan 2002 02:03:49 +0100 In-Reply-To: <susan11@example.net> Message-ID: <susan11@example.net> Lines: 14 User-Agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N Damon Courtney <susan11@example.net> writes: > How far did you get with putting a trace on variables in the > env() array and loading them on demand? I found a bug in Tcl with this line of exploration, so I pretty much gave up, because the fix won't work its way in for a while:-( -- David N. Welton Consulting: http://www.dedasys.com/ Free Software: http://people.debian.org/~davidw/ Apache Tcl: http://tcl.apache.org/ Personal: http://www.efn.org/~davidw/ From susan11@example.net Sat Jan 5 12:32:01 2002 Return-Path: <susan11@example.net> Mailing-List: contact susan11@example.net; run by ezmlm Delivered-To: mailing list susan11@example.net Received: (qmail 14484 invoked from network); 5 Jan 2002 12:32:01 -0000 Received: from ppp-165-10.25-151.libero.it (HELO ashland) (83.161.120.155) by daedalus.apache.org with SMTP; 5 Jan 2002 12:32:01 -0000 Received: by ashland (Postfix, from userid 1000) id 975DD4C087; Sat, 5 Jan 2002 13:33:09 +0100 (CET) To: Damon Courtney <susan11@example.net> Cc: Wojciech Kocjan <susan11@example.net>, susan11@example.net, susan11@example.net Subject: Re: "escaping" start/close tags in Tcl sections of tcl/html pages References: <susan11@example.net> From: susan11@example.net (David N. Welton) Date: 05 Jan 2002 13:33:04 +0100 Message-ID: <susan11@example.net> Lines: 20 User-Agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N Damon Courtney <susan11@example.net> writes: [ for rivet - don't worry, mod_dtcl folks:-) ] > So, I'm about to remove all of the upload stuff that has to do > with the 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4request888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4UPLOAD array. Any objections? We want the > upload command to be the in-point for all of this information > anyway, right? Or, do we want to fold it into the var command > somehow and even get rid of upload? I would opt for keeping the upload command, as there are a few things to be configured, and it has a reasonable set of sub-commands, so keeping it would avoid choking up the 'var' command namespace. -- David N. Welton Consulting: http://www.dedasys.com/ Free Software: http://people.debian.org/~davidw/ Apache Tcl: http://tcl.apache.org/ Personal: http://www.efn.org/~davidw/ From susan11@example.net Sat Jan 5 12:51:42 2002 Return-Path: <susan11@example.net> Mailing-List: contact susan11@example.net; run by ezmlm Delivered-To: mailing list susan11@example.net Received: (qmail 18876 invoked from network); 5 Jan 2002 12:51:42 -0000 Received: from ppp-165-10.25-151.libero.it (HELO ashland) (83.161.120.155) by daedalus.apache.org with SMTP; 5 Jan 2002 12:51:42 -0000 Received: by ashland (Postfix, from userid 1000) id 7F2014C087; Sat, 5 Jan 2002 13:53:04 +0100 (CET) To: Wojciech Kocjan <susan11@example.net> Cc: susan11@example.net, susan11@example.net Subject: Re: "escaping" start/close tags in Tcl sections of tcl/html pages References: <susan11@example.net> <susan11@example.net> From: susan11@example.net (David N. Welton) Date: 05 Jan 2002 13:53:03 +0100 In-Reply-To: <susan11@example.net> Message-ID: <susan11@example.net> Lines: 23 User-Agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N Wojciech Kocjan <susan11@example.net> writes: > >>I'm thinking about redoing the parser to take into account situations > >>like this: > However, I suppose a problem would be with XML stuff like this: > ... > It will work with the above example. However, the following is a big > problem: I did some timing on it, and found it slowed things down. That, combined with the fact that it should be escaped in any case because of all the possible special cases, leads me to thing that it's just not worth it. -- David N. Welton Consulting: http://www.dedasys.com/ Free Software: http://people.debian.org/~davidw/ Apache Tcl: http://tcl.apache.org/ Personal: http://www.efn.org/~davidw/ From susan11@example.net Sat Jan 5 14:40:23 2002 Return-Path: <susan11@example.net> Mailing-List: contact susan11@example.net; run by ezmlm Delivered-To: mailing list susan11@example.net Received: (qmail 45098 invoked by uid 500); 5 Jan 2002 14:40:23 -0000 Delivered-To: susan11@example.net Received: (qmail 45095 invoked from network); 5 Jan 2002 14:40:23 -0000 Received: from icarus.apache.org (83.161.120.155) by daedalus.apache.org with SMTP; 5 Jan 2002 14:40:23 -0000 Received: (qmail 80868 invoked by uid 1048); 5 Jan 2002 14:40:23 -0000 Date: 5 Jan 2002 14:40:23 -0000 Message-ID: <susan11@example.net> From: susan11@example.net To: susan11@example.net Subject: cvs commit: tcl-rivet/tests README runtests.tcl X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N davidw 02/01/05 06:40:23 Modified: . ChangeLog src channel.c make.tcl mod_rivet.c mod_rivet.h parser.c tcl_commands.c tests README runtests.tcl Added: src testing.c Log: * src/parser.c (Rivet_Parser): A few, mostly cosmetic, cleanups in the parser. * src/make.tcl: Add nodes for testing library. * src/channel.c (outputproc): Change printheaders to Rivet_PrintHeaders. * General whitespace cleanups. Revision Changes Path 1.9 +12 -0 tcl-rivet/ChangeLog Index: ChangeLog =================================================================== RCS file: /home/cvs/tcl-rivet/ChangeLog,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- ChangeLog 21 Nov 2001 18:39:23 -0000 1.8 +++ ChangeLog 5 Jan 2002 14:40:22 -0000 1.9 @@ -1,3 +1,15 @@ +2002-01-05 David N. Welton <susan11@example.net> + + * src/parser.c (Rivet_Parser): A few, mostly cosmetic, cleanups in + the parser. + + * src/make.tcl: Add nodes for testing library. + + * src/channel.c (outputproc): Change printheaders to + Rivet_PrintHeaders. + + * General whitespace cleanups. + 2001-11-21 David N. Welton <susan11@example.net> * src/channel.c: Almost all output is based on the ApacheChan 1.5 +1 -1 tcl-rivet/src/channel.c Index: channel.c =================================================================== RCS file: /home/cvs/tcl-rivet/src/channel.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- channel.c 21 Nov 2001 18:19:07 -0000 1.4 +++ channel.c 5 Jan 2002 14:40:22 -0000 1.5 @@ -25,7 +25,7 @@ rivet_server_conf *rsc = (rivet_server_conf *)instancedata; rivet_interp_globals *globals = Tcl_GetAssocData(rsc->server_interp, "rivet", NULL); - print_headers(globals->r); + Rivet_PrintHeaders(globals->r); if (*(rsc->content_sent) == 0) { ap_rwrite(buf, toWrite, globals->r); 1.4 +10 -1 tcl-rivet/src/make.tcl Index: make.tcl =================================================================== RCS file: /home/cvs/tcl-rivet/src/make.tcl,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- make.tcl 8 Nov 2001 01:37:11 -0000 1.3 +++ make.tcl 5 Jan 2002 14:40:22 -0000 1.4 @@ -2,7 +2,7 @@ # the next line restarts using tclsh \ exec tclsh "$0" "$@" -# $Id: make.tcl,v 1.3 2001/11/08 01:37:11 damonc Exp $ +# $Id: make.tcl,v 1.4 2002/01/05 14:40:22 davidw Exp $ # this file actually runs things, making use of the aardvark build # system. @@ -83,6 +83,15 @@ command {rm -f [glob -nocomplain *.o]} command {rm -f [glob -nocomplain *.so]} command {rm -f mod_rivet.a} +} + +AddNode testing.o { + command {$COMPILE testing.c} +} + +AddNode libtesting.so { + depends {parser.o testing.o} + command {$TCL_SHLIB_LD -o libtesting.so parser.o testing.o} } AddNode install { 1.13 +1 -3 tcl-rivet/src/mod_rivet.c Index: mod_rivet.c =================================================================== RCS file: /home/cvs/tcl-rivet/src/mod_rivet.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- mod_rivet.c 21 Nov 2001 18:19:07 -0000 1.12 +++ mod_rivet.c 5 Jan 2002 14:40:22 -0000 1.13 @@ -1,5 +1,3 @@ -/* Copyright David Welton 1998, 1999 */ - /* ==================================================================== * The Apache Software License, Version 1.1 * @@ -57,7 +55,7 @@ * originally written at the National Center for Supercomputing Applications, * University of Illinois, Urbana-Champaign. */ -/* $Id: mod_rivet.c,v 1.12 2001/11/21 18:19:07 damonc Exp $ */ +/* $Id: mod_rivet.c,v 1.13 2002/01/05 14:40:22 davidw Exp $ */ /* mod_rivet.c by David Welton <susan11@example.net> * and Damon Courtney <susan11@example.net> 1.8 +1 -1 tcl-rivet/src/mod_rivet.h Index: mod_rivet.h =================================================================== RCS file: /home/cvs/tcl-rivet/src/mod_rivet.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- mod_rivet.h 21 Nov 2001 18:19:07 -0000 1.7 +++ mod_rivet.h 5 Jan 2002 14:40:22 -0000 1.8 @@ -18,7 +18,7 @@ handler, instead of in child init handlers. */ #ifdef __MINGW32__ #define THREADED_TCL 1 -#else +#else #define THREADED_TCL 0 /* Unless you have MINGW32, modify this one! */ #endif 1.5 +20 -22 tcl-rivet/src/parser.c Index: parser.c =================================================================== RCS file: /home/cvs/tcl-rivet/src/parser.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- parser.c 21 Nov 2001 03:22:48 -0000 1.4 +++ parser.c 5 Jan 2002 14:40:22 -0000 1.5 @@ -1,4 +1,4 @@ -/* $Id: parser.c,v 1.4 2001/11/21 03:22:48 damonc Exp $ +/* $Id: parser.c,v 1.5 2002/01/05 14:40:22 davidw Exp $ Rivet parser - doesn't really need any of the includes besides tcl.h. @@ -8,7 +8,7 @@ #include "apache_request.h" #include "mod_rivet.h" -/* +/* Accepts an 'outbuf' to be filled, and an open file descriptor Returns 'inside', letting the caller know whether the parser was @@ -35,17 +35,15 @@ { if (ch == -1) return -1; - c = ch; + c = (char)ch; if (!inside) { - /* OUTSIDE */ - + /* Outside the delimiting tags. */ if (c == strstart[p]) { if ((++p) == endseqlen) { - /* Ok, we have matched the whole ending sequence. - * Do something + /* We have matched the whole ending sequence. */ Tcl_DStringAppend(&dstr, "\"\n", 2); inside = 1; @@ -53,41 +51,42 @@ continue; } } else { - if (p > 0) + if (p > 0) { Tcl_DStringAppend(&dstr, (char *)strstart, p); + p = 0; + } /* or else just put the char in outbuf */ switch (c) { case '{': - Tcl_DStringAppend(&dstr, "\\{", -1); + Tcl_DStringAppend(&dstr, "\\{", 2); break; case '}': - Tcl_DStringAppend(&dstr, "\\}", -1); + Tcl_DStringAppend(&dstr, "\\}", 2); break; case '$': - Tcl_DStringAppend(&dstr, "\\$", -1); + Tcl_DStringAppend(&dstr, "\\$", 2); break; case '[': - Tcl_DStringAppend(&dstr, "\\[", -1); + Tcl_DStringAppend(&dstr, "\\[", 2); break; case ']': - Tcl_DStringAppend(&dstr, "\\]", -1); + Tcl_DStringAppend(&dstr, "\\]", 2); break; case '"': - Tcl_DStringAppend(&dstr, "\\\"", -1); + Tcl_DStringAppend(&dstr, "\\\"", 2); break; case '\\': - Tcl_DStringAppend(&dstr, "\\\\", -1); + Tcl_DStringAppend(&dstr, "\\\\", 2); break; default: Tcl_DStringAppend(&dstr, &c, 1); break; } - p = 0; continue; } } else { - /* INSIDE */ + /* Inside the delimiting tags. */ if (c == strend[p]) { @@ -98,14 +97,13 @@ p = 0; continue; } - } - else - { + } else { /* plop stuff into outbuf, which we will then eval */ - if (p > 0) + if (p > 0) { Tcl_DStringAppend(&dstr, (char *)strend, p); + p = 0; + } Tcl_DStringAppend(&dstr, &c, 1); - p = 0; } } } 1.13 +3 -3 tcl-rivet/src/tcl_commands.c Index: tcl_commands.c =================================================================== RCS file: /home/cvs/tcl-rivet/src/tcl_commands.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- tcl_commands.c 21 Nov 2001 18:19:07 -0000 1.12 +++ tcl_commands.c 5 Jan 2002 14:40:22 -0000 1.13 @@ -61,20 +61,20 @@ rivet_interp_globals *globals = Tcl_GetAssocData(interp, "rivet", NULL); rivet_server_conf *rsc = RIVET_SERVER_CONF( globals->r->server->module_config ); - + if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "filename"); return TCL_ERROR; } - + filename = Tcl_GetStringFromObj (objv[1], (int *)NULL); if (!strcmp(filename, globals->r->filename)) { Tcl_AddErrorInfo(interp, "Cannot recursively call the same file!"); return TCL_ERROR; } - + if (stat(filename, &finfo)) { Tcl_AddErrorInfo(interp, Tcl_PosixError(interp)); 1.1 tcl-rivet/src/testing.c Index: testing.c =================================================================== /* Testing code for C routines. */ /* $Id: testing.c,v 1.1 2002/01/05 14:40:22 davidw Exp $ */ #include <tcl.h> #include <sys/gmon.h> int Rivet_Parser_Test ( ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { Tcl_Obj *outbuf = NULL; FILE *testfile = NULL; if (objc != 2) { Tcl_WrongNumArgs(interp, 1, objv, "filename"); return TCL_ERROR; } testfile = fopen(Tcl_GetString(objv[1]), "r"); if (testfile == NULL) { Tcl_AddErrorInfo(interp, Tcl_PosixError(interp)); return TCL_ERROR; } outbuf = Tcl_NewStringObj("", 0); Rivet_Parser(outbuf, testfile); //, "<?", "?>"); return TCL_OK; } int Cleanup ( ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { printf("cleaning up\n"); _mcleanup(); return TCL_OK; } //extern void _init (void), etext (void); int Testing_Init(Tcl_Interp *interp) { // monstartup(_init, etext); Tcl_CreateObjCommand(interp, "parsertest", Rivet_Parser_Test, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "cleanup", Cleanup, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_PkgProvide(interp, "rivettesting", "1.0"); return TCL_OK; } 1.2 +6 -2 tcl-rivet/tests/README Index: README =================================================================== RCS file: /home/cvs/tcl-rivet/tests/README,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- README 19 Sep 2001 23:56:24 -0000 1.1 +++ README 5 Jan 2002 14:40:23 -0000 1.2 @@ -1,6 +1,6 @@ Test Suite for Rivet -$Id: README,v 1.1 2001/09/19 23:56:24 davidw Exp $ +$Id: README,v 1.2 2002/01/05 14:40:23 davidw Exp $ These tests are intended to automate the testing of core Rivet features. They are not complete at this point, and work on them would @@ -14,5 +14,9 @@ are thusly able to manipulate the environment completely, and run the tests directly in the tests/ directory... -Note that mod_so.c must be compiled into Apache for this to work. +Note that mod_so.c must be compiled into Apache for this to work, or +Apache must be compiled with Rivet built in. +For example: + +./runtest.tcl /usr/sbin/apache 1.5 +3 -3 tcl-rivet/tests/runtests.tcl Index: runtests.tcl =================================================================== RCS file: /home/cvs/tcl-rivet/tests/runtests.tcl,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- runtests.tcl 21 Nov 2001 17:55:37 -0000 1.4 +++ runtests.tcl 5 Jan 2002 14:40:23 -0000 1.5 @@ -4,8 +4,8 @@ proc getbinname { } { global argv - set binname [ lindex $argv 0 ] - if { $binname == "" || ! [ file exists $binname ] } { + set binname [lindex $argv 0] + if { $binname == "" || ! [file exists $binname] } { puts stderr "Please supply the full name and path of the Apache executable on the command line!" exit 1 } @@ -40,7 +40,7 @@ } } startserver { - set apachepid [ exec $binname -X -f "[file join [pwd] server.conf]" & ] + set apachepid [exec $binname -X -f "[file join [pwd] server.conf]" &] } default { set apachepid [exec $binname -X -f "[file join [pwd] server.conf]" &] From susan11@example.net Sat Jan 5 18:40:04 2002 Return-Path: <susan11@example.net> Mailing-List: contact susan11@example.net; run by ezmlm Delivered-To: mailing list susan11@example.net Received: (qmail 6349 invoked from network); 5 Jan 2002 18:40:04 -0000 Received: from ppp-165-10.25-151.libero.it (HELO ashland) (83.161.120.155) by daedalus.apache.org with SMTP; 5 Jan 2002 18:40:04 -0000 Received: by ashland (Postfix, from userid 1000) id 87BCD4C087; Sat, 5 Jan 2002 19:41:30 +0100 (CET) To: susan11@example.net, susan11@example.net, susan11@example.net, susan11@example.net, susan11@example.net Subject: insidious stat vs stat64 bug on Linux From: susan11@example.net (David N. Welton) Date: 05 Jan 2002 19:41:30 +0100 Message-ID: <susan11@example.net> Lines: 43 User-Agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N [ sorry for the crossposting - is everyone who needs to be on general@ ? ] Observe: FILE 1 #include "httpd.h" #include <tcl.h> int main() { struct stat foo; printf("size of stat __pad1 is %d\n", sizeof(foo.__pad1)); } FILE 2 #include <tcl.h> #include "httpd.h" int main() { struct stat foo; printf("size of stat __pad1 is %d\n", sizeof(foo.__pad1)); } These are *different*, because, at least on my box, running Linux 2.4.16 on a PowerPC system, #define _FILE_OFFSET_BITS 64 is set by the Apache config files. so the first is really a stat64 struct, and the second a regular old stat struct. I'm not sure of all of the ramifications of this, but I spent a long time even finding it, and think that it might cause some very subtle and nasty bugs. -- David N. Welton Consulting: http://www.dedasys.com/ Free Software: http://people.debian.org/~davidw/ Apache Tcl: http://tcl.apache.org/ Personal: http://www.efn.org/~davidw/ From susan11@example.net Sun Jan 6 00:35:39 2002 Return-Path: <susan11@example.net> Mailing-List: contact susan11@example.net; run by ezmlm Delivered-To: mailing list susan11@example.net Received: (qmail 81691 invoked from network); 6 Jan 2002 00:35:39 -0000 Received: from ppp-241-18.25-151.libero.it (HELO ashland) (83.161.120.155) by daedalus.apache.org with SMTP; 6 Jan 2002 00:35:39 -0000 Received: by ashland (Postfix, from userid 1000) id 48B984C087; Sun, 6 Jan 2002 01:37:08 +0100 (CET) To: susan11@example.net Subject: page name (.ttml, .asp, .pl...?) From: susan11@example.net (David N. Welton) Date: 06 Jan 2002 01:37:08 +0100 Message-ID: <susan11@example.net> Lines: 15 User-Agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N .ttml is probably a good thing to move away from, just so we stake out our own namespace. How about .rsp? Borrows on a common theme, and isn't too hard to find with google (I like looking up pages to see who is using my stuff:-). -- David N. Welton Consulting: http://www.dedasys.com/ Free Software: http://people.debian.org/~davidw/ Apache Tcl: http://tcl.apache.org/ Personal: http://www.efn.org/~davidw/ From susan11@example.net Sun Jan 6 06:12:33 2002 Return-Path: <susan11@example.net> Mailing-List: contact susan11@example.net; run by ezmlm Delivered-To: mailing list susan11@example.net Received: (qmail 49968 invoked from network); 6 Jan 2002 06:12:33 -0000 Received: from your.unreality.com (83.161.120.155) by daedalus.apache.org with SMTP; 6 Jan 2002 06:12:33 -0000 Received: (qmail 98134 invoked by uid 300); 6 Jan 2002 06:12:43 -0000 Received: from localhost (susan11@example.net) by localhost with SMTP; 6 Jan 2002 06:12:43 -0000 Date: Sun, 6 Jan 2002 00:12:43 -0600 (CST) From: Damon Courtney <susan11@example.net> To: "David N. Welton" <susan11@example.net> cc: susan11@example.net Subject: Re: page name (.ttml, .asp, .pl...?) In-Reply-To: <susan11@example.net> Message-ID: <susan11@example.net> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N > .ttml is probably a good thing to move away from, just so we stake out > our own namespace. > > How about .rsp? > > Borrows on a common theme, and isn't too hard to find with google (I > like looking up pages to see who is using my stuff:-). I guess .rsp is ok. I was thinking more like .rvt. Then, with later releases, we can either keep this or go to more of a PHP type scheme to keep parsers and versions separate. IE: .rvt, .rvt2, .rvt3, etc... I've been using .rhtml on my personal instances. D From susan11@example.net Sun Jan 6 09:26:10 2002 Return-Path: <susan11@example.net> Mailing-List: contact susan11@example.net; run by ezmlm Delivered-To: mailing list susan11@example.net Received: (qmail 78650 invoked from network); 6 Jan 2002 09:26:10 -0000 Received: from bart.nowiny.net (83.161.120.155) by daedalus.apache.org with SMTP; 6 Jan 2002 09:26:10 -0000 Received: from hesus.nowiny.net ([83.161.120.155] helo=kocjan.org) by bart.nowiny.net with esmtp (Exim 3.12 #1 (Debian)) id 16N9Z5-0001xW-00; Sun, 06 Jan 2002 10:26:03 +0100 Message-ID: <susan11@example.net> Date: Sun, 06 Jan 2002 10:25:02 +0100 From: Wojciech Kocjan <susan11@example.net> User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:0.9.6) Gecko/20011120 X-Accept-Language: pl, en-us MIME-Version: 1.0 To: "David N. Welton" <susan11@example.net> CC: susan11@example.net Subject: Re: page name (.ttml, .asp, .pl...?) References: <susan11@example.net> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N .rsp sounds better than ttml, that's for sure. But I agree with Damon that .rvt sounds even better, mayb less Java/ASP-style :) But I disagree with an idea to do .rvt2, .rvt3 and so on - I'd rather just stick to the extension unless Rivet2 is very incompatible - and I hoped on no incompatibilities after 1.0 :) David N. Welton wrote: > .ttml is probably a good thing to move away from, just so we stake out > our own namespace. > > How about .rsp? > > Borrows on a common theme, and isn't too hard to find with google (I > like looking up pages to see who is using my stuff:-). > > From susan11@example.net Sun Jan 6 12:48:46 2002 Return-Path: <susan11@example.net> Mailing-List: contact susan11@example.net; run by ezmlm Delivered-To: mailing list susan11@example.net Received: (qmail 8325 invoked from network); 6 Jan 2002 12:48:46 -0000 Received: from ppp-252-7.25-151.libero.it (HELO ashland) (83.161.120.155) by daedalus.apache.org with SMTP; 6 Jan 2002 12:48:46 -0000 Received: by ashland (Postfix, from userid 1000) id 426C94C087; Sun, 6 Jan 2002 13:50:07 +0100 (CET) To: Wojciech Kocjan <susan11@example.net> Cc: susan11@example.net Subject: Re: page name (.ttml, .asp, .pl...?) References: <susan11@example.net> <susan11@example.net> From: susan11@example.net (David N. Welton) Date: 06 Jan 2002 13:50:06 +0100 Message-ID: <susan11@example.net> Lines: 19 User-Agent: Gnus/5.0808 (Gnus v5.8.8) Emacs/20.7 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N Wojciech Kocjan <susan11@example.net> writes: > .rsp sounds better than ttml, that's for sure. > But I agree with Damon that .rvt sounds even better, mayb less > Java/ASP-style :) Ok, sounds good to me - a bit easier to remember because it's different than all the other *sp's. I'll move everything in the sources and docs to talk about 'rvt' instead of 'ttml'. -- David N. Welton Consulting: http://www.dedasys.com/ Free Software: http://people.debian.org/~davidw/ Apache Tcl: http://tcl.apache.org/ Personal: http://www.efn.org/~davidw/ From susan11@example.net Sun Jan 6 13:30:55 2002 Return-Path: <susan11@example.net> Mailing-List: contact susan11@example.net; run by ezmlm Delivered-To: mailing list susan11@example.net Received: (qmail 14189 invoked by uid 500); 6 Jan 2002 13:30:55 -0000 Delivered-To: susan11@example.net Received: (qmail 14186 invoked from network); 6 Jan 2002 13:30:55 -0000 Received: from icarus.apache.org (83.161.120.155) by daedalus.apache.org with SMTP; 6 Jan 2002 13:30:55 -0000 Received: (qmail 99450 invoked by uid 1048); 6 Jan 2002 13:30:55 -0000 Date: 6 Jan 2002 13:30:55 -0000 Message-ID: <susan11@example.net> From: susan11@example.net To: susan11@example.net Subject: cvs commit: tcl-rivet/tests channel.rvt cookies.rvt env.rvt get.rvt hello.rvt post.rvt cookies.test env.test get.test hello.test post.test runtests.tcl template.conf.tcl channel.ttml cookies.ttml env.ttml get.ttml hello.ttml post.ttml X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N davidw 02/01/06 05:30:54 Modified: . ChangeLog doc commands.html directives.html example.tcl install.html other.html src mod_rivet.c testing.c tests cookies.test env.test get.test hello.test post.test runtests.tcl template.conf.tcl Added: . LICENSE README doc examples.rvt tests channel.rvt cookies.rvt env.rvt get.rvt hello.rvt post.rvt Removed: doc examples.ttml tests channel.ttml cookies.ttml env.ttml get.ttml hello.ttml post.ttml Log: * General: Changed .ttml to .rvt. Also changed mime type to x-httpd-rivet. Changed all references in documentation to .rvt from .ttml. Revision Changes Path 1.10 +7 -1 tcl-rivet/ChangeLog Index: ChangeLog =================================================================== RCS file: /home/cvs/tcl-rivet/ChangeLog,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- ChangeLog 5 Jan 2002 14:40:22 -0000 1.9 +++ ChangeLog 6 Jan 2002 13:30:54 -0000 1.10 @@ -1,3 +1,9 @@ +2002-01-06 David N. Welton <susan11@example.net> + + * General: Changed .ttml to .rvt. Also changed mime type to + x-httpd-rivet. Changed all references in documentation to .rvt + from .ttml. + 2002-01-05 David N. Welton <susan11@example.net> * src/parser.c (Rivet_Parser): A few, mostly cosmetic, cleanups in @@ -8,7 +14,7 @@ * src/channel.c (outputproc): Change printheaders to Rivet_PrintHeaders. - * General whitespace cleanups. + * General: whitespace cleanups. 2001-11-21 David N. Welton <susan11@example.net> 1.1 tcl-rivet/LICENSE Index: LICENSE =================================================================== /* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000, 2001 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact susan11@example.net. * * 5. Products derived from this software may not be called "mod_rivet" * or "rivet", nor may "rivet" appear in their name, without prior * written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ 1.1 tcl-rivet/README Index: README =================================================================== Apache Rivet ============ See LICENSE for licensing terms. $Id: README,v 1.1 2002/01/06 13:30:54 davidw Exp $ 1.5 +9 -9 tcl-rivet/doc/commands.html Index: commands.html =================================================================== RCS file: /home/cvs/tcl-rivet/doc/commands.html,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- commands.html 16 Nov 2001 10:41:44 -0000 1.4 +++ commands.html 6 Jan 2002 13:30:54 -0000 1.5 @@ -1,5 +1,5 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> - <!-- $Id: commands.html,v 1.4 2001/11/16 10:41:44 davidw Exp $ --> + <!-- $Id: commands.html,v 1.5 2002/01/06 13:30:54 davidw Exp $ --> <html> <head> <title>Rivet tcl commands</title> @@ -12,7 +12,7 @@ <ul> <li><code><b>var</b></code><br> These commands retrieve or retrieve information about "CGI" variables that are passed to - the rivet script via GET or POST operations. + the rivet script via GET or POST operations. </li> <li> <code><b>var get <i>varname</i></b></code><br> Returns the @@ -79,23 +79,23 @@ <li> <code><b>hgetvars</b></code><br> Get environmental, and Cookie variables. This is in a seperate command so as not to make the - server do this every time you load a .ttml file. <code>ENVS</code> and + server do this every time you load an .rvt file. <code>ENVS</code> and <code>COOKIES</code> are the associative arrays created. <code>ENVS</code> contains environmental variables, and <code>COOKIES</code> contains any cookies recieved from the client. </li> <li> - <code><b>include <i>filename</i></b></code><br> + <code><b>include <i>filename</i></b></code><br> Include a file without parsing it. This is the best way to include an HTML file or any other static content. </li> <li> - <code><b>parse <i>filename</i></b></code><br> - "Source" a .ttml file. This is the way to include - other .ttml files. + <code><b>parse <i>filename</i></b></code><br> + "Source" an .rvt file. This is the way to include + other .rvt files. </li> <li> - <code><b>headers redirect <i>uri</i></b></code><br> + <code><b>headers redirect <i>uri</i></b></code><br> Redirect from the current page to a new URI. <b>Must</b> be done in the first block of TCL code. @@ -137,7 +137,7 @@ </li> <li> - <code><b>rivet_info</b></code><br> + <code><b>rivet_info</b></code><br> Prints information on the internals of the module in HTML. Currently, only the PID and size of the object 1.4 +12 -12 tcl-rivet/doc/directives.html Index: directives.html =================================================================== RCS file: /home/cvs/tcl-rivet/doc/directives.html,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- directives.html 16 Nov 2001 10:41:44 -0000 1.3 +++ directives.html 6 Jan 2002 13:30:54 -0000 1.4 @@ -1,12 +1,12 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> -<!-- $Id: directives.html,v 1.3 2001/11/16 10:41:44 davidw Exp $ --> +<!-- $Id: directives.html,v 1.4 2002/01/06 13:30:54 davidw Exp $ --> <html> <head> <title>Rivet Apache directives</title> <link rel="stylesheet" href="style.css"> </head> <body> - + <h2 align="center">Rivet Apache directives</h2> <ul> @@ -19,36 +19,36 @@ </li> <li> - <code><b>Rivet_Script ChildInitScript <i>"script"</i></b></code><br> + <code><b>Rivet_Script ChildInitScript <i>"script"</i></b></code><br> Script to be evaluated when each apache child is initialized. This is the best place to load modules. </li> <li> - <code><b>Rivet_Script ChildExitScript <i>"script"</i></b></code><br> + <code><b>Rivet_Script ChildExitScript <i>"script"</i></b></code><br> Script to be evaluated when each apache child exits. </li> <li> - <code><b>Rivet_Script BeforeScript <i>"script"</i></b></code><br> - Script to be evaluated before each .ttml page. + <code><b>Rivet_Script BeforeScript <i>"script"</i></b></code><br> + Script to be evaluated before each .rvt page. </li> <li> - <code><b>Rivet_Script AfterScript <i>"script"</i></b></code><br> - Script to be called after each .ttml page. + <code><b>Rivet_Script AfterScript <i>"script"</i></b></code><br> + Script to be called after each .rvt page. </li> <li> - <code><b>Rivet_Script ErrorScript <i>"script"</i></b></code><br> + <code><b>Rivet_Script ErrorScript <i>"script"</i></b></code><br> This code is called in place of the standard 'error' pages generated for Rivet. This directive may be useful if you have sensitive logic that you wish to protect. </li> - + <li> - <code><b>Rivet_CacheSize <i>cachesize</i></b></code><br> - Number of ttml scripts to cache as Tcl Objects. + <code><b>Rivet_CacheSize <i>cachesize</i></b></code><br> + Number of rvt scripts to cache as Tcl Objects. Default is MaxRequestsPerChild / 2, or 50, if MaxRequestsPerChild is 0. </li> 1.4 +2 -2 tcl-rivet/doc/example.tcl Index: example.tcl =================================================================== RCS file: /home/cvs/tcl-rivet/doc/example.tcl,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- example.tcl 16 Nov 2001 10:41:44 -0000 1.3 +++ example.tcl 6 Jan 2002 13:30:54 -0000 1.4 @@ -1,5 +1,5 @@ # we have complete access to the interpreter here, so it is best to -# run per-page code in a namespace, just like we do with .ttml pages. +# run per-page code in a namespace, just like we do with .rvt pages. proc getcode { filename } { set fl [ open $filename r ] @@ -17,7 +17,7 @@ <html> <head> <title>.tcl example</title> - </head> + </head> <body bgcolor="#ffffff"> } } 1.3 +16 -16 tcl-rivet/doc/install.html Index: install.html =================================================================== RCS file: /home/cvs/tcl-rivet/doc/install.html,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- install.html 19 Sep 2001 22:59:01 -0000 1.2 +++ install.html 6 Jan 2002 13:30:54 -0000 1.3 @@ -6,12 +6,12 @@ </head> <body> - <!-- $Id: install.html,v 1.2 2001/09/19 22:59:01 davidw Exp $ --> + <!-- $Id: install.html,v 1.3 2002/01/06 13:30:54 davidw Exp $ --> <h2 align="center">Rivet Installation</h2> - + <ol> <li><b>Check dependencies</b><br> - + To install Rivet, you will need <b>Tcl 8.2</b> or greater and <b>Apache 1.3.xx</b>. It is known to run on Linux, FreeBSD, OpenBSD, and Solaris and HPUX. NT is also possible - @@ -21,10 +21,10 @@ <li><b>Get Rivet</b><br> If you are running a Debian or FreeBSD system, there are pre-built packages available at: - <a target="_top" href="http://www.debian.org/Packages/unstable/web/libapache-mod-rivet.html">http://www.debian.org/Packages/unstable/web/libapache-mod-rivet.html</a> + <a target="_top" href="http://www.debian.org/Packages/unstable/web/libapache-mod-rivet.html">http://www.debian.org/Packages/unstable/web/libapache-mod-rivet.html</a> or - + <a target="_top" href="http://www.freebsd.org/cgi/ports.cgi?query=Rivet">http://www.freebsd.org/cgi/ports.cgi?query=Rivet</a>.<br> @@ -47,7 +47,7 @@ </code> </li> - <li><b>Configuring, buildrivet.sh, etc...</b><br> + <li><b>Configuring, buildrivet.sh, etc...</b><br> Do you want to build Rivet as a shared object (such as a .so file on Linux, or a .dll on windows), or compile it @@ -58,10 +58,10 @@ <ul> <li><b>For shared objects</b><br> - + <code>cd ../Rivet/<br></code> Edit the <code>buildrivet.sh</code> script. The 3 - variables you may need to change are: + variables you may need to change are: <ul> <li><code>TCLSH</code><br> Name of the tclsh program on your computer. @@ -89,7 +89,7 @@ <code>/usr/lib/apache/1.3/</code>. </li> - + <li><b>For static builds</b><br> <code> cd apache-1.3.X/<br> @@ -98,7 +98,7 @@ <code>cd ../Rivet/<br></code> Edit the <code>buildrivet.sh</code> script. The 3 - variables you may need to change are: + variables you may need to change are: <ul> <li><code>TCLSH</code><br> Name of the tclsh program on your computer. @@ -127,24 +127,24 @@ <code>export EXTRA_LIBS="-ltcl8.X -lm"</code><br> <code>make -e<br></code> <code>make install<br></code> - + </li> </ul> </li> - <li><b>Configure Apache<br></b> + <li><b>Configure Apache<br></b> <ul> <li> <b>http.conf</b><br> <code>LoadModule rivet_module - /usr/lib/apache/1.3/Rivet.so</code><br> + /usr/lib/apache/1.3/Rivet.so</code><br> This points Apache to the shared object if Rivet is being used as a loadable module. </li> <li> - <b>srm.conf</b><br> - <code>AddType application/x-httpd-tcl .ttml</code><br> + <b>srm.conf</b><br> + <code>AddType application/x-httpd-rivet .rvt</code><br> <code>AddType application/x-rivet-tcl .tcl</code> (optional)<br> - These add the .ttml and .tcl (if desired) types to + These add the .rvt and .tcl (if desired) types to Apache, so that they are processed by Rivet. </li> </ul> 1.4 +13 -26 tcl-rivet/doc/other.html Index: other.html =================================================================== RCS file: /home/cvs/tcl-rivet/doc/other.html,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- other.html 16 Nov 2001 10:41:44 -0000 1.3 +++ other.html 6 Jan 2002 13:30:54 -0000 1.4 @@ -6,13 +6,13 @@ </head> <body> <h2>Other Rivet Documentation</h2> - + <h3>Internals</h3> <ul> <li><b>Read the code!</b></li> - <li> + <li> <b>Initialization</b><br> - + When Apache is started, (or when child Apache processes are started if a threaded Tcl is used), <code>tcl_init_stuff</code> is called, which creates @@ -23,17 +23,16 @@ </li> <li><b>Achan/apache_channel</b><br> - The "Apache Channel" system was created so that it is - possible to have an actual Tcl channel that we could - redirect standard output to. This lets us use, for - instance, the regular "puts" command in .ttml pages. - It works by creating commands that write to memory - that is slated to be sent to the client. + The "Apache Channel" system was created so that it is possible + to have an actual Tcl channel that we could redirect standard + output to. This lets us use, for instance, the regular "puts" + command in .rvt pages. It works by creating commands that + write to memory that is slated to be sent to the client. </li> <li><b>Page parsing/execution</b><br> - In <code>send_parsed_file</code> Each .ttml file is loaded and + In <code>send_parsed_file</code> Each .rvt file is loaded and run within its own namespace. No new interpreter is created for each page. This lets you share variables, and most importantly, loaded modules, from a common parent (such as one @@ -51,24 +50,12 @@ </li> </ul> - <h3>Upgrading From Older (< 0.9.3) Versions</h3> + <h3>Upgrading From mod_dtcl and NeoWebScript</h3> <ul> - <li><b>New tags</b><br> As of version 0.9.4, Rivet uses - &lt;? and ?&gt; instead of &lt;+ and +&gt; to delimit - sections of Tcl code. By default, rivet is still compiled - with code to parse the &lt;? ?&gt; tags, but it will run - faster if <code>USE_OLD_TAGS</code> is set to 0 in - <code>Rivet.h</code>. You can automatically change your - .ttml files to the new format by using the - <code>newtags.sh</code> script in the contrib/ directory. - Run it at the top level of your DocumentRoot. - </li> - <li><b>headers setcookie</b><br> - The <code>headers setcookie</code> command now uses the - <code>-name</code> and <code>-value</code> flags for those - arguments, whereas this was not necessary in the past. + <li> + <b>TO BE WRITTEN</b> </li> </ul> </body> </html> - <!-- $Id: other.html,v 1.3 2001/11/16 10:41:44 davidw Exp $ --> \ No newline at end of file + <!-- $Id: other.html,v 1.4 2002/01/06 13:30:54 davidw Exp $ --> \ No newline at end of file 1.1 tcl-rivet/doc/examples.rvt Index: examples.rvt =================================================================== <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.0//EN"> <html> <!-- $Id: examples.rvt,v 1.1 2002/01/06 13:30:54 davidw Exp $ --> <title>Rivet examples</title> <body bgcolor=white> <table bgcolor=black width=100%> <tr> <td align=center> <font size=40 color=#ffffff> <b>Rivet examples</b> </font> </td> </tr> </table> <p> These are some examples, rather limited ones, of what can be done with Rivet. <p> <table> <tr><td><hr><b>Hello world</b></td></tr> <tr><td bgcolor=gray><pre> &lt;? headers setcookie "foo" "bar" # we have to put this before any 'puts' statements puts "Hello world" ?&gt; </pre> </td></tr> <tr><td> Produces: <p> <? headers setcookie "foo" "bar" puts "hello world" ?> <p> </td></tr> <tr><td><hr> <b>Conditionals:</b> </td></tr> <tr><td bgcolor=gray><pre> &lt;? if { 1 } { ?&gt; &lt;h2&gt; True &lt;/h2&gt; &lt;? } ?&gt; </td></tr></pre> <tr><td> Produces: <p> <? if { 1 } { ?> <h2> True </h2> <? } ?> </td></tr> <tr><td><hr><b>Loops:</b> </td></tr> <tr><td bgcolor=gray><pre> &lt;? set x 0 while { $x &lt; 5 } { puts "\$x = $x&lt;br>" incr x ?&gt; LOOP&lt;br> &lt;? } ?&gt; </pre> </td></tr> <tr><td>Produces:<p> <? set x 0 while { $x < 5 } { puts "\$x = $x<br>" incr x ?> LOOP<BR> <? } ?> </td></tr> <tr><td><hr><b>Variables (environmental as well as those passed to the script)</b><p> </td></tr> <tr><td bgcolor=gray><pre> &lt;? hgetvars if { [ array exists VARS ] } { puts "&lt; ul>" foreach { vr } [ array names VARS ] { puts "&lt;li>(VARS) $vr = $VARS($vr)" } puts "&lt;/ul>" } if { [ array exists ENVS ] } { puts "&lt;ul>" foreach { vr } [ array names ENVS ] { puts "&lt;li>(ENVS) $vr = $ENVS($vr)" } puts "&lt;/ul>" } if { [ array exists COOKIES ] } { puts "&lt;ul>" foreach { vr } [ array names COOKIES ] { puts "&lt;li>(COOKIES) $vr = $COOKIES($vr)" } puts "&lt;/ul>" } ?&gt; </pre> </td></tr> <tr><td>Produces:<p> <? hgetvars if { [ array exists VARS ] } { puts "<ul>" foreach { vr } [ array names VARS ] { puts "<li>(VARS) $vr = $VARS($vr)" } puts "</ul>" } if { [ array exists ENVS ] } { puts "<ul>" foreach { vr } [ array names ENVS ] { puts "<li>(ENVS) $vr = $ENVS($vr)" } puts "</ul>" } if { [ array exists COOKIES ] } { puts "<ul>" foreach { vr } [ array names COOKIES ] { puts "<li>(COOKIES) $vr = $COOKIES($vr)" } puts "</ul>" } ?> </td></tr> <tr><td><hr><b>Create a table on the fly</b><p> </td></tr> <tr><td bgcolor=gray><pre> &lt;? set i 1 puts "&lt;table&gt;\n" while { $i &lt;= 8 } { puts "&lt;tr&gt;\n" for {set j 1} {$j &lt;= 8} {incr j} { set num [ expr $i * $j * 4 - 1] puts [ format "&lt;td bgcolor=%2x%2x%2x &gt; $num $num $num &lt;/td&gt;\n" $num $num $num ] } incr i puts "&lt;/tr&gt;\n" } puts "&lt;/table&gt;\n" ?&gt; </pre> </td></tr> <tr><td>Produces:<p> <? set i 1 puts "<table>\n" while { $i <= 8 } { puts "<tr>\n" for {set j 1} {$j <= 8} {incr j} { set num [ expr {$i * $j * 4 - 1} ] puts [ format "<td bgcolor=%2x%2x%2x > $num $num $num </td>\n" $num $num $num ] } incr i puts "</tr>\n" } puts "</table>\n" ?> </td></tr> <tr><td><hr> <b>In addition</b><br> There are many, many other things you can do with Rivet. You can, if everything is compiled right, load tcl modules, like libpgtcl.so (the Postgresql interface), so that you can interact with a database! <p> </td></tr> </table> <? rivet_info ?> <p> <a href="http://tcl.apache.org/rivet/">Return to the Rivet homepage</a> </p> </body> </html> 1.14 +11 -12 tcl-rivet/src/mod_rivet.c Index: mod_rivet.c =================================================================== RCS file: /home/cvs/tcl-rivet/src/mod_rivet.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- mod_rivet.c 5 Jan 2002 14:40:22 -0000 1.13 +++ mod_rivet.c 6 Jan 2002 13:30:54 -0000 1.14 @@ -55,14 +55,14 @@ * originally written at the National Center for Supercomputing Applications, * University of Illinois, Urbana-Champaign. */ -/* $Id: mod_rivet.c,v 1.13 2002/01/05 14:40:22 davidw Exp $ */ +/* $Id: mod_rivet.c,v 1.14 2002/01/06 13:30:54 davidw Exp $ */ /* mod_rivet.c by David Welton <susan11@example.net> * and Damon Courtney <susan11@example.net> * Originally based off code from mod_include. */ -/* See http://tcl.apache.org/mod_rivet/credits.ttml for additional credits. */ +/* See http://tcl.apache.org/mod_rivet/credits.rvt for additional credits. */ /* Apache includes */ #include "httpd.h" @@ -94,7 +94,7 @@ static void Rivet_InitTclStuff(server_rec *s, pool *p); static void Rivet_CopyConfig( rivet_server_conf *oldrsc, rivet_server_conf *newrsc); -static int get_ttml_file(request_rec *r, rivet_server_conf *rsc, +static int get_rvt_file(request_rec *r, rivet_server_conf *rsc, Tcl_Interp *interp, char *filename, int toplevel, Tcl_Obj *outbuf); static int Rivet_SendContent(request_rec *); @@ -219,7 +219,6 @@ "\": ", Tcl_PosixError(interp), (char *) NULL); return TCL_ERROR; } - result = Tcl_ReadChars(chan, outbuf, (signed)r->finfo.st_size, 1); if (result < 0) { @@ -238,10 +237,10 @@ #endif /* 1 */ } -/* Parse and execute a ttml file */ +/* Parse and execute an rvt file */ static int -get_ttml_file(request_rec *r, rivet_server_conf *rsc, Tcl_Interp *interp, +get_rvt_file(request_rec *r, rivet_server_conf *rsc, Tcl_Interp *interp, char *filename, int toplevel, Tcl_Obj *outbuf) { /* BEGIN PARSER */ @@ -341,7 +340,7 @@ } /* This is a seperate function so that it may be called from 'Parse' */ -int +int get_parse_exec_file(request_rec *r, rivet_server_conf *rsc, char *filename, int toplevel) { @@ -358,7 +357,7 @@ /* If toplevel is 0, we are being called from Parse, which means we need to get the information about the file ourselves. */ - if (toplevel == 0) + if (toplevel == 0) { int ret = 0; struct stat stat; @@ -389,7 +388,7 @@ { /* It's a TTML file - which we always are if toplevel is 0, meaning we are in the Parse command */ - result = get_ttml_file(r, rsc, interp, filename, toplevel, outbuf); + result = get_rvt_file(r, rsc, interp, filename, toplevel, outbuf); } else { /* It's a plain Tcl file */ result = get_tcl_file(r, interp, filename, outbuf); @@ -426,7 +425,7 @@ { char error[MAX_STRING_LEN]; char timefmt[MAX_STRING_LEN]; - + struct stat foo; int errstatus; Tcl_Interp *interp; @@ -943,7 +942,7 @@ void * Rivet_MergeConfig(pool *p, void *basev, void *overridesv) { - rivet_server_conf *rsc = + rivet_server_conf *rsc = (rivet_server_conf *) ap_pcalloc(p, sizeof(rivet_server_conf)); rivet_server_conf *base = (rivet_server_conf *) basev; rivet_server_conf *overrides = (rivet_server_conf *) overridesv; @@ -1029,7 +1028,7 @@ const handler_rec rivet_handlers[] = { - {"application/x-httpd-tcl", Rivet_SendContent}, + {"application/x-httpd-rivet", Rivet_SendContent}, {"application/x-rivet-tcl", Rivet_SendContent}, {NULL} }; 1.2 +12 -4 tcl-rivet/src/testing.c Index: testing.c =================================================================== RCS file: /home/cvs/tcl-rivet/src/testing.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- testing.c 5 Jan 2002 14:40:22 -0000 1.1 +++ testing.c 6 Jan 2002 13:30:54 -0000 1.2 @@ -1,8 +1,16 @@ /* Testing code for C routines. */ -/* $Id: testing.c,v 1.1 2002/01/05 14:40:22 davidw Exp $ */ +/* $Id: testing.c,v 1.2 2002/01/06 13:30:54 davidw Exp $ */ #include <tcl.h> -#include <sys/gmon.h> +#include "httpd.h" + + + + + + + + int Rivet_Parser_Test @@ -40,8 +48,9 @@ int objc, Tcl_Obj *CONST objv[]) { + struct stat foo; + printf("size of stat __pad1 is %d\n", sizeof(foo.__pad1)); printf("cleaning up\n"); - _mcleanup(); return TCL_OK; } @@ -50,7 +59,6 @@ int Testing_Init(Tcl_Interp *interp) { -// monstartup(_init, etext); Tcl_CreateObjCommand(interp, "parsertest", Rivet_Parser_Test, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "cleanup", Cleanup, 1.2 +2 -2 tcl-rivet/tests/cookies.test Index: cookies.test =================================================================== RCS file: /home/cvs/tcl-rivet/tests/cookies.test,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- cookies.test 21 Nov 2001 17:55:37 -0000 1.1 +++ cookies.test 6 Jan 2002 13:30:54 -0000 1.2 @@ -1,6 +1,6 @@ -# $Id: cookies.test,v 1.1 2001/11/21 17:55:37 davidw Exp $ +# $Id: cookies.test,v 1.2 2002/01/06 13:30:54 davidw Exp $ -set testfilename1 cookies.ttml +set testfilename1 cookies.rvt 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4tcltest888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4test cookies-1.1 {Cookies} { set page [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4geturl "${urlbase}$testfilename1" -headers {Cookie "foo=bar"} ] 1.2 +2 -2 tcl-rivet/tests/env.test Index: env.test =================================================================== RCS file: /home/cvs/tcl-rivet/tests/env.test,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- env.test 21 Nov 2001 17:55:37 -0000 1.1 +++ env.test 6 Jan 2002 13:30:54 -0000 1.2 @@ -1,6 +1,6 @@ -# $Id: env.test,v 1.1 2001/11/21 17:55:37 davidw Exp $ +# $Id: env.test,v 1.2 2002/01/06 13:30:54 davidw Exp $ -set testfilename1 env.ttml +set testfilename1 env.rvt 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4tcltest888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4test env-1.1 {Environment variable} { set page [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4geturl "${urlbase}$testfilename1" ] 1.2 +4 -4 tcl-rivet/tests/get.test Index: get.test =================================================================== RCS file: /home/cvs/tcl-rivet/tests/get.test,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- get.test 21 Nov 2001 17:55:37 -0000 1.1 +++ get.test 6 Jan 2002 13:30:54 -0000 1.2 @@ -1,19 +1,19 @@ -# $Id: get.test,v 1.1 2001/11/21 17:55:37 davidw Exp $ +# $Id: get.test,v 1.2 2002/01/06 13:30:54 davidw Exp $ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4tcltest888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4test getvariables-1.1 {GET variables} { - set page [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4geturl "${urlbase}get.ttml?foobar=goober" ] + set page [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4geturl "${urlbase}get.rvt?foobar=goober" ] regexp -line {\[var get foobar\] = goober$} [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4ta $page ] match set match } {[var get foobar] = goober} 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4tcltest888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4test getvariables-1.2 {GET variables + I18N} { - set page [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4geturl "${urlbase}get.ttml?Más=Tú" ] + set page [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4geturl "${urlbase}get.rvt?Más=Tú" ] regexp -line {^\[var get Más\] = Tú$} [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4ta $page ] match set match } {[var get Más] = Tú} 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4tcltest888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4test getvariables-1.3 {GET variables + I18N + encoding} { - set page [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4geturl [ format "${urlbase}get.ttml?%s" [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4ormatQuery Más Tú ] ] ] + set page [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4geturl [ format "${urlbase}get.rvt?%s" [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4ormatQuery Más Tú ] ] ] regexp -line {^\[var get Más\] = Tú$} [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4ta $page ] match set match } {[var get Más] = Tú} 1.2 +2 -2 tcl-rivet/tests/hello.test Index: hello.test =================================================================== RCS file: /home/cvs/tcl-rivet/tests/hello.test,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- hello.test 21 Nov 2001 17:55:37 -0000 1.1 +++ hello.test 6 Jan 2002 13:30:54 -0000 1.2 @@ -1,6 +1,6 @@ -# $Id: hello.test,v 1.1 2001/11/21 17:55:37 davidw Exp $ +# $Id: hello.test,v 1.2 2002/01/06 13:30:54 davidw Exp $ -set testfilename1 hello.ttml +set testfilename1 hello.rvt 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4tcltest888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4test hello-1.1 {hello world test} { set page [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4geturl "${urlbase}$testfilename1" ] 1.2 +2 -2 tcl-rivet/tests/post.test Index: post.test =================================================================== RCS file: /home/cvs/tcl-rivet/tests/post.test,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- post.test 21 Nov 2001 17:55:37 -0000 1.1 +++ post.test 6 Jan 2002 13:30:54 -0000 1.2 @@ -1,6 +1,6 @@ -# $Id: post.test,v 1.1 2001/11/21 17:55:37 davidw Exp $ +# $Id: post.test,v 1.2 2002/01/06 13:30:54 davidw Exp $ -set testfilename1 post.ttml +set testfilename1 post.rvt 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4tcltest888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4test postvariables-1.1 {POST variables} { set page [ 888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4http888a:dbb7:2d49:b3f6:8605:bf4e:caed:e5a4geturl "${urlbase}$testfilename1" -query foobar=goober ] 1.6 +6 -2 tcl-rivet/tests/runtests.tcl Index: runtests.tcl =================================================================== RCS file: /home/cvs/tcl-rivet/tests/runtests.tcl,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- runtests.tcl 5 Jan 2002 14:40:23 -0000 1.5 +++ runtests.tcl 6 Jan 2002 13:30:54 -0000 1.6 @@ -38,9 +38,13 @@ puts $oput exec kill $apachepid } - } + } startserver { - set apachepid [exec $binname -X -f "[file join [pwd] server.conf]" &] + if { [catch { + exec $binname -X -f "[file join [pwd] server.conf]" + } err] } { + puts "$errorInfo" + } } default { set apachepid [exec $binname -X -f "[file join [pwd] server.conf]" &] 1.4 +4 -2 tcl-rivet/tests/template.conf.tcl Index: template.conf.tcl =================================================================== RCS file: /home/cvs/tcl-rivet/tests/template.conf.tcl,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- template.conf.tcl 15 Nov 2001 00:39:40 -0000 1.3 +++ template.conf.tcl 6 Jan 2002 13:30:54 -0000 1.4 @@ -29,7 +29,7 @@ DocumentRoot "$CWD" <Directory "$CWD"> -Options All MultiViews +Options All MultiViews AllowOverride All Order allow,deny Allow from all @@ -51,9 +51,11 @@ CustomLog "$CWD/access_log" combined <IfModule mod_mime.c> +TypesConfig $CWD/mime.types + AddLanguage en .en AddLanguage it .it AddLanguage es .es -AddType application/x-httpd-tcl .ttml +AddType application/x-httpd-rivet .rvt AddType application/x-rivet-tcl .tcl </IfModule> 1.1 tcl-rivet/tests/channel.rvt Index: channel.rvt =================================================================== HTML <? no_body puts "foo" ?> MORE HTML <? puts bar #headers set Foo Bar flush stdout #headers set Bee Bop after 2000 puts stdout baz ?> LAST HTML 1.1 tcl-rivet/tests/cookies.rvt Index: cookies.rvt =================================================================== <? load_cookies headers setcookie -name mod -value rivet -expires 01-01-2003 if { [ array exists cookies ] } { foreach { ck } [ array names cookies ] { puts "cookies($ck) = $cookies($ck)\n" } } ?> 1.1 tcl-rivet/tests/env.rvt Index: env.rvt =================================================================== <? load_env puts "env(DOCUMENT_NAME) = $env(DOCUMENT_NAME)\n" ?> 1.1 tcl-rivet/tests/get.rvt Index: get.rvt =================================================================== <? if { [ var number ] > 0 } { # get/post variables 1.1 if { [ var exists foobar ] } { puts "\[var get foobar\] = [var get foobar]\n" } # get/post variables 1.{2,3} if { [ var exists Más ] } { puts "\[var get Más\] = [var get Más]\n" } } ?> 1.1 tcl-rivet/tests/hello.rvt Index: hello.rvt =================================================================== <?
{'source': 'Apache Software Foundation Public Mail Archives'}