Moved regex routines to lib/silcutil/silcstrutil.[ch].
authorPekka Riikonen <priikone@silcnet.org>
Tue, 1 May 2007 11:22:34 +0000 (11:22 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Tue, 1 May 2007 11:22:34 +0000 (11:22 +0000)
Fixed TCP connecting aborting.

lib/silcutil/unix/silcunixnet.c
lib/silcutil/unix/silcunixsocketstream.c
lib/silcutil/unix/silcunixutil.c

index 9abcb9737394c51af3bb0b65f717812928dee4cc..76eba36ea17fcb1b2df1fe2600d6b4a5f55c6df9 100644 (file)
@@ -21,6 +21,8 @@
 #include "silc.h"
 #include "silcnet.h"
 
+/************************** Types and definitions ***************************/
+
 #ifdef HAVE_IPV6
 #define SIZEOF_SOCKADDR(so) ((so).sa.sa_family == AF_INET6 ?   \
   sizeof(so.sin6) : sizeof(so.sin))
@@ -36,6 +38,8 @@ typedef union {
 #endif
 } SilcSockaddr;
 
+/************************ Static utility functions **************************/
+
 static SilcBool silc_net_set_sockaddr(SilcSockaddr *addr, const char *ip_addr,
                                      int port)
 {
@@ -81,6 +85,8 @@ static SilcBool silc_net_set_sockaddr(SilcSockaddr *addr, const char *ip_addr,
   return TRUE;
 }
 
+/****************************** TCP Listener ********************************/
+
 /* Deliver new stream to upper layer */
 
 static void silc_net_accept_stream(SilcSocketStreamStatus status,
@@ -179,6 +185,7 @@ silc_net_tcp_create_listener(const char **local_ip_addr,
     rval = silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
     if (rval < 0) {
       SILC_LOG_ERROR(("Cannot set socket options: %s", strerror(errno)));
+      close(sock);
       goto err;
     }
 
@@ -186,6 +193,7 @@ silc_net_tcp_create_listener(const char **local_ip_addr,
     rval = bind(sock, &server.sa, SIZEOF_SOCKADDR(server));
     if (rval < 0) {
       SILC_LOG_ERROR(("Cannot bind socket: %s", strerror(errno)));
+      close(sock);
       goto err;
     }
 
@@ -193,6 +201,7 @@ silc_net_tcp_create_listener(const char **local_ip_addr,
     rval = listen(sock, 64);
     if (rval < 0) {
       SILC_LOG_ERROR(("Cannot set socket listenning: %s", strerror(errno)));
+      close(sock);
       goto err;
     }
 
@@ -233,6 +242,8 @@ void silc_net_close_listener(SilcNetListener listener)
   silc_free(listener);
 }
 
+/******************************* UDP Stream *********************************/
+
 /* Create UDP stream */
 
 SilcStream
@@ -304,17 +315,23 @@ silc_net_udp_connect(const char *local_ip_addr, int local_port,
 
   /* Set send and receive buffer size */
 #ifdef SO_SNDBUF
-  rval = silc_net_set_socket_opt(sock, SOL_SOCKET, SO_SNDBUF, 65535);
+  rval = silc_net_set_socket_opt(sock, SOL_SOCKET, SO_SNDBUF, 765535);
   if (rval < 0) {
-    SILC_LOG_ERROR(("Cannot set socket options: %s", strerror(errno)));
-    goto err;
+    rval = silc_net_set_socket_opt(sock, SOL_SOCKET, SO_SNDBUF, 65535);
+    if (rval < 0) {
+      SILC_LOG_ERROR(("Cannot set socket options: %s", strerror(errno)));
+      goto err;
+    }
   }
 #endif /* SO_SNDBUF */
 #ifdef SO_RCVBUF
-  rval = silc_net_set_socket_opt(sock, SOL_SOCKET, SO_RCVBUF, 65535);
+  rval = silc_net_set_socket_opt(sock, SOL_SOCKET, SO_RCVBUF, 765535);
   if (rval < 0) {
-    SILC_LOG_ERROR(("Cannot set socket options: %s", strerror(errno)));
-    goto err;
+    rval = silc_net_set_socket_opt(sock, SOL_SOCKET, SO_RCVBUF, 65535);
+    if (rval < 0) {
+      SILC_LOG_ERROR(("Cannot set socket options: %s", strerror(errno)));
+      goto err;
+    }
   }
 #endif /* SO_RCVBUF */
 
@@ -438,6 +455,8 @@ int silc_net_udp_send(SilcStream stream,
   return ret;
 }
 
+/******************************* TCP Stream *********************************/
+
 /* Asynchronous TCP/IP connecting */
 
 typedef struct {
@@ -535,18 +554,15 @@ SILC_FSM_STATE(silc_net_connect_st_start)
   rval = connect(sock, &desthost.sa, SIZEOF_SOCKADDR(desthost));
   if (rval < 0) {
     if (errno != EINPROGRESS) {
-      /* retry using an IPv4 adress, if IPv6 didn't work */
-      if (prefer_ipv6 && silc_net_is_ip6(conn->ip_addr)) {
-        shutdown(sock, 2);
-        close(sock);
+      shutdown(sock, 2);
+      close(sock);
 
+      /* Retry using an IPv4 adress, if IPv6 didn't work */
+      if (prefer_ipv6 && silc_net_is_ip6(conn->ip_addr)) {
         prefer_ipv6 = FALSE;
         goto retry;
       }
 
-      shutdown(sock, 2);
-      close(sock);
-
       /** Cannot connect to remote host */
       SILC_LOG_ERROR(("Cannot connect to remote host: %s", strerror(errno)));
       silc_fsm_next(fsm, silc_net_connect_st_finish);
@@ -700,7 +716,7 @@ static void silc_net_connect_abort(SilcAsyncOperation op, void *context)
 
   /* Abort underlaying stream creation too */
   if (conn->sop)
-    silc_async_abort(conn->op, NULL, NULL);
+    silc_async_abort(conn->sop, NULL, NULL);
 }
 
 static void silc_net_connect_destructor(SilcFSM fsm, void *fsm_context,
index e68bef544e48efa366646094b93b4a2fe35227e5..65047081c1055deb4ba2c8d375693c93383d028c 100644 (file)
@@ -80,6 +80,8 @@ int silc_socket_stream_read(SilcStream stream, unsigned char *buf,
       if (errno == EAGAIN || errno == EINTR) {
        SILC_LOG_DEBUG(("Could not read immediately, will do it later"));
        silc_schedule_set_listen_fd(sock->schedule, sock->sock,
+                                   silc_schedule_get_fd_events(sock->schedule,
+                                                               sock->sock) |
                                    SILC_TASK_READ, FALSE);
        return -1;
       }
@@ -122,6 +124,8 @@ int silc_socket_stream_read(SilcStream stream, unsigned char *buf,
     if (errno == EAGAIN || errno == EINTR) {
       SILC_LOG_DEBUG(("Could not read immediately, will do it later"));
       silc_schedule_set_listen_fd(sock->schedule, sock->sock,
+                                 silc_schedule_get_fd_events(sock->schedule,
+                                                             sock->sock) |
                                  SILC_TASK_READ, FALSE);
       return -1;
     }
@@ -245,7 +249,7 @@ SilcBool silc_socket_get_error(SilcStream sock, char *error,
   memcpy(error, err, strlen(err));
   return TRUE;
 }
-#endif /* 0 */
+#endif
 
 /* Closes socket */
 
index e9564b5115061aa884cbf41d3df2563d438611e2..4b37ea5e769c65e59dd12656130e675010ad295d 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1997 - 2006 Pekka Riikonen
+  Copyright (C) 1997 - 2007 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
   GNU General Public License for more details.
 
 */
-/*
- * These are general utility functions that doesn't belong to any specific
- * group of routines.
- */
-/* $Id$ */
 
 #include "silc.h"
 
-/* XXX lib/contrib/regex.c might cmopile on WIN32 as well */
-
-/* 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. */
-
-char *silc_string_regexify(const char *string)
-{
-  int i, len, count;
-  char *regex;
-
-  len = strlen(string);
-  count = 4;
-  for (i = 0; i < len; i++) {
-    if (string[i] == '*' || string[i] == '?')
-      count++;                 /* Will add '.' */
-    if (string[i] == ',')
-      count += 2;              /* Will add '|' and '^' */
-  }
-
-  regex = silc_calloc(len + count + 1, sizeof(*regex));
-
-  count = 0;
-  regex[count++] = '(';
-  regex[count++] = '^';
-
-  for (i = 0; i < len; i++) {
-    if (string[i] == '*' || string[i] == '?') {
-      regex[count] = '.';
-      count++;
-    } else if (string[i] == ',') {
-      if (i + 2 == len)
-       continue;
-      regex[count++] = '|';
-      regex[count++] = '^';
-      continue;
-    }
-
-    regex[count++] = string[i];
-  }
-
-  regex[count++] = ')';
-  regex[count] = '$';
-
-  return regex;
-}
-
-/* Combines two regex strings into one regex string so that they can be
-   used as one by the GNU regex library. The `string2' is combine into
-   the `string1'. */
-
-char *silc_string_regex_combine(const char *string1, const char *string2)
-{
-  char *tmp;
-  int len1, len2;
-
-  len1 = strlen(string1);
-  len2 = strlen(string2);
-
-  tmp = silc_calloc(2 + len1 + len2, sizeof(*tmp));
-  strncat(tmp, string1, len1 - 2);
-  strncat(tmp, "|", 1);
-  strncat(tmp, string2 + 1, len2 - 1);
-
-  return tmp;
-}
-
-/* Matches the two strings and returns TRUE if the strings match. */
-
-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;
-
-  if (regexec(&preg, string, 0, NULL, 0) == 0)
-    ret = TRUE;
-
-  regfree(&preg);
-
-  return ret;
-}
-
-/* Do regex match to the two strings `string1' and `string2'. If the
-   `string2' matches the `string1' this returns TRUE. */
-
-int silc_string_match(const char *string1, const char *string2)
-{
-  char *s1;
-  int ret = FALSE;
-
-  if (!string1 || !string2)
-    return ret;
-
-  s1 = silc_string_regexify(string1);
-  ret = silc_string_regex_match(s1, string2);
-  silc_free(s1);
-
-  return ret;
-}
-
 /* Returns the username of the user. If the global variable LOGNAME
    does not exists we will get the name from the password file. */