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
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
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.
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "includes.h"
#include "scripting/ejs/smbcalls.h"
#include "lib/appweb/ejs/ejs.h"
#include "param/loadparm.h"
+#include "system/network.h"
+#include "lib/socket/netif.h"
+#include "param/param.h"
/*
return a list of defined services
/*
- allow access to loadparm variables from inside ejs scripts in swat
+ return a list of parameter categories
+*/
+static int ejs_lpCategories(MprVarHandle eid, int argc, char **argv)
+{
+ struct parm_struct *parm_table = lp_parm_table();
+ int i;
+ const char **list = NULL;
+ if (argc != 0) return -1;
+
+ for (i=0;parm_table[i].label;i++) {
+ if (parm_table[i].class == P_SEPARATOR) {
+ list = str_list_add(list, parm_table[i].label);
+ }
+ }
+ talloc_steal(mprMemCtx(), list);
+ mpr_Return(eid, mprList("categories", list));
+ return 0;
+}
+
+
+/*
+ allow access to loadparm variables from inside ejs scripts in web apps
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
+ v = lp.get("type:parm"); gets a parametric variable
+ v = lp.get("share", "type:parm"); gets a parametric variable on a share
+ v = lp.get("parm"); gets a global variable
+ v = lp.get("share", "parm"); gets a share variable
the returned variable is a ejs object. It is an array object for lists.
*/
/* its a share parameter */
int snum = lp_servicenumber(argv[0]);
if (snum == -1) {
- return -1;
+ mpr_Return(eid, mprCreateUndefinedVar());
+ return 0;
}
if (strchr(argv[1], ':')) {
/* its a parametric option on a share */
strcspn(argv[1], ":"));
const char *option = strchr(argv[1], ':') + 1;
const char *value;
- if (type == NULL || option == NULL) return -1;
+ if (type == NULL || option == NULL) {
+ mpr_Return(eid, mprCreateUndefinedVar());
+ return 0;
+ }
value = lp_get_parametric(snum, type, option);
- if (value == NULL) return -1;
+ if (value == NULL) {
+ mpr_Return(eid, mprCreateUndefinedVar());
+ return 0;
+ }
mpr_ReturnString(eid, value);
return 0;
}
parm = lp_parm_struct(argv[1]);
if (parm == NULL || parm->class == P_GLOBAL) {
- return -1;
+ mpr_Return(eid, mprCreateUndefinedVar());
+ return 0;
}
parm_ptr = lp_parm_ptr(snum, parm);
} else if (strchr(argv[0], ':')) {
argv[0], strcspn(argv[0], ":"));
const char *option = strchr(argv[0], ':') + 1;
const char *value;
- if (type == NULL || option == NULL) return -1;
+ if (type == NULL || option == NULL) {
+ mpr_Return(eid, mprCreateUndefinedVar());
+ return 0;
+ }
value = lp_get_parametric(-1, type, option);
- if (value == NULL) return -1;
+ if (value == NULL) {
+ mpr_Return(eid, mprCreateUndefinedVar());
+ return 0;
+ }
mpr_ReturnString(eid, 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) {
+ mpr_Return(eid, mprCreateUndefinedVar());
+ return 0;
+ }
+ parm_ptr = lp_parm_ptr(-1, parm);
}
if (parm == NULL || parm_ptr == NULL) {
- return -1;
+ mpr_Return(eid, mprCreateUndefinedVar());
+ return 0;
}
/* construct and return the right type of ejs object */
mpr_Return(eid, mprCreateBoolVar(*(BOOL *)parm_ptr));
break;
case P_INTEGER:
+ case P_OCTAL:
+ case P_BYTES:
mpr_Return(eid, mprCreateIntegerVar(*(int *)parm_ptr));
break;
case P_ENUM:
return 0;
}
}
- return -1;
+ mpr_Return(eid, mprCreateUndefinedVar());
+ return 0;
case P_LIST:
mpr_Return(eid, mprList(parm->label, *(const char ***)parm_ptr));
break;
case P_SEP:
+ mpr_Return(eid, mprCreateUndefinedVar());
+ return 0;
+ }
+ return 0;
+}
+
+
+/*
+ set a smb.conf parameter. Only sets in memory, not permanent
+
+ can be called in 4 ways:
+
+ ok = lp.set("parm", "value");
+*/
+static int ejs_lpSet(MprVarHandle eid, int argc, char **argv)
+{
+ if (argc != 2) {
+ ejsSetErrorMsg(eid, "lp.set invalid arguments");
return -1;
}
+
+ mpr_Return(eid, mprCreateBoolVar(lp_set_cmdline(argv[0], argv[1])));
+ return 0;
+}
+
+/*
+ reload smb.conf
+
+ ok = lp.reload();
+*/
+static int ejs_lpReload(MprVarHandle eid, int argc, char **argv)
+{
+ BOOL ret = lp_load();
+ if (ret) {
+ unload_interfaces();
+ }
+ mpr_Return(eid, mprCreateBoolVar(ret));
return 0;
}
struct MprVar *obj = mprInitObject(eid, "loadparm", argc, argv);
mprSetStringCFunction(obj, "get", ejs_lpGet);
+ mprSetStringCFunction(obj, "set", ejs_lpSet);
+ mprSetStringCFunction(obj, "reload", ejs_lpReload);
mprSetStringCFunction(obj, "services", ejs_lpServices);
+ mprSetStringCFunction(obj, "categories", ejs_lpCategories);
return 0;
}
/*
setup C functions that be called from ejs
*/
-void smb_setup_ejs_config(void)
+NTSTATUS smb_setup_ejs_config(void)
{
ejsDefineCFunction(-1, "loadparm_init", ejs_loadparm_init, NULL, MPR_VAR_SCRIPT_HANDLE);
+ return NT_STATUS_OK;
}