-
-/*
- * viamail.c -- send multiple files in a MIME message
+/* viamail.c -- send multiple files in a MIME message
*
* This code is Copyright (c) 2002, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
* complete copyright information.
*/
-#include <h/mh.h>
+#include "h/mh.h"
+#include "sendsbr.h"
+#include "sbr/m_gmprot.h"
+#include "sbr/getarguments.h"
+#include "sbr/concat.h"
+#include "sbr/smatch.h"
+#include "sbr/context_find.h"
+#include "sbr/ambigsw.h"
+#include "sbr/print_version.h"
+#include "sbr/print_help.h"
+#include "sbr/arglist.h"
+#include "sbr/error.h"
#include <fcntl.h>
-#include <h/signals.h>
-#include <h/md5.h>
-#include <h/mts.h>
-#include <h/tws.h>
-#include <h/mime.h>
-#include <h/mhparse.h>
+#include "h/mts.h"
+#include "h/tws.h"
+#include "h/mime.h"
+#include "h/mhparse.h"
+#include "h/done.h"
+#include "h/utils.h"
+#include "sbr/m_mktemp.h"
+#include "sbr/base64.h"
#define VIAMAIL_SWITCHES \
X("to mailpath", 0, TOSW) \
X("parameters arguments", 0, PARAMSW) \
X("description text", 0, DESCRIPTSW) \
X("comment text", 0, COMMENTSW) \
- X("delay seconds", 0, DELAYSW) \
X("verbose", 0, VERBSW) \
X("noverbose", 0, NVERBSW) \
X("version", 0, VERSIONSW) \
#undef X
extern int debugsw;
-extern int splitsw;
-extern int verbsw;
+extern bool verbsw;
/*
* static prototypes
*/
-static int via_mail (char *, char *, char *, char *, char *, int, char *);
+static int via_mail (char *, char *, char *, char *, char *, char *);
int
main (int argc, char **argv)
{
- int delay = 0;
char *f1 = NULL, *f2 = NULL, *f3 = NULL;
- char *f4 = NULL, *f5 = NULL, *f7 = NULL;
- static char postpath[PATH_MAX];
+ char *f4 = NULL, *f5 = NULL, *f6 = NULL;
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], true, false)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 0);
argp = arguments;
ambigsw (cp, switches);
done (1);
case UNKWNSW:
- adios (NULL, "-%s unknown", cp);
+ die("-%s unknown", cp);
case HELPSW:
snprintf (buf, sizeof(buf), "%s [switches]", invo_name);
case TOSW:
if (!(f1 = *argp++))
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
continue;
case SUBJECTSW:
if (!(f2 = *argp++))
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
continue;
case PARAMSW:
if (!(f3 = *argp++))
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
continue;
case DESCRIPTSW:
if (!(f4 = *argp++))
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
continue;
case COMMENTSW:
if (!(f5 = *argp++))
- adios (NULL, "missing argument to %s", argp[-2]);
- continue;
- case DELAYSW:
- if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
-
- /*
- * If there is an error, just reset the delay parameter
- * to -1. We will set a default delay later.
- */
- if (sscanf (cp, "%d", &delay) != 1)
- delay = -1;
+ die("missing argument to %s", argp[-2]);
continue;
case FROMSW:
- if (!(f7 = *argp++))
- adios (NULL, "missing argument to %s", argp[-2]);
+ if (!(f6 = *argp++))
+ die("missing argument to %s", argp[-2]);
continue;
case VERBSW:
- verbsw = 1;
+ verbsw = true;
continue;
case NVERBSW:
- verbsw = 0;
+ verbsw = false;
continue;
case DEBUGSW:
}
if (!f1)
- adios (NULL, "missing -viamail \"mailpath\" switch");
-
- /* viamail doesn't read the context and postproc isn't always what
- we want, such as when running make distcheck. If we have the
- absolute path, set postproc to point to post in the same
- directory as this executable.
- This could be generalized to handle relative paths (by
- converting to absolute), to find the full path from PATH given
- just the basename, and to squash out ../ but it's only needed
- here. viamail is typically called from sendfiles, which
- provides the absolute path.
- */
- if (argv[0] && argv[0][0] == '/' &&
- strlen(argv[0]) - 3 < sizeof postpath) {
- strncpy (postpath, argv[0], sizeof postpath - 1);
- postpath[sizeof postpath - 1] = '\0';
- if ((cp = strrchr (postpath, '/'))) {
- struct stat st;
-
- *(cp + 1) = '\0';
- /* strlen ("post") <= sizeof postpath - (cp - postpath) - 2
- but use strncat just in case the code above changes. */
- strncat (postpath, "post", sizeof postpath - (cp - postpath) - 2);
-
- if (stat (postpath, &st) == OK) {
- postproc = postpath;
- }
- }
- }
+ die("missing -viamail \"mailpath\" switch");
- via_mail (f1, f2, f3, f4, f5, delay, f7);
+ via_mail (f1, f2, f3, f4, f5, f6);
return 0; /* dead code to satisfy the compiler */
}
static int
via_mail (char *mailsw, char *subjsw, char *parmsw, char *descsw,
- char *cmntsw, int delay, char *fromsw)
+ char *cmntsw, char *fromsw)
{
int status, vecp;
char tmpfil[BUFSIZ], *program;
umask (~m_gmprot ());
if ((tfile = m_mktemp2(NULL, invo_name, NULL, &fp)) == NULL) {
- adios(NULL, "unable to create temporary file in %s", get_temp_dir());
+ die("unable to create temporary file in %s", get_temp_dir());
}
- strncpy (tmpfil, tfile, sizeof(tmpfil));
+ strncpy (tmpfil, tfile, sizeof(tmpfil) - 1);
if (!strchr(mailsw, '@'))
mailsw = concat (mailsw, "@", LocalName (0), NULL);
if (fflush (fp))
adios (tmpfil, "error writing to");
- writeBase64aux (stdin, fp);
+ writeBase64aux (stdin, fp, 0);
if (fflush (fp))
adios (tmpfil, "error writing to");
if (fstat (fileno (fp), &st) == NOTOK)
adios ("failed", "fstat of %s", tmpfil);
- if (delay < 0)
- splitsw = 10;
- else
- splitsw = delay;
-
status = 0;
vec = argsplit(postproc, &program, &vecp);
vec[vecp++] = cp;
}
- switch (sendsbr (vec, vecp, program, tmpfil, &st, 0, (char *)0, 0)) {
+ switch (sendsbr (vec, vecp, program, tmpfil, &st, 0, NULL)) {
case DONE:
case NOTOK:
status++;
}
fclose (fp);
- if (unlink (tmpfil) == -1)
- advise (NULL, "unable to remove temp file %s", tmpfil);
+ if (m_unlink (tmpfil) == -1)
+ advise (tmpfil, "unable to remove temp file %s", tmpfil);
done (status);
return 1;
}