Moved around some functions.
authorPekka Riikonen <priikone@silcnet.org>
Sun, 22 Oct 2006 10:31:44 +0000 (10:31 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sun, 22 Oct 2006 10:31:44 +0000 (10:31 +0000)
lib/silcapputil/silcapputil.c
lib/silcapputil/silcapputil.h
lib/silcutil/silcstrutil.c
lib/silcutil/silcstrutil.h
lib/silcutil/silcutil.c
lib/silcutil/silcutil.h
lib/silcutil/unix/silcunixutil.c
lib/silcutil/win32/silcwin32util.c

index fe0ae5400d5e76c3207c63d93b8fc4d48ae6ad4c..39fce81cacab76f343281ed4122d1bef8c3f7a8d 100644 (file)
@@ -509,3 +509,532 @@ SilcBool silc_channel_name_verify(const unsigned char *identifier,
 
   return TRUE;
 }
+
+/* Return mode list */
+
+SilcBool silc_get_mode_list(SilcBuffer mode_list, SilcUInt32 mode_list_count,
+                           SilcUInt32 **list)
+{
+  int i;
+
+  if (silc_buffer_len(mode_list) / 4 != mode_list_count)
+    return FALSE;
+
+  *list = silc_calloc(mode_list_count, sizeof(**list));
+
+  for (i = 0; i < mode_list_count; i++) {
+    SILC_GET32_MSB((*list)[i], mode_list->data);
+    silc_buffer_pull(mode_list, 4);
+  }
+
+  silc_buffer_push(mode_list, mode_list->data - mode_list->head);
+
+  return TRUE;
+}
+
+/* Status message structure. Messages are defined below. */
+typedef struct {
+  SilcStatus status;
+  const char *message;
+} SilcStatusMessage;
+
+#define STAT(x) SILC_STATUS_ERR_##x
+static const SilcStatusMessage silc_status_messages[] = {
+
+  { STAT(NO_SUCH_NICK),      "There was no such nickname" },
+  { STAT(NO_SUCH_CHANNEL),   "There was no such channel" },
+  { STAT(NO_SUCH_SERVER),    "There was no such server" },
+  { STAT(INCOMPLETE_INFORMATION),  "Incomplete registration information" },
+  { STAT(NO_RECIPIENT),      "No recipient given" },
+  { STAT(UNKNOWN_COMMAND),   "Unknown command" },
+  { STAT(WILDCARDS),         "Wilcrads not allowed" },
+  { STAT(NO_CLIENT_ID),      "No Client ID given" },
+  { STAT(NO_CHANNEL_ID),     "No Channel ID given" },
+  { STAT(NO_SERVER_ID),      "No Server ID given" },
+  { STAT(BAD_CLIENT_ID),     "Bad Client ID" },
+  { STAT(BAD_CHANNEL_ID),    "Bad Channel ID" },
+  { STAT(NO_SUCH_CLIENT_ID), "There is no such client" },
+  { STAT(NO_SUCH_CHANNEL_ID),"There is no such channel" },
+  { STAT(NICKNAME_IN_USE),   "Nickname already exists" },
+  { STAT(NOT_ON_CHANNEL),    "You are not on that channel" },
+  { STAT(USER_NOT_ON_CHANNEL),"They are not on the channel" },
+  { STAT(USER_ON_CHANNEL),   "User already on the channel" },
+  { STAT(NOT_REGISTERED),    "You have not registered" },
+  { STAT(NOT_ENOUGH_PARAMS), "Not enough parameters" },
+  { STAT(TOO_MANY_PARAMS),   "Too many parameters" },
+  { STAT(PERM_DENIED),       "Permission denied" },
+  { STAT(BANNED_FROM_SERVER),"You are not allowed to connect" },
+  { STAT(BAD_PASSWORD),      "Cannot join channel. Incorrect password" },
+  { STAT(CHANNEL_IS_FULL),   "Cannot join channel. Channel is full" },
+  { STAT(NOT_INVITED),     "Cannot join channel. You have not been invited" },
+  { STAT(BANNED_FROM_CHANNEL), "Cannot join channel. You have been banned" },
+  { STAT(UNKNOWN_MODE),    "Unknown mode" },
+  { STAT(NOT_YOU),         "Cannot change mode for other users" },
+  { STAT(NO_CHANNEL_PRIV), "Permission denied. You are not channel operator" },
+  { STAT(NO_CHANNEL_FOPRIV),"Permission denied. You are not channel founder" },
+  { STAT(NO_SERVER_PRIV),  "Permission denied. You are not server operator" },
+  { STAT(NO_ROUTER_PRIV),  "Permission denied. You are not SILC operator" },
+  { STAT(BAD_NICKNAME),    "Bad nickname" },
+  { STAT(BAD_CHANNEL),     "Bad channel name" },
+  { STAT(AUTH_FAILED),     "Authentication failed" },
+  { STAT(UNKNOWN_ALGORITHM), "Unsupported algorithm" },
+  { STAT(NO_SUCH_SERVER_ID), "No such Server ID" },
+  { STAT(RESOURCE_LIMIT), "No more free resources" },
+  { STAT(NO_SUCH_SERVICE), "Service doesn't exist" },
+  { STAT(NOT_AUTHENTICATED), "You have not been authenticated" },
+  { STAT(BAD_SERVER_ID), "Server ID is not valid" },
+  { STAT(KEY_EXCHANGE_FAILED), "Key exchange failed" },
+  { STAT(BAD_VERSION), "Bad version" },
+  { STAT(TIMEDOUT), "Service timed out" },
+  { STAT(UNSUPPORTED_PUBLIC_KEY), "Unsupported public key type" },
+  { STAT(OPERATION_ALLOWED), "Operation is not allowed" },
+  { STAT(BAD_SERVER), "Bad server name" },
+  { STAT(BAD_USERNAME), "Bad user name" },
+
+  { 0, NULL }
+};
+
+/* Returns status message string */
+
+const char *silc_get_status_message(unsigned char status)
+{
+  int i;
+
+  for (i = 0; silc_status_messages[i].message; i++) {
+    if (silc_status_messages[i].status == status)
+      break;
+  }
+
+  if (silc_status_messages[i].message == NULL)
+    return "";
+
+  return silc_status_messages[i].message;
+}
+
+static const char *packet_name[] = {
+  "NONE",
+  "DISCONNECT",
+  "SUCCESS",
+  "FAILURE",
+  "REJECT",
+  "NOTIFY",
+  "ERROR",
+  "CHANNEL MESSAGE",
+  "CHANNEL KEY",
+  "PRIVATE MESSAGE",
+  "PRIVATE MESSAGE KEY",
+  "COMMAND",
+  "COMMAND REPLY",
+  "KEY EXCHANGE",
+  "KEY EXCHANGE 1",
+  "KEY EXCHANGE 2",
+  "CONNECTION AUTH REQUEST",
+  "CONNECTION AUTH",
+  "NEW ID",
+  "NEW CLIENT",
+  "NEW SERVER",
+  "NEW CHANNEL",
+  "REKEY",
+  "REKEY_DONE",
+  "HEARTBEAT",
+  "KEY AGREEMENT",
+  "RESUME ROUTER",
+  "FTP",
+  "RESUME CLIENT",
+};
+
+/* Returns packet type name */
+
+const char *silc_get_packet_name(unsigned char type)
+{
+  if (type >= SILC_PACKET_MAX)
+    return "RESERVED";
+  if (type >= SILC_PACKET_PRIVATE)
+    return "PRIVATE RANGE";
+  if (type > (sizeof(packet_name) / sizeof(*packet_name)))
+    return "UNKNOWN";
+  return packet_name[type];
+}
+
+static const char *command_name[] = {
+  "NONE",
+  "WHOIS",
+  "WHOWAS",
+  "IDENTIFY",
+  "NICK",
+  "LIST",
+  "TOPIC",
+  "INVITE",
+  "QUIT",
+  "KILL",
+  "INFO",
+  "STATS",
+  "PING",
+  "OPER",
+  "JOIN",
+  "MOTD",
+  "UMODE",
+  "CMODE",
+  "CUMODE",
+  "KICK",
+  "BAN",
+  "DETACH",
+  "WATCH",
+  "SILCOPER",
+  "LEAVE",
+  "USERS",
+  "GETKEY",
+  "SERVICE",
+};
+
+/* Returns command name */
+
+const char *silc_get_command_name(unsigned char command)
+{
+  if (command >= SILC_COMMAND_RESERVED)
+    return "RESERVED";
+  if (command >= SILC_COMMAND_PRIVATE)
+    return "PRIVATE RANGE";
+  if (command > (sizeof(command_name) / sizeof(*command_name)))
+    return "UNKNOWN";
+  return command_name[command];
+}
+
+/* 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)
+{
+  char *cp, buf[32];
+  int maj = 0, min = 0;
+
+  if (!strstr(version, "SILC-"))
+    return FALSE;
+
+  cp = (char *)version + 5;
+  if (!cp)
+    return FALSE;
+
+  /* Take protocol version */
+
+  maj = atoi(cp);
+  if (!strchr(cp, '.'))
+    return FALSE;
+  cp = strchr(cp, '.') + 1;
+  if (!cp || !(*cp))
+    return FALSE;
+  min = atoi(cp);
+
+  memset(buf, 0, sizeof(buf));
+  snprintf(buf, sizeof(buf) - 1, "%d%d", maj, min);
+  if (protocol_version)
+    *protocol_version = atoi(buf);
+  memset(buf, 0, sizeof(buf));
+  snprintf(buf, sizeof(buf) - 1, "%d.%d", maj, min);
+  if (protocol_version_string)
+    *protocol_version_string = strdup(buf);
+
+  /* Take software version */
+
+  maj = 0;
+  min = 0;
+  if (!strchr(cp, '-'))
+    return FALSE;
+  cp = strchr(cp, '-') + 1;
+  if (!cp || !(*cp))
+    return FALSE;
+
+  maj = atoi(cp);
+  if (strchr(cp, '.')) {
+    cp = strchr(cp, '.') + 1;
+    if (cp && *cp)
+      min = atoi(cp);
+  }
+
+  memset(buf, 0, sizeof(buf));
+  snprintf(buf, sizeof(buf) - 1, "%d%d", maj, min);
+  if (software_version)
+    *software_version = atoi(buf);
+  memset(buf, 0, sizeof(buf));
+  snprintf(buf, sizeof(buf) - 1, "%d.%d", maj, min);
+  if (software_version_string)
+    *software_version_string = strdup(buf);
+
+  /* Take vendor string */
+
+  if (strchr(cp, '.')) {
+    cp = strchr(cp, '.') + 1;
+    if (cp && *cp && vendor_version)
+      *vendor_version = strdup(cp);
+  }
+
+  return TRUE;
+}
+
+/* Converts version string x.x into number representation. */
+
+SilcUInt32 silc_version_to_num(const char *version)
+{
+  int maj = 0, min = 0;
+  char *cp, buf[32];
+
+  if (!version)
+    return 0;
+
+  cp = (char *)version;
+  maj = atoi(cp);
+  cp = strchr(cp, '.');
+  if (cp)
+    min = atoi(cp + 1);
+
+  memset(buf, 0, sizeof(buf));
+  snprintf(buf, sizeof(buf) - 1, "%d%d", maj, min);
+  return (SilcUInt32)atoi(buf);
+}
+
+/* Parses mode mask and returns the mode as string. */
+
+char *silc_client_chmode(SilcUInt32 mode, const char *cipher, const char *hmac)
+{
+  char string[100];
+
+  if (!mode)
+    return NULL;
+
+  memset(string, 0, sizeof(string));
+
+  if (mode & SILC_CHANNEL_MODE_PRIVATE)
+    strncat(string, "p", 1);
+
+  if (mode & SILC_CHANNEL_MODE_SECRET)
+    strncat(string, "s", 1);
+
+  if (mode & SILC_CHANNEL_MODE_PRIVKEY)
+    strncat(string, "k", 1);
+
+  if (mode & SILC_CHANNEL_MODE_INVITE)
+    strncat(string, "i", 1);
+
+  if (mode & SILC_CHANNEL_MODE_TOPIC)
+    strncat(string, "t", 1);
+
+  if (mode & SILC_CHANNEL_MODE_ULIMIT)
+    strncat(string, "l", 1);
+
+  if (mode & SILC_CHANNEL_MODE_PASSPHRASE)
+    strncat(string, "a", 1);
+
+  if (mode & SILC_CHANNEL_MODE_FOUNDER_AUTH)
+    strncat(string, "f", 1);
+
+  if (mode & SILC_CHANNEL_MODE_CHANNEL_AUTH)
+    strncat(string, "C", 1);
+
+  if (mode & SILC_CHANNEL_MODE_SILENCE_USERS)
+    strncat(string, "m", 1);
+
+  if (mode & SILC_CHANNEL_MODE_SILENCE_OPERS)
+    strncat(string, "M", 1);
+
+  if (mode & SILC_CHANNEL_MODE_CIPHER)
+    strncat(string, "c", 1);
+
+  if (mode & SILC_CHANNEL_MODE_HMAC)
+    strncat(string, "h", 1);
+
+  if (mode & SILC_CHANNEL_MODE_CIPHER) {
+    if (strlen(cipher) + strlen(string) + 1< sizeof(string)) {
+      strncat(string, " ", 1);
+      strncat(string, cipher, strlen(cipher));
+    }
+  }
+
+  if (mode & SILC_CHANNEL_MODE_HMAC) {
+    if (strlen(hmac) + strlen(string) + 1< sizeof(string)) {
+      strncat(string, " ", 1);
+      strncat(string, hmac, strlen(hmac));
+    }
+  }
+
+  /* Rest of mode is ignored */
+
+  return strdup(string);
+}
+
+/* Parses channel user mode mask and returns te mode as string */
+
+char *silc_client_chumode(SilcUInt32 mode)
+{
+  char string[64];
+
+  if (!mode)
+    return NULL;
+
+  memset(string, 0, sizeof(string));
+
+  if (mode & SILC_CHANNEL_UMODE_CHANFO)
+    strncat(string, "f", 1);
+
+  if (mode & SILC_CHANNEL_UMODE_CHANOP)
+    strncat(string, "o", 1);
+
+  if (mode & SILC_CHANNEL_UMODE_BLOCK_MESSAGES)
+    strncat(string, "b", 1);
+
+  if (mode & SILC_CHANNEL_UMODE_BLOCK_MESSAGES_USERS)
+    strncat(string, "u", 1);
+
+  if (mode & SILC_CHANNEL_UMODE_BLOCK_MESSAGES_ROBOTS)
+    strncat(string, "r", 1);
+
+  if (mode & SILC_CHANNEL_UMODE_QUIET)
+    strncat(string, "q", 1);
+
+  return strdup(string);
+}
+
+/* Parses channel user mode and returns it as special mode character. */
+
+char *silc_client_chumode_char(SilcUInt32 mode)
+{
+  char string[64];
+
+  if (!mode)
+    return NULL;
+
+  memset(string, 0, sizeof(string));
+
+  if (mode & SILC_CHANNEL_UMODE_CHANFO)
+    strncat(string, "*", 1);
+
+  if (mode & SILC_CHANNEL_UMODE_CHANOP)
+    strncat(string, "@", 1);
+
+  if (mode & SILC_CHANNEL_UMODE_QUIET)
+    strncat(string, "&", 1);
+
+  return strdup(string);
+}
+
+/* Renders ID to suitable to print for example to log file. */
+
+static char rid[256];
+#define _PUT_STRING(__d__, __s__)                                      \
+do {                                                                   \
+  int __sp = sizeof(__d__) - 1 - strlen(__d__);                                \
+  if (__sp < strlen(__s__)) {                                          \
+    if (__sp)                                                          \
+      strncat(__d__, __s__, (sizeof(__d__) - 1) - strlen(__d__));      \
+  } else {                                                             \
+    strncat(__d__, __s__, strlen(__s__));                              \
+  }                                                                    \
+} while(0)
+
+char *silc_id_render(void *id, SilcIdType id_type)
+{
+  char tmp[100];
+  unsigned char tmps[2];
+  char *cp;
+
+  memset(rid, 0, sizeof(rid));
+  switch(id_type) {
+  case SILC_ID_SERVER:
+    {
+      SilcServerID *server_id = (SilcServerID *)id;
+      if (server_id->ip.data_len > 4) {
+#ifdef HAVE_IPV6
+       struct sockaddr_in6 ipv6;
+       memset(&ipv6, 0, sizeof(ipv6));
+       ipv6.sin6_family = AF_INET6;
+       memmove(&ipv6.sin6_addr, server_id->ip.data, sizeof(ipv6.sin6_addr));
+       if (!getnameinfo((struct sockaddr *)&ipv6, sizeof(ipv6),
+                        tmp, sizeof(tmp) - 1, NULL, 0, NI_NUMERICHOST))
+         _PUT_STRING(rid, tmp);
+#endif
+      } else {
+       struct in_addr ipv4;
+       memmove(&ipv4.s_addr, server_id->ip.data, 4);
+       cp = inet_ntoa(ipv4);
+       if (cp)
+         _PUT_STRING(rid, cp);
+      }
+
+      memset(tmp, 0, sizeof(tmp));
+      snprintf(tmp, sizeof(tmp) - 1, ",%d,", ntohs(server_id->port));
+      _PUT_STRING(rid, tmp);
+      SILC_PUT16_MSB(server_id->rnd, tmps);
+      memset(tmp, 0, sizeof(tmp));
+      snprintf(tmp, sizeof(tmp) - 1, "[%02x %02x]", tmps[0], tmps[1]);
+      _PUT_STRING(rid, tmp);
+    }
+    break;
+  case SILC_ID_CLIENT:
+    {
+      SilcClientID *client_id = (SilcClientID *)id;
+      if (client_id->ip.data_len > 4) {
+#ifdef HAVE_IPV6
+       struct sockaddr_in6 ipv6;
+       memset(&ipv6, 0, sizeof(ipv6));
+       ipv6.sin6_family = AF_INET6;
+       memmove(&ipv6.sin6_addr, client_id->ip.data, sizeof(ipv6.sin6_addr));
+       if (!getnameinfo((struct sockaddr *)&ipv6, sizeof(ipv6),
+                        tmp, sizeof(tmp) - 1, NULL, 0, NI_NUMERICHOST))
+         _PUT_STRING(rid, tmp);
+#endif
+      } else {
+       struct in_addr ipv4;
+       memmove(&ipv4.s_addr, client_id->ip.data, 4);
+       cp = inet_ntoa(ipv4);
+       if (cp)
+         _PUT_STRING(rid, cp);
+      }
+
+      memset(tmp, 0, sizeof(tmp));
+      snprintf(tmp, sizeof(tmp) - 1, ",%02x,", client_id->rnd);
+      _PUT_STRING(rid, tmp);
+      memset(tmp, 0, sizeof(tmp));
+      snprintf(tmp, sizeof(tmp) - 1, "[%02x %02x %02x %02x...]",
+              client_id->hash[0], client_id->hash[1],
+              client_id->hash[2], client_id->hash[3]);
+      _PUT_STRING(rid, tmp);
+    }
+    break;
+  case SILC_ID_CHANNEL:
+    {
+      SilcChannelID *channel_id = (SilcChannelID *)id;
+      if (channel_id->ip.data_len > 4) {
+#ifdef HAVE_IPV6
+       struct sockaddr_in6 ipv6;
+       memset(&ipv6, 0, sizeof(ipv6));
+       ipv6.sin6_family = AF_INET6;
+       memmove(&ipv6.sin6_addr, channel_id->ip.data, sizeof(ipv6.sin6_addr));
+       if (!getnameinfo((struct sockaddr *)&ipv6, sizeof(ipv6),
+                        tmp, sizeof(tmp) - 1, NULL, 0, NI_NUMERICHOST))
+         _PUT_STRING(rid, tmp);
+#endif
+      } else {
+       struct in_addr ipv4;
+       memmove(&ipv4.s_addr, channel_id->ip.data, 4);
+       cp = inet_ntoa(ipv4);
+       if (cp)
+         _PUT_STRING(rid, cp);
+      }
+
+      memset(tmp, 0, sizeof(tmp));
+      snprintf(tmp, sizeof(tmp) - 1, ",%d,", ntohs(channel_id->port));
+      _PUT_STRING(rid, tmp);
+      SILC_PUT16_MSB(channel_id->rnd, tmps);
+      memset(tmp, 0, sizeof(tmp));
+      snprintf(tmp, sizeof(tmp) - 1, "[%02x %02x]", tmps[0], tmps[1]);
+      _PUT_STRING(rid, tmp);
+    }
+    break;
+  }
+
+  return rid;
+}
+#undef _PUT_STRING
index 0519c133b7cc5349fe21c7b95c87d036c7a3e96f..3b0383586e761816604190476cdd06b65d6d405f 100644 (file)
@@ -17,7 +17,7 @@
 
 */
 
