From:  Kari Hurtta <hurtta@kasvihuone.keh.iki.fi.invalid>
Date:  25 Nov 2022 02:23:46 Hong Kong Time
Newsgroup:  news.alt119.net/comp.mail.elm
Subject:  

Patch: Elm ME+ 2.5 PLalpha54 -> Elm ME+ 2.5 PLalpha60 [2/13]

NNTP-Posting-Host:  null

Archive-name: elmME+2.5/PLalpha-54to60.2

Before applying this patch catenate parts 1 - 13 first.
Also it should be possible to apply parts 1 - 13
individually.

Part 0 does not include patch.

This patch is agaist Elm ME+ 2.5 PLalpha54

====================================== ( part 2/13 ) =========
Index: elmME+.2.5.alpha60/doc/elmregister.1
*** elmME+.2.5.alpha54/doc/elmregister.1	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/doc/elmregister.1	Thu May 26 11:16:29 2022
***************
*** 505,508 ****
  .SH BUG REPORTS TO
  Kari Hurtta	elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 2003-2021 by Kari Hurtta
--- 505,508 ----
  .SH BUG REPORTS TO
  Kari Hurtta	elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 2003-2022 by Kari Hurtta
Index: elmME+.2.5.alpha60/doc/elmstringconvert.1
*** elmME+.2.5.alpha54/doc/elmstringconvert.1	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/doc/elmstringconvert.1	Thu May 26 11:16:29 2022
***************
*** 86,89 ****
  .SH BUG REPORTS TO
  Kari Hurtta	elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 2002-2021 by Kari Hurtta
--- 86,89 ----
  .SH BUG REPORTS TO
  Kari Hurtta	elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 2002-2022 by Kari Hurtta
Index: elmME+.2.5.alpha60/doc/elmterminal.1
*** elmME+.2.5.alpha54/doc/elmterminal.1	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/doc/elmterminal.1	Thu May 26 11:16:29 2022
***************
*** 79,82 ****
  .SH BUG REPORTS TO
  Kari Hurtta	elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 2000-2021 by Kari Hurtta
--- 79,82 ----
  .SH BUG REPORTS TO
  Kari Hurtta	elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 2000-2022 by Kari Hurtta
Index: elmME+.2.5.alpha60/doc/elmunidata.1
*** elmME+.2.5.alpha54/doc/elmunidata.1	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/doc/elmunidata.1	Thu May 26 11:16:29 2022
***************
*** 82,85 ****
  .SH BUG REPORTS TO
  Kari Hurtta	elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 2001-2021 by Kari Hurtta
--- 82,85 ----
  .SH BUG REPORTS TO
  Kari Hurtta	elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 2001-2022 by Kari Hurtta
Index: elmME+.2.5.alpha60/doc/fastmail.1
*** elmME+.2.5.alpha54/doc/fastmail.1	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/doc/fastmail.1	Fri Sep  2 20:38:19 2022
***************
*** 11,17 ****
  .B fastmail [
  .B \-d
  .I "\fIclass\fR=\fIdebugfile\fR:\fIlevel\fR"
! ] [-b bcc-list] [-c cc-list] [-C comments] [-d] [-H] [-f fromname] [-F from-field]
  [-i msg-id] [-r replyto] [-R references] [-s subject] filename|- address-list
  .br
  .SH DESCRIPTION
--- 11,17 ----
  .B fastmail [
  .B \-d
  .I "\fIclass\fR=\fIdebugfile\fR:\fIlevel\fR"
! ] [-b bcc-list] [-c cc-list] [-C comments] [-d] [-H] [-f from-name] [-F from-field]
  [-i msg-id] [-r replyto] [-R references] [-s subject] filename|- address-list
  .br
  .SH DESCRIPTION
***************
*** 49,67 ****
  .I fastmail
  was compiled with debugging enabled.
  .TP
! .B "-f \fIfrom\fR"
  This overrides the users name in the From: header field, so that if
  the user was x@y, and their name was MrX then the default 
  From: line would be "From: MrX ".  Using "-f Joe" when
  invoking this, though, would change it to "From: Joe "
  
! NOTE: -f \fIfrom\fR does not work if From: header field
!       is given on ~/.elm/elmheaders file or when -F option
!       is used.
  .TP
  .B "-F \fIfrom-field\fR"
  This specifies From: header field or adds new address to
! From: header field.
  .TP
  .B -H
  If specified, only Return-Path: -header field is read from
--- 49,78 ----
  .I fastmail
  was compiled with debugging enabled.
  .TP
! .B "-f \fIfrom-name\fR"
  This overrides the users name in the From: header field, so that if
  the user was x@y, and their name was MrX then the default 
  From: line would be "From: MrX ".  Using "-f Joe" when
  invoking this, though, would change it to "From: Joe "
  
! This option can be given only once.
! 
! NOTE: "-f \fIfrom-name\fR" does not work if From: header field
!       is given on ~/.elm/elmheaders file and it
!       includes more than one From: address.
! 
! This option can not be used together with "-F \fIfrom-field\fR" 
! option.
! 
  .TP
  .B "-F \fIfrom-field\fR"
  This specifies From: header field or adds new address to
! From: header field. From: addresses given on  ~/.elm/elmheaders 
! file are discarded.
! 
! This option can not be used together with "-f \fIfrom-name\fR" 
! option.
! 
  .TP
  .B -H
  If specified, only Return-Path: -header field is read from
***************
*** 161,167 ****
  .SH BUG REPORTS TO
  Kari Hurtta     elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 1996-2021 by Kari Hurtta
  .br
  Based on Elm 2.4, \fB\*(ct\fRCopyright 1988-1992 by The USENET Community Trust
  .br
--- 172,178 ----
  .SH BUG REPORTS TO
  Kari Hurtta     elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 1996-2022 by Kari Hurtta
  .br
  Based on Elm 2.4, \fB\*(ct\fRCopyright 1988-1992 by The USENET Community Trust
  .br
Index: elmME+.2.5.alpha60/doc/frm.1
*** elmME+.2.5.alpha54/doc/frm.1	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/doc/frm.1	Thu May 26 11:16:29 2022
***************
*** 162,168 ****
  .SH BUG REPORTS TO
  Kari Hurtta	elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 1996-2021 by Kari Hurtta
  .br
  Based on Elm 2.5, \fB\*(ct\fRCopyright 1988-1995 by The USENET Community Trust
  .br
--- 162,168 ----
  .SH BUG REPORTS TO
  Kari Hurtta	elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 1996-2022 by Kari Hurtta
  .br
  Based on Elm 2.5, \fB\*(ct\fRCopyright 1988-1995 by The USENET Community Trust
  .br
Index: elmME+.2.5.alpha60/doc/mail.services
*** elmME+.2.5.alpha54/doc/mail.services	Sun Nov 15 16:50:39 2015
--- elmME+.2.5.alpha60/doc/mail.services	Thu May 26 11:16:29 2022
***************
*** 12,17 ****
--- 12,18 ----
  #     imaps	    
  #     pops	    
  #     smtps	    
+ #     submissions     
  #
  #  is canonical name for host.
  #  are in general following forms:
***************
*** 37,42 ****
--- 38,47 ----
  #						(STARTTLS or similar) and
  #						certificates's CN must
  #						match
+ #		use-tls-checks			With value "no" disables global
+ #						verify-tls-certificate
+ #						and 'require-tls-peer-name given
+ #						on use-tls elmrc option
  #               :               Valid  are these
  #                                               which are given with
  #                                                use-library -elmrc
***************
*** 69,75 ****
  #       ("smtps" requires explict port=<...> or addr=ip:/ 
  #        to be given. Originally port 465 was reserved for smtps, but 
  #        this was revoked and that port is now reserved for 
! #        "URL Rendesvous Directory for SSM" instead.)
  #
  #	Parameter 'verify-tls-certificate' does not check certificate 
  #	name. CN (common name) of certificate subject can be given with 
--- 74,82 ----
  #       ("smtps" requires explict port=<...> or addr=ip:/ 
  #        to be given. Originally port 465 was reserved for smtps, but 
  #        this was revoked and that port is now reserved for 
! #        "URL Rendesvous Directory for SSM" instead. TCP port 465
! #        is later registered for "Message Submission over TLS protocol"
! #        or submissions also. )
  #
  #	Parameter 'verify-tls-certificate' does not check certificate 
  #	name. CN (common name) of certificate subject can be given with 
***************
*** 83,92 ****
  #       This also do not check agaist wildcards (*) on certificate 
  #       name -- * on certificate name is treated as regular character.
  #
! #  There is no advantage for using "imaps" over "imap" or "pops" over "pop". 
  #  Just use "verify-tls-certificate" if regular imap or pop -port is not blocked 
  #  and mail server supports encryption (via imap's STARTTLS or pop's STLS).
  
  imap.example.com  imap		  require-tls-peer-name; verify-tls-certificate
  pop3.example.com  pop		  require-tls-peer-name; verify-tls-certificate
! 
--- 90,103 ----
  #       This also do not check agaist wildcards (*) on certificate 
  #       name -- * on certificate name is treated as regular character.
  #
! #  There is no advantage for using "imaps" over "imap" or "pops" over "pop"
! #  or "submissions" over "submission". However with use-tls elmrc option value
! #  'implicit-tls' services "imaps", "pops" or "submissions" is tried before
! #  "imap", "pop" or  "submission" with same ip address.
! #
  #  Just use "verify-tls-certificate" if regular imap or pop -port is not blocked 
  #  and mail server supports encryption (via imap's STARTTLS or pop's STLS).
  
  imap.example.com  imap		  require-tls-peer-name; verify-tls-certificate
  pop3.example.com  pop		  require-tls-peer-name; verify-tls-certificate
! smtp.example.com  submission	  require-tls-peer-name; verify-tls-certificate
Index: elmME+.2.5.alpha60/doc/newalias.1
*** elmME+.2.5.alpha54/doc/newalias.1	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/doc/newalias.1	Thu May 26 11:16:29 2022
***************
*** 103,109 ****
  .SH BUG REPORTS TO
  Kari Hurtta     elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 1996-2021 by Kari Hurtta
  .br
  Based on Elm 2.4, \fB\*(ct\fRCopyright 1988-1992 by The USENET Community Trust
  .br
--- 103,109 ----
  .SH BUG REPORTS TO
  Kari Hurtta     elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 1996-2022 by Kari Hurtta
  .br
  Based on Elm 2.4, \fB\*(ct\fRCopyright 1988-1992 by The USENET Community Trust
  .br
Index: elmME+.2.5.alpha60/doc/newmail.1
*** elmME+.2.5.alpha54/doc/newmail.1	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/doc/newmail.1	Thu May 26 11:16:29 2022
***************
*** 171,177 ****
  .SH BUG REPORTS TO
  Kari Hurtta     elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 1996-2021 by Kari Hurtta
  .br
  Based on Elm 2.4, \fB\*(ct\fRCopyright 1988-1992 by The USENET Community Trust
  .br
--- 171,177 ----
  .SH BUG REPORTS TO
  Kari Hurtta     elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 1996-2022 by Kari Hurtta
  .br
  Based on Elm 2.4, \fB\*(ct\fRCopyright 1988-1992 by The USENET Community Trust
  .br
Index: elmME+.2.5.alpha60/doc/readmsg.1
*** elmME+.2.5.alpha54/doc/readmsg.1	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/doc/readmsg.1	Thu May 26 11:16:29 2022
***************
*** 266,272 ****
  .SH BUG REPORTS TO
  Kari Hurtta     elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 1996-2021 by Kari Hurtta
  .br 
  Based on Elm 2.5, \fB\*(ct\fRCopyright 1988-1995 by The USENET Community Trust
  .br
--- 266,272 ----
  .SH BUG REPORTS TO
  Kari Hurtta     elm@elmme-mailer.org
  .SH COPYRIGHTS
! \fB\*(ct\fRCopyright 1996-2022 by Kari Hurtta
  .br 
  Based on Elm 2.5, \fB\*(ct\fRCopyright 1988-1995 by The USENET Community Trust
  .br
Index: elmME+.2.5.alpha60/hdrs/addrlib.h
*** elmME+.2.5.alpha54/hdrs/addrlib.h	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/hdrs/addrlib.h	Fri Sep  2 20:38:19 2022
***************
*** 1,7 ****
! /* $Id: addrlib.h,v 2.37 2021/01/17 18:53:16 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.37 $   $State: Exp $
   *
   *  Author: Kari Hurtta  (was hurtta+elm@posti.FMI.FI)
   *      or  Kari Hurtta 
--- 1,7 ----
! /* $Id: addrlib.h,v 2.41 2022/08/06 08:01:51 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.41 $   $State: Exp $
   *
   *  Author: Kari Hurtta  (was hurtta+elm@posti.FMI.FI)
   *      or  Kari Hurtta 
***************
*** 25,35 ****
  
  /** "exit_disposition" values */
  enum exit_disposition {
!     UNSET =	0,
!     KEEP  =	1,
!     STORE =	2,
!     DELETE =	3,
!     HIDE =    4
  };
  
  
--- 25,38 ----
  
  /** "exit_disposition" values */
  enum exit_disposition {
!     UNSET      =   0,
!     KEEP       =   1,
!     STORE_RECV =   2,
!     DELETE     =   3,
!     HIDE       =   4,
!     STORE_DSN  =   5,
! 
!     exit_disposition_COUNT
  };
  
  
***************
*** 37,43 ****
  enum {
      DISP_INLINE	     = 0,
      DISP_ATTACH	     = 1,
!     DISP_AUTOATTACH  = 2
  };
  
  enum encoding {
--- 40,48 ----
  enum {
      DISP_INLINE	     = 0,
      DISP_ATTACH	     = 1,
!     DISP_AUTOATTACH  = 2,
! 
!     DISP_count             /* size of array */ 
  };
  
  enum encoding {
***************
*** 63,68 ****
--- 68,74 ----
      NOTPLAIN_bit_is_fallback,
      NOTPLAIN_bit_metamail_blacklisted,
      NOTPLAIN_bit_type_not_found,
+     NOTPLAIN_bit_mailcap_skipped,
  
      NOTPLAIN_bit_count  /* Number of bits */
  };
***************
*** 73,79 ****
  #define    NOTPLAIN_is_fallback             (1 << NOTPLAIN_bit_is_fallback)
  #define    NOTPLAIN_metamail_blacklisted    (1 << NOTPLAIN_bit_metamail_blacklisted)
  #define    NOTPLAIN_type_not_found          (1 << NOTPLAIN_bit_type_not_found)
! 
  
  /* XXX struct mimeinfo is embedded to struct header_rec */
  #define MIME_magic              0xFD00
--- 79,85 ----
  #define    NOTPLAIN_is_fallback             (1 << NOTPLAIN_bit_is_fallback)
  #define    NOTPLAIN_metamail_blacklisted    (1 << NOTPLAIN_bit_metamail_blacklisted)
  #define    NOTPLAIN_type_not_found          (1 << NOTPLAIN_bit_type_not_found)
! #define    NOTPLAIN_mailcap_skipped         (1 << NOTPLAIN_bit_mailcap_skipped)
  
  /* XXX struct mimeinfo is embedded to struct header_rec */
  #define MIME_magic              0xFD00
***************
*** 262,267 ****
--- 268,278 ----
  					       const struct string * phrase,
  					       const struct string * comment));
  
+ /* Rerurn 1 if address have all datat as NULL 
+    (Note that <> is not NULL on that case)
+ */
+ 
+ extern int address_is_empty P_((const struct address * addr));
  
  extern const struct string * address_get_phrase P_((const struct address *
  						    addr));
***************
*** 694,699 ****
--- 705,719 ----
  #define ADD_GROUP(x,GRP)               add_group_phrase_(&x,GRP)
  #define ADD_TEXTUAL(x,TEXTUAL,POS,LEN) add_textual_addr_(&x,TEXTUAL,POS,LEN)
  
+ #define ADD_EXPANDED_p(x,ADR,FN,COM)  add_expanded_addr_(x,ADR,FN,COM)
+ #define ADD_EXPANDED0_p(x,ADR)        add_expanded_addr0_(x,ADR,-1)
+ #define ADD_EXPANDED_g_p(x,ADR,G)        add_expanded_addr0_(x,ADR,G)
+ #define ADD_EXPANDED_G_p(x,ADR,G)        add_expanded_addr_g(x,ADR,G)
+ #define ADD_EXPANDED4_p(x,ADR,FN,COM,GRP) add_expanded_addr_4(x,ADR,FN,COM,GRP)
+ #define ADD_GROUP_p(x,GRP)               add_group_phrase_(x,GRP)
+ #define ADD_TEXTUAL_p(x,TEXTUAL,POS,LEN) add_textual_addr_(x,TEXTUAL,POS,LEN)
+ 
+ 
  
  extern void zero_expanded_address P_((struct expanded_address *x));
  extern void free_expanded_address P_((struct expanded_address *x));
Index: elmME+.2.5.alpha60/hdrs/aliaslib.h
*** elmME+.2.5.alpha54/hdrs/aliaslib.h	Fri Dec 21 13:21:42 2018
--- elmME+.2.5.alpha60/hdrs/aliaslib.h	Sat Aug 28 14:11:45 2021
***************
*** 1,7 ****
! /* $Id: aliaslib.h,v 2.9 2018/12/21 11:21:42 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.9 $   $State: Exp $
   *
   *  Author: Kari Hurtta  (was hurtta+elm@posti.FMI.FI)
   *      or  Kari Hurtta 
--- 1,7 ----
! /* $Id: aliaslib.h,v 2.12 2021/07/14 07:19:22 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.12 $   $State: Exp $
   *
   *  Author: Kari Hurtta  (was hurtta+elm@posti.FMI.FI)
   *      or  Kari Hurtta 
***************
*** 12,17 ****
--- 12,55 ----
  struct address_alias;
  #endif
  
+ /* file chnage information ------------------------------------------------- */
+ 
+ #define FILE_CHANGES_magic	0xF612
+ 
+ extern const struct file_changes {
+     unsigned short magic;     /* FILE_CHANGES_magic */
+ 
+     size_t    self_size;      /* Size of struct file_changes */
+     
+     /* copy some stat information */
+         
+     dev_t     dev;	   /* ID of device containing file */
+     ino_t     ino;         /* inode number */
+     off_t     size;        /* total size, in bytes */
+     time_t    mtime;	   /* time of last modification */
+     
+     unsigned int valid:1;
+ } NULL_file_changes;
+ 
+ #define FILE_CHANGES_INIT     {			\
+ 	    FILE_CHANGES_magic,			\
+ 	    sizeof (struct file_changes),	\
+ 	    0,					\
+ 	    0,					\
+ 	    0,					\
+ 	    0,					\
+ 						\
+ 	    0  /* No valid information */	\
+  }
+ 
+ 
+ extern enum file_changes_result {
+     file_changes_error = -1,
+ 	no_file_changes    = 0,
+ 	have_file_changes } test_file_changes P_((const char *filename,
+ 						  const struct file_changes *old_file,
+ 						  int *errno_res));
+ 
  /* ------------------------------------------------------------------------- */
  
  /* init.c */
***************
*** 23,28 ****
--- 61,69 ----
  extern struct aliases_map      * user_aliases_map;
  extern charset_t                 user_aliases_cs;
  extern struct editor_propline  * user_aliases_pl;
+ extern struct file_changes       user_aliases_change;
+ 
+ extern int                       user_aliases_needwrite;
  
  extern ENUMERATE editor_al_propline;   /* 0 = auto
  					  1 = emacs
***************
*** 39,60 ****
  
  /* aliases operations ------------------------------------------------------ */
  
  extern struct aliases_map * load_aliases_map P_((const char *filename, 
  						 int *errors,
  						 charset_t *fileset,
  						 struct editor_propline 
! 						 **propline));
  
  extern void free_aliases_map P_((struct aliases_map **map));
  
  extern int aliases_map_item_count P_((struct aliases_map *map));
  
! extern void dump_aliases_map P_((FILE *f, struct aliases_map *map,
! 				 FILE *commentfile,
! 				 const char *actor,
! 				 char *version_buff,
! 				 charset_t fileset,
! 				 const struct editor_propline *propline));
  
  /* Creates empty map */
  extern struct aliases_map * new_aliases_map P_((void));
--- 80,117 ----
  
  /* aliases operations ------------------------------------------------------ */
  
+ 
  extern struct aliases_map * load_aliases_map P_((const char *filename, 
  						 int *errors,
  						 charset_t *fileset,
  						 struct editor_propline 
! 						 **propline,
! 						 int *suggest_rewrite,
! 						 struct file_changes *file_information));
! 
! extern int merge_aliases_map P_((const char              * filename,
! 				 FILE                    * f,
! 				 struct aliases_map      * map,
! 				 int                     * errors,
! 				 charset_t               * fileset,
! 				 struct editor_propline ** propline,
! 				 int                     * suggest_rewrite,
! 				 int                     * need_update  /* sets 1 if map was updated */,
! 				 struct file_changes     * file_information
! 				 ));
  
  extern void free_aliases_map P_((struct aliases_map **map));
  
  extern int aliases_map_item_count P_((struct aliases_map *map));
  
! extern int dump_aliases_map P_((FILE *f, struct aliases_map *map,
! 				FILE *commentfile,
! 				const char *actor,
! 				char *version_buff,
! 				charset_t fileset,
! 				const struct editor_propline *propline,
! 				struct file_changes *file_information,
! 				int *errno_res));
  
  /* Creates empty map */
  extern struct aliases_map * new_aliases_map P_((void));
***************
*** 71,77 ****
  			    int idx, const struct string **key));
  
  extern const struct address_alias * 
!   aliases_map_lookup_alias P_((const struct aliases_map *map,
  			       const struct string *key,
  			       int *idx));
  
--- 128,134 ----
  			    int idx, const struct string **key));
  
  extern const struct address_alias * 
!   aliases_map_lookup_alias P_((struct aliases_map *map,
  			       const struct string *key,
  			       int *idx));
  
***************
*** 80,85 ****
--- 137,145 ----
  				     const struct string *key,
  				     const struct address_alias *alias));
  
+ extern int aliases_map_deleted_alias P_((struct aliases_map *map,
+ 					 int idx));
+ 
  extern int aliases_map_remove_alias P_((struct aliases_map *map,
  					const struct string *key));
  
***************
*** 87,93 ****
  extern void aliases_map_remove_index P_((struct aliases_map *map,
  					 int idx));
  
- 
  /* Alias vector operations ------------------------------------------------ */
  
  extern struct alias_vector * new_alias_vector P_((void));
--- 147,152 ----
Index: elmME+.2.5.alpha60/hdrs/conf_writer_imp.h
*** elmME+.2.5.alpha54/hdrs/conf_writer_imp.h	Mon Jul 14 18:07:25 2014
--- elmME+.2.5.alpha60/hdrs/conf_writer_imp.h	Sat Aug 28 14:11:45 2021
***************
*** 1,10 ****
! /* $Id: conf_writer_imp.h,v 2.3 2014/07/14 15:07:25 hurtta Exp $ */
  
  extern struct config_files {
!     char * shortname;
!     char *fname;
!     dump_conf_map_f * dump_map;
!     dump_message_f  * write_message;
  }          * cfiles;
  extern int   cfiles_num;
  
--- 1,12 ----
! /* $Id: conf_writer_imp.h,v 2.5 2021/07/13 07:58:36 hurtta Exp $ */
  
  extern struct config_files {
!     char             * shortname;
!     char             * fname;
!     dump_conf_map_f  * dump_map;
!     dump_message_f   * write_message;
!     int              * rewrite_flag;
!     merge_conf_map_f * merge_map;
  }          * cfiles;
  extern int   cfiles_num;
  
Index: elmME+.2.5.alpha60/hdrs/connection_imp.h
*** elmME+.2.5.alpha54/hdrs/connection_imp.h	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/hdrs/connection_imp.h	Thu May 26 11:16:29 2022
***************
*** 1,7 ****
! /* $Id: connection_imp.h,v 2.40 2021/04/14 17:57:44 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.40 $
   *
   *  Author: Kari Hurtta  (was hurtta+elm@posti.FMI.FI)
   *       or Kari Hurtta 
--- 1,7 ----
! /* $Id: connection_imp.h,v 2.42 2022/02/13 18:10:15 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.42 $
   *
   *  Author: Kari Hurtta  (was hurtta+elm@posti.FMI.FI)
   *       or Kari Hurtta 
***************
*** 15,23 ****
  
  	       /* NOTE: no PORT_smtps = 465 because
  		        this registeration is revoked
  	       */
  
! 	       PORT_submission = 587,
  	       
  	       PORT_imaps = 993, PORT_pop3s = 995     
  } PORTS;
--- 15,26 ----
  
  	       /* NOTE: no PORT_smtps = 465 because
  		        this registeration is revoked
+ 
+                         also PORT_submissions replaces this
  	       */
  
! 	       PORT_submissions = 465,
! 	       PORT_submission = 587, 
  	       
  	       PORT_imaps = 993, PORT_pop3s = 995     
  } PORTS;
***************
*** 116,121 ****
--- 119,125 ----
  #define SE_require_tls_name (1<<9)
  #define SE_given_name_port  (1<<10)
  #define SE_rescan_name_port (1<<11)
+ #define SE_nouse_tls_checks (1<<12)
  
  #ifdef ANSI_C
  struct     SE_option;
***************
*** 241,248 ****
--- 245,287 ----
  extern const char * service_type_name P_((const struct service_type *st));
  extern const struct service_type * service_type_from_name 
     P_((const char *ascii_name));
+ extern PORTS service_type_defport P_((const struct service_type *st));
+ 
+ /* Increments refcount */
+ extern struct service_entry *convert_service_entry P_(( struct service_entry *source,
+ 							const struct service_type * st));
  
  
+ #define ENUM_SERVICE_TYPE_magic 0xF921
+ 
+ extern const struct enum_service_type {
+     unsigned short       magic;    /* ENUM_SERVICE_TYPE_magic */
+     
+     int                   idx;
+     enum init_tls_pass {
+ 	no_init_tls      = -1,
+ 	init_tls_default = 0,
+ 	try_Implicit_TLS,
+ 	try_no_init_tls, 
+ 	NUM_init_tls_pass
+     }                      tls_idx;
+     int                    mask_idx;
+     int                    any_mask;
+     const int            * mask_list;
+     int                    require_mask;
+ } NULL_enum_service_type;
+ 
+ extern  void init_enum_service_type P_((struct enum_service_type *est,
+ 					enum init_tls_pass        start_tls_idx,
+ 					int                       any_mask,
+ 					int                       require_mask));
+ extern  void init_enum_service_list P_((struct enum_service_type * est,
+ 					enum init_tls_pass        start_tls_idx,
+ 					const int                * mask_list,
+ 					int                       require_mask));
+ 
+ extern const struct service_type * enumerate_service_type P_((struct enum_service_type *est));
+ 
  enum initial_tls_flag { itls_ignore  = -1,
  			itls_disable = 0,
  			itls_require = 1 };
***************
*** 492,497 ****
--- 531,552 ----
  									 cancelable */
  				      ));
  
