Browse Source

Refine cache replacing

pull/953/head
Max Lv 8 years ago
parent
commit
c6876b0707
4 changed files with 22 additions and 16 deletions
  1. 22
      src/acl.c
  2. 10
      src/cache.c
  3. 4
      src/cache.h
  4. 2
      src/udprelay.c

22
src/acl.c

@ -130,7 +130,7 @@ init_firewall()
if (pclose(fp) == 0) { if (pclose(fp) == 0) {
mode = FIREWALLD_MODE; mode = FIREWALLD_MODE;
} else { } else {
/* Check whether we have permission to operate iptables.
/* Check whether we have permission to operate iptables.
* Note that checking `iptables --version` is insufficient: * Note that checking `iptables --version` is insufficient:
* eg, running within a child user namespace. * eg, running within a child user namespace.
*/ */
@ -223,6 +223,16 @@ set_firewall_rule(char *addr, int add)
return 0; return 0;
} }
static void
free_firewall_rule(void *key, void *element)
{
if (key == NULL)
return;
char *addr = (char *)key;
set_firewall_rule(addr, 0);
ss_free(element);
}
#endif #endif
void void
@ -231,8 +241,10 @@ init_block_list()
// Initialize cache // Initialize cache
#ifdef __linux__ #ifdef __linux__
init_firewall(); init_firewall();
#endif
cache_create(&block_list, 256, free_firewall_rule);
#else
cache_create(&block_list, 256, NULL); cache_create(&block_list, 256, NULL);
#endif
} }
void void
@ -248,12 +260,6 @@ int
remove_from_block_list(char *addr) remove_from_block_list(char *addr)
{ {
size_t addr_len = strlen(addr); size_t addr_len = strlen(addr);
#ifdef __linux__
if (cache_key_exist(block_list, addr, addr_len))
set_firewall_rule(addr, 0);
#endif
return cache_remove(block_list, addr, addr_len); return cache_remove(block_list, addr, addr_len);
} }

10
src/cache.c

@ -47,7 +47,7 @@
*/ */
int int
cache_create(struct cache **dst, const size_t capacity, cache_create(struct cache **dst, const size_t capacity,
void (*free_cb)(void *element))
void (*free_cb)(void *key, void *element))
{ {
struct cache *new = NULL; struct cache *new = NULL;
@ -92,7 +92,7 @@ cache_delete(struct cache *cache, int keep_data)
HASH_DEL(cache->entries, entry); HASH_DEL(cache->entries, entry);
if (entry->data != NULL) { if (entry->data != NULL) {
if (cache->free_cb) { if (cache->free_cb) {
cache->free_cb(entry->data);
cache->free_cb(entry->key, entry->data);
} else { } else {
ss_free(entry->data); ss_free(entry->data);
} }
@ -132,7 +132,7 @@ cache_clear(struct cache *cache, ev_tstamp age)
HASH_DEL(cache->entries, entry); HASH_DEL(cache->entries, entry);
if (entry->data != NULL) { if (entry->data != NULL) {
if (cache->free_cb) { if (cache->free_cb) {
cache->free_cb(entry->data);
cache->free_cb(entry->key, entry->data);
} else { } else {
ss_free(entry->data); ss_free(entry->data);
} }
@ -173,7 +173,7 @@ cache_remove(struct cache *cache, char *key, size_t key_len)
HASH_DEL(cache->entries, tmp); HASH_DEL(cache->entries, tmp);
if (tmp->data != NULL) { if (tmp->data != NULL) {
if (cache->free_cb) { if (cache->free_cb) {
cache->free_cb(tmp->data);
cache->free_cb(tmp->key, tmp->data);
} else { } else {
ss_free(tmp->data); ss_free(tmp->data);
} }
@ -291,7 +291,7 @@ cache_insert(struct cache *cache, char *key, size_t key_len, void *data)
HASH_DELETE(hh, cache->entries, entry); HASH_DELETE(hh, cache->entries, entry);
if (entry->data != NULL) { if (entry->data != NULL) {
if (cache->free_cb) { if (cache->free_cb) {
cache->free_cb(entry->data);
cache->free_cb(entry->key, entry->data);
} else { } else {
ss_free(entry->data); ss_free(entry->data);
} }

4
src/cache.h

@ -47,11 +47,11 @@ struct cache_entry {
struct cache { struct cache {
size_t max_entries; /**<Amount of entries this cache object can hold */ size_t max_entries; /**<Amount of entries this cache object can hold */
struct cache_entry *entries; /**<Head pointer for uthash */ struct cache_entry *entries; /**<Head pointer for uthash */
void (*free_cb) (void *element); /**<Callback function to free cache entries */
void (*free_cb) (void *key, void *element); /**<Callback function to free cache entries */
}; };
int cache_create(struct cache **dst, const size_t capacity, int cache_create(struct cache **dst, const size_t capacity,
void (*free_cb)(void *element));
void (*free_cb)(void *key, void *element));
int cache_delete(struct cache *cache, int keep_data); int cache_delete(struct cache *cache, int keep_data);
int cache_clear(struct cache *cache, ev_tstamp age); int cache_clear(struct cache *cache, ev_tstamp age);
int cache_lookup(struct cache *cache, char *key, size_t key_len, void *result); int cache_lookup(struct cache *cache, char *key, size_t key_len, void *result);

2
src/udprelay.c

@ -1297,7 +1297,7 @@ CLEAN_UP:
} }
void void
free_cb(void *element)
free_cb(void *key, void *element)
{ {
remote_ctx_t *remote_ctx = (remote_ctx_t *)element; remote_ctx_t *remote_ctx = (remote_ctx_t *)element;

Loading…
Cancel
Save