-/****h* silcutil/SILC Application Utilities
+/****h* silcapputil/SILC Application Utilities
  *
  * DESCRIPTION
  *
@@ -297,4 +297,152 @@ SilcBool silc_channel_name_verify(const unsigned char *identifier,
                                  SilcStringEncoding identifier_encoding,
                                  SilcUInt32 max_allowed_length);
 
+/****f* silcapputil/SilcAppUtil/silc_get_mode_list
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_get_mode_list(SilcBuffer mode_list,
+ *                                SilcUInt32 mode_list_count,
+ *                                SilcUInt32 **list);
+ *
+ * DESCRIPTION
+ *
+ *    Returns modes from list of 32 bit MSB first order values that are
+ *    encoded one after the other in the `mode_list' into the `list'
+ *    array.  The caller must free the returned list.  Return FALSE if
+ *    there is error parsing the list.
+ *
+ ***/
+SilcBool silc_get_mode_list(SilcBuffer mode_list, SilcUInt32 mode_list_count,
+                           SilcUInt32 **list);
+
+/****f* silcapputil/SilcAppUtil/silc_get_status_message
+ *
+ * SYNOPSIS
+ *
+ *    char *silc_get_status_message(SilcStatus status)
+ *
+ * DESCRIPTION
+ *
+ *    Returns status message string
+ *
+ ***/
+const char *silc_get_status_message(unsigned char status);
+
+/****f* silcapputil/SilcAppUtil/silc_get_packet_name
+ *
+ * SYNOPSIS
+ *
+ *    char *silc_get_packet_name(SilcPacketType type);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the name corresponding packet type `type'.
+ *
+ ***/
+const char *silc_get_packet_name(unsigned char type);
+
+/****f* silcapputil/SilcAppUtil/silc_get_command_name
+ *
+ * SYNOPSIS
+ *
+ *    char *silc_get_command_name(SilcCommand command);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the name corresponding SILC command `command'.
+ *
+ ***/
+const char *silc_get_command_name(unsigned char command);
+
+/****f* silcapputil/SilcAppUtil/silc_parse_version_string
+ *
+ * SYNOPSIS
+ *
+ *    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);
+ *
+ * DESCRIPTION
+ *
+ *    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);
+
+/****f* silcapputil/SilcAppUtil/silc_version_to_num
+ *
+ * SYNOPSIS
+ *
+ *    SilcUInt32 silc_version_to_num(const char *version);
+ *
+ * DESCRIPTION
+ *
+ *    Converts version string x.x into number representation.
+ *
+ ***/
+SilcUInt32 silc_version_to_num(const char *version);
+
+/****f* silcapputil/SilcAppUtil/silc_client_chmode
+ *
+ * SYNOPSIS
+ *
+ *    char *silc_client_chmode(SilcUInt32 mode, const char *cipher,
+ *                             const char *hmac);
+ *
+ * DESCRIPTION
+ *
+ *    Parses mode mask and returns the mode as string.
+ *
+ ***/
+char *silc_client_chmode(SilcUInt32 mode, const char *cipher,
+                        const char *hmac);
+
+/****f* silcapputil/SilcAppUtil/silc_client_chumode
+ *
+ * SYNOPSIS
+ *
+ *    char *silc_client_chumode(SilcUInt32 mode);
+ *
+ * DESCRIPTION
+ *
+ *    Parses channel user mode mask and returns te mode as string.
+ *
+ ***/
+char *silc_client_chumode(SilcUInt32 mode);
+
+/****f* silcapputil/SilcAppUtil/silc_client_chumode_char
+ *
+ * SYNOPSIS
+ *
+ *    char *silc_client_chumode_char(SilcUInt32 mode);
+ *
+ * DESCRIPTION
+ *
+ *    Parses channel user mode and returns it as special mode character.
+ *
+ ***/
+char *silc_client_chumode_char(SilcUInt32 mode);
+
+/****f* silcutil/SilcUtilAPI/silc_id_render
+ *
+ * SYNOPSIS
+ *
+ *    char *silc_id_render(void *id, SilcIdType id_type);
+ *
+ * DESCRIPTION
+ *
+ *    Renders ID to suitable to print for example to log file.
+ *
+ ***/
+char *silc_id_render(void *id, SilcIdType id_type);
+
 #endif /* SILCAPPUTIL_H */
