]>
diplodocus.org Git - nmh/blob - uip/viamail.c
3 * viamail.c -- send multiple files in a MIME message
5 * This code is Copyright (c) 2002, by the authors of nmh. See the
6 * COPYRIGHT file in the root directory of the nmh distribution for
7 * complete copyright information.
12 #include <h/signals.h>
17 #include <h/mhparse.h>
19 #define VIAMAIL_SWITCHES \
20 X("to mailpath", 0, TOSW) \
21 X("from mailpath", 0, FROMSW) \
22 X("subject subject", 0, SUBJECTSW) \
23 X("parameters arguments", 0, PARAMSW) \
24 X("description text", 0, DESCRIPTSW) \
25 X("comment text", 0, COMMENTSW) \
26 X("delay seconds", 0, DELAYSW) \
27 X("verbose", 0, VERBSW) \
28 X("noverbose", 0, NVERBSW) \
29 X("version", 0, VERSIONSW) \
30 X("help", 0, HELPSW) \
31 X("debug", -5, DEBUGSW) \
33 #define X(sw, minchars, id) id,
34 DEFINE_SWITCH_ENUM(VIAMAIL
);
37 #define X(sw, minchars, id) { sw, minchars, id },
38 DEFINE_SWITCH_ARRAY(VIAMAIL
, switches
);
48 static int via_mail (char *, char *, char *, char *, char *, int, char *);
52 main (int argc
, char **argv
)
55 char *f1
= NULL
, *f2
= NULL
, *f3
= NULL
;
56 char *f4
= NULL
, *f5
= NULL
, *f7
= NULL
;
57 static char postpath
[PATH_MAX
];
58 char *cp
, buf
[BUFSIZ
];
59 char **argp
, **arguments
;
62 setlocale(LC_ALL
, "");
64 invo_name
= r1bindex (argv
[0], '/');
66 /* foil search of user profile/context */
67 if (context_foil (NULL
) == -1)
70 arguments
= getarguments (invo_name
, argc
, argv
, 0);
73 while ((cp
= *argp
++)) {
75 switch (smatch (++cp
, switches
)) {
77 ambigsw (cp
, switches
);
80 adios (NULL
, "-%s unknown", cp
);
83 snprintf (buf
, sizeof(buf
), "%s [switches]", invo_name
);
84 print_help (buf
, switches
, 1);
87 print_version(invo_name
);
92 adios (NULL
, "missing argument to %s", argp
[-2]);
96 adios (NULL
, "missing argument to %s", argp
[-2]);
100 adios (NULL
, "missing argument to %s", argp
[-2]);
104 adios (NULL
, "missing argument to %s", argp
[-2]);
108 adios (NULL
, "missing argument to %s", argp
[-2]);
111 if (!(cp
= *argp
++) || *cp
== '-')
112 adios (NULL
, "missing argument to %s", argp
[-2]);
115 * If there is an error, just reset the delay parameter
116 * to -1. We will set a default delay later.
118 if (sscanf (cp
, "%d", &delay
) != 1)
123 adios (NULL
, "missing argument to %s", argp
[-2]);
141 adios (NULL
, "missing -viamail \"mailpath\" switch");
143 /* viamail doesn't read the context and postproc isn't always what
144 we want, such as when running make distcheck. If we have the
145 absolute path, set postproc to point to post in the same
146 directory as this executable.
147 This could be generalized to handle relative paths (by
148 converting to absolute), to find the full path from PATH given
149 just the basename, and to squash out ../ but it's only needed
150 here. viamail is typically called from sendfiles, which
151 provides the absolute path.
153 if (argv
[0] && argv
[0][0] == '/' &&
154 strlen(argv
[0]) - 3 < sizeof postpath
) {
155 strncpy (postpath
, argv
[0], sizeof postpath
- 1);
156 postpath
[sizeof postpath
- 1] = '\0';
157 if ((cp
= strrchr (postpath
, '/'))) {
161 /* strlen ("post") <= sizeof postpath - (cp - postpath) - 2
162 but use strncat just in case the code above changes. */
163 strncat (postpath
, "post", sizeof postpath
- (cp
- postpath
) - 2);
165 if (stat (postpath
, &st
) == OK
) {
171 via_mail (f1
, f2
, f3
, f4
, f5
, delay
, f7
);
172 return 0; /* dead code to satisfy the compiler */
181 via_mail (char *mailsw
, char *subjsw
, char *parmsw
, char *descsw
,
182 char *cmntsw
, int delay
, char *fromsw
)
185 char tmpfil
[BUFSIZ
], *program
;
192 umask (~m_gmprot ());
194 tfile
= m_mktemp2(NULL
, invo_name
, NULL
, &fp
);
195 if (tfile
== NULL
) adios("viamail", "unable to create temporary file");
197 strncpy (tmpfil
, tfile
, sizeof(tmpfil
));
199 if (!strchr(mailsw
, '@'))
200 mailsw
= concat (mailsw
, "@", LocalName (0), NULL
);
201 fprintf (fp
, "To: %s\n", mailsw
);
204 fprintf (fp
, "Subject: %s\n", subjsw
);
207 if (!strchr(fromsw
, '@'))
208 fromsw
= concat (fromsw
, "@", LocalName (0), NULL
);
209 fprintf (fp
, "From: %s\n", fromsw
);
212 fprintf (fp
, "%s: %s\n", VRSN_FIELD
, VRSN_VALUE
);
213 fprintf (fp
, "%s: application/octet-stream", TYPE_FIELD
);
216 fprintf (fp
, "; %s", parmsw
);
219 fprintf (fp
, "\n\t(%s)", cmntsw
);
222 fprintf (fp
, "\n%s: %s", DESCR_FIELD
, descsw
);
224 fprintf (fp
, "\n%s: %s\n\n", ENCODING_FIELD
, "base64");
227 adios (tmpfil
, "error writing to");
229 writeBase64aux (stdin
, fp
);
231 adios (tmpfil
, "error writing to");
233 if (fstat (fileno (fp
), &st
) == NOTOK
)
234 adios ("failed", "fstat of %s", tmpfil
);
243 vec
= argsplit(postproc
, &program
, &vecp
);
245 vec
[vecp
++] = "-verbose";
247 if ((cp
= context_find ("credentials"))) {
248 /* post doesn't read context so need to pass credentials. */
249 vec
[vecp
++] = "-credentials";
253 switch (sendsbr (vec
, vecp
, program
, tmpfil
, &st
, 0, (char *)0, 0)) {
263 if (unlink (tmpfil
) == -1)
264 advise (NULL
, "unable to remove temp file %s", tmpfil
);