8. notify nmh-users?
+---------------------------------
+C library/system call usage notes
+---------------------------------
+* Use m_mktemp2() or m_mktemp() instead of mkstemp(3) (see section on
+ nmh temporary files below).
+* Use m_unlink() instead of unlink(3).
+* Use done() instead of _exit(3) except after a fork(3).
+
+
-------------------------
autoconf & automake files
-------------------------
getpass() nmh_getpass()
+-------------------
+nmh temporary files
+-------------------
+
+To create a temporary file, use m_mktemp2() or m_mktemp(). They use
+mkstemp(3), but they also register the temporary file for removal on
+program termination. So, do not use mkstemp() directly.
+
+To further support this, nmh_init() must be called at the beginning of
+main(). And, if a child process is not going to immediately call one
+of the exec(3) functions or _exit(3) after a fork(3), it should call
+unregister_for_removal(0). Finally, nmh_init() sets up signal handlers
+for several signals: these signal handlers should not be disabled.
+
+
--------------
nmh test suite
--------------
*/
void init_credentials_file ();
int nmh_get_credentials (char *, char *, int, nmh_creds_t);
+
+/*
+ * temporary file management
+ */
+int nmh_init(const char *argv0, int read_context);
+int m_unlink(const char *);
+void unregister_for_removal(int remove_files);
*/
#include <h/mh.h>
+#include <h/utils.h>
+#include <h/signals.h>
+
+static void register_for_removal(const char *);
+
/* Create a temporary file. If pfx_in is null, the temporary file
* will be created in the temporary directory (more on that later).
}
fd = mkstemp(tmpfil);
+
if (fd < 0) {
umask(oldmode);
return NULL;
}
+
+ register_for_removal(tmpfil);
+
if (fd_ret != NULL) {
*fd_ret = fd;
keep_open = 1;
}
return m_maildir("");
}
+
+
+/*
+ * Array of files (full pathnames) to remove on process exit.
+ * Instead of removing slots from the array, just set to NULL
+ * to indicate that the file should no longer be removed.
+ */
+static svector_t exit_filelist = NULL;
+
+/*
+ * Register a file for removal at program termination.
+ */
+static void
+register_for_removal(const char *pathname) {
+ if (exit_filelist == NULL) exit_filelist = svector_create(20);
+ (void) svector_push_back(exit_filelist, add(pathname, NULL));
+}
+
+/*
+ * Unregister all files that were registered to be removed at program
+ * termination. When called with remove_files of 0, this function is
+ * intended for use by one of the programs after a fork(3) without a
+ * subsequent call to one of the exec(3) functions or _exit(3). When
+ * called with non-0 remove_files argument, it is intended for use by
+ * an atexit() function.
+ *
+ * Right after a fork() and before calling exec() or _exit(), if the
+ * child catches one of the appropriate signals, it will remove
+ * all the registered temporary files. Some of those may be needed by
+ * the parent. Some nmh programs ignore or block some of the signals
+ * in the child right after fork(). For the other programs, rather
+ * than complicate things by preventing that, just take the chance
+ * that it might happen. It is harmless to attempt to unlink a
+ * temporary file twice, assuming another one wasn't created too
+ * quickly created with the same name.
+ */
+void
+unregister_for_removal(int remove_files) {
+ if (exit_filelist) {
+ size_t i;
+
+ for (i = 0; i < svector_size(exit_filelist); ++i) {
+ char *filename = svector_at(exit_filelist, i);
+
+ if (filename) {
+ if (remove_files) (void) unlink(filename);
+ free(filename);
+ }
+ }
+
+ svector_free(exit_filelist);
+ exit_filelist = NULL;
+ }
+}
+
+/*
+ * If the file was registered for removal, deregister it. In
+ * any case, unlink it.
+ */
+int
+m_unlink(const char *pathname) {
+ if (exit_filelist) {
+ char **slot = svector_find(exit_filelist, pathname);
+
+ if (slot && *slot) {
+ free(*slot);
+ *slot = NULL;
+ }
+ }
+
+ return unlink(pathname);
+ /* errno should be set to ENOENT if file was not found */
+}
+
+/*
+ * Remove all registered temporary files.
+ */
+void
+remove_registered_files_atexit() {
+ unregister_for_removal(1);
+}
+
+/*
+ * Remove all registered temporary files. Suitable for use as a
+ * signal handler. If the signal is one of the usual process
+ * termination signals, calls exit(). Otherwise, disables itself
+ * by restoring the default action and then re-raises the signal,
+ * in case the use was expecting a core dump.
+ */
+void
+remove_registered_files(int sig) {
+ struct sigaction act;
+
+ /*
+ * Ignore this signal for the duration. And we either exit() or
+ * disable this signal handler below, so don't restore this handler.
+ */
+ act.sa_handler = SIG_IGN;
+ (void) sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+ (void) sigaction(sig, &act, 0);
+
+ if (sig == SIGHUP || sig == SIGINT || sig == SIGQUIT || sig == SIGTERM) {
+ /*
+ * We don't need to call remove_registered_files_atexit() if
+ * it was registered with atexit(), but let's not assume that.
+ * It's harmless to call it twice.
+ */
+ remove_registered_files_atexit();
+
+ exit(1);
+ } else {
+ act.sa_handler = SIG_DFL;
+ (void) sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+ (void) sigaction(sig, &act, 0);
+
+ remove_registered_files_atexit();
+
+ (void) raise(sig);
+ }
+}
#include <h/mh.h>
#include <h/signals.h>
+/* sbr/m_mktemp.c */
+extern void remove_registered_files(int);
+
/*
* A version of the function `signal' that uses reliable
return (oact.sa_handler);
}
+
+/*
+ * For use by nmh_init().
+ */
+int
+setup_signal_handlers() {
+ /*
+ * Catch HUP, INT, QUIT, and TERM so that we can clean up tmp
+ * files when the user terminates the process early. And also a
+ * few other common signals that can be thrown due to bugs, stack
+ * overflow, etc.
+ */
+
+ if (SIGNAL(SIGHUP, remove_registered_files) == SIG_ERR ||
+ SIGNAL(SIGINT, remove_registered_files) == SIG_ERR ||
+ SIGNAL(SIGQUIT, remove_registered_files) == SIG_ERR ||
+ SIGNAL(SIGTERM, remove_registered_files) == SIG_ERR ||
+ SIGNAL(SIGILL, remove_registered_files) == SIG_ERR ||
+# ifdef SIGBUS
+ SIGNAL(SIGBUS, remove_registered_files) == SIG_ERR ||
+# endif
+ SIGNAL(SIGSEGV, remove_registered_files) == SIG_ERR) {
+ return NOTOK;
+ }
+
+ return OK;
+}
#include <h/utils.h>
#include <fcntl.h>
+/* sbr/signals.c */
+extern int setup_signal_handlers();
+
+/* sbr/m_mktemp.c */
+extern void remove_registered_files_atexit();
+
+
/*
* We allocate space for messages (msgs array)
* this number of elements at a time.
return NULL;
}
+
+
+int
+nmh_init(const char *argv0, int read_context) {
+#ifdef LOCALE
+ setlocale(LC_ALL, "");
+#endif
+
+ invo_name = r1bindex ((char *) argv0, '/');
+
+ if (setup_signal_handlers()) {
+ admonish("sigaction", "unable to set up signal handlers");
+ }
+
+ /* POSIX atexit() does not define any error conditions. */
+ if (atexit(remove_registered_files_atexit)) {
+ admonish("atexit", "unable to register atexit function");
+ }
+
+ if (read_context) {
+ context_read();
+ return OK;
+ } else {
+ int status = context_foil(NULL);
+ if (status != OK) {
+ advise("", "failed to create minimal profile/conext");
+ }
+ return status;
+ }
+}
char **vec = mh_xmalloc (argc * sizeof (char *)), **arguments;
struct aka *ak;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
mts_init (invo_name);
arguments = getarguments (invo_name, argc, argv, 1);
int list = 0; /* list header elements if set */
int number = 0; /* delete specific number of like elements if set */
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
char buf[BUFSIZ], **argp;
char **arguments, *addrs[NADDRS];
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
mts_init (invo_name);
arguments = getarguments (invo_name, argc, argv, 1);
struct smsg *smsgs;
struct msgs *mp;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
struct format *fmt;
struct stat st;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
char *cp, **argp, **arguments;
char buf[BUFSIZ], *akv[50];
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* foil search of user profile/context */
- if (context_foil (NULL) == -1)
- done (1);
+ if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; }
mts_init (invo_name);
arguments = getarguments (invo_name, argc, argv, 0);
struct msgs *mp = NULL;
struct stat st;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
char buf[BUFSIZ], **argp, **arguments;
char *dates[NDATES];
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
char **arguments;
char buf[BUFSIZ];
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex(argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
/*
* If program was invoked with name ending
char buf[BUFSIZ], *nfs, **argp, **arguments;
struct format *fmt;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
int dat[5];
struct fmt_callbacks cb, *cbp = NULL;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
char *cp, *dp, *msg = NULL, *argfolder = NULL;
char **ap, **argp, buf[BUFSIZ], **arguments;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
/*
* If program was invoked with name ending
char **argp, **arguments;
struct stat st;
struct msgs_array msgs = { 0, 0, NULL };
-
int buildsw = 0;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
SAVEGROUPPRIVS();
TRYDROPGROUPPRIVS();
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
mts_init (invo_name);
arguments = getarguments (invo_name, argc, argv, 1);
FILE *in, *out;
int check;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
+ if (nmh_init(argv[0], 0 /* use context_foil() */ )) { return 1; }
+
arguments = getarguments (invo_name, argc, argv, 0);
argp = arguments;
struct msgs_array msgs = { 0, 0, NULL };
struct msgs *mp;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
FILE *fp_out = NULL;
int header_encoding = CE_UNKNOWN;
- done=unlink_done;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
+ if (nmh_init(argv[0], 1)) { return 1; }
- /* read user profile/context */
- context_read();
+ done=unlink_done;
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
fx.decodetext = CE_8BIT;
fx.textcodeset = NULL;
- done = freects_done;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
+ if (nmh_init(argv[0], 1)) { return 1; }
- /* read user profile/context */
- context_read();
+ done = freects_done;
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
int
main (int argc, char **argv)
{
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
+ if (nmh_init(argv[0], 1)) { return 1; }
+
done (mhl (argc, argv));
return 1;
}
struct msgs *mp = NULL;
CT ct, *ctp;
- done=freects_done;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
+ if (nmh_init(argv[0], 1)) { return 1; }
- /* read user profile/context */
- context_read();
+ done=freects_done;
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
char buf[BUFSIZ], *files[MAXARGS];
char **argp, **arguments;
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
-
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
CT ct, *ctp;
FILE *fp;
- done=freects_done;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
+ if (nmh_init(argv[0], 1)) { return 1; }
- /* read user profile/context */
- context_read();
+ done=freects_done;
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
char *cp, buf[BUFSIZ], **argp;
char **arguments, *comps[MAXARGS];
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
struct msgs_array msgs = { 0, 0, NULL };
struct msgs *mp;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
CT ct, *ctp;
FILE *fp;
- done=freects_done;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
+ if (nmh_init(argv[0], 1)) { return 1; }
- /* read user profile/context */
- context_read();
+ done=freects_done;
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
CT ct, *ctp;
FILE *fp;
- done=freects_done;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
+ if (nmh_init(argv[0], 1)) { return 1; }
- /* read user profile/context */
- context_read();
+ done=freects_done;
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
struct msgs *mp = NULL;
CT ct, *ctp;
- done=freects_done;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
+ if (nmh_init(argv[0], 1)) { return 1; }
- /* read user profile/context */
- context_read();
+ done=freects_done;
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
char **argp, **arguments, *vec[MAXVEC];
struct passwd *pw;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
mts_init (invo_name);
char *cp, *file = NULL, *folder = NULL;
char **argp, **arguments, buf[BUFSIZ];
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
mts_init (invo_name);
arguments = getarguments (invo_name, argc,argv, 1);
char *unseen;
struct node *folder;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex(argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
struct msgs *mp;
struct stat st;
- done=mbxclose_done;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
+ if (nmh_init(argv[0], 1)) { return 1; }
- /* read user profile/context */
- context_read();
+ done=mbxclose_done;
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
struct msgs *mp, *mp2;
register FILE *fp;
- done=putzero_done;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
+ if (nmh_init(argv[0], 1)) { return 1; }
- /* read user profile/context */
- context_read();
+ done=putzero_done;
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
FILE *in, *out;
m_getfld_state_t gstate = 0;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* foil search of user profile/context */
- if (context_foil (NULL) == -1)
- done (1);
+ if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; }
mts_init (invo_name);
arguments = getarguments (invo_name, argc, argv, 0);
char *tmpfil;
m_getfld_state_t gstate = 0;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
FILE *fp;
char *tfile = NULL;
- done=unlink_done;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
+ if (nmh_init(argv[0], 1)) { return 1; }
- /* read user profile/context */
- context_read();
+ done=unlink_done;
/*
* Configure this now, since any unknown switches to rcvdist get
char *cp, *file = NULL, buf[BUFSIZ];
char **argp, **arguments;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
mts_init (invo_name);
arguments = getarguments (invo_name, argc, argv, 1);
struct msgs *mp;
struct stat st;
- done=unlink_done;
-
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
+ if (nmh_init(argv[0], 1)) { return 1; }
- /* read user profile/context */
- context_read();
+ done=unlink_done;
mts_init (invo_name);
arguments = getarguments (invo_name, argc, argv, 1);
char *cp, *user, buf[BUFSIZ], tty[BUFSIZ];
char **argp, **arguments, *vec[MAXARGS];
struct utmpx *utp;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
mts_init (invo_name);
arguments = getarguments (invo_name, argc, argv, 1);
struct msgs_array msgs = { 0, 0, NULL };
struct msgs *mp;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
int buildsw = 0;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
char *cp, *folder = NULL, newfolder[BUFSIZ];
char buf[BUFSIZ], **argp, **arguments;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
struct msgs_array msgs = { 0, 0, NULL };
struct msgs *mp;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
struct msgs *mp;
FILE *in;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
mts_init (invo_name);
arguments = getarguments (invo_name, argc, argv, 1);
char *attach = NMH_ATTACH_HEADER; /* header field name for attachments */
int attachformat = 1; /* mhbuild format specifier for attachments */
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
struct msgs_array msgs = { 0, 0, NULL };
struct msgs_array vec = { 0, 0, NULL };
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
if (!strcasecmp (invo_name, "next")) {
mode = NEXT;
char mailbox[BUFSIZ], tmpfil[BUFSIZ];
char **argp, **arguments;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (*argv, '/');
-
- /* foil search of user profile/context */
- if (context_foil (NULL) == -1)
- done (1);
+ if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; }
mts_init (invo_name);
arguments = getarguments (invo_name, argc, argv, 0);
struct smsg **dlist;
int checksw = 0;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
char *cp, buf[BUFSIZ];
char **argp, **arguments;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* foil search of user profile/context */
- if (context_foil (NULL) == -1)
- done (1);
+ if (nmh_init(argv[0], 0 /* use context_foil() */)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 0);
argp = arguments;
int
main (int argc, char **argv)
{
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
+ if (nmh_init(argv[0], 1)) { return 1; }
+
return WhatNow (argc, argv);
}
char *l; /* set on -l to alist command */
int n; /* set on -n to alist command */
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
-
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
char *msg = NULL, **ap, **argp, backup[BUFSIZ];
char buf[BUFSIZ], **arguments, *vec[MAXARGS];
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], 1)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;