index 614204dbde50666c6efa3b2eb0ff3904a47c27a9..8bec2fc7d54f99d0394f2a696471315bb7b3d912 100644 (file)
@@ -191,3 +191,76 @@ char *silc_strncat(char *dest, SilcUInt32 dest_size,
 
   return dest;
 }
+
+/* Compares two strings. Strings may include wildcards '*' and '?'.
+   Returns TRUE if strings match. */
+
+int silc_string_compare(char *string1, char *string2)
+{
+  int i;
+  int slen1;
+  int slen2;
+  char *tmpstr1, *tmpstr2;
+
+  if (!string1 || !string2)
+    return FALSE;
+
+  slen1 = strlen(string1);
+  slen2 = strlen(string2);
+
+  /* See if they are same already */
+  if (!strncmp(string1, string2, slen2) && slen2 == slen1)
+    return TRUE;
+
+  if (slen2 < slen1)
+    if (!strchr(string1, '*'))
+      return FALSE;
+
+  /* Take copies of the original strings as we will change them */
+  tmpstr1 = silc_calloc(slen1 + 1, sizeof(char));
+  memcpy(tmpstr1, string1, slen1);
+  tmpstr2 = silc_calloc(slen2 + 1, sizeof(char));
+  memcpy(tmpstr2, string2, slen2);
+
+  for (i = 0; i < slen1; i++) {
+
+    /* * wildcard. Only one * wildcard is possible. */
+    if (tmpstr1[i] == '*')
+      if (!strncmp(tmpstr1, tmpstr2, i)) {
+       memset(tmpstr2, 0, slen2);
+       strncpy(tmpstr2, tmpstr1, i);
+       break;
+      }
+
+    /* ? wildcard */
+    if (tmpstr1[i] == '?') {
+      if (!strncmp(tmpstr1, tmpstr2, i)) {
+       if (!(slen1 < i + 1))
+         if (tmpstr1[i + 1] != '?' &&
+             tmpstr1[i + 1] != tmpstr2[i + 1])
+           continue;
+
+       if (!(slen1 < slen2))
+         tmpstr2[i] = '?';
+      }
+    }
+  }
+
+  /* if using *, remove it */
+  if (strchr(tmpstr1, '*'))
+    *strchr(tmpstr1, '*') = 0;
+
+  if (!strcmp(tmpstr1, tmpstr2)) {
+    memset(tmpstr1, 0, slen1);
+    memset(tmpstr2, 0, slen2);
+    silc_free(tmpstr1);
+    silc_free(tmpstr2);
+    return TRUE;
+  }
+
+  memset(tmpstr1, 0, slen1);
+  memset(tmpstr2, 0, slen2);
+  silc_free(tmpstr1);
+  silc_free(tmpstr2);
+  return FALSE;
+}
index 9332d8daeec3ffff1d6c73da055c38581ff8e5ee..c223fe6b7c6e3dbf6dcb11c46521f38a6c44a2a3 100644 (file)
@@ -111,7 +111,7 @@ char *silc_pem_encode_file(unsigned char *data, SilcUInt32 data_len);
 unsigned char *silc_pem_decode(unsigned char *pem, SilcUInt32 pem_len,
                               SilcUInt32 *ret_len);
 
