#include <h/mime.h>
#include <h/tws.h>
#include <h/utils.h>
+#include <sysexits.h>
+#include <sys/wait.h>
#ifdef HAVE_SYS_TIME_H
# include <sys/time.h>
#include <time.h>
int debugsw = 0; /* global */
+int verbosesw = 0;
char *altmsg = NULL;
char *annotext = NULL;
char *distfile = NULL;
static void clean_up_temporary_files(void);
static int get_line(void);
static void make_mime_composition_file_entry(char *);
+static char* strexit(int status);
static struct swit switches[] = {
int
main(int argc, char **argv)
{
- int msgp = 0, nfiles = 0, distsw = 0, vecp = 1;
+ int nmsgs = 0, nfiles = 0, distsw = 0, vecp = 1;
int msgnum, status;
int in, out;
int n;
debugsw++;
/* fall */
case VERBSW:
+ verbosesw += 2;
case NVERBSW:
+ verbosesw--;
vec[vecp++] = --cp;
continue;
}
if (*cp == '/') {
files[nfiles++] = cp;
} else {
- msgs[msgp++] = cp;
+ msgs[nmsgs++] = cp;
}
}
}
- if (!msgp && !nfiles) {
- msgs[msgp++] = seq_cur;
+ if (!nmsgs && !nfiles) {
+ msgs[nmsgs++] = seq_cur;
}
- maildir = toabsdir(draftfolder);
- if (chdir(maildir) == NOTOK) {
- adios(maildir, "unable to change directory to");
- }
-
- if (!(mp = folder_read(draftfolder))) {
- adios(NULL, "unable to read draft folder %s", draftfolder);
- }
- if (mp->nummsg == 0) {
- adios(NULL, "no messages in draft folder %s", draftfolder);
- }
- /* parse all the message ranges/sequences and set SELECTED */
- for (msgnum = 0; msgnum < msgp; msgnum++) {
- if (!m_convert(mp, msgs[msgnum])) {
- done(1);
+ if (nmsgs) {
+ maildir = toabsdir(draftfolder);
+ if (chdir(maildir) == NOTOK) {
+ adios(maildir, "unable to change directory to");
}
- }
- seq_setprev(mp);
+ if (!(mp = folder_read(draftfolder))) {
+ adios(NULL, "unable to read draft folder %s",
+ draftfolder);
+ }
+ if (mp->nummsg == 0) {
+ adios(NULL, "no messages in draft folder %s",
+ draftfolder);
+ }
+ /* parse all the msgranges/sequences and set SELECTED */
+ for (msgnum = 0; msgnum < nmsgs; msgnum++) {
+ if (!m_convert(mp, msgs[msgnum])) {
+ done(1);
+ }
+ }
+ seq_setprev(mp);
- for (msgp = 0, msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) {
- if (is_selected(mp, msgnum)) {
- files[nfiles++] = getcpy(m_name(msgnum));
- unset_exists(mp, msgnum);
+ for (nmsgs = 0, msgnum = mp->lowsel;
+ msgnum <= mp->hghsel; msgnum++) {
+ if (is_selected(mp, msgnum)) {
+ files[nfiles++] = getcpy(m_name(msgnum));
+ unset_exists(mp, msgnum);
+ }
}
- }
- mp->msgflags |= SEQMOD;
- seq_save(mp);
+ mp->msgflags |= SEQMOD;
+ seq_save(mp);
+ }
if (!(cp = getenv("SIGNATURE")) || !*cp) {
if ((cp = context_find("signature")) && *cp) {
}
}
- for (msgnum = 0; msgnum < nfiles; msgnum++) {
- if (stat(files[msgnum], &st) == NOTOK) {
- adios(files[msgnum], "unable to stat draft file");
+ for (n = 0; n < nfiles; n++) {
+ if (stat(files[n], &st) == NOTOK) {
+ adios(files[n], "unable to stat draft file");
}
}
close(n);
}
- for (msgnum = 0; msgnum < nfiles; msgnum++) {
- switch (sendsbr(vec, vecp, files[msgnum], &st)) {
+ for (n = 0; n < nfiles; n++) {
+ switch (sendsbr(vec, vecp, files[n], &st)) {
case DONE:
done(++status);
case NOTOK:
while (get_line() != EOF && *field && *field != '-') {
if (strncasecmp(field, attach_hdr, length) == 0 &&
field[length] == ':') {
- for (p = field+length+1; *p==' ' || *p=='\t'; p++) {
- continue;
- }
+ p = trim(field+length+1);
if (*p == '+') {
/* forwarded message */
fprintf(composition_file, "#forw [forwarded message(s)] %s\n", p);
char content_type[BUFSIZ];
char cmdbuf[BUFSIZ];
char *cmd = mimetypequeryproc;
+ int semicolon = 0;
for (np = m_defs; np; np = np->n_next) {
if (strcasecmp(np->n_name, mimetypequery)==0) {
adios(NULL, "unable to access file `%s'", file_name);
}
- cp = (!(cp = strrchr(file_name, '/'))) ? file_name : cp + 1;
- fprintf(composition_file, "#%s; name=\"%s\" <> [%s] {attachment}",
- content_type, cp, cp);
+ /* Check for broken file(1). See man page mh-profile(5). */
+ for (cp=content_type; *cp; cp++) {
+ if (isspace(*cp)) {
+ if (!semicolon) {
+ adios(NULL, "Sorry, your Mime-Type-Query command (%s) is broken.\n\tThe output misses a semicolon before the whitespace.\n\tOutput was: %s", cmd, content_type);
+ }
+ } else if (*cp == ';') {
+ semicolon = 1;
+ } else {
+ semicolon = 0;
+ }
+ }
- fprintf(composition_file, " %s\n", file_name);
+ cp = (!(cp = strrchr(file_name, '/'))) ? file_name : cp + 1;
+ fprintf(composition_file,
+ "#%s; name=\"%s\" <> [%s] {attachment} %s\n",
+ content_type, cp, cp, file_name);
return;
}
default:
/* parent process -- wait for it */
- if ((status = pidwait(child_id, NOTOK)) == OK) {
+ status = pidwait(child_id, NOTOK);
+ if (WIFEXITED(status) && WEXITSTATUS(status) == EX_OK) {
if (annotext) {
anno(st);
}
- } else {
- /* spost failed */
- advise(NULL, "message not delivered to anyone");
+ }
+ else {
+ advise(NULL, "%s", strexit(status));
+ if (verbosesw <= 0) {
+ advise(NULL, "Try using -v to get better output");
+ }
if (distfile) {
unlink(drft);
if (rename(backup, drft) == NOTOK) {
}
}
}
- break;
}
+
return status;
}
}
+char*
+strexit(int status)
+{
+ if (WIFSIGNALED(status)) {
+ return "spost or sendmail killed by signal";
+ }
+ if (!WIFEXITED(status)) {
+ return "sendmail stopt for unknown reasen, message not deliverd to anyone";
+ }
+ switch (WEXITSTATUS(status)) {
+ case EX_TEMPFAIL:
+ return "Temporary error, maby the MTA hase queued the Mail";
+ default:
+ return "sendmail stopt for unknown reasen, message not deliverd to anyone";
+ }
+}
+
+
static void
armed_done(int status)
{