diff options
author | Andrew Tridgell <tridge@samba.org> | 2005-05-27 07:14:01 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:17:05 -0500 |
commit | ab78cc9dcaff48fd314a80d24907abb64990ffd7 (patch) | |
tree | 1cc0c7e7104265172915c408c1965dc0d3a56edb /source4 | |
parent | 7c64c914689b582d3d4af72a9b0437629c440b4f (diff) | |
download | samba-ab78cc9dcaff48fd314a80d24907abb64990ffd7.tar.gz samba-ab78cc9dcaff48fd314a80d24907abb64990ffd7.tar.bz2 samba-ab78cc9dcaff48fd314a80d24907abb64990ffd7.zip |
r7008: - split out the loadparm type definitions so loadparm internals can be accessed externally
- moved esp_lpGet() to web_server/calls.c
- attempt to fixup ejs build with includes.h again
(This used to be commit 592a81c347981420154ddf3b8d4252d3bb08bc86)
Diffstat (limited to 'source4')
-rw-r--r-- | source4/param/loadparm.c | 183 | ||||
-rw-r--r-- | source4/param/loadparm.h | 60 | ||||
-rw-r--r-- | source4/web_server/calls.c | 106 | ||||
-rw-r--r-- | source4/web_server/ejs/miniMpr.c | 2 | ||||
-rw-r--r-- | source4/web_server/ejs/miniMpr.h | 10 |
5 files changed, 199 insertions, 162 deletions
diff --git a/source4/param/loadparm.c b/source4/param/loadparm.c index ceb73e9958..af9c30d80e 100644 --- a/source4/param/loadparm.c +++ b/source4/param/loadparm.c @@ -63,7 +63,7 @@ #include "librpc/gen_ndr/ndr_samr.h" #include "librpc/gen_ndr/ndr_nbt.h" #include "dlinklist.h" -#include "web_server/esp/esp.h" +#include "param/loadparm.h" BOOL in_client = False; /* Not in the client by default */ static BOOL bLoaded = False; @@ -103,39 +103,6 @@ static BOOL defaults_saved = False; #define FLAG_CMDLINE 0x8000 /* this option was set from the command line */ -/* the following are used by loadparm for option lists */ -typedef enum -{ - P_BOOL,P_INTEGER,P_LIST,P_STRING,P_USTRING,P_ENUM,P_SEP -} parm_type; - -typedef enum -{ - P_LOCAL,P_GLOBAL,P_SEPARATOR,P_NONE -} parm_class; - -struct enum_list { - int value; - const char *name; -}; - -struct parm_struct -{ - const char *label; - parm_type type; - parm_class class; - void *ptr; - BOOL (*special)(const char *, char **); - const struct enum_list *enum_list; - uint_t flags; - union { - BOOL bvalue; - int ivalue; - char *svalue; - char cvalue; - const char **lvalue; - } def; -}; struct param_opt { @@ -1347,7 +1314,7 @@ static void init_copymap(service * pservice); /* This is a helper function for parametrical options support. */ /* It returns a pointer to parametrical option value if it exists or NULL otherwise */ /* Actual parametrical functions are quite simple */ -static const char *get_parametrics(int lookup_service, const char *type, const char *option) +const char *lp_get_parametric(int lookup_service, const char *type, const char *option) { char *vfskey; struct param_opt *data; @@ -1442,7 +1409,7 @@ static BOOL lp_bool(const char *s) const char *lp_parm_string(int lookup_service, const char *type, const char *option) { - const char *value = get_parametrics(lookup_service, type, option); + const char *value = lp_get_parametric(lookup_service, type, option); if (value) return lp_string(value); @@ -1457,7 +1424,7 @@ const char *lp_parm_string(int lookup_service, const char *type, const char *opt const char **lp_parm_string_list(int lookup_service, const char *type, const char *option, const char *separator) { - const char *value = get_parametrics(lookup_service, type, option); + const char *value = lp_get_parametric(lookup_service, type, option); if (value) return str_list_make(talloc_autofree_context(), value, separator); @@ -1470,7 +1437,7 @@ const char **lp_parm_string_list(int lookup_service, const char *type, const cha int lp_parm_int(int lookup_service, const char *type, const char *option, int default_v) { - const char *value = get_parametrics(lookup_service, type, option); + const char *value = lp_get_parametric(lookup_service, type, option); if (value) return lp_int(value); @@ -1483,7 +1450,7 @@ int lp_parm_int(int lookup_service, const char *type, const char *option, int de unsigned long lp_parm_ulong(int lookup_service, const char *type, const char *option, unsigned long default_v) { - const char *value = get_parametrics(lookup_service, type, option); + const char *value = lp_get_parametric(lookup_service, type, option); if (value) return lp_ulong(value); @@ -1496,7 +1463,7 @@ unsigned long lp_parm_ulong(int lookup_service, const char *type, const char *op BOOL lp_parm_bool(int lookup_service, const char *type, const char *option, BOOL default_v) { - const char *value = get_parametrics(lookup_service, type, option); + const char *value = lp_get_parametric(lookup_service, type, option); if (value) return lp_bool(value); @@ -1781,6 +1748,28 @@ static int map_parameter(const char *pszParmName) return (-1); } + +/* + return the parameter structure for a parameter +*/ +struct parm_struct *lp_parm_struct(const char *name) +{ + int parmnum = map_parameter(name); + if (parmnum == -1) return NULL; + return &parm_table[parmnum]; +} + +/* + return the parameter pointer for a parameter +*/ +void *lp_parm_ptr(int snum, struct parm_struct *parm) +{ + if (snum == -1) { + return parm->ptr; + } + return ((char *)ServicePtrs[snum]) + PTR_DIFF(parm->ptr, &sDefault); +} + /*************************************************************************** Set a boolean variable from the text value stored in the passed string. Returns True in success, False if the passed string does not correctly @@ -3304,117 +3293,3 @@ int lp_maxprintjobs(int snum) return maxjobs; } - - -/* - allow access to loadparm variables from inside esp scripts in swat - - can be called in 4 ways: - - 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 - - the returned variable is a ejs object. It is an array object for lists. -*/ -int esp_lpGet(struct EspRequest *ep, int argc, char **argv) -{ - struct parm_struct *parm = NULL; - void *parm_ptr = NULL; - int i; - - if (argc < 1) return -1; - - if (argc == 2) { - /* its a share parameter */ - int parmnum, snum = lp_servicenumber(argv[0]); - if (snum == -1) { - return -1; - } - if (strchr(argv[1], ':')) { - /* its a parametric option on a share */ - const char *type = talloc_strndup(ep, argv[1], strcspn(argv[1], ":")); - const char *option = strchr(argv[1], ':') + 1; - const char *value; - if (type == NULL || option == NULL) return -1; - value = get_parametrics(snum, type, option); - if (value == NULL) return -1; - espSetReturnString(ep, value); - return 0; - } - - /* find a share parameter */ - parmnum = map_parameter(argv[1]); - if (parmnum == -1) { - return -1; - } - parm = &parm_table[parmnum]; - if (parm->class == P_GLOBAL) { - return -1; - } - parm_ptr = ((char *)ServicePtrs[snum]) + PTR_DIFF(parm->ptr, &sDefault); - } else if (strchr(argv[0], ':')) { - /* its a global parametric option */ - const char *type = talloc_strndup(ep, argv[0], strcspn(argv[0], ":")); - const char *option = strchr(argv[0], ':') + 1; - const char *value; - if (type == NULL || option == NULL) return -1; - value = get_parametrics(-1, type, option); - if (value == NULL) return -1; - espSetReturnString(ep, value); - return 0; - } else { - /* its a global parameter */ - int parmnum = map_parameter(argv[0]); - if (parmnum == -1) { - return -1; - } - parm = &parm_table[parmnum]; - parm_ptr = parm->ptr; - } - - if (parm == NULL || parm_ptr == NULL) { - return -1; - } - - /* construct and return the right type of ejs object */ - switch (parm->type) { - case P_STRING: - case P_USTRING: - espSetReturnString(ep, *(char **)parm_ptr); - break; - case P_BOOL: - espSetReturn(ep, mprCreateBoolVar(*(BOOL *)parm_ptr)); - break; - case P_INTEGER: - espSetReturn(ep, mprCreateIntegerVar(*(int *)parm_ptr)); - break; - case P_ENUM: - for (i=0; parm->enum_list[i].name; i++) { - if (*(int *)parm_ptr == parm->enum_list[i].value) { - espSetReturnString(ep, parm->enum_list[i].name); - return 0; - } - } - return -1; - - case P_LIST: { - const char **list = *(const char ***)parm_ptr; - struct MprVar var; - var = mprCreateObjVar(parm->label, 10); - for (i=0;list[i];i++) { - char idx[16]; - struct MprVar val; - mprItoa(i, idx, sizeof(idx)); - val = mprCreateStringVar(list[i], 1); - mprCreateProperty(&var, idx, &val); - } - espSetReturn(ep, var); - break; - case P_SEP: - return -1; - } - } - return 0; -} diff --git a/source4/param/loadparm.h b/source4/param/loadparm.h new file mode 100644 index 0000000000..217955d294 --- /dev/null +++ b/source4/param/loadparm.h @@ -0,0 +1,60 @@ +/* + Unix SMB/CIFS implementation. + + type definitions for loadparm + + Copyright (C) Karl Auer 1993-1998 + + Largely re-written by Andrew Tridgell, September 1994 + + Copyright (C) Simo Sorce 2001 + Copyright (C) Alexander Bokovoy 2002 + Copyright (C) Stefan (metze) Metzmacher 2002 + Copyright (C) Jim McDonough (jmcd@us.ibm.com) 2003. + Copyright (C) James Myers 2003 <myersjj@samba.org> + + 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. +*/ + +/* the following are used by loadparm for option lists */ +typedef enum { + P_BOOL,P_INTEGER,P_LIST,P_STRING,P_USTRING,P_ENUM,P_SEP +} parm_type; + +typedef enum { + P_LOCAL,P_GLOBAL,P_SEPARATOR,P_NONE +} parm_class; + +struct enum_list { + int value; + const char *name; +}; + +struct parm_struct { + const char *label; + parm_type type; + parm_class class; + void *ptr; + BOOL (*special)(const char *, char **); + const struct enum_list *enum_list; + uint_t flags; + union { + BOOL bvalue; + int ivalue; + char *svalue; + char cvalue; + const char **lvalue; + } def; +}; diff --git a/source4/web_server/calls.c b/source4/web_server/calls.c index 8cd0c21b1c..6f1649d131 100644 --- a/source4/web_server/calls.c +++ b/source4/web_server/calls.c @@ -22,6 +22,7 @@ #include "includes.h" #include "web_server/esp/esp.h" +#include "param/loadparm.h" /* @@ -63,6 +64,111 @@ static int esp_typeof(struct EspRequest *ep, int argc, struct MprVar **argv) /* + allow access to loadparm variables from inside esp scripts in swat + + can be called in 4 ways: + + 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 + + the returned variable is a ejs object. It is an array object for lists. +*/ +static int esp_lpGet(struct EspRequest *ep, int argc, char **argv) +{ + struct parm_struct *parm = NULL; + void *parm_ptr = NULL; + int i; + + if (argc < 1) return -1; + + if (argc == 2) { + /* its a share parameter */ + int snum = lp_servicenumber(argv[0]); + if (snum == -1) { + return -1; + } + if (strchr(argv[1], ':')) { + /* its a parametric option on a share */ + const char *type = talloc_strndup(ep, argv[1], strcspn(argv[1], ":")); + const char *option = strchr(argv[1], ':') + 1; + const char *value; + if (type == NULL || option == NULL) return -1; + value = lp_get_parametric(snum, type, option); + if (value == NULL) return -1; + espSetReturnString(ep, value); + return 0; + } + + parm = lp_parm_struct(argv[1]); + if (parm == NULL || parm->class == P_GLOBAL) { + return -1; + } + parm_ptr = lp_parm_ptr(snum, parm); + } else if (strchr(argv[0], ':')) { + /* its a global parametric option */ + const char *type = talloc_strndup(ep, argv[0], strcspn(argv[0], ":")); + const char *option = strchr(argv[0], ':') + 1; + const char *value; + if (type == NULL || option == NULL) return -1; + value = lp_get_parametric(-1, type, option); + if (value == NULL) return -1; + espSetReturnString(ep, value); + return 0; + } else { + /* its a global parameter */ + parm = lp_parm_struct(argv[0]); + if (parm == NULL) return -1; + parm_ptr = parm->ptr; + } + + if (parm == NULL || parm_ptr == NULL) { + return -1; + } + + /* construct and return the right type of ejs object */ + switch (parm->type) { + case P_STRING: + case P_USTRING: + espSetReturnString(ep, *(char **)parm_ptr); + break; + case P_BOOL: + espSetReturn(ep, mprCreateBoolVar(*(BOOL *)parm_ptr)); + break; + case P_INTEGER: + espSetReturn(ep, mprCreateIntegerVar(*(int *)parm_ptr)); + break; + case P_ENUM: + for (i=0; parm->enum_list[i].name; i++) { + if (*(int *)parm_ptr == parm->enum_list[i].value) { + espSetReturnString(ep, parm->enum_list[i].name); + return 0; + } + } + return -1; + + case P_LIST: { + const char **list = *(const char ***)parm_ptr; + struct MprVar var; + var = mprCreateObjVar(parm->label, 10); + for (i=0;list[i];i++) { + char idx[16]; + struct MprVar val; + mprItoa(i, idx, sizeof(idx)); + val = mprCreateStringVar(list[i], 1); + mprCreateProperty(&var, idx, &val); + } + espSetReturn(ep, var); + break; + case P_SEP: + return -1; + } + } + return 0; +} + +/* setup the C functions that be called from ejs */ void http_setup_ejs_functions(void) diff --git a/source4/web_server/ejs/miniMpr.c b/source4/web_server/ejs/miniMpr.c index 8e1689ac9d..311f2defeb 100644 --- a/source4/web_server/ejs/miniMpr.c +++ b/source4/web_server/ejs/miniMpr.c @@ -35,7 +35,7 @@ #if !BLD_APPWEB #if !BLD_GOAHEAD_WEBSERVER -static TALLOC_CTX *mpr_ctx; +static void *mpr_ctx; void mprSetCtx(TALLOC_CTX *ctx) { diff --git a/source4/web_server/ejs/miniMpr.h b/source4/web_server/ejs/miniMpr.h index b30ef1437f..447a0f4c34 100644 --- a/source4/web_server/ejs/miniMpr.h +++ b/source4/web_server/ejs/miniMpr.h @@ -35,10 +35,7 @@ /* * Find out about our configuration */ -/* - this is not needed in samba builds, and breaks the build with my gcc-4.0 --metze - #include "includes.h" -*/ + #include "includes.h" /* allow this library to use strcpy() */ #undef strcpy @@ -195,7 +192,7 @@ typedef int bool; typedef __int64 int64; typedef unsigned __int64 uint64; #else - #define O_BINARY 0 +#define O_BINARY 0 #ifndef uint #define uint unsigned #endif @@ -270,8 +267,7 @@ extern int mprReallocStrcat(char **dest, int max, int existingLen, extern int mprStrcpy(char *dest, int destMax, const char *src); extern int mprMemcpy(char *dest, int destMax, const char *src, int nbytes); -extern void mprFreeAll(void); -extern void mprSetCtx(TALLOC_CTX *ctx); +extern void mprSetCtx(void *ctx); #ifdef __cplusplus } |