X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=net.c;h=601396477c66715e21bc222d69c0d7e0b1aa9f92;hp=5d7c3fef7d15a5c2c58d380f5f0412bb493deb4a;hb=94fa6ad6ec3068227d322cb83186ff8780100107;hpb=35bbbf736c75f13c2bf9f6d6bdc2feecd42072cb diff --git a/net.c b/net.c index 5d7c3fef..60139647 100644 --- a/net.c +++ b/net.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2007 Andre Noll + * Copyright (C) 2005-2008 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -147,10 +147,11 @@ int makesock(unsigned l3type, unsigned l4type, int passive, { struct addrinfo *local = NULL, *src, *remote = NULL, *dst, hints; - char *port = make_message("%u", port_number); int rc, on = 1, sockfd = -1, socktype = sock_type(l4type); + char port[6]; /* port number has at most 5 digits */ + sprintf(port, "%u", port_number); /* Set up address hint structure */ memset(&hints, 0, sizeof(hints)); hints.ai_family = l3type; @@ -171,7 +172,7 @@ int makesock(unsigned l3type, unsigned l4type, int passive, if ((rc = getaddrinfo(host, port, &hints, passive ? &local : &remote))) { PARA_ERROR_LOG("can not resolve %s address %s#%s: %s.\n", layer4_name(l4type), - host? : (passive? "[loopback]" : "[localhost]"), + host? host : (passive? "[loopback]" : "[localhost]"), port, gai_strerror(rc)); return -E_ADDRESS_LOOKUP; } @@ -225,7 +226,7 @@ get_next_src: if (src == NULL && dst == NULL) { PARA_ERROR_LOG("can not create %s socket %s#%s.\n", - layer4_name(l4type), host? : (passive? + layer4_name(l4type), host? host : (passive? "[loopback]" : "[localhost]"), port); return -ERRNO_TO_PARA_ERROR(errno); } @@ -322,6 +323,28 @@ char *remote_name(int sockfd) return __get_sock_name(sockfd, getpeername); } +/** + * Extract IPv4 or IPv6-mapped-IPv4 address from sockaddr_storage. + * \param ss Container of IPv4/6 address + * \return Extracted IPv4 address (different from 0) or 0 if unsuccessful. + * + * \sa RFC 3493 + */ +struct in_addr extract_v4_addr(const struct sockaddr_storage *ss) +{ + struct in_addr ia = {.s_addr = 0}; + + if (ss->ss_family == AF_INET) + ia.s_addr = ((struct sockaddr_in *)ss)->sin_addr.s_addr; + if (ss->ss_family == AF_INET6) { + const struct in6_addr v6_addr = ((struct sockaddr_in6 *)ss)->sin6_addr; + + if (IN6_IS_ADDR_V4MAPPED(&v6_addr)) + memcpy(&ia.s_addr, &(v6_addr.s6_addr[12]), 4); + } + return ia; +} + /* * Send out a buffer, resend on short writes. * @@ -339,7 +362,7 @@ static int sendall(int fd, const char *buf, size_t *len) assert(total); *len = 0; while (*len < total) { - int ret = send(fd, buf + *len, total - *len, 0); + int ret = write(fd, buf + *len, total - *len); if (ret == -1) return -ERRNO_TO_PARA_ERROR(errno); *len += ret; @@ -366,7 +389,7 @@ int send_bin_buffer(int fd, const char *buf, size_t len) crypt_function *cf = NULL; if (!len) - PARA_CRIT_LOG("%s", "len == 0\n"); + PARA_CRIT_LOG("len == 0\n"); if (fd + 1 <= cda_size) cf = crypt_data_array[fd].send; if (cf) {