summaryrefslogtreecommitdiff
path: root/core/s-nail
diff options
context:
space:
mode:
authorNicolás Reynolds <fauno@endefensadelsl.org>2014-02-25 03:21:56 +0000
committerNicolás Reynolds <fauno@endefensadelsl.org>2014-02-25 03:21:56 +0000
commit58e4d57ed9a8604dff646ccdfee54f9019ca5d13 (patch)
tree4e9698b9216274fafac9483056a01a552e8e617b /core/s-nail
parent15cd70d8180c2a45287e4bd8ce01a2a9248e8d62 (diff)
Tue Feb 25 03:19:16 UTC 2014
Diffstat (limited to 'core/s-nail')
-rw-r--r--core/s-nail/PKGBUILD23
-rw-r--r--core/s-nail/maildir.patch253
-rw-r--r--core/s-nail/mimeheader.patch147
-rw-r--r--core/s-nail/sort.patch75
4 files changed, 5 insertions, 493 deletions
diff --git a/core/s-nail/PKGBUILD b/core/s-nail/PKGBUILD
index 2e8e82cca..9ebf3b848 100644
--- a/core/s-nail/PKGBUILD
+++ b/core/s-nail/PKGBUILD
@@ -1,26 +1,20 @@
-# $Id: PKGBUILD 205863 2014-02-12 06:21:09Z bisson $
+# $Id: PKGBUILD 206340 2014-02-24 06:14:05Z bisson $
# Maintainer: Gaetan Bisson <bisson@archlinux.org>
# Contributor: Stéphane Gaudreault <stephane@archlinux.org>
# Contributor: Sergej Pupykin <pupykin.s@arch@gmail.com>
# Contributor: Andreas Wagner <Andreas.Wagner@em.uni-frankfurt.de>
pkgname=s-nail
-pkgver=14.5.2
-pkgrel=4
+pkgver=14.6
+pkgrel=1
pkgdesc='Mail processing system with a command syntax reminiscent of ed'
url='http://sdaoden.users.sourceforge.net/code.html#s-nail'
license=('custom:BSD')
arch=('i686' 'x86_64')
depends=('openssl')
optdepends=('smtp-forwarder: for sending mail')
-source=("http://downloads.sourceforge.net/project/${pkgname}/${pkgname}-${pkgver//./_}.tar.xz"
- 'mimeheader.patch'
- 'maildir.patch'
- 'sort.patch')
-sha1sums=('26ad43f5f41b429d5f13a3ce73a3dff75325950c'
- 'e72ed84f584ebc50eb9d04779b8b754afa446bf4'
- '9ba91a0c697c121d9de4ff67766ec90f4ee354b5'
- '909da731e590d1d2877ed38bed667440a02d1259')
+source=("http://downloads.sourceforge.net/project/${pkgname}/${pkgname}-${pkgver//./_}.tar.xz")
+sha1sums=('57603cdc3dea79fda699cc172c33ccae75b1d794')
groups=('base')
backup=('etc/mail.rc')
@@ -28,13 +22,6 @@ replaces=('mailx' 'mailx-heirloom' 'heirloom-mailx')
provides=('mailx' 'mailx-heirloom' 'heirloom-mailx')
conflicts=('mailx' 'mailx-heirloom' 'heirloom-mailx')
-prepare() {
- cd "${srcdir}/${pkgname}-${pkgver}"
- patch -p1 -i ../mimeheader.patch
- patch -p1 -i ../maildir.patch
- patch -p1 -i ../sort.patch
-}
-
build() {
cd "${srcdir}/${pkgname}-${pkgver}"
make \
diff --git a/core/s-nail/maildir.patch b/core/s-nail/maildir.patch
deleted file mode 100644
index d9b16c348..000000000
--- a/core/s-nail/maildir.patch
+++ /dev/null
@@ -1,253 +0,0 @@
-s-nail-14_5_2-maildir.patch, 2014-02-10:
-
-Apply:
- $ cd s-nail-14.5.2
- $ patch -bu < s-nail-14_5_2-maildir.patch
-
-Description:
- To overcome a general design problem of the Berkeley Mail codebase
- i once added realpath(3) calls to be able to resolve the path of
- a mailbox file: like that changing a directory wouldn't cause the
- program to "hang" because the (relatively) opened mailbox became
- inaccessible. (Again: the real solution will take many years.)
-
- My first KISS solution to one aspect of the general problem was
- [3adf33ee] (schdir(): realpath() local files before leaving CWD..,
- 2013-01-08), and it should possibly have worked with maildir boxes,
- because we'd only did anything once the user actively used the `chdir'
- command (and who does), but Christos Zoulas from NetBSD actually forced
- me to do more (after i've reported the general Berkeley bug), and that
- led to the current code, which always calls realpath(3).
- Anyway, i wasn't in the position to reflect the impact of doing so at
- that time. And the entire codebase needs to be reworked anyway. (:(
-
- Anyway -- this patch is an adjusted combination of the [1c2563b]
- (lex.c:_update_mailname(): continue if realname() fails.., 2014-02-10)
- and [13f325f] (Avoid "cannot canonicalize" maildir warning.., 2014-02-10)
- changesets that have been pushed to [master], and make maildir mailboxes
- usable again.
-
-Notes:
- The patch is so large because it was cherry-picked from [crawl] onto
- [master] and (thus) includes the very large [nyd] topic branch style-and-
- much-more changes. Sorry for that.
-
- lex.c | 11 +++--
- maildir.c | 152 +++++++++++++++++++++++++++++++++-----------------------------
- 2 files changed, 87 insertions(+), 76 deletions(-)
-
-diff --git a/lex.c b/lex.c
-index 922faf8..3b3b3cc 100644
---- a/lex.c
-+++ b/lex.c
-@@ -164,7 +164,7 @@ _update_mailname(char const *name)
- {
- char tbuf[MAXPATHLEN], *mailp, *dispp;
- size_t i, j;
-- bool_t rv;
-+ bool_t rv = TRU1;
-
- /* Don't realpath(3) if it's only an update request */
- if (name != NULL) {
-@@ -174,9 +174,10 @@ _update_mailname(char const *name)
- if (realpath(name, mailname) == NULL) {
- fprintf(stderr, tr(151, "Can't canonicalize `%s'\n"), name);
- rv = FAL0;
-- goto jleave;
-+ goto jdocopy;
- }
- } else
-+jdocopy:
- #endif
- n_strlcpy(mailname, name, sizeof(mailname));
- }
-@@ -197,9 +198,10 @@ _update_mailname(char const *name)
-
- /* We want to see the name of the folder .. on the screen */
- i = strlen(mailp);
-- if ((rv = (i < sizeof(displayname) - 1)))
-+ if (i < sizeof(displayname) - 1)
- memcpy(dispp, mailp, i + 1);
- else {
-+ rv = FAL0;
- /* Avoid disrupting multibyte sequences (if possible) */
- #ifndef HAVE_C90AMEND1
- j = sizeof(displayname) / 3 - 1;
-@@ -212,9 +214,6 @@ _update_mailname(char const *name)
- snprintf(dispp, sizeof(displayname), "%.*s...%s",
- (int)j, mailp, mailp + i);
- }
--#ifdef HAVE_REALPATH
--jleave:
--#endif
- return rv;
- }
-
-diff --git a/maildir.c b/maildir.c
-index 32180bd..3d45f77 100644
---- a/maildir.c
-+++ b/maildir.c
-@@ -1,5 +1,5 @@
- /*@ S-nail - a mail user agent derived from Berkeley Mail.
-- *@ Maildir folder support.
-+ *@ Maildir folder support. FIXME rewrite - why do we chdir(2)??
- *
- * Copyright (c) 2000-2004 Gunnar Ritter, Freiburg i. Br., Germany.
- * Copyright (c) 2012 - 2014 Steffen "Daode" Nurpmeso <sdaoden@users.sf.net>.
-@@ -101,75 +101,87 @@ jleave: ;
- FL int
- maildir_setfile(char const * volatile name, int nmail, int isedit)
- {
-- sighandler_type volatile saveint;
-- struct cw cw;
-- int i = -1, omsgCount;
--
-- (void)&saveint;
-- (void)&i;
-- omsgCount = msgCount;
-- if (cwget(&cw) == STOP) {
-- fprintf(stderr, "Fatal: Cannot open current directory\n");
-- return -1;
-- }
-- if (!nmail)
-- quit();
-- saveint = safe_signal(SIGINT, SIG_IGN);
-- if (chdir(name) < 0) {
-- fprintf(stderr, "Cannot change directory to \"%s\".\n", name);
-- cwrelse(&cw);
-- return -1;
-- }
-- if (!nmail) {
-- edit = (isedit != 0);
-- if (mb.mb_itf) {
-- fclose(mb.mb_itf);
-- mb.mb_itf = NULL;
-- }
-- if (mb.mb_otf) {
-- fclose(mb.mb_otf);
-- mb.mb_otf = NULL;
-- }
-- initbox(name);
-- mb.mb_type = MB_MAILDIR;
-- }
-- _maildir_table = NULL;
-- if (sigsetjmp(_maildir_jmp, 1) == 0) {
-- if (nmail)
-- mktable();
-- if (saveint != SIG_IGN)
-- safe_signal(SIGINT, maildircatch);
-- i = maildir_setfile1(name, nmail, omsgCount);
-- }
-- if (nmail && _maildir_table != NULL)
-- free(_maildir_table);
-- safe_signal(SIGINT, saveint);
-- if (i < 0) {
-- mb.mb_type = MB_VOID;
-- *mailname = '\0';
-- msgCount = 0;
-- }
-- if (cwret(&cw) == STOP) {
-- fputs("Fatal: Cannot change back to current directory.\n",
-- stderr);
-- abort();
-- }
-- cwrelse(&cw);
-- setmsize(msgCount);
-- if (nmail && mb.mb_sorted && msgCount > omsgCount) {
-- mb.mb_threaded = 0;
-- sort((void *)-1);
-- }
-- if (!nmail)
-- sawcom = FAL0;
-- if (!nmail && !edit && msgCount == 0) {
-- if (mb.mb_type == MB_MAILDIR && !ok_blook(emptystart))
-- fprintf(stderr, "No mail at %s\n", name);
-- return 1;
-- }
-- if (nmail && msgCount > omsgCount)
-- newmailinfo(omsgCount);
-- return 0;
-+ sighandler_type volatile saveint;
-+ struct cw cw;
-+ int i = -1, omsgCount;
-+
-+ /* TODO ince we have a VOID box... */
-+ omsgCount = msgCount;
-+ if (cwget(&cw) == STOP) {
-+ fprintf(stderr, "Cannot open current directory");
-+ goto jleave;
-+ }
-+
-+ if (!nmail)
-+ quit();
-+
-+ saveint = safe_signal(SIGINT, SIG_IGN);
-+
-+ if (!nmail) {
-+ edit = (isedit != 0);
-+ if (mb.mb_itf) {
-+ fclose(mb.mb_itf);
-+ mb.mb_itf = NULL;
-+ }
-+ if (mb.mb_otf) {
-+ fclose(mb.mb_otf);
-+ mb.mb_otf = NULL;
-+ }
-+ initbox(name);
-+ mb.mb_type = MB_MAILDIR;
-+ }
-+
-+ if (chdir(name) < 0) {
-+ fprintf(stderr, "Cannot change directory to \"%s\".\n", name);/*TODO tr*/
-+ mb.mb_type = MB_VOID;
-+ *mailname = '\0';
-+ msgCount = 0;
-+ cwrelse(&cw);
-+ safe_signal(SIGINT, saveint);
-+ goto jleave;
-+ }
-+
-+ _maildir_table = NULL;
-+ if (sigsetjmp(_maildir_jmp, 1) == 0) {
-+ if (nmail)
-+ mktable();
-+ if (saveint != SIG_IGN)
-+ safe_signal(SIGINT, &maildircatch);
-+ i = maildir_setfile1(name, nmail, omsgCount);
-+ }
-+ if (nmail && _maildir_table != NULL)
-+ free(_maildir_table);
-+
-+ safe_signal(SIGINT, saveint);
-+
-+ if (i < 0) {
-+ mb.mb_type = MB_VOID;
-+ *mailname = '\0';
-+ msgCount = 0;
-+ }
-+
-+ if (cwret(&cw) == STOP)
-+ panic("Cannot change back to current directory.");/* TODO tr */
-+ cwrelse(&cw);
-+
-+ setmsize(msgCount);
-+ if (nmail && mb.mb_sorted && msgCount > omsgCount) {
-+ mb.mb_threaded = 0;
-+ sort((void*)-1);
-+ }
-+ if (!nmail)
-+ sawcom = FAL0;
-+ if (!nmail && !edit && msgCount == 0) {
-+ if (mb.mb_type == MB_MAILDIR /* XXX ?? */ && !ok_blook(emptystart))
-+ fprintf(stderr, tr(258, "No mail at %s\n"), name);
-+ i = 1;
-+ goto jleave;
-+ }
-+ if (nmail && msgCount > omsgCount)
-+ newmailinfo(omsgCount);
-+ i = 0;
-+jleave:
-+ return i;
- }
-
- static int
diff --git a/core/s-nail/mimeheader.patch b/core/s-nail/mimeheader.patch
deleted file mode 100644
index 2f7163b36..000000000
--- a/core/s-nail/mimeheader.patch
+++ /dev/null
@@ -1,147 +0,0 @@
-s-nail-14_5_2-mimeheader.patch, 2014-02-05:
-
-Apply:
- $ cd s-nail-14.5.2
- $ patch -bu < s-nail-14_5_2-mimeheader.patch
-
-Description:
- mime_fromhdr(): fix my rewrite again..
-
- My hasty rewrite [0f9ad93] (mime_fromhdr(): partial rewrite using
- n_iconv_str(), 2013-03-12), just about ninety (90) minutes before
- the release of S-nail v14.1 already caused the bugfix [b608c6b]
- (mime_fromhdr(): never return NULL output.., 2013-03-14), which
- was the sole reason for the release of S-nail v14.2.
-
- Well, about a year later, after tens of thousands of mails,
- including multibyte ones, i wrote myself a message that has shown
- that the rewrite was still buggy -- the header
-
- Subject: ehm, .getElementById("blink") needs <span
- =?US-ASCII?Q?id=3D"blink">,?= not =?US-ASCII?Q?class=3D"id"?=
-
- cannot be viewed correctly, the ", not" will be lost.
- The reason is now understood and this changeset should fix
- mime_fromhdr() so that it'll do what it is assumed to do in the
- current codebase, unless i'm terribly mistaken.
-
- Because i bickered some time in private, i WANT to add that the
- real problem is that the codebase is weird INSOFAR as that i still
- don't really understand the WAY it works, because THAT IS SICK.
- I.e., in my brain i assume this function effectively is
- rfc_2047_decode(), meant to decode encoded words as specified in
- RFC 2047, but that's simply not true, and FOR QUITE SOME TIME,
- because of the embedded newlines that may be in the data and need
- to passed through for at least the case that we send data to the
- display. I slowly get around that schizophrenic codebase while
- also converting it to a straight one, but that will take years.
- Until then we need to strip whitespace in between multiple
- adjacent encoded words, while passing through newlines and
- whitespace that follows newlines, regardless of whatever.
- I hope this will do it until we are sane.
----
- mime.c | 63 +++++++++++++++++++++++++++++++++++++++------------------------
- 1 file changed, 39 insertions(+), 24 deletions(-)
-
-diff --git a/mime.c b/mime.c
-index ccb0061..6ee55cc 100644
---- a/mime.c
-+++ b/mime.c
-@@ -863,20 +863,26 @@ jclear:
- goto jleave;
- }
-
--/*
-- * Convert header fields from RFC 1522 format
-- * TODO mime_fromhdr(): NO error handling, fat; REWRITE **ASAP**
-- */
- FL void
- mime_fromhdr(struct str const *in, struct str *out, enum tdflags flags)
- {
-- /* TODO mime_fromhdr(): is called with strings that contain newlines;
-- * TODO this is the usual newline problem all around the codebase;
-- * TODO i.e., if we strip it, then the display misses it ;} */
-+ /* TODO mime_fromhdr(): is called with strings that contain newlines;
-+ * TODO this is the usual newline problem all around the codebase;
-+ * TODO i.e., if we strip it, then the display misses it ;>
-+ * TODO this is why it is so messy and why S-nail v14.2 plus additional
-+ * TODO patch for v14.5.2 (and maybe even v14.5.3 subminor) occurred, and
-+ * TODO why our display reflects what is contained in the message: the 1:1
-+ * TODO relationship of message content and display!
-+ * TODO instead a header line should be decoded to what it is (a single
-+ * TODO line that is) and it should be objective to the backend wether
-+ * TODO it'll be folded to fit onto the display or not, e.g., for search
-+ * TODO purposes etc. then the only condition we have to honour in here
-+ * TODO is that whitespace in between multiple adjacent MIME encoded words
-+ * TODO á la RFC 2047 is discarded; i.e.: this function should deal with
-+ * TODO RFC 2047 and be renamed: mime_fromhdr() -> mime_rfc2047_decode() */
- struct str cin, cout;
- char *p, *op, *upper, *cs, *cbeg;
-- int convert;
-- size_t lastoutl = (size_t)-1;
-+ ui32_t convert, lastenc, lastoutl;
- #ifdef HAVE_ICONV
- char const *tcs;
- iconv_t fhicd = (iconv_t)-1;
-@@ -894,6 +900,7 @@ mime_fromhdr(struct str const *in, struct str *out, enum tdflags flags)
- #endif
- p = in->s;
- upper = p + in->l;
-+ lastenc = lastoutl = 0;
-
- while (p < upper) {
- op = p;
-@@ -949,8 +956,7 @@ mime_fromhdr(struct str const *in, struct str *out, enum tdflags flags)
- --cout.l;
- } else
- (void)qp_decode(&cout, &cin, NULL);
-- if (lastoutl != (size_t)-1)
-- out->l = lastoutl;
-+ out->l = lastenc;
- #ifdef HAVE_ICONV
- if ((flags & TD_ICONV) && fhicd != (iconv_t)-1) {
- cin.s = NULL, cin.l = 0; /* XXX string pool ! */
-@@ -966,21 +972,30 @@ mime_fromhdr(struct str const *in, struct str *out, enum tdflags flags)
- #ifdef HAVE_ICONV
- }
- #endif
-- lastoutl = out->l;
-+ lastenc = lastoutl = out->l;
- free(cout.s);
-- } else {
--jnotmime:
-- p = op;
-- convert = 1;
-- while ((op = p + convert) < upper &&
-- (op[0] != '=' || op[1] != '?'))
-- ++convert;
-- out = n_str_add_buf(out, p, convert);
-- p += convert;
-- if (! blankchar(p[-1]))
-- lastoutl = (size_t)-1;
-- }
-+ } else
-+jnotmime: {
-+ bool_t onlyws;
-+
-+ p = op;
-+ onlyws = (lastenc > 0);
-+ for (;;) {
-+ if (++op == upper)
-+ break;
-+ if (op[0] == '=' && (PTRCMP(op + 1, ==, upper) || op[1] == '?'))
-+ break;
-+ if (onlyws && !blankchar(*op))
-+ onlyws = FAL0;
-+ }
-+
-+ out = n_str_add_buf(out, p, PTR2SIZE(op - p));
-+ p = op;
-+ if (!onlyws || lastoutl != lastenc)
-+ lastenc = out->l;
-+ lastoutl = out->l;
- }
-+ }
- out->s[out->l] = '\0';
-
- if (flags & TD_ISPR) {
diff --git a/core/s-nail/sort.patch b/core/s-nail/sort.patch
deleted file mode 100644
index fdb8d526d..000000000
--- a/core/s-nail/sort.patch
+++ /dev/null
@@ -1,75 +0,0 @@
-s-nail-14_5_2-sort.patch, 2014-01-30:
-
-Apply:
- $ cd s-nail-14.5.2
- $ patch -bu < s-nail-14_5_2-sort.patch
-
-Description:
-Reverses (sort(),thread(): use srelax()!, 2014-01-18, [a9b67e9]), which
-was a hasty commit of an untested diff that i've added few minutes
-beforehand.
-It was of course wrong.
-The problem (no memory relaxation during entire sort operation) requires
-a different approach (either only relax when we don't need to hold
-dope storage (as for SORT_TO/SORT_FROM/SORT_SUBJECT/+) or use heap
-memory for those allocations, then).
-
-s-nail-14_5_2-sort-alt.patch is an alternative working thesis that uses
-heap allocations, thus continues to relax the dope storage.
-This version has been pushed to [master].
-
-diff --git a/thread.c b/thread.c
-index 3ac5966..9ec1ac9 100644
---- a/thread.c
-+++ b/thread.c
-@@ -361,8 +361,6 @@ makethreads(struct message *m, long cnt, int nmail)
- return;
- mprime = nextprime(cnt);
- mt = scalloc(mprime, sizeof *mt);
--
-- srelax_hold();
- for (i = 0; i < cnt; i++) {
- if ((m[i].m_flag&MHIDDEN) == 0) {
- mlook(NULL, mt, &m[i], mprime);
-@@ -376,7 +374,6 @@ makethreads(struct message *m, long cnt, int nmail)
- m[i].m_level = 0;
- if (!nmail && !(inhook&2))
- m[i].m_collapsed = 0;
-- srelax();
- }
- /*
- * Most folders contain the eldest messages first. Traversing
-@@ -387,12 +384,8 @@ makethreads(struct message *m, long cnt, int nmail)
- * are replies to the one message, and are sorted such that
- * youngest messages occur first.
- */
-- for (i = cnt-1; i >= 0; i--) {
-+ for (i = cnt-1; i >= 0; i--)
- lookup(&m[i], mt, mprime);
-- srelax();
-- }
-- srelax_rele();
--
- threadroot = interlink(m, cnt, nmail);
- finalize(threadroot);
- free(mt);
-@@ -572,8 +565,6 @@ sort(void *vp)
- default:
- break;
- }
--
-- srelax_hold();
- for (n = 0, i = 0; i < msgCount; i++) {
- mp = &message[i];
- if ((mp->m_flag&MHIDDEN) == 0) {
-@@ -637,10 +628,7 @@ sort(void *vp)
- mp->m_child = mp->m_younger = mp->m_elder = mp->m_parent = NULL;
- mp->m_level = 0;
- mp->m_collapsed = 0;
-- srelax();
- }
-- srelax_rele();
--
- if (n > 0) {
- qsort(ms, n, sizeof *ms, func);
- threadroot = &message[ms[0].ms_n];