X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=net.c;h=2f720b10477aee8214cac5a5223ca4378b29bd5f;hp=fa9575a6e5a6aa7d857777e1ea85d5f52ec05c01;hb=bda95f9508b456dcea89d300f6d4104e30ab9f3e;hpb=fd652c08d4b5b26032646c449e1979c48018b70a diff --git a/net.c b/net.c index fa9575a6..2f720b10 100644 --- a/net.c +++ b/net.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2011 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -25,13 +25,10 @@ #define AI_ADDRCONFIG 0 #endif -#include #include -#include #include "para.h" #include "error.h" -#include "crypt.h" #include "net.h" #include "string.h" #include "list.h" @@ -288,7 +285,7 @@ struct flowopts *flowopt_new(void) * \sa setsockopt(2) */ void flowopt_add(struct flowopts *fo, int lev, int opt, - char *name, const void *val, int len) + const char *name, const void *val, int len) { struct pre_conn_opt *new = para_malloc(sizeof(*new)); @@ -309,7 +306,7 @@ void flowopt_add(struct flowopts *fo, int lev, int opt, } void flowopt_add_bool(struct flowopts *fo, int lev, int opt, - char *optname, bool on_or_off) + const char *optname, bool on_or_off) { int on = on_or_off; /* kernel takes 'int' */ @@ -380,8 +377,8 @@ int makesock(unsigned l4type, bool passive, const char *host, uint16_t port_number, struct flowopts *fo) { - struct addrinfo *local = NULL, *src, - *remote = NULL, *dst, hints; + struct addrinfo *local = NULL, *src = NULL, *remote = NULL, + *dst = NULL, hints; unsigned int l3type = AF_UNSPEC; int rc, on = 1, sockfd = -1, socktype = sock_type(l4type); @@ -414,7 +411,8 @@ int makesock(unsigned l4type, bool passive, layer4_name(l4type), host? host : (passive? "[loopback]" : "[localhost]"), port, gai_strerror(rc)); - return -E_ADDRESS_LOOKUP; + rc = -E_ADDRESS_LOOKUP; + goto out; } /* Iterate over all src/dst combination, exhausting dst first */ @@ -439,7 +437,8 @@ int makesock(unsigned l4type, bool passive, close(sockfd); PARA_ERROR_LOG("can not set SO_REUSEADDR: %s\n", strerror(rc)); - return -ERRNO_TO_PARA_ERROR(rc); + rc = -ERRNO_TO_PARA_ERROR(rc); + break; } flowopt_setopts(sockfd, fo); @@ -462,6 +461,7 @@ get_next_src: if (src && (src = src->ai_next)) /* restart inner loop */ dst = remote; } +out: if (local) freeaddrinfo(local); if (remote) @@ -469,11 +469,12 @@ get_next_src: flowopt_cleanup(fo); if (src == NULL && dst == NULL) { - rc = errno; + if (rc >= 0) + rc = -E_MAKESOCK; PARA_ERROR_LOG("can not create %s socket %s#%s.\n", layer4_name(l4type), host? host : (passive? "[loopback]" : "[localhost]"), port); - return -ERRNO_TO_PARA_ERROR(rc); + return rc; } return sockfd; } @@ -593,34 +594,6 @@ int generic_max_transport_msg_size(int sockfd) return generic_mtu(af_type) - estimated_header_overhead(af_type); } -/** - * Print numeric host and port number (beware - uses static char). - * - * \param sa The IPv4/IPv6 socket address to use. - * - * \sa getnameinfo(3), services(5), nsswitch.conf(5) - */ -static char *host_and_port(const struct sockaddr_storage *ss) -{ - const struct sockaddr *sa = normalize_ip_address(ss); - char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; - static char output[sizeof(hbuf) + sizeof(sbuf) + 2]; - int ret; - - ret = getnameinfo(sa, salen(sa), - hbuf, sizeof(hbuf), - sbuf, sizeof(sbuf), - NI_NUMERICHOST); - if (ret == 0) { - snprintf(output, sizeof(output), "%s#%s", hbuf, sbuf); - } else { - snprintf(output, sizeof(output), "(unknown)"); - PARA_WARNING_LOG("hostname lookup error (%s).\n", - gai_strerror(ret)); - } - return output; -} - /** * Look up the local or remote side of a connected socket structure. * @@ -629,23 +602,39 @@ static char *host_and_port(const struct sockaddr_storage *ss) * remote side. * * \return A static character string identifying hostname and port of the - * chosen side. + * chosen side in numeric host:port format. * - * \sa getsockname(2), getpeername(2). + * \sa getsockname(2), getpeername(2), parse_url(), getnameinfo(3), + * services(5), nsswitch.conf(5). */ static char *__get_sock_name(int fd, int (*getname)(int, struct sockaddr*, socklen_t *)) { struct sockaddr_storage ss; + const struct sockaddr *sa; socklen_t sslen = sizeof(ss); + char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV]; + static char output[sizeof(hbuf) + sizeof(sbuf) + 4]; + int ret; if (getname(fd, (struct sockaddr *)&ss, &sslen) < 0) { - static char *dont_know = "(don't know)"; PARA_ERROR_LOG("can not determine address from fd %d: %s\n", fd, strerror(errno)); - return dont_know; + snprintf(output, sizeof(output), "(unknown)"); + return output; } - return host_and_port(&ss); + sa = normalize_ip_address(&ss); + ret = getnameinfo(sa, salen(sa), hbuf, sizeof(hbuf), sbuf, + sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV); + if (ret) { + PARA_WARNING_LOG("hostname lookup error (%s).\n", + gai_strerror(ret)); + snprintf(output, sizeof(output), "(lookup error)"); + } else if (sa->sa_family == AF_INET6) + snprintf(output, sizeof(output), "[%s]:%s", hbuf, sbuf); + else + snprintf(output, sizeof(output), "%s:%s", hbuf, sbuf); + return output; } /** @@ -938,15 +927,17 @@ err: * This function creates a local socket for sequenced, reliable, two-way, * connection-based byte streams. * - * \return The file descriptor, on success, negative on errors. + * \return The file descriptor of the connected socket on success, negative on + * errors. * * \sa create_local_socket(), unix(7), connect(2). */ -int create_remote_socket(const char *name) +int connect_local_socket(const char *name) { struct sockaddr_un unix_addr; int fd, ret; + PARA_DEBUG_LOG("connecting to %s\n", name); ret = init_unix_addr(&unix_addr, name); if (ret < 0) return ret;