net.c: Fix format string in stringify_port().
[paraslash.git] / net.c
diff --git a/net.c b/net.c
index 70cf6a87dfb27bbba74912bb50467a0a74f966bd..aa3fcbb9e991652b9c77d5d1a07b438a91e4c651 100644 (file)
--- a/net.c
+++ b/net.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2005-2013 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2014 Andre Noll <maan@tuebingen.mpg.de>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -208,7 +208,7 @@ const char *stringify_port(int port, const char *transport)
                struct servent *se = getservbyport(htons(port), transport);
 
                if (se == NULL)
-                       snprintf(service, sizeof(service), "%u", port);
+                       snprintf(service, sizeof(service), "%d", port);
                else
                        snprintf(service, sizeof(service), "%s", se->s_name);
        }
@@ -355,7 +355,7 @@ void flowopt_cleanup(struct flowopts *fo)
        free(fo);
 }
 
-/*
+/**
  * Resolve an IPv4/IPv6 address.
  *
  * \param l4type The layer-4 type (\p IPPROTO_xxx).
@@ -373,7 +373,7 @@ void flowopt_cleanup(struct flowopts *fo)
  *
  * \sa getaddrinfo(3).
  */
-static int lookup_address(unsigned l4type, bool passive, const char *host,
+int lookup_address(unsigned l4type, bool passive, const char *host,
                int port_number, struct addrinfo **result)
 {
        int ret;
@@ -409,7 +409,7 @@ static int lookup_address(unsigned l4type, bool passive, const char *host,
        return 1;
 }
 
-/*
+/**
  * Create an active or passive socket.
  *
  * \param l4type \p IPPROTO_TCP, \p IPPROTO_UDP, or \p IPPROTO_DCCP.
@@ -426,7 +426,7 @@ static int lookup_address(unsigned l4type, bool passive, const char *host,
  * \sa \ref lookup_address(), \ref makesock(), ip(7), ipv6(7), bind(2),
  * connect(2).
  */
-static int makesock_addrinfo(unsigned l4type, bool passive, struct addrinfo *ai,
+int makesock_addrinfo(unsigned l4type, bool passive, struct addrinfo *ai,
                struct flowopts *fo)
 {
        int ret = -E_MAKESOCK, on = 1;
@@ -710,6 +710,32 @@ void extract_v4_addr(const struct sockaddr_storage *ss, struct in_addr *ia)
                *ia = ((struct sockaddr_in *)sa)->sin_addr;
 }
 
+/**
+ * Compare the address part of IPv4/6 addresses.
+ *
+ * \param sa1 First address.
+ * \param sa2 Second address.
+ *
+ * \return True iff the IP address of \a sa1 and \a sa2 match.
+ */
+bool sockaddr_equal(const struct sockaddr *sa1, const struct sockaddr *sa2)
+{
+       if (!sa1 || !sa2)
+               return false;
+       if (sa1->sa_family != sa2->sa_family)
+               return false;
+       if (sa1->sa_family == AF_INET) {
+               struct sockaddr_in *a1 = (typeof(a1))sa1,
+                       *a2 = (typeof (a2))sa2;
+               return a1->sin_addr.s_addr == a2->sin_addr.s_addr;
+       } else if (sa1->sa_family == AF_INET6) {
+               struct sockaddr_in6 *a1 = (typeof(a1))sa1,
+                       *a2 = (typeof (a2))sa2;
+               return !memcmp(a1, a2, sizeof(*a1));
+       } else
+               return false;
+}
+
 /**
  * Receive data from a file descriptor.
  *
@@ -937,16 +963,18 @@ int recv_cred_buffer(int fd, char *buf, size_t size)
        return recv_buffer(fd, buf, size) > 0? 1 : -E_RECVMSG;
 }
 #else /* HAVE_UCRED */
+
 /**
- * Send \p NULL-terminated buffer and Unix credentials of the current process.
+ * Send a buffer and the credentials of the current process to a socket.
  *
- * \param sock The socket file descriptor.
- * \param buf The buffer to be sent.
+ * \param sock The file descriptor of the sending socket.
+ * \param buf The zero-terminated buffer to send.
  *
- * \return On success, this call returns the number of characters sent.  On
- * error, \p -E_SENDMSG is returned.
+ * \return On success, this call returns the number of bytes sent. On errors,
+ * \p -E_SENDMSG is returned.
  *
- * \sa sendmsg(2), okir's Black Hats Manual.
+ * \sa \ref recv_cred_buffer, sendmsg(2), socket(7), unix(7), okir's Black Hats
+ * Manual.
  */
 ssize_t send_cred_buffer(int sock, char *buf)
 {
@@ -959,7 +987,7 @@ ssize_t send_cred_buffer(int sock, char *buf)
 
        /* Response data */
        iov.iov_base = buf;
-       iov.iov_len  = strlen(buf);
+       iov.iov_len = strlen(buf);
        c.pid = getpid();
        c.uid = getuid();
        c.gid = getgid();
@@ -977,7 +1005,7 @@ ssize_t send_cred_buffer(int sock, char *buf)
        *(struct ucred *)CMSG_DATA(cmsg) = c;
        msg.msg_controllen = cmsg->cmsg_len;
        ret = sendmsg(sock, &msg, 0);
-       if (ret  < 0)
+       if (ret < 0)
                ret = -E_SENDMSG;
        return ret;
 }
@@ -993,13 +1021,13 @@ static void dispose_fds(int *fds, unsigned num)
 /**
  * Receive a buffer and the Unix credentials of the sending process.
  *
- * \param fd the socket file descriptor.
- * \param buf the buffer to store the message.
- * \param size the size of \a buffer.
+ * \param fd The file descriptor of the receiving socket.
+ * \param buf The buffer to store the received message.
+ * \param size The length of \a buf in bytes.
  *
- * \return negative on errors, the user id on success.
+ * \return Negative on errors, the user id of the sending process on success.
  *
- * \sa recvmsg(2), okir's Black Hats Manual.
+ * \sa \ref send_cred_buffer and the references given there.
  */
 int recv_cred_buffer(int fd, char *buf, size_t size)
 {
@@ -1032,7 +1060,7 @@ int recv_cred_buffer(int fd, char *buf, size_t size)
                } else
                        if (cmsg->cmsg_level == SOL_SOCKET
                                        && cmsg->cmsg_type == SCM_RIGHTS) {
-                               dispose_fds((int *) CMSG_DATA(cmsg),
+                               dispose_fds((int *)CMSG_DATA(cmsg),
                                        (cmsg->cmsg_len - CMSG_LEN(0))
                                        / sizeof(int));
                        }