IPTables-IPv4-DBTarpit

 view release on metacpan or  search on metacpan

Tools/Tools.xs  view on Meta::CPAN

	run_recovery = val;
    OUTPUT:
	RETVAL

int
t_new_r(p,home,...)
	SV * p
	char * home
    PREINIT:
	DBTPD * rdbtp;
	STRLEN len;
	int i, index;
	SV * erp;
	IV err;
    CODE:
	GET_DBTP(p,rdbtp);
	if (items < 3) {
	    rdbtp->dberr = DB_NOTFOUND;
	    _t_seterr(rdbtp,erp,err);
	    XSRETURN_UNDEF;
	}
	for(i=2;i<items;i++) {
	    rdbtp->dbfile[i-2] = (char *)SvPV(ST(i),len);
	}
	if (run_recovery)
	    index = DB_RUNRECOVERY;
	else
	    index = -1;
	RETVAL = dbtp_init(rdbtp,(unsigned char *)home,index);
	_t_seterr(rdbtp,erp,err);
    OUTPUT:
	RETVAL

void
t_closedb_r(p)
	SV * p
    PREINIT:
	DBTPD * rdbtp;
	SV * erp;
	IV err;
    CODE:
	GET_DBTP(p,rdbtp);
	dbtp_close(rdbtp);
	_t_seterr(rdbtp,erp,err);

 # if ai < notstring, get U32, else get string

SV *
t_get_r(p,ai,addr,notstring)
	SV * p
	int ai
	SV * addr
	int notstring
    PREINIT:
	DBTPD * rdbtp;
	STRLEN len;
	void * adp;
	int rv;
	SV * val, * erp;
	IV err;
    PPCODE:
	GET_DBTP(p,rdbtp);
	adp = (void *)SvPV(addr,len);
	rv = dbtp_get(rdbtp,ai,adp,len);
	_t_seterr(rdbtp,erp,err);

	if (rv == DB_NOTFOUND)
	    XSRETURN_UNDEF;
	else if (rv)
	    XSRETURN_IV(0);

	if (ai < notstring && rdbtp->mgdbt.size == DBTP_U32size) {
	    val = newSViv(*(U32 *)rdbtp->mgdbt.data);
	    sv_setuv(val,*(U32 *)rdbtp->mgdbt.data);
	    XPUSHs(sv_2mortal(val));
	}
	else
	    XPUSHs(sv_2mortal(newSVpv(rdbtp->mgdbt.data,rdbtp->mgdbt.size)));
	XSRETURN(1);

 # not reached - quiet compiler
	RETVAL = val;


 # if ai < notstring, get U32, else get string
void
t_getrecno_r(p,ai,cursor,notstring)
	SV * p
	int ai
	U32 cursor
	int notstring
    PREINIT:
	DBTPD * rdbtp;
	int rv;
	SV * val, * erp;
	IV err;
    PPCODE:
	GET_DBTP(p,rdbtp);
	rv = dbtp_getrecno(rdbtp,ai,cursor);
	_t_seterr(rdbtp,erp,err);
	if (rv) {
	    if (GIMME == G_ARRAY)
		XSRETURN_EMPTY;
	    else
		XSRETURN_UNDEF;
	}

	XPUSHs(sv_2mortal(newSVpv(rdbtp->keydbt.data,rdbtp->keydbt.size)));

	if (GIMME == G_ARRAY) {
	    if (ai < notstring && rdbtp->mgdbt.size == DBTP_U32size) {
		val = newSViv(*(U32 *)rdbtp->mgdbt.data);
		sv_setuv(val,*(U32 *)rdbtp->mgdbt.data);
		XPUSHs(sv_2mortal(val));
	    }
	    else
		XPUSHs(sv_2mortal(newSVpv(rdbtp->mgdbt.data,rdbtp->mgdbt.size)));
	    XSRETURN(2);
	}
	XSRETURN(1);

int
t_del_r(p,ai,addr)
	SV * p
	int ai
	SV * addr
    PREINIT:
	DBTPD * rdbtp;
	STRLEN len;
	void * adp;
	int rv;
	SV * erp;
	IV err;
    CODE:
	GET_DBTP(p,rdbtp);
	adp = (void *)SvPV(addr,len);
	rv = dbtp_del(rdbtp,ai,adp,len);
	_t_seterr(rdbtp,erp,err);

	if (rv == DB_NOTFOUND)
	    XSRETURN_UNDEF;

	RETVAL = rv;
    OUTPUT:
	RETVAL

 # if ai < notstring, put U32, else put string

int
t_put_r(p,ai,addr,val,notstring)
	SV * p
	int ai
	SV * addr
	SV * val
	int notstring
    PREINIT:
	DBTPD * rdbtp;