-/****f* silcutil/SilcStrUtilAPI/silc_strncat
+/****f* silcutil/SilcStrStrUtilAPI/silc_strncat
  *
  * SYNOPSIS
  *
@@ -128,4 +128,66 @@ unsigned char *silc_pem_decode(unsigned char *pem, SilcUInt32 pem_len,
 char *silc_strncat(char *dest, SilcUInt32 dest_size,
                   const char *src, SilcUInt32 src_len);
 
+/****f* silcutil/SilcStrUtilAPI/silc_string_regexify
+ *
+ * SYNOPSIS
+ *
+ *    char *silc_string_regexify(const char *string);
+ *
+ * DESCRIPTION
+ *
+ *    Inspects the `string' for wildcards and returns regex string that can
+ *    be used by the GNU regex library. A comma (`,') in the `string' means
+ *    that the string is list.
+ *
+ *    This function is system dependant.
+ *
+ ***/
+char *silc_string_regexify(const char *string);
+
+/****f* silcutil/SilcStrUtilAPI/silc_string_regex_match
+ *
+ * SYNOPSIS
+ *
+ *    int silc_string_regex_match(const char *regex, const char *string);
+ *
+ * DESCRIPTION
+ *
+ *    Matches the two strings and returns TRUE if the strings match.
+ *
+ *    This function is system dependant.
+ *
+ ***/
+int silc_string_regex_match(const char *regex, const char *string);
+
+/****f* silcutil/SilcStrUtilAPI/silc_string_match
+ *
+ * SYNOPSIS
+ *
+ *    int silc_string_match(const char *string1, const char *string2);
+ *
+ * DESCRIPTION
+ *
+ *    Do regex match to the two strings `string1' and `string2'. If the
+ *    `string2' matches the `string1' this returns TRUE.
+ *
+ *    This function is system dependant.
+ *
+ ***/
+int silc_string_match(const char *string1, const char *string2);
+
+/****f* silcutil/SilcStrUtilAPI/silc_string_compare
+ *
+ * SYNOPSIS
+ *
+ *    int silc_string_compare(char *string1, char *string2);
+ *
+ * DESCRIPTION
+ *
+ *    Compares two strings. Strings may include wildcards '*' and '?'.
+ *    Returns TRUE if strings match.
+ *
+ ***/
+int silc_string_compare(char *string1, char *string2);
+
 #endif /* SILCSTRUTIL_H */
index e0e664fa344e1415d78f5a10c5fc5e1ef12adbb6..aaa46cd19c665be7d4e7289dc7e3c7c8ab2a68aa 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2005 Pekka Riikonen
+  Copyright (C) 1997 - 2006 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -78,25 +78,6 @@ int silc_check_line(char *buf)
   return 0;
 }
 
-/* Returns time as string.  If the the `timeval' is non-zero that
-   value is returned as string.  If it is zero the current time of the
-   local machine is returned. */
-
-const char *silc_get_time(SilcUInt32 timeval)
-{
-  time_t curtime;
-  char *return_time;
-
-  if (!timeval)
-    curtime = time(NULL);
-  else
-    curtime = (time_t)timeval;
-  return_time = ctime(&curtime);
-  return_time[strlen(return_time) - 1] = '\0';
-
-  return (const char *)return_time;
-}
-
 /* Converts string to capital characters. */
 
 SilcBool silc_to_upper(const char *string, char *dest, SilcUInt32 dest_size)
@@ -263,198 +244,6 @@ char *silc_format(char *fmt, ...)
   return strdup(buf);
 }
 