+ 
+ extern int connect_remote_account_2 P_((struct remote_account      * ra,
+ 					struct service_entry       * initial_se,
+ 					struct cancel_data *main_cancel
+ 					/* Used if  dns lookup was  
+ 					   cancelable */                ,
+ 					
+ 					struct service_entry      ** result_se
+ 					/* Increments refcount   */     ,
+ 					const struct service_type ** got_type,
+ 					int                        * got_port,
+ 					
+ 					
+ 					/* For enumerate_service_type */
+ 					struct enum_service_type *est));
+ 
  /* -1 == name not found or bad syntax
      0 == not a remote address
      1 == name found 
Index: elmME+.2.5.alpha60/hdrs/cs_imp.h
*** elmME+.2.5.alpha54/hdrs/cs_imp.h	Tue May 12 21:18:18 2020
--- elmME+.2.5.alpha60/hdrs/cs_imp.h	Sat Aug 28 14:11:45 2021
***************
*** 1,7 ****
! /* $Id: cs_imp.h,v 2.10 2020/05/12 18:18:18 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.10 $   $State: Exp $
   *
   *  Author: Kari Hurtta  
   *                  (was hurtta+elm@posti.FMI.FI, hurtta+elm@ozone.FMI.FI)
--- 1,7 ----
! /* $Id: cs_imp.h,v 2.11 2021/07/07 07:56:36 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.11 $   $State: Exp $
   *
   *  Author: Kari Hurtta  
   *                  (was hurtta+elm@posti.FMI.FI, hurtta+elm@ozone.FMI.FI)
***************
*** 29,34 ****
--- 29,38 ----
      unsigned short          magic;  
      charset_t        string_type;    
  
+     int                  refcount;    /* Used by  struct string_sort */
+     
+ 
+     
      /* Can't remove str_private_data, because string_len()
         takes constant argument, but string is needed to 
         be compressed 
***************
*** 36,41 ****
--- 40,47 ----
      struct str_private_data   * p;
  };
  
+ extern void inc_string_refcount P_((struct string *s));
+ 
  /* -------------------------------------------------------- */
  
  typedef void cs_init_string P_((struct string *str));
***************
*** 122,128 ****
  typedef unsigned char cs_give_bytecode_from_string P_((const struct string *str,
  						       int pos, int *found));
  
- 
  /* Return 1 if supported */
  typedef enum digest_feed_mode {
      digest_feed_fallback_stream  = -1,
--- 128,133 ----
***************
*** 132,137 ****
--- 137,161 ----
  				 const struct string *s));
  
  
