mk-mk.in: EXT_CFLAGS: remove .eh frames!..
[s-mailx.git] / TODO
blobe3ce15fcaea62fa49026ba9e9a67d68f0cc40e7e
1 TODO reminder.
3 Backward-compatibility breakers
4 -------------------------------
6 - Recipients specified on the command line should be added to those
7   specified in the message when the -t option is set.
9 - The -q option makes me sad as it doesn't use *indentprefix* for the
10   quoted file.  So either there should be -Q which does so, or -q should be
11   changed.  Also see ~R below.
12   [Note: i think i go for the latter.  Please complain.]
14 - At least optionally disallow silent discarding of invalid addresses,
15   i.e., cause sending to be aborted if not all recipient addresses pass the
16   validity test.
18 - Ditto if a resource file can't be found that has been explicitly set via
19   environment variables there should be some feedback.
21 - I.e., it is fine to be silent unless an error occurs, but then please
22   report errors and offer (in interactive mode) the possibility to act at
23   a glance.
25 -- While there.  There should be some kind of "verbose" switch that - in
26    interactive mode - also gives *positive* feedback, as in "added
27    attachment X, charset Y", but without giving details about protocol
28    delivery etc.
30    [It is terrible that there is almost no feedback in the UI.  When
31    i temporarily implemented a sorted cmdtab i've often used wrong commands,
32    but got no feedback at all!  E.g., wanted to "undelete 14", first did "u
33    14", then "und 14" and then realized my fault and did "undelete 14".
34    *Nothing*.]
36 - POSIX says that, when written to DEAD: "If the file exists, the message
37   shall be written to replace the contents of the file".  This is mentioned
38   for ASYNCHRONOUS EVENTS, but it's the only description of what should be
39   done in which way to DEAD.  savedeadletter() yet appends.  See ZOMBIE ,)
41 - Furthermore, *all* file operations yet append, even recipient target
42   files are appended.  I don't know if this is really desirable behaviour,
43   but i have not thought about that for real.  Maybe this should be at
44   least configurable.
46 - Maybe we should not use pipes to pagers at all.
47   This would also (beside getting rid of longjumps that cross allocations
48   afaik etc.) make it possible to honour the *crt* variable in respect
49   to what really is displayed, not in respect to message size.
50   It irritates me that a message with 5 visible lines but 115 header lines
51   goes through the pager, even if i have *crt=*.
52   P.S.: we could simply count the headers in addition?
54 - The IMAP cache is file-based, which is quite nice, since a filesystem
55   is a database.  On the other hand it may be better if we could hook
56   into sqlite3, which is available almost everywhere by default, with
57   a clearly documented DB content (so that users can use sqlite3(1) to
58   dig into it).  (And just in case S-nail will ever be able to read news
59   and/or have MTA functionality.)
60   One question would be wether compression should be applied.
62 - We should possibly get away of using command line utilities for
63   compression.  (At least optionally?)  Instead we should link against
64   zlib(3), bz2lib(3) and lzma(3), if found.  Or we may use dlopen(3)
65   instead, if found, to avoid linking (though those libraries don't need
66   much linker work unless actually used afaik, 'should look in detail).
67   We should also drop lzw.c, it is used for the IMAP cache.
69 - We should maybe turn -~ into the meaning "force interactive".
70   We should extend cc-test.sh, then, to test some interactive things.
72 Non-breakers
73 ------------
75 - We need a "void" box that can be jumped to, i.e., a state in which no box
76   at all is active.
78   (schdir(): realpath() local files before leaving CWD.., 2013-01-08)
79   did a first step to avoid "getting stuck" when the current folder becomes
80   unaccessible.
81   That is however only a command-specific workaround for a deeper design
82   problem.
84 -- When a MBOX mailbox is removed while it is opened then changing the
85   folder is not possible.  (At least when the only mail that was present
86   therein has been "move"d off that MBOX.)  While trying this i got
87   a deallocation abort trap in lex.c:commands():385:
88         if (linebuf)
89                 free(linebuf);
90   Note that Berkeley Mail (NetBSD mail(1) that is) seems to have the same
91   problem in respect to not allowing a hard-change, but only allows an exit
92   (not a quit thus).  The error may still exist even there, it maybe that
93   it simply doesn't show up because a stack buffer is used ...
95   In interactive mode, dump the temporary file to the TMPDIR and inform the
96   user; it's up to him to decide what should happen.
98   Otherwise it must be possible to switch the folder (to the *void* one)
99   forcefully.
101 -- Also, when the folder is modified concurrently we should bail, or, in an
102   interactive session, prompt the user what to do.
104 - IDNA decoding.  It may be that this will never be supported.  But
105   wouldn't it be nice for at least viewing messages?
107 - Mail-Followup-To:.
109 - Make it possible to reply to/save/write/xy part X.Y[.Z] by allowing its
110   specification directly, as in, e.g., ':w 1.2'.  If doing so on an
111   embedded message/rfc822, e.g., a message embedded in a digest, it should
112   be possible to reply to the very message in respect to its header fields,
113   but (optionally?) keep the original Cc:'d.  (Parts by Martin Neitzel)
115 -- In general i like the possibility of mutt(1) to toggle in between header
116    and header-ignore mode with a simple switch (h), and that *this toggle
117    is used when replying*.  Yes i know mutt(1) sucks beside that in respect
118    to base64, MBOX, QP for CRLF files etc.
120 -- Also, mutt(1) quotes all text parts of a message, not only the first
121    one!  This should at least be optionally available.
123 - If pipes fail for part viewers then at least the usual PART X.Y should be
124   shown, maybe even including some error message.
125   I had 'set pipe-text/html="lynx -dump -force_html /dev/stdin"' but NetBSD
126   does not have lynx(1), and i thought i've found a S-nail(1) bug.
127   And so it was.
129 = Update: (Change "Part X:" display message.., 2012-12-20) did one step,
130   but we need to rewrite the entire layers to handle that the separating
131   newline in between messages is considered to be part of it.
133 - I want to have a ~R tilde command that works like ~r except it performs
134   quoting of the input just as ~m does.  Also see -q above.
136 - Offer the possibility to work with certificate fingerprints instead of
137   full certificates, in equal spirit to the current maintainers S-Postman
138   and Mercurial.  S-nail(1) could simply offer something in equal spirit to
139   the formers --fingerprint, so that no other tool is necessary for
140   certificate management (for at least secure transport).
142 - It would be nice if it would be possible to define a format string for
143   *quote*, like 'set quote="format=some formats"'.
144   In general the current approach is somewhat messy IMO.  I.e., it would
145   make more sense to act rather like mutt(1) and as written elsewhere in
146   this document, i.e., have some toggles that act on the display and use it
147   for multiple modes (show/reply/forward etc.)
148   Otherwise introduce commands which include all the headers plus, e.g.,
149   "hreply" or "freply", and then the ditto series, i.e., "hReply" ...
151 -- This would also mean that interactive message editing would work
152   accordingly.  PleasE!
154 - Command line editing should gain possibility of context sensitive tab
155   completion.
157 -- Note that the TTY is sick.  If ^C on input it simply jumps to next
158    input, instead of saying "Interrupted, one more to die hard" or
159    something (talking about ~@ charset selection prompts in particular).
161 - For those who use S-nail(1) only with a MTA it may be desirable to have
162   some "smopts" expansion mechanism in equal spirit to NetBSD mailx(1).
164 - While talking about NetBSD mailx(1), the author can imagine that being
165   able to use the optional -H:xy stuff is sometimes nice.
167 - Check against RFC 5322.
168   Rework all the header parsing code.  Actually understand the content,
169   classify the stuff so that it matches what is defined in RFC dependent on
170   header field.  Place the result in objects that know what they represent.
171   See the name extraction topic below.
173 - Also check against newest POSIX.
174   Maybe add a bash(1)ish POSIXLY_CORRECT (or so) variable?  Though..
176 - Maybe there should be an additional ZOMBIE directive that is served in
177   equal spirit to DEAD, but that could be a valid MBOX... ?
178   What i want is a *real* resend, best if possible from command line.
179   Meaning, also the possibility to postpone a message.  In general.
181 - POP3 doesn't support "newmail" for real.  If implemented, should it sync?
182   Look at POP3 impl. in general..
184 - Having a newsreader would be a really cool thing.  (RFC 977 and 2980)
186 - There should be a way to ignore the From_ line, as opposed to the From:
187   line, i.e., distinctively.
189 - There should be a variable that controls wether leading and trailing
190   empty lines of parts and/or messages as such should be printed or not.
192 - RFC 2387: multipart/related.
194 - rfc2384.txt etc.  I.e., Much better URL support.
196 - printhead()/hprf(): support %n newline format (%t tab?).
197   Make it possible to use the *datefield* algorithm for plain From_ derived
198   dates (needs a From_ parser, i.e., strptime()-alike).
199   Once we have that, rename *datefield-markout-older* to
200   *date-markout-older* ??
201   Note that NetBSD's mail(1) has some other nice things.
202   Note also that our code is quite unflexible.
204 -- NetBSD's mail(1) has nice *indentprefix* and *indentpostscript*
205    variables (though prefix and appendix or prefix and suffix, but..).
206    Note that our code is quite unflexible.
208 - The "top" command should honour ignoretab, or there should be a very
209   special "top" ignoretab.  It simply doesn't make sense to "top" 5 lines
210   when all that you get are Received: lines...
212 - In the very end it is not that hard to add (optional) MTA
213   functionality at a most simple level.
214   Use sqlite for aliases (and possibly cache), then.
216 - We should support IMAP compression over the wire.
218 Low-Level
219 ---------
221 - Revise the code:
222   + [v13:messed up] Use NetBSD KNF in respect to parens for return+.
223   + [v13:started] Add C99-likeish typedefs and use them everywhere.
224   + [v13:started] Don't use magic constants/values.
225   + [v13:started] Use const arguments whenever possible.  Yet started, but
226     with ugly casts at some places because this is a can of worms.
227   + Inline functions?  [Restrict pointers?]
228   + [v13:started] Document the functions in the interface declarators.
229   + [v13:started] Resort the functions and where they are implemented.
230   + Make more use of struct str, and offer more support functions for it.
231   + Make more use of value carriers in the call stack.  There are functions
232     with an incredible amount of arguments, needlessly.
233   ++ E.g., use a struct readlinectx.
234   + Ftemp(): offer an operation mode enum that includes "do-unlink".
235     In general: now there is O_CLOEXEC etc. ...
236   + Lazy install sigchild handler etc.
238 - [v13:started] Improve name extraction rules.  And field parsing.  There
239   are structured and unstructured fields.  There are quoted pairs and
240   comments etc.  Rewrite the entire parsing mechanism to comply to RFC
241   5322, and try to merge all those many subparsers around in the codebase,
242   and accordingly.  So much duplicated work ...
243   Name parsing has been improved a bit for v13, but it's still broken.
244   yankword(), *extract(), etc.: RFC 5322 says that comments in address
245   fields SHOULD NOT be used (mutt(1) maps them to full name-addr forms if
246   approbiate, even if that actually changes content!!?), and that full
247   name-addr SHOULD be used.  Our functions are yet quite silly (i.e.,
248   leading comments remain, as in "(bier2) <a2@b2.de>", unless the address
249   doesn't come in angle brackets, trailing go away, as in "<a6@b6.de>
250   (bier6)", that becomes "<a6@b6.de>").
251   Something silly like
252     (co$mm1) abc@däf.de (cö,mm,2)   ('c'o"m"m.3)
253   Should eventually become
254     co$mm1 cö,mm,2 'c'o"m"m.3 <abc@xn--df-via.de>
255   on the display, or, with IDNA decoding (and thus rather unlikely)
256     co$mm1 cö,mm,2 'c'o"m"m.3 <abc@däf.de>
257   It should NOT become this mutt(1)ism:
258     "co$mm1 cö,mm,2 'c'omm.3" <abc@däf.de>
259   Or?
261 - Think about a name bypass hashmap cache, and whenever we have to skin or
262   nalloc() or whatever, look in there.  Maybe even an additional link for
263   non GFULL(/GSKIN) and fully skinned struct name objects.
264   The amount of duplicated work in this codebase is frustrating, but the
265   real healing would make necessary a complete rewrite of the name handling!
266   Such a cache would work without touching the current code flow ... or
267   allow a smooth transition to a new one anyway.
269 - Think about a value() cache.  (Yet added boption() and soption() stubs.)
271 - Think about replacing the IMAP cache with an SQLITE3 interface.
272   Or rewrite it.  Error handling etc. etc. is peculiar.
274 - The char classification stuff can be improved; currently each character
275   has exactly one classification bit set, even if multiple would apply
276   (e.g., HT=\t == CNTRL|SPACE|ASCII|BLANK).  This would allow better
277   testing using our own classification functions in quite some places.
279 - The quoted-printable Content-Transfer-Encoding: supports soft linebreaks;
280   it happens that a lot of mailers (Apple Mail?, Microsoft Word, Yahoo!
281   Webmail) create HTML parts which solely consist of a single line,
282   created via soft linebreaks.
283   To handle such mess we need to be able to break out of the input-line ==
284   output line relationship that is still fixated in the codebase.
285   I.e., it is not even sufficient to convert "rest" into an array, but best
286   would be if we would be able to sequentially work what we have, and
287   detect when it is safe to "dump that out".
288   This MUST be part of the send/mime layer rewrite in 15.0.
290 - I want a clean PTF interface for the actual layers.  There should be no
291   switch() statements around that test for the type of BOX that is
292   currently open.  Especially important for possible NEWS support, but the
293   code is a mess in general...
295 - I hate longjmp()s and signals.  I suspect some pitfalls in the codebase.
296   All that stuff should at least be collected in a single place.
297   Just imagine how easy it could be done with a non-blocking select(2)
298   based event loop, ISIG off termios flags, etc.  ach!!
300   I would like to see that compilation with a C++ compiler is possible,
301   though that would be a long way and be especially problematic due to the
302   (C ish) way enums are used.
304 - I never used anything but the *datefield* option, and it would really be
305   nice if the date strings would be parsed off into some 16 byte or what
306   storage when about to producing the summary, so that it would be directly
307   available and there would be no need to reread the mail.  Moreover, or
308   even more than that - the m_date field exists and should possibly simply
309   be init, at least in these cases.  (P.S.: this doesn't contradict the
310   statement somewhere else in this file that the structure should be
311   slacked; simply use multiple thereof or so)
313 - All error messages should not go to stderr but instead we should add our
314   own n_warn() family and use that.  In the background we should have
315   a ring of error messages (oldest fall off), and a command that is capable
316   to display the ring.  The command loop should recognize whenever an error
317   happened during the last command, and print something like "XY errors
318   occurred", followed by a (truncated as necessary) error report.
319   It simply doesn't make any sense to print errors on stderr if normal
320   output goes to stdout and scrolls it off the screen.
321   Note that yet some errors messages still go to stdout.
323 - Dramatically pimp the cc-test.sh script, and recognize and report
324   compilation errors, too.
325   WE NEED MORE AUTOMATIZED TESTING!
327 - An `account' should imply an environment snapshot of all variables.
328   I.e., variables which become modified while an account is active would
329   gain their old / a different value (back) when switching off this
330   account.  We would need some "set-variable-global" or something, to
331   get around that?
332   There should be an implicit account ("global" or "*" or whatever) that
333   can be switched back to.
335 -- It would be very nice if it would be possible to have
336    account-specific macros that will be lost when a user switches off
337    an account.
339 --- It would also be very nice if we could define macros while defining
340     account, i.e., recursive definition of macros...
341     See below on account/define though.
343 - At some later time extend the logic behind -# -- it should not have
344   a current folder, but start in VOID mode (...), and unless one is
345   explicitly chosen..  We need a reliable batch mode.
347 - (Support for mailcap files?  As of RFC 1524?  Unlikely.  Though the
348   % expansions would be very helpful, especially once we can address
349   individuals parts as of v15.0!)
351 TODO S-nail 14.5:
352 -----------------
354 - Perform a WS check, and fix it.
355   (For 15.0: reformat, add vim(1) modelines and use s-it-mode.
356   To do so, write a small script and ensure no functional change occurred.)
358 - Deal with faulty message selection that may occur when selecting threads
359   via & (when at least mixed with other selectors).
361 -- Also (?same problem?) the thread sort doesn't get
363     [A is deleted]
364     B answers A
365       C answers B
366       D answers B
367     E is unrelated
368     F answers A
370   The current sort fails to recognize that F and the thread starting at
371   B are related, which results in a mess.
373 - Drop the restriction that environment variables cannot be modified
374   from within interactive S-nail(1), check carefully what depends on
375   that (findmail() looks for MAIL, be aware of -u interaction etc.).
376   Drop tempdir, myname and homedir variables and always use functions to
377   look the values up (just make them function local variables where
378   used).
379   If necessary, add more hooks in vars.c:_check_special_vars() (or
380   finally implement the value cache for real).
381   Drop main.c:_setup_vars(), then.
383 - If we do link against OpenSSL, try to compile a test program and use
384   the OpenSSL version of MD5 if possible.
386   I think this is the right time to change our config/make system so that
387   the Makefile is generated with only those files which are actually
388   needed.  Move the Makefile vars to user.conf.
390   (Possibly drop usage of compressions tools and link against the
391   compression libraries.  Maybe dlopen() them?  Otherwise leave that for
392   future version.)
394 - Make *password* and *password-USER@HOST* global, introduce
395   *PROTOCOL-auth-password* and *PROTOCOL-auth-password-USER@HOST*.
396   Then, drop smtp_auth_var(), and change lookup_password_for_token() to
397   work like (PROTOCOL, user,host|TOKEN) -- *password* is a global override,
398   only if that is not set lookup protocol specific.
399   Use that single function from everywhere.
401 - Change **use-starttls* to the opposite.  I.e., CAPA or whatever, if TLS
402   is supported, use automatically.  *UNLESS* explicitly disabled.
404 - Add a global *keepalive*, add *keepalive-USER@HOST*.  Add and use
405   a generic, single function to get the value for either protocol.
407 - NOTE: we do not really support IPv6 sofar in that we are not prepared to
408   deal with IPv6 addresses.
409   Introduce an URI abstraction structure in 14.5, and start using it, i.e.,
410   _pop3_user() and, very important, sopen().
411   Note this shit software use a lot of places which mess around...
413 - The account command involves a lot of code but it's only difference to
414   define is that a "fi" is executed.  If we would have the possibility to
415   explicitly jump to VOID boxes, we could use QUIT->FOLDER instead of
416   FOLDER[OK? -> QUIT], and then it'd be up to the use to simply use a "fi"
417   at the end of a define.  Or so.
418   See above for more on account/define though.
420 -- If *folder* is set to an IMAP box, and we're about to "mbox" data to
421    there, and we're currently on a POP3 server, and the connection fails,
422    we're completely lost and cannot even interrupt...
424 - mutt(1) dotlock ..., "mbox" command doesn'T work?
426 - ARGH!  Should `folders' auto-login if *folder* is an IMAP account that is
427   not active?  Why does _expand() use *mailname* to expand `@', not
428   getfold() (care: res may point into cbuf, savestr() or so!).
429   Why does demail() etc. treat *mailname* as a file (more or less), why do
430   we need *mailname* at all;  we should have Folder objects, multiple of
431   which concurrently, one the active; a Folder may not become *folder*
432   unless it has write (store) capabilities).  Maybe then `mbox' works fine
433   if connected to a POP3 server with a *MBOX* on an IMAP account that yet
434   never was connected and needs to read a password on the terminal before
435   the login works ... note the latter situation yet kills us since i think
436   INT is blocked during all that ;-((
438 - I had a connection collapse during a POP3 download, and neither was
439   there a chance to get access to the 22 yet downloaded mails (after
440   five minutes of waiting followed by CNTRL-C), nor did the layer
441   recognize this very well (got myriads of `POP3 connection already
442   closed.' messages, btw., the thirty-something messages which were not
443   yet downloaded caused (after CNTRL-C) this:
445     POP3 connection already closed.
446     POP3 connection already closed.
447     POP3 connection already closed.
448     POP3 connection already closed.
449     POP3 connection already closed.
450     POP3 connection already closed.
451      U 23                    Thu Jan  1 0    /    0
452     POP3 connection already closed.
453     POP3 connection already closed.
454     POP3 connection already closed.
455     POP3 connection already closed.
456     POP3 connection already closed.
457     POP3 connection already closed.
458      U 24                    Thu Jan  1 0    /    0
460   i had to switch off and back).  At least we didn't crash.
461   Thereafter, still very unstable connection, i tried to login again:
463     ? fi xpop
464     Resolving host pop.gmail.com . . . done.
465     Connecting to 173.194.70.109:pop3s . . . connected.
466     Comparing DNS name: "pop.gmail.com"
467     POP3 connection already closed.
468     +OK Gpop ready for requests from XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
469   [..nothing!..]
470     ^CInterrupt
471     ? fi %
472     "/private/var/mail/steffen": 0 messages
473     ? fi xpop
474     Resolving host pop.gmail.com . . . done.
475     Connecting to 173.194.70.109:pop3s . . . connected.
476     Comparing DNS name: "pop.gmail.com"
477     ? fi
478     ? fi
479     ? fi
481   Can of worms.
483 - Add a value-duplication command, i.e.,
484     clone _x header
485     unset header
486     ...
487     clone header _x
488     unset _x
490 - Some (configurable?) verbosity for certificate validation.
491   (Martin Neitzel)
492   Rework certificate handling to match RFC 6125!  14.4!
494 - #include cleanup.  Much too much!
496 - Remove all occurrences of mbtowc() with mbrtowc(); temporarily add (some)
497   global mbstate_t objects until the send / MIME layer rewrite is done and
498   has the carrier.  Use flip states and add aux funs with only update the
499   state+toggle on success -- CURRENTLY MBTOWC FAILURES ARE PRACTICALLY NOT
500   HANDLED!!
502 - Ensure that `.' and EOF on a line works with all TTY modes (*ignoreeof*
503   relationship, too)!  EOF conditions in general!
505 -- NCL / current expand-on-tab: fexpand() should take additional size_t* to
506    store the number of the results OR should "return char** array", so that
507    individual results can be addressed.
508    Then we could simply print "\nALL-RESULTS\n" and NOT expand the current
509    line if the result is ambiguous, i.e., we have more than one possible
510    expansion.
511    However, we would then need something to print the results page-wise,
512    in case we have so many of them that they don't fit on the screen.
513    ...  Etc. ...
515 - Add TODO notes for those RFCs:
516   RFC 5322 - The basic format of email messages. 
517   MIME (Multimeda) email extensions
518   RFC 2405 - The format of MIME message bodies. 
519   RFC 2406 - Common multimedia types. 
520   RFC 2017 - URL External-Body Access-Type 
521   RFC 3676 - Updates to the text/plain MIME type and extensions for flowed
522     text (format=flowed). 
523   RFC 2407 - Encoding of non-ASCII text in message headers. 
524   RFC 2183 - The Content-Disposition Header 
525   RFC 2231 - Encoding of character set and language information in MIME
526     parameter values. 
527   SMTP (Simple Mail Transfer Protocol)
528   RFC 5321 - Simple Mail Transfer Protocol. 
529   RFC 6409 - Message Submission for Mail 
530   RFC 4954 - SMTP Authentication 
531   RFC 3207 - SMTP over TLS 
532   RFC 6152 - SMTP Service Extension for 8-bit MIME Transport 
533   Post Office Protocol (POP)
534   RFC 1939 - Post Office Protocol v3 
535   RFC 2449 - POP3 Extensions (including SASL) 
536   RFC 2595 - TLS for POP3 (among others) 
537   Security
538   RFC 4422 - Simple Authentication and Security layer (SASL) 
539   RFC 5246 - Transport Layer Security (TLS)
540   RFC 977 - Network News Transfer Protocol
541   RFC 2980 - Common NNTP Extensions
543 - IMAP: if i `d' a message then this is a local change (in the meanwhile);
544   yet, when i `u' it, that will go through the server, needlessly.
546 - I got an email in base64 that obviously used CRNL line endings, and once
547   i've replied the CR where quoted as *control* characters.
548   Get rid of those (kwcrtest.mbox; may be hard to do everywhere for some
549   time). (2013-08-06)
551 - Yet another one:
553   :>>> T1026 NOOP
554   Received SIGPIPE during IMAP operation
555   IMAP write error: error:00000000:lib(0):func(0):reason(0)
557   [DOING STUFF]
559   ? newmail
560   >>> T1027 FETCH 51:52 (FLAGS UID)
561   IMAP write error: Bad file descriptor
562   >>> T1028 FETCH 51:52 (RFC822.HEADER)
563   IMAP write error: Bad file descriptor
564   IMAP connection closed.
565   IMAP connection closed.
566   IMAP connection closed.
567   IMAP connection closed.
568   IMAP connection closed.
569   IMAP connection closed.
570   IMAP connection closed.
571   IMAP connection closed.
572   New mail has arrived.
573   Loaded 2 new messages.
574   >>> T1029 FETCH 51:52 (RFC822.HEADER)
575   IMAP write error: Bad file descriptor
576   IMAP connection closed.
577   IMAP connection closed.
578   IMAP connection closed.
579   IMAP connection closed.
580   IMAP connection closed.
581    U 51                    Thu Jan  1 0    /    0 
582    IMAP connection closed.
583    IMAP connection closed.
584    IMAP connection closed.
585    IMAP connection closed.
586    IMAP connection closed.
588 - The codebase has a lot of problems with type mixing; int,off_t,size_t are
589   often used INTERCHANGEABLY to store the same size / value; especially
590   IMAP seems to be quite weird.  I've yet changed some off_t to size_t,
591   which is not a good idea for 32-bit and large files, but (a) it's
592   questionable wether we could handle those anyway and (b) all bets are off
593   since pieces of code also use int storage for them, iirc.
594   This will be a long-term problem.
596 - edit.c doesn't do NEED_BODY (yeah, IMAP won't work anyway).
598 Release S-nail v20 on 2018-03-25, the 40th anniversary of Mail.
599 With a clean, conforming and efficient codebase, then.
601 vim:set fenc=utf-8:s-ts-mode