Fixed TCP connecting aborting.
#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))
#endif
} SilcSockaddr;
+/************************ Static utility functions **************************/
+
static SilcBool silc_net_set_sockaddr(SilcSockaddr *addr, const char *ip_addr,
int port)
{
return TRUE;
}
+/****************************** TCP Listener ********************************/
+
/* Deliver new stream to upper layer */
static void silc_net_accept_stream(SilcSocketStreamStatus status,
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;
}
rval = bind(sock, &server.sa, SIZEOF_SOCKADDR(server));
if (rval < 0) {
SILC_LOG_ERROR(("Cannot bind socket: %s", strerror(errno)));
+ close(sock);
goto err;
}
rval = listen(sock, 64);
if (rval < 0) {
SILC_LOG_ERROR(("Cannot set socket listenning: %s", strerror(errno)));
+ close(sock);
goto err;
}
silc_free(listener);
}
+/******************************* UDP Stream *********************************/
+
/* Create UDP stream */
SilcStream
/* 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 */
return ret;
}
+/******************************* TCP Stream *********************************/
+
/* Asynchronous TCP/IP connecting */
typedef struct {
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);
/* 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,
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;
}
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;
}
memcpy(error, err, strlen(err));
return TRUE;
}
-#endif /* 0 */
+#endif
/* Closes socket */
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. */