-
-/*
- * 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
#include <h/mh.h>
#include <fcntl.h>
-#include <h/signals.h>
#include <h/md5.h>
-#include <errno.h>
-#include <signal.h>
#include <h/mts.h>
#include <h/tws.h>
#include <h/mime.h>
#include <h/mhparse.h>
+#include <h/utils.h>
+#include "../sbr/m_mktemp.h"
#define VIAMAIL_SWITCHES \
X("to mailpath", 0, TOSW) \
int delay = 0;
char *f1 = NULL, *f2 = NULL, *f3 = NULL;
char *f4 = NULL, *f5 = NULL, *f7 = NULL;
- static char postpath[PATH_MAX];
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], 2)) { return 1; }
arguments = getarguments (invo_name, argc, argv, 0);
argp = arguments;
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;
- }
- }
- }
-
via_mail (f1, f2, f3, f4, f5, delay, f7);
return 0; /* dead code to satisfy the compiler */
}
via_mail (char *mailsw, char *subjsw, char *parmsw, char *descsw,
char *cmntsw, int delay, char *fromsw)
{
- int status, vecp = 1;
- char tmpfil[BUFSIZ];
- char *vec[MAXARGS];
+ int status, vecp;
+ char tmpfil[BUFSIZ], *program;
+ char **vec;
struct stat st;
FILE *fp;
char *tfile = NULL;
+ char *cp;
umask (~m_gmprot ());
- tfile = m_mktemp2(NULL, invo_name, NULL, &fp);
- if (tfile == NULL) adios("viamail", "unable to create temporary file");
- chmod(tfile, 0600);
+ if ((tfile = m_mktemp2(NULL, invo_name, NULL, &fp)) == NULL) {
+ adios(NULL, "unable to create temporary file in %s", get_temp_dir());
+ }
strncpy (tmpfil, tfile, sizeof(tmpfil));
if (!strchr(mailsw, '@'))
if (fflush (fp))
adios (tmpfil, "error writing to");
- writeBase64aux (stdin, fp);
+ writeBase64aux (stdin, fp, 0);
if (fflush (fp))
adios (tmpfil, "error writing to");
splitsw = delay;
status = 0;
- vec[0] = r1bindex (postproc, '/');
+
+ vec = argsplit(postproc, &program, &vecp);
if (verbsw)
vec[vecp++] = "-verbose";
- switch (sendsbr (vec, vecp, tmpfil, &st, 0, (char *)0, 0)) {
+ if ((cp = context_find ("credentials"))) {
+ /* post doesn't read context so need to pass credentials. */
+ vec[vecp++] = "-credentials";
+ vec[vecp++] = cp;
+ }
+
+ 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;
}