-
/*
- * mh.h -- main header file for all of nmh
- */
+** mh.h -- main header file for all of nmh
+*/
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <stdarg.h>
-#include <h/nmh.h>
/*
- * Well-used constants
- */
-#define NOTOK (-1) /* syscall()s return this on error */
-#define OK 0 /* ditto on success */
-#define DONE 1 /* trinary logic */
+** Well-used constants
+*/
+#define NOTOK (-1) /* syscall()s return this on error */
+#define OK 0 /* ditto on success */
+#define DONE 1 /* trinary logic */
#define ALL ""
-#define Nbby 8 /* number of bits/byte */
+#define Nbby 8 /* number of bits/byte */
-#define MAXARGS 1000 /* max arguments to exec */
-#define NFOLDERS 1000 /* max folder arguments on command line */
-#define DMAXFOLDER 4 /* typical number of digits */
-#define MAXFOLDER 1000 /* message increment */
+#define MAXARGS 1000 /* max arguments to exec */
+#define NFOLDERS 1000 /* max folder arguments on command line */
+#define DMAXFOLDER 4 /* typical number of digits */
+#define MAXFOLDER 1000 /* message increment */
#ifndef FALSE
-#define FALSE 0
+# define FALSE 0
#endif
#ifndef TRUE
-#define TRUE 1
+# define TRUE 1
#endif
typedef unsigned char boolean; /* not int so we can pack in a structure */
/* If we're using gcc then give it some information about
- * functions that abort.
- */
+** functions that abort.
+*/
#if __GNUC__ > 2
-#define NORETURN __attribute__((__noreturn__))
+# define NORETURN __attribute__((__noreturn__))
#else
-#define NORETURN
+# define NORETURN
+#endif
+
+/*
+** we should be getting this value from pathconf(_PC_PATH_MAX)
+*/
+#ifndef PATH_MAX
+# ifdef MAXPATHLEN
+# define PATH_MAX MAXPATHLEN
+# else
+ /* so we will just pick something */
+# define PATH_MAX 1024
+# endif
#endif
/*
- * user context/profile structure
- */
+** we should be getting this value from sysconf(_SC_OPEN_MAX)
+*/
+#ifndef OPEN_MAX
+# ifdef NOFILE
+# define OPEN_MAX NOFILE
+# else
+ /* so we will just pick something */
+# define OPEN_MAX 64
+# endif
+#endif
+
+/*
+** user context/profile structure
+*/
struct node {
- char *n_name; /* key */
- char *n_field; /* value */
- char n_context; /* context, not profile */
- struct node *n_next; /* next entry */
+ char *n_name; /* key */
+ char *n_field; /* value */
+ char n_context; /* context, not profile */
+ struct node *n_next; /* next entry */
};
/*
- * switches structure
- */
-#define AMBIGSW (-2) /* from smatch() on ambiguous switch */
-#define UNKWNSW (-1) /* from smatch() on unknown switch */
+** switches structure
+*/
+#define AMBIGSW (-2) /* from smatch() on ambiguous switch */
+#define UNKWNSW (-1) /* from smatch() on unknown switch */
struct swit {
- char *sw;
-
- /* The minchars field is apparently used like this:
-
- -# : Switch can be abbreviated to # characters; switch hidden in -help.
- 0 : Switch can't be abbreviated; switch shown in -help.
- # : Switch can be abbreviated to # characters; switch shown in -help. */
- int minchars;
+ char *sw;
+ /*
+ ** The minchars field is apparently used like this:
+ **
+ ** -# : Switch can be abbreviated to # chars; switch hidden in -help.
+ ** 0 : Switch can't be abbreviated; switch shown in -help.
+ ** # : Switch can be abbreviated to # chars; switch shown in -help.
+ */
+ int minchars;
};
-extern struct swit anoyes[]; /* standard yes/no switches */
-
-#define ATTACHFORMATS 3 /* Number of send attach formats. */
+extern struct swit anoyes[]; /* standard yes/no switches */
/*
- * general folder attributes
- */
-#define READONLY (1<<0) /* No write access to folder */
-#define SEQMOD (1<<1) /* folder's sequences modifed */
-#define ALLOW_NEW (1<<2) /* allow the "new" sequence */
-#define OTHERS (1<<3) /* folder has other files */
+** general folder attributes
+*/
+#define READONLY (1<<0) /* No write access to folder */
+#define SEQMOD (1<<1) /* folder's sequences modifed */
+#define ALLOW_BEYOND (1<<2) /* allow the beyond sequence */
+#define OTHERS (1<<3) /* folder has other files */
-#define FBITS "\020\01READONLY\02SEQMOD\03ALLOW_NEW\04OTHERS"
+#define FBITS "\020\01READONLY\02SEQMOD\03ALLOW_BEYOND\04OTHERS"
/*
- * type for holding the sequence set of a message
- */
+** type for holding the sequence set of a message
+*/
typedef unsigned int seqset_t;
/*
- * Determine the number of user defined sequences we
- * can have. The first 5 sequence flags are for
- * internal nmh message flags.
- */
-#define NUMATTRS ((sizeof(seqset_t) * Nbby) - 5)
+** internal messages attributes (sequences)
+*/
+#define EXISTS (1<<0) /* exists */
+#define SELECTED (1<<1) /* selected for use */
+#define SELECT_UNSEEN (1<<2) /* inc/show "unseen" */
-/*
- * first free slot for user defined sequences
- * and attributes
- */
-#define FFATTRSLOT 5
+#define MBITS "\020\01EXISTS\02SELECTED\03UNSEEN"
/*
- * internal messages attributes (sequences)
- */
-#define EXISTS (1<<0) /* exists */
-#define DELETED (1<<1) /* deleted */
-#define SELECTED (1<<2) /* selected for use */
-#define SELECT_EMPTY (1<<3) /* "new" message */
-#define SELECT_UNSEEN (1<<4) /* inc/show "unseen" */
+** first free slot for user-defined sequences
+*/
+#define FFATTRSLOT 3
-#define MBITS "\020\01EXISTS\02DELETED\03SELECTED\04NEW\05UNSEEN"
+/*
+** Determine the number of user defined sequences we
+** can have. The first few sequence flags are for
+** internal nmh message flags.
+*/
+#define NUMATTRS ((sizeof(seqset_t) * Nbby) - FFATTRSLOT)
/*
- * Primary structure of folder/message information
- */
+** Primary structure of folder/message information
+*/
struct msgs {
- int lowmsg; /* Lowest msg number */
- int hghmsg; /* Highest msg number */
- int nummsg; /* Actual Number of msgs */
-
- int lowsel; /* Lowest selected msg number */
- int hghsel; /* Highest selected msg number */
- int numsel; /* Number of msgs selected */
-
- int curmsg; /* Number of current msg if any */
-
- int msgflags; /* Folder attributes (READONLY, etc) */
- char *foldpath; /* Pathname of folder */
-
- /*
- * Name of sequences in this folder. We add an
- * extra slot, so we can NULL terminate the list.
- */
- char *msgattrs[NUMATTRS + 1];
-
- /*
- * bit flags for whether sequence
- * is public (0), or private (1)
- */
- seqset_t attrstats;
-
- /*
- * These represent the lowest and highest possible
- * message numbers we can put in the message status
- * area, without calling folder_realloc().
- */
- int lowoff;
- int hghoff;
-
- /*
- * This is an array of seqset_t which we allocate dynamically.
- * Each seqset_t is a set of bits flags for a particular message.
- * These bit flags represent general attributes such as
- * EXISTS, SELECTED, etc. as well as track if message is
- * in a particular sequence.
- */
- seqset_t *msgstats; /* msg status */
+ int lowmsg; /* Lowest msg number */
+ int hghmsg; /* Highest msg number */
+ int nummsg; /* Actual Number of msgs */
+
+ int lowsel; /* Lowest selected msg number */
+ int hghsel; /* Highest selected msg number */
+ int numsel; /* Number of msgs selected */
+
+ int curmsg; /* Number of current msg if any */
+
+ int msgflags; /* Folder attributes (READONLY, etc) */
+ char *foldpath; /* Pathname of folder */
+
+ /*
+ ** Name of sequences in this folder. We add an
+ ** extra slot, so we can NULL terminate the list.
+ */
+ char *msgattrs[NUMATTRS + 1];
+
+ /*
+ ** bit flags for whether sequence
+ ** is public (0), or private (1)
+ */
+ seqset_t attrstats;
+
+ /*
+ ** These represent the lowest and highest possible
+ ** message numbers we can put in the message status
+ ** area, without calling folder_realloc().
+ */
+ int lowoff;
+ int hghoff;
+
+ /*
+ ** This is an array of seqset_t which we allocate dynamically.
+ ** Each seqset_t is a set of bits flags for a particular message.
+ ** These bit flags represent general attributes such as
+ ** EXISTS, SELECTED, etc. as well as track if message is
+ ** in a particular sequence.
+ */
+ seqset_t *msgstats; /* msg status */
};
/*
- * Amount of space to allocate for msgstats. Allocate
- * the array to have space for messages numbers lo to hi.
- */
+** Amount of space to allocate for msgstats. Allocate
+** the array to have space for messages numbers lo to hi.
+*/
#define MSGSTATSIZE(mp,lo,hi) ((size_t) (((hi) - (lo) + 1) * sizeof(*(mp)->msgstats)))
-/*
- * macros for message and sequence manipulation
- */
-#define clear_msg_flags(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] = 0)
-#define copy_msg_flags(mp,i,j) \
- ((mp)->msgstats[(i) - mp->lowoff] = (mp)->msgstats[(j) - mp->lowoff])
-#define get_msg_flags(mp,ptr,msgnum) (*(ptr) = (mp)->msgstats[(msgnum) - mp->lowoff])
-#define set_msg_flags(mp,ptr,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] = *(ptr))
-
-#define does_exist(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] & EXISTS)
-#define unset_exists(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] &= ~EXISTS)
-#define set_exists(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] |= EXISTS)
-
-#define is_selected(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] & SELECTED)
-#define unset_selected(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] &= ~SELECTED)
-#define set_selected(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] |= SELECTED)
-
-#define is_select_empty(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] & SELECT_EMPTY)
-#define set_select_empty(mp,msgnum) \
- ((mp)->msgstats[(msgnum) - mp->lowoff] |= SELECT_EMPTY)
-
-#define is_unseen(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] & SELECT_UNSEEN)
-#define unset_unseen(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] &= ~SELECT_UNSEEN)
-#define set_unseen(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] |= SELECT_UNSEEN)
-
-
-#define in_sequence(mp,seqnum,msgnum) \
- ((mp)->msgstats[(msgnum) - mp->lowoff] & (1 << (FFATTRSLOT + seqnum)))
-#define clear_sequence(mp,seqnum,msgnum) \
- ((mp)->msgstats[(msgnum) - mp->lowoff] &= ~(1 << (FFATTRSLOT + seqnum)))
-#define add_sequence(mp,seqnum,msgnum) \
- ((mp)->msgstats[(msgnum) - mp->lowoff] |= (1 << (FFATTRSLOT + seqnum)))
-
-#define is_seq_private(mp,seqnum) \
- ((mp)->attrstats & (1 << (FFATTRSLOT + seqnum)))
-#define make_seq_public(mp,seqnum) \
- ((mp)->attrstats &= ~(1 << (FFATTRSLOT + seqnum)))
-#define make_seq_private(mp,seqnum) \
- ((mp)->attrstats |= (1 << (FFATTRSLOT + seqnum)))
-#define make_all_public(mp) \
- ((mp)->attrstats = 0)
+#define NULLMP ((struct msgs *) 0)
/*
- * macros for folder attributes
- */
-#define clear_folder_flags(mp) ((mp)->msgflags = 0)
-
-#define is_readonly(mp) ((mp)->msgflags & READONLY)
-#define set_readonly(mp) ((mp)->msgflags |= READONLY)
-
-#define other_files(mp) ((mp)->msgflags & OTHERS)
-#define set_other_files(mp) ((mp)->msgflags |= OTHERS)
-
-#define NULLMP ((struct msgs *) 0)
-
-/*
- * m_getfld() message parsing
- */
-
-#define NAMESZ 999 /* Limit on component name size.
- RFC 2822 limits line lengths to
- 998 characters, so a header name
- can be at most that long.
- m_getfld limits header names to 2
- less than NAMESZ, which is fine,
- because header names must be
- followed by a colon. Add one for
- terminating NULL. */
-
-#define LENERR (-2) /* Name too long error from getfld */
-#define FMTERR (-3) /* Message Format error */
-#define FLD 0 /* Field returned */
-#define FLDPLUS 1 /* Field returned with more to come */
-#define FLDEOF 2 /* Field returned ending at eom */
-#define BODY 3 /* Body returned with more to come */
-#define BODYEOF 4 /* Body returned ending at eom */
-#define FILEEOF 5 /* Reached end of input file */
-
-/*
- * Maildrop styles
- */
-#define MS_DEFAULT 0 /* default (one msg per file) */
-#define MS_UNKNOWN 1 /* type not known yet */
-#define MS_MBOX 2 /* Unix-style "from" lines */
-#define MS_MMDF 3 /* string mmdlm2 */
-
-extern int msg_count; /* m_getfld() indicators */
-extern int msg_style; /* .. */
-extern char *msg_delim; /* .. */
+** m_getfld() message parsing
+*/
+
+#define NAMESZ 999 /*
+ ** Limit on component name size.
+ ** RFC 2822 limits line lengths to
+ ** 998 characters, so a header name
+ ** can be at most that long.
+ ** m_getfld limits header names to 2
+ ** less than NAMESZ, which is fine,
+ ** because header names must be
+ ** followed by a colon. Add one for
+ ** terminating NULL.
+ */
+
+/* m_getfld2() returned data */
+struct field {
+ char name[NAMESZ];
+ size_t namelen;
+ char *value;
+ size_t valuelen;
+ size_t alloclen;
+ boolean crlf;
+};
-#define NOUSE 0 /* draft being re-used */
+/* m_getfld2() states */
+enum state {
+ LENERR2 = -2, /* Line too long */
+ FMTERR2 = -3, /* Format error in message */
+ IOERR2 = -1, /* Read error */
+ FLD2 = 0, /* Header field returned */
+ BODY2, /* Body line returned */
+ FILEEOF2 /* Reached end of input file */
+};
-#define TFOLDER 0 /* path() given a +folder */
-#define TFILE 1 /* path() given a file */
-#define TSUBCWF 2 /* path() given a @folder */
+#define NOUSE 0 /* draft being re-used */
-#define OUTPUTLINELEN 72 /* default line length for headers */
+#define OUTPUTLINELEN 72 /* default line length for headers */
/*
- * miscellaneous macros
- */
-#define pidXwait(pid,cp) pidstatus (pidwait (pid, NOTOK), stdout, cp)
+** miscellaneous macros
+*/
#ifndef max
# define max(a,b) ((a) > (b) ? (a) : (b))
# define min(a,b) ((a) < (b) ? (a) : (b))
#endif
-#ifndef abs
-# define abs(a) ((a) > 0 ? (a) : -(a))
-#endif
-
/*
- * GLOBAL VARIABLES
- */
-#define CTXMOD 0x01 /* context information modified */
-#define DBITS "\020\01CTXMOD"
+** GLOBAL VARIABLES
+*/
+#define CTXMOD 0x01 /* context information modified */
+#define DBITS "\020\01CTXMOD"
extern char ctxflags;
-extern char *invo_name; /* command invocation name */
-extern char *mypath; /* user's $HOME */
-extern char *defpath; /* pathname of user's profile */
-extern char *ctxpath; /* pathname of user's context */
-extern struct node *m_defs; /* list of profile/context entries */
+extern char *invo_name; /* command invocation name */
+extern char *mypath; /* user's $HOME */
+extern char *mmhdir;
+extern char *mmhpath;
+extern char *defpath; /* pathname of user's profile */
+extern char *ctxpath; /* pathname of user's context */
+extern struct node *m_defs; /* list of profile/context entries */
+extern char *mailstore; /* name of mail storage directory */
/*
- * These standard strings are defined in config.c. They are the
- * only system-dependent parameters in nmh, and thus by redefining
- * their values and reloading the various modules, nmh will run
- * on any system.
- */
-extern char *buildmimeproc;
-extern char *backup_prefix;
-extern char *altmsglink;
-extern char *catproc;
+** These standard strings are defined in config.c. They are the
+** only system-dependent parameters in nmh, and thus by redefining
+** their values and reloading the various modules, nmh will run
+** on any system.
+*/
+extern char *attach_hdr;
+extern char *sign_hdr;
+extern char *enc_hdr;
extern char *components;
extern char *context;
-extern char *current;
+extern char *curfolder;
extern char *defaulteditor;
+extern char *defaultpager;
extern char *defaultfolder;
extern char *digestcomps;
extern char *distcomps;
-extern char *draft;
-extern char *faceproc;
-extern char *fileproc;
+extern char *draftfolder;
extern char *foldprot;
extern char *forwcomps;
extern char *inbox;
-extern char *incproc;
-extern char *installproc;
-extern char *lproc;
-extern char *mailproc;
-extern char *mh_defaults;
-extern char *mh_profile;
+extern char *listproc;
+extern char *mhetcdir;
+extern char *mailspool;
extern char *mh_seq;
extern char *mhlformat;
-extern char *mhlforward;
-extern char *mhlproc;
extern char *mhlreply;
-extern char *moreproc;
+extern char *mimetypequery;
+extern char *mimetypequeryproc;
extern char *msgprot;
-extern char *nmhaccessftp;
extern char *nmhstorage;
-extern char *nmhcache;
-extern char *nmhprivcache;
extern char *nsequence;
-extern char *packproc;
-extern char *postproc;
-extern char *pfolder;
+extern char *profile;
extern char *psequence;
extern char *rcvdistcomps;
-extern char *rcvstoreproc;
extern char *replcomps;
extern char *replgroupcomps;
-extern char *rmfproc;
-extern char *rmmproc;
+extern char *scanformat;
extern char *sendmail;
-extern char *sendproc;
-extern char *showmimeproc;
-extern char *showproc;
+extern char *seq_all;
+extern char *seq_beyond;
+extern char *seq_cur;
+extern char *seq_first;
+extern char *seq_last;
+extern char *seq_next;
+extern char *seq_prev;
+extern char *seq_unseen;
+extern char *seq_neg;
+extern char *trashfolder;
extern char *usequence;
-extern char *version_num;
-extern char *version_str;
+extern char *version;
+extern char *lib_version;
extern char *whatnowproc;
-extern char *whomproc;
-
-extern void (*done) (int) NORETURN;
#include <h/prototypes.h>
-