r7511: Add three new command line switches to testparm:
authorLars Müller <lmuelle@samba.org>
Sun, 12 Jun 2005 16:00:29 +0000 (16:00 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:57:10 +0000 (10:57 -0500)
--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 a1b82624d739b1066c356dd4b689233f3c36814e)

source3/param/loadparm.c
source3/utils/testparm.c

index 339624a9a87dfc01eca17618acdbd92d707e5f9f..c0fbb1b77a3968da410c3298fd2214498218604c 100644 (file)
@@ -2519,6 +2519,59 @@ static int map_parameter(const char *pszParmName)
        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.
  Returns True in success, False if the passed string does not correctly 
@@ -3542,7 +3595,7 @@ static void dump_globals(FILE *f)
        int i;
        param_opt_struct *data;
        
-       fprintf(f, "# Global parameters\n[global]\n");
+       fprintf(f, "[global]\n");
 
        for (i = 0; parm_table[i].label; i++)
                if (parm_table[i].class == P_GLOBAL &&
@@ -3587,7 +3640,7 @@ static void dump_a_service(service * pService, FILE * f)
        param_opt_struct *data;
        
        if (pService != &sDefault)
-               fprintf(f, "\n[%s]\n", pService->szService);
+               fprintf(f, "[%s]\n", pService->szService);
 
        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.
@@ -4059,8 +4155,10 @@ void lp_dump(FILE *f, BOOL show_defaults, int maxtoprint)
 
        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);
+       }
 }
 
 /***************************************************************************
index dfd12c7a58e920f6320ec1ff100f207a422a0058..2b72479ac0762082b564388a201465c17611339a 100644 (file)
@@ -201,9 +201,12 @@ via the %%o substitution. With encrypted passwords this is not possible.\n", lp_
        const char *config_file = dyn_CONFIGFILE;
        int s;
        static BOOL silent_mode = False;
+       static BOOL show_all_parameters = False;
        int ret = 0;
        poptContext pc;
        static const char *term_code = "";
+       static char *parameter_name = NULL;
+       static char *section_name = NULL;
        static char *new_local_machine = NULL;
        const char *cname;
        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"},
                {"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"},
+               {"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_TABLEEND
        };
@@ -225,6 +231,11 @@ via the %%o substitution. With encrypted passwords this is not possible.\n", lp_
 
        while(poptGetNextOpt(pc) != -1);
 
+       if (show_all_parameters) {
+               show_parameter_list();
+               exit(0);
+       }
+
        setup_logging(poptGetArg(pc), True);
 
        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: ");
                switch(lp_server_role()) {
                        case ROLE_STANDALONE:
@@ -358,6 +369,34 @@ print command parameter is ignored when using CUPS libraries.\n",
                        fflush(stdout);
                        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());
        }