1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00

r7511: Add three new command line switches to testparm:

--show-all-parameters
        Enumerates all available parameters, grouped in to sections
        [local] and [global] by the class of the parameter.  Each line
        is formated name=type[,enum values],flags
--parameter-name
        Display the setting of the named parameter.  The global section
        is assumed if no other is set with --section-name
--section-name
        Limit the view of testparm to the named section.  Use 'global'
        to only view the settings of the global section.

This fixes bug #2767.

Lars
(This used to be commit a1b82624d7)
This commit is contained in:
Lars Müller 2005-06-12 16:00:29 +00:00 committed by Gerald (Jerry) Carter
parent c3fedee2a6
commit bf66eb3a92
2 changed files with 141 additions and 4 deletions

View File

@ -2519,6 +2519,59 @@ static int map_parameter(const char *pszParmName)
return (-1); return (-1);
} }
/***************************************************************************
Show all parameter's name, type, [values,] and flags.
***************************************************************************/
void show_parameter_list(void)
{
int classIndex, parmIndex, enumIndex, flagIndex;
BOOL hadFlag;
char *section_names[] = { "local", "global", NULL};
char *type[] = { "P_BOOL", "P_BOOLREV", "P_CHAR", "P_INTEGER",
"P_OCTAL", "P_LIST", "P_STRING", "P_USTRING", "P_GSTRING",
"P_UGSTRING", "P_ENUM", "P_SEP"};
unsigned flags[] = { FLAG_BASIC, FLAG_SHARE, FLAG_PRINT, FLAG_GLOBAL,
FLAG_WIZARD, FLAG_ADVANCED, FLAG_DEVELOPER, FLAG_DEPRECATED,
FLAG_HIDE, FLAG_DOS_STRING};
char *flag_names[] = { "FLAG_BASIC", "FLAG_SHARE", "FLAG_PRINT",
"FLAG_GLOBAL", "FLAG_WIZARD", "FLAG_ADVANCED", "FLAG_DEVELOPER",
"FLAG_DEPRECATED", "FLAG_HIDE", "FLAG_DOS_STRING", NULL};
for ( classIndex=0; section_names[classIndex]; classIndex++) {
printf("[%s]\n", section_names[classIndex]);
for (parmIndex = 0; parm_table[parmIndex].label; parmIndex++) {
if (parm_table[parmIndex].class == classIndex) {
printf("%s=%s",
parm_table[parmIndex].label,
type[parm_table[parmIndex].type]);
switch (parm_table[parmIndex].type) {
case P_ENUM:
printf(",");
for (enumIndex=0; parm_table[parmIndex].enum_list[enumIndex].name; enumIndex++)
printf("%s%s",
enumIndex ? "|" : "",
parm_table[parmIndex].enum_list[enumIndex].name);
break;
default:
break;
}
printf(",");
hadFlag = False;
for ( flagIndex=0; flag_names[flagIndex]; flagIndex++ ) {
if (parm_table[parmIndex].flags & flags[flagIndex]) {
printf("%s%s",
hadFlag ? "|" : "",
flag_names[flagIndex]);
hadFlag = True;
}
}
printf("\n");
}
}
}
}
/*************************************************************************** /***************************************************************************
Set a boolean variable from the text value stored in the passed string. Set a boolean variable from the text value stored in the passed string.
Returns True in success, False if the passed string does not correctly Returns True in success, False if the passed string does not correctly
@ -3542,7 +3595,7 @@ static void dump_globals(FILE *f)
int i; int i;
param_opt_struct *data; param_opt_struct *data;
fprintf(f, "# Global parameters\n[global]\n"); fprintf(f, "[global]\n");
for (i = 0; parm_table[i].label; i++) for (i = 0; parm_table[i].label; i++)
if (parm_table[i].class == P_GLOBAL && if (parm_table[i].class == P_GLOBAL &&
@ -3587,7 +3640,7 @@ static void dump_a_service(service * pService, FILE * f)
param_opt_struct *data; param_opt_struct *data;
if (pService != &sDefault) if (pService != &sDefault)
fprintf(f, "\n[%s]\n", pService->szService); fprintf(f, "[%s]\n", pService->szService);
for (i = 0; parm_table[i].label; i++) { for (i = 0; parm_table[i].label; i++) {
@ -3627,6 +3680,49 @@ static void dump_a_service(service * pService, FILE * f)
} }
} }
/***************************************************************************
Display the contents of a parameter of a single services record.
***************************************************************************/
BOOL dump_a_parameter(int snum, char *parm_name, FILE * f, BOOL isGlobal)
{
service * pService = ServicePtrs[snum];
int i, result = False;
parm_class class;
unsigned flag = 0;
void *ptr;
if (isGlobal) {
class = P_GLOBAL;
flag = FLAG_GLOBAL;
} else
class = P_LOCAL;
for (i = 0; parm_table[i].label; i++) {
if (strwicmp(parm_table[i].label, parm_name) == 0 &&
(parm_table[i].class == class || parm_table[i].flags & flag) &&
parm_table[i].ptr &&
(*parm_table[i].label != '-') &&
(i == 0 || (parm_table[i].ptr != parm_table[i - 1].ptr)))
{
void *ptr;
if (isGlobal)
ptr = parm_table[i].ptr;
else
ptr = ((char *)pService) +
PTR_DIFF(parm_table[i].ptr, &sDefault);
print_parameter(&parm_table[i],
ptr, f);
fprintf(f, "\n");
result = True;
break;
}
}
return result;
}
/*************************************************************************** /***************************************************************************
Return info about the next service in a service. snum==GLOBAL_SECTION_SNUM gives the globals. Return info about the next service in a service. snum==GLOBAL_SECTION_SNUM gives the globals.
@ -4059,8 +4155,10 @@ void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint)
dump_a_service(&sDefault, f); dump_a_service(&sDefault, f);
for (iService = 0; iService < maxtoprint; iService++) for (iService = 0; iService < maxtoprint; iService++) {
fprintf(f,"\n");
lp_dump_one(f, show_defaults, iService); lp_dump_one(f, show_defaults, iService);
}
} }
/*************************************************************************** /***************************************************************************

View File

@ -201,9 +201,12 @@ via the %%o substitution. With encrypted passwords this is not possible.\n", lp_
const char *config_file = dyn_CONFIGFILE; const char *config_file = dyn_CONFIGFILE;
int s; int s;
static BOOL silent_mode = False; static BOOL silent_mode = False;
static BOOL show_all_parameters = False;
int ret = 0; int ret = 0;
poptContext pc; poptContext pc;
static const char *term_code = ""; static const char *term_code = "";
static char *parameter_name = NULL;
static char *section_name = NULL;
static char *new_local_machine = NULL; static char *new_local_machine = NULL;
const char *cname; const char *cname;
const char *caddr; const char *caddr;
@ -215,6 +218,9 @@ via the %%o substitution. With encrypted passwords this is not possible.\n", lp_
{"verbose", 'v', POPT_ARG_NONE, &show_defaults, 1, "Show default options too"}, {"verbose", 'v', POPT_ARG_NONE, &show_defaults, 1, "Show default options too"},
{"server", 'L',POPT_ARG_STRING, &new_local_machine, 0, "Set %%L macro to servername\n"}, {"server", 'L',POPT_ARG_STRING, &new_local_machine, 0, "Set %%L macro to servername\n"},
{"encoding", 't', POPT_ARG_STRING, &term_code, 0, "Print parameters with encoding"}, {"encoding", 't', POPT_ARG_STRING, &term_code, 0, "Print parameters with encoding"},
{"show-all-parameters", '\0', POPT_ARG_VAL, &show_all_parameters, True, "Show the parameters, type, possible values" },
{"parameter-name", '\0', POPT_ARG_STRING, &parameter_name, 0, "Limit testparm to a named parameter" },
{"section-name", '\0', POPT_ARG_STRING, &section_name, 0, "Limit testparm to a named section" },
POPT_COMMON_VERSION POPT_COMMON_VERSION
POPT_TABLEEND POPT_TABLEEND
}; };
@ -225,6 +231,11 @@ via the %%o substitution. With encrypted passwords this is not possible.\n", lp_
while(poptGetNextOpt(pc) != -1); while(poptGetNextOpt(pc) != -1);
if (show_all_parameters) {
show_parameter_list();
exit(0);
}
setup_logging(poptGetArg(pc), True); setup_logging(poptGetArg(pc), True);
if (poptPeekArg(pc)) if (poptPeekArg(pc))
@ -331,7 +342,7 @@ print command parameter is ignored when using CUPS libraries.\n",
} }
if (!silent_mode) { if (!silent_mode && !section_name && !parameter_name) {
fprintf(stderr,"Server role: "); fprintf(stderr,"Server role: ");
switch(lp_server_role()) { switch(lp_server_role()) {
case ROLE_STANDALONE: case ROLE_STANDALONE:
@ -358,6 +369,34 @@ print command parameter is ignored when using CUPS libraries.\n",
fflush(stdout); fflush(stdout);
getc(stdin); getc(stdin);
} }
if (parameter_name || section_name) {
BOOL isGlobal = False;
s = GLOBAL_SECTION_SNUM;
if (!section_name) {
section_name = GLOBAL_NAME;
isGlobal = True;
} else if ((isGlobal=!strwicmp(section_name, GLOBAL_NAME)) == 0 &&
(s=lp_servicenumber(section_name)) == -1) {
fprintf(stderr,"Unknown section %s\n",
section_name);
return(1);
}
if (parameter_name) {
if (!dump_a_parameter( s, parameter_name, stdout, isGlobal)) {
fprintf(stderr,"Parameter %s unknown for section %s\n",
parameter_name, section_name);
return(1);
}
} else {
if (isGlobal == True)
lp_dump(stdout, show_defaults, 0);
else
lp_dump_one(stdout, show_defaults, s);
}
return(ret);
}
lp_dump(stdout, show_defaults, lp_numservices()); lp_dump(stdout, show_defaults, lp_numservices());
} }