davidw 02/01/21 17:27:57
Modified: . ChangeLog
src TclWeb.h TclWebapache.c make.tcl mod_rivet.c
mod_rivet.h rivetCore.c rivetCrypt.c rivetList.c
Log:
* src/rivetList.c (Rivet_LassignArrayObjCmd): Use -1 instead of NULL
when doing NewStringObj.
* src/rivetCrypt.c: Added header file.
* src/make.tcl: Added slightly nicer apxs handling.
* src/mod_rivet.c: Moved StringToUtf to TclWeb.
* src/mod_rivet.h: Removed StringToUtf macro.
* src/TclWebapache.c: Lots of bug fixes and corrections.
* src/rivetCore.c (Rivet_LoadEnv): Switched to TclWeb API.
(Rivet_LoadCookies): Switched to TclWeb API. (Rivet_Var): Switched
to TclWeb API.
Revision Changes Path
1.23 +19 -0 tcl-rivet/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /home/cvs/tcl-rivet/ChangeLog,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- ChangeLog 19 Jan 2002 23:27:01 -0000 1.22
+++ ChangeLog 22 Jan 2002 01:27:56 -0000 1.23
@@ -1,3 +1,22 @@
+2002-01-22 David N. Welton <[EMAIL PROTECTED]>
+
+ * src/rivetList.c (Rivet_LassignArrayObjCmd): Use -1 instead of
+ NULL when doing NewStringObj.
+
+ * src/rivetCrypt.c: Added header file.
+
+ * src/make.tcl: Added slightly nicer apxs handling.
+
+ * src/mod_rivet.c: Moved StringToUtf to TclWeb.
+
+ * src/mod_rivet.h: Removed StringToUtf macro.
+
+ * src/TclWebapache.c: Lots of bug fixes and corrections.
+
+ * src/rivetCore.c (Rivet_LoadEnv): Switched to TclWeb API.
+ (Rivet_LoadCookies): Switched to TclWeb API.
+ (Rivet_Var): Switched to TclWeb API.
+
2002-01-19 Damon J. Courtney <[EMAIL PROTECTED]>
* src/rivetCore.c
1.4 +29 -10 tcl-rivet/src/TclWeb.h
Index: TclWeb.h
===================================================================
RCS file: /home/cvs/tcl-rivet/src/TclWeb.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- TclWeb.h 19 Jan 2002 16:11:52 -0000 1.3
+++ TclWeb.h 22 Jan 2002 01:27:56 -0000 1.4
@@ -1,8 +1,20 @@
+#ifndef TCLWEB_H
+#define TCLWEB_H
/*
* TclWeb.c --
* Common API layer.
*/
+/* $Id: TclWeb.h,v 1.4 2002/01/22 01:27:56 davidw Exp $ */
+
+#define DEFAULT_TIME_FORMAT "%A, %d-%b-%Y %H:%M:%S %Z"
+
+typedef struct TclWebRequest {
+ Tcl_Interp *interp;
+ request_rec *req;
+ ApacheRequest *apachereq;
+} TclWebRequest;
+
/*
*-----------------------------------------------------------------------------
*
@@ -12,7 +24,7 @@
*-----------------------------------------------------------------------------
*/
-int TclWeb_InitRequest(TclWebRequest *req, void *arg);
+int TclWeb_InitRequest(TclWebRequest *req, Tcl_Interp *interp, void *arg);
/*
@@ -53,20 +65,21 @@
int TclWeb_SetStatus(int status, TclWebRequest *req);
+int TclWeb_GetVar(Tcl_Obj *result, char *varname, TclWebRequest *req);
-/*
-
*-----------------------------------------------------------------------------
- *
- * TclWeb_Cookie --
- * Make cookie.
- *
-
*-----------------------------------------------------------------------------
- */
+int TclWeb_GetVarAsList(Tcl_Obj *result, char *varname, TclWebRequest *req);
+
+int TclWeb_VarExists(Tcl_Obj *result, char *varname, TclWebRequest *req);
+
+int TclWeb_VarNumber(Tcl_Obj *result, TclWebRequest *req);
+
+int TclWeb_GetVarNames(Tcl_Obj *result, TclWebRequest *req);
+int TclWeb_GetAllVars(Tcl_Obj *result, TclWebRequest *req);
int TclWeb_GetCookieVars(Tcl_Obj *cookievar, TclWebRequest *req);
-int TclWeb_GetEnvVars(Tcl_Obj *envs, TclWebRequest *req);
+int TclWeb_GetEnvVars(Tcl_Obj *envvar, TclWebRequest *req);
/* upload stuff goes here */
@@ -76,6 +89,12 @@
int TclWeb_EscapeShellCommand(char *out, char *in, TclWebRequest *req);
+char *TclWeb_StringToUtf(char *in, TclWebRequest *req);
+
+Tcl_Obj * TclWeb_StringToUtfToObj(char *in, TclWebRequest *req);
+
/* output/write/flush? */
/* error (log) ? */
+
+#endif /* TCLWEB_H */
1.4 +81 -71 tcl-rivet/src/TclWebapache.c
Index: TclWebapache.c
===================================================================
RCS file: /home/cvs/tcl-rivet/src/TclWebapache.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- TclWebapache.c 19 Jan 2002 16:11:52 -0000 1.3
+++ TclWebapache.c 22 Jan 2002 01:27:56 -0000 1.4
@@ -7,30 +7,25 @@
* operations.
*/
-/* $Id: TclWebapache.c,v 1.3 2002/01/19 16:11:52 davidw Exp $ */
+/* $Id: TclWebapache.c,v 1.4 2002/01/22 01:27:56 davidw Exp $ */
#include <tcl.h>
#include "apache_request.h"
#include "apache_cookie.h"
-#include "mod_rivet.h"
+#include "TclWeb.h"
#define TCLWEBPOOL req->req->pool
-typedef struct TclWebRequest {
- Tcl_Interp *interp;
- request_rec *req;
- ApacheRequest *apachereq;
-} TclWebRequest;
-
-#include "TclWeb.h"
-
int
-TclWeb_InitRequest(TclWebRequest *req, void *arg)
+TclWeb_InitRequest(TclWebRequest *req, Tcl_Interp *interp, void *arg)
{
- req = (TclWebRequest *)Tcl_Alloc(sizeof(TclWebRequest));
- req->req = (request_rec *)arg;
- req->apachereq = ApacheRequest_new(req->req);
+ request_rec *r;
+
+ r = (request_rec *)arg;
+ req->interp = interp;
+ req->req = r;
+ req->apachereq = ApacheRequest_new(r);
return TCL_OK;
}
@@ -62,34 +57,37 @@
int i;
array_header *parmsarray = ap_table_elts(req->apachereq->parms);
table_entry *parms = (table_entry *)parmsarray->elts;
-
- result = NULL;
+ int flag = 0;
/* This isn't real efficient - move to hash table later
on... */
for (i = 0; i < parmsarray->nelts; ++i)
{
- if (!strncmp(varname, Rivet_StringToUtf(parms[i].key, TCLWEBPOOL),
strlen(varname)))
+ if (!strncmp(varname, TclWeb_StringToUtf(parms[i].key, req),
+ strlen(varname)))
{
/* The following makes sure that we get one string,
with no sub lists. */
- if (result == NULL)
+ if (flag == 0)
{
- result = STRING_TO_UTF_TO_OBJ(parms[i].val, TCLWEBPOOL);
+ flag = 1;
+ Tcl_SetStringObj(result,
+ TclWeb_StringToUtf(parms[i].val, req), -1);
Tcl_IncrRefCount(result);
} else {
+ Tcl_Obj *tmpobj;
Tcl_Obj *tmpobjv[2];
tmpobjv[0] = result;
- tmpobjv[1] = STRING_TO_UTF_TO_OBJ(parms[i].val, TCLWEBPOOL);
- result = Tcl_ConcatObj(2, tmpobjv);
+ tmpobjv[1] = TclWeb_StringToUtfToObj(parms[i].val, req);
+ tmpobj = Tcl_ConcatObj(2, tmpobjv);
+ Tcl_SetStringObj(result, Tcl_GetString(tmpobj), -1);
}
}
}
if (result == NULL)
{
- result = Tcl_NewStringObj("", -1);
- Tcl_IncrRefCount(result);
+ return TCL_ERROR;
}
return TCL_OK;
@@ -105,22 +103,17 @@
/* This isn't real efficient - move to hash table later on. */
for (i = 0; i < parmsarray->nelts; ++i)
{
- if (!strncmp(varname, Rivet_StringToUtf(parms[i].key, TCLWEBPOOL),
strlen(varname)))
+
+ if (!strncmp(varname, TclWeb_StringToUtf(parms[i].key, req),
strlen(varname)))
{
- if (result == NULL)
- {
- result = Tcl_NewObj();
- Tcl_IncrRefCount(result);
- }
Tcl_ListObjAppendElement(req->interp, result,
- STRING_TO_UTF_TO_OBJ(parms[i].val,
TCLWEBPOOL));
+ TclWeb_StringToUtfToObj(parms[i].val,
req));
}
}
if (result == NULL)
{
- result = Tcl_NewStringObj("", -1);
- Tcl_IncrRefCount(result);
+ return TCL_ERROR;
}
return TCL_OK;
}
@@ -132,22 +125,18 @@
array_header *parmsarray = ap_table_elts(req->apachereq->parms);
table_entry *parms = (table_entry *)parmsarray->elts;
- result = Tcl_NewObj();
- Tcl_IncrRefCount(result);
for (i = 0; i < parmsarray->nelts; ++i)
{
Tcl_ListObjAppendElement(req->interp, result,
- STRING_TO_UTF_TO_OBJ(parms[i].key,
TCLWEBPOOL));
+ TclWeb_StringToUtfToObj(parms[i].key, req));
Tcl_ListObjAppendElement(req->interp, result,
- STRING_TO_UTF_TO_OBJ(parms[i].val,
TCLWEBPOOL));
+ TclWeb_StringToUtfToObj(parms[i].val, req));
}
if (result == NULL)
{
- result = Tcl_NewStringObj("", -1);
- Tcl_IncrRefCount(result);
+ return TCL_ERROR;
}
-
return TCL_OK;
}
@@ -158,28 +147,22 @@
array_header *parmsarray = ap_table_elts(req->apachereq->parms);
table_entry *parms = (table_entry *)parmsarray->elts;
- result = Tcl_NewObj();
- Tcl_IncrRefCount(result);
-
- result = Tcl_NewObj();
- Tcl_IncrRefCount(result);
for (i = 0; i < parmsarray->nelts; ++i)
{
Tcl_ListObjAppendElement(req->interp, result,
- STRING_TO_UTF_TO_OBJ(parms[i].key,
TCLWEBPOOL));
+ TclWeb_StringToUtfToObj(parms[i].key, req));
}
if (result == NULL)
{
- result = Tcl_NewStringObj("", -1);
- Tcl_IncrRefCount(result);
+ return TCL_ERROR;
}
return TCL_OK;
}
int
-TclWeb_VarExists(char *varname, TclWebRequest *req)
+TclWeb_VarExists(Tcl_Obj *result, char *varname, TclWebRequest *req)
{
int i;
array_header *parmsarray = ap_table_elts(req->apachereq->parms);
@@ -188,12 +171,16 @@
/* This isn't real efficient - move to hash table later on. */
for (i = 0; i < parmsarray->nelts; ++i)
{
- if (!strncmp(varname, Rivet_StringToUtf(parms[i].key, TCLWEBPOOL),
strlen(varname)))
+ if (!strncmp(varname, TclWeb_StringToUtf(parms[i].key, req),
strlen(varname)))
{
+ Tcl_SetIntObj(result, 1);
+ Tcl_IncrRefCount(result);
return TCL_OK;
}
}
- return TCL_ERROR;
+ Tcl_SetIntObj(result, 0);
+ Tcl_IncrRefCount(result);
+ return TCL_OK;
}
int
@@ -201,7 +188,7 @@
{
array_header *parmsarray = ap_table_elts(req->apachereq->parms);
- result = Tcl_NewIntObj(parmsarray->nelts);
+ Tcl_SetIntObj(result, parmsarray->nelts);
Tcl_IncrRefCount(result);
return TCL_OK;
}
@@ -236,7 +223,6 @@
#endif /* ndef WIN32 */
char *t;
time_t date;
-
int i;
array_header *hdrs_arr;
@@ -260,38 +246,39 @@
/* These were the "include vars" */
Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("DATE_LOCAL", -1),
- STRING_TO_UTF_TO_OBJ(ap_ht_time(TCLWEBPOOL,
- date, timefmt, 0), TCLWEBPOOL), 0);
+ TclWeb_StringToUtfToObj(ap_ht_time(TCLWEBPOOL, date,
timefmt, 0), req), 0);
+
Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("DATE_GMT", -1),
- STRING_TO_UTF_TO_OBJ(ap_ht_time(TCLWEBPOOL,
- date, timefmt, 1), TCLWEBPOOL), 0);
+ TclWeb_StringToUtfToObj(ap_ht_time(TCLWEBPOOL, date,
timefmt, 1), req), 0);
+
+
Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("LAST_MODIFIED",
-1),
- STRING_TO_UTF_TO_OBJ(ap_ht_time(TCLWEBPOOL,
- req->req->finfo.st_mtime,
- timefmt, 0), TCLWEBPOOL), 0);
+ TclWeb_StringToUtfToObj(ap_ht_time(TCLWEBPOOL,
+ req->req->finfo.st_mtime,
+ timefmt, 1), req), 0);
Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("DOCUMENT_URI", -1),
- STRING_TO_UTF_TO_OBJ(req->req->uri, TCLWEBPOOL), 0);
+ TclWeb_StringToUtfToObj(req->req->uri, req), 0);
Tcl_ObjSetVar2(req->interp, envvar,
Tcl_NewStringObj("DOCUMENT_PATH_INFO", -1),
- STRING_TO_UTF_TO_OBJ(req->req->path_info, TCLWEBPOOL), 0);
+ TclWeb_StringToUtfToObj(req->req->path_info, req), 0);
#ifndef WIN32
pw = getpwuid(req->req->finfo.st_uid);
if (pw)
Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("USER_NAME", -1),
- STRING_TO_UTF_TO_OBJ(ap_pstrdup(TCLWEBPOOL, pw->pw_name),
TCLWEBPOOL), 0);
+ TclWeb_StringToUtfToObj(ap_pstrdup(TCLWEBPOOL, pw->pw_name),
req), 0);
else
Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("USER_NAME", -1),
- STRING_TO_UTF_TO_OBJ(
+ TclWeb_StringToUtfToObj(
ap_psprintf(TCLWEBPOOL, "user#%lu",
- (unsigned long)req->req->finfo.st_uid), TCLWEBPOOL),
0);
+ (unsigned long)req->req->finfo.st_uid), req), 0);
#endif
if ((t = strrchr(req->req->filename, '/')))
Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("DOCUMENT_NAME",
-1),
- STRING_TO_UTF_TO_OBJ(++t, TCLWEBPOOL), 0);
+ TclWeb_StringToUtfToObj(++t, req), 0);
else
Tcl_ObjSetVar2(req->interp, envvar, Tcl_NewStringObj("DOCUMENT_NAME",
-1),
- STRING_TO_UTF_TO_OBJ(req->req->uri, TCLWEBPOOL), 0);
+ TclWeb_StringToUtfToObj(req->req->uri, req), 0);
if (req->req->args)
{
@@ -299,7 +286,7 @@
ap_unescape_url(arg_copy);
Tcl_ObjSetVar2(req->interp, envvar,
Tcl_NewStringObj("QUERY_STRING_UNESCAPED", -1),
- STRING_TO_UTF_TO_OBJ(ap_escape_shell_cmd(TCLWEBPOOL, arg_copy),
TCLWEBPOOL), 0);
+ TclWeb_StringToUtfToObj(ap_escape_shell_cmd(TCLWEBPOOL, arg_copy),
req), 0);
}
/* ---------------------------- */
@@ -311,8 +298,8 @@
continue;
else {
Tcl_ObjSetVar2(req->interp, envvar,
- STRING_TO_UTF_TO_OBJ(hdrs[i].key, TCLWEBPOOL),
- STRING_TO_UTF_TO_OBJ(hdrs[i].val, TCLWEBPOOL), 0);
+ TclWeb_StringToUtfToObj(hdrs[i].key, req),
+ TclWeb_StringToUtfToObj(hdrs[i].val, req), 0);
}
}
@@ -321,8 +308,8 @@
{
if (!env[i].key)
continue;
- Tcl_ObjSetVar2(req->interp, envvar, STRING_TO_UTF_TO_OBJ(env[i].key,
TCLWEBPOOL),
- STRING_TO_UTF_TO_OBJ(env[i].val, TCLWEBPOOL), 0);
+ Tcl_ObjSetVar2(req->interp, envvar, TclWeb_StringToUtfToObj(env[i].key,
req),
+ TclWeb_StringToUtfToObj(env[i].val, req), 0);
}
/* cleanup system cgi variables */
@@ -350,6 +337,29 @@
{
out = ap_escape_shell_cmd(TCLWEBPOOL, in);
return TCL_OK;
+}
+
+/* Functions to convert strings to UTF encoding */
+
+/* These API's are a bit different, because it's so much more
+ * practical. */
+
+char *TclWeb_StringToUtf(char *in, TclWebRequest *req)
+{
+ char *tmp;
+ Tcl_DString dstr;
+ Tcl_DStringInit(&dstr);
+ Tcl_ExternalToUtfDString(NULL, in, (signed)strlen(in), &dstr);
+
+ tmp = ap_pstrdup(TCLWEBPOOL, Tcl_DStringValue(&dstr));
+ Tcl_DStringFree(&dstr);
+ return tmp;
+}
+
+Tcl_Obj *
+TclWeb_StringToUtfToObj(char *in, TclWebRequest *req)
+{
+ return Tcl_NewStringObj(TclWeb_StringToUtf(in, req), -1);
}
/* output/write/flush? */
1.14 +22 -7 tcl-rivet/src/make.tcl
Index: make.tcl
===================================================================
RCS file: /home/cvs/tcl-rivet/src/make.tcl,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- make.tcl 19 Jan 2002 23:27:01 -0000 1.13
+++ make.tcl 22 Jan 2002 01:27:56 -0000 1.14
@@ -2,7 +2,7 @@
# the next line restarts using tclsh \
exec tclsh "$0" "$@"
-# $Id: make.tcl,v 1.13 2002/01/19 23:27:01 damonc Exp $
+# $Id: make.tcl,v 1.14 2002/01/22 01:27:56 davidw Exp $
# this file actually runs things, making use of the aardvark build
# system.
@@ -16,15 +16,30 @@
# add variables
-set APXS "/usr/local/apache/bin/apxs"
+if { [file executable "/usr/local/apache/bin/apxs"] == 1 } {
+ set APXS "/usr/local/apache/bin/apxs"
+} else {
+ # edit here
+ set APXS "apxs"
+}
+
+if { [catch {
+ set INCLUDEDIR [exec $APXS -q INCLUDEDIR]
+ set LIBEXECDIR [exec $APXS -q LIBEXECDIR]
+ set PREFIX [exec $APXS -q PREFIX]
+} err] != 0 } {
+ puts stderr $err
+ puts stderr "You need to edit 'make.tcl' to supply the location of
Apache's apxs tool"
+ exit 1
+}
-set INC "-I[exec $APXS -q INCLUDEDIR] -I$TCL_PREFIX/include"
+set INC "-I$INCLUDEDIR -I$TCL_PREFIX/include"
set COMPILE "$TCL_CC $TCL_CFLAGS_DEBUG $TCL_CFLAGS_OPTIMIZE
$TCL_CFLAGS_WARNING $TCL_SHLIB_CFLAGS $INC $TCL_EXTRA_CFLAGS -c"
set MOD_STLIB mod_rivet.a
set MOD_SHLIB mod_rivet[info sharedlibextension]
-set MOD_OBJECTS "apache_cookie.o apache_multipart_buffer.o apache_request.o
channel.o parser.o rivetCore.o mod_rivet.o"
+set MOD_OBJECTS "apache_cookie.o apache_multipart_buffer.o apache_request.o
channel.o parser.o rivetCore.o mod_rivet.o TclWebapache.o"
set LIB_STLIB librivet.a
set LIB_SHLIB librivet[info sharedlibextension]
@@ -125,7 +140,7 @@
}
AddNode module {
- depends "TclWebapache.o shared"
+ depends "shared"
}
AddNode shared {
@@ -153,8 +168,8 @@
AddNode install {
depends "$MOD_SHLIB $LIB_SHLIB"
- tclcommand "file copy -force $MOD_SHLIB [exec $APXS -q LIBEXECDIR]"
- tclcommand "file copy -force ../rivet [exec $APXS -q PREFIX]"
+ tclcommand "file copy -force $MOD_SHLIB $LIBEXECDIR"
+ tclcommand "file copy -force ../rivet $PREFIX"
tclcommand "file copy -force $LIB_SHLIB ../rivet/packages/rivet"
}
1.24 +8 -22 tcl-rivet/src/mod_rivet.c
Index: mod_rivet.c
===================================================================
RCS file: /home/cvs/tcl-rivet/src/mod_rivet.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- mod_rivet.c 19 Jan 2002 23:27:01 -0000 1.23
+++ mod_rivet.c 22 Jan 2002 01:27:56 -0000 1.24
@@ -55,7 +55,7 @@
* originally written at the National Center for Supercomputing Applications,
* University of Illinois, Urbana-Champaign. */
-/* $Id: mod_rivet.c,v 1.23 2002/01/19 23:27:01 damonc Exp $ */
+/* $Id: mod_rivet.c,v 1.24 2002/01/22 01:27:56 davidw Exp $ */
/* mod_rivet.c by David Welton <[EMAIL PROTECTED]>
* and Damon Courtney <[EMAIL PROTECTED]>
@@ -156,20 +156,6 @@
return 0;
}
-/* Function to convert strings to UTF encoding */
-char *
-Rivet_StringToUtf(char *input, ap_pool *pool)
-{
- char *temp;
- Tcl_DString dstr;
- Tcl_DStringInit(&dstr);
- Tcl_ExternalToUtfDString(NULL, input, (signed)strlen(input), &dstr);
-
- temp = ap_pstrdup(pool, Tcl_DStringValue(&dstr));
- Tcl_DStringFree(&dstr);
- return temp;
-}
-
/* Function to be used should we desire to upload files to a variable */
#if 0
@@ -483,6 +469,7 @@
rsc = Rivet_GetConf(r);
globals = ap_pcalloc(r->pool, sizeof(rivet_interp_globals));
globals->r = r;
+ globals->req = (TclWebRequest *)ap_pcalloc(r->pool,
sizeof(TclWebRequest));
interp = rsc->server_interp;
Tcl_SetAssocData(interp, "rivet", NULL, globals);
@@ -528,20 +515,19 @@
/* Apache Request stuff */
- globals->req = ApacheRequest_new(r);
-
- ApacheRequest_set_post_max(globals->req, rsc->upload_max);
- ApacheRequest_set_temp_dir(globals->req, rsc->upload_dir);
+ TclWeb_InitRequest(globals->req, interp, r);
+ ApacheRequest_set_post_max(globals->req->apachereq, rsc->upload_max);
+ ApacheRequest_set_temp_dir(globals->req->apachereq, rsc->upload_dir);
#if 0
if (upload_files_to_var)
{
- globals->req->hook_data = interp;
- globals->req->upload_hook = Rivet_UploadHook;
+ globals->req->apachereq->hook_data = interp;
+ globals->req->apachereq->upload_hook = Rivet_UploadHook;
}
#endif
- if ((errstatus = ApacheRequest___parse(globals->req)) != OK)
+ if ((errstatus = ApacheRequest___parse(globals->req->apachereq)) != OK)
return errstatus;
Rivet_ParseExecFile(r, rsc, r->filename, 1);
1.13 +2 -5 tcl-rivet/src/mod_rivet.h
Index: mod_rivet.h
===================================================================
RCS file: /home/cvs/tcl-rivet/src/mod_rivet.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- mod_rivet.h 9 Jan 2002 21:42:44 -0000 1.12
+++ mod_rivet.h 22 Jan 2002 01:27:56 -0000 1.13
@@ -3,6 +3,7 @@
#include <tcl.h>
#include "apache_request.h"
+#include "TclWeb.h"
/* init.tcl file relative to the server root directory */
#define RIVET_DIR "rivet"
@@ -76,18 +77,14 @@
typedef struct {
request_rec *r; /* request rec */
- ApacheRequest *req; /* libapreq request */
+ TclWebRequest *req; /* TclWeb API request */
} rivet_interp_globals;
int Rivet_ParseExecFile(request_rec *r, rivet_server_conf *rsc, char
*filename, int toplevel);
int Rivet_SetHeaderType(request_rec *, char *);
int Rivet_PrintHeaders(request_rec *);
int Rivet_PrintError(request_rec *, int, char *);
-char *Rivet_StringToUtf(char *input, ap_pool *pool);
rivet_server_conf *Rivet_GetConf(request_rec *r);
-
-/* Macro to Tcl Objectify StringToUtf stuff */
-#define STRING_TO_UTF_TO_OBJ(string, pool)
Tcl_NewStringObj(Rivet_StringToUtf(string, pool), -1)
#define RIVET_SERVER_CONF(module) (rivet_server_conf
*)ap_get_module_config(module, &rivet_module)
1.7 +29 -234 tcl-rivet/src/rivetCore.c
Index: rivetCore.c
===================================================================
RCS file: /home/cvs/tcl-rivet/src/rivetCore.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- rivetCore.c 19 Jan 2002 23:27:01 -0000 1.6
+++ rivetCore.c 22 Jan 2002 01:27:56 -0000 1.7
@@ -2,7 +2,7 @@
* rivetCore.c - Core commands which are compiled into mod_rivet itself.
*/
-/* $Id: rivetCore.c,v 1.6 2002/01/19 23:27:01 damonc Exp $ */
+/* $Id: rivetCore.c,v 1.7 2002/01/22 01:27:56 davidw Exp $ */
#include "httpd.h"
#include "http_config.h"
@@ -21,6 +21,7 @@
#include "apache_cookie.h"
#include "mod_rivet.h"
#include "rivet.h"
+#include "TclWeb.h"
#define BUFSZ 4096
@@ -273,24 +274,8 @@
int objc,
Tcl_Obj *CONST objv[])
{
- char *timefmt = DEFAULT_TIME_FORMAT;
- char *auth = NULL;
-#ifndef WIN32
- struct passwd *pw;
-#endif /* ndef WIN32 */
- char *t;
-
- time_t date;
-
- int i;
-
- rivet_interp_globals *globals = Tcl_GetAssocData(interp, "rivet", NULL);
-
- array_header *hdrs_arr;
- table_entry *hdrs;
- array_header *env_arr;
- table_entry *env;
Tcl_Obj *ArrayObj;
+ rivet_interp_globals *globals = Tcl_GetAssocData(interp, "rivet", NULL);
if( objc > 2 ) {
Tcl_WrongNumArgs( interp, 1, objv, "?arrayName?" );
@@ -304,112 +289,8 @@
}
Tcl_IncrRefCount( ArrayObj );
- date = globals->r->request_time;
- /* ensure that the system area which holds the cgi variables is empty */
- ap_clear_table(globals->r->subprocess_env);
-
- /* retrieve cgi variables */
- ap_add_cgi_vars(globals->r);
- ap_add_common_vars(globals->r);
-
- hdrs_arr = ap_table_elts(globals->r->headers_in);
- hdrs = (table_entry *) hdrs_arr->elts;
-
- env_arr = ap_table_elts(globals->r->subprocess_env);
- env = (table_entry *) env_arr->elts;
-
- /* Get the user/pass info for Basic authentication */
- (const char*)auth = ap_table_get(globals->r->headers_in,
"Authorization");
- if ( auth && STREQU(ap_getword_nc(POOL, &auth, ' '), "Basic") )
- {
- char *tmp;
- char *user;
- char *pass;
-
- tmp = ap_pbase64decode(POOL, auth);
- user = ap_getword_nulls_nc(POOL, &tmp, ':');
- pass = tmp;
- Tcl_ObjSetVar2(interp, ArrayObj,
- Tcl_NewStringObj("HTTP_USER", -1),
- STRING_TO_UTF_TO_OBJ(user, POOL),
- 0);
- Tcl_ObjSetVar2(interp, ArrayObj,
- Tcl_NewStringObj("HTTP_PASS", -1),
- STRING_TO_UTF_TO_OBJ(pass, POOL),
- 0);
- }
-
- /* These were the "include vars" */
- Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("DATE_LOCAL", -1),
- STRING_TO_UTF_TO_OBJ(ap_ht_time(POOL,
- date, timefmt, 0), POOL), 0);
- Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("DATE_GMT", -1),
- STRING_TO_UTF_TO_OBJ(ap_ht_time(POOL,
- date, timefmt, 1), POOL), 0);
- Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("LAST_MODIFIED", -1),
- STRING_TO_UTF_TO_OBJ(ap_ht_time(POOL,
- globals->r->finfo.st_mtime,
- timefmt, 0), POOL), 0);
- Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("DOCUMENT_URI", -1),
- STRING_TO_UTF_TO_OBJ(globals->r->uri, POOL), 0);
- Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("DOCUMENT_PATH_INFO",
-1),
- STRING_TO_UTF_TO_OBJ(globals->r->path_info, POOL), 0);
-
-#ifndef WIN32
- pw = getpwuid(globals->r->finfo.st_uid);
- if (pw)
- Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("USER_NAME", -1),
- STRING_TO_UTF_TO_OBJ(ap_pstrdup(POOL, pw->pw_name), POOL), 0);
- else
- Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("USER_NAME", -1),
- STRING_TO_UTF_TO_OBJ(
- ap_psprintf(POOL, "user#%lu",
- (unsigned long)globals->r->finfo.st_uid), POOL), 0);
-#endif
-
- if ((t = strrchr(globals->r->filename, '/')))
- Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("DOCUMENT_NAME", -1),
- STRING_TO_UTF_TO_OBJ(++t, POOL), 0);
- else
- Tcl_ObjSetVar2(interp, ArrayObj, Tcl_NewStringObj("DOCUMENT_NAME", -1),
- STRING_TO_UTF_TO_OBJ(globals->r->uri, POOL), 0);
-
- if (globals->r->args)
- {
- char *arg_copy = ap_pstrdup(POOL, globals->r->args);
- ap_unescape_url(arg_copy);
- Tcl_ObjSetVar2(interp, ArrayObj,
- Tcl_NewStringObj("QUERY_STRING_UNESCAPED", -1),
- STRING_TO_UTF_TO_OBJ(ap_escape_shell_cmd(POOL, arg_copy), POOL), 0);
- }
-
- /* ---------------------------- */
-
- /* transfer client request headers to TCL request namespace */
- for (i = 0; i < hdrs_arr->nelts; ++i)
- {
- if (!hdrs[i].key)
- continue;
- else {
- Tcl_ObjSetVar2(interp, ArrayObj,
- STRING_TO_UTF_TO_OBJ(hdrs[i].key, POOL),
- STRING_TO_UTF_TO_OBJ(hdrs[i].val, POOL), 0);
- }
- }
- /* transfer apache internal cgi variables to TCL request namespace */
- for (i = 0; i < env_arr->nelts; ++i)
- {
- if (!env[i].key)
- continue;
- Tcl_ObjSetVar2(interp, ArrayObj, STRING_TO_UTF_TO_OBJ(env[i].key, POOL),
- STRING_TO_UTF_TO_OBJ(env[i].val, POOL), 0);
- }
-
- /* cleanup system cgi variables */
- ap_clear_table(globals->r->subprocess_env);
-
- return TCL_OK;
+ return TclWeb_GetEnvVars(ArrayObj, globals->req);
}
static int
@@ -419,9 +300,8 @@
int objc,
Tcl_Obj *CONST objv[])
{
- rivet_interp_globals *globals = Tcl_GetAssocData(interp, "rivet", NULL);
- int i;
Tcl_Obj *ArrayObj;
+ rivet_interp_globals *globals = Tcl_GetAssocData(interp, "rivet", NULL);
if( objc > 2 ) {
Tcl_WrongNumArgs( interp, 1, objv, "?arrayName?" );
@@ -434,24 +314,7 @@
ArrayObj = Tcl_NewStringObj( COOKIES_ARRAY_NAME, -1 );
}
- do { /* I do this because I want some 'local' variables */
- ApacheCookieJar *cookies = ApacheCookie_parse(globals->r, NULL);
-
- for (i = 0; i < ApacheCookieJarItems(cookies); i++) {
- ApacheCookie *c = ApacheCookieJarFetch(cookies, i);
- int j;
- for (j = 0; j < ApacheCookieItems(c); j++) {
- char *name = c->name;
- char *value = ApacheCookieFetch(c, j);
- Tcl_ObjSetVar2(interp, ArrayObj,
- Tcl_NewStringObj(name, -1),
- Tcl_NewStringObj(value, -1), 0);
- }
-
- }
- } while (0);
-
- return TCL_OK;
+ return TclWeb_GetCookieVars(ArrayObj, globals->req);
}
/* Tcl command to return a particular variable. */
@@ -472,11 +335,8 @@
Tcl_Obj *CONST objv[])
{
char *command;
- int i;
Tcl_Obj *result = NULL;
rivet_interp_globals *globals = Tcl_GetAssocData(interp, "rivet", NULL);
- array_header *parmsarray = ap_table_elts(globals->req->parms);
- table_entry *parms = (table_entry *)parmsarray->elts;
if (objc < 2 || objc > 3)
{
@@ -486,6 +346,7 @@
return TCL_ERROR;
}
command = Tcl_GetString(objv[1]);
+ result = Tcl_NewObj();
if (!strcmp(command, "get"))
{
@@ -497,31 +358,11 @@
}
key = Tcl_GetStringFromObj(objv[2], NULL);
- /* This isn't real efficient - move to hash table later
- on... */
- for (i = 0; i < parmsarray->nelts; ++i)
+ if (TclWeb_GetVar(result, key, globals->req) != TCL_OK)
{
- if (!strncmp(key, Rivet_StringToUtf(parms[i].key, POOL),
strlen(key)))
- {
- /* The following makes sure that we get one string,
- with no sub lists. */
- if (result == NULL)
- {
- result = STRING_TO_UTF_TO_OBJ(parms[i].val, POOL);
- Tcl_IncrRefCount(result);
- } else {
- Tcl_Obj *tmpobjv[2];
- tmpobjv[0] = result;
- tmpobjv[1] = STRING_TO_UTF_TO_OBJ(parms[i].val, POOL);
- result = Tcl_ConcatObj(2, tmpobjv);
- }
- }
+ result = Tcl_NewStringObj("", -1);
+ Tcl_IncrRefCount(result);
}
-
- if (result == NULL)
- Tcl_AppendResult(interp, "", NULL);
- else
- Tcl_SetObjResult(interp, result);
} else if(!strcmp(command, "exists")) {
char *key;
if (objc != 3)
@@ -531,21 +372,7 @@
}
key = Tcl_GetString(objv[2]);
- /* This isn't real efficient - move to hash table later on. */
- for (i = 0; i < parmsarray->nelts; ++i)
- {
- if (!strncmp(key, Rivet_StringToUtf(parms[i].key, POOL),
strlen(key)))
- {
- result = Tcl_NewIntObj(1);
- Tcl_IncrRefCount(result);
- }
- }
-
- if (result == NULL)
- Tcl_SetObjResult(interp, Tcl_NewIntObj(0));
- else
- Tcl_SetObjResult(interp, result);
-
+ TclWeb_VarExists(result, key, globals->req);
} else if(!strcmp(command, "list")) {
char *key;
if (objc != 3)
@@ -555,44 +382,23 @@
}
key = Tcl_GetStringFromObj(objv[2], NULL);
- /* This isn't real efficient - move to hash table later on. */
- for (i = 0; i < parmsarray->nelts; ++i)
+ if (TclWeb_GetVarAsList(result, key, globals->req) != TCL_OK)
{
- if (!strncmp(key, Rivet_StringToUtf(parms[i].key, POOL),
strlen(key)))
- {
- if (result == NULL)
- {
- result = Tcl_NewObj();
- Tcl_IncrRefCount(result);
- }
- Tcl_ListObjAppendElement(interp, result,
- STRING_TO_UTF_TO_OBJ(parms[i].val, POOL));
- }
+ result = Tcl_NewStringObj("", -1);
+ Tcl_IncrRefCount(result);
}
-
- if (result == NULL)
- Tcl_AppendResult(interp, "", NULL);
- else
- Tcl_SetObjResult(interp, result);
} else if(!strcmp(command, "names")) {
if (objc != 2)
{
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
- result = Tcl_NewObj();
- Tcl_IncrRefCount(result);
- for (i = 0; i < parmsarray->nelts; ++i)
+
+ if (TclWeb_GetVarNames(result, globals->req) != TCL_OK)
{
- Tcl_ListObjAppendElement(interp, result,
- STRING_TO_UTF_TO_OBJ(parms[i].key, POOL));
+ result = Tcl_NewStringObj("", -1);
+ Tcl_IncrRefCount(result);
}
-
- if (result == NULL)
- Tcl_AppendResult(interp, "", NULL);
- else
- Tcl_SetObjResult(interp, result);
-
} else if(!strcmp(command, "number")) {
if (objc != 2)
{
@@ -600,37 +406,25 @@
return TCL_ERROR;
}
- result = Tcl_NewIntObj(parmsarray->nelts);
- Tcl_IncrRefCount(result);
- Tcl_SetObjResult(interp, result);
+ TclWeb_VarNumber(result, globals->req);
} else if(!strcmp(command, "all")) {
if (objc != 2)
{
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
- result = Tcl_NewObj();
- Tcl_IncrRefCount(result);
- for (i = 0; i < parmsarray->nelts; ++i)
+ if (TclWeb_GetAllVars(result, globals->req) != TCL_OK)
{
- Tcl_ListObjAppendElement(interp, result,
- STRING_TO_UTF_TO_OBJ(parms[i].key, POOL));
- Tcl_ListObjAppendElement(interp, result,
- STRING_TO_UTF_TO_OBJ(parms[i].val, POOL));
+ result = Tcl_NewStringObj("", -1);
+ Tcl_IncrRefCount(result);
}
-
- if (result == NULL)
- Tcl_AppendResult(interp, "", NULL);
- else
- Tcl_SetObjResult(interp, result);
-
-
} else {
/* bad command */
Tcl_AddErrorInfo(interp, "bad option: must be one of "
"'get, list, names, number, all'");
return TCL_ERROR;
}
+ Tcl_SetObjResult(interp, result);
return TCL_OK;
}
@@ -688,7 +482,7 @@
return TCL_ERROR;
}
varname = Tcl_GetString(objv[2]);
- upload = ApacheUpload_find(globals->req->upload, varname);
+ upload = ApacheUpload_find(globals->req->apachereq->upload, varname);
if (upload != NULL) /* make sure we have an upload */
{
Tcl_Channel chan;
@@ -785,7 +579,7 @@
varname = Tcl_GetString(objv[2]);
infotype = Tcl_GetString(objv[3]);
- upload = ApacheUpload_find(globals->req->upload, varname);
+ upload = ApacheUpload_find(globals->req->apachereq->upload, varname);
if (upload != NULL)
{
if (!strcmp(infotype, "exists"))
@@ -802,7 +596,8 @@
Tcl_SetStringObj(result, "", -1);
} else if (!strcmp(infotype, "filename")) {
Tcl_SetStringObj(result,
- Rivet_StringToUtf(upload->filename, POOL), -1);
+ TclWeb_StringToUtf(upload->filename,
+ globals->req), -1);
} else {
Tcl_AddErrorInfo(interp,"unknown upload info command, should "
"be exists|size|type|filename");
@@ -817,11 +612,11 @@
}
}
} else if (!strcmp(command, "names")) {
- upload = ApacheRequest_upload(globals->req);
+ upload = ApacheRequest_upload(globals->req->apachereq);
while (upload)
{
Tcl_ListObjAppendElement(interp, result,
- STRING_TO_UTF_TO_OBJ(upload->name, POOL));
+ TclWeb_StringToUtfToObj(upload->name,
globals->req));
upload = upload->next;
}
} else {
1.2 +2 -1 tcl-rivet/src/rivetCrypt.c
Index: rivetCrypt.c
===================================================================
RCS file: /home/cvs/tcl-rivet/src/rivetCrypt.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- rivetCrypt.c 11 Jan 2002 06:47:48 -0000 1.1
+++ rivetCrypt.c 22 Jan 2002 01:27:56 -0000 1.2
@@ -5,6 +5,7 @@
#include <tcl.h>
#include "rivet.h"
#include <unistd.h>
+#include <crypt.h>
#define MODE_DECRYPT 0
#define MODE_ENCRYPT 1
@@ -107,7 +108,7 @@
key = Tcl_GetStringFromObj( objv[1], NULL );
salt = Tcl_GetStringFromObj( objv[2], NULL );
- resultBuffer = crypt( key, salt );
+ resultBuffer = crypt((const char *)key, (const char *)salt);
if( resultBuffer == NULL ) {
Tcl_AppendResult (interp,
1.3 +1 -1 tcl-rivet/src/rivetList.c
Index: rivetList.c
===================================================================
RCS file: /home/cvs/tcl-rivet/src/rivetList.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- rivetList.c 11 Jan 2002 06:47:48 -0000 1.2
+++ rivetList.c 22 Jan 2002 01:27:56 -0000 1.3
@@ -470,7 +470,7 @@
for (idx = 3, listIdx = 0; idx < objc; idx++, listIdx++) {
varValue = (listIdx < listObjc) ?
- listObjv[listIdx] : Tcl_NewStringObj( "", NULL );
+ listObjv[listIdx] : Tcl_NewStringObj("", -1);
if( Tcl_ObjSetVar2( interp, objv[2], objv[idx],
varValue, TCL_LEAVE_ERR_MSG ) == NULL ) {