+ struct string_unicode_vector {
+ 
+     uint16 * vector;
+     size_t   vector_len;
+     size_t   first_failure;  /* position of first unknwon character,
+ 				if first_failure == vector_len
+ 				then alla character are known */
+ };
+ 
+ typedef enum unicode_vector_mode {
+     unicode_vector_fail   = -1,   /* Returns fails if there is at least one unknown
+ 				     character */				     
+     unicode_vector_empty  = 0,
+     unicode_vector_done          /* Have valid vector but see first_failure */
+ } cs_unicode_vector_from_string P_((struct string_unicode_vector *ret,
+ 				    const struct string *s,
+ 				    int *errcount));
+ 
+ 
  extern struct  charset_type {
      const   char                  * type_name;
      cs_init_string                * cs_init_it;
***************
*** 165,170 ****
--- 189,196 ----
      cs_iso2022_info_set           * cs_iso2022_info_set_it;
      cs_give_bytecode_from_string  * cs_give_bytecode_from_it;
      cs_digest_feed_from_string    * cs_digest_feed_from_s_it;
+     cs_unicode_vector_from_string * cs_unicode_vector_from_it;
+     
      
      struct  charset_type    * next_type;
  			    
***************
*** 178,188 ****
  
  #if ANSI_C
  extern cs_digest_feed_from_string cs_digest_feed_from_null;
  #endif
  extern enum digest_feed_mode cs_digest_feed_from_null P_((struct digest_proc * ret,
  							  const struct string *s));
! 
! 
  
  #if defined(WCHAR) && defined(__STDC_ISO_10646__)
  extern void change_system_charset P_((void));
--- 204,222 ----
  
  #if ANSI_C
  extern cs_digest_feed_from_string cs_digest_feed_from_null;
+ extern cs_unicode_vector_from_string cs_unicode_vector_from_default;
+ extern cs_unicode_vector_from_string cs_unicode_vector_from_null;
  #endif
  extern enum digest_feed_mode cs_digest_feed_from_null P_((struct digest_proc * ret,
  							  const struct string *s));
! extern enum unicode_vector_mode cs_unicode_vector_from_default
!     P_((struct string_unicode_vector *ret,
! 	const struct string *s,
! 	int *errcount));
! extern enum unicode_vector_mode cs_unicode_vector_from_null
!     P_((struct string_unicode_vector *ret,
! 	const struct string *s,
! 	int *errcount));
  
  #if defined(WCHAR) && defined(__STDC_ISO_10646__)
  extern void change_system_charset P_((void));
***************
*** 208,213 ****
--- 242,248 ----
  
  struct str_private_data {
      unsigned short       magic;          /* CS_str_magic    */
+ 
      int len;
      struct charset_state *state;
      int private_flag;
***************
*** 222,227 ****
--- 257,263 ----
      char                *lang;
  };
  
+ 
  struct state_utf8 {
      unsigned char  bytes;
      unsigned char  idx;
Index: elmME+.2.5.alpha60/hdrs/defs_major.h
*** elmME+.2.5.alpha54/hdrs/defs_major.h	Fri May  6 19:57:03 2016
--- elmME+.2.5.alpha60/hdrs/defs_major.h	Sat Aug 28 14:11:45 2021
***************
*** 1,7 ****
! /* $Id: defs_major.h,v 2.12 2016/05/06 16:57:03 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.12 $   $State: Exp $
   *
   *  Modified by: Kari Hurtta 
   *                       (was hurtta+elm@posti.FMI.FI, hurtta+elm@ozone.FMI.FI)
--- 1,7 ----
! /* $Id: defs_major.h,v 2.13 2021/07/13 07:58:36 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.13 $   $State: Exp $
   *
   *  Modified by: Kari Hurtta 
   *                       (was hurtta+elm@posti.FMI.FI, hurtta+elm@ozone.FMI.FI)
***************
*** 130,136 ****
  
  #endif
  
- 
  /*
   * Local Variables:
   *  mode:c
--- 130,135 ----
Index: elmME+.2.5.alpha60/hdrs/elm_defs.h
*** elmME+.2.5.alpha54/hdrs/elm_defs.h	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/hdrs/elm_defs.h	Thu May 26 11:16:29 2022
***************
*** 1,7 ****
! /* $Id: elm_defs.h,v 2.40 2021/01/06 10:41:07 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.40 $   $State: Exp $
   *
   *  Author: Kari Hurtta  (was hurtta+elm@posti.FMI.FI)
   *       or Kari Hurtta 
--- 1,7 ----
! /* $Id: elm_defs.h,v 2.44 2022/01/03 13:20:21 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.44 $   $State: Exp $
   *
   *  Author: Kari Hurtta  (was hurtta+elm@posti.FMI.FI)
   *       or Kari Hurtta 
***************
*** 53,58 ****
--- 53,59 ----
  #define default_folders		"Mail"
  #define default_recvdmail	"=received"
  #define default_sentmail	"=sent"
+ #define default_dsnmail         "=dsn"
  #define DEFAULT_TO_CHARS       " TC*L"
  
  #if 0              /* XXX not used yet */
***************
*** 332,357 ****
  /* message sorting selections */
  
  #define REVERSE		-		/* for reverse sorting           */
! #define SENT_DATE	1		/* the date message was sent     */
! #define RECEIVED_DATE	2		/* the date message was received */
! #define SENDER		3		/* the name/address of sender    */
! #define SIZE		4		/* the # of lines of the message */
! #define SUBJECT		5		/* the subject of the message    */
! #define STATUS		6		/* the status (deleted, etc)     */
! #define MAILBOX_ORDER	7		/* the order it is in the file   */
! #define THREAD          8               /* thread order (date sent/subject */
  
  /* alias sorting selections */
  
! #define ALIAS_SORT	1		/* the name of the alias         */
! #define NAME_SORT	2		/* the actual name for the alias */
! #define TEXT_SORT	3		/* the order of aliases.text     */
  #define LAST_ALIAS_SORT	TEXT_SORT
  
! 
! #define NO		0
! #define YES		1
! #define MAYBE		2		/* a definite define, eh?  */
  
  #define	NO_TITE		2		/* ti/te or in flag 	   */
  
--- 333,364 ----
  /* message sorting selections */
  
  #define REVERSE		-		/* for reverse sorting           */
!     
! enum msg_sort_type {
!     SENT_DATE =		1		/* the date message was sent     */,
!     RECEIVED_DATE =	2		/* the date message was received */,
!     SENDER =		3		/* the name/address of sender    */,
!     SIZE =		4		/* the # of lines of the message */,
!     SUBJECT =		5		/* the subject of the message    */,
!     STATUS =		6		/* the status (deleted, etc)     */,
!     MAILBOX_ORDER =	7		/* the order it is in the file   */,
!     THREAD =         	8               /* thread order (date sent/subject */
! };
  
  /* alias sorting selections */
  
! enum alias_sort_type {
!     ALIAS_SORT =	1		/* the name of the alias         */,
!     NAME_SORT =		2		/* the actual name for the alias */,
!     TEXT_SORT =	 3		/* the order of aliases.text     */
! };
  #define LAST_ALIAS_SORT	TEXT_SORT
  
! enum no_yes {
!     NO =		0,
!     YES	=		1,
!     MAYBE =		2		/* a definite define, eh?  */
! };
  
  #define	NO_TITE		2		/* ti/te or in flag 	   */
  
***************
*** 380,386 ****
  static char copyright[] FORIDENT = "\
  @(#)          (C) Copyright 1986,1987, Dave Taylor\n\
  @(#)          (C) Copyright 1988-1995, The Usenet Community Trust\
! @(#)          (C) Copyright 1996-2021, Kari Hurtta\n";
  
  #else
  # define INIT(X)
--- 387,393 ----
  static char copyright[] FORIDENT = "\
  @(#)          (C) Copyright 1986,1987, Dave Taylor\n\
  @(#)          (C) Copyright 1988-1995, The Usenet Community Trust\
! @(#)          (C) Copyright 1996-2022, Kari Hurtta\n";
  
  #else
  # define INIT(X)
***************
*** 486,491 ****
--- 493,522 ----
  #include "elmlib.h"
  
  
+ /* ------------------------------------------------------------------------ */
+ 
+ /* hdrs/filelock.h and hdrs/misclib.h */
+ 
+ enum FLOCKING_status {
+     FLOCKING_FAIL  = -1,
+     FLOCKING_OK    = 0,
+     FLOCKING_RETRY = 1,
+     FLOCKING_UNSUPPORTED  = 2   /* Not locked (dotlock?) */
+ }; 
+ 
+ enum FLOCKING_mode {
+     FLOCKING_release   = -1,
+     FLOCKING_exclusive = 0  /* excluside or read/write lock */,
+     FLOCKING_shared    = 1  /* shared or read-only log */
+ };
+ 
+ enum FLOCKING_blocking {
+     FLOCKING_interrupt = -1 /* called from interrupt handler */,
+     FLOCKING_non_block = 0,
+     FLOCKING_block = 1
+ };
+ 
+ 
  /*
   * Local Variables:
   *  mode:c
Index: elmME+.2.5.alpha60/hdrs/elmlib.h
*** elmME+.2.5.alpha54/hdrs/elmlib.h	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/hdrs/elmlib.h	Fri Sep  2 20:38:19 2022
***************
*** 1,7 ****
! /* $Id: elmlib.h,v 2.155 2021/01/23 20:39:30 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.155 $   $State: Exp $
   *
   *  Author: Kari Hurtta  
   *                  (was hurtta+elm@posti.FMI.FI, hurtta+elm@ozone.FMI.FI)
--- 1,7 ----
! /* $Id: elmlib.h,v 2.172 2022/08/19 16:13:04 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.172 $   $State: Exp $
   *
   *  Author: Kari Hurtta  
   *                  (was hurtta+elm@posti.FMI.FI, hurtta+elm@ozone.FMI.FI)
***************
*** 101,120 ****
  extern char *strmcpy P_((char *, const char *));
  extern char *strmcat P_((char *, const char *));
  
! /* safeopen.c */
  
! extern FILE *safeopen P_((char *));
! extern FILE *safeopen_rdwr P_((char *));
  
! /* istrcmp.c */
  
  extern int istrcmp P_((const char *, const char *));
  
! /* add_site.c */
! 
! extern int add_site P_((char *, char *, char *, int));
! 
! /* atonum.c */
  
  /*
   * This is similar to atoi(), but it complains if the string
--- 101,116 ----
  extern char *strmcpy P_((char *, const char *));
  extern char *strmcat P_((char *, const char *));
  
! /* lib/safeopen.c */
  
! extern FILE *safeopen P_((char *name,int *errno_res));
! extern FILE *safeopen_rdwr P_((char *name,int *errno_res));
  
! /* lib/istrcmp.c */
  
  extern int istrcmp P_((const char *, const char *));
  
! /* lib/atonum.c */
  
  /*
   * This is similar to atoi(), but it complains if the string
***************
*** 125,155 ****
  
  extern int atonum P_((const char *));
  
- /* aliasdb.c */
- 
- /* fetch_alias */
- 
- #if ANSI_C
- struct dbz;
- #endif
- extern char *next_addr_in_list P_((char **));
- extern struct alias_rec *fetch_alias P_((struct dbz *db, char *alias));
- 
- 
- /* can_access.c */
- /* I don't understand this routine! access -system call uses
-  * real uid / gid anyway!!!!!!!!!!!!!!
-  *
-  *                                - K E H 
-  */
  
! extern int can_access P_((char *,int));
! 
! /* can_open.c */
  
  extern int can_open P_((const char *, const char *));
  
! /* chloc.c */
  
  /* Is this really needed? This does same than strchr or index, except
   *  that return type is different.
--- 121,132 ----
  
  extern int atonum P_((const char *));
  
  
! /* lib/can_open.c */
  
  extern int can_open P_((const char *, const char *));
  
! /* lib/chloc.c */
  
  /* Is this really needed? This does same than strchr or index, except
   *  that return type is different.
***************
*** 163,169 ****
  extern int chloc  P_((const char *,int));
  extern int qchloc P_((const char *, int));
  
! /* date_util.c */
  
  extern int cvt_dayname_to_daynum     P_((char *,int *));
  extern int cvt_monthname_to_monthnum P_((char *,int *));
--- 140,146 ----
  extern int chloc  P_((const char *,int));
  extern int qchloc P_((const char *, int));
  
! /* lib/date_util.c */
  
  extern int cvt_dayname_to_daynum     P_((char *,int *));
  extern int cvt_monthname_to_monthnum P_((char *,int *));
***************
*** 175,181 ****
  extern long make_gmttime             P_((int, int, int, int, int, int));
  
  
! /* delay_unlink.c */
  
  extern struct delay_unlink * alloc_delay_unlink P_((const char *name,
  						    int fd,
--- 152,158 ----
  extern long make_gmttime             P_((int, int, int, int, int, int));
  
  
! /* lib/delay_unlink.c */
  
  extern struct delay_unlink * alloc_delay_unlink P_((const char *name,
  						    int fd,
***************
*** 234,252 ****
  } digest_proc_equal P_((const struct digest_proc *ptr1,
  			const struct digest_proc *ptr2));
  
! /* dynarray.c */
  
  extern void ** DynamicArray P_((void **p, int record_size, int *max, int n));
  extern void DestroyDynamicArray P_((void **p));
  
! /* errno.c */
  
  #ifndef STRERROR
  char *strerror P_((int errnumber));
  #endif
  
  
! /* expand.c */
  
  extern int expand P_((char *, int));
  extern int expand_env P_((char *dest, const char *src,unsigned destlen));
--- 211,229 ----
  } digest_proc_equal P_((const struct digest_proc *ptr1,
  			const struct digest_proc *ptr2));
  
! /* lib/dynarray.c */
  
  extern void ** DynamicArray P_((void **p, int record_size, int *max, int n));
  extern void DestroyDynamicArray P_((void **p));
  
! /* lib/errno.c */
  
  #ifndef STRERROR
  char *strerror P_((int errnumber));
  #endif
  
  
! /* lib/expand.c */
  
  extern int expand P_((char *, int));
  extern int expand_env P_((char *dest, const char *src,unsigned destlen));
***************
*** 259,275 ****
  */
  extern int expand_path P_((char *dest, const char *src, unsigned destlen)); 
  
! /* gcos_name.c */
  
  extern char * gcos_name          P_((const char *gcos_field, 
  				     const char *logname));
  
! /* get_tz.c */
  
  extern int get_tz_mins   P_((time_t tval));
  extern const char *get_tz_name P_((const struct tm *));
  
! /* getaddr.c */
  
  extern void free_rfc822tokenized   P_((char **res));
  /* Removes comments from vector: */
--- 236,252 ----
  */
  extern int expand_path P_((char *dest, const char *src, unsigned destlen)); 
  
! /* lib/gcos_name.c */
  
  extern char * gcos_name          P_((const char *gcos_field, 
  				     const char *logname));
  
! /* lib/get_tz.c */
  
  extern int get_tz_mins   P_((time_t tval));
  extern const char *get_tz_name P_((const struct tm *));
  
! /* lib/getaddr.c */
  
  extern void free_rfc822tokenized   P_((char **res));
  /* Removes comments from vector: */
***************
*** 281,287 ****
  struct string;
  #endif
  
- 
  extern void look_special_tokens P_((char **tokenized,
  				   const char *tok_chars,
  				   int start, int *ended,
--- 258,263 ----
***************
*** 291,297 ****
  extern struct string * scanned_to_phrase P_((char **scanned,
  					     int demime, charset_t set));
  
! /* getarpdate.c */
  
  extern char * get_arpa_date P_((void));
  
--- 267,273 ----
  extern struct string * scanned_to_phrase P_((char **scanned,
  					     int demime, charset_t set));
  
! /* lib/getarpdate.c */
  
  extern char * get_arpa_date P_((void));
  
***************
*** 306,319 ****
  extern char * get_fullname1 P_((struct passwd *P,const char *logname));
  extern char * get_full_name P_((char *));
  
! /* in_string.c */
  
  /* Is that needed? This is almost same as strstr (except return type).
   *                                     - K E H  
   */
  extern int in_string P_((const char *, const char *));
  
! /* ldstate.c */
  
  struct folder_view {
      int         mailbox_number;
--- 282,295 ----
  extern char * get_fullname1 P_((struct passwd *P,const char *logname));
  extern char * get_full_name P_((char *));
  
! /* lib/in_string.c */
  
  /* Is that needed? This is almost same as strstr (except return type).
   *                                     - K E H  
   */
  extern int in_string P_((const char *, const char *));
  
! /* lib/ldstate.c */
  
  struct folder_view {
      int         mailbox_number;
***************
*** 357,367 ****
  
  extern int load_folder_state_file P_((struct folder_state *fst));
  
! /* len_next.c */
  
  extern int len_next_part P_((const char *));
  
! /* mail_gets.c */
  
  extern int mail_gets P_((char *buffer,size_t size,FILE *mailfile));
  
--- 333,343 ----
  
  extern int load_folder_state_file P_((struct folder_state *fst));
  
! /* lib/len_next.c */
  
  extern int len_next_part P_((const char *));
  
! /* lib/mail_gets.c */
  
  extern int mail_gets P_((char *buffer,size_t size,FILE *mailfile));
  
***************
*** 377,389 ****
  extern int malloc_gets P_((char **buffer, int limit, FILE *mailfile));
  
  
! /* okay_address.c */
  
  extern int compare_helper P_((const char *A, const char *pat,
  			      int ignore_case));
  
  
! /* opt_utils.c */
  
  /* Returns -1 on failure! */
  extern int gethostdomain P_((char *hostdom,int size, int global_mode));
--- 353,365 ----
  extern int malloc_gets P_((char **buffer, int limit, FILE *mailfile));
  
  
! /* lib/okay_addr.c */
  
  extern int compare_helper P_((const char *A, const char *pat,
  			      int ignore_case));
  
  
! /*lib/opt_utils.c  */
  
  /* Returns -1 on failure! */
  extern int gethostdomain P_((char *hostdom,int size, int global_mode));
***************
*** 423,429 ****
  #define compile_ELM_GETOPT
  #endif
  
! /* posixsig.c */
  
  #ifdef POSIX_SIGNALS
  extern SIGHAND_TYPE (*posig_signal  P_((int, 
--- 399,405 ----
  #define compile_ELM_GETOPT
  #endif
  
! /* lib/posixsig.c */
  
  #ifdef POSIX_SIGNALS
  extern SIGHAND_TYPE (*posig_signal  P_((int, 
***************
*** 440,462 ****
  extern int my_wait P_((int pid, S__ *statptr)); 
  extern int convert_status P_((S__ status,int *exit_code));
  
! /* putenv.c */
  #ifndef PUTENV
  extern int putenv   P_((char *));
  #endif
  
! /* qstrings.c */
  
  extern char       *qstrpbrk   P_((char *, const char *));
  extern const char *qstrpbrk_c P_((const char *, const char *));
  extern int qstrspn      P_((char *, char *));
  extern int qstrcspn     P_((char *, char *));
  
! /* reverse.c */
  
  extern void reverse P_((char *));
  
! /* safemalloc.c */
  
  extern void dflt_safe_malloc_fail_handler P_((char *proc,size_t len));
  extern void (*safe_malloc_fail_handler)   P_((char *proc,size_t len));
--- 416,438 ----
  extern int my_wait P_((int pid, S__ *statptr)); 
  extern int convert_status P_((S__ status,int *exit_code));
  
! /* lib/putenv.c  */
  #ifndef PUTENV
  extern int putenv   P_((char *));
  #endif
  
! /* lib/qstrings.c */
  
  extern char       *qstrpbrk   P_((char *, const char *));
  extern const char *qstrpbrk_c P_((const char *, const char *));
  extern int qstrspn      P_((char *, char *));
  extern int qstrcspn     P_((char *, char *));
  
! /* lib/reverse.c */
  
  extern void reverse P_((char *));
  
! /* lib/safemalloc.c */
  
  extern void dflt_safe_malloc_fail_handler P_((char *proc,size_t len));
  extern void (*safe_malloc_fail_handler)   P_((char *proc,size_t len));
***************
*** 487,497 ****
  /* Maximun possible value for size_t  */
  extern const size_t size_MAX;     /* SIZE_MAX if defined */
  
! /* shiftlower.c */
  
  extern char *shift_lower     P_((const char *));
  
! /* strfcpy.c */
  
  extern char *strfcpy P_((char *, const char *, int));
  extern char *strfcat P_((char *, const char *, int));
--- 463,580 ----
  /* Maximun possible value for size_t  */
  extern const size_t size_MAX;     /* SIZE_MAX if defined */
  
! /* lib/shiftlower.c */
  
  extern char *shift_lower     P_((const char *));
  
! 
! /* lib/sortlist.c */
! 
! union sort_item {
!     void                    * dummy;
!     struct resolv_cache     * resolv;
!     struct uidl_entry       * uidl;
!     struct aliases_map_node * aliases;
!     struct thread_name      * thread_name;    
! };
! 
! union sort_key {
!     const void         * dummy;
!     const char         * str;
!     struct string_sort * string_sort;
!     
! };
! 
! union sort_item_default {
!     void                          * dummy;
!     const struct uidl_entry_def   * uidl;
!     const struct aliases_node_def * aliases;
! };
! 
! typedef void alloc_sort_item_f P_((union sort_item             * res,
! 				   const union sort_key          key,
! 				   const union sort_item_default def
! 				   ));
! typedef void free_sort_item_f  P_((union sort_item      * ptr)); /* Decrements refcount */
! 
! typedef void inc_sort_item_refcount_f P_((union sort_item item));
! 
! /* caller must free string */
! typedef struct string * sort_item_debug_name_f P_((const union sort_item item));
! typedef struct string * sort_key_debug_name_f  P_((const union sort_key key));
! 
! /* If NULL key is possible, compare_sort_key_to_item_f should support them !! */
! 
! typedef int compare_sort_key_to_item_f P_((const union sort_key key,
! 					   const union sort_item item));
! 
! #define SORT_OPERATION_magic 0xE600
! 
! struct sort_operation {
!     unsigned short magic; 	/* SORT_OPERATION_magic */
! 
!     alloc_sort_item_f          * alloc_item;
!     free_sort_item_f           * free_item;
!     inc_sort_item_refcount_f   * inc_item_refcount;
!     sort_item_debug_name_f     * item_name;
!     
!     compare_sort_key_to_item_f * cmp_key_item;
! 
!     /* KEY operations */
!     sort_key_debug_name_f      * key_name;
!     
! };
! 
! extern struct sortlist * alloc_sort_list P_((const struct sort_operation * op,
! 					     size_t  prealloc));
! extern void free_sort_list P_((struct sortlist ** sortlist));
! extern size_t sort_list_len P_((struct sortlist * sortlist));
! 
! enum sort_list_get_op {
!     sort_list_get_normal = 0,
!     sort_list_get_remove = 2  /* moves indexes when removed */
! };
! 
! /* increments refcount */
! extern void get_sort_list_item P_((struct sortlist     * sortlist,
! 				   enum sort_list_get_op op,
! 				   size_t                idx,
! 				   union sort_item     * res));
! 
! /* caller must free string */
! extern struct string  * get_sort_list_debug_name P_((struct sortlist     * sortlist,
! 						     size_t                idx));
! 
! enum sort_list_search_op {
!     sort_list_search_normal = 0,
!     sort_list_search_create,     /* moves indexes when created */
!     sort_list_search_remove = 2, /* removes item from sort list, if found */
!                                  /* moves indexes when removed */
! 
!     sort_list_insert_hint        /* Hive hint *res_idx to where add
! 				    new index -- used when reading
! 				    from ordered file
! 				 */
! };
! 
! /* Increments refcount, returns 1 if found */
! extern int search_sort_list_item P_((struct sortlist             * sortlist,
! 				     enum sort_list_search_op      op,
! 				     const union sort_key          key,
! 				     const union sort_item_default def,
! 				     union sort_item             * res,
! 				     size_t                      * res_idx,
! 				     int                         * append_need_rewrite
! 				     ));
! 
! extern void prealloc_sort_list P_((struct sortlist * sortlist,
! 				  size_t  prealloc));
! 
! 
! 
! 
! 
! /* lib/strfcpy.c */
  
  extern char *strfcpy P_((char *, const char *, int));
  extern char *strfcat P_((char *, const char *, int));
***************
*** 499,505 ****
                            int *produced));
  
  
! /* strincmp.c */
  
  /* Is this needed? This is same than strncasecmp 
   *        - K E H 
--- 582,588 ----
                            int *produced));
  
  
! /* lib/strincmp.c */
  
  /* Is this needed? This is same than strncasecmp 
   *        - K E H 
***************
*** 507,518 ****
  
  extern int strincmp P_((const char *, const char *, int));
  
! /* striparens.c */
  
  extern char *strip_parens P_((const char *s));
  extern char *get_parens   P_((const char *s));
  
! /* strstr.c */
  
  /* Why there is both in_string and strstr????
   *     - K E H 
--- 590,601 ----
  
  extern int strincmp P_((const char *, const char *, int));
  
! /* lib/striparens.c */
  
  extern char *strip_parens P_((const char *s));
  extern char *get_parens   P_((const char *s));
  
! /* lib/strstr.c */
  
  /* Why there is both in_string and strstr????
   *     - K E H 
***************
*** 796,801 ****
--- 879,899 ----
  extern void  digest_feed_string P_((struct digest_proc * ret,
  				  const struct string *s));
  
+ 
+ /* lib/string_sort.c */
+ 
+ extern struct string_sort * new_string_sort P_((struct string *s));
+ extern void free_string_sort P_((struct string_sort **ptr));
+ extern int string_sort_cmp P_((const struct string_sort *ptr1,
+ 			       const struct string_sort *ptr2));
+ 
+ /* Increments refcount, caller must call free_string() */
+ extern struct string * give_string_from_string_sort P_((struct string_sort *ptr));
+ 
+ 
+ extern void inc_string_sort_refcount P_((struct string_sort *ptr));
+ 
+ 
  /* lib/pager_range.c */
  
  #ifdef ANSI_C
***************
*** 1120,1125 ****
--- 1218,1225 ----
  
  extern const int CHOWN_neg1;    /* Set if CHOWN_NEG1 defined   */
  
+ extern const char dsn_mail_tag[]; /* [dsn] */
+ 
  /* *** Read from elmrc: */
  
  extern int  add_irt_phrase;     /* In-reply-to: Add phare to in-reply-to ?
***************
*** 1219,1226 ****
                     PGP_NUM };
  extern ENUMERATE send_pgp_version; /* preferred pgp version*/
  
! struct string * attribution_s;    /* attribution string for replies     */
! struct string * fwdattribution_s; /* attribution string for forwarded mssgs */
  
  enum auto_attachment_v { 
      auto_attachment_none        = 0,
--- 1319,1326 ----
                     PGP_NUM };
  extern ENUMERATE send_pgp_version; /* preferred pgp version*/
  
! extern struct string * attribution_s;    /* attribution string for replies     */
! extern struct string * fwdattribution_s; /* attribution string for forwarded mssgs */
  
  enum auto_attachment_v { 
      auto_attachment_none        = 0,
***************
*** 1296,1301 ****
--- 1396,1403 ----
  					     2 = New
  					   */
  
+ extern FLAGS conf_merge_locking;
+ 
  extern char config_options[SLEN];	/* which options are in o)ptions */
  extern int  confirm_append;	/* flag: confirm append to folder?    */
  extern int  confirm_create;	/* flag: confirm create new folder?   */
***************
*** 1313,1318 ****
--- 1415,1423 ----
  extern char raw_display_charset[SLEN];
  extern charset_t wanted_display_charset; /* name of character set */
  extern int DSN_success;         /* flag: Ask successfull DSNes      */
+ 
+ extern ESTR dsn_mail_e;	        /* folder for storing DSN mail	*/
+ 
  extern char e_editor[SLEN];	/* "~e" editor...   */
  
  enum editor_keyword { editor_kw_NO   = 0,
***************
*** 1481,1488 ****
  
  extern int mail_permissions;	/* int: permissions for mailbox files   */
  extern PATH mailcap_bl_programs; /* Do not execute program or call metamail */
  
! extern int mailcap_tempfile_lifetime;  /* Time (seconds) to keep mailcap temorary files */
  extern int mini_menu_rc;	/* flag: display menu?     	      */
  
  enum message_hide_v { 
--- 1586,1596 ----
  
  extern int mail_permissions;	/* int: permissions for mailbox files   */
  extern PATH mailcap_bl_programs; /* Do not execute program or call metamail */
+ extern int mailcap_select_other; /* flag: Show o)ther alternative on 
+ 				    "Mailcap program selection" ? 
+ 				 */
  
! extern int mailcap_tempfile_lifetime;  /* Time (seconds) to keep mailcap temporary files */
  extern int mini_menu_rc;	/* flag: display menu?     	      */
  
  enum message_hide_v { 
***************
*** 1714,1719 ****
--- 1822,1840 ----
  				      */
  
  extern int  use_tite;		/* flag: use termcap/terminfo ti/te?  */
+ 
+ /* This requires USE_DLOPEN and REMOTE_MBX */
+ enum use_tls_v {
+     use_tls_implicit,
+     use_tls_starttls,
+     use_tls_verify_cert,
+     use_tls_require_name,
+     use_tls_display_host,
+     NUM_use_tls_v
+ };
+ extern FLAGS use_tls;
+ 
+ 
  extern int utf7_encode_optional; /* flag: Should utf7 optional direct 
  				    characters to be encoded?        */
  
***************
*** 2064,2072 ****
--- 2185,2201 ----
  						   int * err_p
  						   ));
  
+ 
+ 
  /* Returns 1 if action or timeout occured          */
  extern enum wait_for_status wait_for_action_or_timeout P_((action_routine * action,
  							   int seconds));
+ 
+ extern enum wait_for_status wait_for_action_or_timeout_f P_((action_routine * action,
+ 							     int seconds /* -1 no timeout */,
+ 							     int   wait_flags,
+ 							     int * err_p));
+ 
  extern enum wait_for_status wait_for_any_action_or_timeout P_((int seconds));
  
  extern enum wait_for_status wait_for_action_c P_((action_routine * action,  struct cancel_data *cd));
***************
*** 2270,2285 ****
      if (x.active == -1) debug_level_check(&x); \
      if (x.active > 0 && !x.header_printed) debug_file_header(&x); \
  } while(0)
! #define DEBUG_CHECK(x,level) (x.active >= level)
  
  #define DPRINT(x,level,action) do { \
      if (x.active == -1) debug_level_check(&x); \
      if (x.active > 0 && !x.header_printed) debug_file_header(&x); \
!     if (x.active >= level) debug_action_call action; \
  } while(0)
  
  #define SIGDPRINT(x,level,action) do { \
!     if (x.active >= level) debug_action_sigcall action; \
  } while(0)
  
  void debug_print_buffer P_((struct debug_struct *a, int len, unsigned char *str));
--- 2399,2414 ----
      if (x.active == -1) debug_level_check(&x); \
      if (x.active > 0 && !x.header_printed) debug_file_header(&x); \
  } while(0)
! #define DEBUG_CHECK(x,level) (x.active >= (level))
  
  #define DPRINT(x,level,action) do { \
      if (x.active == -1) debug_level_check(&x); \
      if (x.active > 0 && !x.header_printed) debug_file_header(&x); \
!     if (x.active >= (level)) debug_action_call action;		  \
  } while(0)
  
  #define SIGDPRINT(x,level,action) do { \
!     if (x.active >= (level)) debug_action_sigcall action;	\
  } while(0)
  
  void debug_print_buffer P_((struct debug_struct *a, int len, unsigned char *str));
***************
*** 2287,2293 ****
  #define DEBUG_PRINT_BUFFER(x,level,len,str) do { \
      if (x.active == -1) debug_level_check(&x); \
      if (x.active > 0 && !x.header_printed) debug_file_header(&x); \
!     if (x.active >= level) debug_print_buffer(&x,len,str); \
  } while(0)
  
  
--- 2416,2422 ----
  #define DEBUG_PRINT_BUFFER(x,level,len,str) do { \
      if (x.active == -1) debug_level_check(&x); \
      if (x.active > 0 && !x.header_printed) debug_file_header(&x); \
!     if (x.active >= (level)) debug_print_buffer(&x,len,str);	  \
  } while(0)
  
  
***************
*** 2310,2319 ****
  
  /* Dummy .... */
  #define DEBUG_CHECK_INIT(x)         do { } while(0)
! #define DEBUG_CHECK(x,level)        ((x.active >= level),0)
! #define DPRINT(x,level,action)      do { if (x.active >= level) { } } while(0)
! #define SIGDPRINT(x,level,action)   do { if (x.active >= level) { } } while(0)
! #define DEBUG_PRINT_BUFFER(x,level,len,str) do { if (x.active >= level) { } } while(0)
  
  /* Not available !!! */
  extern void debug_action_call P_((struct debug_struct *a, 
--- 2439,2448 ----
  
  /* Dummy .... */
  #define DEBUG_CHECK_INIT(x)         do { } while(0)
! #define DEBUG_CHECK(x,level)        ((x.active >= (level)),0)
! #define DPRINT(x,level,action)      do { if (x.active >= (level)) { } } while(0)
! #define SIGDPRINT(x,level,action)   do { if (x.active >= (level)) { } } while(0)
! #define DEBUG_PRINT_BUFFER(x,level,len,str) do { if (x.active >= (level)) { } } while(0)
  
  /* Not available !!! */
  extern void debug_action_call P_((struct debug_struct *a, 
***************
*** 2619,2624 ****
--- 2748,2758 ----
  extern struct string_token {
      uint16          special;              /* unicode of special or 0 */
      struct string  *token;
+     enum token_status {
+ 	token_fail    = 0,
+ 	token_parsed,
+ 	token_icomplete   /* unbalaced quote? */
+     }               status;
  } * string_tokenize P_((const struct string *line,
  			int flags));
  
***************
*** 2692,2705 ****
  
  /* conf_writer.c */
  
! typedef void dump_conf_map_f P_((FILE *f, const char *actor,
! 				 char *version_buff));
  typedef void dump_message_f P_((char *fname));
  
! extern void register_conf_write P_((char * shorname,
! 				    char *fname,
! 				    dump_conf_map_f * dump_map,
! 				    dump_message_f  * write_message ));
  
  
  /*
--- 2826,2854 ----
  
  /* conf_writer.c */
  
! typedef int dump_conf_map_f P_((FILE       * f,
! 				const char * actor,
! 				char       * version_buff,
! 				int        * erro_res));
  typedef void dump_message_f P_((char *fname));
  
! /* Return 1 if merge succeed */
! typedef int merge_conf_map_f P_((const char  * fname,
! 				 FILE        * f));
! 
! #ifdef ANSI_C
! extern merge_conf_map_f NO_merge_conf_map;
! #endif
! extern int NO_merge_conf_map P_((const char  * fname,
! 				 FILE        * f));
! 
! extern void register_conf_write P_((char             * shorname,
! 				    char             * fname,
! 				    dump_conf_map_f  * dump_map,
! 				    dump_message_f   * write_message,
! 				    int              * rewrite_flag,
! 				    merge_conf_map_f * merge_map
! 				    ));
  
  
  /*
Index: elmME+.2.5.alpha60/hdrs/filelock.h
*** /tmp/31884-very-long-file-name/NULL-31884-comes-in-here--XXXXXXXXX	Thu Nov 24 18:32:31 2022
--- elmME+.2.5.alpha60/hdrs/filelock.h	Sat Aug 28 14:11:45 2021
***************
*** 0 ****
--- 1,28 ----
+ /* $Id: filelock.h,v 2.1 2021/07/13 07:58:36 hurtta Exp $ */
+ 
+ /******************************************************************************
+  *  The Elm (ME+) Mail System  -  $Revision: 2.1 $   $State: Exp $
+  *
+  *  Author: Kari Hurtta 
+  *      or  Kari Hurtta 
+  *****************************************************************************/
+ 
+ /* lib/misc/filelock.c */
+ 
+ extern enum FLOCKING_status filelock_fd P_((int fd,
+ 					    enum FLOCKING_mode     op,
+ 					    struct dt_flags_info * flags,
+ 					    const char           * filename /* may be NULL */,
+ 					    enum FLOCKING_blocking blockit,
+ 					    int                  * errno_res
+ 					    ));
+ 
+ 
+ 
+ /*
+  * Local Variables:
+  *  mode:c
+  *  c-basic-offset:4
+  *  buffer-file-coding-system: iso-8859-1
+  * End:
+  */
Index: elmME+.2.5.alpha60/hdrs/hashmark.h
*** elmME+.2.5.alpha54/hdrs/hashmark.h	Thu May 10 13:39:46 2018
--- elmME+.2.5.alpha60/hdrs/hashmark.h	Thu May 26 11:16:29 2022
***************
*** 1,7 ****
! /* $Id: hashmark.h,v 2.5 2018/05/10 10:39:46 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.5 $   $State: Exp $
   *
   *  Author: Kari Hurtta 
   *      or  Kari Hurtta 
--- 1,7 ----
! /* $Id: hashmark.h,v 2.6 2022/02/12 14:00:06 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.6 $   $State: Exp $
   *
   *  Author: Kari Hurtta 
   *      or  Kari Hurtta 
***************
*** 67,72 ****
--- 67,86 ----
  				       int                          give_service_entry_flag,
  				       PORTS                        force_port));
  
+ /*  Return 1 if succeed, 
+     caller does remote_account_init_tls()
+     -1 == use fallback
+ */
+ 
+ extern int hashmark_passhm_open_ra2 P_((const struct hashmark_item * item,
+ 					struct browser_passhm      * passhm,
+ 					struct remote_account      * ra,
+ 					int                          give_service_entry_flag,
+ 					
+ 					/* For enumerate_service_type */
+ 					struct enum_service_type *est));
+ 
+ 
  /* Return 1 if succeed */
  extern int hashmark_selectbr_item P_((struct hashmark_item  * item,
  				      struct folder_browser * dir,
Index: elmME+.2.5.alpha60/hdrs/hashmark_imp.h
*** elmME+.2.5.alpha54/hdrs/hashmark_imp.h	Thu May 10 13:39:46 2018
--- elmME+.2.5.alpha60/hdrs/hashmark_imp.h	Thu May 26 11:16:29 2022
***************
*** 1,7 ****
! /* $Id: hashmark_imp.h,v 2.5 2018/05/10 10:39:46 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.5 $   $State: Exp $
   *
   *  Author: Kari Hurtta 
   *      or  Kari Hurtta 
--- 1,7 ----
! /* $Id: hashmark_imp.h,v 2.6 2022/02/12 14:00:06 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.6 $   $State: Exp $
   *
   *  Author: Kari Hurtta 
   *      or  Kari Hurtta 
***************
*** 117,122 ****
--- 117,135 ----
  					  int                          give_service_entry_flag,
  					  PORTS                        force_port));
  
+ /*  Return 1 if succeed, 
+     caller does remote_account_init_tls()
+ */
+ typedef int hashtype_passhm_open_ra2_f P_((const struct hashmark_item * item,
+ 					   struct browser_passhm      * passhm,
+ 					   struct remote_account      * ra,
+ 					   int                          give_service_entry_flag,
+ 					   
+ 					   /* For enumerate_service_type */
+ 					   struct enum_service_type   * est
+ 					   ));
+ 
+ 
  /* Return 1 if succeed */
  typedef int hashtype_selectbr_item_f P_((struct hashmark_item  * item,
  					 struct folder_browser * dir,
***************
*** 203,208 ****
--- 216,222 ----
      hashtype_valid_on_user_f        * valid_on_user;
      hashtype_prepare_write_item_f   * prepare_write;
      hashtype_cat_hashmark_item_f    * cat_hashmark;
+     hashtype_passhm_open_ra2_f      * passhm_open_ra2;
      
  } hashtype_folder_dir_action, hashtype_local_dir_action;
  
Index: elmME+.2.5.alpha60/hdrs/mailcap_imp.h
*** /tmp/31884-very-long-file-name/NULL-31884-comes-in-here--XXXXXXXXX	Thu Nov 24 18:32:31 2022
--- elmME+.2.5.alpha60/hdrs/mailcap_imp.h	Fri Sep  2 20:38:19 2022
***************
*** 0 ****
--- 1,67 ----
+ /* $Id*/
+ 
+ /******************************************************************************
+  *  The Elm (ME+) Mail System  -  $Revision: 2.1 $   $State: Exp $
+  *
+  *  Author: Kari Hurtta  
+  *      or  Kari Hurtta 
+  *****************************************************************************/
+ 
+ #define MAILCAP_PARAM_magic     0xF401
+ 
+ struct mailcap_vector {
+     unsigned short magic;                /* MAILCAP_PARAM_magic */                                
+ 
+     struct agv1 {
+ 	enum arg_type { mv_literal,
+ 			mv_filename, mv_type, mv_parameter,
+ 			mv_environ     /* Environment variable inside of " */
+ 	} type;
+ 
+ 	struct arg {
+ 	    int  arg_len;
+ 	    int  alloced;
+ 	    char * arg;
+ 	} arg;
+ 
+ 	char quote_char;  /* quote character for printing mailcap entry */
+ 	
+     } * subvector;
+     int subcount;
+ };
+ 
+ #define MAILCAP_magic           0xF400
+ struct mailcap_entry {
+     unsigned short magic; /* MAILCAP_magic */
+ 
+     struct mailcap_vector    * view_command;
+     int                        view_command_len;
+ 
+     struct mailcap_vector    * test_command;
+     int                        test_command_len;
+ 
+     
+     /* TODO commands:
+        compose
+        composetyped
+        edit
+        print
+     */
+ 
+     unsigned int              needsterminal : 1;
+     unsigned int              copiousoutput : 1;
+     unsigned int              blacklisted   : 1;
+ 
+     char *               view_command_ok;  /* not blacklisted */
+ 
+     char *               extension;
+ 
+ };
+ 
+ /*
+  * Local Variables:
+  *  mode:c
+  *  c-basic-offset:4
+  *  buffer-file-coding-system: iso-8859-1
+  * End:
+  */
Index: elmME+.2.5.alpha60/hdrs/mboxlib.h
*** elmME+.2.5.alpha54/hdrs/mboxlib.h	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/hdrs/mboxlib.h	Sat Aug 28 14:11:45 2021
***************
*** 1,7 ****
! /* $Id: mboxlib.h,v 2.43 2021/01/17 18:53:16 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.43 $   $State: Exp $
   *
   *  Author: Kari Hurtta  (was hurtta+elm@posti.FMI.FI)
   *      or  Kari Hurtta 
--- 1,7 ----
! /* $Id: mboxlib.h,v 2.45 2021/07/13 07:58:36 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.45 $   $State: Exp $
   *
   *  Author: Kari Hurtta  (was hurtta+elm@posti.FMI.FI)
   *      or  Kari Hurtta 
***************
*** 105,117 ****
  extern int status_2_mailbox P_((struct header_rec *entry, char *buffer, 
  				int size));
  
- extern int Release_the_file P_((int flock_fd,struct dt_flags_info *flags));
  
! extern enum FLOCKING_status {
!     FLOCKING_FAIL  = -1,
! 	FLOCKING_OK    = 0,
! 	FLOCKING_RETRY = 1
! 	} Grab_the_file P_((int flock_fd, struct dt_flags_info *flags));
  
  
  extern int mbx_read_line P_((FILE *fh,char **buffer, int *len, int max_read));
--- 105,116 ----
  extern int status_2_mailbox P_((struct header_rec *entry, char *buffer, 
  				int size));
  
  
! /* These are wrappers to filelock_fd() */
! 
! extern enum FLOCKING_status Release_the_file  P_((int flock_fd, struct dt_flags_info *flags));
! extern enum FLOCKING_status Grab_the_file     P_((int flock_fd, struct dt_flags_info *flags));
! extern enum FLOCKING_status GrabRead_the_file P_((int flock_fd, struct dt_flags_info *flags));
  
  
  extern int mbx_read_line P_((FILE *fh,char **buffer, int *len, int max_read));
Index: elmME+.2.5.alpha60/hdrs/mbx_imp.h
*** elmME+.2.5.alpha54/hdrs/mbx_imp.h	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/hdrs/mbx_imp.h	Thu May 26 11:16:29 2022
***************
*** 1,7 ****
! /* $Id: mbx_imp.h,v 2.32 2021/01/10 15:47:31 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.32 $   $State: Exp $
   *
   *  Author: Kari Hurtta  
   *                  (was hurtta+elm@posti.FMI.FI, hurtta+elm@ozone.FMI.FI)
--- 1,7 ----
! /* $Id: mbx_imp.h,v 2.34 2022/02/12 14:00:06 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.34 $   $State: Exp $
   *
   *  Author: Kari Hurtta  
   *                  (was hurtta+elm@posti.FMI.FI, hurtta+elm@ozone.FMI.FI)
***************
*** 367,373 ****
  	    int       stat_size;
  	    int       stat_count;
  
! 	    struct uidl_entry  * uidl_root; /* Binary tree -- not balanced! */
  	    
  	    int seen_badpid;
  
--- 367,373 ----
  	    int       stat_size;
  	    int       stat_count;
  
! 	    struct sortlist  * uidl_list;
  	    
  	    int seen_badpid;
  
***************
*** 818,823 ****
--- 818,832 ----
  				      PORTS force_port));
  
  
+ /* -1 == use fallback ;  
+    caller does remote_account_init_tls()
+  */
+ extern int browser_passhm_open_ra2 P_((struct browser_passhm * passhm,
+ 				      struct remote_account * ra,
+ 				      int give_service_entry_flag,
+ 				      /* For enumerate_service_type */
+ 				      struct enum_service_type *est));
+ 
  /* -1 == use fallback
      0 == lookup failed
      1 == ok
Index: elmME+.2.5.alpha60/hdrs/me.h
*** elmME+.2.5.alpha54/hdrs/me.h	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/hdrs/me.h	Fri Sep  2 20:38:19 2022
***************
*** 1,7 ****
! /* $Id: me.h,v 2.110 2021/01/10 15:47:31 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.110 $   $State: Exp $
   *
   *  Modified by: Kari Hurtta 
   *                       (was hurtta+elm@posti.FMI.FI, hurtta+elm@ozone.FMI.FI)
--- 1,7 ----
! /* $Id: me.h,v 2.118 2022/08/28 07:58:12 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.118 $   $State: Exp $
   *
   *  Modified by: Kari Hurtta 
   *                       (was hurtta+elm@posti.FMI.FI, hurtta+elm@ozone.FMI.FI)
***************
*** 50,56 ****
  struct text_block;
  #endif
  
! /* args.c */
  
  extern void set_early_options P_((int argc,char *argv[]));
  
--- 50,56 ----
  struct text_block;
  #endif
  
! /* src/args.c */
  
  extern void set_early_options P_((int argc,char *argv[]));
  
***************
*** 62,67 ****
--- 62,69 ----
  extern char * wanted_charset;
  extern int wanted_switchmode;
  
+ extern char * conf_backup_suffix;
+ 
  extern char * wanted_title_string;
  extern char * wanted_icon_string;
  extern char * with_title;
***************
*** 81,87 ****
  extern void add_Attachments  P_((struct Attachments *A,mime_t *x));
  extern void free_Attachments P_((struct Attachments *A));
  
! /* init.c */
  
  extern void initialize P_((struct AliasView **main_alaises, 
  			   struct menu_context **page));
--- 83,89 ----
  extern void add_Attachments  P_((struct Attachments *A,mime_t *x));
  extern void free_Attachments P_((struct Attachments *A));
  
! /* src/init.c */
  
  extern void initialize P_((struct AliasView **main_alaises, 
  			   struct menu_context **page));
***************
*** 116,122 ****
  	    struct elm_commands        * cmds /* may be NULL */	    
  							    ));
  
! /* file_util.c */
  
  #if ANSI_C
  struct current_storage;
--- 118,124 ----
  	    struct elm_commands        * cmds /* may be NULL */	    
  							    ));
  
! /* src/file_util.c */
  
  #if ANSI_C
  struct current_storage;
***************
*** 126,138 ****
  int append P_((FILE *fd, char *filename, char *prefix_str,
  	       struct menu_context *page));
  
! /* find_alias.c */
  
  extern int find_alias P_((char *word, int alias_type,
  			  struct AliasView *aview));
  
  
! /* showmsg_c.c */
  
  struct pager_page {
      struct menu_context  * root;    /* Or parent */
--- 128,140 ----
  int append P_((FILE *fd, char *filename, char *prefix_str,
  	       struct menu_context *page));
  
! /* src/find_alias.c */
  
  extern int find_alias P_((char *word, int alias_type,
  			  struct AliasView *aview));
  
  
! /* src/showmsg_c.c */
  
  struct pager_page {
      struct menu_context  * root;    /* Or parent */
***************
*** 175,181 ****
  				   struct elm_commands *pager_cmds));
  
  
! /* showmsg_1.c */
  
  extern int show_message_with_headers P_((struct MailboxView *mailbox,
  					 showmsg_cmd  cmdX,
--- 177,183 ----
  				   struct elm_commands *pager_cmds));
  
  
! /* src/showmsg_1.c */
  
  extern int show_message_with_headers P_((struct MailboxView *mailbox,
  					 showmsg_cmd  cmdX,
***************
*** 200,206 ****
  				 struct menu_context *header_area,
  				 struct elm_commands *pager_cmds));
  
! /* movement.c */
  
  typedef void move_message P_((void));
  
--- 202,208 ----
  				 struct menu_context *header_area,
  				 struct elm_commands *pager_cmds));
  
! /* src/movement.c */
  
  typedef void move_message P_((void));
  
***************
*** 214,220 ****
  extern int do_movement1 P_((struct menu_context *ptr, int ch, int len,
  			    struct move_messages *m));
  
! /* motion.c */
  
  /* Return key if unknown */
  
--- 216,222 ----
  extern int do_movement1 P_((struct menu_context *ptr, int ch, int len,
  			    struct move_messages *m));
  
! /* src/motion.c */
  
  /* Return key if unknown */
  
***************
*** 242,248 ****
  			       struct string **msg_line));
  
  
! /* network.c */
  
  enum mbx_cancel_message {
      mbx_closing_con,
--- 244,250 ----
  			       struct string **msg_line));
  
  
! /* src/network.c */
  
  enum mbx_cancel_message {
      mbx_closing_con,
***************
*** 253,259 ****
  extern void setup_mbx_cancel_message P_((struct cancel_data **cancel_info,
  					 enum mbx_cancel_message msg));
  
! /* elm.c */
  
  extern void mailbox_screen_common P_((struct menu_context  *page, 
  				      struct screen_parts *LOC,
--- 255,261 ----
  extern void setup_mbx_cancel_message P_((struct cancel_data **cancel_info,
  					 enum mbx_cancel_message msg));
  
! /* src/elm.c */
  
  extern void mailbox_screen_common P_((struct menu_context  *page, 
  				      struct screen_parts *LOC,
***************
*** 280,286 ****
  			       const char **exit_hint_p));
  
  
! /* help.c */
  
  /*  Returns EOF if EOF seen */
  extern int help_generic P_((struct elm_commands  * cmds,
--- 282,288 ----
  			       const char **exit_hint_p));
  
  
! /* src/help.c */
  
  /*  Returns EOF if EOF seen */
  extern int help_generic P_((struct elm_commands  * cmds,
***************
*** 289,295 ****
  			    struct menu_context  *prompt_area));
  
  
! /* in_utils.c */
  
  extern int want_to P_((char *question, int dflt, int where, 
  		       int clear_and_center,
--- 291,297 ----
  			    struct menu_context  *prompt_area));
  
  
! /* src/in_utils.c */
  
  extern int want_to P_((char *question, int dflt, int where, 
  		       int clear_and_center,
***************
*** 339,350 ****
  				int wait_time));
  
  
! /* enter_helper.c ------------------------------------------------------- */
  
  #if ANSI_C
  struct enter_info;
  #endif
  
  enum enter_mode { em_redraw, em_enter, em_prev, em_next, em_wrap,
  		  em_redraw_initial, em_editor_escape, em_tabaction,
  		  em_bs_prev, em_left, em_right,
--- 341,383 ----
  				int wait_time));
  
  
! /* src/enter_helper.c ------------------------------------------------------- */
  
  #if ANSI_C
  struct enter_info;
  #endif
  
+ /* Notify buffer changes */
+ 
+ enum alter_buffer_action { ab_erase, ab_free_buffer, ab_truncated, ab_autocomma };
+ 
+ typedef void alter_buffer_r P_((struct enter_info *I,
+ 				struct string **buffer,
+ 				enum alter_buffer_action action,
+ 				struct menu_context *base_page));
+ 
+ enum  full_page_action { fp_resized, fp_redraw };
+ 
+ typedef void full_page_r  P_((struct enter_info *I,
+ 			      enum full_page_action action,
+ 			      struct menu_context *base_page));
+ 
+ #if ANSI_C
+ extern full_page_r default_full_page;
+ #endif
+ extern void default_full_page  P_((struct enter_info *I,
+ 				   enum full_page_action action,
+ 				   struct menu_context *base_page));
+ 
+ #if ANSI_C
+ extern alter_buffer_r default_alter_buffer;
+ #endif
+ extern void default_alter_buffer P_((struct enter_info *I,
+ 				     struct string **buffer,
+ 				     enum alter_buffer_action action,
+ 				     struct menu_context *base_page));
+ 
+ 
  enum enter_mode { em_redraw, em_enter, em_prev, em_next, em_wrap,
  		  em_redraw_initial, em_editor_escape, em_tabaction,
  		  em_bs_prev, em_left, em_right,
***************
*** 365,391 ****
  		  em_F12_key,
  };
  
  typedef struct string **give_buffer_r P_((struct enter_info *I,
  					  enum enter_mode em,
  					  struct menu_context *base_page));
  
  
  struct enter_info {
!     struct string **pvector;
!     give_buffer_r *give_buffer;
      int flags;
      int ch_count;
      struct in_utils_edit *in_utils;
      struct builtin_edit  *builtin;
      struct browser_edit  *browser;
  
      struct menu_context *current_page;  /* give_buffer_r may alloc new */
  };
  
  extern int enter_helper P_((struct enter_info *info,
! 			     struct menu_context *base_page));
  
! /* out_utils.c */
  
  extern void error_wait P_((void));   /* call before exiting */
  extern void sleep_message P_((void));
--- 398,455 ----
  		  em_F12_key,
  };
  
+ /* FOr debug */
+ 
+ extern const char * enter_mode_debug_name P_((enum enter_mode em));
+ 
+ 
  typedef struct string **give_buffer_r P_((struct enter_info *I,
  					  enum enter_mode em,
  					  struct menu_context *base_page));
  
+ enum prompt_hint_mode { phm_clear = 0, phm_empty_buffer };
+ 
+ typedef void prompt_hint_r P_((struct enter_info *I,
+ 			       enum prompt_hint_mode phm,
+ 			       struct menu_context *base_page));
+ 			      
+ #if ANSI_C
+ extern prompt_hint_r default_prompt_hint;
+ #endif
+ extern void default_prompt_hint P_((struct enter_info *I,
+ 				    enum prompt_hint_mode phm,
+ 				    struct menu_context *base_page));
+ 			      
+ 
+ #define ENTER_INFO_magic	0xEB23
  
  struct enter_info {
!     unsigned short magic; 	/* ENTER_INFO_magic */
!     
!     struct string      ** pvector;
!     
!     give_buffer_r       * give_buffer;
!     alter_buffer_r      * alter_buffer;
!     full_page_r         * full_page;
!     prompt_hint_r       * prompt_hint;
!     
      int flags;
      int ch_count;
      struct in_utils_edit *in_utils;
      struct builtin_edit  *builtin;
      struct browser_edit  *browser;
+     struct address_edit  *address;
  
      struct menu_context *current_page;  /* give_buffer_r may alloc new */
  };
  
+ extern void zero_enter_info P_((struct enter_info *info));
+ 
  extern int enter_helper P_((struct enter_info *info,
! 			    struct menu_context *prompt_area,
! 			    struct menu_context *base_page));
  
! /* src/out_utils.c */
  
  extern void error_wait P_((void));   /* call before exiting */
  extern void sleep_message P_((void));
***************
*** 419,425 ****
  extern int open_messages_log P_((const char *filename));
  extern void close_messages_log P_((void));
  
! /* pattern.c */
  
  extern int from_matches P_((struct header_rec *mss, struct string *pat));
  extern int to_matches P_((struct header_rec *mss, struct string *pat));
--- 483,489 ----
  extern int open_messages_log P_((const char *filename));
  extern void close_messages_log P_((void));
  
! /* src/pattern.c */
  
  extern int from_matches P_((struct header_rec *mss, struct string *pat));
  extern int to_matches P_((struct header_rec *mss, struct string *pat));
***************
*** 442,448 ****
  			  struct screen_parts *LOC));
  
  
! /* addr_util.c */
  
  extern void free_addr_util P_((void));
  
--- 506,529 ----
  			  struct screen_parts *LOC));
  
  
