summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/include/proto.h1
-rw-r--r--source3/param/loadparm.c13
-rw-r--r--source3/web/swat.c24
3 files changed, 37 insertions, 1 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index b324ae6bb1..9c7c37f1a6 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -1017,6 +1017,7 @@ BOOL lp_add_printer(char *pszPrintername, int iDefaultService);
BOOL lp_file_list_changed(void);
void *lp_local_ptr(int snum, void *ptr);
BOOL lp_do_parameter(int snum, char *pszParmName, char *pszParmValue);
+BOOL lp_is_default(int snum, struct parm_struct *parm);
struct parm_struct *lp_next_parameter(int snum, int *i, int allparameters);
BOOL lp_snum_ok(int iService);
BOOL lp_loaded(void);
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index 4bd167798c..27cbc8c8dd 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -1983,6 +1983,19 @@ static void dump_globals(FILE *f)
}
/***************************************************************************
+return True if a local parameter is currently set to the global default
+***************************************************************************/
+BOOL lp_is_default(int snum, struct parm_struct *parm)
+{
+ int pdiff = PTR_DIFF(parm->ptr,&sDefault);
+
+ return equal_parameter(parm->type,
+ ((char *)pSERVICE(snum)) + pdiff,
+ ((char *)&sDefault) + pdiff);
+}
+
+
+/***************************************************************************
Display the contents of a single services record.
***************************************************************************/
static void dump_a_service(service *pService, FILE *f)
diff --git a/source3/web/swat.c b/source3/web/swat.c
index 323dfc5adf..650740428f 100644
--- a/source3/web/swat.c
+++ b/source3/web/swat.c
@@ -198,6 +198,27 @@ static int save_reload(void)
+/* commit one parameter */
+static void commit_parameter(int snum, struct parm_struct *parm, char *v)
+{
+ int i;
+ char *s;
+
+ if (snum < 0 && parm->class == P_LOCAL) {
+ /* this handles the case where we are changing a local
+ variable globally. We need to change the parameter in
+ all shares where it is currently set to the default */
+ for (i=0;i<lp_numservices();i++) {
+ s = lp_servicename(i);
+ if (s && (*s) && lp_is_default(i, parm)) {
+ lp_do_parameter(i, parm->label, v);
+ }
+ }
+ }
+
+ lp_do_parameter(snum, parm->label, v);
+}
+
/* commit a set of parameters for a service */
static void commit_parameters(int snum)
{
@@ -209,7 +230,8 @@ static void commit_parameters(int snum)
while ((parm = lp_next_parameter(snum, &i, 1))) {
sprintf(label, "parm_%s", parm->label);
if ((v = cgi_variable(label))) {
- lp_do_parameter(snum, parm->label, v);
+ if (parm->flags & FLAG_HIDE) continue;
+ commit_parameter(snum, parm, v);
}
}
}