From c00db9da64b8554f24875d6d1f78e80ced6dfdb0 Mon Sep 17 00:00:00 2001 From: James Brister Date: Fri, 16 Jun 2000 20:46:23 +0000 Subject: [PATCH] SWIG input file for Perl interface to config library. --- conftools/perllib/dnsconf/DNSConf.i | 331 ++++++++++++++++++++++++++++ 1 file changed, 331 insertions(+) create mode 100644 conftools/perllib/dnsconf/DNSConf.i diff --git a/conftools/perllib/dnsconf/DNSConf.i b/conftools/perllib/dnsconf/DNSConf.i new file mode 100644 index 0000000000..63b98917e0 --- /dev/null +++ b/conftools/perllib/dnsconf/DNSConf.i @@ -0,0 +1,331 @@ +%module DNSConf + +%{ + +#include +#include +#include +#include + +#include "DNSConf-macros.h" + +#define DEBUG_PRINT 1 + +#if DEBUG_PRINT +#define DBGPRINT xprintf +#else +#define DBGPRINT ((void) 0) +#endif + +static struct { + isc_mem_t *mem; + isc_log_t *log; + isc_logconfig_t *logcfg; + int count; +} ctx ; + +typedef struct DNSConf { + dns_c_ctx_t *confctx; +} DNSConf; + + + +int xprintf(const char *fmt, ...) { + va_list ap ; + + va_start (ap, fmt) ; + vfprintf (stderr, fmt, ap) ; + va_end (ap) ; +} + + +int ctx_init(void) { + int returnval = 0; + + DBGPRINT("Starting ctx_init()\n"); + + if (ctx.mem != NULL) { + returnval = 1; + goto done; + } + + if (isc_mem_create(0, 0, &ctx.mem) != ISC_R_SUCCESS) + goto done; + + if (isc_log_create(ctx.mem, &ctx.log, &ctx.logcfg) != ISC_R_SUCCESS) + goto done; + + isc_log_setcontext(ctx.log); + dns_log_init(ctx.log); + dns_log_setcontext(ctx.log); + + if (isc_log_usechannel(ctx.logcfg, "default_stderr", NULL, NULL) != + ISC_R_SUCCESS) + goto done; + + dns_lctx = ctx.log; + + ctx.count = 0; + + returnval = 1; + +done: + DBGPRINT("Finished ctx_init()\n"); + + return (returnval); +} + +void *ctx_destroy(void) { + DBGPRINT("starting ctx_destroy()\n"); + + if (ctx.count == 0) { + DBGPRINT("count == 0\n"); + return NULL; + } + + if (--ctx.count > 0) { + DBGPRINT("count > 0\n"); + return NULL; + } + + DBGPRINT("destroying ctx\n"); + + dns_lctx = NULL; + isc_log_destroy(&ctx.log); + isc_mem_destroy(&ctx.mem); + + DBGPRINT("finished ctx_destroy\n"); +} + + +DNSConf *new_DNSConf() { + DNSConf *ptr = malloc(sizeof (DNSConf)); + + DBGPRINT("inside new_DNSConf\n"); + + ptr->confctx = NULL; + + return ptr; +} + +void clear_DNSConf(DNSConf *ctx) { + if (ctx->confctx != NULL) { + DBGPRINT("deleting config context\n"); + dns_c_ctx_delete(&ctx->confctx); + ctx_destroy(); + } +} + + +void delete_DNSConf(DNSConf *ctx) { + DBGPRINT("inside delete_DNSConf\n"); + + clear_DNSConf(ctx); + + free(ctx); +} + +int DNSConf_parse(DNSConf *conf, const char *filename) { + + DBGPRINT("inside parse\n"); + + if (!ctx_init()) + return; + + clear_DNSConf(conf); + + if (dns_c_parse_namedconf(filename, ctx.mem, &conf->confctx, NULL) + == ISC_R_SUCCESS) { + ctx.count++; + + DBGPRINT("count now: %d\n", ctx.count); + + return 1; + } else { + return 0; + } +} + +int DNSConf_initctx(DNSConf *cfg) { + if (cfg == NULL) + return 0; + + if (cfg->confctx != NULL) + return 1; + + if (!ctx_init()) + return 0; + + if (dns_c_ctx_new(ctx.mem, &cfg->confctx) != ISC_R_SUCCESS) + return 0; + + ctx.count++; + + DBGPRINT("count is now: %d\n", ctx.count); + + return 1; +} + + + +void DNSConf_print(DNSConf *ptr, FILE *outfile) { + + DBGPRINT("inside print\n"); + + if (ptr == NULL || ptr->confctx == NULL) + return; + + dns_c_ctx_print(outfile, 0, ptr->confctx); +} + + +#if 0 + +void DNSConf_setdirectory(DNSConf *cfg, const char *directory) { + + DBGPRINT("inside DNSConf_setdirectory\n"); + + if (!DNSConf_initctx(cfg)) + return; + + if (directory == NULL) { + DBGPRINT("null pointer\n"); + dns_c_ctx_unsetdirectory(cfg->confctx); + } else if (*directory == '\0') { + DBGPRINT("empty string\n"); + dns_c_ctx_unsetdirectory(cfg->confctx); + } else + dns_c_ctx_setdirectory(cfg->confctx, directory); +} + +char *DNSConf_getdirectory(DNSConf *cfg) { + char *dir = NULL; + isc_result_t tmpres; + + if (cfg == NULL || cfg->confctx == NULL) + return NULL; + + tmpres = dns_c_ctx_getdirectory(cfg->confctx, &dir); + if (tmpres == ISC_R_NOTFOUND) + return NULL; + + return dir; +} + +#else + +STRING_FIELD_DEFS(directory) +STRING_FIELD_DEFS(version) +STRING_FIELD_DEFS(dumpfilename) +STRING_FIELD_DEFS(pidfilename) +STRING_FIELD_DEFS(statsfilename) +STRING_FIELD_DEFS(memstatsfilename) +STRING_FIELD_DEFS(namedxfer) + + + +void DNSConf_settransfersin(DNSConf *cfg, unsigned int *transfersin) { + + DBGPRINT("inside DNSConf_settransfersin %p\n", transfersin); + + if (!DNSConf_initctx(cfg)) + return; + + if (transfersin == NULL) { + DBGPRINT("null pointer\n"); + dns_c_ctx_unsettransfersin(cfg->confctx); + } else + dns_c_ctx_settransfersin(cfg->confctx, transfersin); +} + +unsigned int DNSConf_gettransfersin(DNSConf *cfg) { + unsigned int result; + isc_result_t tmpres; + + if (cfg == NULL || cfg->confctx == NULL) + return NULL; + + tmpres = dns_c_ctx_gettransfersin(cfg->confctx, &result); + if (tmpres == ISC_R_NOTFOUND) + return NULL; + + return result; +} + + + +INT_FIELD_DEFS(transfersin) +INT_FIELD_DEFS(transfersperns) +INT_FIELD_DEFS(transfersout) +INT_FIELD_DEFS(maxlogsizeixfr) +INT_FIELD_DEFS(cleaninterval) +INT_FIELD_DEFS(interfaceinterval) +INT_FIELD_DEFS(statsinterval) +INT_FIELD_DEFS(heartbeatinterval) +INT_FIELD_DEFS(maxtransfertimein) +INT_FIELD_DEFS(maxtransfertimeout) +INT_FIELD_DEFS(maxtransferidlein) +INT_FIELD_DEFS(maxtransferidleout) +INT_FIELD_DEFS(lamettl) +INT_FIELD_DEFS(tcpclients) +INT_FIELD_DEFS(recursiveclients) +INT_FIELD_DEFS(minroots) +INT_FIELD_DEFS(serialqueries) +INT_FIELD_DEFS(sigvalidityinterval) +INT_FIELD_DEFS(datasize) +INT_FIELD_DEFS(stacksize) +INT_FIELD_DEFS(coresize) +INT_FIELD_DEFS(files) +INT_FIELD_DEFS(maxcachesize) +INT_FIELD_DEFS(maxncachettl) +INT_FIELD_DEFS(maxcachettl) + + +#endif + +%} + + +%typemap(perl5, out) char * { + $target = sv_newmortal(); + sv_setpv($target,$source); + argvi++; +} + +%typemap(perl5, out) int, short, long { + $target = sv_newmortal(); + sv_setiv($target,(IV)$source); + argvi++; +} + +%typemap(perl5,in) FILE * { + $target = IoIFP(sv_2io($source)); +} + + +%typemap(perl5, in) unsigned int { + static unsigned int val; + val = $target; + $source = &val; +} + + +struct DNSConf { + %addmethods { + DNSConf(); + ~DNSConf(); + void print(FILE *outfile); + void parse(const char *filename); + + void setdirectory(const char *arg); + char *getdirectory(); + + void settransfersin(unsigned int arg); + unsigned int gettransfersin(); + } + %readonly + dns_c_ctx_t *confctx; +}; + + +