]> source.dussan.org Git - rspamd.git/commitdiff
Add method to check if IP is local
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 3 Jan 2016 11:35:45 +0000 (11:35 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Sun, 3 Jan 2016 11:35:45 +0000 (11:35 +0000)
src/libutil/addr.c
src/libutil/addr.h

index e87fa52612cbe20d9da07fc3c54ca9d77637da14..747ac869efd27007e26a41a4b369828156446395 100644 (file)
@@ -1314,3 +1314,46 @@ rspamd_inet_address_equal (gconstpointer a, gconstpointer b)
 
        return rspamd_inet_address_compare (a1, a2) == 0;
 }
+
+#ifndef IN6_IS_ADDR_LOOPBACK
+#define        IN6_IS_ADDR_LOOPBACK(a)         \
+       ((*(const __uint32_t *)(const void *)(&(a)->s6_addr[0]) == 0) && \
+       (*(const __uint32_t *)(const void *)(&(a)->s6_addr[4]) == 0) && \
+       (*(const __uint32_t *)(const void *)(&(a)->s6_addr[8]) == 0) && \
+       (*(const __uint32_t *)(const void *)(&(a)->s6_addr[12]) == ntohl(1)))
+#endif
+#ifndef IN6_IS_ADDR_LINKLOCAL
+#define IN6_IS_ADDR_LINKLOCAL(a)       \
+       (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80))
+#endif
+#ifndef IN6_IS_ADDR_SITELOCAL
+#define IN6_IS_ADDR_SITELOCAL(a)       \
+       (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0))
+#endif
+
+gboolean
+rspamd_inet_address_is_local (const rspamd_inet_addr_t *addr)
+{
+       g_assert (addr != NULL);
+
+       if (addr->af == AF_UNIX) {
+               /* Always true for unix sockets */
+               return TRUE;
+       }
+       else {
+               if (addr->af == AF_INET) {
+                       if (addr->u.in.addr.s4.sin_addr.s_addr == INADDR_LOOPBACK) {
+                               return TRUE;
+                       }
+               }
+               else if (addr->af == AF_INET6) {
+                       if (IN6_IS_ADDR_LOOPBACK (&addr->u.in.addr.s6.sin6_addr) ||
+                                               IN6_IS_ADDR_LINKLOCAL (&addr->u.in.addr.s6.sin6_addr) ||
+                                               IN6_IS_ADDR_SITELOCAL (&addr->u.in.addr.s6.sin6_addr)) {
+                               return TRUE;
+                       }
+               }
+       }
+
+       return FALSE;
+}
index fa2e4e65b2511efbe30385cf53188c9e1f5d3845..36f9910fdcf5b99edda1fc1aa42a1c52e7dfe295 100644 (file)
@@ -260,4 +260,9 @@ guint rspamd_inet_address_hash (gconstpointer a);
  */
 gboolean rspamd_inet_address_equal (gconstpointer a, gconstpointer b);
 
+/**
+ * Returns TRUE if an address belongs to some local address
+ */
+gboolean rspamd_inet_address_is_local (const rspamd_inet_addr_t *addr);
+
 #endif /* ADDR_H_ */