update
[rrq/nfblocker.git] / src / cache.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include <sys/types.h>
4
5 typedef struct _CacheEntry {
6     unsigned char *domain;
7     unsigned int ix;
8 } CacheEntry;
9
10 struct {
11     CacheEntry *table;
12     int size;
13 } cache;
14
15 int hash_code(unsigned char *domain) {
16     int i = 0;
17     for ( ; *domain; domain++ ) {
18         i += *domain;
19     }
20     return i % cache.size;
21 }
22
23 int lookup_cache(unsigned char *domain) {
24     if ( cache.table ) {
25         int i = hash_code( domain );
26         if ( cache.table[i].domain &&
27              strcmp( (char*)  domain, (char*) cache.table[i].domain ) == 0 ) {
28             return cache.table[i].ix;
29         }
30     }
31     return -1;
32 }
33
34 void add_cache(unsigned char *domain,unsigned int ix) {
35     if ( cache.table == 0 ) {
36         cache.size = 1024;
37         cache.table = (CacheEntry*) calloc( cache.size, sizeof( CacheEntry ) );
38     }
39     int i = hash_code( domain );
40     if ( cache.table[i].domain ) {
41         free( cache.table[i].domain );
42     }
43     cache.table[i].domain =  (unsigned char*) strdup( (char*) domain );
44     cache.table[i].ix = ix;
45 }