! /* src/addr_prompt.c */
! 
! extern int prompt_expanded_address P_((struct menu_context  *page,
! 				       struct expanded_address *expanded,
! 				       struct mailer_info      *mailer_info,
! 				       struct string          **buffer /* for redraw */,
! 				       struct AliasView *aview /* May be NULL */,
! 					struct string           * title  /* Title on full page mode */,
! 				       struct menu_context     *prompt_area,
! 				       /* Cordinates use prompt_area */
! 				       int x, int y, int flags, 
! 				       const char * format, const char *msg, ...));
! 
! /* src/addr_util.c */
! 
! #if ANSI_C
! struct aliasview_record;
! #endif
  
  extern void free_addr_util P_((void));
  
***************
*** 480,490 ****
  						 struct AliasView *aview
  						 ));
  
  extern int aliases_to_expanded P_((struct expanded_address *x,
  				   struct AliasView *aview));
  
  
! /* alias.c */
  
  
  #if ANSI_C
--- 561,583 ----
  						 struct AliasView *aview
  						 ));
  
+ /* parses without expanding --- */
+ 
+ extern void update_textual_from_tokenized P_((const struct expanded_address *expanded,
+ 					      struct expanded_address *result,
+ 					      struct string_token * tokenized,
+ 					      struct AliasView *aview /* Used as flag */,
+ 					      const struct string *buffer /* For error message */
+ 					      ));
+ 
+ 
  extern int aliases_to_expanded P_((struct expanded_address *x,
  				   struct AliasView *aview));
  
