X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=apps%2Firssi%2Fsrc%2Fcore%2Fnetwork.c;h=bb46dd54fcd9f0e5ee51aac3507f571acffb89e6;hp=e53b01897b4938ddfe1ea3e092165160a26e9428;hb=382d15d447b7a95390decfa783836ae4fe255b3d;hpb=f6ace22529aa51fa32b4957a63eca20b952be947 diff --git a/apps/irssi/src/core/network.c b/apps/irssi/src/core/network.c index e53b0189..bb46dd54 100644 --- a/apps/irssi/src/core/network.c +++ b/apps/irssi/src/core/network.c @@ -21,6 +21,8 @@ #include "module.h" #include "network.h" +#include + #ifndef INADDR_NONE # define INADDR_NONE INADDR_BROADCAST #endif @@ -217,7 +219,42 @@ GIOChannel *net_connect_ip(IPADDR *ip, int port, IPADDR *my_ip) if (ret < 0 && WSAGetLastError() != WSAEWOULDBLOCK) #endif { + int old_errno = errno; + close(handle); + errno = old_errno; + return NULL; + } + + return g_io_channel_new(handle); +} + +/* Connect to named UNIX socket */ +GIOChannel *net_connect_unix(const char *path) +{ + struct sockaddr_un sa; + int handle, ret; + + /* create the socket */ + handle = socket(PF_UNIX, SOCK_STREAM, 0); + if (handle == -1) + return NULL; + + /* set socket options */ +#ifndef WIN32 + fcntl(handle, F_SETFL, O_NONBLOCK); +#endif + + /* connect */ + memset(&sa, 0, sizeof(sa)); + sa.sun_family = AF_UNIX; + strncpy(sa.sun_path, path, sizeof(sa.sun_path)-1); + sa.sun_path[sizeof(sa.sun_path)-1] = '\0'; + + ret = connect(handle, (struct sockaddr *) &sa, sizeof(sa)); + if (ret < 0 && errno != EINPROGRESS) { + int old_errno = errno; close(handle); + errno = old_errno; return NULL; } @@ -431,18 +468,19 @@ int net_gethostbyaddr(IPADDR *ip, char **name) #ifdef HAVE_IPV6 struct addrinfo req, *ai; int host_error; + char hostname[NI_MAXHOST]; + char ipname[MAX_IP_LEN]; #else struct hostent *hp; #endif - char ipname[MAX_IP_LEN]; g_return_val_if_fail(ip != NULL, -1); g_return_val_if_fail(name != NULL, -1); - net_ip2host(ip, ipname); - *name = NULL; #ifdef HAVE_IPV6 + net_ip2host(ip, ipname); + memset(&req, 0, sizeof(struct addrinfo)); req.ai_socktype = SOCK_STREAM; req.ai_flags = AI_CANONNAME; @@ -451,11 +489,19 @@ int net_gethostbyaddr(IPADDR *ip, char **name) host_error = getaddrinfo(ipname, NULL, &req, &ai); if (host_error != 0) return host_error; - *name = g_strdup(ai->ai_canonname); + host_error = getnameinfo(ai->ai_addr, ai->ai_addrlen, + hostname, NI_MAXHOST, NULL, 0, 0); + if (host_error != 0) { + freeaddrinfo(ai); + return host_error; + } + + *name = g_strdup(hostname); freeaddrinfo(ai); #else - hp = gethostbyaddr(ipname, strlen(ipname), AF_INET); + if (ip->family != AF_INET) return -1; + hp = gethostbyaddr(&ip->ip, 4, AF_INET); if (hp == NULL) return -1; *name = g_strdup(hp->h_name); @@ -472,12 +518,16 @@ int net_ip2host(IPADDR *ip, char *host) #else unsigned long ip4; - ip4 = ntohl(ip->ip.s_addr); - g_snprintf(host, MAX_IP_LEN, "%lu.%lu.%lu.%lu", - (ip4 & 0xff000000UL) >> 24, - (ip4 & 0x00ff0000) >> 16, - (ip4 & 0x0000ff00) >> 8, - (ip4 & 0x000000ff)); + if (ip->family != AF_INET) { + strcpy(host, "0.0.0.0"); + } else { + ip4 = ntohl(ip->ip.s_addr); + g_snprintf(host, MAX_IP_LEN, "%lu.%lu.%lu.%lu", + (ip4 & 0xff000000UL) >> 24, + (ip4 & 0x00ff0000) >> 16, + (ip4 & 0x0000ff00) >> 8, + (ip4 & 0x000000ff)); + } #endif return 0; } @@ -486,15 +536,16 @@ int net_host2ip(const char *host, IPADDR *ip) { unsigned long addr; -#ifdef HAVE_IPV6 if (strchr(host, ':') != NULL) { /* IPv6 */ ip->family = AF_INET6; +#ifdef HAVE_IPV6 if (inet_pton(AF_INET6, host, &ip->ip) == 0) return -1; - } else +#else + ip->ip.s_addr = 0; #endif - { + } else { /* IPv4 */ ip->family = AF_INET; #ifdef HAVE_INET_ATON