X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=net.c;h=49026db0ec91a7b4a1d3d0917723720eb8d0ba30;hp=ffd4350b4b14bc32d8e270db2734cc97fee400df;hb=89f2de1016601e523fd456e0e2fa650fa695ecaa;hpb=a24d175e6d093d6d9f6e583c3026e45924bad621 diff --git a/net.c b/net.c index ffd4350b..49026db0 100644 --- a/net.c +++ b/net.c @@ -285,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)); @@ -306,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' */ @@ -576,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) { @@ -594,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. * @@ -633,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; } /**