+ extern void add_one_alias_to_expanded P_((struct expanded_address *x,
+ 					  struct aliasview_record  *a));
  
! /* src/alias.c */
  
  
  #if ANSI_C
***************
*** 509,531 ****
          const struct address * address,
  	struct AliasView *aview));
  
! /* a_edit.c */
  
  extern int edit_aliases_text P_((struct AliasView *aview, 
  				 struct menu_context *page,
  				 struct screen_parts *LOC));
  
! /* a_sort.c */
  
! extern void sort_aliases P_((int entries, int visible, int are_in_aliases,
  			     struct AliasView *aview));
  extern char *alias_sort_name P_((int type));
  
! /* a_screen.c */
! 
! #if ANSI_C
! struct aliasview_record;
! #endif
  
  extern struct string *build_alias_line P_((struct  aliasview_record *entry,
  					   int message_number, int highlight,
--- 602,626 ----
          const struct address * address,
  	struct AliasView *aview));
  
! /* src/a_edit.c */
  
  extern int edit_aliases_text P_((struct AliasView *aview, 
  				 struct menu_context *page,
  				 struct screen_parts *LOC));
  
! /* src/a_sort.c */
! 
! enum sort_aliases_mode { sa_silent_sort = 0,
! 			 sa_visible_sort /* Shows sort message if
! 					    entries > 30
! 					 */
! };
  
