diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-17 01:04:17 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-02-17 01:04:17 +0000 |
commit | c3b707c026782768bd8c0e6ae6b574fe8a36802d (patch) | |
tree | 5ca6782031b1546c788290cc0b95524369ff01ea /KMFIPTInterface/iptchecker.cpp | |
download | kmyfirewall-c3b707c026782768bd8c0e6ae6b574fe8a36802d.tar.gz kmyfirewall-c3b707c026782768bd8c0e6ae6b574fe8a36802d.zip |
Added old abandoned KDE3 version of kmyfirewall
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kmyfirewall@1091559 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'KMFIPTInterface/iptchecker.cpp')
-rw-r--r-- | KMFIPTInterface/iptchecker.cpp | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/KMFIPTInterface/iptchecker.cpp b/KMFIPTInterface/iptchecker.cpp new file mode 100644 index 0000000..bf6979d --- /dev/null +++ b/KMFIPTInterface/iptchecker.cpp @@ -0,0 +1,234 @@ +/*************************************************************************** + * Copyright (C) 2005 by Christian Hubinger * + * e9806056@student.tuwien.ac.at * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#include "iptchecker.h" + + +extern "C" { +#include <getopt.h> +#include <sys/errno.h> +#include <stdio.h> +#include <fcntl.h> +#include <stdlib.h> +#include <string.h> +#include <dlfcn.h> +#include <time.h> +#include <netdb.h> +#include "libiptc/libiptc.h" +#include "iptables.h" +} + + +/* Here begins some of the code taken from iptables-save.c **************** */ +#define IP_PARTS_NATIVE(n) \ + (unsigned int)((n)>>24)&0xFF, \ + (unsigned int)((n)>>16)&0xFF, \ + (unsigned int)((n)>>8)&0xFF, \ + (unsigned int)((n)&0xFF) + + + +IPTChecker::IPTChecker() +{ +} + + +IPTChecker::~IPTChecker() +{ +} + +int IPTChecker::numChainsInTable( char *tablename ) { + int foundChain = 0; + iptc_handle_t h; + const char *chain = NULL; + + h = iptc_init(tablename); + if (!h) { + printf("Can't initialize IPT Handle for table %s : %s\n", tablename, iptc_strerror(errno)); + return -1; + } + + for (chain = iptc_first_chain(&h); chain; chain = iptc_next_chain(&h)) { + foundChain++; + } + printf("Table %s Num: %d\n", tablename, foundChain ); + return foundChain; +} + + +int IPTChecker::numRulesInChain( char *tablename, char *chain ) { + int foundRule = 0; + iptc_handle_t h; + const struct ipt_entry *e; + const char *ch = NULL; + + h = iptc_init(tablename); + if (!h) { + printf("Can't initialize IPT Handle for table %s : %s\n", tablename, iptc_strerror(errno)); + return -1; + } + + if ( iptc_is_chain( chain, h ) == 0 ) { + printf("Error Chain: %s Not Found in table: %s\n", chain, tablename ); + return -1; + } + for (ch = iptc_first_chain(&h); ch; ch = iptc_next_chain(&h)) { + if ( strcmp( ch, chain ) == 0 ) { + int found = 0; + for (e = iptc_first_rule(ch, &h); e && found == 0; e = iptc_next_rule(e, &h)) { + foundRule++; + } + printf("Table: %s Chain: %s Num Rules: %d\n", tablename, chain, foundRule ); + return foundRule; + } + } + return -1; +} +QStringList IPTChecker::getRuleProperties( char * table, char *chain, int ruleIndex ) { + QStringList list; + int numRules = 0; + int found = 0; + iptc_handle_t h; + const struct ipt_entry *rule = 0; + const struct ipt_entry *my_rule = 0; + const char *ch = NULL; + + h = iptc_init(table); + if (!h) { + printf("Can't initialize IPT Handle for table %s : %s\n", table, iptc_strerror(errno)); + return list; + } + + if ( iptc_is_chain( chain, h ) == 0 ) { + printf("Error Chain: %s Not Found in table: %s\n", chain, table ); + return list; + } + int foundChain = 0; + for (ch = iptc_first_chain(&h); ch && foundChain == 0; ch = iptc_next_chain(&h)) { + if ( strcmp( ch, chain ) == 0 ) { + foundChain = 1; + for (rule = iptc_first_rule(ch, &h); rule && found == 0; rule = iptc_next_rule(rule, &h)) { + if ( numRules == ruleIndex ) { + my_rule = rule; + found = 1; + } + numRules++; + } + } + } + if ( my_rule ) { + const char *target_name; + /* Print target name */ + target_name = iptc_get_target( my_rule, &h ); + if ( target_name && (*target_name != '\0') ) { + + list << QString("%1").arg(target_name); + } + + + /* Print targinfo part */ +/* struct ipt_entry_target *t; + t = ipt_get_target( (struct ipt_entry *) my_rule ); + if ( t ) { + list << "Found Target:"; + list << t->u.user.name; + } + + if ( t->u.user.name ) { + list << QString("TARGET2:%1").arg(t->u.user.name); + + struct iptables_target *target = find_target( target_name, TRY_LOAD ); + + if ( ! target ) { + list << "Can't find library for target `%s'\n" << t->u.user.name; + return list; + } + + if (target->save) { + target->save(&my_rule->ip, t); + } else { + // If the target size is greater than ipt_entry_target + // there is something to be saved, we just don't know + // how to print it + if (t->u.target_size != sizeof(struct ipt_entry_target)) { + fprintf(stderr, "Target `%s' is missing " + "save function\n", + t->u.user.name); + return list; + } + } + }*/ + } else { + list << "ERROR"; + } + return list; +} + +QStringList IPTChecker::getChainsInTable( char * table ) { + QStringList list; + int foundRule = 0; + iptc_handle_t h; + const struct ipt_entry *e; + const char *chain = NULL; + + h = iptc_init(table); + if (!h) { + printf("Can't initialize IPT Handle for table %s : %s\n", table, iptc_strerror(errno)); + return list; + } + + + for ( chain = iptc_first_chain(&h); chain; chain = iptc_next_chain(&h) ) { + list << chain; + } + return list; +} + + +QString IPTChecker::getChainPolicy( char * table, char *chain ) { + QString policy = ""; + iptc_handle_t h; + const struct ipt_entry *e; + const char *ch = NULL; + + h = iptc_init(table); + if (!h) { + printf("Can't initialize IPT Handle for table %s : %s\n", table, iptc_strerror(errno)); + return ""; + } + + + for ( ch = iptc_first_chain(&h); ch; ch = iptc_next_chain(&h) ) { + if ( strcmp( ch, chain ) == 0 ) { + + if ( iptc_builtin(chain, h) ) { + struct ipt_counters count; + policy = iptc_get_policy(chain, &count, &h); + +/* printf("%s ", + iptc_get_policy(chain, &count, &h)); + printf("[%llu:%llu]\n", (unsigned long long)count.pcnt, (unsigned long long)count.bcnt);*/ + } else { +// printf("- [0:0]\n"); + } + + } + } + return policy; +} |