[PATCH 33/37] param: handle smb_ports as a special handler

abartlet at samba.org abartlet at samba.org
Fri Jun 20 05:47:55 MDT 2014


From: Garming Sam <garming at catalyst.net.nz>

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 at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
---
 lib/param/loadparm.c       | 40 ++++++++++++++++++++++++++++++++++++++++
 lib/param/param_table.c    |  2 +-
 python/samba/tests/docs.py |  6 ++++--
 3 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c
index da85f1d..08998e6 100644
--- a/lib/param/loadparm.c
+++ b/lib/param/loadparm.c
@@ -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.
 ***************************************************************************/
diff --git a/lib/param/param_table.c b/lib/param/param_table.c
index 88e4788..79b9489 100644
--- a/lib/param/param_table.c
+++ b/lib/param/param_table.c
@@ -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,
 	},
diff --git a/python/samba/tests/docs.py b/python/samba/tests/docs.py
index 927b374..61295d7 100644
--- a/python/samba/tests/docs.py
+++ b/python/samba/tests/docs.py
@@ -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())
-- 
1.9.3



More information about the samba-technical mailing list