From ffb2d4f3705ffc083472d04a3c58146b6bc8bfea Mon Sep 17 00:00:00 2001 From: Pierre Habouzit Date: Tue, 10 Apr 2007 10:07:23 +0200 Subject: [PATCH] Build system simplifications. Do not use MUTT_LIB_OBJECTS anymore, always compile everything, rather use the preprocessor, so that everything is clear from the source, and that we don't have to look in the build system to know what's going on. Signed-off-by: Pierre Habouzit --- Makefile.am | 38 ++--- configure.ac | 4 - init.c | 4 +- mutt_libesmtp.c | 407 ------------------------------------------------ mutt_libesmtp.h | 25 --- mutt_sasl.c | 4 + mutt_sasl.h | 5 +- sendlib.c | 4 +- 8 files changed, 27 insertions(+), 464 deletions(-) delete mode 100644 mutt_libesmtp.c delete mode 100644 mutt_libesmtp.h diff --git a/Makefile.am b/Makefile.am index 54167f5..6d514b8 100644 --- a/Makefile.am +++ b/Makefile.am @@ -18,13 +18,13 @@ DISTCLEANFILES = $(BUILT_SOURCES) bin_PROGRAMS = madmutt madmutt_dotlock madmutt_SOURCES = $(BUILT_SOURCES) \ alias.c attach.c base64.c browser.c buffy.c charset.c commands.c \ - compose.c copy.c crypt.c editmsg.c init.c keymap.c \ - flags.c from.c handler.c headers.c help.c hook.c \ - main.c muttlib.c mutt_idna.c pager.c pattern.c postpone.c recvattach.c recvcmd.c \ - score.c send.c sendlib.c sort.c state.c thread.c account.c remailer.c + compose.c copy.c crypt.c editmsg.c init.c keymap.c flags.c from.c \ + handler.c headers.c help.c hook.c main.c muttlib.c mutt_idna.c \ + pager.c pattern.c postpone.c recvattach.c recvcmd.c score.c send.c \ + sendlib.c send_smtp.c sort.c state.c thread.c account.c remailer.c \ + mutt_sasl.c -madmutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ \ - $(top_builddir)/lib-mime/libmime.a \ +madmutt_LDADD = $(top_builddir)/lib-mime/libmime.a \ $(top_builddir)/lib-mx/libmx.a \ $(top_builddir)/imap/libimap.a \ $(top_builddir)/pop/libpop.a \ @@ -36,10 +36,7 @@ madmutt_LDADD = @MUTT_LIB_OBJECTS@ @LIBOBJS@ \ $(top_builddir)/lib-lib/liblib.a \ $(MUTTLIBS) $(INTLLIBS) $(LIBICONV) -madmutt_DEPENDENCIES = \ - \ - @MUTT_LIB_OBJECTS@ @LIBOBJS@ \ - $(top_builddir)/lib-lib/liblib.a \ +madmutt_DEPENDENCIES = $(top_builddir)/lib-lib/liblib.a \ $(top_builddir)/lib-mime/libmime.a \ $(top_builddir)/lib-hash/libhash.a \ $(top_builddir)/lib-sys/libsys.a \ @@ -61,28 +58,23 @@ INCLUDES=-I$(top_srcdir) $(GPGME_CFLAGS) -Iintl CPPFLAGS=@CPPFLAGS@ -I$(includedir) -EXTRA_madmutt_SOURCES = \ - account.c mutt_sasl.c dotlock.c remailer.c \ - alias.h browser.h remailer.h state.h \ - mutt_idna.h mutt_libesmtp.c state.h - EXTRA_DIST = config.rpath COPYRIGHT GPL OPS TODO \ configure account.h alias.h attach.h recvattach.h handler.h thread.h \ - buffy.h charset.h copy.h crypt.c dotlock.h functions.def gen_defs \ - recvattach.h handler.h thread.h globals.h init.h keymap.h \ - mime.h mutt.h mutt_sasl.h pager.h protos.h \ - sort.h autogen.sh remailer.c remailer.h browser.h state.h \ - README.SSL depcomp mutt_idna.h mutt_libesmtp.h + alias.h browser.h remailer.h state.h mutt_idna.h state.h buffy.h \ + charset.h copy.h dotlock.h functions.def gen_defs recvattach.h handler.h \ + thread.h globals.h init.h keymap.h mime.h mutt.h mutt_sasl.h pager.h \ + protos.h sort.h autogen.sh remailer.h browser.h state.h README.SSL \ + depcomp mutt_idna.h send_smtp.h madmutt_dotlock_SOURCES = dotlock.c -madmutt_dotlock_LDADD = @LIBOBJS@ $(top_builddir)/lib-lib/liblib.a -madmutt_dotlock_DEPENDENCIES = @LIBOBJS@ $(top_builddir)/lib-lib/liblib.a +madmutt_dotlock_LDADD = $(top_builddir)/lib-lib/liblib.a +madmutt_dotlock_DEPENDENCIES = $(top_builddir)/lib-lib/liblib.a CLEANFILES = keymap_defs.h ACLOCAL_AMFLAGS = -I m4 -LDADD = @LIBOBJS@ @LIBINTL@ +LDADD = @LIBINTL@ charset.gperf: charset.def sh $< > $@ diff --git a/configure.ac b/configure.ac index e0c347c..3473f36 100644 --- a/configure.ac +++ b/configure.ac @@ -393,8 +393,6 @@ AC_ARG_WITH(sasl2, AC_HELP_STRING([--with-sasl2[=PFX]], saved_LIBS="$LIBS" AC_CHECK_LIB(sasl2, sasl_client_init,,AC_MSG_ERROR([could not find libsasl2])) - - MUTT_LIB_OBJECTS="$MUTT_LIB_OBJECTS mutt_sasl.o" MUTTLIBS="$MUTTLIBS -lsasl2" LIBS="$saved_LIBS" AC_DEFINE(USE_SASL,1, @@ -549,7 +547,6 @@ fi]) dnl -- end cache -- AC_SUBST(MUTTLIBS) -AC_SUBST(MUTT_LIB_OBJECTS) AC_SUBST(LIBNNTP) AC_SUBST(LIBNNTPDEPS) @@ -642,7 +639,6 @@ if test x$use_libesmtp = xyes; then CFLAGS="$CFLAGS $mutt_libesmtp_cflags" dnl HACK MUTTLIBS="$MUTTLIBS $mutt_libesmtp_libs" MUTTLIBS="$MUTTLIBS -lesmtp" - MUTT_LIB_OBJECTS="$MUTT_LIB_OBJECTS mutt_libesmtp.o" AC_DEFINE(USE_LIBESMTP, 1, [Define to enable the use of libesmtp]) fi dnl -- end libesmtp -- diff --git a/init.c b/init.c index 0a4d827..2270910 100644 --- a/init.c +++ b/init.c @@ -25,7 +25,7 @@ #include "charset.h" #include "thread.h" #include "mutt_idna.h" -#include "mutt_libesmtp.h" +#include "send_smtp.h" #include "alias.h" #include "init.h" @@ -84,7 +84,7 @@ static struct { char* errbuf, ssize_t errlen); } SpecialVars[] = { #if defined (USE_LIBESMTP) && (defined (USE_SSL) || defined (USE_GNUTLS)) - { "smtp_use_tls", mutt_libesmtp_check_usetls }, + { "smtp_use_tls", send_smtp_check_usetls }, #endif { "history", check_history }, { "pager_index_lines", check_num }, diff --git a/mutt_libesmtp.c b/mutt_libesmtp.c deleted file mode 100644 index eda907e..0000000 --- a/mutt_libesmtp.c +++ /dev/null @@ -1,407 +0,0 @@ -/* - * Copyright notice from original mutt: - * [none] - * - * Parts were written/modified by: - * Christian Gall - * Rocco Rutte - * - * This file is part of mutt-ng, see http://www.muttng.org/. - * It's licensed under the GNU General Public License, - * please see the file GPL in the top level source directory. - */ - -#include - -#include -#include - -#include "mutt.h" -#include "mutt_libesmtp.h" - -#if defined (USE_SSL) || (defined (USE_GNUTLS) && defined (HAVE_GNUTLS_OPENSSL_H)) -#include -#endif - -#include -#include - -static char authpass[STRING] = ""; - -#define FAIL() \ - do { \ - ret = -1; \ - goto Done; \ - } while (0) -#define MSGFAIL(msg) \ - do { \ - mutt_error("%s", msg); \ - FAIL(); \ - } while (0) -#define LIBCFAIL(msg) \ - do { \ - mutt_error("%s: %s", msg, strerror(errno)); \ - FAIL(); \ - } while (0) -#define SMTPFAIL(msg) \ - do { \ - _mutt_libesmtp_perror(msg); \ - FAIL(); \ - } while (0) -#define extna(msg) { mutt_error (_("SMTP Extension '%s' not supported by MTA."), \ - msg); sleep (1); } - -/* - * _mutt_libesmtp_ensure_init - * Make sure the libESMTP support in mutt is initialized at some time. - */ -static void _mutt_libesmtp_ensure_init () -{ - static int libesmtp_init = 0; - - if (!libesmtp_init) { - if (SmtpAuthUser) - auth_client_init (); - libesmtp_init = 1; - } -} - -/* - * _mutt_libesmtp_perror - * Prints 'msg', a colon, and then a string representation of the - * libesmtp errno as a mutt error. - */ -static void _mutt_libesmtp_perror (const char *msg) -{ - char buf[512]; - - mutt_error ("%s: %s", msg, - smtp_strerror (smtp_errno (), buf, sizeof (buf))); -} - -/* - * _mutt_libesmtp_add_recipients - * Adds every address in 'addr' as a recipient to the smtp message - * 'message'. Note that this does not mean that they will necessarily - * show up in the mail headers (e.g., when bcc'ing). Returns 0 upon - * success, -1 upon failure (and prints an error message). - * - * Very similar to sendlib.c::add_args - */ -static int -_mutt_libesmtp_add_recipients (smtp_message_t message, address_t * addr) -{ - int ret = 0; - - for (; addr; addr = addr->next) { - /* weed out group mailboxes, since those are for display only */ - if (addr->mailbox && !addr->group) { - if (!smtp_add_recipient (message, addr->mailbox)) - SMTPFAIL ("smtp_add_recipient"); - } - } - -Done: - return ret; -} - -static int -_mutt_libesmtp_auth_interact (auth_client_request_t request, - char **result, int fields, - void *arg __attribute__ ((unused))) -{ - int i; - - for (i = 0; i < fields; i++) { - if (request[i].flags & AUTH_USER) { - result[i] = SmtpAuthUser; - } - else if (request[i].flags & AUTH_PASS) { - if (SmtpAuthPass) { - result[i] = SmtpAuthPass; - } - else { - if (authpass[0] == '\0') { - char prompt[STRING]; - - snprintf (prompt, sizeof (prompt), "%s%s: ", request[i].prompt, - (request[i]. - flags & AUTH_CLEARTEXT) ? " (not encrypted)" : ""); - mutt_get_field_unbuffered (prompt, authpass, sizeof (authpass), - M_PASS); - } - result[i] = authpass; - } - } - } - - return 1; -} - -#define BUFLEN 8192 - -static const char *_mutt_libesmtp_messagefp_cb (void **buf, int *len, - void *arg) -{ - int octets; - - if (*buf == NULL) - *buf = xmalloc(BUFLEN); - - if (len == NULL) { - rewind ((FILE *) arg); - return NULL; - } - - if (fgets (*buf, BUFLEN - 2, (FILE *) arg) == NULL) { - octets = 0; - } - else { - char *p = strchr (*buf, '\0'); - - if (p[-1] == '\n' && p[-2] != '\r') { - m_strcpy(p - 1, (char *) *buf + BUFLEN - p + 1, "\r\n"); - p++; - } - octets = p - (char *) *buf; - } - - *len = octets; - return *buf; -} - -static int handle_invalid_peer_certificate (long vfy_result) { -#if defined (USE_SSL) || (defined (USE_GNUTLS) && defined (HAVE_GNUTLS_OPENSSL_H)) - mutt_error (_("Error verifying certificate: %s"), - NONULL (X509_verify_cert_error_string (vfy_result))); -#else - mutt_error (_("Error verifying certificate. Error Code: %lu"), vfy_result); -#endif - sleep(2); - return 1; /* Accept the problem */ -} - -static void event_cb (smtp_session_t session __attribute__ ((unused)), - int event_no, void *arg,...) -{ - va_list alist; - int *ok; - - va_start(alist, arg); - switch(event_no) { - case SMTP_EV_CONNECT: - case SMTP_EV_MAILSTATUS: - case SMTP_EV_RCPTSTATUS: - case SMTP_EV_MESSAGEDATA: - case SMTP_EV_MESSAGESENT: - case SMTP_EV_DISCONNECT: break; - case SMTP_EV_WEAK_CIPHER: { - int bits; - bits = va_arg(alist, long); ok = va_arg(alist, int*); - mutt_message (_("SMTP_EV_WEAK_CIPHER, bits=%d - accepted."), bits); - sleep(1); - *ok = 1; break; - } - case SMTP_EV_STARTTLS_OK: - mutt_message (_("Using TLS")); - sleep(1); - break; - case SMTP_EV_INVALID_PEER_CERTIFICATE: { - long vfy_result; - vfy_result = va_arg(alist, long); ok = va_arg(alist, int*); - *ok = handle_invalid_peer_certificate(vfy_result); - sleep(1); - break; - } - case SMTP_EV_NO_PEER_CERTIFICATE: { - ok = va_arg(alist, int*); - mutt_message (_("SMTP_EV_NO_PEER_CERTIFICATE - accepted.")); - sleep(1); - *ok = 1; break; - } - case SMTP_EV_WRONG_PEER_CERTIFICATE: { - ok = va_arg(alist, int*); - mutt_message (_("SMTP_EV_WRONG_PEER_CERTIFICATE - accepted.")); - sleep(1); - *ok = 1; break; - } - case SMTP_EV_NO_CLIENT_CERTIFICATE: { - ok = va_arg(alist, int*); - mutt_message (_("SMTP_EV_NO_CLIENT_CERTIFICATE - accepted.")); - sleep(1); - *ok = 1; break; - } - case SMTP_EV_EXTNA_DSN: - extna ("DSN"); - break; - case SMTP_EV_EXTNA_STARTTLS: - extna ("StartTLS"); - break; - case SMTP_EV_EXTNA_8BITMIME: - extna ("8BITMIME"); - break; - default: - mutt_message(_("Got unhandled event ID = %d - ignored."), event_no); - sleep(1); - } - va_end(alist); -} - -static void do_dsn_notify (smtp_message_t message, const char* from) { - int flags = Notify_NOTSET; - smtp_recipient_t self = NULL; - - if (m_strisempty(MTransport.dsn_notify) || !message || m_strisempty(from) || - strstr (MTransport.dsn_notify, "never") != NULL) - return; - - if (strstr (MTransport.dsn_notify, "failure") != NULL) - flags |= Notify_FAILURE; - if (strstr (MTransport.dsn_notify, "delay") != NULL) - flags |= Notify_DELAY; - if (strstr (MTransport.dsn_notify, "success") != NULL) - flags |= Notify_SUCCESS; - - if (flags != Notify_NOTSET) { - if (!(self = smtp_add_recipient (message, from))) - return; - smtp_dsn_set_notify (self, flags); - } -} - -static void do_dsn_ret (smtp_message_t message) { - if (m_strisempty(MTransport.dsn_return) || !message) - return; - if (ascii_strncasecmp (MTransport.dsn_return, "hdrs", 4) == 0) - smtp_dsn_set_ret (message, Ret_HDRS); - else if (ascii_strncasecmp (MTransport.dsn_return, "full", 4) == 0) - smtp_dsn_set_ret (message, Ret_FULL); -} - -#if defined (USE_LIBESMTP) && (defined (USE_SSL) || defined (USE_GNUTLS)) -int mutt_libesmtp_check_usetls (const char* option, unsigned long p, - char* errbuf, ssize_t errlen) { - char* val = (char*) p; - if (m_strisempty(val)) - return (1); - if (m_strncmp(val, "enabled", 7) != 0 && - m_strncmp(val, "required", 8) != 0) { - if (errbuf) - snprintf (errbuf, errlen, _("'%s' is invalid for %s"), val, option); - return (0); - } - return (1); -} -#endif - -/* - * mutt_libesmtp_invoke - * Sends a mail message to the provided recipients using libesmtp. - * Returns 0 upon success, -1 upon failure (and prints an error - * message). - */ -int mutt_libesmtp_invoke (address_t * from, /* the sender */ - address_t * to, address_t * cc, address_t * bcc, /* recips */ - const char *msg, /* file containing message */ - int eightbit) -{ /* message contains 8bit chars */ - int ret = 0; /* return value, default = success */ - smtp_session_t session; - smtp_message_t message; - char *hostportstr = NULL; - size_t hostportlen; - FILE *fp = NULL; - auth_context_t authctx = NULL; - const smtp_status_t *status; - char* envfrom = from->mailbox; - - _mutt_libesmtp_ensure_init (); - - if ((session = smtp_create_session ()) == NULL) - SMTPFAIL ("smtp_create_session"); - -#if defined (USE_SSL) || (defined (USE_GNUTLS) && defined (HAVE_GNUTLS_OPENSSL_H)) - if (SmtpUseTLS != NULL && ascii_strncasecmp("enabled", SmtpUseTLS, 7) == 0) { - smtp_starttls_enable(session, Starttls_ENABLED); - } else if (SmtpUseTLS != NULL && ascii_strncasecmp("required", SmtpUseTLS, 8) == 0) { - smtp_starttls_enable(session, Starttls_REQUIRED); - } -#endif - - /* Create hostname:port string and tell libesmtp */ - /* len = SmtpHost len + colon + max port (65536 => 5 chars) + terminator */ - hostportlen = m_strlen(SmtpHost) + 7; - hostportstr = p_new(char, hostportlen); - snprintf (hostportstr, hostportlen, "%s:%d", SmtpHost, SmtpPort); - if (!smtp_set_server (session, hostportstr)) - SMTPFAIL ("smtp_set_server"); - - if (SmtpAuthUser) { - if ((authctx = auth_create_context ()) == NULL) - MSGFAIL ("auth_create_context failed"); - auth_set_mechanism_flags (authctx, AUTH_PLUGIN_PLAIN, 0); - auth_set_interact_cb (authctx, _mutt_libesmtp_auth_interact, NULL); - - if (!smtp_auth_set_context (session, authctx)) - SMTPFAIL ("smtp_auth_set_context"); - } - -#if defined (USE_SSL) || (defined (USE_GNUTLS) && defined (HAVE_GNUTLS_OPENSSL_H)) - smtp_starttls_set_ctx (session, NULL); -#endif - smtp_set_eventcb (session, event_cb, NULL); - - if ((message = smtp_add_message (session)) == NULL) - SMTPFAIL ("smtp_add_message"); - - /* Initialize envelope sender */ - if (MTransport.use_envelope_from && MTransport.envelope_from_address) - envfrom = MTransport.envelope_from_address->mailbox; - if (!smtp_set_reverse_path (message, envfrom)) - SMTPFAIL ("smtp_set_reverse_path"); - - /* set up DSN for message */ - do_dsn_notify (message, envfrom); - do_dsn_ret (message); - - /* set up 8bitmime flag */ - if (eightbit && MTransport.use_8bitmime) - smtp_8bitmime_set_body (message, E8bitmime_8BITMIME); - - if ((fp = fopen (msg, "r")) == NULL) - LIBCFAIL ("fopen"); - if (!smtp_set_messagecb (message, _mutt_libesmtp_messagefp_cb, fp)) - SMTPFAIL ("smtp_set_messagecb"); - if (_mutt_libesmtp_add_recipients (message, to)) - FAIL (); - if (_mutt_libesmtp_add_recipients (message, cc)) - FAIL (); - if (_mutt_libesmtp_add_recipients (message, bcc)) - FAIL (); - if (!smtp_start_session (session)) - SMTPFAIL ("smtp_start_session"); - - status = smtp_message_transfer_status (message); - if (status->code < 200 || status->code > 299) { - char buf[256]; - - snprintf (buf, sizeof (buf), "SMTP error while sending: %d %s", - status->code, status->text); - MSGFAIL (buf); - } - -Done: - m_fclose(&fp); - if (hostportstr != NULL) - p_delete(&hostportstr); - if (session != NULL) - smtp_destroy_session (session); - if (authctx != NULL) - auth_destroy_context (authctx); - - /* Forget user-entered SMTP AUTH password if send fails */ - if (ret != 0) - authpass[0] = '\0'; - - return ret; -} diff --git a/mutt_libesmtp.h b/mutt_libesmtp.h deleted file mode 100644 index 1fef3be..0000000 --- a/mutt_libesmtp.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright notice from original mutt: - * [none] - * - * This file is part of mutt-ng, see http://www.muttng.org/. - * It's licensed under the GNU General Public License, - * please see the file GPL in the top level source directory. - */ - -#ifndef _MUTT_LIBESMTP_H -#define _MUTT_LIBESMTP_H - -#ifdef USE_LIBESMTP -#if (defined (USE_SSL) || defined (USE_GNUTLS)) -int mutt_libesmtp_check_usetls (const char* option, unsigned long p, - char* errbuf, ssize_t errlen); -#endif - -int mutt_libesmtp_invoke (address_t * from, /* the sender */ - address_t * to, address_t * cc, address_t * bcc, /* recips */ - const char *msg, /* file containing message */ - int eightbit); /* message contains 8bit chars */ -#endif - -#endif /* !_MUTT_LIBESMTP_H */ diff --git a/mutt_sasl.c b/mutt_sasl.c index dd97bfa..219c36d 100644 --- a/mutt_sasl.c +++ b/mutt_sasl.c @@ -11,6 +11,8 @@ #include +#ifdef USE_SASL + #include #include #include @@ -455,3 +457,5 @@ fail: conn->sockdata = sasldata; return -1; } + +#endif /* USE_SASL */ diff --git a/mutt_sasl.h b/mutt_sasl.h index f0b27f6..e3c3961 100644 --- a/mutt_sasl.h +++ b/mutt_sasl.h @@ -12,8 +12,10 @@ #ifndef _MUTT_SASL_H_ #define _MUTT_SASL_H_ 1 -#include +#include +#ifdef USE_SASL +#include #include int mutt_sasl_client_new (CONNECTION *, sasl_conn_t **); @@ -39,4 +41,5 @@ typedef struct { int (*msasl_write) (CONNECTION * conn, const char *buf, ssize_t count); } SASL_DATA; +#endif /* USE_SASL */ #endif /* _MUTT_SASL_H_ */ diff --git a/sendlib.c b/sendlib.c index 86440df..b79d3c1 100644 --- a/sendlib.c +++ b/sendlib.c @@ -26,7 +26,7 @@ #include "pager.h" #include "charset.h" #include "mutt_idna.h" -#include "mutt_libesmtp.h" +#include "send_smtp.h" #ifdef USE_NNTP #include @@ -1937,7 +1937,7 @@ int mutt_invoke_mta (address_t * from, /* the sender */ if (!option (OPTNEWSSEND)) #endif if (SmtpHost) - return mutt_libesmtp_invoke (from, to, cc, bcc, msg, eightbit); + return send_smtp_invoke (from, to, cc, bcc, msg, eightbit); #endif return mutt_invoke_sendmail (from, to, cc, bcc, msg, eightbit); -- 2.20.1