]>
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
;
191 umask (~m_gmprot ());
193 tfile
= m_mktemp2(NULL
, invo_name
, NULL
, &fp
);
194 if (tfile
== NULL
) adios("viamail", "unable to create temporary file");
196 strncpy (tmpfil
, tfile
, sizeof(tmpfil
));
198 if (!strchr(mailsw
, '@'))
199 mailsw
= concat (mailsw
, "@", LocalName (0), NULL
);
200 fprintf (fp
, "To: %s\n", mailsw
);
203 fprintf (fp
, "Subject: %s\n", subjsw
);
206 if (!strchr(fromsw
, '@'))
207 fromsw
= concat (fromsw
, "@", LocalName (0), NULL
);
208 fprintf (fp
, "From: %s\n", fromsw
);
211 fprintf (fp
, "%s: %s\n", VRSN_FIELD
, VRSN_VALUE
);
212 fprintf (fp
, "%s: application/octet-stream", TYPE_FIELD
);
215 fprintf (fp
, "; %s", parmsw
);
218 fprintf (fp
, "\n\t(%s)", cmntsw
);
221 fprintf (fp
, "\n%s: %s", DESCR_FIELD
, descsw
);
223 fprintf (fp
, "\n%s: %s\n\n", ENCODING_FIELD
, "base64");
226 adios (tmpfil
, "error writing to");
228 writeBase64aux (stdin
, fp
);
230 adios (tmpfil
, "error writing to");
232 if (fstat (fileno (fp
), &st
) == NOTOK
)
233 adios ("failed", "fstat of %s", tmpfil
);
242 vec
= argsplit(postproc
, &program
, &vecp
);
244 vec
[vecp
++] = "-verbose";
246 switch (sendsbr (vec
, vecp
, program
, tmpfil
, &st
, 0, (char *)0, 0)) {
256 if (unlink (tmpfil
) == -1)
257 advise (NULL
, "unable to remove temp file %s", tmpfil
);