X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fviamail.c;h=76450ac4df6b7b1e07e4a238d8dd69b9a92cb282;hp=bb5b12cd431958815bf8835fc0fb01f7840b2946;hb=8ff284ff9167eff8f5349481529332d59ed913b1;hpb=1691e80890e5d8ba258c51c214a3e91880e1db2b diff --git a/uip/viamail.c b/uip/viamail.c index bb5b12c..76450ac 100644 --- a/uip/viamail.c +++ b/uip/viamail.c @@ -1,9 +1,10 @@ - /* - * viamail.c -- send multiple files in a MIME message - * - * $Id$ - */ +** 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 #include @@ -11,8 +12,8 @@ #include #include #include -#include -#include +#include +#include #include #include @@ -21,229 +22,218 @@ #endif static struct swit switches[] = { -#define TOSW 0 - { "to mailpath", 0 }, -#define FROMSW 1 - { "from mailpath", 0 }, -#define SUBJECTSW 2 - { "subject subject", 0 }, -#define PARAMSW 3 - { "parameters arguments", 0 }, -#define DESCRIPTSW 4 - { "description text", 0 }, -#define COMMENTSW 5 - { "comment text", 0 }, -#define DELAYSW 6 - { "delay seconds", 0 }, -#define VERBSW 7 - { "verbose", 0 }, -#define NVERBSW 8 - { "noverbose", 0 }, -#define VERSIONSW 9 - { "version", 0 }, -#define HELPSW 10 - { "help", 4 }, -#define DEBUGSW 11 - { "debug", -5 }, - { NULL, 0 } +#define TOSW 0 + { "to mailpath", 0 }, +#define FROMSW 1 + { "from mailpath", 0 }, +#define SUBJECTSW 2 + { "subject subject", 0 }, +#define PARAMSW 3 + { "parameters arguments", 0 }, +#define DESCRIPTSW 4 + { "description text", 0 }, +#define COMMENTSW 5 + { "comment text", 0 }, +#define VERBSW 6 + { "verbose", 0 }, +#define NVERBSW 7 + { "noverbose", 0 }, +#define VERSIONSW 8 + { "version", 0 }, +#define HELPSW 9 + { "help", 0 }, +#define DEBUGSW 10 + { "debug", -5 }, + { NULL, 0 } }; -extern int errno; extern int debugsw; -extern int splitsw; extern int verbsw; -int ebcdicsw = 0; /* hack for linking purposes */ +int ebcdicsw = 0; /* hack for linking purposes */ /* mhmisc.c */ -void set_endian (void); +void set_endian(void); /* mhoutsbr.c */ -int writeBase64aux (FILE *, FILE *); +int writeBase64aux(FILE *, FILE *); /* - * static prototypes - */ -static int via_mail (char *, char *, char *, char *, char *, int, char *); +** static prototypes +*/ +static int via_mail(char *, char *, char *, char *, char *, char *); int -main (int argc, char **argv) +main(int argc, char **argv) { - int delay = 0; - char *f1 = NULL, *f2 = NULL, *f3 = NULL; - char *f4 = NULL, *f5 = NULL, *f7 = NULL; - char *cp, buf[BUFSIZ]; - char **argp, **arguments; + char *f1 = NULL, *f2 = NULL, *f3 = NULL; + char *f4 = NULL, *f5 = NULL, *f7 = NULL; + char *cp, buf[BUFSIZ]; + char **argp, **arguments; #ifdef LOCALE - setlocale(LC_ALL, ""); + setlocale(LC_ALL, ""); #endif - invo_name = r1bindex (argv[0], '/'); - - /* foil search of user profile/context */ - if (context_foil (NULL) == -1) - done (1); - - arguments = getarguments (invo_name, argc, argv, 0); - argp = arguments; - - while ((cp = *argp++)) { - if (*cp == '-') { - switch (smatch (++cp, switches)) { - case AMBIGSW: - ambigsw (cp, switches); - done (1); - case UNKWNSW: - adios (NULL, "-%s unknown", cp); - - case HELPSW: - snprintf (buf, sizeof(buf), "%s [switches]", invo_name); - print_help (buf, switches, 1); - done (1); - case VERSIONSW: - print_version(invo_name); - done (1); - - case TOSW: - if (!(f1 = *argp++)) - adios (NULL, "missing argument to %s", argp[-2]); - continue; - case SUBJECTSW: - if (!(f2 = *argp++)) - adios (NULL, "missing argument to %s", argp[-2]); - continue; - case PARAMSW: - if (!(f3 = *argp++)) - adios (NULL, "missing argument to %s", argp[-2]); - continue; - case DESCRIPTSW: - if (!(f4 = *argp++)) - adios (NULL, "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; - continue; - case FROMSW: - if (!(f7 = *argp++)) - adios (NULL, "missing argument to %s", argp[-2]); - continue; - - case VERBSW: - verbsw = 1; - continue; - case NVERBSW: - verbsw = 0; - continue; - - case DEBUGSW: - debugsw = 1; - continue; - } + invo_name = mhbasename(argv[0]); + + /* foil search of user profile/context */ + if (context_foil(NULL) == -1) + done(1); + + arguments = getarguments(invo_name, argc, argv, 0); + argp = arguments; + + while ((cp = *argp++)) { + if (*cp == '-') { + switch (smatch(++cp, switches)) { + case AMBIGSW: + ambigsw(cp, switches); + done(1); + case UNKWNSW: + adios(NULL, "-%s unknown", cp); + + case HELPSW: + snprintf(buf, sizeof(buf), "%s [switches]", + invo_name); + print_help(buf, switches, 1); + done(1); + case VERSIONSW: + print_version(invo_name); + done(1); + + case TOSW: + if (!(f1 = *argp++)) + adios(NULL, "missing argument to %s", + argp[-2]); + continue; + case SUBJECTSW: + if (!(f2 = *argp++)) + adios(NULL, "missing argument to %s", + argp[-2]); + continue; + case PARAMSW: + if (!(f3 = *argp++)) + adios(NULL, "missing argument to %s", + argp[-2]); + continue; + case DESCRIPTSW: + if (!(f4 = *argp++)) + adios(NULL, "missing argument to %s", + argp[-2]); + continue; + case COMMENTSW: + if (!(f5 = *argp++)) + adios(NULL, "missing argument to %s", + argp[-2]); + continue; + case FROMSW: + if (!(f7 = *argp++)) + adios(NULL, "missing argument to %s", + argp[-2]); + continue; + + case VERBSW: + verbsw = 1; + continue; + case NVERBSW: + verbsw = 0; + continue; + + case DEBUGSW: + debugsw = 1; + continue; + } + } } - } - set_endian (); + set_endian(); - if (!f1) - adios (NULL, "missing -viamail \"mailpath\" switch"); + if (!f1) + adios(NULL, "missing -viamail \"mailpath\" switch"); - via_mail (f1, f2, f3, f4, f5, delay, f7); - /* NOTREACHED */ + via_mail(f1, f2, f3, f4, f5, f7); + return 0; /* dead code to satisfy the compiler */ } /* - * VIAMAIL - */ +** VIAMAIL +*/ static int -via_mail (char *mailsw, char *subjsw, char *parmsw, char *descsw, - char *cmntsw, int delay, char *fromsw) +via_mail(char *mailsw, char *subjsw, char *parmsw, char *descsw, + char *cmntsw, char *fromsw) { - int status, vecp = 1; - char tmpfil[BUFSIZ]; - char *vec[MAXARGS]; - struct stat st; - FILE *fp; - - umask (~m_gmprot ()); - - strncpy (tmpfil, m_tmpfil (invo_name), sizeof(tmpfil)); - if ((fp = fopen (tmpfil, "w+")) == NULL) - adios (tmpfil, "unable to open for writing"); - chmod (tmpfil, 0600); - - if (!strchr(mailsw, '@')) - mailsw = concat (mailsw, "@", LocalName (), NULL); - fprintf (fp, "To: %s\n", mailsw); - - if (subjsw) - fprintf (fp, "Subject: %s\n", subjsw); - - if (fromsw) { - if (!strchr(fromsw, '@')) - fromsw = concat (fromsw, "@", LocalName (), NULL); - fprintf (fp, "From: %s\n", fromsw); - } - - fprintf (fp, "%s: %s\n", VRSN_FIELD, VRSN_VALUE); - fprintf (fp, "%s: application/octet-stream", TYPE_FIELD); + int status, vecp = 1; + char tmpfil[BUFSIZ]; + char *vec[MAXARGS]; + struct stat st; + FILE *fp; + char *tfile = NULL; + + umask(~m_gmprot()); + + tfile = m_mktemp2(NULL, invo_name, NULL, &fp); + if (tfile == NULL) + adios("viamail", "unable to create temporary file"); + chmod(tfile, 0600); + strncpy(tmpfil, tfile, sizeof(tmpfil)); + + if (!strchr(mailsw, '@')) + mailsw = concat(mailsw, "@", LocalName(), NULL); + fprintf(fp, "To: %s\n", mailsw); + + if (subjsw) + fprintf(fp, "Subject: %s\n", subjsw); + + if (fromsw) { + if (!strchr(fromsw, '@')) + fromsw = concat(fromsw, "@", LocalName(), NULL); + fprintf(fp, "From: %s\n", fromsw); + } - if (parmsw) - fprintf (fp, "; %s", parmsw); + fprintf(fp, "%s: %s\n", VRSN_FIELD, VRSN_VALUE); + fprintf(fp, "%s: application/octet-stream", TYPE_FIELD); - if (cmntsw) - fprintf (fp, "\n\t(%s)", cmntsw); + if (parmsw) + fprintf(fp, "; %s", parmsw); - if (descsw) - fprintf (fp, "\n%s: %s", DESCR_FIELD, descsw); + if (cmntsw) + fprintf(fp, "\n\t(%s)", cmntsw); - fprintf (fp, "\n%s: %s\n\n", ENCODING_FIELD, "base64"); + if (descsw) + fprintf(fp, "\n%s: %s", DESCR_FIELD, descsw); - if (fflush (fp)) - adios (tmpfil, "error writing to"); + fprintf(fp, "\n%s: %s\n\n", ENCODING_FIELD, "base64"); - writeBase64aux (stdin, fp); - if (fflush (fp)) - adios (tmpfil, "error writing to"); + if (fflush(fp)) + adios(tmpfil, "error writing to"); - if (fstat (fileno (fp), &st) == NOTOK) - adios ("failed", "fstat of %s", tmpfil); + writeBase64aux(stdin, fp); + if (fflush(fp)) + adios(tmpfil, "error writing to"); - if (delay < 0) - splitsw = 10; - else - splitsw = delay; + if (fstat(fileno(fp), &st) == NOTOK) + adios("failed", "fstat of %s", tmpfil); - status = 0; - vec[0] = r1bindex (postproc, '/'); - if (verbsw) - vec[vecp++] = "-verbose"; + status = 0; + vec[0] = mhbasename(postproc); + if (verbsw) + vec[vecp++] = "-verbose"; - switch (sendsbr (vec, vecp, tmpfil, &st, 0)) { + switch (sendsbr(vec, vecp, tmpfil, &st, 0)) { case DONE: case NOTOK: - status++; - break; + status++; + break; case OK: - break; - } + break; + } - fclose (fp); - if (unlink (tmpfil) == -1) - advise (NULL, "unable to remove temp file %s", tmpfil); - done (status); + fclose(fp); + if (unlink(tmpfil) == -1) + advise(NULL, "unable to remove temp file %s", tmpfil); + done(status); + return 1; }