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

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * For license terms, see the file COPYING in this directory.
  3.  */
  4. /* We need this for HAVE_STDARG_H, etc */
  5. #include "config.h"
  6. /* constants designating the various supported protocols */
  7. #define P_AUTO 1
  8. #define P_POP2 2
  9. #define P_POP3 3
  10. #define P_APOP 4
  11. #define P_RPOP 5
  12. #define P_IMAP 6
  13. #define P_IMAP_K4 7
  14. #define P_IMAP_GSS 8
  15. #define P_IMAP_CRAM_MD5 9
  16. #define P_IMAP_LOGIN 10
  17. #define P_ETRN 11
  18. #if INET6_ENABLE
  19. #define SMTP_PORT "smtp"
  20. #define KPOP_PORT "kpop"
  21. #else /* INET6_ENABLE */
  22. #define SMTP_PORT 25
  23. #define KPOP_PORT 1109
  24. #endif /* INET6_ENABLE */
  25. #ifdef SSL_ENABLE
  26. #define SIMAP_PORT 993
  27. #define SPOP3_PORT 995
  28. #endif
  29. /* preauthentication types */
  30. #define A_PASSWORD 0 /* password or inline authentication */
  31. #define A_KERBEROS_V4 1 /* preauthenticate w/ Kerberos V4 */
  32. #define A_KERBEROS_V5 2 /* preauthenticate w/ Kerberos V5 */
  33. #define A_SSH 3 /* preauthentication at session level */
  34. /*
  35.  * Definitions for buffer sizes.  We get little help on setting maxima
  36.  * from IMAP RFCs up to 2060, so these are mostly from POP3.
  37.  */
  38. #define HOSTLEN 635 /* max hostname length (RFC1123) */
  39. #define POPBUFSIZE 512 /* max length of response (RFC1939) */
  40. #define IDLEN 128 /* max length of UID (RFC1939) */
  41. /* per RFC1939 this should be 40, but Microsoft Exchange ignores that limit */
  42. #define USERNAMELEN 128 /* max POP3 arg length */
  43. /* clear a netBSD kernel parameter out of the way */ 
  44. #undef MSGBUFSIZE
  45. /*
  46.  * The RFC822 limit on message line size is just 998.  But
  47.  * make this *way* oversized; idiot DOS-world mailers that
  48.  * don't line-wrap properly often ship entire paragraphs as
  49.  * lines.
  50.  */
  51. #define MSGBUFSIZE 8192
  52. #define NAMELEN 64 /* max username length */
  53. #define PASSWORDLEN 64 /* max password length */
  54. #define DIGESTLEN 33 /* length of MD5 digest */
  55. /* exit code values */
  56. #define PS_SUCCESS 0 /* successful receipt of messages */
  57. #define PS_NOMAIL       1 /* no mail available */
  58. #define PS_SOCKET 2 /* socket I/O woes */
  59. #define PS_AUTHFAIL 3 /* user authorization failed */
  60. #define PS_PROTOCOL 4 /* protocol violation */
  61. #define PS_SYNTAX 5 /* command-line syntax error */
  62. #define PS_IOERR 6 /* bad permissions on rc file */
  63. #define PS_ERROR 7 /* protocol error */
  64. #define PS_EXCLUDE 8 /* client-side exclusion error */
  65. #define PS_LOCKBUSY 9 /* server responded lock busy */
  66. #define PS_SMTP         10      /* SMTP error */
  67. #define PS_DNS 11 /* fatal DNS error */
  68. #define PS_BSMTP 12 /* output batch could not be opened */
  69. #define PS_MAXFETCH 13 /* poll ended by fetch limit */
  70. /* leave space for more codes */
  71. #define PS_UNDEFINED 23 /* something I hadn't thought of */
  72. #define PS_TRANSIENT 24 /* transient failure (internal use) */
  73. #define PS_REFUSED 25 /* mail refused (internal use) */
  74. #define PS_RETAINED 26 /* message retained (internal use) */
  75. #define PS_TRUNCATED 27 /* headers incomplete (internal use) */
  76. /* output noise level */
  77. #define         O_SILENT 0 /* mute, max squelch, etc. */
  78. #define O_NORMAL 1 /* user-friendly */
  79. #define O_VERBOSE 2 /* chatty */
  80. #define O_DEBUG 3 /* prolix */
  81. #define O_MONITOR O_VERBOSE
  82. #define SIZETICKER 1024 /* print 1 dot per this many bytes */
  83. /*
  84.  * We #ifdef this and use flag rather than bool
  85.  * to avoid a type clash with curses.h
  86.  */
  87. #ifndef TRUE
  88. #define FALSE 0
  89. #define TRUE 1
  90. #endif /* TRUE */
  91. typedef char flag;
  92. /* we need to use zero as a flag-uninitialized value */
  93. #define FLAG_TRUE 2
  94. #define FLAG_FALSE 1
  95. struct runctl
  96. {
  97.     char *logfile;
  98.     char *idfile;
  99.     int poll_interval;
  100.     char *postmaster;
  101.     flag bouncemail;
  102.     char *properties;
  103.     flag use_syslog;
  104.     flag invisible;
  105. };
  106. struct idlist
  107. {
  108.     char *id;
  109.     union
  110.     {
  111. struct
  112. {
  113.     short num;
  114.     flag mark; /* UID-index information */
  115. #define UID_UNSEEN 0 /* hasn't been seen */
  116. #define UID_SEEN 1 /* seen, but not deleted */
  117. #define UID_DELETED 2 /* this message has been deleted */
  118. #define UID_EXPUNGED 3 /* this message has been expunged */ 
  119.         }
  120. status;
  121. char *id2;
  122.     } val;
  123.     struct idlist *next;
  124. };
  125. struct query;
  126. struct method /* describe methods for protocol state machine */
  127. {
  128.     const char *name; /* protocol name */
  129. #if INET6_ENABLE
  130.     const char *service;
  131.     const char *sslservice;
  132. #else /* INET6_ENABLE */
  133.     int port; /* service port */
  134.     int sslport; /* service port for ssl */
  135. #endif /* INET6_ENABLE */
  136.     flag tagged; /* if true, generate & expect command tags */
  137.     flag delimited; /* if true, accept "." message delimiter */
  138.     int (*parse_response)(int, char *);
  139. /* response_parsing function */
  140.     int (*password_canonify)(char *, char *, int);
  141. /* canonicalize password */
  142.     int (*getauth)(int, struct query *, char *);
  143. /* authorization fetcher */
  144.     int (*getrange)(int, struct query *, const char *, int *, int *, int *);
  145. /* get message range to fetch */
  146.     int (*getsizes)(int, int, int *);
  147. /* get sizes of messages */
  148.     int (*is_old)(int, struct query *, int);
  149. /* check for old message */
  150.     int (*fetch_headers)(int, struct query *, int, int *);
  151. /* fetch FROM headera given message */
  152.     int (*fetch_body)(int, struct query *, int, int *);
  153. /* fetch a given message */
  154.     int (*trail)(int, struct query *, int);
  155. /* eat trailer of a message */
  156.     int (*delete)(int, struct query *, int);
  157. /* delete method */
  158.     int (*logout_cmd)(int, struct query *);
  159. /* logout command */
  160.     flag retry; /* can getrange poll for new messages? */
  161. };
  162. struct hostdata /* shared among all user connections to given server */
  163. {
  164.     /* rc file data */
  165.     char *pollname; /* poll label of host */
  166.     char *via; /* "true" server name if non-NULL */
  167.     struct idlist *akalist; /* server name first, then akas */
  168.     struct idlist *localdomains; /* list of pass-through domains */
  169.     int protocol; /* protocol type */
  170. #if INET6_ENABLE
  171.     char *service; /* IPv6 service name */
  172.     void *netsec; /* IPv6 security request */
  173. #else /* INET6_ENABLE */
  174.     int port; /* TCP/IP service port number */
  175. #endif /* INET6_ENABLE */
  176.     int interval; /* # cycles to skip between polls */
  177.     int preauthenticate; /* preauthentication mode to try */
  178.     int timeout; /* inactivity timout in seconds */
  179.     char *envelope; /* envelope address list header */
  180.     int envskip; /* skip to numbered envelope header */
  181.     char *qvirtual; /* prefix removed from local user id */
  182.     flag skip; /* suppress poll in implicit mode? */
  183.     flag dns; /* do DNS lookup on multidrop? */
  184.     flag uidl; /* use RFC1725 UIDLs? */
  185. #ifdef SDPS_ENABLE
  186.     flag sdps; /* use Demon Internet SDPS *ENV */
  187. #endif /* SDPS_ENABLE */
  188.     flag checkalias;                   /* resolve aliases by comparing IPs? */
  189. #if defined(linux) || defined(__FreeBSD__)
  190.     char *interface;
  191.     char *monitor;
  192.     int  monitor_io;
  193.     struct interface_pair_s *interface_pair;
  194. #endif /* linux */
  195.     char *plugin,*plugout;
  196.     /* computed for internal use */
  197.     const struct method *base_protocol; /* relevant protocol method table */
  198.     int poll_count; /* count of polls so far */
  199.     char *queryname; /* name to attempt DNS lookup on */
  200.     char *truename; /* "true name" of server host */
  201.     struct hostdata *lead_server; /* ptr to lead query for this server */
  202.     int esmtp_options;
  203. };
  204. struct query
  205. {
  206.     /* mailserver connection controls */
  207.     struct hostdata server;
  208.     /* per-user data */
  209.     struct idlist *localnames; /* including calling user's name */
  210.     int wildcard; /* should unmatched names be passed through */
  211.     char *remotename; /* remote login name to use */
  212.     char *password; /* remote password to use */
  213.     struct idlist *mailboxes; /* list of mailboxes to check */
  214.     /* per-forwarding-target data */
  215.     struct idlist *smtphunt; /* list of SMTP hosts to try forwarding to */
  216.     char *smtpaddress; /* address to force in RCPT TO */ 
  217.     struct idlist *antispam; /* list of listener's antispam response */
  218.     char *mda; /* local MDA to pass mail to */
  219.     char *bsmtp; /* BSMTP output file */
  220.     char listener; /* what's the listener's wire protocol? */
  221. #define SMTP_MODE 'S'
  222. #define LMTP_MODE 'L'
  223.     char *preconnect; /* pre-connection command to execute */
  224.     char *postconnect; /* post-connection command to execute */
  225.     /* per-user control flags */
  226.     flag keep; /* if TRUE, leave messages undeleted */
  227.     flag fetchall; /* if TRUE, fetch all (not just unseen) */
  228.     flag flush; /* if TRUE, delete messages already seen */
  229.     flag rewrite; /* if TRUE, canonicalize recipient addresses */
  230.     flag stripcr; /* if TRUE, strip CRs in text */
  231.     flag forcecr; /* if TRUE, force CRs before LFs in text */
  232.     flag pass8bits; /* if TRUE, ignore Content-Transfer-Encoding */
  233.     flag dropstatus; /* if TRUE, drop Status lines in mail */
  234.     flag mimedecode; /* if TRUE, decode MIME-armored messages */
  235.     int limit; /* limit size of retrieved messages */
  236.     int warnings; /* size warning interval */
  237.     int fetchlimit; /* max # msgs to get in single poll */
  238.     int batchlimit; /* max # msgs to pass in single SMTP session */
  239.     int expunge; /* max # msgs to pass between expunges */
  240.     flag use_ssl; /* use SSL encrypted session */
  241.     char *sslkey; /* optional SSL private key file */
  242.     char *sslcert; /* optional SSL certificate file */
  243.     char *properties; /* passthrough properties for extensions */
  244.     /* internal use -- per-poll state */
  245.     flag active; /* should we actually poll this server? */
  246.     const char *destaddr; /* destination host for this query */
  247.     int errcount; /* count transient errors in last pass */
  248.     int authfailcount; /* count of authorization failures */
  249.     int wedged; /* wedged by auth failures or timeouts? */
  250.     char *smtphost; /* actual SMTP host we connected to */
  251.     int smtp_socket; /* socket descriptor for SMTP connection */
  252.     unsigned int uid; /* UID of user to deliver to */
  253.     struct idlist *skipped; /* messages skipped on the mail server */
  254.     struct idlist *oldsaved, *newsaved;
  255.     char *lastid; /* last Message-ID seen on this connection */
  256.     /* internal use -- per-message state */
  257.     int mimemsg; /* bitmask indicating MIME body-type */
  258.     char digest [DIGESTLEN]; /* md5 digest buffer */
  259.     /* internal use -- housekeeping */
  260.     struct query *next; /* next query control block in chain */
  261. };
  262. struct msgblk /* message header parsed for open_sink() */
  263. {
  264.     char    *headers; /* raw message headers */
  265.     struct idlist *recipients; /* addressees */
  266.     char return_path[HOSTLEN + USERNAMELEN + 4]; 
  267.     int reallen;
  268. };
  269. /*
  270.  * Numeric option handling.  Numeric option value of zero actually means
  271.  * it's unspecified.  Value less than zero is zero.  The reason for this
  272.  * screwy encoding is so we can zero out an option block in order to set the
  273.  * numeric flags in it to unspecified.
  274.  */
  275. #define NUM_VALUE_IN(n) (((n) == 0) ? -1 : (n))
  276. #define NUM_VALUE_OUT(n) (((n) < 0) ? 0 : (n))
  277. #define NUM_NONZERO(n) ((n) > 0)
  278. #define NUM_ZERO(n) ((n) < 0)
  279. #define NUM_SPECIFIED(n) ((n) != 0)
  280. #define MULTIDROP(ctl) (ctl->wildcard || 
  281. ((ctl)->localnames && (ctl)->localnames->next))
  282. /*
  283.  * Note: tags are generated with an a%04d format from a 1-origin
  284.  * integer sequence number.  Length 4 permits transaction numbers
  285.  * up to 9999, so we force rollover with % 10000.  There's no special
  286.  * reason for this format other than to look like the exmples in the
  287.  * IMAP RFCs.
  288.  */
  289. #define TAGLEN 6 /* 'a' + 4 digits + NUL */
  290. extern char tag[TAGLEN];
  291. #define TAGMOD 10000
  292. /* list of hosts assembled from run control file and command line */
  293. extern struct query cmd_opts, *querylist;
  294. /* what's returned by envquery */
  295. extern void envquery(int, char **);
  296. /* controls the detail level of status/progress messages written to stderr */
  297. extern int outlevel;     /* see the O_.* constants above */
  298. extern int yydebug; /* enable parse debugging */
  299. /* these get computed */
  300. extern int batchcount; /* count of messages sent in current batch */
  301. extern flag peek_capable; /* can we read msgs without setting seen? */
  302. /* miscellaneous global controls */
  303. extern struct runctl run; /* global controls for this run */
  304. extern flag nodetach; /* if TRUE, don't detach daemon process */
  305. extern flag quitmode; /* if --quit was set */
  306. extern flag check_only; /* if --check was set */
  307. extern char *rcfile; /* path name of rc file */
  308. extern int linelimit; /* limit # lines retrieved per site */
  309. extern flag versioninfo; /* emit only version info */
  310. extern char *user; /* name of invoking user */
  311. extern char *home; /* home directory of invoking user */
  312. extern int pass; /* number of re-polling pass */
  313. extern flag configdump; /* dump control blocks as Python dictionary */
  314. extern const char *fetchmailhost;
  315. /* either "localhost" or an FQDN */
  316. #ifdef SDPS_ENABLE
  317. extern char *sdps_envfrom;
  318. extern char *sdps_envto;
  319. #endif /* SDPS_ENABLE */
  320. /* prototypes for globally callable functions */
  321. /* error.c: Error reporting */
  322. #if defined(HAVE_STDARG_H)
  323. void report_init(int foreground);
  324. void report (FILE *fp, const char *format, ...);
  325. void report_build (FILE *fp, const char *format, ...);
  326. void report_complete (FILE *fp, const char *format, ...);
  327. void report_at_line (FILE *fp, int, const char *, unsigned int, const char *, ...);
  328. #else
  329. void report ();
  330. void report_build ();
  331. void report_complete ();
  332. void report_at_line ();
  333. #endif
  334. /* driver.c: transaction support */
  335. void set_timeout(int);
  336. #if defined(HAVE_STDARG_H)
  337. void gen_send (int sock, const char *, ... );
  338. int gen_recv(int sock, char *buf, int size);
  339. int gen_transact (int sock, const char *, ... );
  340. #else
  341. void gen_send ();
  342. int gen_recv();
  343. int gen_transact ();
  344. #endif
  345. /* use these to track what was happening when the nonresponse timer fired */
  346. #define GENERAL_WAIT 0 /* unknown wait type */
  347. #define OPEN_WAIT 1 /* waiting from mailserver open */
  348. #define SERVER_WAIT 2 /* waiting for mailserver response */
  349. #define LISTENER_WAIT 3 /* waiting for listener initialization */
  350. #define FORWARDING_WAIT 4 /* waiting for listener response */
  351. extern int phase;
  352. /* response hooks can use this to identify the query stage */
  353. #define STAGE_GETAUTH 0
  354. #define STAGE_GETRANGE 1
  355. #define STAGE_GETSIZES 2
  356. #define STAGE_FETCH 3
  357. #define STAGE_LOGOUT 4
  358. extern int stage;
  359. /* mark values for name lists */
  360. #define XMIT_ACCEPT 1 /* accepted; matches local domain or name */
  361. #define XMIT_REJECT 2 /* rejected; no match */
  362. #define XMIT_RCPTBAD 3 /* SMTP listener rejected the name */ 
  363. /* sink.c: forwarding */
  364. int stuffline(struct query *, char *);
  365. int open_sink(struct query*, struct msgblk *, int*, int*);
  366. void release_sink(struct query *);
  367. int close_sink(struct query *, struct msgblk *, flag);
  368. int open_warning_by_mail(struct query *, struct msgblk *);
  369. #if defined(HAVE_STDARG_H)
  370. void stuff_warning(struct query *, const char *, ... );
  371. #else
  372. void stuff_warning();
  373. #endif
  374. void close_warning_by_mail(struct query *, struct msgblk *);
  375. /* rfc822.c: RFC822 header parsing */
  376. char *reply_hack(char *, const char *);
  377. char *nxtaddr(const char *);
  378. /* uid.c: UID support */
  379. void initialize_saved_lists(struct query *, const char *);
  380. struct idlist *save_str(struct idlist **, const char *, flag);
  381. void free_str_list(struct idlist **);
  382. void save_str_pair(struct idlist **, const char *, const char *);
  383. void free_str_pair_list(struct idlist **);
  384. int delete_str(struct idlist **, int);
  385. int str_in_list(struct idlist **, const char *, const flag);
  386. int str_nr_in_list(struct idlist **, const char *);
  387. int str_nr_last_in_list(struct idlist **, const char *);
  388. void str_set_mark( struct idlist **, const char *, const flag);
  389. int count_list( struct idlist **idl );
  390. char *str_from_nr_list( struct idlist **idl, int number );
  391. char *str_find(struct idlist **, int);
  392. char *idpair_find(struct idlist **, const char *);
  393. void append_str_list(struct idlist **, struct idlist **);
  394. void expunge_uids(struct query *);
  395. void uid_end_query(struct query *);
  396. void write_saved_lists(struct query *, const char *);
  397. /* rcfile_y.y */
  398. int prc_parse_file(const char *, const flag);
  399. int prc_filecheck(const char *, const flag);
  400. /* base64.c */
  401. void to64frombits(unsigned char *, const unsigned char *, int);
  402. int from64tobits(char *, const char *);
  403. /* unmime.c */
  404. /* Bit-mask returned by MimeBodyType */
  405. #define MSG_IS_7BIT       0x01
  406. #define MSG_IS_8BIT       0x02
  407. #define MSG_NEEDS_DECODE  0x80
  408. extern void UnMimeHeader(unsigned char *buf);
  409. extern int  MimeBodyType(unsigned char *hdrs, int WantDecode);
  410. extern int  UnMimeBodyline(unsigned char **buf, flag delimited, flag issoftline);
  411. /* interface.c */
  412. void interface_init(void);
  413. void interface_parse(char *, struct hostdata *);
  414. void interface_note_activity(struct hostdata *);
  415. int interface_approve(struct hostdata *);
  416. /* xmalloc.c */
  417. #if defined(HAVE_VOIDPOINTER)
  418. #define XMALLOCTYPE void
  419. #else
  420. #define XMALLOCTYPE char
  421. #endif
  422. XMALLOCTYPE *xmalloc(int);
  423. XMALLOCTYPE *xrealloc(XMALLOCTYPE *, int);
  424. char *xstrdup(const char *);
  425. #if defined(HAVE_ALLOCA_H)
  426. #include <alloca.h>
  427. #else
  428. #ifdef _AIX
  429.  #pragma alloca
  430. #endif
  431. #endif
  432. #define xalloca(ptr, t, n) if (!(ptr = (t) alloca(n))) {report(stderr, "alloca failed"); exit(PS_UNDEFINED);}
  433. /* protocol driver and methods */
  434. int do_protocol(struct query *, const struct method *);
  435. int doPOP2 (struct query *); 
  436. int doPOP3 (struct query *);
  437. int doIMAP (struct query *);
  438. int doETRN (struct query *);
  439. /* miscellanea */
  440. struct query *hostalloc(struct query *); 
  441. int parsecmdline (int, char **, struct runctl *, struct query *);
  442. char *MD5Digest (unsigned char *);
  443. int POP3_auth_rpa(unsigned char *, unsigned char *, int socket);
  444. int daemonize(const char *, void (*)(int));
  445. char *getpassword(char *);
  446. void escapes(const char *, char *);
  447. char *visbuf(const char *);
  448. const char *showproto(int);
  449. void dump_config(struct runctl *runp, struct query *querylist);
  450. int is_host_alias(const char *, struct query *);
  451. char *host_fqdn(void);
  452. char *rfc822timestamp(void);
  453. void yyerror(const char *);
  454. int yylex(void);
  455. #ifdef __EMX__
  456. void itimerthread(void*);
  457. /* Have to include these first to avoid errors from redefining getcwd
  458.    and chdir.  They're re-include protected in EMX, so it's okay, I
  459.    guess.  */
  460. #include <stdlib.h>
  461. #include <unistd.h>
  462. /* Redefine getcwd and chdir to get drive-letter support so we can
  463.    find all of our lock files and stuff. */
  464. #define getcwd _getcwd2
  465. #define chdir _chdir2
  466. #endif /* _EMX_ */
  467. # if HAVE_STRERROR
  468. #  ifndef strerror /* On some systems, strerror is a macro */
  469. char *strerror ();
  470. #  endif
  471. # endif /* HAVE_STRERROR */
  472. #define STRING_DISABLED (char *)-1
  473. #define STRING_DUMMY ""
  474. #ifdef NeXT
  475. #ifndef S_IXGRP
  476. #define S_IXGRP 0000010
  477. #endif
  478. #endif
  479. /* fetchmail.h ends here */