--- mod_neoscript.c 2000-07-21 19:49:29.000000000 -0400 +++ mod_neoscript.c 2010-01-21 23:48:47.000000000 -0500 @@ -66,10 +66,14 @@ #include "util_md5.h" -#include +#include #include #include #include "tcl.h" -#include "tclExtend.h" +#ifdef STATIC_TCLX +# include "tclExtend.h" +#endif +#include +#include extern char ap_server_root[]; @@ -79,4 +83,11 @@ void Tcl_InitExtensions(Tcl_Interp *interp); +static Tcl_CmdProc Neo_IncludeCmd, Neo_IncludeCmd, Neo_IncludeCmd, + Neo_IncludeCmd, Neo_FlushBufferCmd, Neo_AbortPageCmd, + Neo_HttpdCmd, Tcl_HtmlCmd, + Neo_RequestInfoCmd, Tcl_ExtendSafeSlaveCmd, + Tcl_SetHeaderCmd, NWS_MD5Cmd, Tcl_gm_timestr_822Cmd; +static Tcl_ObjCmdProc Neo_UnescapeUrlCmd, Neo_SimplifyPathnameCmd; + char softwareStartTimeString[32]; @@ -128,5 +139,6 @@ static int NeoWebCacheEnabled; -int load_sub_req (Tcl_Interp *interp, request_rec *r) +static int +load_sub_req (Tcl_Interp *interp, request_rec *r) { int errstatus; @@ -201,5 +213,5 @@ Tcl_Interp *interp; int argc; - char **argv; + const char *argv[]; { request_rec *rr=NULL; @@ -401,5 +413,5 @@ Tcl_Interp *interp; int argc; - char **argv; + const char *argv[]; { if (argc != 1) { @@ -428,5 +440,5 @@ Tcl_Interp *interp; int argc; - char **argv; + const char *argv[]; { if (argc != 1) { @@ -463,5 +475,5 @@ Tcl_Interp *interp; int argc; - char **argv; + const char *argv[]; { if (argc != 2 || strncmp("child_terminate", argv[1], strlen(argv[1]))) { @@ -488,18 +500,19 @@ */ int -Neo_UnescapeUrlCmd (clientData, interp, argc, argv) +Neo_UnescapeUrlCmd (clientData, interp, argc, objv) ClientData clientData; Tcl_Interp *interp; int argc; - char **argv; + Tcl_Obj * const objv[]; { + char *string; if (argc != 2) { - Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], - " url\"", (char *) NULL); + Tcl_WrongNumArgs(interp, 1, objv, "url"); return TCL_ERROR; } - if (ap_unescape_url(argv[1]) == OK) { - interp->result = argv[1]; + string = Tcl_GetString(objv[1]); + if (ap_unescape_url(string) == OK) { + Tcl_SetResult(interp, string, TCL_VOLATILE); } return TCL_OK; @@ -524,8 +537,8 @@ Tcl_Interp *interp; int argc; - char **argv; + const char *argv[]; { char intbuf[20]; - char *varName; + const char *varName; int depth; request_rec *r = Tcl_request_rec; @@ -633,5 +646,5 @@ Tcl_Interp *interp; int argc; - char **argv; + const char *argv[]; { int i, forceHeaders = 1; @@ -663,5 +676,5 @@ Tcl_Interp *interp; int argc; - char **argv; + const char *argv[]; { char *digest; @@ -681,5 +694,5 @@ Tcl_Interp *interp; int argc; - char **argv; + const char *argv[]; { char *ascii_time; @@ -702,5 +715,5 @@ Tcl_Interp *interp; /* Current interpreter. */ int argc; /* Number of arguments. */ - char **argv; /* Argument strings. */ + const char *argv[]; /* Argument strings. */ { Tcl_Interp *slaveInterp; @@ -741,18 +754,19 @@ */ int -Neo_SimplifyPathnameCmd (clientData, interp, argc, argv) +Neo_SimplifyPathnameCmd (clientData, interp, argc, objv) ClientData clientData; Tcl_Interp *interp; int argc; - char **argv; + Tcl_Obj * const objv[]; { + char *pathname; + if (argc != 2) { - Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], - " pathname\"", (char *) NULL); + Tcl_WrongNumArgs(interp, 1, objv, "pathname"); return TCL_ERROR; } - ap_getparents(argv[1]); - interp->result = argv[1]; + ap_getparents(pathname); + Tcl_SetResult(interp, pathname, TCL_VOLATILE); return TCL_OK; } @@ -781,5 +795,5 @@ Tcl_Interp *interp; /* Current interpreter. */ int argc; /* Number of arguments. */ - char **argv; /* Argument strings. */ + const char *argv[]; /* Argument strings. */ { int i = 1, tagstart, newline = 0; @@ -826,5 +840,6 @@ /* ----------------------- Initialization function ------------------------- */ -void init_nws(server_rec *s, pool *p) +static void +init_nws(server_rec *s, pool *p) { time_t date; @@ -846,10 +861,14 @@ time(&date); - sprintf(softwareStartTimeString, "%ld", date); + sprintf(softwareStartTimeString, "%ld", (long)date); /* Initialize core Tcl components and extensions */ /* Setup a library Path */ +#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION < 5 TclpInitLibraryPath("."); +#else + TclSetLibraryPath(Tcl_NewStringObj(".", 2)); +#endif /* Tcl */ @@ -861,4 +880,5 @@ } +#ifdef STATIC_TCLX /* Extended Tcl */ if (Tclx_Init(interp) == TCL_ERROR) { @@ -870,4 +890,5 @@ Tcl_StaticPackage(interp, "Tclx", Tclx_Init, Tclx_SafeInit); /* Tclx does its own call to Tcl_StaticPackage */ +#endif #ifdef POSTGRESQL @@ -904,6 +925,6 @@ #endif -#ifdef GDTCL - /* GIF generation*/ +#ifdef STATIC_GDTCL + /* Image generation */ if (Gd_Init(interp) == TCL_ERROR) { fprintf(stderr, @@ -915,4 +936,5 @@ #endif +#ifdef STATIC_NEO /* NeoSoft Extensions */ if (Neo_Init(interp) == TCL_ERROR) { @@ -923,4 +945,5 @@ } Tcl_StaticPackage(interp, "Neo", Neo_Init, NULL); +#endif /* @@ -948,8 +971,8 @@ if (Tcl_VarEval(interp, "source ", - ap_server_root_relative(p, "neowebscript/init.tcl"), (char *)NULL) + ap_server_root_relative(p, "share/neowebscript/init.tcl"), (char *)NULL) == TCL_ERROR) { - char *errorInfo; + const char *errorInfo; errorInfo = Tcl_GetVar (interp, "errorInfo", TCL_GLOBAL_ONLY); @@ -998,9 +1021,9 @@ (ClientData) 0, (Tcl_CmdDeleteProc *) NULL); - Tcl_CreateCommand(interp, "www_simplify_pathname", + Tcl_CreateObjCommand(interp, "www_simplify_pathname", Neo_SimplifyPathnameCmd, (ClientData) NULL, (void (*)()) NULL); - Tcl_CreateCommand(interp, "www_unescape_url", + Tcl_CreateObjCommand(interp, "www_unescape_url", Neo_UnescapeUrlCmd, (ClientData) NULL, (void (*)()) NULL); @@ -1179,7 +1202,10 @@ */ -int find_string2(FILE *in, char *str1, char *str2, request_rec *r, int *result, int printing) +static int +find_string2(FILE *in, const char *str1, const char *str2, + request_rec *r, int *result, int printing) { int x, l1 = strlen(str1), l2 = strlen(str2), p, p1, p2, m1, m2; - char c, *str, outbuf[OUTBUFSIZE]; + char c, outbuf[OUTBUFSIZE]; + const char *str; int outind = 0; @@ -1592,9 +1618,9 @@ Tcl_SetVar2(interp, "webenv", "QUERY_STRING", r->args ? r->args : "", TCL_GLOBAL_ONLY); - sprintf (timeTextBuf, "%ld", r->finfo.st_mtime); + sprintf (timeTextBuf, "%ld", (long)r->finfo.st_mtime); Tcl_SetVar2(interp, "webenv", "NEO_LAST_MODIFIED", timeTextBuf, TCL_GLOBAL_ONLY); - sprintf (timeTextBuf, "%ld", r->finfo.st_uid); + sprintf (timeTextBuf, "%ld", (long)r->finfo.st_uid); Tcl_SetVar2(interp, "webenv", "NEO_DOCUMENT_UID", timeTextBuf, TCL_GLOBAL_ONLY); @@ -1608,87 +1634,4 @@ /* --------------------------- Action handlers ---------------------------- */ -/* ensure that path is relative, and does not contain ".." elements - * ensentially ensure that it does not match the regex: - * (^/|(^|/)\.\.(/|$)) - * XXX: this needs os abstraction... consider c:..\foo in win32 - */ -static int is_only_below(const char *path) -{ -#if WIN32 - if (path[1] == ':') - return 0; -#endif - if (path[0] == '/') { - return 0; - } - if (path[0] == '.' && path[1] == '.' - && (path[2] == '\0' || path[2] == '/')) { - return 0; - } - while (*path) { - if (*path == '/' && path[1] == '.' && path[2] == '.' - && (path[3] == '\0' || path[3] == '/')) { - return 0; - } - ++path; - } - return 1; -} - -int run_pickfile_req( request_rec *r ) -{ - int errstatus; - FILE *f; - char buf[IOBUFSIZE]; - int nLines; - int whichLine; - - if (r->method_number != M_GET) return DECLINED; - if (r->finfo.st_mode == 0 || (r->path_info && *r->path_info)) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, r, - "access to %s failed for %s, reason %s", r->filename, - ap_get_remote_host(r->connection, r->per_dir_config, - REMOTE_NAME), - "File does not exist"); - return HTTP_NOT_FOUND; - } - - ap_set_last_modified(r); - if ((errstatus = ap_set_content_length (r, r->finfo.st_size)) - || ((errstatus = ap_meets_conditions (r)) != OK)) - return errstatus; - - f = fopen (r->filename, "r"); - - if (f == NULL) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, r, - "access to %s failed for %s, reason %s", r->filename, - ap_get_remote_host(r->connection, r->per_dir_config, - REMOTE_NAME), - "file permissions deny server access"); - return HTTP_FORBIDDEN; - } - - if ((fgets(buf, IOBUFSIZE, f) != NULL) || (errno == EINTR)) { - nLines = atoi(buf); - if (nLines <= 0) { - fclose (f); - return OK; - } - - ap_soft_timeout("send-pick", r); - - srand((int)(getpid() * 17 + time((long *) 0))); - for (whichLine = rand() % nLines; whichLine-- >= 0; ) { - if ((fgets(buf,IOBUFSIZE,f)) == NULL) { - if (errno != EINTR) break; - } - } - ap_rprintf (r, "%s", buf); - } - fclose(f); - return OK; -} - Tcl_Interp *get_slave_interp (request_rec *r, char *handler_name, char *name) { extern Tcl_Interp *interp; @@ -1743,5 +1686,5 @@ strcpy (script, "setup_safe_interpreter"); if (Tcl_GlobalEval(interp, script) != TCL_OK) { - char *errorInfo; + const char *errorInfo; errorInfo = Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY); @@ -1911,5 +1854,4 @@ char directive[MAX_STRING_LEN], error[MAX_STRING_LEN]; char timefmt[MAX_STRING_LEN]; - int noexec = ap_allow_options(r) & OPT_INCNOEXEC; int ret, sizefmt, seqtype=0; int init_environment, if_nesting, printing, conditional_status; @@ -2040,8 +1982,8 @@ request_rec *Tcl_saved_request_rec; Tcl_Channel fchan; - char *fchan_name; + const char *fchan_name; Tcl_DString userCommand; - char *commandString; - int fno; + const char *commandString; + intptr_t fno; Tcl_saved_request_rec = Tcl_request_rec; @@ -2090,5 +2032,5 @@ status = db->get(db, NULL, &key, &data, 0); - db->close(db, NULL); + db->close(db, 0); if (status) return HTTP_NOT_FOUND; @@ -2113,5 +2055,5 @@ return; - if (db_open(NeoWebCacheName, DB_HASH, NULL, 0644, NULL, NULL, &db)) + if (db_open(NeoWebCacheName, DB_HASH, 0, 0644, NULL, NULL, &db)) return; @@ -2131,5 +2073,5 @@ perror("db->put"); */ } - db->close(db, NULL); + db->close(db, 0); return; } @@ -2156,5 +2098,10 @@ struct request_rec *frr = NULL; - if (!(ap_allow_options(r) & OPT_INCLUDES)) return DECLINED; + if (!(ap_allow_options(r) & OPT_INCLUDES)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, r, "Apache configuration " + "does not allow SSI parsing for ``%s'' (mode %d)", + r->filename, mode); + return DECLINED; + } r->allowed |= (1 << M_GET); @@ -2162,7 +2109,7 @@ ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, r, "File does not exist: %s", - (r->path_info + r->path_info ? ap_pstrcat(r->pool, r->filename, r->path_info, NULL) - : r->filename, r)); + : r->filename); return HTTP_NOT_FOUND; } @@ -2294,5 +2241,5 @@ if (Tcl_GlobalEval(interp, script) == TCL_ERROR) { - char *errorInfo; + const char *errorInfo; /* An error occured setting up for the upload. We have