! extern void sort_aliases P_((int entries, enum sort_aliases_mode show_message,
  			     struct AliasView *aview));
  extern char *alias_sort_name P_((int type));
  
! /* src/a_screen.c */
  
  extern struct string *build_alias_line P_((struct  aliasview_record *entry,
  					   int message_number, int highlight,
***************
*** 545,551 ****
  
  extern char *alias_type P_((int type));
  
! /* a_quit.c */
  
  extern void exit_alias    P_((struct AliasView *aview));
  extern int delete_aliases P_((int newaliases, int prompt,
--- 640,646 ----
  
  extern char *alias_type P_((int type));
  
! /* src/a_quit.c */
  
  extern void exit_alias    P_((struct AliasView *aview));
  extern int delete_aliases P_((int newaliases, int prompt,
***************
*** 553,559 ****
  			      struct menu_context  * page,
  			      struct screen_parts *LOC));
  
! /* exitprog.c */
  
  /* returns:
  
--- 648,654 ----
  			      struct menu_context  * page,
  			      struct screen_parts *LOC));
  
! /* src/exitprog.c */
  
  /* returns:
  
***************
*** 567,573 ****
  extern int exit_mailbox P_((struct MailboxView *mailbox,
  			    struct menu_context *page));
  
! /* file.c */
  
  extern int expand_filename P_((char *, int, int));
  extern void init_helpmsg P_(( char *, char *, int, int ));
--- 662,668 ----
  extern int exit_mailbox P_((struct MailboxView *mailbox,
  			    struct menu_context *page));
  
! /* src/file.c */
  
  extern int expand_filename P_((char *, int, int));
  extern void init_helpmsg P_(( char *, char *, int, int ));
***************
*** 579,589 ****
  		    struct menu_context *header_area));
  		   
  
! /* fileutil.c */
  
  extern FILE *open_end_update P_((char *name));
  
! /* pgp.c */
  extern int pgp_menu			P_((char *filename,
  					    struct mailing_headers *headers,
  					    struct menu_context  *page));
--- 674,684 ----
  		    struct menu_context *header_area));
  		   
  
! /* src/fileutil.c */
  
  extern FILE *open_end_update P_((char *name));
  
! /* src/pgp.c */
  extern int pgp_menu			P_((char *filename,
  					    struct mailing_headers *headers,
  					    struct menu_context  *page));
***************
*** 594,600 ****
  					     struct AliasView *aview,
  					     struct menu_context  *page,
  					     struct menu_context  *prompt_area));
! /* read_rc.c */
  
  extern void directory_check     P_((void));
  extern void aliases_check P_((struct AliasView *main_aliases));
--- 689,695 ----
  					     struct AliasView *aview,
  					     struct menu_context  *page,
  					     struct menu_context  *prompt_area));
! /* src/read_rc.c */
  
  extern void directory_check     P_((void));
  extern void aliases_check P_((struct AliasView *main_aliases));
***************
*** 606,619 ****
      prompt_quit_or_return_index
  };
  
! /* builtin++.c */
  extern int builtinplusplus	P_((struct stringbuffer * bout,
  				    struct pager_page   * pager_page,
  				    int is_helper,
  				    struct elm_commands *pager_cmds,
  				    enum pager_prompt have_index));
  
! /* mime.c */
  
  extern const char * have_metamail P_((void));
  extern void clear_mime_send_info P_((mime_send_t *mime_info));
--- 701,714 ----
      prompt_quit_or_return_index
  };
  
! /* src/builtin++.c */
  extern int builtinplusplus	P_((struct stringbuffer * bout,
  				    struct pager_page   * pager_page,
  				    int is_helper,
  				    struct elm_commands *pager_cmds,
  				    enum pager_prompt have_index));
  
! /* src/mime.c */
  
  extern const char * have_metamail P_((void));
  extern void clear_mime_send_info P_((mime_send_t *mime_info));
***************
*** 631,637 ****
  			    struct menu_context *prompt_area,
  			    const struct remote_server *remote_server));
  
! /* strings.c */
  
  extern void Centerline P_((int line,
  			   char *string,
--- 726,732 ----
  			    struct menu_context *prompt_area,
  			    const struct remote_server *remote_server));
  
! /* src/strings.c */
  
  extern void Centerline P_((int line,
  			   char *string,
***************
*** 643,656 ****
  			   int   depth));
  
  
! /* string2.c */
  
  /* NOTE: Must be 'int ch', no 'char ch' so that it matches to default promotion
           of arguments
  */
  extern int occurances_of P_((int ch, char *string));
  
! /* fileio.c */
  extern int copy_message P_((struct folder_info *, struct header_rec *,
  			     char *, FILE *, int, charset_t));
  extern int copy_message_f P_((FILE *infile, struct header_rec *current_header,
--- 738,751 ----
  			   int   depth));
  
  
! /* src/string2.c */
  
  /* NOTE: Must be 'int ch', no 'char ch' so that it matches to default promotion
           of arguments
  */
  extern int occurances_of P_((int ch, char *string));
  
! /* src/fileio.c */
  extern int copy_message P_((struct folder_info *, struct header_rec *,
  			     char *, FILE *, int, charset_t));
  extern int copy_message_f P_((FILE *infile, struct header_rec *current_header,
***************
*** 694,700 ****
  typedef copy_decoder *copy_decoder_t;
  extern copy_decoder_t select_copy_decoder P_((struct header_rec *));
  
! /* newmbox.c */
  
  extern  enum sessionlock_status  open_folder_lock P_((enum lock_direction direction,
  						 struct folder_info *folder));
--- 789,795 ----
  typedef copy_decoder *copy_decoder_t;
  extern copy_decoder_t select_copy_decoder P_((struct header_rec *));
  
! /* src/newmbox.c */
  
  extern  enum sessionlock_status  open_folder_lock P_((enum lock_direction direction,
  						 struct folder_info *folder));
***************
*** 758,764 ****
  					      struct quota_display *quotad
  					      ));
  
! /* reconnect.c */
  
  const char * found_disconnected P_((struct MailboxView *mailbox));
  
--- 853,859 ----
  					      struct quota_display *quotad
  					      ));
  
! /* src/reconnect.c */
  
  const char * found_disconnected P_((struct MailboxView *mailbox));
  
***************
*** 771,777 ****
  				     struct menu_context  *page,
  				     struct screen_parts *LOC));
  
! /* openmailbox.c */
  
  /* Opens new mailbox to current mailbox view without closing current mailbox */
  /* Return EOF if EOF seen */
--- 866,872 ----
  				     struct menu_context  *page,
  				     struct screen_parts *LOC));
  
! /* src/openmailbox.c */
  
  /* Opens new mailbox to current mailbox view without closing current mailbox */
  /* Return EOF if EOF seen */
***************
*** 783,796 ****
  				struct screen_parts *LOC));
  
  
! /* file_util.c */
  
  extern long fsize P_((FILE *));
  extern long bytes P_((char *));
  extern int copy_to_folder P_((FILE * from, struct folder_info *to));
  extern int copy1 P_((FILE *from, char *to, int isspool));
  
! /* mailmsg1.c */
  
  extern void a_sendmsg P_((int edit_message, 
  			  struct MailboxView *mailbox,
--- 878,915 ----
  				struct screen_parts *LOC));
  
  
! /* src/file_util.c */
  
  extern long fsize P_((FILE *));
  extern long bytes P_((char *));
  extern int copy_to_folder P_((FILE * from, struct folder_info *to));
  extern int copy1 P_((FILE *from, char *to, int isspool));
  
! /* src/mailcap_sel.c */
! 
! struct prompt_programs_list {
!     struct mimeinfo * structure;
!     char            * printable_command;
!     char            * blacklisted_command;
! 
!     unsigned int              selected :1;    
!     unsigned int              need_metamail :1;
!     unsigned int              type_not_found :1;
! 
!     int    col;
! 
!     int    list_position;
! };
! 
! enum prompt_mailcap_other_stat {
!     prompt_mailcap_other_EOF = EOF,
!     prompt_mailcap_other_none = 0,
!     prompt_mailcap_other_navigate
! } prompt_mailcap_other P_((struct prompt_programs_list *pg,			   
! 			   struct menu_context  *parent_page,
! 			   int *ret_ch));
! 			   
! /* src/mailmsg1.c */
  
  extern void a_sendmsg P_((int edit_message, 
  			  struct MailboxView *mailbox,
***************
*** 872,878 ****
  		      struct menu_context     *prompt_area));
  
  
