From 5838e24bf0454577c54e7a53649406baca666763 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Tue, 1 May 2007 11:22:34 +0000 Subject: [PATCH] Moved regex routines to lib/silcutil/silcstrutil.[ch]. Fixed TCP connecting aborting. --- lib/silcutil/unix/silcunixnet.c | 44 ++++++--- lib/silcutil/unix/silcunixsocketstream.c | 6 +- lib/silcutil/unix/silcunixutil.c | 110 +---------------------- 3 files changed, 36 insertions(+), 124 deletions(-) diff --git a/lib/silcutil/unix/silcunixnet.c b/lib/silcutil/unix/silcunixnet.c index 9abcb973..76eba36e 100644 --- a/lib/silcutil/unix/silcunixnet.c +++ b/lib/silcutil/unix/silcunixnet.c @@ -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, diff --git a/lib/silcutil/unix/silcunixsocketstream.c b/lib/silcutil/unix/silcunixsocketstream.c index e68bef54..65047081 100644 --- a/lib/silcutil/unix/silcunixsocketstream.c +++ b/lib/silcutil/unix/silcunixsocketstream.c @@ -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 */ diff --git a/lib/silcutil/unix/silcunixutil.c b/lib/silcutil/unix/silcunixutil.c index e9564b51..4b37ea5e 100644 --- a/lib/silcutil/unix/silcunixutil.c +++ b/lib/silcutil/unix/silcunixutil.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - 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 @@ -16,117 +16,9 @@ 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. */ -- 2.24.0