diff options
author | wens <wens@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2008-04-08 00:49:43 +0800 |
---|---|---|
committer | wens <wens@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2008-04-08 00:49:43 +0800 |
commit | b76330e31e3d2a25da5060aee9ad379db816fb03 (patch) | |
tree | f1e610485e0b49d1b4707bfda84e768f8a830d37 /daemon/fromd/ip_desc_db.c | |
parent | 0b1e8ae653a203791ff3b7a414401a3c58f543b4 (diff) | |
download | pttbbs-b76330e31e3d2a25da5060aee9ad379db816fb03.tar pttbbs-b76330e31e3d2a25da5060aee9ad379db816fb03.tar.gz pttbbs-b76330e31e3d2a25da5060aee9ad379db816fb03.tar.bz2 pttbbs-b76330e31e3d2a25da5060aee9ad379db816fb03.tar.lz pttbbs-b76330e31e3d2a25da5060aee9ad379db816fb03.tar.xz pttbbs-b76330e31e3d2a25da5060aee9ad379db816fb03.tar.zst pttbbs-b76330e31e3d2a25da5060aee9ad379db816fb03.zip |
New daemon: fromd
Move source description lookup out of SHM
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@4090 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'daemon/fromd/ip_desc_db.c')
-rw-r--r-- | daemon/fromd/ip_desc_db.c | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/daemon/fromd/ip_desc_db.c b/daemon/fromd/ip_desc_db.c new file mode 100644 index 00000000..137e5fa7 --- /dev/null +++ b/daemon/fromd/ip_desc_db.c @@ -0,0 +1,103 @@ +// $Id$ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> + +#include "bbs.h" + +typedef struct { + uint32_t network, netmask; + char desc[32]; +} db_entry; + +static db_entry *db = NULL; +static int db_len = 0, db_size = 0; + +#define DB_INCREMENT 200 + +int ip_desc_db_reload(const char * cfgfile) +{ + FILE *fp; + char buf[256]; + char *ip, *mask; + db_entry *new_db = NULL; + int new_db_len = 0, new_db_size = 0; + int result = 0; + + if ( (fp = fopen(cfgfile, "r")) == NULL) + return -1; + + while (fgets(buf, sizeof(buf), fp)) { + //skip empty lines + if (!buf[0] || buf[0] == '\n') + continue; + + ip = strtok(buf, " \t\n"); + + if (ip == NULL || *ip == '#' || *ip == '@') + continue; + + // expand database if nessecary + if (new_db_len == new_db_size) { + void * ptr; + if ( (ptr = realloc(new_db, sizeof(db_entry) * + (new_db_size + DB_INCREMENT))) == NULL ) { + result = 1; + break; + } + + new_db = ptr; + new_db_size += DB_INCREMENT; + } + + // netmask + if ( (mask = strchr(ip, '/')) != NULL ) { + int shift = 32 - atoi(mask + 1); + new_db[new_db_len].netmask = htonl(0xFFFFFFFFu << shift); + *mask = '\0'; + } + else + new_db[new_db_len].netmask = 0xFFFFFFFFu; + + // network + new_db[new_db_len].network = htonl(ipstr2int(ip)) & + new_db[new_db_len].netmask; + + // description + if ( (ip = strtok(NULL, " \t\n")) == NULL ) { + strcpy(new_db[new_db_len].desc, "¶³²`¤£ª¾³B"); + } + else { + strlcpy(new_db[new_db_len].desc, ip, + sizeof(new_db[new_db_len].desc)); + } + + new_db_len++; + } + + fclose(fp); + + if (new_db != NULL) { + free(db); + db = new_db; + db_len = new_db_len; + db_size = new_db_size; + } + + return result; +} + +const char * ip_desc_db_lookup(const char * ip) +{ + int i; + + for (i = 0; i < db_len; i++) { + if (db[i].network == (htonl(ipstr2int(ip)) & db[i].netmask)) { + return db[i].desc; + } + } + return ip; +} |