]> Pileus Git - ~andy/fetchmail/blobdiff - conf.c
Note Earl's regression fix for SSL_CTX_clear_options() on older OpenSSL.
[~andy/fetchmail] / conf.c
diff --git a/conf.c b/conf.c
index e9884f22fc632a0206cf314711532462d80e4b51..e51c7ccb3ef609bd9b8ea673a7ce1875af9d6aaf 100644 (file)
--- a/conf.c
+++ b/conf.c
@@ -57,6 +57,7 @@ static void indent(char ic)
        indent_level++;
 }
 
+
 static void stringdump(const char *name, const char *member)
 /* dump a string member with current indent */
 {
@@ -73,7 +74,7 @@ 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 void booldump(const char *name, const int onoff)
@@ -93,7 +94,7 @@ static void listdump(const char *name, struct idlist *list)
     fprintf(stdout, "\"%s\":", name);
 
     if (!list)
-       fputs("None,\n", stdout);
+       fputs("[],\n", stdout);
     else
     {
        struct idlist *idp;
@@ -122,17 +123,25 @@ void dump_config(struct runctl *runp, struct query *querylist)
 {
     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.
      */
-#ifdef linux
+#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
@@ -141,52 +150,61 @@ void dump_config(struct runctl *runp, struct query *querylist)
      * This should be approximately in sync with the -V option dumping 
      * in fetchmail.c.
      */
-    printf("feature_options = (");
+    features = "feature_options = ("
 #ifdef POP2_ENABLE
-    printf("'pop2',");
+    "'pop2',"
 #endif /* POP2_ENABLE */
 #ifdef POP3_ENABLE
-    printf("'pop3',");
+    "'pop3',"
 #endif /* POP3_ENABLE */
 #ifdef IMAP_ENABLE
-    printf("'imap',");
+    "'imap',"
 #endif /* IMAP_ENABLE */
 #ifdef GSSAPI
-    printf("'imap-gss',");
+    "'gssapi',"
 #endif /* GSSAPI */
-#if defined(IMAP4) && defined(KERBEROS_V4)
-    printf("'imap-k4',");
-#endif /* defined(IMAP4) && defined(KERBEROS_V4) */
+#if defined(KERBEROS_V4)
+    "'kerberos',"
+#endif /* defined(IMAP4) */
 #ifdef RPA_ENABLE
-    printf("'rpa',");
+    "'rpa',"
 #endif /* RPA_ENABLE */
 #ifdef SDPS_ENABLE
-    printf("'sdps',");
+    "'sdps',"
 #endif /* SDPS_ENABLE */
 #ifdef ETRN_ENABLE
-    printf("'etrn',");
+    "'etrn',"
 #endif /* ETRN_ENABLE */
-#if OPIE
-    printf("'opie',");
-#endif /* OPIE */
-#if INET6
-    printf("'inet6',");
-#endif /* INET6 */
-#if NET_SECURITY
-    printf("'netsec',");
-#endif /* NET_SECURITY */
-    printf(")\n");
+#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)
     {
@@ -229,15 +247,15 @@ void dump_config(struct runctl *runp, struct query *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_V4);
 
            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);
 
@@ -250,25 +268,55 @@ void dump_config(struct runctl *runp, struct query *querylist)
            numdump("envskip", ctl->server.envskip);
            stringdump("qvirtual", ctl->server.qvirtual);
  
-           if (ctl->server.preauthenticate == A_KERBEROS_V4)
+           if (ctl->server.authenticate == A_ANY)
+               stringdump("auth", "any");
+           else if (ctl->server.authenticate == A_PASSWORD)
+               stringdump("auth", "password");
+           else if (ctl->server.authenticate == A_NTLM)
+               stringdump("auth", "ntlm");
+           else if (ctl->server.authenticate == A_CRAM_MD5)
+               stringdump("auth", "cram-md5");
+           else if (ctl->server.authenticate == A_GSSAPI)
+               stringdump("auth", "gssapi");
+           else if (ctl->server.authenticate == A_KERBEROS_V4)
                stringdump("auth", "kerberos_v4");
-           else if (ctl->server.preauthenticate == A_KERBEROS_V5)
+           else if (ctl->server.authenticate == A_KERBEROS_V5)
                stringdump("auth", "kerberos_v5");
-           else
-               stringdump("auth", "password");
-
-#if defined(HAVE_GETHOSTBYNAME) && defined(HAVE_RES_SEARCH)
+           else if (ctl->server.authenticate == A_SSH)
+               stringdump("auth", "ssh");
+           else if (ctl->server.authenticate == A_OTP)
+               stringdump("auth", "otp");
+           else if (ctl->server.authenticate == A_MSN)
+               stringdump("auth", "msn");
+
+#ifdef HAVE_RES_SEARCH
            booldump("dns", ctl->server.dns);
-#endif /* HAVE_GETHOSTBYNAME && HAVE_RES_SEARCH */
+#endif /* HAVE_RES_SEARCH */
            booldump("uidl", ctl->server.uidl);
 
            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;
+           }
 
            indent(0);
            fputs("'users': ", stdout);
@@ -284,10 +332,9 @@ void dump_config(struct runctl *runp, struct query *querylist)
        fprintf(stdout, "'localnames':[");
        for (idp = ctl->localnames; idp; idp = idp->next)
        {
-           char        namebuf[USERNAMELEN + 1];
+           char namebuf[USERNAMELEN + 1];
 
-           strncpy(namebuf, visbuf(idp->id), USERNAMELEN);
-           namebuf[USERNAMELEN] = '\0';
+           strlcpy(namebuf, visbuf(idp->id), sizeof(namebuf));
            if (idp->val.id2)
                fprintf(stdout, "(\"%s\", %s)", namebuf, visbuf(idp->val.id2));
            else
@@ -302,43 +349,58 @@ void dump_config(struct runctl *runp, struct query *querylist)
        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);
        stringdump("bsmtp", ctl->bsmtp);
-#ifdef INET6
-       stringdump("netsec", ctl->netsec);
-#endif /* INET6 */
+       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('}');