-/* Renders ID to suitable to print for example to log file. */
-
-static char rid[256];
-#define _PUT_STRING(__d__, __s__)                                      \
-do {                                                                   \
-  int __sp = sizeof(__d__) - 1 - strlen(__d__);                                \
-  if (__sp < strlen(__s__)) {                                          \
-    if (__sp)                                                          \
-      strncat(__d__, __s__, (sizeof(__d__) - 1) - strlen(__d__));      \
-  } else {                                                             \
-    strncat(__d__, __s__, strlen(__s__));                              \
-  }                                                                    \
-} while(0)
-
-char *silc_id_render(void *id, SilcUInt16 type)
-{
-  char tmp[100];
-  unsigned char tmps[2];
-  char *cp;
-
-  memset(rid, 0, sizeof(rid));
-  switch(type) {
-  case SILC_ID_SERVER:
-    {
-      SilcServerID *server_id = (SilcServerID *)id;
-      if (server_id->ip.data_len > 4) {
-#ifdef HAVE_IPV6
-       struct sockaddr_in6 ipv6;
-       memset(&ipv6, 0, sizeof(ipv6));
-       ipv6.sin6_family = AF_INET6;
-       memmove(&ipv6.sin6_addr, server_id->ip.data, sizeof(ipv6.sin6_addr));
-       if (!getnameinfo((struct sockaddr *)&ipv6, sizeof(ipv6),
-                        tmp, sizeof(tmp) - 1, NULL, 0, NI_NUMERICHOST))
-         _PUT_STRING(rid, tmp);
-#endif
-      } else {
-       struct in_addr ipv4;
-       memmove(&ipv4.s_addr, server_id->ip.data, 4);
-       cp = inet_ntoa(ipv4);
-       if (cp)
-         _PUT_STRING(rid, cp);
-      }
-
-      memset(tmp, 0, sizeof(tmp));
-      snprintf(tmp, sizeof(tmp) - 1, ",%d,", ntohs(server_id->port));
-      _PUT_STRING(rid, tmp);
-      SILC_PUT16_MSB(server_id->rnd, tmps);
-      memset(tmp, 0, sizeof(tmp));
-      snprintf(tmp, sizeof(tmp) - 1, "[%02x %02x]", tmps[0], tmps[1]);
-      _PUT_STRING(rid, tmp);
-    }
-    break;
-  case SILC_ID_CLIENT:
-    {
-      SilcClientID *client_id = (SilcClientID *)id;
-      if (client_id->ip.data_len > 4) {
-#ifdef HAVE_IPV6
-       struct sockaddr_in6 ipv6;
-       memset(&ipv6, 0, sizeof(ipv6));
-       ipv6.sin6_family = AF_INET6;
-       memmove(&ipv6.sin6_addr, client_id->ip.data, sizeof(ipv6.sin6_addr));
-       if (!getnameinfo((struct sockaddr *)&ipv6, sizeof(ipv6),
-                        tmp, sizeof(tmp) - 1, NULL, 0, NI_NUMERICHOST))
-         _PUT_STRING(rid, tmp);
-#endif
-      } else {
-       struct in_addr ipv4;
-       memmove(&ipv4.s_addr, client_id->ip.data, 4);
-       cp = inet_ntoa(ipv4);
-       if (cp)
-         _PUT_STRING(rid, cp);
-      }
-
-      memset(tmp, 0, sizeof(tmp));
-      snprintf(tmp, sizeof(tmp) - 1, ",%02x,", client_id->rnd);
-      _PUT_STRING(rid, tmp);
-      memset(tmp, 0, sizeof(tmp));
-      snprintf(tmp, sizeof(tmp) - 1, "[%02x %02x %02x %02x...]",
-              client_id->hash[0], client_id->hash[1],
-              client_id->hash[2], client_id->hash[3]);
-      _PUT_STRING(rid, tmp);
-    }
-    break;
-  case SILC_ID_CHANNEL:
-    {
-      SilcChannelID *channel_id = (SilcChannelID *)id;
-      if (channel_id->ip.data_len > 4) {
-#ifdef HAVE_IPV6
-       struct sockaddr_in6 ipv6;
-       memset(&ipv6, 0, sizeof(ipv6));
-       ipv6.sin6_family = AF_INET6;
-       memmove(&ipv6.sin6_addr, channel_id->ip.data, sizeof(ipv6.sin6_addr));
-       if (!getnameinfo((struct sockaddr *)&ipv6, sizeof(ipv6),
-                        tmp, sizeof(tmp) - 1, NULL, 0, NI_NUMERICHOST))
-         _PUT_STRING(rid, tmp);
-#endif
-      } else {
-       struct in_addr ipv4;
-       memmove(&ipv4.s_addr, channel_id->ip.data, 4);
-       cp = inet_ntoa(ipv4);
-       if (cp)
-         _PUT_STRING(rid, cp);
-      }
-
-      memset(tmp, 0, sizeof(tmp));
-      snprintf(tmp, sizeof(tmp) - 1, ",%d,", ntohs(channel_id->port));
-      _PUT_STRING(rid, tmp);
-      SILC_PUT16_MSB(channel_id->rnd, tmps);
-      memset(tmp, 0, sizeof(tmp));
-      snprintf(tmp, sizeof(tmp) - 1, "[%02x %02x]", tmps[0], tmps[1]);
-      _PUT_STRING(rid, tmp);
-    }
-    break;
-  }
-
-  return rid;
-}
-#undef _PUT_STRING
-
-/* Compares two strings. Strings may include wildcards '*' and '?'.
-   Returns TRUE if strings match. */
-
-int silc_string_compare(char *string1, char *string2)
-{
-  int i;
-  int slen1;
-  int slen2;
-  char *tmpstr1, *tmpstr2;
-
-  if (!string1 || !string2)
-    return FALSE;
-
-  slen1 = strlen(string1);
-  slen2 = strlen(string2);
-
-  /* See if they are same already */
-  if (!strncmp(string1, string2, slen2) && slen2 == slen1)
-    return TRUE;
-
-  if (slen2 < slen1)
-    if (!strchr(string1, '*'))
-      return FALSE;
-
-  /* Take copies of the original strings as we will change them */
-  tmpstr1 = silc_calloc(slen1 + 1, sizeof(char));
-  memcpy(tmpstr1, string1, slen1);
-  tmpstr2 = silc_calloc(slen2 + 1, sizeof(char));
-  memcpy(tmpstr2, string2, slen2);
-
-  for (i = 0; i < slen1; i++) {
-
-    /* * wildcard. Only one * wildcard is possible. */
-    if (tmpstr1[i] == '*')
-      if (!strncmp(tmpstr1, tmpstr2, i)) {
-       memset(tmpstr2, 0, slen2);
-       strncpy(tmpstr2, tmpstr1, i);
-       break;
-      }
-
-    /* ? wildcard */
-    if (tmpstr1[i] == '?') {
-      if (!strncmp(tmpstr1, tmpstr2, i)) {
-       if (!(slen1 < i + 1))
-         if (tmpstr1[i + 1] != '?' &&
-             tmpstr1[i + 1] != tmpstr2[i + 1])
-           continue;
-
-       if (!(slen1 < slen2))
-         tmpstr2[i] = '?';
-      }
-    }
-  }
-
-  /* if using *, remove it */
-  if (strchr(tmpstr1, '*'))
-    *strchr(tmpstr1, '*') = 0;
-
-  if (!strcmp(tmpstr1, tmpstr2)) {
-    memset(tmpstr1, 0, slen1);
-    memset(tmpstr2, 0, slen2);
-    silc_free(tmpstr1);
-    silc_free(tmpstr2);
-    return TRUE;
-  }
-
-  memset(tmpstr1, 0, slen1);
-  memset(tmpstr2, 0, slen2);
-  silc_free(tmpstr1);
-  silc_free(tmpstr2);
-  return FALSE;
-}
-
 /* Basic has function to hash strings. May be used with the SilcHashTable.
    Note that this lowers the characters of the string (with tolower()) so
    this is used usually with nicknames, channel and server names to provide
@@ -676,130 +465,6 @@ SilcBool silc_hash_public_key_compare(void *key1, void *key2,
   return silc_pkcs_public_key_compare(key1, key2);
 }
 
-/* Parses mode mask and returns the mode as string. */
-
-char *silc_client_chmode(SilcUInt32 mode, const char *cipher, const char *hmac)
-{
-  char string[100];
-
-  if (!mode)
-    return NULL;
-
-  memset(string, 0, sizeof(string));
-
-  if (mode & SILC_CHANNEL_MODE_PRIVATE)
-    strncat(string, "p", 1);
-
-  if (mode & SILC_CHANNEL_MODE_SECRET)
-    strncat(string, "s", 1);
-
-  if (mode & SILC_CHANNEL_MODE_PRIVKEY)
-    strncat(string, "k", 1);
-
-  if (mode & SILC_CHANNEL_MODE_INVITE)
-    strncat(string, "i", 1);
-
-  if (mode & SILC_CHANNEL_MODE_TOPIC)
-    strncat(string, "t", 1);
-
-  if (mode & SILC_CHANNEL_MODE_ULIMIT)
-    strncat(string, "l", 1);
-
-  if (mode & SILC_CHANNEL_MODE_PASSPHRASE)
-    strncat(string, "a", 1);
-
-  if (mode & SILC_CHANNEL_MODE_FOUNDER_AUTH)
-    strncat(string, "f", 1);
-
-  if (mode & SILC_CHANNEL_MODE_CHANNEL_AUTH)
-    strncat(string, "C", 1);
-
-  if (mode & SILC_CHANNEL_MODE_SILENCE_USERS)
-    strncat(string, "m", 1);
-
-  if (mode & SILC_CHANNEL_MODE_SILENCE_OPERS)
-    strncat(string, "M", 1);
-
-  if (mode & SILC_CHANNEL_MODE_CIPHER)
-    strncat(string, "c", 1);
-
-  if (mode & SILC_CHANNEL_MODE_HMAC)
-    strncat(string, "h", 1);
-
-  if (mode & SILC_CHANNEL_MODE_CIPHER) {
-    if (strlen(cipher) + strlen(string) + 1< sizeof(string)) {
-      strncat(string, " ", 1);
-      strncat(string, cipher, strlen(cipher));
-    }
-  }
-
-  if (mode & SILC_CHANNEL_MODE_HMAC) {
-    if (strlen(hmac) + strlen(string) + 1< sizeof(string)) {
-      strncat(string, " ", 1);
-      strncat(string, hmac, strlen(hmac));
-    }
-  }
-
-  /* Rest of mode is ignored */
-
-  return strdup(string);
-}
-
-/* Parses channel user mode mask and returns te mode as string */
-
-char *silc_client_chumode(SilcUInt32 mode)
-{
-  char string[64];
-
-  if (!mode)
-    return NULL;
-
-  memset(string, 0, sizeof(string));
-
-  if (mode & SILC_CHANNEL_UMODE_CHANFO)
-    strncat(string, "f", 1);
-
-  if (mode & SILC_CHANNEL_UMODE_CHANOP)
-    strncat(string, "o", 1);
-
-  if (mode & SILC_CHANNEL_UMODE_BLOCK_MESSAGES)
-    strncat(string, "b", 1);
-
-  if (mode & SILC_CHANNEL_UMODE_BLOCK_MESSAGES_USERS)
-    strncat(string, "u", 1);
-
-  if (mode & SILC_CHANNEL_UMODE_BLOCK_MESSAGES_ROBOTS)
-    strncat(string, "r", 1);
-
-  if (mode & SILC_CHANNEL_UMODE_QUIET)
-    strncat(string, "q", 1);
-
-  return strdup(string);
-}
-
-/* Parses channel user mode and returns it as special mode character. */
-
-char *silc_client_chumode_char(SilcUInt32 mode)
-{
-  char string[64];
-
-  if (!mode)
-    return NULL;
-
-  memset(string, 0, sizeof(string));
-
-  if (mode & SILC_CHANNEL_UMODE_CHANFO)
-    strncat(string, "*", 1);
-
-  if (mode & SILC_CHANNEL_UMODE_CHANOP)
-    strncat(string, "@", 1);
-
-  if (mode & SILC_CHANNEL_UMODE_QUIET)
-    strncat(string, "&", 1);
-
-  return strdup(string);
-}
-
 /* Creates fingerprint from data, usually used with SHA1 digests */
 
 char *silc_fingerprint(const unsigned char *data, SilcUInt32 data_len)
