summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/common-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'libglusterfs/src/common-utils.c')
-rw-r--r--libglusterfs/src/common-utils.c219
1 files changed, 84 insertions, 135 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c
index 952af10cfd0..f26d2bdc318 100644
--- a/libglusterfs/src/common-utils.c
+++ b/libglusterfs/src/common-utils.c
@@ -1586,47 +1586,79 @@ get_nth_word (const char *str, int n)
}
/* RFC 1123 & 952 */
-
-/* The functions below validate given internet addresses and
- * wildcard internet address for correctness.
- * All return 1 on success and 0 on failure
- */
-
+/* Syntax formed combining RFC 1123 & 952 *
+ <hname> ::= <first-name>*["."<gen-name>] *
+ <first-name> ::= <let-or-digit> <[*[<let-or-digit-or-hyphen>]<let-or-digit>]
+ <gen-name> ::= <let>[*[<let-or-digit-or-hyphen>]<let-or-digit>] */
char
valid_host_name (char *address, int length)
{
- int i = 0;
- char ret = 0;
- int flag = 0;
+ int i = 0;
+ int str_len = 0;
+ char ret = 1;
+ char *dup_addr = NULL;
+ char *temp_str = NULL;
+ char *save_ptr = NULL;
- if ((length > 255) || (length == 1))
+ if ((length > _POSIX_HOST_NAME_MAX) || (length == 1)) {
+ ret = 0;
goto out;
+ }
- if (!isalnum (address[length - 1]))
+ dup_addr = gf_strdup (address);
+ if (!dup_addr) {
+ ret = 0;
goto out;
+ }
+ temp_str = strtok_r (dup_addr,".", &save_ptr);
- for (i = 0; i < length; i++) {
- if (!isalnum (address[i]) && (address[i] != '.')
- && (address[i] != '-'))
+ /* first-name */
+ if (!temp_str ||
+ !isalnum(temp_str[0]) ||
+ !isalnum (temp_str[strlen(temp_str)-1])) {
+ ret = 0;
+ goto out;
+ }
+ for (i = 1; i < (strlen (temp_str) - 1); i++) {
+ if (!isalnum (temp_str[i]) && (temp_str[i] != '-')) {
+ ret = 0;
goto out;
+ }
+ }
- if (isalpha(address[i]))
- flag = 1;
+ /* gen-name */
+ while ((temp_str = strtok_r (NULL, ".", &save_ptr))) {
+ str_len = strlen (temp_str);
+
+ if (!isalpha (temp_str[0]) ||
+ !isalnum (temp_str[str_len-1])) {
+ ret = 0;
+ goto out;
+ }
+ for (i = 1; i < str_len; i++) {
+ if (!isalnum (temp_str[i]) && (temp_str[i] != '-')) {
+ ret = 0;
+ goto out;
+ }
+ }
}
- if (flag)
- ret = 1;
out:
+ if (dup_addr)
+ GF_FREE (dup_addr);
return ret;
}
+/* Matches all ipv4 address, if wildcard_acc is true '*' wildcard pattern for*
+ subnets is considerd as valid strings as well */
char
-valid_ipv4_address (char *address, int length)
+valid_ipv4_address (char *address, int length, gf_boolean_t wildcard_acc)
{
int octets = 0;
int value = 0;
char *tmp = NULL, *ptr = NULL, *prev = NULL, *endptr = NULL;
- char ret = 0;
+ char ret = 1;
+ int is_wildcard = 0;
tmp = gf_strdup (address);
prev = tmp;
@@ -1634,15 +1666,22 @@ valid_ipv4_address (char *address, int length)
while (prev != NULL) {
octets++;
- value = strtol (prev, &endptr, 10);
- if ((value > 255) || (value < 0) ||
- (endptr != NULL && *endptr != '\0'))
- goto out;
+ if (wildcard_acc && !strcmp (prev, "*")) {
+ is_wildcard = 1;
+ } else {
+ value = strtol (prev, &endptr, 10);
+ if ((value > 255) || (value < 0) ||
+ (endptr != NULL && *endptr != '\0')) {
+ ret = 0;
+ goto out;
+ }
+ }
prev = strtok_r (NULL, ".", &ptr);
}
- if (octets == 4)
- ret = 1;
+ if ((octets > 4) || (octets < 4 && !is_wildcard)) {
+ ret = 0;
+ }
out:
GF_FREE (tmp);
@@ -1650,27 +1689,35 @@ out:
}
char
-valid_ipv6_address (char *address, int length)
+valid_ipv6_address (char *address, int length, gf_boolean_t wildcard_acc)
{
int hex_numbers = 0;
int value = 0;
char *tmp = NULL, *ptr = NULL, *prev = NULL, *endptr = NULL;
- char ret = 0;
+ char ret = 1;
+ int is_wildcard = 0;
tmp = gf_strdup (address);
prev = strtok_r (tmp, ":", &ptr);
while (prev != NULL) {
hex_numbers++;
- value = strtol (prev, &endptr, 16);
- if ((value > 0xffff) || (value < 0)
- || (endptr != NULL && *endptr != '\0'))
- goto out;
+ if (wildcard_acc && !strcmp (prev, "*")) {
+ is_wildcard = 1;
+ } else {
+ value = strtol (prev, &endptr, 16);
+ if ((value > 0xffff) || (value < 0)
+ || (endptr != NULL && *endptr != '\0')) {
+ ret = 0;
+ goto out;
+ }
+ }
prev = strtok_r (NULL, ":", &ptr);
}
- if (hex_numbers <= 8)
- ret = 1;
+ if ((hex_numbers > 8) || (hex_numbers < 8 && !is_wildcard)) {
+ ret = 0;
+ }
out:
GF_FREE (tmp);
@@ -1678,7 +1725,7 @@ out:
}
char
-valid_internet_address (char *address)
+valid_internet_address (char *address, gf_boolean_t wildcard_acc)
{
char ret = 0;
int length = 0;
@@ -1692,8 +1739,8 @@ valid_internet_address (char *address)
if (length == 0)
goto out;
- if (valid_ipv4_address (address, length)
- || valid_ipv6_address (address, length)
+ if (valid_ipv4_address (address, length, wildcard_acc)
+ || valid_ipv6_address (address, length, wildcard_acc)
|| valid_host_name (address, length))
ret = 1;
@@ -1701,104 +1748,6 @@ out:
return ret;
}
-char
-valid_ipv4_wildcard_check (char *address)
-{
- char ret = 0;
- int octets = 0;
- char *tmp = NULL;
- char *prev = NULL;
- char *endptr = NULL;
- int value = 0;
- int is_wildcard = 0;
-
- tmp = gf_strdup (address);
- prev = strtok (tmp, ".");
-
- while (prev != NULL) {
- octets++;
-
- if (!strcmp (prev, "*")) {
- is_wildcard = 1;
- } else {
- value = strtol (prev, &endptr, 10);
-
- if ((value > 255) || (value < 0) ||
- (endptr != NULL && *endptr != '\0'))
- goto out;
- }
- prev = strtok (NULL, ".");
- }
-
- if (is_wildcard && (octets <= 4))
- ret = 1;
-
-out:
- if (tmp)
- GF_FREE (tmp);
- return ret;
-
-}
-
-char
-valid_ipv6_wildcard_check (char *address)
-{
- char ret = 0;
- int hex_numbers = 0;
- int value = 0;
- char *tmp = NULL;
- char *prev = NULL;
- char *endptr = NULL;
- int is_wildcard = 0;
-
- tmp = gf_strdup (address);
- prev = strtok (tmp, ":");
-
- while (prev != NULL) {
- hex_numbers++;
-
- if (!strcmp (prev, "*")) {
- is_wildcard = 1;
- } else {
- value = strtol (prev, &endptr, 16);
-
- if ((value > 0xffff) || (value < 0) ||
- (endptr != NULL && *endptr != '\0'))
- goto out;
- }
- prev = strtok (NULL, ":");
- }
-
- if (is_wildcard && (hex_numbers <= 8))
- ret = 1;
-out:
- if (tmp)
- GF_FREE (tmp);
- return ret;
-}
-
-char
-valid_wildcard_internet_address (char *address)
-{
- char ret = 0;
-
- if (address == NULL) {
- gf_log_callingfn (THIS->name, GF_LOG_WARNING,
- "argument invalid");
- goto out;
- }
-
- if (strlen (address) == 0)
- goto out;
-
- if (valid_ipv4_wildcard_check (address) ||
- valid_ipv6_wildcard_check (address))
- ret = 1;
-
-out:
- return ret;
-}
-
/*Thread safe conversion function*/
char *
uuid_utoa (uuid_t uuid)