summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2019-04-11 16:15:25 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2019-04-11 16:15:25 +0100
commit09704cf02c243c4a2b90899222f033d91d4df88f (patch)
tree3ebb4970f2883e80aa8ff473856270b600d050c5 /src
parent5080c1565010de3a198507bc35dadd0cc3aad210 (diff)
downloadrspamd-09704cf02c243c4a2b90899222f033d91d4df88f.tar.gz
rspamd-09704cf02c243c4a2b90899222f033d91d4df88f.zip
[Minor] Add method to print resolved spf element
Diffstat (limited to 'src')
-rw-r--r--src/libserver/spf.c30
-rw-r--r--src/libserver/spf.h30
2 files changed, 48 insertions, 12 deletions
diff --git a/src/libserver/spf.c b/src/libserver/spf.c
index f7078f3e9..ee2c06923 100644
--- a/src/libserver/spf.c
+++ b/src/libserver/spf.c
@@ -2279,3 +2279,33 @@ spf_record_unref (struct spf_resolved *rec)
{
REF_RELEASE (rec);
}
+
+gchar *
+spf_addr_mask_to_string (struct spf_addr *addr)
+{
+ GString *res;
+ gchar *s, ipstr[INET6_ADDRSTRLEN + 1];
+
+ if (addr->flags & RSPAMD_SPF_FLAG_ANY) {
+ res = g_string_new ("any");
+ }
+ else if (addr->flags & RSPAMD_SPF_FLAG_IPV4) {
+ (void)inet_ntop (AF_INET, addr->addr4, ipstr, sizeof (ipstr));
+ res = g_string_sized_new (sizeof (ipstr));
+ rspamd_printf_gstring (res, "%s/%d", ipstr, addr->m.dual.mask_v4);
+ }
+ else if (addr->flags & RSPAMD_SPF_FLAG_IPV6) {
+ (void)inet_ntop (AF_INET6, addr->addr6, ipstr, sizeof (ipstr));
+ res = g_string_sized_new (sizeof (ipstr));
+ rspamd_printf_gstring (res, "%s/%d", ipstr, addr->m.dual.mask_v6);
+ }
+ else {
+ res = g_string_new ("unknown");
+ }
+
+ s = res->str;
+ g_string_free (res, FALSE);
+
+
+ return s;
+} \ No newline at end of file
diff --git a/src/libserver/spf.h b/src/libserver/spf.h
index 83716297f..5df52d0e0 100644
--- a/src/libserver/spf.h
+++ b/src/libserver/spf.h
@@ -29,18 +29,18 @@ typedef enum spf_action_e {
SPF_RESOLVE_EXP
} spf_action_t;
-#define RSPAMD_SPF_FLAG_IPV6 (1 << 0)
-#define RSPAMD_SPF_FLAG_IPV4 (1 << 1)
-#define RSPAMD_SPF_FLAG_PROCESSED (1 << 2)
-#define RSPAMD_SPF_FLAG_ANY (1 << 3)
-#define RSPAMD_SPF_FLAG_PARSED (1 << 4)
-#define RSPAMD_SPF_FLAG_INVALID (1 << 5)
-#define RSPAMD_SPF_FLAG_REFERENCE (1 << 6)
-#define RSPAMD_SPF_FLAG_REDIRECT (1 << 7)
-#define RSPAMD_SPF_FLAG_TEMPFAIL (1 << 8)
-#define RSPAMD_SPF_FLAG_NA (1 << 9)
-#define RSPAMD_SPF_FLAG_PERMFAIL (1 << 10)
-#define RSPAMD_SPF_FLAG_RESOLVED (1 << 11)
+#define RSPAMD_SPF_FLAG_IPV6 (1u << 0u)
+#define RSPAMD_SPF_FLAG_IPV4 (1u << 1u)
+#define RSPAMD_SPF_FLAG_PROCESSED (1u << 2u)
+#define RSPAMD_SPF_FLAG_ANY (1u << 3u)
+#define RSPAMD_SPF_FLAG_PARSED (1u << 4u)
+#define RSPAMD_SPF_FLAG_INVALID (1u << 5u)
+#define RSPAMD_SPF_FLAG_REFERENCE (1u << 6u)
+#define RSPAMD_SPF_FLAG_REDIRECT (1u << 7u)
+#define RSPAMD_SPF_FLAG_TEMPFAIL (1u << 8u)
+#define RSPAMD_SPF_FLAG_NA (1u << 9u)
+#define RSPAMD_SPF_FLAG_PERMFAIL (1u << 10u)
+#define RSPAMD_SPF_FLAG_RESOLVED (1u << 11u)
struct spf_addr {
guchar addr6[sizeof (struct in6_addr)];
@@ -92,4 +92,10 @@ struct spf_resolved * spf_record_ref (struct spf_resolved *rec);
*/
void spf_record_unref (struct spf_resolved *rec);
+/**
+ * Prints address + mask in a freshly allocated string (must be freed)
+ * @param addr
+ * @return
+ */
+gchar *spf_addr_mask_to_string (struct spf_addr *addr);
#endif