r25026: Move param/param.h out of includes.h
[kai/samba-autobuild/.git] / source4 / scripting / ejs / smbcalls_config.c
index 7fc58f237dacb07d30669c0f500ad996c07965c2..b31b70bda8b551c323f7559322d00cd6c93b2ae1 100644 (file)
@@ -7,7 +7,7 @@
    
    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
@@ -44,14 +46,35 @@ static int ejs_lpServices(MprVarHandle eid, int argc, char **argv)
 
 
 /*
-  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.  
 */
@@ -67,7 +90,8 @@ static int ejs_lpGet(MprVarHandle eid, int argc, char **argv)
                /* 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 */
@@ -76,16 +100,23 @@ static int ejs_lpGet(MprVarHandle eid, int argc, char **argv)
                                                          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], ':')) {
@@ -94,20 +125,30 @@ static int ejs_lpGet(MprVarHandle eid, int argc, char **argv)
                                                  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 */
@@ -120,6 +161,8 @@ static int ejs_lpGet(MprVarHandle eid, int argc, char **argv)
                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:
@@ -129,13 +172,49 @@ static int ejs_lpGet(MprVarHandle eid, int argc, char **argv)
                                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;
 }
 
@@ -147,14 +226,18 @@ static int ejs_loadparm_init(MprVarHandle eid, int argc, struct MprVar **argv)
        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;
 }