! /* mailmsg2.c -------------- */
  
  #if ANSI_C
  struct run_state;           /* Needed for prototype */
--- 991,997 ----
  		      struct menu_context     *prompt_area));
  
  
! /* src/mailmsg2.c -------------- */
  
  #if ANSI_C
  struct run_state;           /* Needed for prototype */
***************
*** 912,924 ****
  extern enum mailer_capab get_mailer_level P_((struct mailer_info 
  					      *mailer_info));
  
! /* canceled.c */
  
  extern char * last_canceled_mail;
  extern int view_canceled_mails P_((struct MailboxView * cancel_view,
  				   int *cancel_selection,
  				   struct AliasView *aview));
! /* aliaslib.c */
  
  extern struct addr_list *get_alias_address_expanded P_((
             const struct string              * name, /* name to expand as an alias */
--- 1031,1043 ----
  extern enum mailer_capab get_mailer_level P_((struct mailer_info 
  					      *mailer_info));
  
! /* src/canceled.c */
  
  extern char * last_canceled_mail;
  extern int view_canceled_mails P_((struct MailboxView * cancel_view,
  				   int *cancel_selection,
  				   struct AliasView *aview));
! /* src/aliaslib.c */
  
  extern struct addr_list *get_alias_address_expanded P_((
             const struct string              * name, /* name to expand as an alias */
***************
*** 933,939 ****
  
  
  
! /* syscall.c */
  
  extern int system_call    P_((const char *, volatile int,      
  			      struct MailboxView *mailbox));
--- 1052,1058 ----
  
  
  
! /* src/syscall.c */
  
  extern int system_call    P_((const char *, volatile int,      
  			      struct MailboxView *mailbox));
***************
*** 959,969 ****
  extern int create_folder_state_file P_((struct MailboxView *mailbox));
  extern int remove_folder_state_file P_((void));
  
! /* lib/errno.c */
! 
! extern char *error_description P_((int));
! 
! /* savecopy.c */
  
  struct copy_file {
      struct string         * copy_file;
--- 1078,1084 ----
  extern int create_folder_state_file P_((struct MailboxView *mailbox));
  extern int remove_folder_state_file P_((void));
  
! /* src/savecopy.c */
  
  struct copy_file {
      struct string         * copy_file;
***************
*** 1007,1013 ****
  				   enum cm_across_mode copy,
  				   FILE *conv_file));
  
! /* mime.c */
  
  #if ANSI_C
  struct scan_list;
--- 1122,1128 ----
  				   enum cm_across_mode copy,
  				   FILE *conv_file));
  
! /* src/mime.c */
  
  #if ANSI_C
  struct scan_list;
***************
*** 1018,1024 ****
  				    charset_t from_charset,
  				    const struct remote_server *remote_server));
  
! /* mime_encode.c */
  
  
  extern int attach_message P_((mime_t *part, struct out_state *mailer, 
--- 1133,1139 ----
  				    charset_t from_charset,
  				    const struct remote_server *remote_server));
  
! /* src/mime_encode.c */
  
  
  extern int attach_message P_((mime_t *part, struct out_state *mailer, 
***************
*** 1048,1054 ****
  			   enum encoding top_encoding));
  
  
! /* attach_menu.c */
  
  extern void attach_menu		P_((FILE *F,
  				    mime_t *T,
--- 1163,1169 ----
  			   enum encoding top_encoding));
  
  
! /* src/attach_menu.c */
  
  extern void attach_menu		P_((FILE *F,
  				    mime_t *T,
***************
*** 1078,1092 ****
  extern struct scan_list * init_scanlist P_((const char *ext));
  
  
! /* returnadd.c */
  extern void kludge                      P_((char *buffer, int size));
  
! /* lock.c */
  
  extern int unlock P_((int interrupt, struct folder_info *folder));
  extern int lock P_((enum lock_direction direction,struct folder_info *folder));
  
! /* utils.c */
  
  extern void utils_open_debug P_((void));
  extern void emergency_exit P_((int interrupt));
--- 1193,1207 ----
  extern struct scan_list * init_scanlist P_((const char *ext));
  
  
! /* src/returnadd.c */
  extern void kludge                      P_((char *buffer, int size));
  
! /* src/lock.c */
  
  extern int unlock P_((int interrupt, struct folder_info *folder));
  extern int lock P_((enum lock_direction direction,struct folder_info *folder));
  
! /* src/utils.c */
  
  extern void utils_open_debug P_((void));
  extern void emergency_exit P_((int interrupt));
***************
*** 1101,1107 ****
  
  extern void malloc_failed_exit P_((char *proc,size_t n));
  
! /* date.c */
  
  #define TODAY_INFO_magic	0xF527
  
--- 1216,1222 ----
  
  extern void malloc_failed_exit P_((char *proc,size_t n));
  
! /* src/date.c */
  
  #define TODAY_INFO_magic	0xF527
  
***************
*** 1152,1158 ****
  
  
  
! /* reply.c */
  
  extern void append_addresses_to_addr_list P_((struct addr_list *target,
  					      const struct addr_list *list));
--- 1267,1273 ----
  
  
  
! /* src/reply.c */
  
  extern void append_addresses_to_addr_list P_((struct addr_list *target,
  					      const struct addr_list *list));
***************
*** 1187,1193 ****
  		      struct menu_context  *prompt_area,
  		      struct menu_context  *header_area));
  
! /* leavembox.c */
  
  extern enum sync_mbox_stat {
      sync_mbox_EOF       = -5,
--- 1302,1308 ----
  		      struct menu_context  *prompt_area,
  		      struct menu_context  *header_area));
  
! /* src/leavembox.c */
  
  extern enum sync_mbox_stat {
      sync_mbox_EOF       = -5,
***************
*** 1209,1215 ****
  
  
  		
! /* mkhdrs.c */
  
  extern void generate_reply_to P_((struct header_rec * current_header,
  				  struct mailing_headers *headers));
--- 1324,1330 ----
  
  
  		
! /* src/mkhdrs.c */
  
  extern void generate_reply_to P_((struct header_rec * current_header,
  				  struct mailing_headers *headers));
***************
*** 1217,1223 ****
  				    struct mailing_headers *headers));
  
  
! /* opt_generic.c */
  
  extern struct optsmenu * malloc_optsmenu P_((void));
  extern void free_optsmenu P_((struct optsmenu **ptr));
--- 1332,1338 ----
  				    struct mailing_headers *headers));
  
  
! /* src/opt_generic.c */
  
  extern struct optsmenu * malloc_optsmenu P_((void));
  extern void free_optsmenu P_((struct optsmenu **ptr));
***************
*** 1283,1289 ****
  			   const char          * opt_string,
  			   struct string       * menu_text));
  
! /* options.c */
  
  extern int options P_((struct MailboxView *mailbox,
  		       struct AliasView *aview,
--- 1398,1404 ----
  			   const char          * opt_string,
  			   struct string       * menu_text));
  
! /* src/options.c */
  
  extern int options P_((struct MailboxView *mailbox,
  		       struct AliasView *aview,
***************
*** 1296,1302 ****
  const struct opts_menu_item * find_cfg_opts P_((int c));
  
  
! /* hdrconfig.c */
  
  extern charset_t want_convert_to_utf7 P_((const struct string * text));
  
--- 1411,1435 ----
  const struct opts_menu_item * find_cfg_opts P_((int c));
  
  
! /* src/hdrconfig.c */
! 
! #define HDRMENU_CONTEXT_magic	0xF613
! 
! extern struct hdrmenu_context {
!     unsigned short magic;    /* HDRMENU_CONTEXT_magic */ 
! 
!     struct string           * buffer;
!     struct expanded_address * exp_buffer; /* on  prompt_expanded_address() */
! 
!     /* Title on full page mode on  prompt_expanded_address() */
!     struct string           * title;
!     
!     unsigned   redrawing:1;
! 
! } NULL_hdrmenu_context;
! 
! extern void clear_hdrmenu_context P_((struct hdrmenu_context *cnt));
! 
  
  extern charset_t want_convert_to_utf7 P_((const struct string * text));
  
***************
*** 1317,1352 ****
  				     enum show_presend_mode show_prehdr_mode
  				     ));
  
  /* returns 0 if command not found
             1 if found 
  	   REDRAW_MARK is redraw required 
  */
! extern int presend_action P_((struct mailing_headers *headers,
! 			      struct mailer_info  *mailer_info,
! 			      int c,
! 			      charset_t hdr_charset,
! 			      struct AliasView *aview,
! 			      struct menu_context *page,
! 			      struct menu_context *prompt_area,
! 			      struct header_rec *parent_message,
! 			      enum show_presend_mode show_prehdr_mode));
! extern void edit_headers P_((struct mailing_headers *headers,
! 			     struct mailer_info  *mailer_info,
! 			     charset_t hdr_charset,
! 			     int hdr_encondig_supported,
! 			     struct AliasView *aview,
! 			     struct header_rec *parent_message));
  
  extern struct string *hdr_to_expval P_((struct expanded_address addrs));
- extern void hdr_to_buffer P_((struct expanded_address addrs, 
- 			      struct string **ptr));
- extern int buffer_to_header P_((struct expanded_address *addrs,
- 				struct string **ptr,
- 				int free_only,     
- 				struct mailer_info *mailer_info,
- 				struct AliasView *aview));
  
! /* remail.c */
  
  extern void remail P_((struct header_rec *hdr,
  		       FILE *F, struct AliasView *aview,
--- 1450,1482 ----
  				     enum show_presend_mode show_prehdr_mode
  				     ));
  
+ 
+ 
+ 
  /* returns 0 if command not found
             1 if found 
  	   REDRAW_MARK is redraw required 
  */
! extern int presend_action P_((struct mailing_headers * headers,
! 			      struct mailer_info     * mailer_info,
! 			      int                      c,
! 			      struct hdrmenu_context * redraw_context,
! 			      charset_t                hdr_charset,
! 			      struct AliasView       * aview,
! 			      struct menu_context    * page,
! 			      struct menu_context    * prompt_area,
! 			      struct header_rec      * parent_message,
! 			      enum show_presend_mode   show_prehdr_mode));
! extern void edit_headers P_((struct mailing_headers * headers,
! 			     struct mailer_info     * mailer_info,
! 			     charset_t                hdr_charset,
! 			     int                      hdr_encondig_supported,
! 			     struct AliasView       * aview,
! 			     struct header_rec      * parent_message));
  
  extern struct string *hdr_to_expval P_((struct expanded_address addrs));
  
! /* src/remail.c */
  
  extern void remail P_((struct header_rec *hdr,
  		       FILE *F, struct AliasView *aview,
***************
*** 1363,1376 ****
  					 enum encoding    * encoding,
  					 const char * sender));
  
! /* editmsg.c */
  
  extern void  edit_headers_on_editor P_((struct mailing_headers *headers,
  					const char *editor, 
  					int encoding_supported,
  					struct menu_context *page));
  
! /* editmsg.c */
  
  extern int have_editor P_((const char *editor));
  extern int edit_the_message P_((char *filename,
--- 1493,1506 ----
  					 enum encoding    * encoding,
  					 const char * sender));
  
! /* src/editmsg.c */
  
  extern void  edit_headers_on_editor P_((struct mailing_headers *headers,
  					const char *editor, 
  					int encoding_supported,
  					struct menu_context *page));
  
! /* src/editmsg.c */
  
  extern int have_editor P_((const char *editor));
  extern int edit_the_message P_((char *filename,
***************
*** 1395,1401 ****
  					 struct AliasView *aview
  					 ));
  
! /* delete.c */
  
  extern void delete_msg   P_((int real_del, 
  			     struct menu_common *mc,      
--- 1525,1531 ----
  					 struct AliasView *aview
  					 ));
  
! /* src/delete.c */
  
  extern void delete_msg   P_((int real_del, 
  			     struct menu_common *mc,      
***************
*** 1413,1424 ****
  			   struct menu_context *header_area));
  
  
! /* forms.c */
  
  extern int format_form P_((char *filename));
  extern int check_form_file P_((char *filename));
  
! /* quit.c */
  
  /* returns:
  
--- 1543,1554 ----
  			   struct menu_context *header_area));
  
  
! /* src/forms.c */
  
  extern int format_form P_((char *filename));
  extern int check_form_file P_((char *filename));
  
! /* src/quit.c */
  
  /* returns:
  
***************
*** 1444,1458 ****
  					     ));
  
  
! /* save_opts.c */
  
! extern void save_options P_((void));
  extern void save_user_options P_((FILE *elminfo_fd, FILE *newelmrc));
  
  char *str_opt_nam P_((char *s, int f));
  
  
! /* screen.c */
  
  extern void showscreen P_((struct menu_context *page));
  extern void copy_current P_((struct menu_common *menu, 
--- 1574,1591 ----
  					     ));
  
  
! /* src/save_opts.c */
! 
! int  check_options_backup_suffix P_((const char * option /* for error message */,
! 				     const char * backup_suffix));
  
! extern void save_options P_((const char *backup_suffix));
  extern void save_user_options P_((FILE *elminfo_fd, FILE *newelmrc));
  
  char *str_opt_nam P_((char *s, int f));
  
  
! /* src/screen.c */
  
  extern void showscreen P_((struct menu_context *page));
  extern void copy_current P_((struct menu_common *menu, 
***************
*** 1502,1508 ****
  			      int is_current));
  
  
! /* showmsg.c */
  
  
  
--- 1635,1641 ----
  			      int is_current));
  
  
! /* src/showmsg.c */
  
  
  
***************
*** 1524,1533 ****
  			    struct pager_page *pager_page,
  			    struct elm_commands *pager_cmds));
  
! extern int need_meta P_((struct header_rec *hdr, int current,
  			 int message_count, int *cancel_ret));
  
! /* sort.c */
  
  extern void sort_mailbox P_((int entries, int visible, 
  			     struct MailboxView *mailbox));
--- 1657,1675 ----
  			    struct pager_page *pager_page,
  			    struct elm_commands *pager_cmds));
  
! extern enum need_meta_state {
!     metamail_EOF    = -2  /* != EOF */,
!     metamail_cancel = -1,
!     metamail_none   = FALSE,
!     metamail_needed = TRUE	
!     
! } need_meta P_((struct header_rec *hdr, int current,
  			 int message_count, int *cancel_ret));
  
! extern char * check_mailcap_view_cmd P_((struct mimeinfo *structure,
! 					 int *is_ok));
! 
! /* src/sort.c */
  
  extern void sort_mailbox P_((int entries, int visible, 
  			     struct MailboxView *mailbox));
***************
*** 1535,1548 ****
  
  extern int time_sent_compare P_((struct header_rec *h1,struct header_rec *h2));
  
! /* edit.c */
  
  extern void edit_mailbox P_((struct MailboxView **mailbox,
  			     struct menu_context *page));
  extern int edit_a_file P_((const char *editfile,
  			   struct menu_context  *page));
  