@@ -842,102 +507,6 @@ SilcBool silc_string_is_ascii(const unsigned char *data, SilcUInt32 data_len)
   return TRUE;
 }
 
-/* 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)
-{
-  char *cp, buf[32];
-  int maj = 0, min = 0;
-
-  if (!strstr(version, "SILC-"))
-    return FALSE;
-
-  cp = (char *)version + 5;
-  if (!cp)
-    return FALSE;
-
-  /* Take protocol version */
-
-  maj = atoi(cp);
-  if (!strchr(cp, '.'))
-    return FALSE;
-  cp = strchr(cp, '.') + 1;
-  if (!cp || !(*cp))
-    return FALSE;
-  min = atoi(cp);
-
-  memset(buf, 0, sizeof(buf));
-  snprintf(buf, sizeof(buf) - 1, "%d%d", maj, min);
-  if (protocol_version)
-    *protocol_version = atoi(buf);
-  memset(buf, 0, sizeof(buf));
-  snprintf(buf, sizeof(buf) - 1, "%d.%d", maj, min);
-  if (protocol_version_string)
-    *protocol_version_string = strdup(buf);
-
-  /* Take software version */
-
-  maj = 0;
-  min = 0;
-  if (!strchr(cp, '-'))
-    return FALSE;
-  cp = strchr(cp, '-') + 1;
-  if (!cp || !(*cp))
-    return FALSE;
-
-  maj = atoi(cp);
-  if (strchr(cp, '.')) {
-    cp = strchr(cp, '.') + 1;
-    if (cp && *cp)
-      min = atoi(cp);
-  }
-
-  memset(buf, 0, sizeof(buf));
-  snprintf(buf, sizeof(buf) - 1, "%d%d", maj, min);
-  if (software_version)
-    *software_version = atoi(buf);
-  memset(buf, 0, sizeof(buf));
-  snprintf(buf, sizeof(buf) - 1, "%d.%d", maj, min);
-  if (software_version_string)
-    *software_version_string = strdup(buf);
-
-  /* Take vendor string */
-
-  if (strchr(cp, '.')) {
-    cp = strchr(cp, '.') + 1;
-    if (cp && *cp && vendor_version)
-      *vendor_version = strdup(cp);
-  }
-
-  return TRUE;
-}
-
-/* Converts version string x.x into number representation. */
-
-SilcUInt32 silc_version_to_num(const char *version)
-{
-  int maj = 0, min = 0;
-  char *cp, buf[32];
-
-  if (!version)
-    return 0;
-
-  cp = (char *)version;
-  maj = atoi(cp);
-  cp = strchr(cp, '.');
-  if (cp)
-    min = atoi(cp + 1);
-
-  memset(buf, 0, sizeof(buf));
-  snprintf(buf, sizeof(buf) - 1, "%d%d", maj, min);
-  return (SilcUInt32)atoi(buf);
-}
-
 /* Displays input prompt on command line and takes input data from user */
 
 char *silc_get_input(const char *prompt, SilcBool echo_off)
@@ -1027,205 +596,17 @@ char *silc_get_input(const char *prompt, SilcBool echo_off)
 #endif /* SILC_UNIX */
 }
 
-/* Return mode list */
+/* Copies va_list */
 
