#include <stdio.h>
#include <ctype.h>
-#if defined(STDC_HEADERS)
#include <stdlib.h>
-#endif
-#if defined(HAVE_UNISTD_H)
#include <unistd.h>
-#endif
#include <string.h>
#include <pwd.h>
#include <errno.h>
/* Python prettyprinting functions */
-static indent_level;
+static int indent_level;
static void indent(char ic)
/* indent current line */
indent_level++;
}
+
static void stringdump(const char *name, const char *member)
/* dump a string member with current indent */
{
- static char buf[BUFSIZ];
-
indent('\0');
fprintf(stdout, "\"%s\":", name);
if (member)
fputs(",\n", stdout);
}
-static int numdump(const char *name, const int num)
+static void numdump(const char *name, const int num)
/* dump a numeric quantity at current indent */
{
indent('\0');
- fprintf(stdout, "'%s':%d,\n", name, num);
+ fprintf(stdout, "'%s':%d,\n", name, NUM_VALUE_OUT(num));
}
-static int booldump(const char *name, const int onoff)
+static void booldump(const char *name, const int onoff)
/* dump a boolean quantity at current indent */
{
indent('\0');
fprintf(stdout, "\"%s\":", name);
if (!list)
- fputs("None,\n", stdout);
+ fputs("[],\n", stdout);
else
{
struct idlist *idp;
{
struct query *ctl;
struct idlist *idp;
+ const char *features;
indent_level = 0;
- fputs("from Tkinter import TRUE, FALSE\n\n", stdout);
+ /*
+ * These had better match the values fetchmailconf is expecting!
+ * (We don't want to import them from Tkinter because the user
+ * might not have it installed.)
+ */
+ fputs("TRUE=1; FALSE=0\n\n", stdout);
+
+ /*
+ * We need this in order to know whether `interface' and `monitor'
+ * are valid options or not.
+ */
+#if defined(linux)
+ fputs("os_type = 'linux'\n", stdout);
+#elif defined(__FreeBSD__)
+ fputs("os_type = 'freebsd'\n", stdout);
+#else
+ fputs("os_type = 'generic'\n", stdout);
+#endif
- fputs("# Start of initializer\n", stdout);
+ /*
+ * This should be approximately in sync with the -V option dumping
+ * in fetchmail.c.
+ */
+ features = "feature_options = ("
+#ifdef POP3_ENABLE
+ "'pop3',"
+#endif /* POP3_ENABLE */
+#ifdef IMAP_ENABLE
+ "'imap',"
+#endif /* IMAP_ENABLE */
+#ifdef GSSAPI
+ "'gssapi',"
+#endif /* GSSAPI */
+#ifdef RPA_ENABLE
+ "'rpa',"
+#endif /* RPA_ENABLE */
+#ifdef SDPS_ENABLE
+ "'sdps',"
+#endif /* SDPS_ENABLE */
+#ifdef ETRN_ENABLE
+ "'etrn',"
+#endif /* ETRN_ENABLE */
+#ifdef ODMR_ENABLE
+ "'odmr',"
+#endif /* ODMR_ENABLE */
+#ifdef SSL_ENABLE
+ "'ssl',"
+#endif /* SSL_ENABLE */
+#ifdef OPIE_ENABLE
+ "'opie',"
+#endif /* OPIE_ENABLE */
+#ifdef HAVE_SOCKS
+ "'socks',"
+#endif /* HAVE_SOCKS */
+ ")\n";
+ fputs(features, stdout);
+
+ fputs("# Start of configuration initializer\n", stdout);
fputs("fetchmailrc = ", stdout);
indent('{');
numdump("poll_interval", runp->poll_interval);
- booldump("syslog", runp->use_syslog);
stringdump("logfile", runp->logfile);
stringdump("idfile", runp->idfile);
stringdump("postmaster", runp->postmaster);
+ booldump("bouncemail", runp->bouncemail);
+ booldump("spambounce", runp->spambounce);
+ booldump("softbounce", runp->softbounce);
+ stringdump("properties", runp->properties);
booldump("invisible", runp->invisible);
+ booldump("showdots", runp->showdots);
+ booldump("syslog", runp->use_syslog);
if (!querylist)
{
using_kpop =
(ctl->server.protocol == P_POP3 &&
- ctl->server.port == KPOP_PORT &&
- ctl->server.preauthenticate == A_KERBEROS_V4);
+ ctl->server.service && !strcmp(ctl->server.service, KPOP_PORT ) &&
+ ctl->server.authenticate == A_KERBEROS_V5);
stringdump("pollname", ctl->server.pollname);
booldump("active", !ctl->server.skip);
stringdump("via", ctl->server.via);
stringdump("protocol",
using_kpop ? "KPOP" : showproto(ctl->server.protocol));
- numdump("port", ctl->server.port);
+ stringdump("service", ctl->server.service);
numdump("timeout", ctl->server.timeout);
numdump("interval", ctl->server.interval);
numdump("envskip", ctl->server.envskip);
stringdump("qvirtual", ctl->server.qvirtual);
- if (ctl->server.preauthenticate == A_KERBEROS_V4)
- stringdump("auth", "kerberos_v4");
- else if (ctl->server.preauthenticate == A_KERBEROS_V5)
- stringdump("auth", "kerberos_v5");
- else
- stringdump("auth", "password");
+ switch (ctl->server.authenticate) {
+ case A_ANY:
+ stringdump("auth", "any"); break;
+ case A_PASSWORD:
+ stringdump("auth", "password"); break;
+ case A_OTP:
+ stringdump("auth", "otp"); break;
+ case A_NTLM:
+ stringdump("auth", "ntlm"); break;
+ case A_CRAM_MD5:
+ stringdump("auth", "cram-md5"); break;
+ case A_GSSAPI:
+ stringdump("auth", "gssapi"); break;
+ case A_KERBEROS_V5:
+ stringdump("auth", "kerberos_v5"); break;
+ case A_SSH:
+ stringdump("auth", "ssh"); break;
+ case A_MSN:
+ stringdump("auth", "msn"); break;
+ default: abort();
+ }
-#if defined(HAVE_GETHOSTBYNAME) && defined(HAVE_RES_SEARCH)
+#ifdef HAVE_RES_SEARCH
booldump("dns", ctl->server.dns);
-#endif /* HAVE_GETHOSTBYNAME && HAVE_RES_SEARCH */
- booldump("uidl", ctl->server.uidl);
-
+#endif /* HAVE_RES_SEARCH */
listdump("aka", ctl->server.akalist);
listdump("localdomains", ctl->server.localdomains);
-#ifdef linux
+#ifdef CAN_MONITOR
stringdump("interface", ctl->server.interface);
stringdump("monitor", ctl->server.monitor);
-#endif /* linux */
+#endif
+
+ stringdump("plugin", ctl->server.plugin);
+ stringdump("plugout", ctl->server.plugout);
+ stringdump("principal", ctl->server.principal);
+ if (ctl->server.esmtp_name)
+ stringdump("esmtpname",ctl->server.esmtp_name);
+ if (ctl->server.esmtp_password)
+ stringdump("esmtppassword",ctl->server.esmtp_password);
+ booldump("tracepolls", ctl->server.tracepolls);
+ indent(0);
+ switch(ctl->server.badheader) {
+ /* this is a hack - we map this to a boolean option for
+ * fetchmailconf purposes */
+ case BHREJECT: puts("'badheader': FALSE,"); break;
+ case BHACCEPT: puts("'badheader': TRUE,"); break;
+ }
+
+ switch (ctl->server.retrieveerror) {
+ case RE_ABORT: stringdump("retrieveerror", "abort"); break;
+ case RE_CONTINUE: stringdump("retrieveerror", "continue"); break;
+ case RE_MARKSEEN: stringdump("retrieveerror", "markseen"); break;
+ }
indent(0);
fputs("'users': ", stdout);
fprintf(stdout, "'localnames':[");
for (idp = ctl->localnames; idp; idp = idp->next)
{
+ char namebuf[USERNAMELEN + 1];
+
+ strlcpy(namebuf, visbuf(idp->id), sizeof(namebuf));
if (idp->val.id2)
- fprintf(stdout, "(\"%s\", %s)",
- visbuf(idp->id), visbuf(idp->val.id2));
+ fprintf(stdout, "(\"%s\", %s)", namebuf, visbuf(idp->val.id2));
else
- fprintf(stdout, "\"%s\"", visbuf(idp->id));
+ fprintf(stdout, "\"%s\"", namebuf);
if (idp->next)
fputs(", ", stdout);
}
booldump("fetchall", ctl->fetchall);
booldump("keep", ctl->keep);
booldump("flush", ctl->flush);
+ booldump("limitflush", ctl->limitflush);
booldump("rewrite", ctl->rewrite);
booldump("stripcr", ctl->stripcr);
booldump("forcecr", ctl->forcecr);
booldump("pass8bits", ctl->pass8bits);
booldump("dropstatus", ctl->dropstatus);
+ booldump("dropdelivered", ctl->dropdelivered);
booldump("mimedecode", ctl->mimedecode);
+ booldump("idle", ctl->idle);
stringdump("mda", ctl->mda);
-#ifdef INET6
- stringdump("netsec", ctl->netsec);
-#endif /* INET6 */
+ stringdump("bsmtp", ctl->bsmtp);
+ indent('\0');
+ if (ctl->listener == LMTP_MODE)
+ fputs("'lmtp':TRUE,\n", stdout);
+ else
+ fputs("'lmtp':FALSE,\n", stdout);
+
stringdump("preconnect", ctl->preconnect);
stringdump("postconnect", ctl->postconnect);
numdump("limit", ctl->limit);
+ numdump("warnings", ctl->warnings);
numdump("fetchlimit", ctl->fetchlimit);
+ numdump("fetchsizelimit", ctl->fetchsizelimit);
+ numdump("fastuidl", ctl->fastuidl);
numdump("batchlimit", ctl->batchlimit);
+#ifdef SSL_ENABLE
+ booldump("ssl", ctl->use_ssl);
+ stringdump("sslkey", ctl->sslkey);
+ stringdump("sslcert", ctl->sslcert);
+ stringdump("sslproto", ctl->sslproto);
+ booldump("sslcertck", ctl->sslcertck);
+ stringdump("sslcertpath", ctl->sslcertpath);
+ stringdump("sslcommonname", ctl->sslcommonname);
+ stringdump("sslfingerprint", ctl->sslfingerprint);
+#endif /* SSL_ENABLE */
numdump("expunge", ctl->expunge);
+ stringdump("properties", ctl->properties);
listdump("smtphunt", ctl->smtphunt);
+ listdump("fetchdomains", ctl->domainlist);
stringdump("smtpaddress", ctl->smtpaddress);
+ stringdump("smtpname", ctl->smtpname);
indent('\0');
fprintf(stdout, "'antispam':'");
- if (!ctl->antispam)
- fputs("'\n", stdout);
- else
+ for (idp = ctl->antispam; idp; idp = idp->next)
{
- for (idp = ctl->antispam; idp; idp = idp->next)
- {
- fprintf(stdout, "%d", idp->val.status.num);
- if (idp->next)
- fputs(" ", stdout);
- }
- fputs("',\n", stdout);
+ fprintf(stdout, "%d", idp->val.status.num);
+ if (idp->next)
+ fputs(" ", stdout);
}
+ fputs("',\n", stdout);
listdump("mailboxes", ctl->mailboxes);
indent('}');