Added SILC Server library.
[silc.git] / lib / silcutil / silcutil.c
index 3a6742cd90bc5ef10a83fbf1f0b2d9980806e7f9..86b2f850b3546b99cdfb13bba8c901881b2511db 100644 (file)
@@ -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
@@ -99,7 +99,7 @@ const char *silc_get_time(SilcUInt32 timeval)
 
 /* Converts string to capital characters. */
 
-bool silc_to_upper(const char *string, char *dest, SilcUInt32 dest_size)
+SilcBool silc_to_upper(const char *string, char *dest, SilcUInt32 dest_size)
 {
   int i;
 
@@ -114,7 +114,7 @@ bool silc_to_upper(const char *string, char *dest, SilcUInt32 dest_size)
 
 /* Converts string to lower letter characters. */
 
-bool silc_to_lower(const char *string, char *dest, SilcUInt32 dest_size)
+SilcBool silc_to_lower(const char *string, char *dest, SilcUInt32 dest_size)
 {
   int i;
 
@@ -129,37 +129,47 @@ bool silc_to_lower(const char *string, char *dest, SilcUInt32 dest_size)
 
 /* Parse userfqdn string which is in user@fqdn format. */
 
-bool 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);
@@ -596,7 +606,7 @@ SilcUInt32 silc_hash_public_key(void *key, void *user_context)
 /* Compares two strings. It may be used as SilcHashTable comparison
    function. */
 
-bool silc_hash_string_compare(void *key1, void *key2, void *user_context)
+SilcBool silc_hash_string_compare(void *key1, void *key2, void *user_context)
 {
   return !strcasecmp((char *)key1, (char *)key2);
 }
@@ -605,7 +615,7 @@ bool silc_hash_string_compare(void *key1, void *key2, void *user_context)
    The Client ID's compares only the hash of the Client ID not any other
    part of the Client ID. Other ID's are fully compared. */
 
-bool silc_hash_id_compare(void *key1, void *key2, void *user_context)
+SilcBool silc_hash_id_compare(void *key1, void *key2, void *user_context)
 {
   SilcIdType id_type = (SilcIdType)SILC_PTR_TO_32(user_context);
   return (id_type == SILC_ID_CLIENT ?
@@ -613,16 +623,24 @@ bool 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. */
 
-bool silc_hash_client_id_compare(void *key1, void *key2, void *user_context)
+SilcBool silc_hash_client_id_compare(void *key1, void *key2, void *user_context)
 {
   return SILC_ID_COMPARE_TYPE(key1, key2, SILC_ID_CLIENT);
 }
 
 /* Compares binary data. May be used as SilcHashTable comparison function. */
 
-bool silc_hash_data_compare(void *key1, void *key2, void *user_context)
+SilcBool silc_hash_data_compare(void *key1, void *key2, void *user_context)
 {
   SilcUInt32 len = SILC_PTR_TO_32(user_context);
   return !memcmp(key1, key2, len);
@@ -630,19 +648,19 @@ bool silc_hash_data_compare(void *key1, void *key2, void *user_context)
 
 /* Compares UTF-8 string. */
 
-bool silc_hash_utf8_compare(void *key1, void *key2, void *user_context)
+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);
 }
 
 /* Compares two SILC Public keys. It may be used as SilcHashTable
    comparison function. */
 
-bool silc_hash_public_key_compare(void *key1, void *key2, void *user_context)
+SilcBool silc_hash_public_key_compare(void *key1, void *key2, void *user_context)
 {
   return silc_pkcs_public_key_compare(key1, key2);
 }
@@ -801,7 +819,7 @@ char *silc_fingerprint(const unsigned char *data, SilcUInt32 data_len)
 
 /* Return TRUE if the `data' is ASCII string. */
 
-bool silc_string_is_ascii(const unsigned char *data, SilcUInt32 data_len)
+SilcBool silc_string_is_ascii(const unsigned char *data, SilcUInt32 data_len)
 {
   int i;
 
@@ -815,12 +833,12 @@ bool silc_string_is_ascii(const unsigned char *data, SilcUInt32 data_len)
 
 /* Parses SILC protocol style version string. */
 
-bool silc_parse_version_string(const char *version,
-                              SilcUInt32 *protocol_version,
-                              char **protocol_version_string,
-                              SilcUInt32 *software_version,
-                              char **software_version_string,
-                              char **vendor_version)
+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)
 {
   char *cp, buf[32];
   int maj = 0, min = 0;
@@ -911,7 +929,7 @@ SilcUInt32 silc_version_to_num(const char *version)
 
 /* Displays input prompt on command line and takes input data from user */
 
-char *silc_get_input(const char *prompt, bool echo_off)
+char *silc_get_input(const char *prompt, SilcBool echo_off)
 {
 #ifdef SILC_UNIX
   int fd;
@@ -1000,7 +1018,7 @@ char *silc_get_input(const char *prompt, bool echo_off)
 
 /* Return mode list */
 
-bool silc_get_mode_list(SilcBuffer mode_list, SilcUInt32 mode_list_count,
+SilcBool silc_get_mode_list(SilcBuffer mode_list, SilcUInt32 mode_list_count,
                        SilcUInt32 **list)
 {
   int i;
@@ -1190,7 +1208,7 @@ const char *silc_get_command_name(unsigned char command)
 
 /* Return TRUE if `smaller' is smaller than `bigger'. */
 
-bool silc_compare_timeval(struct timeval *smaller,
+SilcBool silc_compare_timeval(struct timeval *smaller,
                          struct timeval *bigger)
 {
   if ((smaller->tv_sec < bigger->tv_sec) ||