IPTables-IPv4

 view release on metacpan or  search on metacpan

IPv4.xs  view on Meta::CPAN

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