summaryrefslogtreecommitdiffstats
path: root/lib/param
diff options
context:
space:
mode:
authorGarming Sam <garming@catalyst.net.nz>2014-03-14 10:27:54 +1300
committerAndrew Bartlett <abartlet@samba.org>2014-07-07 23:32:36 +0200
commite87cb83b472a4906e0bd27a6a6fee3c8387a7567 (patch)
tree36ba36c5da7998ab642cbed600b4a2fad87de13f /lib/param
parent8947af1bd20638114a32631986325e013bfa0104 (diff)
downloadsamba-e87cb83b472a4906e0bd27a6a6fee3c8387a7567.tar.gz
samba-e87cb83b472a4906e0bd27a6a6fee3c8387a7567.tar.xz
samba-e87cb83b472a4906e0bd27a6a6fee3c8387a7567.zip
param: handle smb_ports as a special handler
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>
Diffstat (limited to 'lib/param')
-rw-r--r--lib/param/loadparm.c40
-rw-r--r--lib/param/param_table.c2
2 files changed, 41 insertions, 1 deletions
diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c
index 5e89b7ecbc..b452f9c953 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 88e4788f09..79b948980a 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,
},