Tools/Tools.xs  view on Meta::CPAN

	DBTPD * rdbtp;
	U32 cursor;
	HV * hash;
	int rv;
	SV * val, * erp;
	IV err;
    CODE:
	GET_DBTP(p,rdbtp);
	if (!SvROK(hp)) {
	    rv = rdbtp->dberr = DB_NOTFOUND;
	    _t_seterr(rdbtp,erp,err);
	    cursor = 0;
	}
	else {
	    cursor = 1;
	    hash = (HV *)SvRV(hp);
	    hv_clear(hash);
	    rv = 0;
	}
	while(cursor) {
	    rv = dbtp_getrecno(rdbtp,ai,cursor++);
	    if (rv) {
		if(rv == DB_NOTFOUND && cursor != 1)
		    rv = rdbtp->dberr = 0;
		_t_seterr(rdbtp,erp,err);
		break;
	    }
	    if (ai < notstring  && rdbtp->mgdbt.size == DBTP_U32size) {
		val = newSViv(*(U32 *)rdbtp->mgdbt.data);
		sv_setuv(val,*(U32 *)rdbtp->mgdbt.data);
	    }
	    else
		val = newSVpv(rdbtp->mgdbt.data,rdbtp->mgdbt.size);

	    (void)hv_store(hash,(char *)rdbtp->keydbt.data,rdbtp->keydbt.size,val,0);
 #	    SvREFCNT_dec(val);
	}

	RETVAL = rv;
    OUTPUT:
	RETVAL

int
t_notfound()
    CODE:
	RETVAL = DB_NOTFOUND;
    OUTPUT:
	RETVAL

int
t_runrecovery()
    CODE:
	RETVAL = DB_RUNRECOVERY;
    OUTPUT:
	RETVAL

void
t_bdbversion()
    PREINIT:
	int major, minor, patch;
    PPCODE:
	XPUSHs(sv_2mortal(newSVpv(dbtp_bdbversion(&major,&minor,&patch),0)));
	if (GIMME == G_ARRAY) {
	    XPUSHs(sv_2mortal(newSViv((I32)major)));
	    XPUSHs(sv_2mortal(newSViv((I32)minor)));
	    XPUSHs(sv_2mortal(newSViv((I32)patch)));
	    XSRETURN(4);
	}
	XSRETURN(1);

void
t_libversion()
    PREINIT:
	int major, minor, patch;
    PPCODE:
	XPUSHs(sv_2mortal(newSVpv(dbtp_libversion(&major,&minor,&patch),0)));
	if (GIMME == G_ARRAY) {
	    XPUSHs(sv_2mortal(newSViv((I32)major)));
	    XPUSHs(sv_2mortal(newSViv((I32)minor)));
	    XPUSHs(sv_2mortal(newSViv((I32)patch)));
	    XSRETURN(4);
	}
	XSRETURN(1);

U32
t_nkeys_r(p,ai)
	SV * p
	int ai
    PREINIT:
	DBTPD * rdbtp;
	SV * erp;
	IV err;
    CODE:
	GET_DBTP(p,rdbtp);
	RETVAL = dbtp_stati(rdbtp,ai);
	_t_seterr(rdbtp,erp,err);
	if (rdbtp->dberr)
	    XSRETURN_UNDEF;
    OUTPUT:
	RETVAL



 #        NI_NEW_IFREQ_REF(rv,sv,stash,ifr) \
 #       sv = newSV (0); \
 #       rv = sv_2mortal (newRV_noinc (sv)); \
 #       sv_bless (rv, stash); \
 #       SvGROW (sv, _SIZEOF_ADDR_IFREQ(*ifr)); \
 #       SvREADONLY_on (sv); \
 #       XPUSHs (rv);


void
t_nmem()
    PREINIT:
	SV * rv, * sv;
    PPCODE:
 # make an empty DBTPD
	sv = newSV(sizeof(DBTPD));
	rv = sv_2mortal(newRV_noinc(sv));
	SvREADONLY_on(sv);
	Zero(SvPVX(sv), 1, DBTPD);
	XPUSHs(rv);
	XSRETURN(1);

 # Save the next two routines in case we decide to switch to using malloc and free
 # void
 # t_rmem(p)
 #	SV * p
 #   PREINIT:
 #	DBTPD * mptr;
 #	AV * msav;
 #	I32 idx, end;
 #	unsigned char * mp;
 #	SV ** pp;
 #   CODE:
 #	GET_DBTP(p,mptr);
 #	Safefree(mptr);
 #	msav = get_av("_IPTDBTTools_memcache",0);
 #	if ((msav != NULL) && ((end = av_len(msav)) >= 0)) {
 #	    for (idx = 0; idx <= end; idx++) {
 #		pp = av_fetch(msav,idx,0);
 #		if ((pp != NULL) && (SvIOK(*pp)) && (mptr == (DBTPD * )SvIV(*pp))) {
 #		    av_delete(msav,idx,0);
 #		    break;
 #		}
 #	    }
 #	}
 #
 #void
 # DESTROY(...)
 #   PREINIT:
 #	DBTPD * mptr;
 #	AV * msav;
 #	I32 idx = 0, end;
 #	SV ** pp;
 #   CODE:
 #	msav = get_av("_IPTDBTTools_memcache",0);
 #	if ((msav != NULL) && ((end = av_len(msav)) >= 0)) {
 #	    while (idx <= end) {
 #		pp = av_fetch(msav,idx,0);
 #		if ((pp != NULL) && (SvIOK(*pp))) {
 #		    mptr = (DBTPD * )SvIV(*pp);
 #		    Safefree(mptr);
 #		}
 #		idx += 1;
 #	    }
 #	    av_undef(msav);
 #	}
 #



( run in 0.755 second using v1.01-cache-2.11-cpan-5511b514fd6 )