X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcutil.c;h=86b2f850b3546b99cdfb13bba8c901881b2511db;hp=b4472bebe38b2a018b7d80aa5a5b51c25b6fa773;hb=40f8443d8d3a6577336ee66d18e04d9ac4d956bb;hpb=6210937137137fe4019e808686dd1fcf99360af6 diff --git a/lib/silcutil/silcutil.c b/lib/silcutil/silcutil.c index b4472beb..86b2f850 100644 --- a/lib/silcutil/silcutil.c +++ b/lib/silcutil/silcutil.c @@ -22,7 +22,7 @@ */ /* $Id$ */ -#include "silcincludes.h" +#include "silc.h" /* Gets line from a buffer. Stops reading when a newline or EOF occurs. This doesn't remove the newline sign from the destination buffer. The @@ -129,37 +129,47 @@ SilcBool silc_to_lower(const char *string, char *dest, SilcUInt32 dest_size) /* Parse userfqdn string which is in user@fqdn format. */ -SilcBool silc_parse_userfqdn(const char *string, char **left, char **right) +int silc_parse_userfqdn(const char *string, + char *user, SilcUInt32 user_size, + char *fqdn, SilcUInt32 fqdn_size) { SilcUInt32 tlen; - if (!string) - return FALSE; + if (!string || (!user && !fqdn)) + return 0; if (string[0] == '@') { - if (left) - *left = strdup(string); - return TRUE; + if (user) { + memset(user, 0, user_size); + silc_strncat(user, user_size, string, strlen(string)); + } + + return 1; } if (strchr(string, '@')) { tlen = strcspn(string, "@"); - if (left) { - *left = silc_calloc(tlen + 1, sizeof(char)); - memcpy(*left, string, tlen); + if (user) { + memset(user, 0, user_size); + silc_strncat(user, user_size, string, tlen); } - if (right) { - *right = silc_calloc((strlen(string) - tlen) + 1, sizeof(char)); - memcpy(*right, string + tlen + 1, strlen(string) - tlen - 1); + if (fqdn) { + memset(fqdn, 0, fqdn_size); + silc_strncat(fqdn, fqdn_size, string + tlen + 1, + strlen(string) - tlen - 1); } - } else { - if (left) - *left = silc_memdup(string, strlen(string)); + + return 2; } - return TRUE; + if (user) { + memset(user, 0, user_size); + silc_strncat(user, user_size, string, strlen(string)); + } + + return 1; } /* Parses command line. At most `max_args' is taken. Rest of the line @@ -243,7 +253,7 @@ void silc_parse_command_line(unsigned char *buffer, char *silc_format(char *fmt, ...) { va_list args; - static char buf[8192]; + char buf[8192]; memset(buf, 0, sizeof(buf)); va_start(args, fmt); @@ -613,6 +623,14 @@ SilcBool silc_hash_id_compare(void *key1, void *key2, void *user_context) SILC_ID_COMPARE_TYPE(key1, key2, id_type)); } +/* Compares two ID's. Compares full IDs. */ + +SilcBool silc_hash_id_compare_full(void *key1, void *key2, void *user_context) +{ + SilcIdType id_type = (SilcIdType)SILC_PTR_TO_32(user_context); + return SILC_ID_COMPARE_TYPE(key1, key2, id_type); +} + /* Compare two Client ID's entirely and not just the hash from the ID. */ SilcBool silc_hash_client_id_compare(void *key1, void *key2, void *user_context) @@ -634,8 +652,8 @@ SilcBool silc_hash_utf8_compare(void *key1, void *key2, void *user_context) { int l1 = strlen((char *)key1); int l2 = strlen((char *)key2); - if (l1 > l2) - l2 = l1; + if (l1 != l2) + return FALSE; return !memcmp(key1, key2, l2); } @@ -816,11 +834,11 @@ SilcBool silc_string_is_ascii(const unsigned char *data, SilcUInt32 data_len) /* Parses SILC protocol style version string. */ SilcBool silc_parse_version_string(const char *version, - SilcUInt32 *protocol_version, - char **protocol_version_string, - SilcUInt32 *software_version, - char **software_version_string, - char **vendor_version) + SilcUInt32 *protocol_version, + char **protocol_version_string, + SilcUInt32 *software_version, + char **software_version_string, + char **vendor_version) { char *cp, buf[32]; int maj = 0, min = 0;