X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=rbl.c;h=3f98ee902dd87179b4b81fc154da336f3efefa30;hb=6a736221313a18d611bc5e2c49f4fa8b354390f2;hp=71f1d85bb5c67d5ba2bb115bc5a1982d573d9d64;hpb=6a966ebc32006b64216715314ce21a506ef1f7c4;p=apps%2Fpfixtools.git diff --git a/rbl.c b/rbl.c index 71f1d85..3f98ee9 100644 --- a/rbl.c +++ b/rbl.c @@ -60,6 +60,7 @@ enum { struct rbldb_t { uint32_t len, size; uint32_t *ips; + bool locked; }; static int get_o(const char *s, const char **out) @@ -114,7 +115,7 @@ static int parse_ipv4(const char *s, const char **out, uint32_t *ip) return 0; } -rbldb_t *rbldb_create(const char *file) +rbldb_t *rbldb_create(const char *file, bool lock) { rbldb_t *db; const char *map, *p, *end; @@ -169,6 +170,10 @@ rbldb_t *rbldb_create(const char *file) } munmap((void*)map, st.st_size); + /* Lookup may perform serveral I/O, so avoid swap. + */ + db->locked = lock && mlock(db->ips, db->len * sizeof(*(db->ips))) == 0; + if (db->len) { # define QSORT_TYPE uint32_t # define QSORT_BASE db->ips @@ -184,6 +189,9 @@ rbldb_t *rbldb_create(const char *file) void rbldb_delete(rbldb_t **db) { if (*db) { + if ((*db)->locked) { + (void)munlock((*db)->ips, (*db)->len * sizeof(*(*db)->ips)); + } p_delete(&(*db)->ips); p_delete(&(*db)); }