]> Pileus Git - ~andy/fetchmail/blobdiff - fetchmail.h
Release 6.3.8.
[~andy/fetchmail] / fetchmail.h
index 257d84cda73cc22e476724a46fc90a61129436a8..605bcb05d6b11cadafb99a9ecf0e201a26fe7a5a 100644 (file)
@@ -1,3 +1,4 @@
+/** \file fetchmail.h  header file for fetchmail */
 #ifndef _FETCHMAIL_H
 #define _FETCHMAIL_H
 /*
@@ -7,6 +8,8 @@
 /* We need this for HAVE_STDARG_H, etc */
 #include "config.h"
 
+struct addrinfo;
+
 /* We need this for size_t */
 #include <sys/types.h>
 
 # endif
 #endif
 
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+#ifdef HAVE_NET_SOCKET_H
+#include <net/socket.h>
+#endif
+#include <netdb.h>
 #include <stdio.h>
 
 /* Import Trio if needed */
@@ -71,6 +81,7 @@ char *strstr(const char *, const char *);
 #define        A_GSSAPI        7       /* authenticate with GSSAPI */
 #define                A_SSH           8       /* authentication at session level */
 #define                A_MSN           9       /* same as NTLM with keyword MSN */
+#define                A_EXTERNAL      10      /* external authentication (client cert) */
 
 /* some protocols or authentication types (KERBEROS, GSSAPI, SSH) don't
  * require a password */
@@ -80,6 +91,7 @@ char *strstr(const char *, const char *);
      || (ctl)->server.authenticate == A_KERBEROS_V5 \
      || (ctl)->server.authenticate == A_GSSAPI \
      || (ctl)->server.authenticate == A_SSH \
+     || (ctl)->server.authenticate == A_EXTERNAL \
      || (ctl)->server.protocol == P_ETRN)
 
 /*
@@ -109,6 +121,8 @@ char *strstr(const char *, const char *);
 #define                DIGESTLEN       33      /* length of MD5 digest */
 
 /* exit code values */
+/* NOTE THAT PS_SUCCESS MUST ALWAYS BE 0 - SOME PARTS OF THE CODE
+ * RELY ON THIS VALUE! */
 #define                PS_SUCCESS      0       /* successful receipt of messages */
 #define                PS_NOMAIL       1       /* no mail available */
 #define                PS_SOCKET       2       /* socket I/O woes */
@@ -129,7 +143,6 @@ char *strstr(const char *, const char *);
 #define                PS_TRANSIENT    24      /* transient failure (internal use) */
 #define                PS_REFUSED      25      /* mail refused (internal use) */
 #define                PS_RETAINED     26      /* message retained (internal use) */
-#define                PS_TRUNCATED    27      /* headers incomplete (internal use) */
 #define                PS_REPOLL       28      /* repoll immediately with changed parameters (internal use) */
 #define                PS_IDLETIMEOUT  29      /* timeout on imap IDLE (internal use) */
 
@@ -156,15 +169,17 @@ typedef   char    flag;
 #define FLAG_TRUE      2
 #define FLAG_FALSE     1
 
+/** run control data */
 struct runctl
 {
-    char       *logfile;
-    char       *idfile;
-    int                poll_interval;
+    char       *logfile;       /** where to write log information */
+    char       *idfile;        /** where to store UID data */
+    char       *pidfile;       /** where to record the PID of daemon mode processes */
     char       *postmaster;
+    char       *properties;
+    int                poll_interval;  /** poll interval in seconds (daemon mode, 0 == off) */
     flag       bouncemail;
     flag       spambounce;
-    char       *properties;
     flag       use_syslog;
     flag       invisible;
     flag       showdots;
@@ -172,7 +187,7 @@ struct runctl
 
 struct idlist
 {
-    unsigned char *id;
+    char *id;
     union
     {
        struct
@@ -181,11 +196,11 @@ struct idlist
            flag        mark;           /* UID-index information */
 #define UID_UNSEEN     0               /* hasn't been seen */
 #define UID_SEEN       1               /* seen, but not deleted */
-#define UID_DELETED    2               /* this message has been deleted */
-#define UID_EXPUNGED   3               /* this message has been expunged */ 
+#define UID_DELETED    2               /* this message has been marked deleted */
+#define UID_EXPUNGED   3               /* this message has been expunged */
         }
        status;
-       unsigned char *id2;
+       char *id2;
     } val;
     struct idlist *next;
 };
@@ -212,12 +227,12 @@ struct method             /* describe methods for protocol state machine */
     int (*is_old)(int, struct query *, int);
                                /* check for old message */
     int (*fetch_headers)(int, struct query *, int, int *);
