diff options
Diffstat (limited to 'src/ipsort.c')
-rw-r--r-- | src/ipsort.c | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/src/ipsort.c b/src/ipsort.c new file mode 100644 index 0000000..f7d37b9 --- /dev/null +++ b/src/ipsort.c @@ -0,0 +1,153 @@ +/* +// AUTHOR +// N. Nielsen +// +// VERSION +// 0.2 +// +// LICENSE +// This software is in the public domain. +// +// The software is provided "as is", without warranty of any kind, +// express or implied, including but not limited to the warranties +// of merchantability, fitness for a particular purpose, and +// noninfringement. In no event shall the author(s) be liable for any +// claim, damages, or other liability, whether in an action of +// contract, tort, or otherwise, arising from, out of, or in connection +// with the software or the use or other dealings in the software. +// +// SUPPORT +// Send bug reports to: <nielsen@memberwebs.com> +*/ + +#include <sys/types.h> +#include <sys/socket.h> +#include <db.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <fcntl.h> + +#include <netinet/in.h> + +void readIps(FILE* fIn); +void writeIps(FILE* fOut); + +/* DB of traffic accessed recently */ +DB* g_db = NULL; + +/* TODO: Use an actual compare function */ + +int main(int argc, char* argv[]) +{ + BTREEINFO bi; + + memset(&bi, 0, sizeof(bi)); + /* bi.compare = compareIp; */ + + g_db = dbopen(NULL, O_CREAT | O_RDWR, 0, DB_BTREE, (const void*)&bi); + + if(g_db == NULL) + errx(1, "db initialization failed"); + + readIps(stdin); + writeIps(stdout); +} + +/* + * Parse helpers + */ +static void eatSpace(FILE* file) +{ + char ch; + + do + { + ch = getc(file); + + if(ch == '#') + { + while(ch != '\n') + ch = getc(file); + } + } + while(isspace(ch) && !feof(file) && !ferror(file)); + + ungetc(ch, file); +} + +/* + * Read Input + */ +void readIps(FILE* fIn) +{ + DBT key, value; + struct in_addr addr; + char address[16]; + + key.data = &addr; + key.size = sizeof(addr); + value.data = &addr; + value.size = sizeof(addr); + + eatSpace(fIn); + + while(!feof(fIn) && !ferror(fIn)) + { + char ch; + int i = 0; + + /* Read a word and store the first 16 chars */ + while(!feof(fIn) && !ferror(fIn)) + { + ch = fgetc(fIn); + + if(isspace(ch)) + break; + + if(i < 16) + address[i] = ch; + + i++; + } + + address[i] = 0; + + if(!inet_pton(AF_INET, address, (void*)&addr)) + warnx("invalid ip in address: %s", address); + + if(g_db->put(g_db, &key, &value, 0) < 0) + err(1, "database error: %s\n"); + + eatSpace(fIn); + } + + if(ferror(fIn)) + err(1, "error reading addresses"); +} + +/* + * Write collated output back out + */ +void writeIps(FILE* fOut) +{ + DBT key, value; + int ret; + + struct in_addr prev; /* The previous address */ + + struct in_addr top; /* The address at the top of the current stack */ + int size; /* The stack size */ + + memset(&key, 0, sizeof(key)); + memset(&value, 0, sizeof(value)); + + /* Get first key from DB */ + ret = g_db->seq(g_db, &key, &value, R_FIRST); + + while(ret == 0) + { + printf("%s\n", inet_ntoa(*((struct in_addr*)key.data))); + ret = g_db->seq(g_db, &key, &value, R_NEXT); + } +} |