-SilcBool silc_get_mode_list(SilcBuffer mode_list, SilcUInt32 mode_list_count,
-                       SilcUInt32 **list)
+void silc_va_copy(va_list dest, va_list src)
 {
-  int i;
-
-  if (silc_buffer_len(mode_list) / 4 != mode_list_count)
-    return FALSE;
-
-  *list = silc_calloc(mode_list_count, sizeof(**list));
-
-  for (i = 0; i < mode_list_count; i++) {
-    SILC_GET32_MSB((*list)[i], mode_list->data);
-    silc_buffer_pull(mode_list, 4);
-  }
-
-  silc_buffer_push(mode_list, mode_list->data - mode_list->head);
-
-  return TRUE;
-}
-
-/* Status message structure. Messages are defined below. */
-typedef struct {
-  SilcStatus status;
-  const char *message;
-} SilcStatusMessage;
-
-#define STAT(x) SILC_STATUS_ERR_##x
-static const SilcStatusMessage silc_status_messages[] = {
-
-  { STAT(NO_SUCH_NICK),      "There was no such nickname" },
-  { STAT(NO_SUCH_CHANNEL),   "There was no such channel" },
-  { STAT(NO_SUCH_SERVER),    "There was no such server" },
-  { STAT(INCOMPLETE_INFORMATION),  "Incomplete registration information" },
-  { STAT(NO_RECIPIENT),      "No recipient given" },
-  { STAT(UNKNOWN_COMMAND),   "Unknown command" },
-  { STAT(WILDCARDS),         "Wilcrads not allowed" },
-  { STAT(NO_CLIENT_ID),      "No Client ID given" },
-  { STAT(NO_CHANNEL_ID),     "No Channel ID given" },
-  { STAT(NO_SERVER_ID),      "No Server ID given" },
-  { STAT(BAD_CLIENT_ID),     "Bad Client ID" },
-  { STAT(BAD_CHANNEL_ID),    "Bad Channel ID" },
-  { STAT(NO_SUCH_CLIENT_ID), "There is no such client" },
-  { STAT(NO_SUCH_CHANNEL_ID),"There is no such channel" },
-  { STAT(NICKNAME_IN_USE),   "Nickname already exists" },
-  { STAT(NOT_ON_CHANNEL),    "You are not on that channel" },
-  { STAT(USER_NOT_ON_CHANNEL),"They are not on the channel" },
-  { STAT(USER_ON_CHANNEL),   "User already on the channel" },
-  { STAT(NOT_REGISTERED),    "You have not registered" },
-  { STAT(NOT_ENOUGH_PARAMS), "Not enough parameters" },
-  { STAT(TOO_MANY_PARAMS),   "Too many parameters" },
-  { STAT(PERM_DENIED),       "Permission denied" },
-  { STAT(BANNED_FROM_SERVER),"You are not allowed to connect" },
-  { STAT(BAD_PASSWORD),      "Cannot join channel. Incorrect password" },
-  { STAT(CHANNEL_IS_FULL),   "Cannot join channel. Channel is full" },
-  { STAT(NOT_INVITED),     "Cannot join channel. You have not been invited" },
-  { STAT(BANNED_FROM_CHANNEL), "Cannot join channel. You have been banned" },
-  { STAT(UNKNOWN_MODE),    "Unknown mode" },
-  { STAT(NOT_YOU),         "Cannot change mode for other users" },
-  { STAT(NO_CHANNEL_PRIV), "Permission denied. You are not channel operator" },
-  { STAT(NO_CHANNEL_FOPRIV),"Permission denied. You are not channel founder" },
-  { STAT(NO_SERVER_PRIV),  "Permission denied. You are not server operator" },
-  { STAT(NO_ROUTER_PRIV),  "Permission denied. You are not SILC operator" },
-  { STAT(BAD_NICKNAME),    "Bad nickname" },
-  { STAT(BAD_CHANNEL),     "Bad channel name" },
-  { STAT(AUTH_FAILED),     "Authentication failed" },
-  { STAT(UNKNOWN_ALGORITHM), "Unsupported algorithm" },
-  { STAT(NO_SUCH_SERVER_ID), "No such Server ID" },
-  { STAT(RESOURCE_LIMIT), "No more free resources" },
-  { STAT(NO_SUCH_SERVICE), "Service doesn't exist" },
-  { STAT(NOT_AUTHENTICATED), "You have not been authenticated" },
-  { STAT(BAD_SERVER_ID), "Server ID is not valid" },
-  { STAT(KEY_EXCHANGE_FAILED), "Key exchange failed" },
-  { STAT(BAD_VERSION), "Bad version" },
-  { STAT(TIMEDOUT), "Service timed out" },
-  { STAT(UNSUPPORTED_PUBLIC_KEY), "Unsupported public key type" },
-  { STAT(OPERATION_ALLOWED), "Operation is not allowed" },
-  { STAT(BAD_SERVER), "Bad server name" },
-  { STAT(BAD_USERNAME), "Bad user name" },
-
-  { 0, NULL }
-};
-
-/* Returns status message string */
-
-const char *silc_get_status_message(unsigned char status)
-{
-  int i;
-
-  for (i = 0; silc_status_messages[i].message; i++) {
-    if (silc_status_messages[i].status == status)
-      break;
-  }
-
-  if (silc_status_messages[i].message == NULL)
-    return "";
-
-  return silc_status_messages[i].message;
-}
-
-static const char *packet_name[] = {
-  "NONE",
-  "DISCONNECT",
-  "SUCCESS",
-  "FAILURE",
-  "REJECT",
-  "NOTIFY",
-  "ERROR",
-  "CHANNEL MESSAGE",
-  "CHANNEL KEY",
-  "PRIVATE MESSAGE",
-  "PRIVATE MESSAGE KEY",
-  "COMMAND",
-  "COMMAND REPLY",
-  "KEY EXCHANGE",
-  "KEY EXCHANGE 1",
-  "KEY EXCHANGE 2",
-  "CONNECTION AUTH REQUEST",
-  "CONNECTION AUTH",
-  "NEW ID",
-  "NEW CLIENT",
-  "NEW SERVER",
-  "NEW CHANNEL",
-  "REKEY",
-  "REKEY_DONE",
-  "HEARTBEAT",
-  "KEY AGREEMENT",
-  "RESUME ROUTER",
-  "FTP",
-  "RESUME CLIENT",
-};
-
-/* Returns packet type name */
-
-const char *silc_get_packet_name(unsigned char type)
-{
-  if (type >= SILC_PACKET_MAX)
-    return "RESERVED";
-  if (type >= SILC_PACKET_PRIVATE)
-    return "PRIVATE RANGE";
-  if (type > (sizeof(packet_name) / sizeof(*packet_name)))
-    return "UNKNOWN";
-  return packet_name[type];
-}
-
-static const char *command_name[] = {
-  "NONE",
-  "WHOIS",
-  "WHOWAS",
-  "IDENTIFY",
-  "NICK",
-  "LIST",
-  "TOPIC",
-  "INVITE",
-  "QUIT",
-  "KILL",
-  "INFO",
-  "STATS",
-  "PING",
-  "OPER",
-  "JOIN",
-  "MOTD",
-  "UMODE",
-  "CMODE",
-  "CUMODE",
-  "KICK",
-  "BAN",
-  "DETACH",
-  "WATCH",
-  "SILCOPER",
-  "LEAVE",
-  "USERS",
-  "GETKEY",
-  "SERVICE",
-};
-
-/* Returns command name */
-
-const char *silc_get_command_name(unsigned char command)
-{
-  if (command >= SILC_COMMAND_RESERVED)
-    return "RESERVED";
-  if (command >= SILC_COMMAND_PRIVATE)
-    return "PRIVATE RANGE";
-  if (command > (sizeof(command_name) / sizeof(*command_name)))
-    return "UNKNOWN";
-  return command_name[command];
-}
-
-/* Return TRUE if `smaller' is smaller than `bigger'. */
-
-SilcBool silc_compare_timeval(struct timeval *smaller,
-                         struct timeval *bigger)
-{
-  if ((smaller->tv_sec < bigger->tv_sec) ||
-      ((smaller->tv_sec == bigger->tv_sec) &&
-       (smaller->tv_usec < bigger->tv_usec)))
-    return TRUE;
-
-  return FALSE;
+#if defined(HAVE_VA_COPY)
+  va_copy(dest, src);
+#elif defined(HAVE___VA_COPY)
+  __va_copy(dest, src);
+#elif defined(SILC_VA_COPY_ARRAY)
+  memmove(dest, src, sizeof(va_list));
+#else
+  dest = src;
+#endif
 }
index 2f7ca30687334e6bee77ce7ab83813a3c005b0b8..e6472582386c68a91469a58c9664ad447e2695a6 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2005 Pekka Riikonen
+  Copyright (C) 1997 - 2006 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -59,26 +59,12 @@ int silc_gets(char *dest, int destlen, const char *src, int srclen, int begin);
  ***/
 int silc_check_line(char *buf);
 
-/****f* silcutil/SilcUtilAPI/silc_get_time
- *
- * SYNOPSIS
- *
- *    const char *silc_get_time(SilcUInt32 timeval)
- *
- * DESCRIPTION
- *
- *    Returns time as string.  If the the `timeval' is non-zero that
- *    value is returned as string.  If it is zero the current time of the
- *    local machine is returned.
- *
- ***/
-const char *silc_get_time(SilcUInt32 timeval);
-
 /****f* silcutil/SilcUtilAPI/silc_to_upper
  *
  * SYNOPSIS
  *
- *    SilcBool silc_to_upper(const char *string, char *dest, SilcUInt32 dest_size);
+ *    SilcBool silc_to_upper(const char *string, char *dest,
+ *                           SilcUInt32 dest_size);
  *
  * DESCRIPTION
  *
@@ -91,7 +77,8 @@ SilcBool silc_to_upper(const char *string, char *dest, SilcUInt32 dest_size);
  *
  * SYNOPSIS
  *
- *    SilcBool silc_to_lower(const char *string, char *dest, SilcUInt32 dest_size);
+ *    SilcBool silc_to_lower(const char *string, char *dest,
+ *                           SilcUInt32 dest_size);
  *
  * DESCRIPTION
  *
@@ -159,33 +146,6 @@ void silc_parse_command_line(unsigned char *buffer,
  ***/
 char *silc_format(char *fmt, ...);
 
-/****f* silcutil/SilcUtilAPI/silc_id_render
- *
- * SYNOPSIS
- *
- *    char *silc_id_render(void *id, SilcUInt16 type);
- *
- * DESCRIPTION
- *
- *    Renders ID to suitable to print for example to log file.
- *
- ***/
-char *silc_id_render(void *id, SilcUInt16 type);
-
-/****f* silcutil/SilcUtilAPI/silc_string_compare
- *
- * SYNOPSIS
- *
- *    int silc_string_compare(char *string1, char *string2);
- *
- * DESCRIPTION
- *
- *    Compares two strings. Strings may include wildcards '*' and '?'.
- *    Returns TRUE if strings match.
- *
- ***/
-int silc_string_compare(char *string1, char *string2);
-
 /****f* silcutil/SilcUtilAPI/silc_hash_string
  *
  * SYNOPSIS
@@ -402,47 +362,6 @@ SilcBool silc_hash_utf8_compare(void *key1, void *key2, void *user_context);
 SilcBool silc_hash_public_key_compare(void *key1, void *key2,
                                      void *user_context);
 
-/****f* silcutil/SilcUtilAPI/silc_client_chmode
- *
- * SYNOPSIS
- *
- *    char *silc_client_chmode(SilcUInt32 mode, const char *cipher,
- *                             const char *hmac);
- *
- * DESCRIPTION
- *
- *    Parses mode mask and returns the mode as string.
- *
- ***/
-char *silc_client_chmode(SilcUInt32 mode, const char *cipher,
-                        const char *hmac);
-
-/****f* silcutil/SilcUtilAPI/silc_client_chumode
- *
- * SYNOPSIS
- *
- *    char *silc_client_chumode(SilcUInt32 mode);
- *
- * DESCRIPTION
- *
- *    Parses channel user mode mask and returns te mode as string.
- *
- ***/
-char *silc_client_chumode(SilcUInt32 mode);
-
-/****f* silcutil/SilcUtilAPI/silc_client_chumode_char
- *
- * SYNOPSIS
- *
- *    char *silc_client_chumode_char(SilcUInt32 mode);
- *
- * DESCRIPTION
- *
- *    Parses channel user mode and returns it as special mode character.
- *
- ***/
-char *silc_client_chumode_char(SilcUInt32 mode);
-
 /****f* silcutil/SilcUtilAPI/silc_fingerprint
  *
  * SYNOPSIS
@@ -471,42 +390,6 @@ char *silc_fingerprint(const unsigned char *data, SilcUInt32 data_len);
  ***/
 SilcBool silc_string_is_ascii(const unsigned char *data, SilcUInt32 data_len);
 
