summaryrefslogtreecommitdiff
path: root/source4/web_server
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-05-27 03:58:12 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:17:04 -0500
commit1511cde44ccc94b71b8eb317deb73c103dcd8010 (patch)
tree5add0ebb78c06c48e0973c0dda6befe1ac2a9163 /source4/web_server
parentb28e017e0074c86b1d9123bcc394f07e0fb55463 (diff)
downloadsamba-1511cde44ccc94b71b8eb317deb73c103dcd8010.tar.gz
samba-1511cde44ccc94b71b8eb317deb73c103dcd8010.tar.bz2
samba-1511cde44ccc94b71b8eb317deb73c103dcd8010.zip
r7002: added support for getting at loadparm config parameters via lpGet() in esp scripts
lpGet takes 4 forms v = lpGet("type:parm"); gets a parametric variable v = lpGet("share", "type:parm"); gets a parametric variable on a share v = lpGet("parm"); gets a global variable v = lpGet("share", "parm"); gets a share variable in all cases a ejs object of the appropriate type for the variable is returned. This commit also adds the function typeof() which returns the type of an object (This used to be commit 5537a0d38d4805cbc2dad0d6f76db15173b1fd60)
Diffstat (limited to 'source4/web_server')
-rw-r--r--source4/web_server/calls.c72
-rw-r--r--source4/web_server/config.mk3
-rw-r--r--source4/web_server/ejs/ejs.c4
-rw-r--r--source4/web_server/ejs/ejs.h4
-rw-r--r--source4/web_server/esp/esp.c6
-rw-r--r--source4/web_server/esp/esp.h6
-rw-r--r--source4/web_server/http.c2
7 files changed, 86 insertions, 11 deletions
diff --git a/source4/web_server/calls.c b/source4/web_server/calls.c
new file mode 100644
index 0000000000..8cd0c21b1c
--- /dev/null
+++ b/source4/web_server/calls.c
@@ -0,0 +1,72 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ provide hooks into C calls from esp scripts
+
+ Copyright (C) Andrew Tridgell 2005
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "includes.h"
+#include "web_server/esp/esp.h"
+
+
+/*
+ return the type of a variable
+*/
+static int esp_typeof(struct EspRequest *ep, int argc, struct MprVar **argv)
+{
+ const struct {
+ MprType type;
+ const char *name;
+ } types[] = {
+ { MPR_TYPE_UNDEFINED, "undefined" },
+ { MPR_TYPE_NULL, "null" },
+ { MPR_TYPE_BOOL, "boolean" },
+ { MPR_TYPE_CFUNCTION, "function" },
+ { MPR_TYPE_FLOAT, "float" },
+ { MPR_TYPE_INT, "int" },
+ { MPR_TYPE_INT64, "int64" },
+ { MPR_TYPE_OBJECT, "object" },
+ { MPR_TYPE_FUNCTION, "function" },
+ { MPR_TYPE_STRING, "string" },
+ { MPR_TYPE_STRING_CFUNCTION, "function" }
+ };
+ int i;
+ const char *type = "unknown";
+
+ if (argc != 1) return -1;
+
+ for (i=0;i<ARRAY_SIZE(types);i++) {
+ if (argv[0]->type == types[i].type) {
+ type = types[i].name;
+ break;
+ }
+ }
+
+ espSetReturnString(ep, type);
+ return 0;
+}
+
+
+/*
+ setup the C functions that be called from ejs
+*/
+void http_setup_ejs_functions(void)
+{
+ espDefineStringCFunction(NULL, "lpGet", esp_lpGet, NULL);
+ espDefineCFunction(NULL, "typeof", esp_typeof, NULL);
+}
diff --git a/source4/web_server/config.mk b/source4/web_server/config.mk
index 34d8aff1e6..b287b4f153 100644
--- a/source4/web_server/config.mk
+++ b/source4/web_server/config.mk
@@ -33,7 +33,8 @@ NOPROTO=YES
INIT_OBJ_FILES = \
web_server/web_server.o
ADD_OBJ_FILES = \
- web_server/http.o
+ web_server/http.o \
+ web_server/calls.o
REQUIRED_SUBSYSTEMS = ESP
# End SUBSYSTEM WEB
#######################
diff --git a/source4/web_server/ejs/ejs.c b/source4/web_server/ejs/ejs.c
index 2d85ad1330..4f5eb6b129 100644
--- a/source4/web_server/ejs/ejs.c
+++ b/source4/web_server/ejs/ejs.c
@@ -754,7 +754,7 @@ MprVar *ejsGetReturnValue(EjsId eid)
* or "[]".
*/
-void ejsDefineCFunction(EjsId eid, char *functionName, MprCFunction fn,
+void ejsDefineCFunction(EjsId eid, const char *functionName, MprCFunction fn,
void *thisPtr, int flags)
{
if (eid < 0) {
@@ -793,7 +793,7 @@ void ejsDefineStringCFunction(EjsId eid, const char *functionName,
* Body should not contain braces.
*/
-void ejsDefineFunction(EjsId eid, char *functionName, char *args, char *body)
+void ejsDefineFunction(EjsId eid, const char *functionName, char *args, char *body)
{
MprVar v;
diff --git a/source4/web_server/ejs/ejs.h b/source4/web_server/ejs/ejs.h
index c1d087cf61..60aa93a408 100644
--- a/source4/web_server/ejs/ejs.h
+++ b/source4/web_server/ejs/ejs.h
@@ -99,9 +99,9 @@ extern MprVar *ejsGetGlobalObject(EjsId eid);
/*
* Function routines
*/
-extern void ejsDefineFunction(EjsId eid, char *functionName, char *args,
+extern void ejsDefineFunction(EjsId eid, const char *functionName, char *args,
char *body);
-extern void ejsDefineCFunction(EjsId eid, char *functionName,
+extern void ejsDefineCFunction(EjsId eid, const char *functionName,
MprCFunction fn, void *thisPtr, int flags);
extern void ejsDefineStringCFunction(EjsId eid, const char *functionName,
MprStringCFunction fn, void *thisPtr, int flags);
diff --git a/source4/web_server/esp/esp.c b/source4/web_server/esp/esp.c
index 3e370cb020..c90e4afe42 100644
--- a/source4/web_server/esp/esp.c
+++ b/source4/web_server/esp/esp.c
@@ -218,7 +218,7 @@ void espDestroyRequest(EspRequest *ep)
* rq = (requiredCast) espGetHandle(ep);
*/
-void espDefineCFunction(EspRequest *ep, char *functionName, EspCFunction fn,
+void espDefineCFunction(EspRequest *ep, const char *functionName, EspCFunction fn,
void *thisPtr)
{
mprAssert(functionName && *functionName);
@@ -389,7 +389,7 @@ void espSetReturn(EspRequest *ep, MprVar value)
/******************************************************************************/
-void espSetReturnString(EspRequest *ep, char *str)
+void espSetReturnString(EspRequest *ep, const char *str)
{
mprAssert(ep);
@@ -866,7 +866,7 @@ MprVar *espCreatePropertyValue(MprVar *obj, char *property, MprVar newValue)
/******************************************************************************/
-void espDefineFunction(EspRequest *ep, char *functionName, char *args, char *body)
+void espDefineFunction(EspRequest *ep, const char *functionName, char *args, char *body)
{
ejsDefineFunction(ep->eid, functionName, args, body);
}
diff --git a/source4/web_server/esp/esp.h b/source4/web_server/esp/esp.h
index 9e58bdf066..a6cac1e852 100644
--- a/source4/web_server/esp/esp.h
+++ b/source4/web_server/esp/esp.h
@@ -159,9 +159,9 @@ extern int espProcessRequest(EspRequest *ep, const char *docPath,
/*
* Method invocation
*/
-extern void espDefineCFunction(EspRequest *ep, char *functionName,
+extern void espDefineCFunction(EspRequest *ep, const char *functionName,
EspCFunction fn, void *thisPtr);
-extern void espDefineFunction(EspRequest *ep, char *functionName,
+extern void espDefineFunction(EspRequest *ep, const char *functionName,
char *args, char *body);
extern void espDefineStringCFunction(EspRequest *ep,
const char *functionName, EspStringCFunction fn,
@@ -188,7 +188,7 @@ extern EjsId espGetScriptHandle(EspRequest *ep);
extern void espRedirect(EspRequest *ep, int code, char *url);
extern void espSetHeader(EspRequest *ep, char *header,
bool allowMultiple);
-extern void espSetReturnString(EspRequest *ep, char *str);
+extern void espSetReturnString(EspRequest *ep, const char *str);
extern int espWrite(EspRequest *ep, char *buf, int size);
extern int espWriteString(EspRequest *ep, char *buf);
extern int espWriteFmt(EspRequest *ep, char *fmt, ...);
diff --git a/source4/web_server/http.c b/source4/web_server/http.c
index fd9b1be67f..d9d441f765 100644
--- a/source4/web_server/http.c
+++ b/source4/web_server/http.c
@@ -720,6 +720,8 @@ void http_process_input(struct websrv_context *web)
talloc_set_destructor(esp, esp_destructor);
+ http_setup_ejs_functions();
+
esp->req = espCreateRequest(web, web->input.url, esp->variables);
if (esp->req == NULL) goto internal_error;