diff options
Diffstat (limited to 'libglusterfs')
-rw-r--r-- | libglusterfs/src/common-utils.c | 34 | ||||
-rw-r--r-- | libglusterfs/src/glusterfs/common-utils.h | 3 | ||||
-rw-r--r-- | libglusterfs/src/options.c | 6 |
3 files changed, 37 insertions, 6 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 6cefb2a439b..4104c576fd2 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -2090,7 +2090,7 @@ out: * @ip_str : The IP to check * @network: The network to check the IP against. * - * @return: success: 0 + * @return: success: _gf_true * failure: -EINVAL for bad args, retval of inet_pton otherwise */ gf_boolean_t @@ -2457,6 +2457,31 @@ out: return ret; } +char +valid_cidr_address(char *cidr_address, gf_boolean_t wildcard_acc) +{ + unsigned int net_mask = 0, len = 0; + char *temp = NULL, *cidr_str = NULL, ret = 1; + + cidr_str = strdupa(cidr_address); + temp = strstr(cidr_str, "/"); + if (temp == NULL) + return 0; /* Since Invalid cidr ip address we return 0 */ + + *temp = '\0'; + temp++; + net_mask = (unsigned int)atoi(temp); + + if (net_mask > 32 || net_mask < 1) + return 0; /* Since Invalid cidr ip address we return 0*/ + + len = strlen(cidr_str); + + ret = valid_ipv4_address(cidr_str, len, wildcard_acc); + + return ret; +} + /** * valid_ipv4_subnetwork() takes the pattern and checks if it contains * a valid ipv4 subnetwork pattern i.e. xx.xx.xx.xx/n. IPv4 address @@ -2593,7 +2618,8 @@ out: } char -valid_internet_address(char *address, gf_boolean_t wildcard_acc) +valid_internet_address(char *address, gf_boolean_t wildcard_acc, + gf_boolean_t cidr) { char ret = 0; int length = 0; @@ -2608,6 +2634,10 @@ valid_internet_address(char *address, gf_boolean_t wildcard_acc) if (length == 0) goto out; + if (cidr && valid_cidr_address(address, wildcard_acc)) { + ret = 1; + } + if (valid_ipv4_address(address, length, wildcard_acc) || valid_ipv6_address(address, length, wildcard_acc) || valid_host_name(address, length)) diff --git a/libglusterfs/src/glusterfs/common-utils.h b/libglusterfs/src/glusterfs/common-utils.h index 76d1e5feee5..b688981617d 100644 --- a/libglusterfs/src/glusterfs/common-utils.h +++ b/libglusterfs/src/glusterfs/common-utils.h @@ -875,7 +875,8 @@ valid_ipv4_address(char *address, int length, gf_boolean_t wildcard_acc); char valid_ipv6_address(char *address, int length, gf_boolean_t wildcard_acc); char -valid_internet_address(char *address, gf_boolean_t wildcard_acc); +valid_internet_address(char *address, gf_boolean_t wildcard_acc, + gf_boolean_t cidr); gf_boolean_t valid_mount_auth_address(char *address); gf_boolean_t diff --git a/libglusterfs/src/options.c b/libglusterfs/src/options.c index ccb8975b33b..da24122205e 100644 --- a/libglusterfs/src/options.c +++ b/libglusterfs/src/options.c @@ -551,7 +551,7 @@ xlator_option_validate_addr(xlator_t *xl, const char *key, const char *value, int ret = -1; char errstr[256]; - if (!valid_internet_address((char *)value, _gf_false)) { + if (!valid_internet_address((char *)value, _gf_false, _gf_false)) { snprintf(errstr, 256, "option %s %s: Can not parse %s address", key, value, value); gf_msg(xl->name, GF_LOG_ERROR, 0, LG_MSG_INVALID_ENTRY, "%s", errstr); @@ -592,7 +592,7 @@ xlator_option_validate_addr_list(xlator_t *xl, const char *key, /* Possible old format, handle it for back-ward compatibility */ addr_tok = strtok_r(dup_val, ",", &save_ptr); while (addr_tok) { - if (!valid_internet_address(addr_tok, _gf_true)) + if (!valid_internet_address(addr_tok, _gf_true, _gf_true)) goto out; addr_tok = strtok_r(NULL, ",", &save_ptr); @@ -627,7 +627,7 @@ xlator_option_validate_addr_list(xlator_t *xl, const char *key, if (addr_tok == NULL) goto out; while (addr_tok) { - if (!valid_internet_address(addr_tok, _gf_true)) + if (!valid_internet_address(addr_tok, _gf_true, _gf_true)) goto out; addr_tok = strtok_r(NULL, "|", &save_ptr); |