+/** \file fetchmail.h header file for fetchmail */
#ifndef _FETCHMAIL_H
#define _FETCHMAIL_H
/*
/* 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 */
#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 */
|| (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)
/*
#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 */
#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) */
#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;
struct idlist
{
- unsigned char *id;
+ char *id;
union
{
struct
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;
};
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 */
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 */
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 */
/* 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 */
#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 */
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)))
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;
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);
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 *);
#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 ""
# 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 */