summaryrefslogtreecommitdiffstats
path: root/lib/param/loadparm.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/param/loadparm.c')
-rw-r--r--lib/param/loadparm.c83
1 files changed, 45 insertions, 38 deletions
diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c
index 49323c5f1a..b58a058f18 100644
--- a/lib/param/loadparm.c
+++ b/lib/param/loadparm.c
@@ -233,6 +233,10 @@ static bool lpcfg_service_ok(struct loadparm_service *service);
static bool do_section(const char *pszSectionName, void *);
static bool set_variable_helper(TALLOC_CTX *mem_ctx, int parmnum, void *parm_ptr,
const char *pszParmName, const char *pszParmValue);
+static bool lp_do_parameter_parametric(struct loadparm_context *lp_ctx,
+ struct loadparm_service *service,
+ const char *pszParmName,
+ const char *pszParmValue, int flags);
/* The following are helper functions for parametrical options support. */
/* It returns a pointer to parametrical option value if it exists or NULL otherwise */
@@ -1069,7 +1073,7 @@ bool lp_set_enum_parm( struct parm_struct *parm, const char *pszParmValue,
Handle the "realm" parameter
***************************************************************************/
-bool handle_realm(struct loadparm_context *lp_ctx, int unused,
+bool handle_realm(struct loadparm_context *lp_ctx, struct loadparm_service *service,
const char *pszParmValue, char **ptr)
{
char *upper;
@@ -1103,13 +1107,13 @@ bool handle_realm(struct loadparm_context *lp_ctx, int unused,
Handle the include operation.
***************************************************************************/
-bool handle_include(struct loadparm_context *lp_ctx, int unused,
+bool handle_include(struct loadparm_context *lp_ctx, struct loadparm_service *service,
const char *pszParmValue, char **ptr)
{
char *fname;
if (lp_ctx->s3_fns) {
- return lp_ctx->s3_fns->lp_include(lp_ctx, unused, pszParmValue, ptr);
+ return lp_ctx->s3_fns->lp_include(lp_ctx, service, pszParmValue, ptr);
}
fname = standard_sub_basic(lp_ctx, pszParmValue);
@@ -1130,37 +1134,31 @@ bool handle_include(struct loadparm_context *lp_ctx, int unused,
Handle the interpretation of the copy parameter.
***************************************************************************/
-bool handle_copy(struct loadparm_context *lp_ctx, int snum,
+bool handle_copy(struct loadparm_context *lp_ctx, struct loadparm_service *service,
const char *pszParmValue, char **ptr)
{
bool bRetval;
struct loadparm_service *serviceTemp = NULL;
- struct loadparm_service *current = NULL;
bRetval = false;
DEBUG(3, ("Copying service from service %s\n", pszParmValue));
serviceTemp = lpcfg_getservicebyname(lp_ctx, pszParmValue);
- if (lp_ctx->s3_fns != NULL) {
- current = lp_ctx->s3_fns->get_servicebynum(snum);
- } else {
- current = lp_ctx->currentService;
- }
- if (current == NULL) {
+ if (service == NULL) {
DEBUG(0, ("Unable to copy service - invalid service destination"));
return false;
}
if (serviceTemp != NULL) {
- if (serviceTemp == current) {
+ if (serviceTemp == service) {
DEBUG(0, ("Can't copy service %s - unable to copy self!\n", pszParmValue));
} else {
- copy_service(current,
+ copy_service(service,
serviceTemp,
- current->copymap);
- lpcfg_string_set(current, ptr, pszParmValue);
+ service->copymap);
+ lpcfg_string_set(service, ptr, pszParmValue);
bRetval = true;
}
@@ -1173,7 +1171,7 @@ bool handle_copy(struct loadparm_context *lp_ctx, int snum,
return bRetval;
}
-bool handle_debug_list(struct loadparm_context *lp_ctx, int unused,
+bool handle_debug_list(struct loadparm_context *lp_ctx, struct loadparm_service *service,
const char *pszParmValue, char **ptr)
{
if (lp_ctx->s3_fns != NULL) {
@@ -1185,7 +1183,7 @@ bool handle_debug_list(struct loadparm_context *lp_ctx, int unused,
return debug_parse_levels(pszParmValue);
}
-bool handle_logfile(struct loadparm_context *lp_ctx, int unused,
+bool handle_logfile(struct loadparm_context *lp_ctx, struct loadparm_service *service,
const char *pszParmValue, char **ptr)
{
if (lp_ctx->s3_fns != NULL) {
@@ -1202,7 +1200,7 @@ bool handle_logfile(struct loadparm_context *lp_ctx, int unused,
* These special charset handling methods only run in the source3 code.
*/
-bool handle_charset(struct loadparm_context *lp_ctx, int snum,
+bool handle_charset(struct loadparm_context *lp_ctx, struct loadparm_service *service,
const char *pszParmValue, char **ptr)
{
if (lp_ctx->s3_fns) {
@@ -1220,7 +1218,7 @@ bool handle_charset(struct loadparm_context *lp_ctx, int snum,
}
-bool handle_dos_charset(struct loadparm_context *lp_ctx, int snum,
+bool handle_dos_charset(struct loadparm_context *lp_ctx, struct loadparm_service *service,
const char *pszParmValue, char **ptr)
{
bool is_utf8 = false;
@@ -1265,7 +1263,7 @@ bool handle_dos_charset(struct loadparm_context *lp_ctx, int snum,
return lpcfg_string_set(lp_ctx, ptr, pszParmValue);
}
-bool handle_printing(struct loadparm_context *lp_ctx, int snum,
+bool handle_printing(struct loadparm_context *lp_ctx, struct loadparm_service *service,
const char *pszParmValue, char **ptr)
{
static int parm_num = -1;
@@ -1280,11 +1278,11 @@ bool handle_printing(struct loadparm_context *lp_ctx, int snum,
}
if (lp_ctx->s3_fns) {
- if ( snum < 0 ) {
+ if (service == NULL) {
s = lp_ctx->sDefault;
lp_ctx->s3_fns->init_printer_values(lp_ctx->globals->ctx, s);
} else {
- s = lp_ctx->services[snum];
+ s = service;
lp_ctx->s3_fns->init_printer_values(s, s);
}
}
@@ -1292,7 +1290,8 @@ bool handle_printing(struct loadparm_context *lp_ctx, int snum,
return true;
}
-bool handle_ldap_debug_level(struct loadparm_context *lp_ctx, int snum, const char *pszParmValue, char **ptr)
+bool handle_ldap_debug_level(struct loadparm_context *lp_ctx, struct loadparm_service *service,
+ const char *pszParmValue, char **ptr)
{
lp_ctx->globals->ldap_debug_level = lp_int(pszParmValue);
@@ -1302,7 +1301,8 @@ bool handle_ldap_debug_level(struct loadparm_context *lp_ctx, int snum, const ch
return true;
}
-bool handle_netbios_aliases(struct loadparm_context *lp_ctx, int snum, const char *pszParmValue, char **ptr)
+bool handle_netbios_aliases(struct loadparm_context *lp_ctx, struct loadparm_service *service,
+ const char *pszParmValue, char **ptr)
{
TALLOC_FREE(lp_ctx->globals->netbios_aliases);
lp_ctx->globals->netbios_aliases = (const char **)str_list_make_v3(lp_ctx->globals->ctx,
@@ -1318,34 +1318,41 @@ bool handle_netbios_aliases(struct loadparm_context *lp_ctx, int snum, const cha
* idmap related parameters
*/
-bool handle_idmap_backend(struct loadparm_context *lp_ctx, int snum, const char *pszParmValue, char **ptr)
+bool handle_idmap_backend(struct loadparm_context *lp_ctx, struct loadparm_service *service,
+ const char *pszParmValue, char **ptr)
{
if (lp_ctx->s3_fns) {
- return lp_ctx->s3_fns->lp_do_parameter(snum, "idmap config * : backend", pszParmValue);
+ lp_do_parameter_parametric(lp_ctx, service, "idmap config * : backend",
+ pszParmValue, 0);
}
- return lpcfg_string_set(lp_ctx, ptr, pszParmValue);
+ return lpcfg_string_set(lp_ctx->globals->ctx, ptr, pszParmValue);
}
-bool handle_idmap_uid(struct loadparm_context *lp_ctx, int snum, const char *pszParmValue, char **ptr)
+bool handle_idmap_uid(struct loadparm_context *lp_ctx, struct loadparm_service *service,
+ const char *pszParmValue, char **ptr)
{
if (lp_ctx->s3_fns) {
- return lp_ctx->s3_fns->lp_do_parameter(snum, "idmap config * : range", pszParmValue);
+ lp_do_parameter_parametric(lp_ctx, service, "idmap config * : range",
+ pszParmValue, 0);
}
- return lpcfg_string_set(lp_ctx, ptr, pszParmValue);
+ return lpcfg_string_set(lp_ctx->globals->ctx, ptr, pszParmValue);
}
-bool handle_idmap_gid(struct loadparm_context *lp_ctx, int snum, const char *pszParmValue, char **ptr)
+bool handle_idmap_gid(struct loadparm_context *lp_ctx, struct loadparm_service *service,
+ const char *pszParmValue, char **ptr)
{
if (lp_ctx->s3_fns) {
- return lp_ctx->s3_fns->lp_do_parameter(snum, "idmap config * : range", pszParmValue);
+ lp_do_parameter_parametric(lp_ctx, service, "idmap config * : range",
+ pszParmValue, 0);
}
- return lpcfg_string_set(lp_ctx, ptr, pszParmValue);
+ return lpcfg_string_set(lp_ctx->globals->ctx, ptr, pszParmValue);
}
-bool handle_smb_ports(struct loadparm_context *lp_ctx, int snum, const char *pszParmValue, char **ptr)
+bool handle_smb_ports(struct loadparm_context *lp_ctx, struct loadparm_service *service,
+ const char *pszParmValue, char **ptr)
{
static int parm_num = -1;
int i;
@@ -1571,7 +1578,7 @@ static bool set_variable_helper(TALLOC_CTX *mem_ctx, int parmnum, void *parm_ptr
}
-bool set_variable(TALLOC_CTX *mem_ctx, int snum, int parmnum, void *parm_ptr,
+bool set_variable(TALLOC_CTX *mem_ctx, struct loadparm_service *service, int parmnum, void *parm_ptr,
const char *pszParmName, const char *pszParmValue,
struct loadparm_context *lp_ctx, bool on_globals)
{
@@ -1580,7 +1587,7 @@ bool set_variable(TALLOC_CTX *mem_ctx, int snum, int parmnum, void *parm_ptr,
/* if it is a special case then go ahead */
if (parm_table[parmnum].special) {
- ok = parm_table[parmnum].special(lp_ctx, snum, pszParmValue,
+ ok = parm_table[parmnum].special(lp_ctx, service, pszParmValue,
(char **)parm_ptr);
if (!ok) {
return false;
@@ -1636,7 +1643,7 @@ bool lpcfg_do_global_parameter(struct loadparm_context *lp_ctx,
parm_ptr = lpcfg_parm_ptr(lp_ctx, NULL, &parm_table[parmnum]);
- return set_variable(lp_ctx->globals->ctx, -1, parmnum, parm_ptr,
+ return set_variable(lp_ctx->globals->ctx, NULL, parmnum, parm_ptr,
pszParmName, pszParmValue, lp_ctx, true);
}
@@ -1685,7 +1692,7 @@ bool lpcfg_do_service_parameter(struct loadparm_context *lp_ctx,
parm_table[i].p_class == parm_table[parmnum].p_class)
bitmap_clear(service->copymap, i);
- return set_variable(service, -1, parmnum, parm_ptr, pszParmName,
+ return set_variable(service, service, parmnum, parm_ptr, pszParmName,
pszParmValue, lp_ctx, false);
}