strpool moved to uthash

This commit is contained in:
bolvan
2018-07-22 22:27:28 +03:00
parent 667afc814e
commit 4d7f41980a
12 changed files with 1294 additions and 108 deletions

View File

@@ -1,83 +0,0 @@
#include "chartree.h"
#include <string.h>
#include <stdlib.h>
static cptr *CharTreeInit(char c)
{
cptr *p;
p=(cptr *)calloc(1,sizeof(cptr));
if (p) p->chr = c;
return p;
}
void CharTreeDestroy(cptr *p)
{
cptr *p2;
while (p)
{
CharTreeDestroy(p->leaf);
p2 = p;
p = p->next;
free(p2);
}
}
static cptr *CharTreeFindChar(cptr *p,char c)
{
while (p)
{
if (p->chr==c) return p;
p = p->next;
}
return NULL;
}
bool CharTreeAddStr(cptr **pp,const char *s)
{
cptr *p;
if (*pp)
{
if (!(p=CharTreeFindChar(*pp,*s)))
{
// already present. append to list head
if (!(p = CharTreeInit(*s)))
return false;
p->next = *pp;
*pp = p;
}
}
else
if (!(p = *pp = CharTreeInit(*s))) return false;
if (!*s) return true;
return CharTreeAddStr(&p->leaf,s+1);
}
bool CharTreeCheckStr(cptr *p,const char *s)
{
p = CharTreeFindChar(p,*s);
if (!p) return false;
if (!*s) return true;
return CharTreeCheckStr(p->leaf,s+1);
}
static char *DupLower(const char *s)
{
char *sp,*sl = strdup(s);
if (!sl) return false;
for(sp=sl;*sp;sp++) *sp=tolower(*sp);
return sl;
}
bool CharTreeAddStrLower(cptr **pp,const char *s)
{
bool b;
char *sl = DupLower(s);
if (!sl) return false;
b=CharTreeAddStr(pp,sl);
free(sl);
return b;
}
bool CharTreeCheckStrLower(cptr *pp,const char *s)
{
bool b;
char *sl = DupLower(s);
if (!sl) return false;
b=CharTreeCheckStr(pp,sl);
free(sl);
return b;
}

View File

@@ -1,16 +0,0 @@
#pragma once
#include <stdbool.h>
#include <ctype.h>
typedef struct cptr
{
char chr;
struct cptr *leaf,*next;
} cptr;
void CharTreeDestroy(cptr *p);
bool CharTreeAddStr(cptr **pp,const char *s);
bool CharTreeAddStrLower(cptr **pp,const char *s);
bool CharTreeCheckStr(cptr *p,const char *s);
bool CharTreeCheckStrLower(cptr *pp,const char *s);

50
tpws/strpool.c Normal file
View File

@@ -0,0 +1,50 @@
#include "strpool.h"
#include <string.h>
#include <stdlib.h>
#undef uthash_nonfatal_oom
#define uthash_nonfatal_oom(elt) ut_oom_recover(elt)
static bool oom=false;
static void ut_oom_recover(strpool *elem)
{
oom=true;
}
bool StrPoolAddStr(strpool **pp,const char *s)
{
strpool *elem;
if (!(elem = (strpool*)malloc(sizeof(strpool))))
return false;
if (!(elem->str = strdup(s)))
{
free(elem);
return false;
}
oom = false;
HASH_ADD_KEYPTR( hh, *pp, elem->str, strlen(elem->str), elem );
if (oom)
{
free(elem->str);
free(elem);
return false;
}
return true;
}
bool StrPoolCheckStr(strpool *p,const char *s)
{
strpool *elem;
HASH_FIND_STR( p, s, elem);
return elem!=NULL;
}
void StrPoolDestroy(strpool **p)
{
strpool *elem,*tmp;
HASH_ITER(hh, *p, elem, tmp) {
free(elem->str);
HASH_DEL(*p, elem);
free(elem);
}
*p = NULL;
}

18
tpws/strpool.h Normal file
View File

@@ -0,0 +1,18 @@
#pragma once
#include <stdbool.h>
#include <ctype.h>
//#define HASH_BLOOM 20
#define HASH_NONFATAL_OOM 1
#define HASH_FUNCTION HASH_BER
#include "uthash.h"
typedef struct strpool {
char *str; /* key */
UT_hash_handle hh; /* makes this structure hashable */
} strpool;
void StrPoolDestroy(strpool **p);
bool StrPoolAddStr(strpool **pp,const char *s);
bool StrPoolCheckStr(strpool *p,const char *s);

View File

@@ -24,9 +24,9 @@
#include "tpws.h"
#include "tpws_conn.h"
#include "chartree.h"
#include "strpool.h"
bool LoadHostList(cptr **hostlist, char *filename)
bool LoadHostList(strpool **hostlist, char *filename)
{
char *p, s[256];
FILE *F = fopen(filename, "rt");
@@ -42,9 +42,9 @@ bool LoadHostList(cptr **hostlist, char *filename)
{
for (p = s + strlen(s) - 1; p >= s && (*p == '\r' || *p == '\n'); p--) *p = 0;
for (p = s; *p; p++) *p=tolower(*p);
if (!CharTreeAddStr(hostlist, s))
if (!StrPoolAddStr(hostlist, s))
{
CharTreeDestroy(*hostlist);
StrPoolDestroy(hostlist);
*hostlist = NULL;
fprintf(stderr, "Not enough memory to store host list : %s\n", filename);
fclose(F);
@@ -72,7 +72,7 @@ struct params_s
int split_pos;
int maxconn;
char hostfile[256];
cptr *hostlist;
strpool *hostlist;
};
struct params_s params;
@@ -104,7 +104,7 @@ void dohup()
{
if (params.hostlist)
{
CharTreeDestroy(params.hostlist);
StrPoolDestroy(&params.hostlist);
if (!LoadHostList(&params.hostlist, params.hostfile))
exit(1);
}
@@ -221,7 +221,7 @@ bool handle_epollin(tproxy_conn_t *conn, int *data_transferred) {
p = Host;
while (p)
{
bInHostList = CharTreeCheckStr(params.hostlist, p);
bInHostList = StrPoolCheckStr(params.hostlist, p);
printf("Hostlist check for %s : %s\n", p, bInHostList ? "positive" : "negative");
if (bInHostList) break;
p = strchr(p, '.');
@@ -851,7 +851,7 @@ int main(int argc, char *argv[]) {
retval = event_loop(listen_fd);
close(listen_fd);
if (params.hostlist) CharTreeDestroy(params.hostlist);
if (params.hostlist) StrPoolDestroy(&params.hostlist);
fprintf(stderr, "Will exit\n");

1217
tpws/uthash.h Normal file

File diff suppressed because it is too large Load Diff