IPTables-IPv4
view release on metacpan or search on metacpan
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include <libiptc/libiptc.h>
#include <errno.h>
#include "packer.h"
#include "unpacker.h"
#include "loader.h"
#include "maskgen.h"
#include "module_iface.h"
typedef iptc_handle_t* IPTables__IPv4__Table;
MODULE = IPTables::IPv4 PACKAGE = IPTables::IPv4
IPTables::IPv4::Table
init(tablename)
char * tablename
PREINIT:
iptc_handle_t handle;
CODE:
handle = iptc_init(tablename);
if(handle == NULL) {
RETVAL = NULL;
SET_ERRNUM(errno);
SET_ERRSTR("%s", iptc_strerror(errno));
SvIOK_on(ERROR_SV);
}
else {
RETVAL = malloc(sizeof(iptc_handle_t));
*RETVAL = handle;
ipt_loader_setup();
}
OUTPUT:
RETVAL
MODULE = IPTables::IPv4 PACKAGE = IPTables::IPv4::Table
int
is_chain(self, chain)
IPTables::IPv4::Table self
ipt_chainlabel chain
CODE:
RETVAL = iptc_is_chain(chain, *self);
OUTPUT:
RETVAL
void
list_chains(self)
IPTables::IPv4::Table self
PREINIT:
char * chain;
SV * sv;
int count = 0;
PPCODE:
sv = ST(0);
chain = (char *)iptc_first_chain(self);
while(chain) {
count++;
if (GIMME_V == G_ARRAY)
XPUSHs(sv_2mortal(newSVpv(chain, 0)));
chain = (char *)iptc_next_chain(self);
}
if (GIMME_V == G_SCALAR)
XPUSHs(sv_2mortal(newSViv(count)));
void
list_rules(self, chain)
IPTables::IPv4::Table self
ipt_chainlabel chain
PREINIT:
SV * sv;
int count = 0;
PPCODE:
sv = ST(0);
if(iptc_is_chain(chain, *self)) {
struct ipt_entry *entry =
(struct ipt_entry *)iptc_first_rule(chain, self);
while(entry) {
count++;
if (GIMME_V == G_ARRAY)
XPUSHs(sv_2mortal(newRV_noinc((SV*)ipt_do_unpack(entry, self))));
entry = (struct ipt_entry *)iptc_next_rule(entry, self);
}
}
if (GIMME_V == G_SCALAR)
XPUSHs(sv_2mortal(newSViv(count)));
int
builtin(self, chain)
IPTables::IPv4::Table self
ipt_chainlabel chain
CODE:
RETVAL = iptc_builtin(chain, *self);
OUTPUT:
RETVAL
void
get_policy(self, chain)
IPTables::IPv4::Table self
ipt_chainlabel chain
PREINIT:
struct ipt_counters counter;
SV * sv;
char * target;
char * temp;
PPCODE:
sv = ST(0);
if((target = (char *)iptc_get_policy(chain, &counter, self))) {
XPUSHs(sv_2mortal(newSVpv(target, 0)));
asprintf(&temp, "%llu", counter.pcnt);
XPUSHs(sv_2mortal(newSVpv(temp, 0)));
free(temp);
asprintf(&temp, "%llu", counter.bcnt);
XPUSHs(sv_2mortal(newSVpv(temp, 0)));
free(temp);
}
else {
SET_ERRNUM(errno);
SET_ERRSTR("%s", iptc_strerror(errno));
SvIOK_on(ERROR_SV);
}
int
insert_entry(self, chain, entry, rulenum)
IPTables::IPv4::Table self
ipt_chainlabel chain
struct ipt_entry * entry
unsigned int rulenum
CODE:
RETVAL = iptc_insert_entry(chain, entry, rulenum, self);
free(entry);
if(!RETVAL) {
SET_ERRNUM(errno);
SET_ERRSTR("%s", iptc_strerror(errno));
SvIOK_on(ERROR_SV);
}
OUTPUT:
RETVAL
int
replace_entry(self, chain, entry, rulenum)
IPTables::IPv4::Table self
ipt_chainlabel chain
struct ipt_entry * entry
unsigned int rulenum
CODE:
RETVAL = iptc_replace_entry(chain, entry, rulenum, self);
free(entry);
if(!RETVAL) {
SET_ERRNUM(errno);
SET_ERRSTR("%s", iptc_strerror(errno));
SvIOK_on(ERROR_SV);
}
OUTPUT:
RETVAL
int
append_entry(self, chain, entry)
IPTables::IPv4::Table self
ipt_chainlabel chain
struct ipt_entry * entry
CODE:
RETVAL = iptc_append_entry(chain, entry, self);
free(entry);
if(!RETVAL) {
SET_ERRNUM(errno);
( run in 0.535 second using v1.01-cache-2.11-cpan-71847e10f99 )