--- mailx-12.4/ChangeLog +++ nail/ChangeLog @@ -1,3 +1,38 @@ +[12.5] as of 7/5/10 +* The undocumented contenttype-cntrl option works again (patch by + Laurent Parenteau). + +[12.5] as of 6/20/10 +* Fixed a message corruption that occurred when the "inc" command was used + with a mbox format mailbox after encrypted messages had been viewed + (reported by Martin Neitzel). +* Fixed a condition that caused mailx to hang when looking at a message, + copying that message, and issuing a "z" command evaluating an uncached + portion of an IMAP folder. +* Make it compile with OpenSSL 1.0.0-beta2 (patch by Bernhard Rosenkränzer). +* When executing an "account" command, ensure that the values of the "hold", + "keepsave", "append", and "emptybox" variables remain those of the previous + account for all outstanding operations on that account (bug reported by + Jeff Woodall). +* Support Gmail IMAP semantics of "delete" turning into "archive". Previously, + when mailx was setting the "\Deleted" flag on a message, it did not set any + other flags. This caused mails that had been read and then deleted to appear + as unread in Gmail's "All Mail". Now, flags besides "\Deleted" are also set, + so that they are kept in the archived copy (reported by Jeremy O'Brien). +* For RFC 2047 MIME "encoded-word" parts in headers, assume that the end of + each word resets the conversion state (Yedidyah Bar-David). +* When the ORGANIZATION variable has an empty value, do not generate an + "Organization:" header field. Previously, this condition resulted in + mailx refusing to send mail (Thomas E. Kammeyer). +* When classifying messages with the junk filter, when selecting the most + representative tokens, prefer non-junk tokens over junk tokens if both + have the same (reversed) probability, in order to avoid false positives. +* When calculating the probabilities of tokens that have occurred only in + good messages or only in junk messages so far, and these tokens occurred + less than ten times, give them slightly less than the minimum/maximum. +* Fixed "unignore" and similar commands; they did not work at all so far + (http://www.freebsd.org/cgi/query-pr.cgi?pr=146280). + [12.4] released 7/29/08 * With the "-E" command line option or if the "skipemptybody" variable is set, outgoing messages that contain no text in their first or only part --- mailx-12.4/cmd2.c +++ nail/cmd2.c @@ -38,7 +38,7 @@ #ifndef lint #ifdef DOSCCS -static char sccsid[] = "@(#)cmd2.c 2.46 (gritter) 3/4/06"; +static char sccsid[] = "@(#)cmd2.c 2.47 (gritter) 5/9/10"; #endif #endif /* not lint */ @@ -803,16 +803,17 @@ int h = hash(name); for (ip = tab->i_head[h]; ip; ip = ip->i_link) { - if (asccasecmp(ip->i_field, name)) { + if (asccasecmp(ip->i_field, name) == 0) { free(ip->i_field); if (iq != NULL) iq->i_link = ip->i_link; else - tab->i_head[h] = NULL; + tab->i_head[h] = ip->i_link; free(ip); tab->i_count--; break; } + iq = ip; } } --- mailx-12.4/cmd3.c +++ nail/cmd3.c @@ -38,7 +38,7 @@ #ifndef lint #ifdef DOSCCS -static char sccsid[] = "@(#)cmd3.c 2.86 (gritter) 10/1/07"; +static char sccsid[] = "@(#)cmd3.c 2.87 (gritter) 10/1/08"; #endif #endif /* not lint */ @@ -1311,7 +1311,7 @@ char **args = (char **)v; struct oldaccount *a; char *cp; - int i, mc; + int i, mc, oqf, nqf; FILE *fp = stdout; if (args[0] == NULL) { @@ -1345,6 +1345,7 @@ return define1(args[0], 1); } strncpy(mboxname, expand("&"), sizeof mboxname)[sizeof mboxname-1]='\0'; + oqf = savequitflags(); if ((a = get_oldaccount(args[0])) == NULL) { if (args[1]) { a = scalloc(1, sizeof *a); @@ -1368,8 +1369,13 @@ unset_allow_undefined = 1; set(a->ac_vars); unset_allow_undefined = 0; - setf: if (!starting) - return file1("%"); + setf: if (!starting) { + nqf = savequitflags(); + restorequitflags(oqf); + i = file1("%"); + restorequitflags(nqf); + return i; + } } return 0; } --- mailx-12.4/extern.h +++ nail/extern.h @@ -35,7 +35,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * Sccsid @(#)extern.h 2.161 (gritter) 10/1/07 + * Sccsid @(#)extern.h 2.162 (gritter) 10/1/08 */ /* aux.c */ @@ -446,6 +446,8 @@ void quit(void); int holdbits(void); enum okay makembox(void); +int savequitflags(void); +void restorequitflags(int); /* send.c */ char *foldergets(char **s, size_t *size, size_t *count, size_t *llen, FILE *stream); @@ -513,12 +515,12 @@ void demail(void); char *username(void); /* vars.c */ -void assign(char *name, char *value); +void assign(const char *name, const char *value); char *vcopy(const char *str); char *value(const char *name); struct grouphead *findgroup(char *name); void printgroup(char *name); int hash(const char *name); -int unset_internal(char *name); +int unset_internal(const char *name); void remove_group(const char *name); /* version.c */ --- mailx-12.4/fio.c +++ nail/fio.c @@ -38,7 +38,7 @@ #ifndef lint #ifdef DOSCCS -static char sccsid[] = "@(#)fio.c 2.73 (gritter) 1/7/08"; +static char sccsid[] = "@(#)fio.c 2.76 (gritter) 9/16/09"; #endif #endif /* not lint */ @@ -108,6 +108,7 @@ memset(&this, 0, sizeof this); this.m_flag = MUSED|MNEW|MNEWEST; filesize = mailsize - offset; + offset = ftell(mb.mb_otf); for (;;) { if (fgetline(&linebuf, &linesize, &filesize, &count, ibuf, 0) == NULL) { @@ -1050,7 +1051,8 @@ NI_NUMERICHOST) != 0) strcpy(hbuf, "unknown host"); fprintf(stderr, catgets(catd, CATSET, 192, - "Connecting to %s . . ."), hbuf); + "Connecting to %s:%s . . ."), + hbuf, portstr); } if ((sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) >= 0) { @@ -1068,26 +1070,25 @@ freeaddrinfo(res0); #else /* !HAVE_IPv6_FUNCS */ if (port == 0) { - if ((ep = getservbyname((char *)portstr, "tcp")) == NULL) { - if (equal(portstr, "smtp")) - port = htons(25); - else if (equal(portstr, "smtps")) - port = htons(465); - else if (equal(portstr, "imap")) - port = htons(143); - else if (equal(portstr, "imaps")) - port = htons(993); - else if (equal(portstr, "pop3")) - port = htons(110); - else if (equal(portstr, "pop3s")) - port = htons(995); - else { - fprintf(stderr, catgets(catd, CATSET, 251, - "Unknown service: %s\n"), portstr); - return STOP; - } - } else + if (equal(portstr, "smtp")) + port = htons(25); + else if (equal(portstr, "smtps")) + port = htons(465); + else if (equal(portstr, "imap")) + port = htons(143); + else if (equal(portstr, "imaps")) + port = htons(993); + else if (equal(portstr, "pop3")) + port = htons(110); + else if (equal(portstr, "pop3s")) + port = htons(995); + else if ((ep = getservbyname((char *)portstr, "tcp")) != NULL) port = ep->s_port; + else { + fprintf(stderr, catgets(catd, CATSET, 251, + "Unknown service: %s\n"), portstr); + return STOP; + } } else port = htons(port); if (verbose) @@ -1109,7 +1110,8 @@ memcpy(&servaddr.sin_addr, *pptr, sizeof(struct in_addr)); if (verbose) fprintf(stderr, catgets(catd, CATSET, 192, - "Connecting to %s . . ."), inet_ntoa(**pptr)); + "Connecting to %s:%d . . ."), + inet_ntoa(**pptr), ntohs(port)); if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof servaddr) != 0) { perror(catgets(catd, CATSET, 254, "could not connect")); --- mailx-12.4/imap.c +++ nail/imap.c @@ -38,7 +38,7 @@ #ifndef lint #ifdef DOSCCS -static char sccsid[] = "@(#)imap.c 1.219 (gritter) 1/6/08"; +static char sccsid[] = "@(#)imap.c 1.222 (gritter) 3/13/09"; #endif #endif /* not lint */ @@ -1821,57 +1821,62 @@ * reading their results. */ needstat = stored > 0 && stored % 800 == 0; + /* + * Even if this message has been deleted, continue + * to set further flags. This is necessary to support + * Gmail semantics, where "delete" actually means + * "archive", and the flags are applied to the copy + * in "All Mail". + */ + if ((m->m_flag&(MREAD|MSTATUS)) == (MREAD|MSTATUS)) { + imap_store(mp, m, m-message+1, + '+', "\\Seen", needstat); + stored++; + } + if (m->m_flag & MFLAG) { + imap_store(mp, m, m-message+1, + '+', "\\Flagged", needstat); + stored++; + } + if (m->m_flag & MUNFLAG) { + imap_store(mp, m, m-message+1, + '-', "\\Flagged", needstat); + stored++; + } + if (m->m_flag & MANSWER) { + imap_store(mp, m, m-message+1, + '+', "\\Answered", needstat); + stored++; + } + if (m->m_flag & MUNANSWER) { + imap_store(mp, m, m-message+1, + '-', "\\Answered", needstat); + stored++; + } + if (m->m_flag & MDRAFT) { + imap_store(mp, m, m-message+1, + '+', "\\Draft", needstat); + stored++; + } + if (m->m_flag & MUNDRAFT) { + imap_store(mp, m, m-message+1, + '-', "\\Draft", needstat); + stored++; + } if (dodel) { imap_delete(mp, m-message+1, m, needstat); stored++; gotcha++; - } else { - if ((m->m_flag&(MREAD|MSTATUS)) == (MREAD|MSTATUS)) { - imap_store(mp, m, m-message+1, - '+', "\\Seen", needstat); - stored++; - } - if (m->m_flag & MFLAG) { - imap_store(mp, m, m-message+1, - '+', "\\Flagged", needstat); - stored++; - } - if (m->m_flag & MUNFLAG) { - imap_store(mp, m, m-message+1, - '-', "\\Flagged", needstat); - stored++; - } - if (m->m_flag & MANSWER) { - imap_store(mp, m, m-message+1, - '+', "\\Answered", needstat); - stored++; - } - if (m->m_flag & MUNANSWER) { - imap_store(mp, m, m-message+1, - '-', "\\Answered", needstat); - stored++; - } - if (m->m_flag & MDRAFT) { - imap_store(mp, m, m-message+1, - '+', "\\Draft", needstat); - stored++; - } - if (m->m_flag & MUNDRAFT) { - imap_store(mp, m, m-message+1, - '-', "\\Draft", needstat); - stored++; - } - if (mp->mb_type != MB_CACHE || - !edit && (!(m->m_flag&(MBOXED|MSAVED|MDELETED)) - || (m->m_flag & - (MBOXED|MPRESERVE|MTOUCH)) == - (MPRESERVE|MTOUCH)) || - edit && !(m->m_flag & MDELETED)) - held++; - if (m->m_flag & MNEW) { - m->m_flag &= ~MNEW; - m->m_flag |= MSTATUS; - } + } else if (mp->mb_type != MB_CACHE || + !edit && (!(m->m_flag&(MBOXED|MSAVED|MDELETED)) + || (m->m_flag & + (MBOXED|MPRESERVE|MTOUCH)) == + (MPRESERVE|MTOUCH)) || + edit && !(m->m_flag & MDELETED)) + held++; + if (m->m_flag & MNEW) { + m->m_flag &= ~MNEW; + m->m_flag |= MSTATUS; } } bypass: if (readstat != NULL) @@ -2571,6 +2576,7 @@ const char *qname; enum okay ok = STOP; int twice = 0; + int stored = 0; FILE *queuefp = NULL; if (mp->mb_type == MB_CACHE) { @@ -2629,20 +2635,38 @@ * ... and reset the flag to its initial value so that * the 'exit' command still leaves the message unread. */ -out: if ((m->m_flag&(MREAD|MSTATUS)) == (MREAD|MSTATUS)) +out: if ((m->m_flag&(MREAD|MSTATUS)) == (MREAD|MSTATUS)) { imap_store(mp, m, n, '-', "\\Seen", 0); - if (m->m_flag&MFLAG) + stored++; + } + if (m->m_flag&MFLAG) { imap_store(mp, m, n, '-', "\\Flagged", 0); - if (m->m_flag&MUNFLAG) + stored++; + } + if (m->m_flag&MUNFLAG) { imap_store(mp, m, n, '+', "\\Flagged", 0); - if (m->m_flag&MANSWER) + stored++; + } + if (m->m_flag&MANSWER) { imap_store(mp, m, n, '-', "\\Answered", 0); - if (m->m_flag&MUNANSWER) + stored++; + } + if (m->m_flag&MUNANSWER) { imap_store(mp, m, n, '+', "\\Answered", 0); - if (m->m_flag&MDRAFT) + stored++; + } + if (m->m_flag&MDRAFT) { imap_store(mp, m, n, '-', "\\Draft", 0); - if (m->m_flag&MUNDRAFT) + stored++; + } + if (m->m_flag&MUNDRAFT) { imap_store(mp, m, n, '+', "\\Draft", 0); + stored++; + } + if (stored) { + mp->mb_active |= MB_COMD; + imap_finish(mp); + } return ok; } --- mailx-12.4/junk.c +++ nail/junk.c @@ -38,7 +38,7 @@ #ifndef lint #ifdef DOSCCS -static char sccsid[] = "@(#)junk.c 1.73 (gritter) 3/4/06"; +static char sccsid[] = "@(#)junk.c 1.75 (gritter) 9/14/08"; #endif #endif /* not lint */ @@ -920,6 +920,10 @@ smin(1.0, nbad ? (float)b/nbad : 0.0)); p = smin(TOP, p); p = smax(BOT, p); + if (p == TOP && b <= 10 && g == 0) + p -= BOT; + else if (p == BOT && g <= 10 && b == 0) + p += BOT; } else if (g == 0 && b == 0) p = DFL; else @@ -1095,13 +1099,20 @@ if (h1 == best[i].hash1 && h2 == best[i].hash2) break; /* - * This selection prefers words from the end of the - * header and from the start of the body. It does - * probably not matter much at all, but gives at - * least the most interesting verbose output. + * For equal distance, this selection prefers + * words with a low probability, since a false + * negative is better than a false positive, + * and since experience has shown that false + * positives are more likely otherwise. Then, + * words from the end of the header and from + * the start of the body are preferred. This + * gives the most interesting verbose output. */ - if (d > best[i].dist || best[i].loc == HEADER && - d >= best[i].dist) { + if (d > best[i].dist || + d == best[i].dist && + p < best[i].prob || + best[i].loc == HEADER && + d == best[i].dist) { for (j = BEST-2; j >= i; j--) best[j+1] = best[j]; best[i].dist = d; --- mailx-12.4/list.c +++ nail/list.c @@ -38,7 +38,7 @@ #ifndef lint #ifdef DOSCCS -static char sccsid[] = "@(#)list.c 2.61 (gritter) 01/07/07"; +static char sccsid[] = "@(#)list.c 2.62 (gritter) 12/11/08"; #endif #endif /* not lint */ @@ -438,7 +438,7 @@ if (!inhook) printf(tback ? "No previously marked messages.\n" : - "No messages satify (criteria).\n"); + "No messages satisfy (criteria).\n"); markall_ret(-1) } } --- mailx-12.4/mailx.1 +++ nail/mailx.1 @@ -34,9 +34,9 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" Sccsid: @(#)mailx.1 2.326 (gritter) 10/1/07 +.\" Sccsid: @(#)mailx.1 2.329 (gritter) 10/9/10 .\" -.TH MAILX 1 "10/1/07" "Heirloom mailx 12.4" "User Commands" +.TH MAILX 1 "10/9/10" "Heirloom mailx 12.5" "User Commands" .SH NAME mailx \- send and receive Internet mail .SH SYNOPSIS @@ -418,6 +418,21 @@ .I address All messages from .IR address . +By default, this is a case-sensitive search +for the complete email address. +If the +.I allnet +variable is set, +only the local part of the addresses is evaluated for the comparison. +Otherwise if the +.I showname +variable is set, +a case-sensitive search for the complete real name +of a sender is performed. +The IMAP-style +.BI (from\ address) +expression can be used instead +if substring matches are desired. .TP .BI ( criterion ) All messages that satisfy the given IMAP-style SEARCH @@ -3766,7 +3781,7 @@ .sp .fi which might cause -.N mailx +.B mailx to respond with, for example: .nf .sp --- mailx-12.4/makeconfig +++ nail/makeconfig @@ -1,7 +1,7 @@ #!/bin/sh # -# Sccsid @(#)makeconfig 1.43 (gritter) 4/14/07 +# Sccsid @(#)makeconfig 1.44 (gritter) 5/26/09 # tmp=___build$$ @@ -393,6 +393,25 @@ ! fi +if test x$have_openssl = xyes +then + compile_check stack_of 'for STACK_OF()' '#define HAVE_STACK_OF' <<\! +#include +#include +#include +#include +#include + +int main(void) +{ + STACK_OF(GENERAL_NAME) *gens = NULL; + printf("%p", gens); /* to make it used */ + SSLv23_client_method(); + PEM_read_PrivateKey(0, 0, 0, 0); + return 0; +} +! +fi cat >$tmp2.c <<\! #include --- mailx-12.4/mime.c +++ nail/mime.c @@ -40,7 +40,7 @@ #ifdef DOSCCS static char copyright[] = "@(#) Copyright (c) 2000, 2002 Gunnar Ritter. All rights reserved.\n"; -static char sccsid[] = "@(#)mime.c 2.69 (gritter) 6/29/08"; +static char sccsid[] = "@(#)mime.c 2.71 (gritter) 7/5/10"; #endif /* DOSCCS */ #endif /* not lint */ @@ -788,8 +788,7 @@ *isclean = mime_isclean(fp); if (*isclean & MIME_HASNUL || - *contenttype && ascncasecmp(*contenttype, "text/", 5) || - *contenttype == NULL && *isclean & MIME_CTRLCHAR) { + *contenttype && ascncasecmp(*contenttype, "text/", 5)) { convert = CONV_TOB64; if (*contenttype == NULL || ascncasecmp(*contenttype, "text/", 5) == 0) @@ -809,6 +808,7 @@ *contenttype = "application/octet-stream"; *charset = NULL; } if (*isclean & MIME_CTRLCHAR) { + convert = CONV_TOB64; /* * RFC 2046 forbids control characters other than * ^I or ^L in text/plain bodies. However, some @@ -1048,12 +1048,22 @@ uptr = nptr + outleft; iptr = cout.s; if (iconv_ft(fhicd, &iptr, &inleft, - &nptr, &outleft) != 0 && + &nptr, &outleft) == (size_t)-1 && errno == E2BIG) { iconv(fhicd, NULL, NULL, NULL, NULL); mime_fromhdr_inc(inleft); goto again; } + /* + * For state-dependent encodings, + * reset the state here, assuming + * that states are restricted to + * single encoded-word parts. + */ + while (iconv(fhicd, NULL, NULL, + &nptr, &outleft) == (size_t)-1 && + errno == E2BIG) + mime_fromhdr_inc(16); out->l += uptr - mptr - outleft; q += uptr - mptr - outleft; } else { @@ -1295,7 +1305,7 @@ isz = len; op = cbuf; osz = cbufsz; - if (iconv(iconvd, &ip, &isz, &op, &osz) != 0) { + if (iconv(iconvd, &ip, &isz, &op, &osz) == (size_t)-1) { if (errno != E2BIG) { ac_free(cbuf); return 0; @@ -1489,7 +1499,8 @@ outleft = mptrsz; nptr = mptr; iptr = ptr; - if (iconv_ft(iconvd, &iptr, &inleft, &nptr, &outleft) != 0 && + if (iconv_ft(iconvd, &iptr, &inleft, &nptr, &outleft) == + (size_t)-1 && errno == E2BIG) { iconv(iconvd, NULL, NULL, NULL, NULL); ac_free(mptr); --- mailx-12.4/nail.rc +++ nail/nail.rc @@ -4,7 +4,7 @@ # This file is not overwritten when 'make install' is run in # the mailx build process again. -# Sccsid @(#)nail.rc 2.10 (gritter) 3/4/06 +# Sccsid @(#)nail.rc 2.11 (gritter) 8/2/08 # Do not forward to mbox by default since this is likely to be # irritating for most users today. @@ -54,6 +54,9 @@ # If threaded mode is activated, automatically collapse thread. set autocollapse + +# Mark messages that have been answered. +set markanswered # Hide some header fields which are uninteresting for most human readers. ignore received in-reply-to message-id references --- mailx-12.4/openssl.c +++ nail/openssl.c @@ -38,7 +38,7 @@ #ifndef lint #ifdef DOSCCS -static char sccsid[] = "@(#)openssl.c 1.25 (gritter) 8/4/07"; +static char sccsid[] = "@(#)openssl.c 1.26 (gritter) 5/26/09"; #endif #endif /* not lint */ @@ -101,12 +101,17 @@ static int ssl_rand_init(void); static void ssl_init(void); static int ssl_verify_cb(int success, X509_STORE_CTX *store); -static SSL_METHOD *ssl_select_method(const char *uhp); +static const SSL_METHOD *ssl_select_method(const char *uhp); static void ssl_load_verifications(struct sock *sp); static void ssl_certificate(struct sock *sp, const char *uhp); static enum okay ssl_check_host(const char *server, struct sock *sp); +#ifdef HAVE_STACK_OF +static int smime_verify(struct message *m, int n, STACK_OF(X509) *chain, + X509_STORE *store); +#else static int smime_verify(struct message *m, int n, STACK *chain, X509_STORE *store); +#endif static EVP_CIPHER *smime_cipher(const char *name); static int ssl_password_cb(char *buf, int size, int rwflag, void *userdata); static FILE *smime_sign_cert(const char *xname, const char *xname2, int warn); @@ -203,10 +208,10 @@ return 1; } -static SSL_METHOD * +static const SSL_METHOD * ssl_select_method(const char *uhp) { - SSL_METHOD *method; + const SSL_METHOD *method; char *cp; cp = ssl_method_string(uhp); @@ -308,7 +313,11 @@ X509 *cert; X509_NAME *subj; char data[256]; +#ifdef HAVE_STACK_OF + STACK_OF(GENERAL_NAME) *gens; +#else /*GENERAL_NAMES*/STACK *gens; +#endif GENERAL_NAME *gen; int i; @@ -357,7 +366,8 @@ ssl_init(); ssl_set_vrfy_level(uhp); - if ((sp->s_ctx = SSL_CTX_new(ssl_select_method(uhp))) == NULL) { + if ((sp->s_ctx = + SSL_CTX_new((SSL_METHOD *)ssl_select_method(uhp))) == NULL) { ssl_gen_err(catgets(catd, CATSET, 261, "SSL_CTX_new() failed")); return STOP; } @@ -496,7 +506,11 @@ } static int +#ifdef HAVE_STACK_OF +smime_verify(struct message *m, int n, STACK_OF(X509) *chain, X509_STORE *store) +#else smime_verify(struct message *m, int n, STACK *chain, X509_STORE *store) +#endif { struct message *x; char *cp, *sender, *to, *cc, *cnttype; @@ -505,7 +519,12 @@ off_t size; BIO *fb, *pb; PKCS7 *pkcs7; +#ifdef HAVE_STACK_OF + STACK_OF(X509) *certs; + STACK_OF(GENERAL_NAME) *gens; +#else STACK *certs, *gens; +#endif X509 *cert; X509_NAME *subj; char data[LINESIZE]; @@ -614,7 +633,11 @@ { int *msgvec = vp, *ip; int ec = 0; +#ifdef HAVE_STACK_OF + STACK_OF(X509) *chain = NULL; +#else STACK *chain = NULL; +#endif X509_STORE *store; char *ca_dir, *ca_file; @@ -687,7 +710,11 @@ X509 *cert; PKCS7 *pkcs7; BIO *bb, *yb; +#ifdef HAVE_STACK_OF + STACK_OF(X509) *certs; +#else STACK *certs; +#endif EVP_CIPHER *cipher; certfile = expand((char *)certfile); @@ -950,9 +977,14 @@ off_t size; BIO *fb, *pb; PKCS7 *pkcs7; +#ifdef HAVE_STACK_OF + STACK_OF(X509) *certs; + STACK_OF(X509) *chain = NULL; +#else STACK *certs; - X509 *cert; STACK *chain = NULL; +#endif + X509 *cert; enum okay ok = OKAY; message_number = n; --- mailx-12.4/quit.c +++ nail/quit.c @@ -38,7 +38,7 @@ #ifndef lint #ifdef DOSCCS -static char sccsid[] = "@(#)quit.c 2.28 (gritter) 3/4/06"; +static char sccsid[] = "@(#)quit.c 2.30 (gritter) 11/11/08"; #endif #endif /* not lint */ @@ -584,4 +584,47 @@ done: relsesigs(); +} + +enum quitflags { + QUITFLAG_HOLD = 001, + QUITFLAG_KEEPSAVE = 002, + QUITFLAG_APPEND = 004, + QUITFLAG_EMPTYBOX = 010 +}; + +static const struct quitnames { + enum quitflags flag; + const char *name; +} quitnames[] = { + { QUITFLAG_HOLD, "hold" }, + { QUITFLAG_KEEPSAVE, "keepsave" }, + { QUITFLAG_APPEND, "append" }, + { QUITFLAG_EMPTYBOX, "emptybox" }, + { 0, NULL } +}; + +int +savequitflags(void) +{ + enum quitflags qf = 0; + int i; + + for (i = 0; quitnames[i].name; i++) + if (value(quitnames[i].name)) + qf |= quitnames[i].flag; + return qf; +} + +void +restorequitflags(int qf) +{ + int i; + + for (i = 0; quitnames[i].name; i++) + if (qf & quitnames[i].flag) { + if (value(quitnames[i].name) == NULL) + assign(quitnames[i].name, ""); + } else if (value(quitnames[i].name)) + unset_internal(quitnames[i].name); } --- mailx-12.4/sendout.c +++ nail/sendout.c @@ -38,7 +38,7 @@ #ifndef lint #ifdef DOSCCS -static char sccsid[] = "@(#)sendout.c 2.99 (gritter) 7/4/08"; +static char sccsid[] = "@(#)sendout.c 2.100 (gritter) 3/1/09"; #endif #endif /* not lint */ @@ -1219,8 +1219,9 @@ if (putname(addr, w, action, &gotcha, "From:", fo, &fromfield)) return 1; - if ((addr = hp->h_organization) != NULL || - (addr = value("ORGANIZATION")) != NULL) { + if (((addr = hp->h_organization) != NULL || + (addr = value("ORGANIZATION")) != NULL) + && strlen(addr) > 0) { fwrite("Organization: ", sizeof (char), 14, fo); if (mime_write(addr, strlen(addr), fo, action == SEND_TODISP ? @@ -1269,7 +1270,8 @@ fwrite("Subject: ", sizeof (char), 9, fo); if (ascncasecmp(hp->h_subject, "re: ", 4) == 0) { fwrite("Re: ", sizeof (char), 4, fo); - if (mime_write(hp->h_subject + 4, + if (strlen(hp->h_subject + 4) > 0 && + mime_write(hp->h_subject + 4, strlen(hp->h_subject + 4), fo, action == SEND_TODISP ? CONV_NONE:CONV_TOHDR, --- mailx-12.4/vars.c +++ nail/vars.c @@ -38,7 +38,7 @@ #ifndef lint #ifdef DOSCCS -static char sccsid[] = "@(#)vars.c 2.11 (gritter) 3/4/06"; +static char sccsid[] = "@(#)vars.c 2.12 (gritter) 10/1/08"; #endif #endif /* not lint */ @@ -81,7 +81,7 @@ * Assign a value to a variable. */ void -assign(char *name, char *value) +assign(const char *name, const char *value) { struct var *vp; int h; @@ -221,7 +221,7 @@ } int -unset_internal(char *name) +unset_internal(const char *name) { struct var *vp, *vp2; int h; --- mailx-12.4/version.c +++ nail/version.c @@ -1,4 +1,4 @@ -#define V "12.4" +#define V "12.5" /* * Heirloom mailx - a mail user agent derived from Berkeley Mail. * @@ -39,7 +39,7 @@ #ifndef lint #ifdef DOSCCS -static char sccsid[] = "@(#)version.c 2.386 (gritter) 7/29/08"; +static char sccsid[] = "@(#)version.c 2.404 (gritter) 7/5/10"; #endif #endif /* not lint */ @@ -48,7 +48,7 @@ * Load this file first to get a "total" Mail version. */ /*char *version = "8.1 6/6/93";*/ -const char *version = V " 7/29/08"; +const char *version = V " 7/5/10"; #ifndef lint #if __GNUC__ >= 3 && __GNUC_MINOR__ >= 4 || __GNUC__ >= 4 #define USED __attribute__ ((used)) @@ -57,7 +57,7 @@ #else #define USED #endif -static const char *versionid USED = "@(#)mailx " V " (gritter) 7/29/08"; +static const char *versionid USED = "@(#)mailx " V " (gritter) 7/5/10"; #endif /* !lint */ /* SLIST */ /* @@ -65,42 +65,42 @@ base64.c:static char sccsid[] = "@(#)base64.c 2.14 (gritter) 4/21/06"; cache.c:static char sccsid[] = "@(#)cache.c 1.61 (gritter) 3/4/06"; cmd1.c:static char sccsid[] = "@(#)cmd1.c 2.97 (gritter) 6/16/07"; -cmd2.c:static char sccsid[] = "@(#)cmd2.c 2.46 (gritter) 3/4/06"; -cmd3.c:static char sccsid[] = "@(#)cmd3.c 2.86 (gritter) 10/1/07"; +cmd2.c:static char sccsid[] = "@(#)cmd2.c 2.47 (gritter) 5/9/10"; +cmd3.c:static char sccsid[] = "@(#)cmd3.c 2.87 (gritter) 10/1/08"; cmdtab.c:static char sccsid[] = "@(#)cmdtab.c 2.51 (gritter) 3/4/06"; collect.c:static char sccsid[] = "@(#)collect.c 2.54 (gritter) 6/16/07"; def.h: * Sccsid @(#)def.h 2.104 (gritter) 3/4/06 dotlock.c:static char sccsid[] = "@(#)dotlock.c 2.9 (gritter) 3/20/06"; edit.c:static char sccsid[] = "@(#)edit.c 2.24 (gritter) 3/4/06"; -extern.h: * Sccsid @(#)extern.h 2.161 (gritter) 10/1/07 -fio.c:static char sccsid[] = "@(#)fio.c 2.73 (gritter) 1/7/08"; +extern.h: * Sccsid @(#)extern.h 2.162 (gritter) 10/1/08 +fio.c:static char sccsid[] = "@(#)fio.c 2.76 (gritter) 9/16/09"; getname.c:static char sccsid[] = "@(#)getname.c 2.5 (gritter) 3/4/06"; getopt.c: Sccsid @(#)getopt.c 1.7 (gritter) 12/16/07 glob.h: * Sccsid @(#)glob.h 2.27 (gritter) 6/16/07 head.c:static char sccsid[] = "@(#)head.c 2.17 (gritter) 3/4/06"; hmac.c: Sccsid @(#)hmac.c 1.8 (gritter) 3/4/06 -imap.c:static char sccsid[] = "@(#)imap.c 1.219 (gritter) 1/6/08"; +imap.c:static char sccsid[] = "@(#)imap.c 1.222 (gritter) 3/13/09"; imap_gssapi.c:static char sccsid[] = "@(#)imap_gssapi.c 1.10 (gritter) 3/4/06"; imap_search.c:static char sccsid[] = "@(#)imap_search.c 1.29 (gritter) 3/4/06"; -junk.c:static char sccsid[] = "@(#)junk.c 1.73 (gritter) 3/4/06"; +junk.c:static char sccsid[] = "@(#)junk.c 1.75 (gritter) 9/14/08"; lex.c:static char sccsid[] = "@(#)lex.c 2.86 (gritter) 12/25/06"; -list.c:static char sccsid[] = "@(#)list.c 2.61 (gritter) 01/07/07"; +list.c:static char sccsid[] = "@(#)list.c 2.62 (gritter) 12/11/08"; lzw.c: * Sccsid @(#)lzw.c 1.11 (gritter) 3/4/06 macro.c:static char sccsid[] = "@(#)macro.c 1.13 (gritter) 3/4/06"; maildir.c:static char sccsid[] = "@(#)maildir.c 1.20 (gritter) 12/28/06"; main.c:static char sccsid[] = "@(#)main.c 2.51 (gritter) 10/1/07"; md5.c: Sccsid @(#)md5.c 1.8 (gritter) 3/4/06 md5.h: Sccsid @(#)md5.h 1.8 (gritter) 3/4/06 -mime.c:static char sccsid[] = "@(#)mime.c 2.69 (gritter) 6/29/08"; +mime.c:static char sccsid[] = "@(#)mime.c 2.71 (gritter) 7/5/10"; names.c:static char sccsid[] = "@(#)names.c 2.22 (gritter) 3/4/06"; nss.c:static char sccsid[] = "@(#)nss.c 1.48 (gritter) 8/4/07"; -openssl.c:static char sccsid[] = "@(#)openssl.c 1.25 (gritter) 8/4/07"; +openssl.c:static char sccsid[] = "@(#)openssl.c 1.26 (gritter) 5/26/09"; pop3.c:static char sccsid[] = "@(#)pop3.c 2.43 (gritter) 3/4/06"; popen.c:static char sccsid[] = "@(#)popen.c 2.20 (gritter) 3/4/06"; -quit.c:static char sccsid[] = "@(#)quit.c 2.28 (gritter) 3/4/06"; +quit.c:static char sccsid[] = "@(#)quit.c 2.30 (gritter) 11/11/08"; rcv.h: * Sccsid @(#)rcv.h 2.7 (gritter) 3/4/06 send.c:static char sccsid[] = "@(#)send.c 2.86 (gritter) 2/4/08"; -sendout.c:static char sccsid[] = "@(#)sendout.c 2.99 (gritter) 7/4/08"; +sendout.c:static char sccsid[] = "@(#)sendout.c 2.100 (gritter) 3/1/09"; smtp.c:static char sccsid[] = "@(#)smtp.c 2.43 (gritter) 8/4/07"; ssl.c:static char sccsid[] = "@(#)ssl.c 1.39 (gritter) 6/12/06"; strings.c:static char sccsid[] = "@(#)strings.c 2.6 (gritter) 3/4/06"; @@ -108,5 +108,5 @@ thread.c:static char sccsid[] = "@(#)thread.c 1.57 (gritter) 3/4/06"; tty.c:static char sccsid[] = "@(#)tty.c 2.29 (gritter) 3/9/07"; v7.local.c:static char sccsid[] = "@(#)v7.local.c 2.10 (gritter) 3/4/06"; -vars.c:static char sccsid[] = "@(#)vars.c 2.11 (gritter) 3/4/06"; +vars.c:static char sccsid[] = "@(#)vars.c 2.12 (gritter) 10/1/08"; */