X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=net.c;h=4d52e4a4e98bd53b3099f7cf8535372a4a270cff;hp=fa48e54f3f8525f26c716ef88784739ecd82a1fb;hb=75602d559d3dd57d704839b817377646722bfed8;hpb=e5f02e0748de02eabfb8e0746af09eb676ec1dc0 diff --git a/net.c b/net.c index fa48e54f..4d52e4a4 100644 --- a/net.c +++ b/net.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Andre Noll + * Copyright (C) 2005-2013 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' */ @@ -579,8 +576,14 @@ static inline int estimated_header_overhead(const int af_type) } /** - * Maximum transport-layer message size (MMS_S) as per RFC 1122, 3.3.3 - * Socket must be connected. + * Get the maximum transport-layer message size (MMS_S). + * + * \param sockfd The socket file descriptor. + * + * The socket must be connected. See RFC 1122, 3.3.3. If the protocol familiy + * could not be determined, \p AF_INET is assumed. + * + * \return The maximum message size of the address family type. */ int generic_max_transport_msg_size(int sockfd) { @@ -597,37 +600,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. - * - * \return Host string in numeric host:port format, \sa parse_url(). - * \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) + 4]; - int ret; - - ret = getnameinfo(sa, salen(sa), - hbuf, sizeof(hbuf), - sbuf, sizeof(sbuf), - NI_NUMERICHOST | NI_NUMERICSERV); - if (ret) { - snprintf(output, sizeof(output), "(unknown)"); - PARA_WARNING_LOG("hostname lookup error (%s).\n", - gai_strerror(ret)); - } 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; -} - /** * Look up the local or remote side of a connected socket structure. * @@ -636,23 +608,38 @@ 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 *)) +static char *__get_sock_name(int fd, typeof(getsockname) getname) { 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; } /** @@ -702,59 +689,6 @@ struct in_addr extract_v4_addr(const struct sockaddr_storage *ss) return ia; } -/** - * Send a binary buffer. - * - * \param fd The file descriptor. - * \param buf The buffer to be sent. - * \param len The length of \a buf. - * - * Send out the buffer and try to resend the remaining part in case of short - * writes. - * - * \return Standard. - */ -int send_bin_buffer(int fd, const char *buf, size_t len) -{ - if (!len) - PARA_CRIT_LOG("len == 0\n"); - return write_all(fd, buf, &len); -} - -/** - * Send a \p NULL-terminated buffer. - * - * \param fd The file descriptor. - * \param buf The null-terminated buffer to be send. - * - * This is equivalent to send_bin_buffer(fd, buf, strlen(buf)). - * - * \return Standard. - */ -int send_buffer(int fd, const char *buf) -{ - return send_bin_buffer(fd, buf, strlen(buf)); -} - -/** - * Send a buffer given by a format string. - * - * \param fd The file descriptor. - * \param fmt A format string. - * - * \return Standard. - */ -__printf_2_3 int send_va_buffer(int fd, const char *fmt, ...) -{ - char *msg; - int ret; - - PARA_VSPRINTF(fmt, msg); - ret = send_buffer(fd, msg); - free(msg); - return ret; -} - /** * Receive data from a file descriptor. * @@ -975,7 +909,7 @@ err: #ifndef HAVE_UCRED ssize_t send_cred_buffer(int sock, char *buf) { - return send_buffer(sock, buf); + return write_buffer(sock, buf); } int recv_cred_buffer(int fd, char *buf, size_t size) {