static void expire_dynamic_trigger(void *data) { banrecord_t *rec = data; struct in_addr sin; prefix_t *pfx; patricia_node_t *node; trigger_t *t = rec->trigger; run_triggers(ACTION_UNBAN, rec->trigger, &rec->pkt, rec); switch (t->type) { case TRIGGER_SRC: sin.s_addr = rec->pkt.pkt_src.s_addr; break; case TRIGGER_DST: default: sin.s_addr = rec->pkt.pkt_dst.s_addr; break; }; pfx = New_Prefix(AF_INET, &sin, 32); node = patricia_lookup(banrecord_trie, pfx); patricia_remove(banrecord_trie, node); Deref_Prefix(pfx); free(rec); }
int main (int argc, char **argv) { GOptionContext *context; GError *real_error = NULL; GError **error = &real_error; GCancellable *cancellable = NULL; gboolean ret = FALSE; g_type_init (); context = g_option_context_new ("- Regenerate caches in operating system tree"); g_option_context_add_main_entries (context, options, NULL); if (!g_option_context_parse (context, &argc, &argv, error)) goto out; if (!run_triggers (cancellable, error)) goto out; ret = TRUE; out: if (real_error) g_printerr ("%s\n", real_error->message); g_clear_error (&real_error); if (!ret) return 1; return 0; }
static banrecord_t * trigger_ban(trigger_t *t, packet_info_t *packet, iprecord_t *irec) { banrecord_t *rec; prefix_t *pfx; patricia_node_t *node; struct in_addr sin; switch (t->type) { case TRIGGER_SRC: sin.s_addr = packet->pkt_src.s_addr; break; case TRIGGER_DST: default: sin.s_addr = packet->pkt_dst.s_addr; break; }; if (ban_find(sin.s_addr) != NULL) return NULL; rec = calloc(sizeof(banrecord_t), 1); rec->trigger = t; memcpy(&rec->irec, irec, sizeof(iprecord_t)); memcpy(&rec->pkt, packet, sizeof(packet_info_t)); rec->added = mowgli_eventloop_get_time(eventloop); rec->expiry_ts = rec->added + (t->expiry ? t->expiry : expiry); pfx = New_Prefix(AF_INET, &sin, 32); node = patricia_lookup(banrecord_trie, pfx); node->data = rec; Deref_Prefix(pfx); run_triggers(ACTION_BAN, t, packet, rec); rec->timer = mowgli_timer_add_once(eventloop, "expire_dynamic_trigger", expire_dynamic_trigger, rec, (t->expiry ? t->expiry : expiry)); return rec; }