]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Add socket-utils.h helpers for ports
authorGreg Hudson <ghudson@mit.edu>
Sat, 7 Jun 2014 19:16:23 +0000 (15:16 -0400)
committerGreg Hudson <ghudson@mit.edu>
Fri, 27 Jun 2014 23:36:39 +0000 (19:36 -0400)
Add sa_setport, sa_getport, and sa_is_inet helpers for conveniently
manipulating port numbers on IPv4 and IPv6 socket addresses.

src/include/socket-utils.h

index 484e294f8cd3b86566fe2b692dbd46def577cafc..e3fa4293bba1bf5630fe8bcbb7770530efcc5ffc 100644 (file)
@@ -89,6 +89,36 @@ static inline struct sockaddr_in6 *ss2sin6 (struct sockaddr_storage *ss)
     return (struct sockaddr_in6 *) ss;
 }
 
+/* Set the IPv4 or IPv6 port on sa to port.  Do nothing if sa is not an
+ * Internet socket. */
+static inline void
+sa_setport(struct sockaddr *sa, uint16_t port)
+{
+    if (sa->sa_family == AF_INET)
+        sa2sin(sa)->sin_port = htons(port);
+    else if (sa->sa_family == AF_INET6)
+        sa2sin6(sa)->sin6_port = htons(port);
+}
+
+/* Get the Internet port number of sa, or 0 if it is not an Internet socket. */
+static inline uint16_t
+sa_getport(struct sockaddr *sa)
+{
+    if (sa->sa_family == AF_INET)
+        return ntohs(sa2sin(sa)->sin_port);
+    else if (sa->sa_family == AF_INET6)
+        return ntohs(sa2sin6(sa)->sin6_port);
+    else
+        return 0;
+}
+
+/* Return true if sa is an IPv4 or IPv6 socket address. */
+static inline int
+sa_is_inet(struct sockaddr *sa)
+{
+    return sa->sa_family == AF_INET || sa->sa_family == AF_INET6;
+}
+
 #if !defined (socklen)
 /* socklen_t socklen (struct sockaddr *) */
 #  ifdef HAVE_SA_LEN