commit d14307b: [Project] Add methods to manipulate with allowed ids
Vsevolod Stakhov
vsevolod at highsecure.ru
Thu Jun 13 16:14:07 UTC 2019
Author: Vsevolod Stakhov
Date: 2019-06-13 15:44:25 +0100
URL: https://github.com/rspamd/rspamd/commit/d14307b475a7f08b1035df32c8b7da7d0898ff55
[Project] Add methods to manipulate with allowed ids
---
src/libserver/rspamd_symcache.c | 156 +++++++++++++++++++++++++++++++++++++++-
src/libserver/rspamd_symcache.h | 45 ++++++++++++
2 files changed, 200 insertions(+), 1 deletion(-)
diff --git a/src/libserver/rspamd_symcache.c b/src/libserver/rspamd_symcache.c
index 42e40b68c..377ac7d59 100644
--- a/src/libserver/rspamd_symcache.c
+++ b/src/libserver/rspamd_symcache.c
@@ -89,7 +89,7 @@ struct rspamd_symcache_id_list {
union {
guint32 st[4];
struct {
- guint32 e;
+ guint32 e; /* First element */
guint32 dynlen;
guint *n;
} dyn;
@@ -272,6 +272,12 @@ rspamd_symcache_order_unref (gpointer p)
REF_RELEASE (ord);
}
+static gint
+rspamd_id_cmp (const void * a, const void * b)
+{
+ return (*(guint32*)a - *(guint32*)b);
+}
+
static struct symcache_order *
rspamd_symcache_order_new (struct rspamd_symcache *cache,
gsize nelts)
@@ -2889,4 +2895,152 @@ rspamd_symcache_composites_foreach (struct rspamd_task *task,
SET_FINISH_BIT (task->checkpoint, dyn_item);
}
}
+}
+
+bool
+rspamd_symcache_set_allowed_settings_ids (struct rspamd_symcache *cache,
+ const gchar *symbol,
+ const guint32 *ids,
+ guint nids)
+{
+ struct rspamd_symcache_item *item;
+
+ item = rspamd_symcache_find_filter (cache, symbol);
+
+ if (item == NULL) {
+ return false;
+ }
+
+ if (nids <= G_N_ELEMENTS (item->allowed_ids.st)) {
+ /* Use static version */
+ memset (&item->allowed_ids, 0, sizeof (item->allowed_ids));
+ for (guint i = 0; i < nids; i++) {
+ item->allowed_ids.st[i] = ids[i];
+ }
+ }
+ else {
+ /* Need to use a separate list */
+ item->allowed_ids.dyn.e = -1; /* Flag */
+ item->allowed_ids.dyn.n = rspamd_mempool_alloc (cache->static_pool,
+ sizeof (guint32) * nids);
+ item->allowed_ids.dyn.dynlen = nids;
+
+ for (guint i = 0; i < nids; i++) {
+ item->allowed_ids.dyn.n[i] = ids[i];
+ }
+
+ /* Keep sorted */
+ qsort (item->allowed_ids.dyn.n, nids, sizeof (guint32), rspamd_id_cmp);
+ }
+
+ return true;
+}
+
+bool
+rspamd_symcache_set_forbidden_settings_ids (struct rspamd_symcache *cache,
+ const gchar *symbol,
+ const guint32 *ids,
+ guint nids)
+{
+ struct rspamd_symcache_item *item;
+
+ item = rspamd_symcache_find_filter (cache, symbol);
+
+ if (item == NULL) {
+ return false;
+ }
+
+ if (nids <= G_N_ELEMENTS (item->forbidden_ids.st)) {
+ /* Use static version */
+ memset (&item->forbidden_ids, 0, sizeof (item->forbidden_ids));
+ for (guint i = 0; i < nids; i++) {
+ item->forbidden_ids.st[i] = ids[i];
+ }
+ }
+ else {
+ /* Need to use a separate list */
+ item->forbidden_ids.dyn.e = -1; /* Flag */
+ item->forbidden_ids.dyn.n = rspamd_mempool_alloc (cache->static_pool,
+ sizeof (guint32) * nids);
+ item->forbidden_ids.dyn.dynlen = nids;
+
+ for (guint i = 0; i < nids; i++) {
+ item->forbidden_ids.dyn.n[i] = ids[i];
+ }
+
+ /* Keep sorted */
+ qsort (item->forbidden_ids.dyn.n, nids, sizeof (guint32), rspamd_id_cmp);
+ }
+
+ return true;
+}
+
+const guint32*
+rspamd_symcache_get_allowed_settings_ids (struct rspamd_symcache *cache,
+ const gchar *symbol,
+ guint *nids)
+{
+ struct rspamd_symcache_item *item;
+
+ item = rspamd_symcache_find_filter (cache, symbol);
+
+ if (item == NULL) {
+ return NULL;
+ }
+
+ if (item->allowed_ids.dyn.e == -1) {
+ /* Dynamic list */
+ *nids = item->allowed_ids.dyn.dynlen;
+
+ return item->allowed_ids.dyn.n;
+ }
+ else {
+ guint cnt = 0;
+
+ while (item->allowed_ids.st[cnt] != 0) {
+ cnt ++;
+
+ g_assert (cnt < G_N_ELEMENTS (item->allowed_ids.st));
+ }
+
+
+ *nids = cnt;
+
+ return item->allowed_ids.st;
+ }
+}
+
+const guint32*
+rspamd_symcache_get_forbidden_settings_ids (struct rspamd_symcache *cache,
+ const gchar *symbol,
+ guint *nids)
+{
+ struct rspamd_symcache_item *item;
+
+ item = rspamd_symcache_find_filter (cache, symbol);
+
+ if (item == NULL) {
+ return NULL;
+ }
+
+ if (item->forbidden_ids.dyn.e == -1) {
+ /* Dynamic list */
+ *nids = item->forbidden_ids.dyn.dynlen;
+
+ return item->forbidden_ids.dyn.n;
+ }
+ else {
+ guint cnt = 0;
+
+ while (item->forbidden_ids.st[cnt] != 0) {
+ cnt ++;
+
+ g_assert (cnt < G_N_ELEMENTS (item->allowed_ids.st));
+ }
+
+
+ *nids = cnt;
+
+ return item->forbidden_ids.st;
+ }
}
\ No newline at end of file
diff --git a/src/libserver/rspamd_symcache.h b/src/libserver/rspamd_symcache.h
index 728b7636c..3be2ab2ec 100644
--- a/src/libserver/rspamd_symcache.h
+++ b/src/libserver/rspamd_symcache.h
@@ -423,4 +423,49 @@ void rspamd_symcache_composites_foreach (struct rspamd_task *task,
struct rspamd_symcache *cache,
GHFunc func,
gpointer fd);
+
+/**
+ * Sets allowed settings ids for a symbol
+ * @param cache
+ * @param symbol
+ * @param ids
+ * @param nids
+ */
+bool rspamd_symcache_set_allowed_settings_ids (struct rspamd_symcache *cache,
+ const gchar *symbol,
+ const guint32 *ids,
+ guint nids);
+/**
+ * Sets denied settings ids for a symbol
+ * @param cache
+ * @param symbol
+ * @param ids
+ * @param nids
+ */
+bool rspamd_symcache_set_forbidden_settings_ids (struct rspamd_symcache *cache,
+ const gchar *symbol,
+ const guint32 *ids,
+ guint nids);
+
+/**
+ * Returns allowed ids for a symbol as a constant array
+ * @param cache
+ * @param symbol
+ * @param nids
+ * @return
+ */
+const guint32* rspamd_symcache_get_allowed_settings_ids (struct rspamd_symcache *cache,
+ const gchar *symbol,
+ guint *nids);
+/**
+ * Returns denied ids for a symbol as a constant array
+ * @param cache
+ * @param symbol
+ * @param nids
+ * @return
+ */
+const guint32* rspamd_symcache_get_forbidden_settings_ids (struct rspamd_symcache *cache,
+ const gchar *symbol,
+ guint *nids);
+
#endif
More information about the Commits
mailing list