X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=main.c;h=74f95beab2abf13132f40c701a87412cc66071d0;hp=d5e6cf843ad40f66e0b4e56d700ac583a6dfe11d;hb=f8d1899d44b259a0920a52bd7290f15e39fd0d47;hpb=a4831bf15088ad6a734dcd53d5fe66105ccdce47 diff --git a/main.c b/main.c index d5e6cf8..74f95be 100644 --- a/main.c +++ b/main.c @@ -18,19 +18,23 @@ #include #include +#include +#include #include +#include #include -#include -#include +#include #include #include "mutt.h" +#include "crypt.h" #include "alias.h" #include "buffy.h" #include "sort.h" #include "keymap.h" #include "mutt_idna.h" +#include "mutt_sasl.h" #ifdef HAVE_GETOPT_H #include @@ -43,383 +47,142 @@ extern int optind; #include #endif -#ifdef USE_NNTP -#include -#endif - -#ifdef USE_LIBESMTP -#include -#endif - #ifdef USE_HCACHE -#if defined(HAVE_QDBM) -#include +#if defined(HAVE_TOKYOCABINET) +#include #elif defined(HAVE_GDBM) #include -#elif defined(HAVE_DB4) -#include #endif #endif -#ifdef USE_GNUTLS #include -#endif - -#ifdef CRYPT_BACKEND_GPGME #include -#endif - -#ifdef USE_SSL -#include -#endif -static const char *Notice = N_("\ -Copyright (C) 1996-2002 Michael R. Elkins and others.\n\ -Copyright (C) 2005 The Mutt-ng Team\n\ -Copyright (C) 2006 Pierre Habouzit undation, Inc.\n\ -This is free software. You may redistribute copies of it under the terms of\n\ -the GNU General Public License .\n\ -There is NO WARRANTY, to the extent permitted by law.\n"); +#include -void mutt_exit (int code) +void mutt_exit(int code) { - mutt_endwin (NULL); - exit (code); + mutt_endwin(NULL); + exit(code); } static void mutt_usage (void) { - puts (mutt_make_version (1)); - - puts - _("usage: madmutt [ -nRyzZ ] [ -e ] [ -F ] [ -m ] [ -f ]\n\ - madmutt [ -nR ] [ -e ] [ -F ] -Q [ -Q ] [...]\n\ - madmutt [ -nR ] [ -e ] [ -F ] -A [ -A ] [...]\n\ - madmutt [ -nR ] [ -e ] [ -F ] -t"); - puts - _("\ - madmutt [ -nR ] [ -e ] [ -F ] -T\n\ - madmutt [ -nx ] [ -e ] [ -a ] [ -F ] [ -H ] [ -i ] [ -s ] [ -b ] [ -c ] [ ... ]\n\ - madmutt [ -n ] [ -e ] [ -F ] -p\n\ - madmutt -v\n\ -\n\ -options:\n\ - -A \texpand the given alias\n\ - -a \tattach a file to the message\n\ - -b
\tspecify a blind carbon-copy (BCC) address\n\ - -c
\tspecify a carbon-copy (CC) address"); - puts _("\ - -e \tspecify a command to be executed after initialization\n\ - -f \tspecify which mailbox to read\n\ - -F \tspecify an alternate muttrngc file\n\ - -g \tspecify a newsserver (if compiled with NNTP)\n\ - -G\t\tselect a newsgroup (if compiled with NNTP)\n\ - -H \tspecify a draft file to read header and body from\n\ - -i \tspecify a file which Madmutt should include in the body"); - puts _("\ - -d \t specify debugging level of Madmutt\n\ - -m \tspecify a default mailbox type\n\ - -n\t\tcauses Madmutt not to read the system Madmuttrc\n\ - -p\t\trecall a postponed message\n\ - -Q \tquery a configuration variable\n\ - -R\t\topen mailbox in read-only mode\n\ - -s \tspecify a subject (must be in quotes if it has spaces)"); - puts _("\ - -t\t\tprint the value of all variables to stdout\n\ - -T\t\tprint the value of all changed variables to stdout\n\ - -v\t\tshow version and compile-time definitions\n\ - -y\t\tselect a mailbox specified in your `mailboxes' list\n\ - -z\t\texit immediately if there are no messages in the mailbox\n\ - -Z\t\topen the first folder with new message, exit immediately if none\n\ - -h\t\tthis help message"); + puts(madmutt_version); - exit (0); + puts(_("\ +usage: madmutt [ -nRyzZ ] [ -e ] [ -F ] [ -f ]\n\ + madmutt [ -n ] [ -e ] [ -a ] [ -F ] [ -H ] [ -i ] [ -s ] [ -b ] [ -c ] [ ... ]\n\ + madmutt [ -n ] [ -e ] [ -F ] -p\n\ + madmutt -v\n")); + + puts(_("Options:")); + puts(_(" -a attach a file to the message")); + puts(_(" -b
specify a blind carbon-copy (BCC) address")); + puts(_(" -c
specify a carbon-copy (CC) address")); + puts(_(" -e specify a command to be executed after initialization")); + puts(_(" -f specify which mailbox to read")); + puts(_(" -F specify an alternate Madmuttrc file")); + puts(_(" -H specify a draft file to read header and body from")); + puts(_(" -i specify a file which Madmutt should include in the body")); + puts(_(" -n causes Madmutt not to read the system Madmuttrc")); + puts(_(" -p recall a postponed message")); + puts(_(" -R open mailbox in read-only mode")); + puts(_(" -s specify a subject (must be in quotes if it has spaces)")); + puts(_(" -v show version and compile-time definitions")); + puts(_(" -z exit immediately if there are no messages in the mailbox")); + puts(_(" -Z open the first folder with new message, exit immediately if none")); + puts(_(" -h this help message")); + + exit(0); } static void show_version (void) { - struct utsname uts; -#ifdef USE_LIBESMTP - char buf[STRING]; -#endif - - puts (mutt_make_version (1)); - puts (_(Notice)); - - uname (&uts); - -#ifdef _AIX - printf ("System:\n %s %s.%s", uts.sysname, uts.version, uts.release); -#elif defined (SCO) - printf ("System:\n SCO %s", uts.release); -#else - printf ("System:\n %s %s", uts.sysname, uts.release); -#endif - - printf (" (%s)\nExternal Libraries:\n", uts.machine); - + struct utsname uts; + uname(&uts); + + puts(madmutt_version); + puts(_(" Copyright (C) 1996-2002 Michael R. Elkins and others.")); + puts(_(" Copyright (C) 2005 The Mutt-ng Team")); + puts(_(" Copyright (C) 2006-2007 Pierre Habouzit")); + puts(_(" MadMutt is based on Mutt-ng wich was based on Mutt before")); + puts(""); + + printf("System:\n %s %s (%s)\n", uts.sysname, uts.release, uts.machine); + puts("External Libraries:"); #ifdef NCURSES_VERSION - printf (" ncurses %s\n", NCURSES_VERSION); -#elif defined(USE_SLANG_CURSES) - printf (" slang %d\n", SLANG_VERSION); + printf(" ncurses %s\n", NCURSES_VERSION); #endif - #ifdef _LIBICONV_VERSION - printf (" libiconv %d.%d\n", _LIBICONV_VERSION >> 8, - _LIBICONV_VERSION & 0xff); + printf(" libiconv %d.%d\n", _LIBICONV_VERSION >> 8, + _LIBICONV_VERSION & 0xff); #endif - -#ifdef HAVE_LIBIDN - printf (" libidn %s (compiled with %s)\n", - stringprep_check_version (NULL), STRINGPREP_VERSION); +#ifdef STRINGPREP_VERSION + printf(" libidn %s\n", STRINGPREP_VERSION); #endif - -#ifdef USE_LIBESMTP - smtp_version (buf, sizeof (buf), 0); - printf (" libESMTP %s\n", buf); -#endif - #ifdef USE_HCACHE -#if defined(HAVE_QDBM) - printf (" qdbm %s\n", dpversion); +#if defined(HAVE_TOKYOCABINET) + printf(" tokyocabinet %s\n", tcversion); #elif defined(HAVE_GDBM) - printf (" gdbm %s\n", gdbm_version); -#elif defined(HAVE_DB4) - printf (" DB4 %d.%d.%d\n", DB_VERSION_MAJOR, DB_VERSION_MINOR, - DB_VERSION_PATCH); -#endif -#endif - -#ifdef USE_GNUTLS - printf (" gnutls %s\n", LIBGNUTLS_VERSION); -#endif - -#ifdef USE_SSL - printf (" %s\n",OPENSSL_VERSION_TEXT); + printf(" gdbm %s\n", gdbm_version); #endif - -#ifdef CRYPT_BACKEND_GPGME - printf (" gpgme %s\n", GPGME_VERSION); #endif + printf(" gnutls %s\n", LIBGNUTLS_VERSION); + printf(" gpgme %s\n", GPGME_VERSION); + puts (_("Compile Options:")); - puts (_("Compile Options:")); - - puts ( -#ifdef HOMESPOOL - " +HOMESPOOL " -#else - " -HOMESPOOL " -#endif -#ifdef USE_SETGID - "+USE_SETGID " -#else - "-USE_SETGID " -#endif -#ifdef USE_FCNTL - "+USE_FCNTL " -#else - "-USE_FCNTL " -#endif -#ifdef USE_FLOCK - "+USE_FLOCK " -#else - "-USE_FLOCK " -#endif + puts ( #ifdef USE_HCACHE - "+USE_HCACHE " -#else - "-USE_HCACHE " -#endif - ); - puts ( -#ifdef USE_NNTP - "+USE_NNTP " -#else - "-USE_NNTP " -#endif -#ifdef USE_GSS - "+USE_GSS " -#else - "-USE_GSS " -#endif -#ifdef USE_SSL - "+USE_SSL " -#else - "-USE_SSL " -#endif -#ifdef USE_GNUTLS - "+USE_GNUTLS " -#else - "-USE_GNUTLS " -#endif -#ifdef USE_SASL - "+USE_SASL " -#else - "-USE_SASL " -#endif -#ifdef USE_LIBESMTP - "+USE_LIBESMTP " -#else - "-USE_LIBESMTP " -#endif - "\n " -#ifdef HAVE_REGCOMP - "+HAVE_REGCOMP " -#else - "-HAVE_REGCOMP " -#endif - "\n " -#ifdef HAVE_COLOR - "+HAVE_COLOR " -#else - "-HAVE_COLOR " -#endif -#ifdef HAVE_START_COLOR - "+HAVE_START_COLOR " -#else - "-HAVE_START_COLOR " -#endif -#ifdef HAVE_TYPEAHEAD - "+HAVE_TYPEAHEAD " -#else - "-HAVE_TYPEAHEAD " -#endif -#ifdef HAVE_BKGDSET - "+HAVE_BKGDSET " -#else - "-HAVE_BKGDSET " -#endif - "\n " -#ifdef HAVE_CURS_SET - "+HAVE_CURS_SET " -#else - "-HAVE_CURS_SET " -#endif -#ifdef HAVE_META - "+HAVE_META " -#else - "-HAVE_META " -#endif -#ifdef HAVE_RESIZETERM - "+HAVE_RESIZETERM " -#else - "-HAVE_RESIZETERM " -#endif - ); - - puts ( -#ifdef CRYPT_BACKEND_GPGME - "+CRYPT_BACKEND_GPGME " -#else - "-CRYPT_BACKEND_GPGME " -#endif - "\n " -#ifdef ENABLE_NLS - "+ENABLE_NLS " -#else - "-ENABLE_NLS " -#endif -#ifdef HAVE_WC_FUNCS - "+HAVE_WC_FUNCS " -#else - "-HAVE_WC_FUNCS " -#endif -#ifdef HAVE_LANGINFO_CODESET - "+HAVE_LANGINFO_CODESET " -#else - "-HAVE_LANGINFO_CODESET " -#endif -#ifdef HAVE_LANGINFO_YESEXPR - "+HAVE_LANGINFO_YESEXPR " -#else - "-HAVE_LANGINFO_YESEXPR " -#endif - "\n " -#ifdef HAVE_ICONV - "+HAVE_ICONV " + " +USE_HCACHE" #else - "-HAVE_ICONV " + " -USE_HCACHE" #endif #ifdef HAVE_LIBIDN - "+HAVE_LIBIDN " + " +HAVE_LIBIDN" #else - "-HAVE_LIBIDN " + " -HAVE_LIBIDN" #endif -#ifdef HAVE_GETSID - "+HAVE_GETSID " -#else - "-HAVE_GETSID " -#endif -#ifdef HAVE_GETADDRINFO - "+HAVE_GETADDRINFO " -#else - "-HAVE_GETADDRINFO " -#endif - ); + ); - puts (_("Built-In Defaults:")); + puts(_("Built-In Defaults:")); + printf(" SENDMAIL \"%s\"\n", SENDMAIL); + printf(" MAILPATH \"%s\"\n", MAILPATH); + printf(" PKGDATADIR \"%s\"\n", PKGDATADIR); + printf(" PKGDOCDIR \"%s\"\n", PKGDOCDIR); + printf(" SYSCONFDIR \"%s\"\n", SYSCONFDIR); -#ifdef ISPELL - printf (" +ISPELL=\"%s\"\n", ISPELL); -#else - puts (" -ISPELL"); -#endif + puts(""); + puts(_("This is free software. You may redistribute copies of it under the terms of")); + puts(_("the GNU General Public License .")); + puts(_("There is NO WARRANTY, to the extent permitted by law.")); - printf (" +SENDMAIL=\"%s\"\n", SENDMAIL); - printf (" +MAILPATH=\"%s\"\n", MAILPATH); - printf (" +PKGDATADIR=\"%s\"\n", PKGDATADIR); - printf (" +PKGDOCDIR=\"%s\"\n", PKGDOCDIR); - printf (" +SYSCONFDIR=\"%s\"\n", SYSCONFDIR); -#ifdef MIXMASTER - printf (" +MIXMASTER=\"%s\"\n\n", MIXMASTER); -#else - puts (" -MIXMASTER\n"); -#endif - - puts (_("MadMutt is based on Madmutt wich was based on Mutt before\n")); - - exit (0); -} - -static void start_curses (void) -{ - km_init (); /* must come before mutt_init */ - -#ifdef USE_SLANG_CURSES - SLtt_Ignore_Beep = 1; /* don't do that #*$@^! annoying visual beep! */ - SLsmg_Display_Eight_Bit = 128; /* characters above this are printable */ - SLtt_set_color (0, NULL, "default", "default"); -#else - /* should come before initscr() so that ncurses 4.2 doesn't try to install - its own SIGWINCH handler */ - mutt_signal_initialize (); -#endif - if (initscr () == NULL) { - puts _("Error initializing terminal."); - - exit (1); - } - mutt_signal_initialize (); - ci_start_color (); - keypad (stdscr, TRUE); - cbreak (); - noecho (); -#ifdef HAVE_TYPEAHEAD - typeahead (-1); /* simulate smooth scrolling */ -#endif -#ifdef HAVE_META - meta (stdscr, TRUE); -#endif + exit(0); } #define M_IGNORE (1<<0) /* -z */ #define M_BUFFY (1<<1) /* -Z */ #define M_NOSYSRC (1<<2) /* -n */ #define M_RO (1<<3) /* -R */ -#define M_SELECT (1<<4) /* -y */ -#ifdef USE_NNTP -#define M_NEWS (1<<5) /* -g and -G */ -#endif + +__attribute__((format(printf, 1, 0))) +static void mutt_nocurses_error (const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fputc('\n', stderr); +} + +static void *evtloop(void *data) +{ + for (;;) { + el_dispatch(100); + pthread_testcancel(); + } +} int main (int argc, char **argv) { @@ -427,18 +190,15 @@ int main (int argc, char **argv) char *subject = NULL; char *includeFile = NULL; char *draftFile = NULL; - char *newMagic = NULL; HEADER *msg = NULL; string_list_t *attach = NULL; string_list_t *commands = NULL; - string_list_t *queries = NULL; - string_list_t *alias_queries = NULL; int sendflags = 0; int flags = 0; int version = 0; int i; int explicit_folder = 0; - int dump_variables = -1; + pthread_t pt; /* initialize random number for tmp file creation */ srand48((unsigned int) time (NULL)); @@ -450,35 +210,17 @@ int main (int argc, char **argv) exit (1); } -#ifdef ENABLE_NLS - /* FIXME what about init.c:1439 ? */ setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, MUTTLOCALEDIR); textdomain (PACKAGE); -#endif - setlocale (LC_CTYPE, ""); - mutt_error = mutt_nocurses_error; - mutt_message = mutt_nocurses_error; + mutt_error = mutt_message = mutt_nocurses_error; srand48 (time (NULL)); umask (077); - p_clear(Options, countof(Options)); - p_clear(QuadOptions, countof(QuadOptions)); - -#ifdef USE_NNTP - while ((i = - getopt (argc, argv, - "A:a:b:F:f:c:e:g:GH:s:i:hm:npQ:RTtvyzZ")) != EOF) -#else - while ((i = - getopt (argc, argv, "A:a:b:F:f:c:e:H:s:i:hm:npQ:RTtvyzZ")) != EOF) -#endif + while ((i = getopt(argc, argv, "a:b:F:f:c:e:H:s:i:hnpRTtvzZ")) >= 0) switch (i) { - case 'A': - alias_queries = mutt_add_list (alias_queries, optarg); - break; case 'a': if (strlen(optarg)<=512) attach = mutt_add_list (attach, optarg); @@ -509,14 +251,6 @@ int main (int argc, char **argv) msg->env->cc = rfc822_parse_adrlist (msg->env->cc, optarg); break; - case 't': - dump_variables = 2; - break; - - case 'T': - dump_variables = 1; - break; - case 'e': commands = mutt_add_list (commands, optarg); break; @@ -529,11 +263,6 @@ int main (int argc, char **argv) includeFile = optarg; break; - case 'm': - /* should take precedence over .muttrc setting, so save it for later */ - newMagic = optarg; - break; - case 'n': flags |= M_NOSYSRC; break; @@ -542,10 +271,6 @@ int main (int argc, char **argv) sendflags |= SENDPOSTPONED; break; - case 'Q': - queries = mutt_add_list (queries, optarg); - break; - case 'R': flags |= M_RO; /* read-only mode */ break; @@ -558,24 +283,6 @@ int main (int argc, char **argv) version++; break; - case 'y': /* My special hack mode */ - flags |= M_SELECT; - break; - -#ifdef USE_NNTP - case 'g': /* Specify a newsserver */ - { - char buf[LONG_STRING]; - - snprintf (buf, sizeof (buf), "set nntp_host=%s", optarg); - commands = mutt_add_list (commands, buf); - } - - case 'G': /* List of newsgroups */ - flags |= M_SELECT | M_NEWS; - break; -#endif - case 'z': flags |= M_IGNORE; break; @@ -593,58 +300,31 @@ int main (int argc, char **argv) } /* Check for a batch send. */ - if (!isatty (0) || queries || alias_queries || dump_variables > 0) { - set_option (OPTNOCURSES); + if (!isatty (0)) { + set_option(OPTNOCURSES); sendflags = SENDBATCH; } /* This must come before mutt_init() because curses needs to be started before calling the init_pair() function to set the color scheme. */ - if (!option (OPTNOCURSES)) - start_curses (); + if (!option (OPTNOCURSES)) { + km_init(); + curses_initialize(); + mutt_signal_initialize(); + } /* set defaults and read init files */ + el_initialize(); mutt_init (flags & M_NOSYSRC, commands); string_list_wipe(&commands); + pthread_create(&pt, NULL, &evtloop, NULL); - /* Initialize crypto */ - crypt_init (); - - if (queries) - return mutt_query_variables (queries); - if (dump_variables > 0) - return (mutt_dump_variables (dump_variables-1)); - - if (alias_queries) { - int rv = 0; - address_t *a; - - for (; alias_queries; alias_queries = alias_queries->next) { - if ((a = address_list_dup(alias_lookup(alias_queries->data)))) { - /* output in machine-readable form */ - mutt_addrlist_to_idna (a, NULL); - mutt_write_address_list (a, stdout, 0, 0); - address_list_wipe(&a); - } else { - rv = 1; - printf ("%s\n", alias_queries->data); - } - } - return rv; - } - - if (newMagic) - mx_set_magic (newMagic); - - if (!option (OPTNOCURSES)) { - SETCOLOR (MT_COLOR_NORMAL); - clear (); - mutt_error = mutt_curses_error; - mutt_message = mutt_curses_message; + if (!option(OPTNOCURSES)) { + ui_layout_init(); } /* Create the Maildir directory if it doesn't exist. */ - if (!option (OPTNOCURSES) && Maildir) { + if (!option(OPTNOCURSES) && Maildir) { struct stat sb; char fpath[_POSIX_PATH_MAX]; char mesg[STRING]; @@ -675,6 +355,7 @@ int main (int argc, char **argv) char buf[LONG_STRING]; char *tempfile = NULL, *infile = NULL; char *bodytext = NULL; + FILE *fout; if (!option (OPTNOCURSES)) mutt_flushinp (); @@ -729,18 +410,16 @@ int main (int argc, char **argv) else fin = NULL; - mutt_mktemp (buf); - tempfile = m_strdup(buf); - if (draftFile) msg->env = mutt_read_rfc822_header (fin, NULL, 1, 0); /* is the following if still needed? */ - if (tempfile) { - FILE *fout; + fout = m_tempfile(buf, sizeof(buf), NONULL(mod_core.tmpdir), NULL); + tempfile = m_strdup(buf); - if ((fout = safe_fopen (tempfile, "w")) == NULL) { + if (tempfile) { + if (!fout) { if (!option (OPTNOCURSES)) mutt_endwin (NULL); perror (tempfile); @@ -798,43 +477,11 @@ int main (int argc, char **argv) folder[0] = 0; buffy_next (folder, sizeof (folder)); } - else if (flags & M_SELECT) { -#ifdef USE_NNTP - if (flags & M_NEWS) { - set_option (OPTNEWS); - if (!(CurrentNewsSrv = mutt_select_newsserver (NewsServer))) { - mutt_endwin (Errorbuf); - exit (1); - } - } - else -#endif - if (!Incoming.len) { - mutt_endwin _("No incoming mailboxes defined."); - - exit (1); - } - folder[0] = 0; - mutt_select_file (folder, sizeof (folder), M_SEL_FOLDER | M_SEL_BUFFY); - if (!folder[0]) { - mutt_endwin (NULL); - exit (0); - } - } if (!folder[0]) m_strcpy(folder, sizeof(folder), NONULL(Spoolfile)); -#ifdef USE_NNTP - if (option (OPTNEWS)) { - unset_option (OPTNEWS); - nntp_expand_path (folder, sizeof (folder), - &CurrentNewsSrv->conn->account); - } - else -#endif - mutt_expand_path (folder, sizeof (folder)); - + mutt_expand_path (folder, sizeof (folder)); m_strreplace(&CurrentFolder, folder); m_strreplace(&LastFolder, folder); @@ -852,11 +499,11 @@ int main (int argc, char **argv) mutt_folder_hook (folder); - if ((Context = mx_open_mailbox (folder, ((flags & M_RO) - || option (OPTREADONLY)) ? - M_READONLY : 0, NULL)) - || !explicit_folder) { + if ((Context = mx_open_mailbox(folder, (flags & M_RO) ? M_READONLY : 0, + NULL)) || !explicit_folder) + { mutt_index_menu (); + if (option (OPTXTERMSETTITLES)) printf("\033]2;%s\007", NONULL(XtermLeave)); if (Context) @@ -865,5 +512,10 @@ int main (int argc, char **argv) mutt_endwin (Errorbuf); } + pthread_cancel(pt); + pthread_join(pt, NULL); + luaM_shutdown(); + mutt_sasl_shutdown(); + el_shutdown(); exit (0); }