--- lmtp2nntp_config.c 2002/01/16 14:22:14 1.8
+++ lmtp2nntp_config.c 2002/01/17 17:01:55 1.9
@@ -21,35 +21,41 @@
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
** USA, or contact the OSSP project <ossp@ossp.org>.
**
-** lmtp2nntp.c: LMTP to NNTP configuration parsing
+** FIXME lmtp2nntp_config.c: LMTP to NNTP configuration parsing
*/
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
-// #include <unistd.h>
-// #include <errno.h>
-// #include <string.h>
-// #include <fcntl.h>
-// #include <sys/utsname.h>
-// #include <sys/time.h>
-// #include <sys/types.h>
-// #include <sys/wait.h>
-// #include <sys/stat.h>
-// #include <signal.h>
-// #include <pwd.h>
+#if 0
+#include <unistd.h>
+#include <errno.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/utsname.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+#include <signal.h>
+#include <pwd.h>
+#endif
/* third party (included) */
-// #include "lmtp2nntp_argz.h"
-// #include "lmtp2nntp_shpat.h"
-// #include "lmtp2nntp_daemon.h"
+#if 0
+#include "lmtp2nntp_argz.h"
+#include "lmtp2nntp_shpat.h"
+#include "lmtp2nntp_daemon.h"
+#endif
#include "lmtp2nntp_popt.h"
#include "val.h"
/* third party (linked in) */
#include "str.h"
-// #include "l2.h"
-// #include "var.h"
+#if 0
+#include "l2.h"
+#include "var.h"
+#endif
/* library version check (compile-time) */
#define L2_VERSION_HEX_REQ 0x001200
@@ -95,13 +101,14 @@
#define NUL '\0'
#endif
-void die(char *); //FIXME
+void die(char *); /* FIXME */
void die(char *msg)
{
printf("ERROR: %s\n", msg);
exit(-1);
}
+#if 0
static val_rc_t dumper(void *ctx, const char *name, int type, const char *desc, void *data)
{
switch (type) {
@@ -145,6 +152,12 @@
return VAL_OK;
}
+
+
+
+ FIXME pass(optionconfig_t *o, int pass);
+ /* pass=0 for preinitialization !? */
+
void dotconftest(int argc, char **argv) /*FIXME*/
{
popt_context poptCon; /* context for parsing command-line options */
@@ -210,10 +223,8 @@
if ((rc = val_create(&v2)) != VAL_OK)
die("val_create 2");
-#if 0
if ((rc = val_reg(v, "bar", VAL_TYPE_VAL, "bar variable", (void *)&v2)) != VAL_OK)
die("val_reg 2");
-#endif
val_reg(v, "bar", VAL_TYPE_VAL, "bar variable", NULL);
val_set(v, "bar", v2);
if ((rc = val_get(v, "bar", &v3)) != VAL_OK)
@@ -266,15 +277,15 @@
if ((rc = val_set(v, "bar.double", 3.14159265358979)) != VAL_OK)
die("val_set for bar.double using inline data");
- // OK val_apply(v, "", 9, dumper, "v" );
- // OK val_apply(v2, "", 9, dumper, "v2");
- // OK val_apply(v, "", 0, dumper, "v" );
- // OK val_apply(v, "bar", 1, dumper, "v" );
- // OK val_apply(v2, "", 0, dumper, "v" );
- // OK val_apply(v, "", 1, dumper, "v" );
- // OK val_apply(v, "foo", 0, dumper, "v" );
- // OK val_apply(v2, "char", 2, dumper, "v" );
- // OK val_apply(v, "bar.char", 2, dumper, "v" );
+ OK val_apply(v, "", 9, dumper, "v" );
+ OK val_apply(v2, "", 9, dumper, "v2");
+ OK val_apply(v, "", 0, dumper, "v" );
+ OK val_apply(v, "bar", 1, dumper, "v" );
+ OK val_apply(v2, "", 0, dumper, "v" );
+ OK val_apply(v, "", 1, dumper, "v" );
+ OK val_apply(v, "foo", 0, dumper, "v" );
+ OK val_apply(v2, "char", 2, dumper, "v" );
+ OK val_apply(v, "bar.char", 2, dumper, "v" );
if ((rc = val_destroy(v2)) != VAL_OK)
die("val_destroy 2");
@@ -318,27 +329,6 @@
human-readable format. Dazu informationen fuer help.
*/
-/* Braindump
-
- fuer var
-
-ich brauche eine struktur, aus der man ersehen kann, welche variablen es gibt.
- {
- struct "system.uname.sysname", varstring,
- struct "system.uname.nodename",
- struct "system.uname.release",
- struct "system.uname.version",
- struct "system.uname.machine",
-
- <<< ctx->progname = strdup(argv[0]);
- <<< foo = ctx->progname;
-
- >>> rc = varreg("main.progname", &ctx->progname);
- >>> rc = varset("main.progname", strdup(argv[0])); //equivalent to ctx->progname = strdup(argv[0]);
- >>> rc = varget("main.progname", &foo); //equivalent to foo = ctx->progname
- }
- */
-
{
const char *filename = "example.conf";
struct stat sb;
@@ -356,7 +346,7 @@
if (close(fd) == -1)
die("close");
}
- //FIXME printf("DEBUG: *** 1 *** file as it was just read in ***\n%s***\n", cpBuf);
+ printf("DEBUG: *** 1 *** file as it was just read in ***\n%s***\n", cpBuf);
{
char *cpI; /* pointer to next character to be read */
@@ -396,22 +386,22 @@
if (!eline) { /* process logical line unless it's empty */
*(cpO-1) = NUL;
if (lline == (pline-1))
- ;//printf("DEBUG: line[%3d] = ***%s***\n", lline, cpL);
+ printf("DEBUG: line[%3d] = ***%s***\n", lline, cpL);
else
- ;//printf("DEBUG: [%3d-%3d] = ***%s***\n", lline, pline-1, cpL);
+ printf("DEBUG: [%3d-%3d] = ***%s***\n", lline, pline-1, cpL);
{
char *cp = cpL;
char *command;
char *value;
if ((command = str_token(&cp, " \t", "\"'", "#", STR_STRIPQUOTES|STR_BACKSLASHESC)) == NULL)
- ;//printf("DEBUG: no command - comment only\n");
+ printf("DEBUG: no command - comment only\n");
else {
printf("DEBUG: command = ***%s***\n", command);
if ((value = str_token(&cp, " \t", "\"'", "#", STR_STRIPQUOTES|STR_BACKSLASHESC)) == NULL)
printf("DEBUG: no value - section\n");
else {
- ;//while(isspace((int)*value)) value++;
+ while(isspace((int)*value)) value++;
printf("DEBUG: value = ***%s***\n", value);
}
}
@@ -426,4 +416,145 @@
}
}
}
+#endif
+
+typedef enum {
+ OPT_FLAG,
+ OPT_SINGLE,
+ OPT_MULTI
+} optiontype_t;
+
+typedef void (*optionloop_cb_t)(void);
+
+struct optionconfig_s;
+typedef struct optionconfig_s optionconfig_t;
+struct optionconfig_s {
+ optionconfig_t *next; /* cleanup chain for destroy */
+ /**/
+ char *longname; /* the long name (optional if shortname given) */
+ char shortname; /* the short name (optional if longname given) */
+ char *descrip; /* description for autohelp */
+ char *argdescrip; /* argument description for autohelp */
+ optiontype_t type; /* OPT_FLAG, OPT_SINGLE, OPT_MULTI */
+ optionloop_cb_t *cb; /* callback for first iteration - syntax check and include */
+ void *cbctx; /* context for pass1 */
+ void *pass1default; /* default for pass1 */
+ val_t *val; /* val we are registered under */
+ /**/
+ int number; /* number of this option for popt */
+ union { /* option data as read from configuration */
+ int f; /* OPT_FLAG */
+ char *s; /* OPT_SINGLE */
+ char **m; /* OPT_MULTI */
+ } data;
+};
+static void stdsyntax(void)
+{
+ return;
+}
+
+static void includeit(void)
+{
+ return;
+}
+
+static void option_register(lmtp2nntp_option_t *o, char *longname, char shortname, optiontype_t type, optionloop_cb_t cb, char *cbctx, char *descrip, char *argdescrip)
+{
+ return;
+}
+
+lmtp2nntp_option_rc_t option_create(lmtp2nntp_option_t **op)
+{
+ if (op == NULL)
+ return OPTION_ERR_ARG;
+
+ if ((*op = (lmtp2nntp_option_t *)malloc(sizeof(lmtp2nntp_option_t))) == NULL)
+ return OPTION_ERR_MEM;
+ (*op)->childsmax = 0;
+ (*op)->daemonize = 0;
+ (*op)->kill = 0;
+ (*op)->pidfile = 0;
+ (*op)->acl.as = 0;
+ (*op)->acl.az = NULL;
+ (*op)->bind = NULL;
+ (*op)->client = NULL;
+ (*op)->destination.as = 0;
+ (*op)->destination.az = NULL;
+ (*op)->groupmode = NULL;
+ (*op)->headervalue.as = 0;
+ (*op)->headervalue.az = NULL;
+ (*op)->include.as = 0;
+ (*op)->include.az = NULL;
+ (*op)->size = 0;
+ (*op)->timeoutlmtpaccept = 0;
+ (*op)->timeoutlmtpread = 0;
+ (*op)->timeoutlmtpwrite = 0;
+ (*op)->timeoutnntpconnect = 0;
+ (*op)->timeoutnntpread = 0;
+ (*op)->timeoutnntpwrite = 0;
+ (*op)->mailfrom = NULL;
+ (*op)->nodename = NULL;
+ (*op)->operationmode = NULL;
+ (*op)->l2spec = NULL;
+ (*op)->uid = NULL;
+ (*op)->restrictheader.as = 0;
+ (*op)->restrictheader.az = NULL;
+ (*op)->newsgroup.as = 0;
+ (*op)->newsgroup.az = NULL;
+ /**/
+ (*op)->vo = NULL;
+ if (val_create(&((*op)->vo)) != VAL_OK) {
+ free(*op);
+ return OPTION_ERR_VAL;
+ }
+ return OPTION_OK;
+}
+
+lmtp2nntp_option_rc_t option_parse(lmtp2nntp_option_t *o, int argc, char **argv)
+{
+ if (o == NULL)
+ return OPTION_ERR_ARG;
+
+ option_register(o, "childsmax", 'C', OPT_SINGLE, stdsyntax, "[0-9]{,5}", "foo", "childsmax" );
+ option_register(o, "daemonize", 'D', OPT_FLAG, NULL, NULL, "foo", NULL );
+ option_register(o, "kill", 'K', OPT_FLAG, NULL, NULL, "foo", NULL );
+ option_register(o, "pidfile", 'P', OPT_SINGLE, stdsyntax, ".{,255}", "foo", "pidfile" );
+ option_register(o, "veryverbose", 'V', OPT_FLAG, NULL, NULL, "foo", NULL );
+ option_register(o, "acl", 'a', OPT_MULTI, stdsyntax, "[0-9.](/[0-9]2)?", "foo", "addr[/mask]" );
+ option_register(o, "bind", 'b', OPT_SINGLE, stdsyntax, ".*", "foo", "addr[:port]|-|path[:perms]" );
+ option_register(o, "client", 'c', OPT_SINGLE, stdsyntax, ".*", "foo", "addr[:port]" );
+ option_register(o, "destination", 'd', OPT_MULTI, stdsyntax, ".*", "foo", "addr[:port]" );
+ option_register(o, "groupmode", 'g', OPT_SINGLE, stdsyntax, ".*", "foo", "groupmode" );
+ option_register(o, "headervalue", 'h', OPT_MULTI, stdsyntax, ".*", "foo", "header: value" );
+ option_register(o, "include", 'i', OPT_MULTI, includeit, ".*", "foo", "configfile" );
+ option_register(o, "size", 's', OPT_SINGLE, stdsyntax, ".*", "foo", "bytes" );
+ option_register(o, "timeoutlmtpaccept", NUL, OPT_MULTI, stdsyntax, ".*", "foo", "sec" );
+ option_register(o, "timeoutlmtpread", NUL, OPT_MULTI, stdsyntax, ".*", "foo", "sec" );
+ option_register(o, "timeoutlmtpwrite", NUL, OPT_MULTI, stdsyntax, ".*", "foo", "sec" );
+ option_register(o, "timeoutnntpconnect", NUL, OPT_MULTI, stdsyntax, ".*", "foo", "sec" );
+ option_register(o, "timeoutnntpread", NUL, OPT_MULTI, stdsyntax, ".*", "foo", "sec" );
+ option_register(o, "timeoutnntpwrite", NUL, OPT_MULTI, stdsyntax, ".*", "foo", "sec" );
+ option_register(o, "mailfrom", 'm', OPT_SINGLE, stdsyntax, ".*", "foo", "regex" );
+ option_register(o, "nodename", 'n', OPT_SINGLE, stdsyntax, ".*", "foo", "nodename" );
+ option_register(o, "operationmode", 'o', OPT_SINGLE, stdsyntax, ".*", "foo", "post|feed" );
+ option_register(o, "l2spec", 'l', OPT_SINGLE, stdsyntax, ".*", "foo", "spec" );
+ option_register(o, "uid", 'u', OPT_SINGLE, stdsyntax, ".*", "foo", "number|name" );
+ option_register(o, "restrictheader", 'r', OPT_MULTI, stdsyntax, ".*", "foo", "regex" );
+ option_register(o, "newsgroup", NUL, OPT_MULTI, stdsyntax, ".*", "foo", "newsgroup");
+
+ return OPTION_OK;
+}
+
+lmtp2nntp_option_rc_t option_destroy(lmtp2nntp_option_t *o)
+{
+ if (o == NULL)
+ return OPTION_ERR_ARG;
+
+ if (o->vo != NULL)
+ val_destroy(o->vo);
+
+ free(o);
+
+ return OPTION_OK;
+}
|