IPTables-IPv4
view release on metacpan or search on metacpan
*/
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#define INET6
#include <libiptc/libip6tc.h>
#include <errno.h>
#include "packer.h"
#include "unpacker.h"
#include "loader.h"
#include "maskgen.h"
#include "module_iface.h"
typedef ip6tc_handle_t* IPTables__IPv6__Table;
MODULE = IPTables::IPv6 PACKAGE = IPTables::IPv6
IPTables::IPv6::Table
init(tablename)
char * tablename
PREINIT:
ip6tc_handle_t handle;
CODE:
handle = ip6tc_init(tablename);
if(handle == NULL) {
RETVAL = NULL;
SET_ERRNUM(errno);
SET_ERRSTR("%s", ip6tc_strerror(errno));
SvIOK_on(ERROR_SV);
}
else {
RETVAL = malloc(sizeof(ip6tc_handle_t));
*RETVAL = handle;
ipt_loader_setup();
}
OUTPUT:
RETVAL
MODULE = IPTables::IPv6 PACKAGE = IPTables::IPv6::Table
int
is_chain(self, chain)
IPTables::IPv6::Table self
ip6t_chainlabel chain
CODE:
RETVAL = ip6tc_is_chain(chain, *self);
OUTPUT:
RETVAL
void
list_chains(self)
IPTables::IPv6::Table self
PREINIT:
char * chain;
SV * sv;
int count = 0;
PPCODE:
sv = ST(0);
chain = (char *)ip6tc_first_chain(self);
while(chain) {
count++;
if (GIMME_V == G_ARRAY)
XPUSHs(sv_2mortal(newSVpv(chain, 0)));
chain = (char *)ip6tc_next_chain(self);
}
if (GIMME_V == G_SCALAR)
XPUSHs(sv_2mortal(newSViv(count)));
void
list_rules(self, chain)
IPTables::IPv6::Table self
ip6t_chainlabel chain
PREINIT:
SV * sv;
int count = 0;
PPCODE:
sv = ST(0);
if(ip6tc_is_chain(chain, *self)) {
struct ip6t_entry *entry =
(struct ip6t_entry *)ip6tc_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 ip6t_entry *)ip6tc_next_rule(entry, self);
}
}
if (GIMME_V == G_SCALAR)
XPUSHs(sv_2mortal(newSViv(count)));
int
builtin(self, chain)
IPTables::IPv6::Table self
ip6t_chainlabel chain
CODE:
RETVAL = ip6tc_builtin(chain, *self);
OUTPUT:
RETVAL
void
get_policy(self, chain)
IPTables::IPv6::Table self
ip6t_chainlabel chain
PREINIT:
struct ip6t_counters counter;
SV * sv;
char * target;
char * temp;
PPCODE:
sv = ST(0);
if((target = (char *)ip6tc_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", ip6tc_strerror(errno));
SvIOK_on(ERROR_SV);
}
int
insert_entry(self, chain, entry, rulenum)
IPTables::IPv6::Table self
ip6t_chainlabel chain
struct ip6t_entry * entry
unsigned int rulenum
CODE:
RETVAL = ip6tc_insert_entry(chain, entry, rulenum, self);
free(entry);
if(!RETVAL) {
SET_ERRNUM(errno);
SET_ERRSTR("%s", ip6tc_strerror(errno));
SvIOK_on(ERROR_SV);
}
OUTPUT:
RETVAL
int
replace_entry(self, chain, entry, rulenum)
IPTables::IPv6::Table self
ip6t_chainlabel chain
struct ip6t_entry * entry
unsigned int rulenum
CODE:
RETVAL = ip6tc_replace_entry(chain, entry, rulenum, self);
free(entry);
if(!RETVAL) {
SET_ERRNUM(errno);
SET_ERRSTR("%s", ip6tc_strerror(errno));
SvIOK_on(ERROR_SV);
}
OUTPUT:
RETVAL
int
append_entry(self, chain, entry)
IPTables::IPv6::Table self
ip6t_chainlabel chain
struct ip6t_entry * entry
CODE:
RETVAL = ip6tc_append_entry(chain, entry, self);
free(entry);
if(!RETVAL) {
SET_ERRNUM(errno);
( run in 0.705 second using v1.01-cache-2.11-cpan-5511b514fd6 )