77 lines
1.9 KiB
C
77 lines
1.9 KiB
C
/*
|
|
* caching_relay - in-memory runtime state
|
|
*/
|
|
#define _GNU_SOURCE
|
|
#include "state.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
/* ---- pubkey set ---- */
|
|
|
|
void cr_pubkey_set_init(cr_pubkey_set_t *s) {
|
|
s->items = NULL;
|
|
s->count = 0;
|
|
s->capacity = 0;
|
|
}
|
|
|
|
void cr_pubkey_set_free(cr_pubkey_set_t *s) {
|
|
for (int i = 0; i < s->count; i++) free(s->items[i]);
|
|
free(s->items);
|
|
s->items = NULL;
|
|
s->count = 0;
|
|
s->capacity = 0;
|
|
}
|
|
|
|
void cr_pubkey_set_clear(cr_pubkey_set_t *s) {
|
|
cr_pubkey_set_free(s);
|
|
cr_pubkey_set_init(s);
|
|
}
|
|
|
|
int cr_pubkey_set_contains(const cr_pubkey_set_t *s, const char *hex) {
|
|
for (int i = 0; i < s->count; i++) {
|
|
if (strcmp(s->items[i], hex) == 0) return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int cr_pubkey_set_add(cr_pubkey_set_t *s, const char *hex) {
|
|
if (!hex || !hex[0]) return 0;
|
|
if (cr_pubkey_set_contains(s, hex)) return 0;
|
|
if (s->count >= s->capacity) {
|
|
int newcap = s->capacity ? s->capacity * 2 : 64;
|
|
char **ni = realloc(s->items, newcap * sizeof(char *));
|
|
if (!ni) return -1;
|
|
s->items = ni;
|
|
s->capacity = newcap;
|
|
}
|
|
s->items[s->count] = strdup(hex);
|
|
if (!s->items[s->count]) return -1;
|
|
s->count++;
|
|
return 1;
|
|
}
|
|
|
|
/* ---- seen-event ring buffer ---- */
|
|
|
|
void cr_seen_ring_init(cr_seen_ring_t *r) {
|
|
memset(r, 0, sizeof(*r));
|
|
}
|
|
|
|
int cr_seen_ring_contains(const cr_seen_ring_t *r, const char *id) {
|
|
for (int i = 0; i < r->count; i++) {
|
|
int idx = (r->head - 1 - i + CR_SEEN_RING_SIZE) % CR_SEEN_RING_SIZE;
|
|
if (strcmp(r->ids[idx], id) == 0) return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int cr_seen_ring_add(cr_seen_ring_t *r, const char *id) {
|
|
if (!id || !id[0]) return 0;
|
|
if (cr_seen_ring_contains(r, id)) return 0;
|
|
strncpy(r->ids[r->head], id, CR_HEX_LEN - 1);
|
|
r->ids[r->head][CR_HEX_LEN - 1] = '\0';
|
|
r->head = (r->head + 1) % CR_SEEN_RING_SIZE;
|
|
if (r->count < CR_SEEN_RING_SIZE) r->count++;
|
|
return 1;
|
|
}
|