diff options
| author | Garming Sam <garming@catalyst.net.nz> | 2014-03-14 10:27:54 +1300 |
|---|---|---|
| committer | Andrew Bartlett <abartlet@samba.org> | 2014-07-07 23:32:36 +0200 |
| commit | e87cb83b472a4906e0bd27a6a6fee3c8387a7567 (patch) | |
| tree | 36ba36c5da7998ab642cbed600b4a2fad87de13f /lib/param | |
| parent | 8947af1bd20638114a32631986325e013bfa0104 (diff) | |
| download | samba-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.c | 40 | ||||
| -rw-r--r-- | lib/param/param_table.c | 2 |
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, }, |