-                               /* fetch FROM headera given message */
+                               /* fetch header from a given message */
     int (*fetch_body)(int, struct query *, int, int *);
                                /* fetch a given message */
-    int (*trail)(int, struct query *, int);
+    int (*trail)(int, struct query *, const char *);
                                /* eat trailer of a message */
-    int (*delete)(int, struct query *, int);
+    int (*delete_msg)(int, struct query *, int);
                                /* delete method */
     int (*mark_seen)(int, struct query *, int);
                                /* mark as seen method */
@@ -276,8 +291,16 @@ struct hostdata            /* shared among all user connections to given server */
     size_t trueaddr_len;               /* size of trueaddr data */
     struct hostdata *lead_server;      /* ptr to lead query for this server */
     int esmtp_options;
+    int workarounds;                   /* track which workarounds the user was warned about */
 };
 
+/*
+ * bit flags to set in workarounds after the corresponding warning,
+ * which we assume to be server-specific, has been printed,
+ * so we don't spam our users in daemon mode.
+ */
+#define WKA_TOP (1L << 0)              /* Maillennium TOP -> RETR override warning */
+
 struct query
 {
     /* mailserver connection controls */
@@ -328,7 +351,8 @@ struct query
     flag use_ssl;              /* use SSL encrypted session */
     char *sslkey;              /* optional SSL private key file */
     char *sslcert;             /* optional SSL certificate file */
-       char *sslproto;         /* force usage of protocol (ssl2|ssl3|tls1) - defaults to ssl23 */
+    char *sslproto;            /** force transport protocol (ssl2|ssl3|ssl23|tls1) - if NULL,
+                                 use ssl23 for SSL and opportunistic tls1 for non-SSL connections. */
     char *sslcertpath;         /* Trusted certificate directory for checking the server cert */
     flag sslcertck;            /* Strictly check the server cert. */
     char *sslfingerprint;      /* Fingerprint to check against */
@@ -336,19 +360,21 @@ struct query
 
     /* internal use -- per-poll state */
     flag active;               /* should we actually poll this server? */
-    const char *destaddr;      /* destination host for this query */
+    char *destaddr;            /* destination host for this query */
     int errcount;              /* count transient errors in last pass */
     int authfailcount;         /* count of authorization failures */
     int wehaveauthed;          /* We've managed to logon at least once! */
     int wehavesentauthnote;    /* We've sent an authorization failure note */
     int wedged;                        /* wedged by auth failures or timeouts? */
     char *smtphost;            /* actual SMTP host we connected to */
+    char smtphostmode;         /* what's the actual SMTP host's wire protocol? */
     int smtp_socket;           /* socket descriptor for SMTP connection */
     unsigned int uid;          /* UID of user to deliver to */
     struct idlist *skipped;    /* messages skipped on the mail server */
     struct idlist *oldsaved, *newsaved;
     struct idlist **oldsavedend;
     char lastdigest[DIGESTLEN];        /* last MD5 hash seen on this connection */
+    char *folder;              /* folder currently being polled */
 
     /* internal use -- per-message state */
     int mimemsg;               /* bitmask indicating MIME body-type */
@@ -494,14 +520,6 @@ int gen_transact();
 #endif
 extern struct msgblk msgblk;
 
-/* lock.c: concurrency locking */
-void lock_setup(void);
-void lock_assert(void);
-void lock_or_die(void);
-void fm_lock_release(void);
-int lock_state(void);
-void lock_dispose(void);
-
 /* use these to track what was happening when the nonresponse timer fired */
 #define GENERAL_WAIT   0       /* unknown wait type */
 #define OPEN_WAIT      1       /* waiting from mailserver open */
@@ -538,7 +556,7 @@ int stuffline(struct query *, char *);
 int open_sink(struct query*, struct msgblk *, int*, int*);
 void release_sink(struct query *);
 int close_sink(struct query *, struct msgblk *, flag);
-int open_warning_by_mail(struct query *, struct msgblk *);
+int open_warning_by_mail(struct query *);
 #if defined(HAVE_STDARG_H)
 void stuff_warning(const char *, struct query *, const char *, ... )
     __attribute__ ((format (printf, 3, 4)))
@@ -549,8 +567,8 @@ void stuff_warning();
 void close_warning_by_mail(struct query *, struct msgblk *);
 
 /* rfc822.c: RFC822 header parsing */
-unsigned char *reply_hack(unsigned char *, const unsigned char *, size_t *);
-unsigned char *nxtaddr(const unsigned char *);
+char *reply_hack(char *, const char *, size_t *);
+char *nxtaddr(const char *);
 
 /* uid.c: UID support */
 extern int dofastuidl;
@@ -583,17 +601,17 @@ int prc_parse_file(const char *, const flag);
 int prc_filecheck(const char *, const flag);
 
 /* base64.c */
-void to64frombits(unsigned char *, const unsigned char *, int);
-int from64tobits(char *, const char *, int maxlen);
+void to64frombits(char *, const void *, int);
+int from64tobits(void *, const char *, int maxlen);
 
 /* unmime.c */
 /* Bit-mask returned by MimeBodyType */
 #define MSG_IS_7BIT       0x01
 #define MSG_IS_8BIT       0x02
 #define MSG_NEEDS_DECODE  0x80
-extern void UnMimeHeader(unsigned char *buf);
-extern int  MimeBodyType(unsigned char *hdrs, int WantDecode);
-extern int  UnMimeBodyline(unsigned char **buf, flag delimited, flag issoftline);
+extern void UnMimeHeader(char *buf);
+extern int  MimeBodyType(char *hdrs, int WantDecode);
+extern int  UnMimeBodyline(char **buf, flag delimited, flag issoftline);
 
 /* interface.c */
 void interface_init(void);
@@ -633,21 +651,32 @@ extern char currentwd[1024], rcfiledir[1024];
 struct query *hostalloc(struct query *); 
 int parsecmdline (int, char **, struct runctl *, struct query *);
 char *prependdir (const char *, const char *);
-char *MD5Digest (unsigned char *);
-void hmac_md5 (unsigned char *, size_t, unsigned char *, size_t, unsigned char *, size_t);
-int POP3_auth_rpa(unsigned char *, unsigned char *, int socket);
+char *MD5Digest (unsigned const char *);
+void hmac_md5 (char *, size_t, char *, size_t, unsigned char *, size_t);
+int POP3_auth_rpa(char *, char *, int socket);
 typedef RETSIGTYPE (*SIGHANDLERTYPE) (int);
 void deal_with_sigchld(void);
 RETSIGTYPE null_signal_handler(int sig);
 SIGHANDLERTYPE set_signal_handler(int sig, SIGHANDLERTYPE handler);
-int daemonize(const char *, void (*)(int));
+int daemonize(const char *);
 char *fm_getpassword(char *);
 void escapes(const char *, char *);
 char *visbuf(const char *);
 const char *showproto(int);
 void dump_config(struct runctl *runp, struct query *querylist);
-int is_host_alias(const char *, struct query *);
-char *host_fqdn(int required);
+int is_host_alias(const char *, struct query *, struct addrinfo **);
+
+extern struct addrinfo *ai0, *ai1;
+
+/** Try to obtain fully qualified hostname of current host. Exit with
+ * PS_DNS if \a required is true and there is a DNS error. Exit with
+ * PS_DNS if gethostname() fails, independent of the value of \a
+ * required.
+ * \return
+ * - fully qualified hostname if \a required is non-zero.
+ * - unqualified or fully qualified hostname if \a required is zero (0).
+ */
+char *host_fqdn(int required /** exit with PS_DNS if the name cannot be qualified */);
 char *rfc822timestamp(void);
 flag is_a_file(int);
 char *rfc2047e(const char*, const char *);
@@ -668,11 +697,11 @@ void itimerthread(void*);
 #define chdir _chdir2
 #endif /* _EMX_ */
 
-# if HAVE_STRERROR
-#  ifndef strerror             /* On some systems, strerror is a macro */
+#ifdef HAVE_STRERROR
+#  if !defined(strerror) && !defined(HAVE_DECL_STRERROR)       /* On some systems, strerror is a macro */
 char *strerror (int);
 #  endif
-# endif /* HAVE_STRERROR */
+#endif /* HAVE_STRERROR */
 
 #define STRING_DISABLED        (char *)-1
 #define STRING_DUMMY   ""
@@ -734,5 +763,15 @@ int servport(const char *service);
 # define NI_DGRAM      16
 #endif
 
+int fm_getaddrinfo(const char *node, const char *serv, const struct addrinfo *hints, struct addrinfo **res);
+void fm_freeaddrinfo(struct addrinfo *ai);
+
+/* prototypes from tls.c */
+int maybe_tls(struct query *ctl);
+int must_tls(struct query *ctl);
+
+/* prototype from rfc822valid.c */
+int rfc822_valid_msgid(const unsigned char *);
+
 #endif
 /* fetchmail.h ends here */