-/****f* silcutil/SilcUtilAPI/silc_parse_version_string
- *
- * SYNOPSIS
- *
- *    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);
- *
- * DESCRIPTION
- *
- *    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);
-
-/****f* silcutil/SilcUtilAPI/silc_version_to_num
- *
- * SYNOPSIS
- *
- *    SilcUInt32 silc_version_to_num(const char *version);
- *
- * DESCRIPTION
- *
- *    Converts version string x.x into number representation.
- *
- ***/
-SilcUInt32 silc_version_to_num(const char *version);
-
 /****f* silcutil/SilcUtilAPI/silc_get_input
  *
  * SYNOPSIS
@@ -522,84 +405,6 @@ char *silc_get_input(const char *prompt, SilcBool echo_off);
 
 /* System dependant prototypes */
 
-/****f* silcutil/SilcUtilAPI/silc_gettimeofday
- *
- * SYNOPSIS
- *
- *    int silc_gettimeofday(struct timeval *p);
- *
- * DESCRIPTION
- *
- *    Return current time to struct timeval.  This function is system
- *    dependant.  Returns 0 on success and -1 on error.
- *
- ***/
-int silc_gettimeofday(struct timeval *p);
-
-/****f* silcutil/SilcUtilAPI/silc_compare_timeval
- *
- * SYNOPSIS
- *
- *    SilcBool silc_compare_timeval(struct timeval *smaller,
- *                              struct timeval *bigger)
- *
- * DESCRIPTION
- *
- *    Compare two timeval structures and return TRUE if the first
- *    time value is smaller than the second time value.
- *
- ***/
-SilcBool silc_compare_timeval(struct timeval *smaller,
-                         struct timeval *bigger);
-
-/****f* silcutil/SilcUtilAPI/silc_string_regexify
- *
- * SYNOPSIS
- *
- *    char *silc_string_regexify(const char *string);
- *
- * DESCRIPTION
- *
- *    Inspects the `string' for wildcards and returns regex string that can
- *    be used by the GNU regex library. A comma (`,') in the `string' means
- *    that the string is list.
- *
- *    This function is system dependant.
- *
- ***/
-char *silc_string_regexify(const char *string);
-
-/****f* silcutil/SilcUtilAPI/silc_string_regex_match
- *
- * SYNOPSIS
- *
- *    int silc_string_regex_match(const char *regex, const char *string);
- *
- * DESCRIPTION
- *
- *    Matches the two strings and returns TRUE if the strings match.
- *
- *    This function is system dependant.
- *
- ***/
-int silc_string_regex_match(const char *regex, const char *string);
-
-/****f* silcutil/SilcUtilAPI/silc_string_match
- *
- * SYNOPSIS
- *
- *    int silc_string_match(const char *string1, const char *string2);
- *
- * DESCRIPTION
- *
- *    Do regex match to the two strings `string1' and `string2'. If the
- *    `string2' matches the `string1' this returns TRUE.
- *
- *    This function is system dependant.
- *
- ***/
-int silc_string_match(const char *string1, const char *string2);
-
 /****f* silcutil/SilcUtilAPI/silc_get_username
  *
  * SYNOPSIS
@@ -633,61 +438,20 @@ char *silc_get_username();
  ***/
 char *silc_get_real_name();
 
-/****f* silcutil/SilcUtilAPI/silc_get_mode_list
- *
- * SYNOPSIS
- *
- *    SilcBool silc_get_mode_list(SilcBuffer mode_list, SilcUInt32 mode_list_count,
- *                            SilcUInt32 **list);
- *
- * DESCRIPTION
- *
- *    Returns modes from list of 32 bit MSB first order values that are
- *    encoded one after the other in the `mode_list' into the `list'
- *    array.  The caller must free the returned list.  Return FALSE if
- *    there is error parsing the list.
- *
- ***/
-SilcBool silc_get_mode_list(SilcBuffer mode_list, SilcUInt32 mode_list_count,
-                       SilcUInt32 **list);
-
-/****f* silcutil/SilcUtilAPI/silc_get_status_message
- *
- * SYNOPSIS
- *
- *    char *silc_get_status_message(SilcStatus status)
- *
- * DESCRIPTION
- *
- *    Returns status message string
- *
- ***/
-const char *silc_get_status_message(unsigned char status);
-
-/****f* silcutil/SilcUtilAPI/silc_get_packet_name
- *
- * SYNOPSIS
- *
- *    char *silc_get_packet_name(SilcPacketType type);
- *
- * DESCRIPTION
- *
- *    Returns the name corresponding packet type `type'.
- *
- ***/
-const char *silc_get_packet_name(unsigned char type);
-
-/****f* silcutil/SilcUtilAPI/silc_get_command_name
+/****f* silcutil/SilcUtilAPI/silc_va_copy
  *
  * SYNOPSIS
  *
- *    char *silc_get_command_name(SilcCommand command);
+ *    void silc_va_copy(va_list dest, va_list src);
  *
  * DESCRIPTION
  *
- *    Returns the name corresponding SILC command `command'.
+ *    Copies variable argument list.  This must be called in case the
+ *    variable argument list must be evaluated multiple times.  For each
+ *    evaluation the list must be copied and va_end must be called for
+ *    each copied list.
  *
  ***/
-const char *silc_get_command_name(unsigned char command);
+void silc_va_copy(va_list dest, va_list src);
 
 #endif /* !SILCUTIL_H */
index c20ebdb876f8175542fbaf07692f1c1df90a93d5..e9564b5115061aa884cbf41d3df2563d438611e2 100644 (file)
@@ -4,12 +4,12 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2005 Pekka Riikonen
+  Copyright (C) 1997 - 2006 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2 of the License.
-  
+
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
@@ -97,7 +97,7 @@ int silc_string_regex_match(const char *regex, const char *string)
 {
   regex_t preg;
   int ret = FALSE;
-  
+
   if (regcomp(&preg, regex, REG_NOSUB | REG_EXTENDED) != 0)
     return FALSE;
 
@@ -133,7 +133,7 @@ int silc_string_match(const char *string1, const char *string2)
 char *silc_get_username()
 {
   char *logname = NULL;
-  
+
   logname = getenv("LOGNAME");
   if (!logname) {
     logname = getlogin();
@@ -147,7 +147,7 @@ char *silc_get_username()
       logname = pw->pw_name;
     }
   }
-  
+
   return strdup(logname);
 }
 
@@ -157,7 +157,7 @@ char *silc_get_real_name()
 {
   char *realname = NULL;
   struct passwd *pw;
-    
+
   pw = getpwuid(getuid());
   if (!pw)
     return strdup("No Name");
@@ -184,4 +184,3 @@ int silc_file_set_nonblock(int fd)
 {
   return fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
 }
-
index 5fac7e6f565a42c0153a465d3c07807443bede22..3f5a38aa24d9acf5aa0126a6a6300ccbad5125b8 100644 (file)
@@ -50,13 +50,13 @@ const BYTE DWLEN = sizeof(DWORD) * 8;
 int silc_gettimeofday(struct timeval *tv)
 {
   FILETIME ft;
-  __int64 msec;
+  __int64 usec;
 
   GetSystemTimeAsFileTime(&ft);
-  msec = (__int64) ft.dwHighDateTime << DWLEN | ft.dwLowDateTime;
-  msec = (msec - FILETIME_1970) / 10;
-  tv->tv_sec  = (long) (msec / 1000000);
-  tv->tv_usec = (long) (msec % 1000000);
+  usec = (__int64) ft.dwHighDateTime << DWLEN | ft.dwLowDateTime;
+  usec = (usec - FILETIME_1970) / 10;
+  tv->tv_sec  = (long) (usec / 1000000);
+  tv->tv_usec = (long) (usec % 1000000);
 
   return 0;
 }