! /* limit.c */
  
  extern int compute_visible P_((int message, struct menu_common *menu));
  extern int next_message    P_((int iindex, int skipdel,
--- 1677,1690 ----
  
  extern int time_sent_compare P_((struct header_rec *h1,struct header_rec *h2));
  
! /* src/edit.c */
  
  extern void edit_mailbox P_((struct MailboxView **mailbox,
  			     struct menu_context *page));
  extern int edit_a_file P_((const char *editfile,
  			   struct menu_context  *page));
  
! /* src/limit.c */
  
  extern int compute_visible P_((int message, struct menu_common *menu));
  extern int next_message    P_((int iindex, int skipdel,
***************
*** 1559,1569 ****
  
  
  
! /* calendar.c */
  
  extern void scan_calendar P_((struct MailboxView *mailbox));
  
! /* fbrowser.c */
  
  extern struct fbrowser_call * alloc_fbrowser_call P_((struct string  * filter,
  						     struct string  * prompt,
--- 1701,1711 ----
  
  
  
! /* src/calendar.c */
  
  extern void scan_calendar P_((struct MailboxView *mailbox));
  
! /* src/fbrowser.c */
  
  extern struct fbrowser_call * alloc_fbrowser_call P_((struct string  * filter,
  						     struct string  * prompt,
***************
*** 1593,1599 ****
  	       struct fbrowser_call  *fc));  
  
  
! /* browser.c */
  
  extern struct folder_info * folder_browser P_((struct menu_context *page,
  					       struct folder_browser *p,
--- 1735,1741 ----
  	       struct fbrowser_call  *fc));  
  
  
! /* src/browser.c */
  
  extern struct folder_info * folder_browser P_((struct menu_context *page,
  					       struct folder_browser *p,
***************
*** 1635,1641 ****
  			    struct string * default_extension,
  			    const char *format, const char *msg, ...));
  
! /* metapager.c */
  
  
  extern struct pager_page * init_pager_page P_((struct menu_common *mptr));
--- 1777,1783 ----
  			    struct string * default_extension,
  			    const char *format, const char *msg, ...));
  
! /* src/metapager.c */
  
  
  extern struct pager_page * init_pager_page P_((struct menu_common *mptr));
***************
*** 1659,1665 ****
  
  extern int mime_signature_mismatch P_((mime_t *ptr, int displaying));
  
! /* signals.c */
  
  extern char * Stopped_Text;  /* Initialized by init.c */
  extern char * Back_Text;     /* Initialized by init.c */
--- 1801,1807 ----
  
  extern int mime_signature_mismatch P_((mime_t *ptr, int displaying));
  
! /* src/signals.c */
  
  extern char * Stopped_Text;  /* Initialized by init.c */
  extern char * Back_Text;     /* Initialized by init.c */
***************
*** 1898,1904 ****
  
  /* Used for sorting */
  struct thread_info {
!     struct string  * thread_subject;
      
      /* first and last on sent time */
      time_t    time_sent_first;
--- 2040,2046 ----
  
  /* Used for sorting */
  struct thread_info {
!      struct string_sort  * thread_subject;
      
      /* first and last on sent time */
      time_t    time_sent_first;
***************
*** 2363,2368 ****
--- 2505,2520 ----
  				int row, int col));
  extern int menu_GetAbsLine P_((struct menu_context *ctx,int row));
  
+ /* Actual *res_col == col
+    return 1 if *res_row is on area
+ */
+ extern int menu_translate_pos P_((struct menu_context *ctx,
+ 				  int row,
+ 				  int col,
+ 				  struct menu_context *res_ctx,
+ 				  int * res_row,
+ 				  int * res_col));
+ 
  extern void CarriageReturn P_((void));
  extern void NewLine P_((void));
  
***************
*** 2495,2500 ****
--- 2647,2654 ----
  extern void delete_alias_from_aview P_((struct AliasView *aview,
  					int idx));
  
+ extern int file_changed_aliasview P_((struct AliasView *aview));
+ 
  extern int write_aliasview P_((struct AliasView *aview));
  
  extern int start_edit_aliases P_((struct AliasView *aview,
***************
*** 2625,2630 ****
--- 2779,2785 ----
  #define SYSTEM		1
  #define USER		2
  #define DUPLICATE	16
+ #define EXPUNGED        32
  
  /** 2) some defines to aid in the limiting of alias displays **/
  
***************
*** 2908,2913 ****
--- 3063,3074 ----
  			   struct AliasView *aview,
  			   struct menu_context  *parent_page));
  
+ extern int compare_threads_1_sentd P_((const struct thread_info *X1,
+ 				       const struct thread_info *X2));
+ extern int compare_threads_1_revsentd P_((const struct thread_info *X1,
+ 					  const struct thread_info *X2));
+ 
+ 
  /* src/mailbox.c */
  
  
Index: elmME+.2.5.alpha60/hdrs/melib.h
*** elmME+.2.5.alpha54/hdrs/melib.h	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/hdrs/melib.h	Fri Sep  2 20:38:19 2022
***************
*** 1,7 ****
! /* $Id: melib.h,v 2.26 2021/01/17 18:53:16 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.26 $   $State: Exp $
   *
   *  Author: Kari Hurtta  
   *                  (was hurtta+elm@posti.FMI.FI, hurtta+elm@ozone.FMI.FI)
--- 1,7 ----
! /* $Id: melib.h,v 2.29 2022/08/19 16:13:04 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.29 $   $State: Exp $
   *
   *  Author: Kari Hurtta  
   *                  (was hurtta+elm@posti.FMI.FI, hurtta+elm@ozone.FMI.FI)
***************
*** 91,96 ****
--- 91,100 ----
  extern void mime_panic          P_((char *,int,char *, char *));
  extern int check_encoding       P_((char *));
  
+ /* Is mime type multipart/report; report-type=delivery-status; ? */
+ extern int mime_type_is_dsn P_((mime_t *p));
+ 
+ 
  /* mime_decode.c */
  
  extern int rfc822_header_filter     P_((header_list_ptr hdr, int flag, int have_title));
***************
*** 178,184 ****
  /* mime_selector.c ---------------------------------------------------- */
  
  
! extern int mime_classify_media P_((mime_t *p,struct header_rec * hdr));
  
  /* Returns -1 on failure otherwise same mask than mime_classify_media() */
  typedef int mime_run_selector P_((mime_t *p,struct header_rec * hdr));
--- 182,196 ----
  /* mime_selector.c ---------------------------------------------------- */
  
  
! enum mime_classify_mode {
!     mime_classify_all = 1,
!     mime_classify_skip_mailcap    /* DO not register mailcap yet */
! };
!     
! extern int mime_classify_media P_((mime_t *p,struct header_rec * hdr,
! 				   enum mime_classify_mode mode));
! 
! extern char * mime_debug_classify_f P_((int c));
  
  /* Returns -1 on failure otherwise same mask than mime_classify_media() */
  typedef int mime_run_selector P_((mime_t *p,struct header_rec * hdr));
***************
*** 223,230 ****
      unsigned short              magic;             /* MIME_selector_magic */
  
      struct  mt_handle_pager     *handler;          /* Found internal handler */
      struct mailcap_entry        *entry;            /* Found external handler */
!   
      EC_decoder_t        EC_decoder;
      SG_decoder_t        SG_decoder;
      TXT_decoder_t       TXT_decoder;   
--- 235,249 ----
      unsigned short              magic;             /* MIME_selector_magic */
  
      struct  mt_handle_pager     *handler;          /* Found internal handler */
+     
      struct mailcap_entry        *entry;            /* Found external handler */
! 
!     struct mailcap_entry      ** other_entries;      /* Found entries if 
! 						      "mailcap-select-other"
! 						      is set (default)
! 						   */
!     size_t                       num_other_entries;
!     
      EC_decoder_t        EC_decoder;
      SG_decoder_t        SG_decoder;
      TXT_decoder_t       TXT_decoder;   
***************
*** 326,332 ****
  
  /* --- --- */
  
! #define DISPOSITION(x) (x == DISP_INLINE ? "inline" : "attachment")
  #define ENCODING(x) (x >= 0 && x < ENCODING_count && mime_encode_names[x] ?\
     mime_encode_names[x] : "")
  extern char *mime_encode_names[ENCODING_count]; /* defined in mime.c */
--- 345,354 ----
  
  /* --- --- */
  
! #define DISPOSITION(x) (x >= 0 && x < DISP_count && mime_disposition_names[x] ?\
! 	mime_disposition_names[x] : "")
! extern char * mime_disposition_names[DISP_count]; /* defined in mime.c */
! 
  #define ENCODING(x) (x >= 0 && x < ENCODING_count && mime_encode_names[x] ?\
     mime_encode_names[x] : "")
  extern char *mime_encode_names[ENCODING_count]; /* defined in mime.c */
Index: elmME+.2.5.alpha60/hdrs/misclib.h
*** elmME+.2.5.alpha54/hdrs/misclib.h	Tue May 12 21:18:18 2020
--- elmME+.2.5.alpha60/hdrs/misclib.h	Sat Aug 28 14:11:45 2021
***************
*** 1,7 ****
! /* $Id: misclib.h,v 2.23 2020/05/12 18:18:18 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.23 $   $State: Exp $
   *
   *  Author: Kari Hurtta  (was hurtta+elm@posti.FMI.FI)
   *      or  Kari Hurtta 
--- 1,7 ----
! /* $Id: misclib.h,v 2.27 2021/07/13 07:58:36 hurtta Exp $ */
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.27 $   $State: Exp $
   *
   *  Author: Kari Hurtta  (was hurtta+elm@posti.FMI.FI)
   *      or  Kari Hurtta 
***************
*** 113,118 ****
--- 113,119 ----
  #define MIME_SIGNED      16
  #define MIME_ENCRYPTED   32
  #define MIME_PARTIAL     64       /* Message fragment */
+ #define MIME_REPORT     128       /* Maybe DSN */
  
  extern int                  get_type_flags       P_((media_type_t T));
  extern const char *         get_subtype_name     P_((media_type_t T));
***************
*** 270,276 ****
  
  /* lib/misc/conf_writer.c */
  
! extern void write_conf P_((const char *actor,char *version_buff));
  				  
  extern struct string * conf_taglist P_((struct string *sep));
  
--- 271,298 ----
  
  /* lib/misc/conf_writer.c */
  
! /* Return 1 if suffix is OK */
! extern int check_file_backup_suffix P_((const char * name,
! 					const char * option /* for error message */,
! 					const char * backup_suffix));
! 
! /* Return 1 if suffix is OK */
! extern int check_conf_backup_suffix P_((const char * option /* for error message */,
! 				 const char * backup_suffix));
! 
! 
! enum write_conf_rewrite {
!     write_conf_full_rewrite = 0,
!     write_conf_auto_rewrite
! };
! 
! extern void write_conf P_((const char            * actor,
! 			   char                  * version_buff,
! 			   enum write_conf_rewrite rewrite /* Automatic rewrite to
! 							      some files */,
! 			   const char            * backup_suffix
! 			   
! 			   ));
  				  
  extern struct string * conf_taglist P_((struct string *sep));
  
***************
*** 308,314 ****
  					  struct mail_services_conf *new));
  
  
! /* lib/misc/iso2022.c */
  
  extern void change_iso2022_map P_((struct iso2022_map_conf **conf,
  				   struct iso2022_map_conf *new,
--- 330,336 ----
  					  struct mail_services_conf *new));
  
  
! /* lib/misc/iso2022.c ------------------------------------------------------------ */
  
  extern void change_iso2022_map P_((struct iso2022_map_conf **conf,
  				   struct iso2022_map_conf *new,
***************
*** 318,324 ****
--- 340,355 ----
  				 FILE *commentfile, const char *actor,
  				 char *version_buff));
  
+ /* lib/misc/filelock.c ----------------------------------------------------------- */
+ 
  
+ extern enum FLOCKING_status filelock_fd P_((int fd,
+ 					    enum FLOCKING_mode     op,
+ 					    struct dt_flags_info * flags,
+ 					    const char           * filename /* may be NULL */,
+ 					    enum FLOCKING_blocking blockit,
+ 					    int                  * errno_res
+ 					    ));
  
  /*
   * Local Variables:
Index: elmME+.2.5.alpha60/hdrs/readmsg.h
*** elmME+.2.5.alpha54/hdrs/readmsg.h	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/hdrs/readmsg.h	Thu May 26 11:16:29 2022
***************
*** 1,6 ****
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.13 $   $State: Exp $
   *
   *  Author: Kari Hurtta  (was hurtta+elm@posti.FMI.FI)
   *      or  Kari Hurtta 
--- 1,6 ----
  
  /******************************************************************************
!  *  The Elm (ME+) Mail System  -  $Revision: 2.14 $   $State: Exp $
   *
   *  Author: Kari Hurtta  (was hurtta+elm@posti.FMI.FI)
   *      or  Kari Hurtta 
***************
*** 27,33 ****
  static char copyright[] FORIDENT = { 
  		"@(#)          (C) Copyright 1986,1987, Dave Taylor\n@(#)\n\
  @(#)          (C) Copyright 1988-1992, The Usenet Community Trust\n\
! @(#)          (C) Copyright 1996-2021, Kari Hurtta\n" };
  
  /******** global variables accessable by all pieces of the program *******/
  
--- 27,33 ----
  static char copyright[] FORIDENT = { 
  		"@(#)          (C) Copyright 1986,1987, Dave Taylor\n@(#)\n\
  @(#)          (C) Copyright 1988-1992, The Usenet Community Trust\n\
! @(#)          (C) Copyright 1996-2022, Kari Hurtta\n" };
  
  /******** global variables accessable by all pieces of the program *******/
  
Index: elmME+.2.5.alpha60/hdrs/s_aliases.h
*** elmME+.2.5.alpha54/hdrs/s_aliases.h	Mon Apr 13 07:34:53 2015
--- elmME+.2.5.alpha60/hdrs/s_aliases.h	Sat Aug 28 14:11:45 2021
***************
*** 174,176 ****
--- 174,188 ----
  #define AliasesInfoUnknownCommand2	0xfb
  #define AliasesEmpty	0xfc
  #define AliasesNoValue	0xfd
+ #define AliasesWaitingUpdFail	0xfe
+ #define AliasesMergeFailed	0xff
+ #define AliasesMergeFailed1	0x100
+ #define AliasesWaitingUpdError	0x101
+ #define AliasesWaitingUpdOK	0x102
+ #define AliasesWaitingUpd	0x103
+ #define AliasesMergeFailed2	0x104
+ #define AliasesMergeFailed3	0x105
+ #define AliasesBackupFailed	0x106
+ #define AliasesFileError	0x107
+ #define AliasesInfoAddressNoneRO	0x108
+ #define AliasesInfoAddressNone	0x109
Index: elmME+.2.5.alpha60/hdrs/s_elm.h
*** elmME+.2.5.alpha54/hdrs/s_elm.h	Tue Apr 20 20:32:06 2021
--- elmME+.2.5.alpha60/hdrs/s_elm.h	Fri Sep  2 20:38:19 2022
***************
*** 884,890 ****
  #define ElmMailcapMenu	0x490
  #define ElmUseMailcap	0x491
  #define ElmMetamail	0x492
- #define ElmMailcapDone	0x493
  #define ElmTitleQuit	0x494
  #define ElmIconQuit	0x495
  #define ElmTitleSusp	0x496
--- 884,889 ----
***************
*** 1156,1162 ****
  #define ElmMetamailMailcapBL1	0x5a5
  #define ElmMailcapPageB	0x5a6
  #define ElmMailcapPageC	0x5a7
- #define ElmMailcapDoneA	0x5a8
  #define ElmEX_USAGE	0x5a9
  #define ElmEX_DATAERR	0x5aa
  #define ElmEX_NOINPUT	0x5ab
--- 1155,1160 ----
***************
*** 1477,1479 ****
--- 1475,1509 ----
  #define ElmHdrEditUserAgent	0x6fa
  #define ElmBuiltinCommandqi	0x6fb
  #define ElmCommandQIToQuitPager	0x6fc
+ #define ElmLeaveReadMsgS	0x6fd
+ #define ElmLeaveReadMsg	0x6fe
+ #define ElmLeaveReadNtfS	0x6ff
+ #define ElmLeaveReadNtf	0x700
+ #define ElmNoThisUseReceived	0x701
+ #define ElmLeaveMoveX	0x702
+ #define ElmLeaveMoveXRec	0x703
+ #define ElmLeaveUnReadMsgS	0x704
+ #define ElmLeaveUnReadMsg	0x705
+ #define ElmLeaveUnReadNtfS	0x706
+ #define ElmLeaveUnReadNtf	0x707
+ #define ElmLeaveKeepX	0x708
+ #define ElmLeaveKeepXName	0x709
+ #define ElmLeaveKeepXCount	0x70a
+ #define ElmCantOpenFileErr	0x70b
+ #define ElmArgsDupBackupOpt	0x70c
+ #define ElmDateYearParen	0x70d
+ #define ElmDateBadParen	0x70e
+ #define ElmCopiesToExp	0x70f
+ #define ElmGetToTitle	0x710
+ #define ElmGetCCTitle	0x711
+ #define ElmMailcapDefault	0x712
+ #define ElmMailcapUseYNOther	0x713
+ #define ElmMailcapUseYN	0x714
+ #define ElmMailcapViewParts	0x715
+ #define ElmMailcapViewDoneTail	0x716
+ #define ElmMailcapUseSpace	0x717
+ #define ElmMailcapUseMetamail	0x718
+ #define ElmMailcapMenu2e	0x719
+ #define ElmMailcapOtherT	0x71a
+ #define ElmHdrmenuHdrAddressSel	0x71b
+ #define ElmHdrmenuHdrAddressSel1	0x71c

-- 
/ Kari Hurtta