#ifndef _MODULE_IFACE_H #define _MODULE_IFACE_H #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #ifndef MODULE_PATH # define MODULE_PATH "/usr/local/lib/IPTables-IPv4" #endif /* MODULE_PATH */ #define INVCHAR '!' #define ERROR_SV perl_get_sv("!", 0) #define SET_ERRSTR(format...) sv_setpvf(ERROR_SV, ##format) #define SET_ERRNUM(value) sv_setiv(ERROR_SV, (IV)value) #include "local_types.h" typedef enum { MODULE_MATCH, MODULE_TARGET } ModuleType; #if defined(BUILD_MATCH) # define MODULE_ENTRYTYPE ENTRY_MATCH # define MODULE_TYPE MODULE_MATCH #elif defined(BUILD_TARGET) # define MODULE_ENTRYTYPE ENTRY_TARGET # define MODULE_TYPE MODULE_TARGET #endif typedef struct { /* Point to next in line - this should start out NULL */ void *next; /* The library handle, so we can dlclose() it and clean things * up later. */ void *libh; /* What kind of module am I? */ ModuleType type; /* What's my name? */ CHAIN_LABEL name; /* Match data field size */ size_t size; /* Size for comparison in userspace */ size_t size_uspace; /* Setup the module's information */ void (*setup)(void *myinfo, unsigned int *nfcache); /* Take a field name and a value, and if the field name is ours, * then munch down that value and stuff it into its appropriate * place (return TRUE to indicate it was ours, FALSE if not) */ int (*parse_field)(char *field, SV *value, void *myinfo, unsigned int *nfcache, ENTRY *entry, int *flags); /* Take a match/target entry that belongs to us, and add all the * relevant fields into the hash */ void (*get_fields)(HV *ent_hash, void *myinfo, ENTRY *entry); /* Do some last-minute checks on the packed data structure, and * return TRUE if everything checks out, FALSE if not */ int (*final_check)(void *myinfo, int flags); } ModuleDef; #endif /* _MODULE_IFACE_H */