diff options
Diffstat (limited to 'libglusterfs/src/common-utils.c')
| -rw-r--r-- | libglusterfs/src/common-utils.c | 121 | 
1 files changed, 121 insertions, 0 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 6f40e7a6420..727983d0682 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -1572,3 +1572,124 @@ strtail (char *str, const char *pattern)          return NULL;  } + +/* RFC 1123 & 952 */ +char  +valid_host_name (char *address, int length) +{ +        int i = 0; +        char ret = 1; + +        if ((length > 75) || (length == 1)) { +                ret = 0; +                goto out; +        } + +        if (!isalnum (address[length - 1])) { +                ret = 0; +                goto out; +        } + +        for (i = 0; i < length; i++) { +                if (!isalnum (address[i]) && (address[i] != '.') +                    && (address[i] != '-')) { +                        ret = 0; +                        goto out; +                } +        } + +out: +        return ret; +} + +char +valid_ipv4_address (char *address, int length) +{ +        int octets = 0; +        int value = 0; +        char *tmp = NULL, *ptr = NULL, *prev = NULL, *endptr = NULL; +        char ret = 1; + +        tmp = gf_strdup (address); +        prev = tmp;  +        prev = strtok_r (tmp, ".", &ptr); + +        while (prev != NULL)  +        { +                octets++; +                value = strtol (prev, &endptr, 10); +                if ((value > 255) || (value < 0) || (endptr != NULL)) { +                        ret = 0; +                        goto out; +                } +    +                prev = strtok_r (NULL, ".", &ptr); +        } + +        if (octets != 4) { +                ret = 0; +        } + +out: +        GF_FREE (tmp); +        return ret; +} + +char +valid_ipv6_address (char *address, int length) +{ +        int hex_numbers = 0; +        int value = 0; +        char *tmp = NULL, *ptr = NULL, *prev = NULL, *endptr = NULL; +        char ret = 1; + +        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')) { +                        ret = 0; +                        goto out; +                } +    +                prev = strtok_r (NULL, ":", &ptr); +        } +         +        if (hex_numbers > 8) { +                ret = 0; +        } + +out: +        GF_FREE (tmp); +        return ret; +} + +char +valid_internet_address (char *address) +{ +        char ret = 0; +        int length = 0; + +        if (address == NULL) { +                goto out; +        } + +        length = strlen (address); +        if (length == 0) { +                goto out; +        } + +        if (valid_ipv4_address (address, length)  +            || valid_ipv6_address (address, length) +            || valid_host_name (address, length)) { +                ret = 1; +        } + +out:         +        return ret; +} +  | 
