summaryrefslogtreecommitdiffstats
path: root/daemon/fromd/ip_desc_db.c
diff options
context:
space:
mode:
authorwens <wens@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-04-08 00:49:43 +0800
committerwens <wens@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-04-08 00:49:43 +0800
commitb76330e31e3d2a25da5060aee9ad379db816fb03 (patch)
treef1e610485e0b49d1b4707bfda84e768f8a830d37 /daemon/fromd/ip_desc_db.c
parent0b1e8ae653a203791ff3b7a414401a3c58f543b4 (diff)
downloadpttbbs-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.c103
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;
+}