libnetfilter_queue_perl.i
来自「此包是为perl或者 Python等高级语言提供一个库」· I 代码 · 共 119 行
I
119 行
// Grab a Perl function object as a Perl object.%typemap(in) void *perl_cb { SV *obj = $input; if (SvROK(obj)) { obj = SvRV($input); } if (SvTYPE(obj) != SVt_PVCV) { SWIG_Error(SWIG_TypeError, "Parameter is not a function"); return; } $1 = obj;}%{#include <arpa/inet.h>#include <linux/netfilter.h>#include <linux/ip.h>#include "nfq_utils.h"int swig_nfq_callback(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, struct nfq_data *nfad, void *data){ int id = 0; struct nfqnl_msg_packet_hdr *ph; int ret; char *payload_data; int payload_len; struct timeval tv1, tv2, diff; if (data == NULL) { fprintf(stderr,"No callback set !\n"); return -1; } ph = nfq_get_msg_packet_hdr(nfad); if (ph){ id = ntohl(ph->packet_id); } ret = nfq_get_payload(nfad, &payload_data); payload_len = ret; gettimeofday(&tv1, NULL); /*printf("callback called\n"); printf("callback argument: %p\n",data);*/ { SV *func = (SV*)data; struct payload *p; SV * payload_obj; dSP ; ENTER ; SAVETMPS ; PUSHMARK(SP) ; XPUSHs(sv_2mortal(newSViv(42))); p = malloc(sizeof(struct payload)); p->data = payload_data; p->len = payload_len; p->id = id; p->qh = qh; p->nfad = nfad; payload_obj = sv_newmortal(); SWIG_MakePtr(payload_obj, (void*) p, SWIGTYPE_p_payload, 0); XPUSHs(payload_obj); PUTBACK; call_sv(func, G_DISCARD); free(p); FREETMPS ; LEAVE ; } gettimeofday(&tv2, NULL); timeval_subtract(&diff, &tv2, &tv1); printf("perl callback call: %d sec %d usec\n", (int)diff.tv_sec, (int)diff.tv_usec); return nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL);}void raise_swig_error(const char *errstr){ fprintf(stderr,"ERROR %s\n",errstr); SWIG_Error(SWIG_RuntimeError, errstr); }%}%extend queue {int set_callback(void *perl_cb){ self->_cb = (void*)perl_cb; return 0;}};%typemap (out) const char* get_data { $result = sv_2mortal(newSVpvn($1,arg1->len)); // blah argvi++;}%extend payload {const char* get_data(void) { return self->data;}};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?