/* ** Copyright (c) 2001-2002 The OSSP Project ** Copyright (c) 2001-2002 Cable & Wireless Deutschland ** ** This file is part of OSSP lmtp2nntp, an LMTP speaking local ** mailer which forwards mails as Usenet news articles via NNTP. ** It can be found at http://www.ossp.org/pkg/lmtp2nntp/. ** ** This program is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License ** as published by the Free Software Foundation; either version ** 2.0 of the License, or (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ** General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this file; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 ** USA, or contact the OSSP project . ** ** lmtp2nntp.c: LMTP to NNTP configuration parsing */ #include #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include // #include /* third party (included) */ // #include "lmtp2nntp_argz.h" // #include "lmtp2nntp_shpat.h" // #include "lmtp2nntp_daemon.h" // #include "lmtp2nntp_popt.h" #include "lmtp2nntp_dotconf.h" /* third party (linked in) */ // #include "str.h" // #include "l2.h" // #include "var.h" /* library version check (compile-time) */ #define L2_VERSION_HEX_REQ 0x001200 #define L2_VERSION_STR_REQ "0.1.0" #define STR_VERSION_HEX_REQ 0x009206 #define STR_VERSION_STR_REQ "0.9.6" #ifdef L2_VERSION_HEX #if L2_VERSION_HEX < L2_VERSION_HEX_REQ #error "require a newer version of OSSP L2" #endif #endif #ifdef STR_VERSION_HEX #if STR_VERSION_HEX < STR_VERSION_HEX_REQ #error "require a newer version of OSSP Str" #endif #endif /* own headers */ #include "lmtp2nntp_global.h" #ifdef HAVE_CONFIG_H #include "config.h" #endif #if defined(HAVE_DMALLOC_H) && defined(DMALLOC) #include "dmalloc.h" #endif #include "lmtp2nntp_lmtp.h" #include "lmtp2nntp_nntp.h" #include "lmtp2nntp_msg.h" #include "sa.h" #define _LMTP2NNTP_VERSION_C_AS_HEADER_ #include "lmtp2nntp_version.c" #undef _LMTP2NNTP_VERSION_C_AS_HEADER_ #ifndef FALSE #define FALSE (1 != 1) #endif #ifndef TRUE #define TRUE (!FALSE) #endif #ifndef NUL #define NUL '\0' #endif const char *foo(command_t *, context_t *); int bar(configfile_t *, int, long, const char *); const char *quux(command_t *, unsigned long); const char *foo(command_t *cmd, context_t *_ctx) { int *foodata = (int *)_ctx; int i; printf("DEBUG: callbck %s:%ld: %s:", cmd->configfile->filename, cmd->configfile->line, cmd->name); for (i = 0; i < cmd->arg_count; i++) ;//printf("[%d=***%s***] ", i, cmd->data.list[i]); printf("---%lx---%d---", foodata, (*foodata)++); printf("\n"); return NULL; } int bar(configfile_t *configfile, int type, long dc_errno, const char *msg) { printf("DEBUG: handler type=%d, dc_errno=%ld, msg=***%s***\n", type, dc_errno, msg); return 0; /* 0=continue, 1=abort */ } const char *quux(command_t *cmd, unsigned long mask) { printf("DEBUG: checker %s:%ld: %s: ", cmd->configfile->filename, cmd->configfile->line, cmd->name); printf("[mask=%lx]", mask); printf("\n"); if ((strcmp(cmd->name, "client") == 0) && (mask = 4)) return "Nasenbaer!"; return NULL; } enum configcontext { CTX_DAEMON = 1<<0, CTX_SERVER = 1<<1, CTX_CLIENT = 1<<2, CTX_GATEWAY = 1<<3, CTX_MESSAGE = 1<<4 }; void dotconftest(void) { configfile_t *configfile; static int foodata; static const configoption_t options[] = { { "", ARG_NONE, foo, NULL, CTX_ALL }, { "childsmax", ARG_STR, foo, NULL, CTX_DAEMON }, { "daemonize", ARG_STR, foo, NULL, CTX_DAEMON }, { "pidfile", ARG_STR, foo, NULL, CTX_DAEMON }, { "acl", ARG_STR, foo, NULL, CTX_DAEMON }, { "bind", ARG_STR, foo, NULL, CTX_DAEMON }, { "", ARG_NONE, foo, NULL, CTX_DAEMON }, { "", ARG_NONE, foo, NULL, CTX_ALL }, { "timeoutaccept", ARG_STR, foo, NULL, CTX_SERVER }, { "timeoutread", ARG_STR, foo, NULL, CTX_SERVER }, { "timeoutwrite", ARG_STR, foo, NULL, CTX_SERVER }, { "size", ARG_STR, foo, NULL, CTX_SERVER }, { "mailfrom", ARG_STR, foo, NULL, CTX_SERVER }, { "nodename", ARG_STR, foo, NULL, CTX_SERVER }, { "", ARG_NONE, foo, NULL, CTX_SERVER }, { "", ARG_NONE, foo, NULL, CTX_ALL }, { "client", ARG_STR, foo, NULL, CTX_CLIENT }, { "destination", ARG_STR, foo, NULL, CTX_CLIENT }, { "operationmode", ARG_STR, foo, NULL, CTX_CLIENT }, { "timeoutconnect", ARG_STR, foo, NULL, CTX_CLIENT }, { "timeoutread", ARG_STR, foo, NULL, CTX_CLIENT }, { "timeoutwrite", ARG_STR, foo, NULL, CTX_CLIENT }, { "", ARG_NONE, foo, NULL, CTX_CLIENT }, { "", ARG_NONE, foo, NULL, CTX_ALL }, { "groupmode", ARG_STR, foo, NULL, CTX_GATEWAY }, { "l2spec", ARG_STR, foo, NULL, CTX_GATEWAY }, { "uid", ARG_STR, foo, NULL, CTX_GATEWAY }, { "newsgroup", ARG_STR, foo, NULL, CTX_GATEWAY }, { "", ARG_NONE, foo, NULL, CTX_GATEWAY }, { "", ARG_NONE, foo, NULL, CTX_ALL }, { "headervalue", ARG_STR, foo, NULL, CTX_MESSAGE }, { "restrictheader", ARG_STR, foo, NULL, CTX_MESSAGE }, { "", ARG_NONE, foo, NULL, CTX_MESSAGE }, LAST_OPTION }; foodata = 1000; printf("---%lx---%d---", &foodata, foodata); configfile = dotconf_create("example.conf", options, &foodata, CASE_INSENSITIVE); if (!configfile) { fprintf(stderr, "Error opening config file\n"); return; } configfile->errorhandler = (dotconf_errorhandler_t)bar; configfile->contextchecker = (dotconf_contextchecker_t)quux; if (dotconf_command_loop(configfile) == 0) fprintf(stderr, "Error reading config file\n"); dotconf_cleanup(configfile); }