param: handle smb_ports as a special handler
authorGarming Sam <garming@catalyst.net.nz>
Thu, 13 Mar 2014 21:27:54 +0000 (10:27 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 7 Jul 2014 21:32:36 +0000 (23:32 +0200)
Avoids some problems with using str_list_make and str_list_make_v3 and tries to
verify if the ports assignment is reasonable

Change-Id: I441c4cca605c7548a5023b65994004fbac57d2df
Signed-off-by: Garming Sam <garming@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Nadezhda Ivanova <nivanova@samba.org>
lib/param/loadparm.c
lib/param/param_table.c
python/samba/tests/docs.py

index 5e89b7ecbc585b1b566c90b68c1aa4503a13a1de..b452f9c9531ac629bb96ecc08486d6541c6c1f0c 100644 (file)
@@ -233,6 +233,8 @@ static struct loadparm_service *lpcfg_getservicebyname(struct loadparm_context *
                                        const char *pszServiceName);
 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);
 
 /* The following are helper functions for parametrical options support. */
 /* It returns a pointer to parametrical option value if it exists or NULL otherwise */
@@ -1345,6 +1347,44 @@ bool handle_idmap_gid(struct loadparm_context *lp_ctx, int snum, const char *psz
        return lpcfg_string_set(lp_ctx, ptr, pszParmValue);
 }
 
+bool handle_smb_ports(struct loadparm_context *lp_ctx, int snum, const char *pszParmValue, char **ptr)
+{
+       static int parm_num = -1;
+       int i;
+       const char **list;
+
+       if (!pszParmValue || !*pszParmValue) {
+               return false;
+       }
+
+       if (parm_num == -1) {
+               parm_num = lpcfg_map_parameter("smb ports");
+       }
+
+       if(!set_variable_helper(lp_ctx->globals->ctx, parm_num, ptr, "smb ports",
+                               pszParmValue)) {
+               return false;
+       }
+
+       list = lp_ctx->globals->smb_ports;
+       if (list == NULL) {
+               return false;
+       }
+
+       /* Check that each port is a valid integer and within range */
+       for (i = 0; list[i] != NULL; i++) {
+               char *end = NULL;
+               int port = 0;
+               port = strtol(list[i], &end, 10);
+               if (*end != '\0' || port <= 0 || port > 65535) {
+                       TALLOC_FREE(list);
+                       return false;
+               }
+       }
+
+       return true;
+}
+
 /***************************************************************************
  Initialise a copymap.
 ***************************************************************************/
index 88e4788f09051a9f57fa31012499a3d87f4fe1e5..79b948980a4a4ec5f16112fce498b55923ecb728 100644 (file)
@@ -1324,7 +1324,7 @@ struct parm_struct parm_table[] = {
                .type           = P_CMDLIST,
                .p_class        = P_GLOBAL,
                .offset         = GLOBAL_VAR(smb_ports),
-               .special        = NULL,
+               .special        = handle_smb_ports,
                .enum_list      = NULL,
                .flags          = FLAG_ADVANCED,
        },
index 927b3749020116ac029a8bb75db8516f4ca9f9bf..61295d7609a8971214ca568bb0123da9756556ed 100644 (file)
@@ -188,12 +188,14 @@ class SmbDotConfTests(TestCase):
                           'registry shares',
                           'idmap backend',
                           'idmap gid',
-                          'idmap uid'])
+                          'idmap uid',
+                          'smb ports'])
 
     def test_default_s4(self):
         self._test_default(['bin/samba-tool', 'testparm'])
         self._set_defaults(['bin/samba-tool', 'testparm'])
-        self._set_arbitrary(['bin/samba-tool', 'testparm'])
+        self._set_arbitrary(['bin/samba-tool', 'testparm'],
+            exceptions = ['smb ports'])
 
     def _test_default(self, program):
         topdir = os.path.abspath(samba.source_tree_topdir())