IPTables-IPv4

 view release on metacpan or  search on metacpan

IPv6.xs  view on Meta::CPAN

 */

#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 )