FN_GLOBAL_CONST_STRING(statedir, szStateDir)
/* local prototypes */
-static int map_parameter(const char *pszParmName);
static struct loadparm_service *getservicebyname(struct loadparm_context *lp_ctx,
const char *pszServiceName);
static void copy_service(struct loadparm_service *pserviceDest,
* Returns False if the parameter string is not recognised, else TRUE.
*/
-static int map_parameter(const char *pszParmName)
+int lpcfg_map_parameter(const char *pszParmName)
{
int iIndex;
- if (*pszParmName == '-')
- return -1;
-
for (iIndex = 0; parm_table[iIndex].label; iIndex++)
if (strwicmp(parm_table[iIndex].label, pszParmName) == 0)
return iIndex;
return lp_ctx->s3_fns->get_parm_struct(name);
}
- parmnum = map_parameter(name);
+ parmnum = lpcfg_map_parameter(name);
if (parmnum == -1) return NULL;
return &parm_table[parmnum];
}
return false;
}
- parmnum = map_parameter(name);
+ parmnum = lpcfg_map_parameter(name);
if (parmnum == -1) return false;
return lp_ctx->flags[parmnum] & FLAG_CMDLINE;
switch (parm_table[i].type) {
case P_BOOL:
+ case P_BOOLREV:
*(bool *)dest_ptr = *(bool *)src_ptr;
break;
*(int *)dest_ptr = *(int *)src_ptr;
break;
+ case P_CHAR:
+ *(char *)dest_ptr = *(char *)src_ptr;
+ break;
+
case P_STRING:
lpcfg_string_set(pserviceDest,
(char **)dest_ptr,
bool lpcfg_do_global_parameter(struct loadparm_context *lp_ctx,
const char *pszParmName, const char *pszParmValue)
{
- int parmnum = map_parameter(pszParmName);
+ int parmnum = lpcfg_map_parameter(pszParmName);
void *parm_ptr;
if (parmnum < 0) {
{
void *parm_ptr;
int i;
- int parmnum = map_parameter(pszParmName);
+ int parmnum = lpcfg_map_parameter(pszParmName);
if (parmnum < 0) {
if (strchr(pszParmName, ':')) {
return lp_ctx->s3_fns->set_cmdline(pszParmName, pszParmValue);
}
- parmnum = map_parameter(pszParmName);
+ parmnum = lpcfg_map_parameter(pszParmName);
while (isspace((unsigned char)*pszParmValue)) pszParmValue++;
lp_ctx->flags[parmnum] |= FLAG_CMDLINE;
/* we have to also set FLAG_CMDLINE on aliases */
- for (i=parmnum-1;i>=0 && parm_table[i].offset == parm_table[parmnum].offset;i--) {
+ for (i=parmnum-1;
+ i>=0 && parm_table[i].p_class == parm_table[parmnum].p_class &&
+ parm_table[i].offset == parm_table[parmnum].offset;
+ i--) {
lp_ctx->flags[i] |= FLAG_CMDLINE;
}
- for (i=parmnum+1;i<NUMPARAMETERS && parm_table[i].offset == parm_table[parmnum].offset;i++) {
+ for (i=parmnum+1;
+ i<NUMPARAMETERS &&
+ parm_table[i].p_class == parm_table[parmnum].p_class &&
+ parm_table[i].offset == parm_table[parmnum].offset;
+ i++) {
lp_ctx->flags[i] |= FLAG_CMDLINE;
}
* Print a parameter of the specified type.
*/
-static void print_parameter(struct parm_struct *p, void *ptr, FILE * f)
+void lpcfg_print_parameter(struct parm_struct *p, void *ptr, FILE * f)
{
/* For the seperation of lists values that we print below */
const char *list_sep = ", ";
if (val == -1) {
fprintf(f, "-1");
} else {
- fprintf(f, "0%o", val);
+ fprintf(f, "0%03o", val);
}
break;
}
* Check if two parameters are equal.
*/
-static bool equal_parameter(parm_type type, void *ptr1, void *ptr2)
+ bool lpcfg_equal_parameter(parm_type type, void *ptr1, void *ptr2)
{
switch (type) {
case P_BOOL:
if (!show_defaults && (lp_ctx->flags[i] & FLAG_DEFAULT))
continue;
fprintf(f, "\t%s = ", parm_table[i].label);
- print_parameter(&parm_table[i], lpcfg_parm_ptr(lp_ctx, NULL, &parm_table[i]), f);
+ lpcfg_print_parameter(&parm_table[i], lpcfg_parm_ptr(lp_ctx, NULL, &parm_table[i]), f);
fprintf(f, "\n");
}
if (lp_ctx->globals->param_opt != NULL) {
}
}
} else {
- if (equal_parameter(parm_table[i].type,
- ((char *)pService) +
- parm_table[i].offset,
- ((char *)sDefault) +
- parm_table[i].offset))
+ if (lpcfg_equal_parameter(parm_table[i].type,
+ ((char *)pService) +
+ parm_table[i].offset,
+ ((char *)sDefault) +
+ parm_table[i].offset))
continue;
}
fprintf(f, "\t%s = ", parm_table[i].label);
- print_parameter(&parm_table[i],
+ lpcfg_print_parameter(&parm_table[i],
((char *)pService) + parm_table[i].offset, f);
fprintf(f, "\n");
}
ptr = lpcfg_parm_ptr(lp_ctx, service,parm);
- print_parameter(parm, ptr, f);
+ lpcfg_print_parameter(parm, ptr, f);
fprintf(f, "\n");
return true;
}
-/**
- * Return info about the next parameter in a service.
- * snum==-1 gives the globals.
- * Return NULL when out of parameters.
- */
-
-
-struct parm_struct *lpcfg_next_parameter(struct loadparm_context *lp_ctx, int snum, int *i,
- int allparameters)
-{
- if (snum == -1) {
- /* do the globals */
- for (; parm_table[*i].label; (*i)++) {
- if ((*parm_table[*i].label == '-'))
- continue;
-
- if ((*i) > 0
- && (parm_table[*i].offset ==
- parm_table[(*i) - 1].offset)
- && (parm_table[*i].p_class ==
- parm_table[(*i) - 1].p_class))
- continue;
-
- return &parm_table[(*i)++];
- }
- } else {
- struct loadparm_service *pService = lp_ctx->services[snum];
-
- for (; parm_table[*i].label; (*i)++) {
- if (parm_table[*i].p_class == P_LOCAL &&
- (*parm_table[*i].label != '-') &&
- ((*i) == 0 ||
- (parm_table[*i].offset !=
- parm_table[(*i) - 1].offset)))
- {
- if (allparameters ||
- !equal_parameter(parm_table[*i].type,
- ((char *)pService) +
- parm_table[*i].offset,
- ((char *)lp_ctx->sDefault) +
- parm_table[*i].offset))
- {
- return &parm_table[(*i)++];
- }
- }
- }
- }
-
- return NULL;
-}
-
-
/**
* Auto-load some home services.
*/