conf.c
上传用户:xxcykj
上传日期:2007-01-04
资源大小:727k
文件大小:10k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * conf.c -- dump fetchmail configuration as Python dictionary initializer
  3.  *
  4.  * For license terms, see the file COPYING in this directory.
  5.  */
  6. #include "config.h"
  7. #include "tunable.h"
  8. #include <stdio.h>
  9. #include <ctype.h>
  10. #if defined(STDC_HEADERS)
  11. #include <stdlib.h>
  12. #endif
  13. #if defined(HAVE_UNISTD_H)
  14. #include <unistd.h>
  15. #endif
  16. #include <string.h>
  17. #include <pwd.h>
  18. #include <errno.h>
  19. #include "fetchmail.h"
  20. /* Python prettyprinting functions */
  21. static int indent_level;
  22. static void indent(char ic)
  23. /* indent current line */
  24. {
  25.     int i;
  26.     if (ic == ')' || ic == ']' || ic == '}')
  27. indent_level--;
  28.     /*
  29.      * The guard here is a kluge.  It depends on the fact that in the
  30.      * particular structure we're dumping, opening [s are always
  31.      * initializers for dictionary members and thus will be preceded
  32.      * by a member name.
  33.      */
  34.     if (ic != '[')
  35.     {
  36. for (i = 0; i < indent_level / 2; i++)
  37.     putc('t', stdout);
  38. if (indent_level % 2)
  39.     fputs("    ", stdout);
  40.     }
  41.     if (ic)
  42.     {
  43. putc(ic, stdout);
  44. putc('n', stdout);
  45.     }
  46.     if (ic == '(' || ic == '[' || ic == '{')
  47. indent_level++;
  48. }
  49. static void stringdump(const char *name, const char *member)
  50. /* dump a string member with current indent */
  51. {
  52.     indent('');
  53.     fprintf(stdout, ""%s":", name);
  54.     if (member)
  55. fprintf(stdout, ""%s"", visbuf(member));
  56.     else
  57. fputs("None", stdout);
  58.     fputs(",n", stdout);
  59. }
  60. static void numdump(const char *name, const int num)
  61. /* dump a numeric quantity at current indent */
  62. {
  63.     indent('');
  64.     fprintf(stdout, "'%s':%d,n", name, NUM_VALUE_OUT(num));
  65. }
  66. static void booldump(const char *name, const int onoff)
  67. /* dump a boolean quantity at current indent */
  68. {
  69.     indent('');
  70.     if (onoff)
  71. fprintf(stdout, "'%s':TRUE,n", name);
  72.     else
  73. fprintf(stdout, "'%s':FALSE,n", name);
  74. }
  75. static void listdump(const char *name, struct idlist *list)
  76. /* dump a string list member with current indent */
  77. {
  78.     indent('');
  79.     fprintf(stdout, ""%s":", name);
  80.     if (!list)
  81. fputs("None,n", stdout);
  82.     else
  83.     {
  84. struct idlist *idp;
  85. fputs("[", stdout);
  86. for (idp = list; idp; idp = idp->next)
  87.     if (idp->id)
  88.     {
  89. fprintf(stdout, ""%s"", visbuf(idp->id));
  90. if (idp->next)
  91.     fputs(", ", stdout);
  92.     }
  93. fputs("],n", stdout);
  94.     }
  95. }
  96. /*
  97.  * Note: this function dumps the entire configuration,
  98.  * after merging of the defaults record (if any).  It
  99.  * is intended to produce output parseable by a configuration
  100.  * front end, not anything especially comfortable for humans.
  101.  */
  102. void dump_config(struct runctl *runp, struct query *querylist)
  103. /* dump the in-core configuration in recompilable form */
  104. {
  105.     struct query *ctl;
  106.     struct idlist *idp;
  107.     indent_level = 0;
  108.     fputs("from Tkinter import TRUE, FALSEnn", stdout);
  109.     /*
  110.      * We need this in order to know whether `interface' and `monitor'
  111.      * are valid options or not.
  112.      */
  113. #if defined(linux)
  114.     fputs("os_type = 'linux'n", stdout);
  115. #elif defined(__FreeBSD__)
  116.     fputs("os_type = 'freebsd'n", stdout);
  117. #else
  118.     fputs("os_type = 'generic'n", stdout);
  119. #endif
  120.     /* 
  121.      * This should be approximately in sync with the -V option dumping 
  122.      * in fetchmail.c.
  123.      */
  124.     printf("feature_options = (");
  125. #ifdef POP2_ENABLE
  126.     printf("'pop2',");
  127. #endif /* POP2_ENABLE */
  128. #ifdef POP3_ENABLE
  129.     printf("'pop3',");
  130. #endif /* POP3_ENABLE */
  131. #ifdef IMAP_ENABLE
  132.     printf("'imap',");
  133. #endif /* IMAP_ENABLE */
  134. #ifdef GSSAPI
  135.     printf("'imap-gss',");
  136. #endif /* GSSAPI */
  137. #if defined(IMAP4) && defined(KERBEROS_V4)
  138.     printf("'imap-k4',");
  139. #endif /* defined(IMAP4) && defined(KERBEROS_V4) */
  140. #ifdef RPA_ENABLE
  141.     printf("'rpa',");
  142. #endif /* RPA_ENABLE */
  143. #ifdef SDPS_ENABLE
  144.     printf("'sdps',");
  145. #endif /* SDPS_ENABLE */
  146. #ifdef ETRN_ENABLE
  147.     printf("'etrn',");
  148. #endif /* ETRN_ENABLE */
  149. #ifdef SSL_ENABLE
  150.     printf("'ssl',");
  151. #endif /* SSL_ENABLE */
  152. #if OPIE_ENABLE
  153.     printf("'opie',");
  154. #endif /* OPIE_ENABLE */
  155. #if INET6_ENABLE
  156.     printf("'inet6',");
  157. #endif /* INET6_ENABLE */
  158. #if NET_SECURITY
  159.     printf("'netsec',");
  160. #endif /* NET_SECURITY */
  161.     printf(")n");
  162.     fputs("# Start of configuration initializern", stdout);
  163.     fputs("fetchmailrc = ", stdout);
  164.     indent('{');
  165.     numdump("poll_interval", runp->poll_interval);
  166.     stringdump("logfile", runp->logfile);
  167.     stringdump("idfile", runp->idfile);
  168.     stringdump("postmaster", runp->postmaster);
  169.     booldump("bouncemail", runp->bouncemail);
  170.     stringdump("properties", runp->properties);
  171.     booldump("invisible", runp->invisible);
  172.     booldump("syslog", runp->use_syslog);
  173.     if (!querylist)
  174.     {
  175. fputs("    'servers': []n", stdout);
  176. goto alldone;
  177.     }
  178.     indent(0);
  179.     fputs("# List of server entries begins heren", stdout);
  180.     indent(0);
  181.     fputs("'servers': ", stdout);
  182.     indent('[');
  183.     for (ctl = querylist; ctl; ctl = ctl->next)
  184.     {
  185. /*
  186.  * First, the server stuff.
  187.  */
  188. if (!ctl->server.lead_server)
  189. {
  190.     flag using_kpop;
  191.     /*
  192.      * Every time we see a leading server entry after the first one,
  193.      * it implicitly ends the both (a) the list of user structures
  194.      * associated with the previous entry, and (b) that previous entry.
  195.      */
  196.     if (ctl > querylist)
  197.     {
  198. indent(']');
  199. indent('}');
  200. indent(''); 
  201. putc(',', stdout);
  202. putc('n', stdout);
  203.     }
  204.     indent(0);
  205.     fprintf(stdout,"# Entry for site `%s' begins:n",ctl->server.pollname);
  206.     indent('{');
  207.     using_kpop =
  208. (ctl->server.protocol == P_POP3 &&
  209. #if !INET6_ENABLE
  210.  ctl->server.port == KPOP_PORT &&
  211. #else
  212.  0 == strcmp( ctl->server.service, KPOP_PORT ) &&
  213. #endif
  214.  ctl->server.preauthenticate == A_KERBEROS_V4);
  215.     stringdump("pollname", ctl->server.pollname); 
  216.     booldump("active", !ctl->server.skip); 
  217.     stringdump("via", ctl->server.via); 
  218.     stringdump("protocol", 
  219.        using_kpop ? "KPOP" : showproto(ctl->server.protocol));
  220. #if !INET6_ENABLE
  221.     numdump("port",  ctl->server.port);
  222. #else
  223.     stringdump("service", ctl->server.service); 
  224. #endif
  225.     numdump("timeout",  ctl->server.timeout);
  226.     numdump("interval", ctl->server.interval);
  227.     if (ctl->server.envelope == STRING_DISABLED)
  228. stringdump("envelope", NULL); 
  229.     else if (ctl->server.envelope == NULL)
  230. stringdump("envelope", "Received"); 
  231.     else
  232. stringdump("envelope", ctl->server.envelope); 
  233.     numdump("envskip", ctl->server.envskip);
  234.     stringdump("qvirtual", ctl->server.qvirtual);
  235.  
  236.     if (ctl->server.preauthenticate == A_KERBEROS_V4)
  237. stringdump("preauth", "kerberos_v4");
  238.     else if (ctl->server.preauthenticate == A_KERBEROS_V5)
  239. stringdump("preauth", "kerberos_v5");
  240.     else if (ctl->server.preauthenticate == A_SSH)
  241. stringdump("preauth", "ssh");
  242.     else
  243. stringdump("preauth", "password");
  244. #if defined(HAVE_GETHOSTBYNAME) && defined(HAVE_RES_SEARCH)
  245.     booldump("dns", ctl->server.dns);
  246. #endif /* HAVE_GETHOSTBYNAME && HAVE_RES_SEARCH */
  247.     booldump("uidl", ctl->server.uidl);
  248.     listdump("aka", ctl->server.akalist);
  249.     listdump("localdomains", ctl->server.localdomains);
  250. #if defined(linux) || defined(__FreeBSD__)
  251.     stringdump("interface", ctl->server.interface);
  252.     stringdump("monitor", ctl->server.monitor);
  253. #endif /* linux || __FreeBSD__ */
  254.     stringdump("plugin", ctl->server.plugin);
  255.     stringdump("plugout", ctl->server.plugout);
  256.     indent(0);
  257.     fputs("'users': ", stdout);
  258.     indent('[');
  259. }
  260. indent('{');
  261. stringdump("remote", ctl->remotename);
  262. stringdump("password", ctl->password);
  263. indent('');
  264. fprintf(stdout, "'localnames':[");
  265. for (idp = ctl->localnames; idp; idp = idp->next)
  266. {
  267.     char namebuf[USERNAMELEN + 1];
  268.     strncpy(namebuf, visbuf(idp->id), USERNAMELEN);
  269.     namebuf[USERNAMELEN] = '';
  270.     if (idp->val.id2)
  271. fprintf(stdout, "("%s", %s)", namebuf, visbuf(idp->val.id2));
  272.     else
  273. fprintf(stdout, ""%s"", namebuf);
  274.     if (idp->next)
  275. fputs(", ", stdout);
  276. }
  277. if (ctl->wildcard)
  278.     fputs(", '*'", stdout);
  279. fputs("],n", stdout);
  280. booldump("fetchall", ctl->fetchall);
  281. booldump("keep", ctl->keep);
  282. booldump("flush", ctl->flush);
  283. booldump("rewrite", ctl->rewrite);
  284. booldump("stripcr", ctl->stripcr); 
  285. booldump("forcecr", ctl->forcecr);
  286. booldump("pass8bits", ctl->pass8bits);
  287. booldump("dropstatus", ctl->dropstatus);
  288. booldump("mimedecode", ctl->mimedecode);
  289. stringdump("mda", ctl->mda);
  290. stringdump("bsmtp", ctl->bsmtp);
  291. indent('');
  292. if (ctl->listener == LMTP_MODE)
  293.     fputs("'lmtp':TRUE,n", stdout);
  294. else
  295.     fputs("'lmtp':FALSE,n", stdout);
  296.     
  297. #ifdef INET6_ENABLE
  298. stringdump("netsec", ctl->server.netsec);
  299. #endif /* INET6_ENABLE */
  300. stringdump("preconnect", ctl->preconnect);
  301. stringdump("postconnect", ctl->postconnect);
  302. numdump("limit", ctl->limit);
  303. numdump("warnings", ctl->warnings);
  304. numdump("fetchlimit", ctl->fetchlimit);
  305. numdump("batchlimit", ctl->batchlimit);
  306. #ifdef SSL_ENABLE
  307. booldump("ssl", ctl->use_ssl);
  308. stringdump("sslkey", ctl->sslkey);
  309. stringdump("sslcert", ctl->sslcert);
  310. #endif /* SSL_ENABLE */
  311. numdump("expunge", ctl->expunge);
  312. stringdump("properties", ctl->properties);
  313. listdump("smtphunt", ctl->smtphunt);
  314. stringdump("smtpaddress", ctl->smtpaddress);
  315. indent('');
  316. fprintf(stdout, "'antispam':'");
  317. if (!ctl->antispam)
  318.     fputs("'n", stdout);
  319. else
  320. {
  321.     for (idp = ctl->antispam; idp; idp = idp->next)
  322.     {
  323. fprintf(stdout, "%d", idp->val.status.num);
  324. if (idp->next)
  325.     fputs(" ", stdout);
  326.     }
  327.     fputs("',n", stdout);
  328. }
  329. listdump("mailboxes", ctl->mailboxes);
  330. indent('}');
  331. indent(''); 
  332. fputc(',', stdout);
  333.     }
  334.     /* end last span of user entries and last server entry */
  335.     indent(']');
  336.     indent('}');
  337.     /* end array of servers */
  338.     indent(']');
  339.  alldone:
  340.     /* end top-level dictionary */
  341.     indent('}');
  342.     fputs("# End of initializern", stdout);
  343. }
  344. /* conf.c ends here */