]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/basic/in-addr-util.c
basic: include only what we use
[thirdparty/systemd.git] / src / basic / in-addr-util.c
index d88864b5987f7387ebd99e2ea9a689d05038c478..5143dddf8f4e7db5c6b98a8d904ee19c5cd6dbaf 100644 (file)
 ***/
 
 #include <arpa/inet.h>
+#include <endian.h>
+#include <errno.h>
+#include <stdint.h>
+#include <stdlib.h>
 
+#include "alloc-util.h"
 #include "in-addr-util.h"
+#include "macro.h"
+#include "util.h"
 
 int in_addr_is_null(int family, const union in_addr_union *u) {
         assert(u);
@@ -43,7 +50,7 @@ int in_addr_is_link_local(int family, const union in_addr_union *u) {
         assert(u);
 
         if (family == AF_INET)
-                return (be32toh(u->in.s_addr) & 0xFFFF0000) == (169U << 24 | 254U << 16);
+                return (be32toh(u->in.s_addr) & UINT32_C(0xFFFF0000)) == (UINT32_C(169) << 24 | UINT32_C(254) << 16);
 
         if (family == AF_INET6)
                 return IN6_IS_ADDR_LINKLOCAL(&u->in6);
@@ -51,6 +58,19 @@ int in_addr_is_link_local(int family, const union in_addr_union *u) {
         return -EAFNOSUPPORT;
 }
 
+int in_addr_is_localhost(int family, const union in_addr_union *u) {
+        assert(u);
+
+        if (family == AF_INET)
+                /* All of 127.x.x.x is localhost. */
+                return (be32toh(u->in.s_addr) & UINT32_C(0xFF000000)) == UINT32_C(127) << 24;
+
+        if (family == AF_INET6)
+                return IN6_IS_ADDR_LOOPBACK(&u->in6);
+
+        return -EAFNOSUPPORT;
+}
+
 int in_addr_equal(int family, const union in_addr_union *a, const union in_addr_union *b) {
         assert(a);
         assert(b);