X-Git-Url: http://www.project-moonshot.org/gitweb/?p=trust_router.git;a=blobdiff_plain;f=common%2Ftr_util.c;h=527a74375697d94daccff984a2185cecd54f5b42;hp=2e59606d62b93f5f00b141c9417cbf2c66f25e30;hb=b9776b2a5e8fa45749148e34c3f2df6ec4249ead;hpb=d2ba6b76ef112c3ff285a55ac04c5308e840fdd9 diff --git a/common/tr_util.c b/common/tr_util.c index 2e59606..527a743 100644 --- a/common/tr_util.c +++ b/common/tr_util.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -209,4 +210,99 @@ struct timespec *tr_clock_convert(clockid_t from, const struct timespec *when, return NULL; } return dst; -} \ No newline at end of file +} + +TR_NAME *tr_parse_hostname(const char *s) +{ + const char *colon; + char *hostname; + size_t hostname_len; + TR_NAME *retval; + + if (s == NULL) + return NULL; + + /* find the colon */ + colon = strchr(s, ':'); + if (colon == NULL) + return tr_new_name(s); /* there was no colon, take the whole string */ + + /* make a copy of the hostname portion of the string */ + hostname_len = colon - s; + hostname = malloc(hostname_len + 1); /* +1 for the null termination */ + if (hostname == NULL) + return NULL; + + /* copy up to the colon, add a null termination, and make a TR_NAME */ + strncpy(hostname, s, hostname_len); + hostname[hostname_len] = '\0'; + retval = tr_new_name(hostname); + + /* clean up and return */ + free(hostname); + return retval; +} + +/** + * Parse the port from a hostname:port string + * + * @param s string to parse + * @return the specified port, 0 if none specified, -1 if invalid + */ +int tr_parse_port(const char *s) +{ + const char *s_port; + char *end_of_conversion; + long int port; /* long instead of int because we use strtol */ + + /* Find the first colon */ + s_port = strchr(s, ':'); /* port starts at s_port + 1 */ + if (s_port == NULL) + return 0; /* no port */ + + /* Check that the last colon is the same as the first */ + if (strrchr(s, ':') != s_port) + return -1; /* multiple colons are invalid*/ + + s_port += 1; /* port now starts at s_port */ + + /* Parse the port number */ + port = strtol(s, &end_of_conversion, /* base */ 10); + + /* validate */ + if ((end_of_conversion == s_port) /* there was no port, just a colon */ + || (*end_of_conversion != '\0') /* did not reach the end of the string */ + || (port <= 0) || (port > 65535)) { + return -1; + } + + return (int) port; +} + +/** + * Parse hostname and port + * + * @param s + * @param hn_dest + * @param p_dest + * @return 0 on success, -1 on error + */ +int tr_parse_hostname_and_port(const char *s, TR_NAME **hn_dest, int *p_dest) +{ + if ((hn_dest == NULL) || (p_dest == NULL)) + return -1; + + *hn_dest = tr_parse_hostname(s); + if (*hn_dest == NULL) + return -1; + + *p_dest = tr_parse_port(s); + if ((*p_dest < 0) || (*p_dest > 65535)) { + tr_free_name(*hn_dest); + *hn_dest = NULL; + return -1; + } + + return 0; +} +