X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fsend.c;h=09bbcf80d3be08683dada94a2b834f297c38399c;hp=d52b9e352b6d41eb23925c6b690d689e501de3d3;hb=068380df11432a5341882e658ec9cf5c0b54721d;hpb=7b300825615f4d13c2c1a1bd0d05462f9708b7e7 diff --git a/uip/send.c b/uip/send.c index d52b9e3..09bbcf8 100644 --- a/uip/send.c +++ b/uip/send.c @@ -29,7 +29,6 @@ int debugsw = 0; /* global */ int forwsw = 1; -int inplace = 1; int pushsw = 0; int verbsw = 0; char *altmsg = NULL; @@ -56,7 +55,6 @@ static void armed_done(int) NORETURN; static void alert(char *, int); static int tmp_fd(void); static void anno(struct stat *); -static void annoaux(void); static int sendaux(char **, int, char *, struct stat *); static int attach(char *); static void clean_up_temporary_files(void); @@ -69,33 +67,25 @@ static struct swit switches[] = { { "alias aliasfile", 0 }, #define DEBUGSW 1 { "debug", -5 }, -#define FILTSW 2 - { "filter filterfile", 0 }, -#define NFILTSW 3 - { "nofilter", 0 }, -#define FRMTSW 4 - { "format", 0 }, -#define NFRMTSW 5 - { "noformat", 0 }, -#define FORWSW 6 +#define FORWSW 2 { "forward", 0 }, -#define NFORWSW 7 +#define NFORWSW 3 { "noforward", 0 }, -#define PUSHSW 8 +#define PUSHSW 4 { "push", 0 }, -#define NPUSHSW 9 +#define NPUSHSW 5 { "nopush", 0 }, -#define VERBSW 10 +#define VERBSW 6 { "verbose", 0 }, -#define NVERBSW 11 +#define NVERBSW 7 { "noverbose", 0 }, -#define WATCSW 12 +#define WATCSW 8 { "watch", 0 }, -#define NWATCSW 13 +#define NWATCSW 9 { "nowatch", 0 }, -#define VERSIONSW 14 +#define VERSIONSW 10 { "version", 0 }, -#define HELPSW 15 +#define HELPSW 11 { "help", 0 }, { NULL, 0 } }; @@ -174,16 +164,12 @@ main(int argc, char **argv) case DEBUGSW: debugsw++; /* fall */ - case NFILTSW: - case FRMTSW: - case NFRMTSW: case WATCSW: case NWATCSW: vec[vecp++] = --cp; continue; case ALIASW: - case FILTSW: vec[vecp++] = --cp; if (!(cp = *argp++) || *cp == '-') { adios(NULL, "missing argument to %s", @@ -260,36 +246,23 @@ main(int argc, char **argv) if (!(annotext = getenv("mhannotate")) || !*annotext) { annotext = NULL; } - if (annotext && ((cp = getenv("mhinplace")) && *cp)) { - inplace = atoi(cp); - } if (!(altmsg = getenv("mhaltmsg")) || !*altmsg) { altmsg = NULL; /* used by dist interface - see below */ } if ((cp = getenv("mhdist")) && *cp && (distsw = atoi(cp)) && altmsg) { vec[vecp++] = "-dist"; - distfile = getcpy(m_mktemp2(altmsg, invo_name, NULL, NULL)); - if (link(altmsg, distfile) == NOTOK) { - if (errno != EXDEV) { - adios(distfile, "unable to link %s to", - altmsg); - } - free(distfile); - distfile = getcpy(m_mktemp2(NULL, invo_name, - NULL, NULL)); - if ((in = open(altmsg, O_RDONLY)) == NOTOK) { - adios(altmsg, "unable to open"); - } - fstat(in, &st2); - if ((out = creat(distfile, (int)st2.st_mode & 0777)) == - NOTOK) { - adios(distfile, "unable to write"); - } - cpydata(in, out, altmsg, distfile); - close(in); - close(out); + if ((in = open(altmsg, O_RDONLY)) == NOTOK) { + adios(altmsg, "unable to open for reading"); } + fstat(in, &st2); + distfile = getcpy(m_mktemp2(NULL, invo_name, NULL, NULL)); + if ((out = creat(distfile, (int)st2.st_mode & 0777))==NOTOK) { + adios(distfile, "unable to open for writing"); + } + cpydata(in, out, altmsg, distfile); + close(in); + close(out); } else { distfile = NULL; } @@ -512,7 +485,7 @@ attach(char *draft_file_name) fclose(body_file); /* Add a mhbuild MIME composition file line for the body */ - /* charset will be discovered/guessed by buildmimeproc */ + /* charset will be discovered/guessed by mhbuild */ fprintf(composition_file, "#text/plain %s\n", body_file_name); } @@ -539,12 +512,8 @@ attach(char *draft_file_name) } fclose(composition_file); - /* - ** We're ready to roll! Run mhbuild on the composition file. - ** Note that mhbuild is in the context as buildmimeproc. - */ - sprintf(buf, "%s %s", buildmimeproc, composition_file_name); - + /* We're ready to roll! */ + sprintf(buf, "mhbuild %s", composition_file_name); if (system(buf) != 0) { /* some problem */ clean_up_temporary_files(); @@ -648,7 +617,7 @@ static int sendaux(char **vec, int vecp, char *drft, struct stat *st) { pid_t child_id; - int i, status, fd; + int status, fd; char backup[BUFSIZ]; /* @@ -663,10 +632,7 @@ sendaux(char **vec, int vecp, char *drft, struct stat *st) } vec[vecp] = NULL; - for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) { - sleep(5); - } - switch (child_id) { + switch (child_id = fork()) { case -1: /* oops -- fork error */ adios("fork", "unable to"); @@ -731,14 +697,10 @@ static void alert(char *file, int out) { pid_t child_id; - int i, in; + int in; char buf[BUFSIZ]; - for (i = 0; (child_id = fork()) == NOTOK && i < 5; i++) { - sleep(5); - } - - switch (child_id) { + switch (child_id = fork()) { case NOTOK: /* oops -- fork error */ advise("fork", "unable to"); @@ -773,7 +735,6 @@ alert(char *file, int out) /* create subject for error notification */ snprintf(buf, sizeof(buf), "send failed on %s", forwsw ? "enclosed draft" : file); - execlp(mailproc, mhbasename(mailproc), getusername(), "-subject", buf, NULL); fprintf(stderr, "unable to exec "); @@ -811,10 +772,9 @@ tmp_fd(void) static void anno(struct stat *st) { - pid_t child_id; - sigset_t set, oset; - static char *cwd = NULL; struct stat st2; + char *msgs, *folder; + char buf[BUFSIZ]; if (altmsg && (stat(altmsg, &st2) == NOTOK || st->st_mtime != st2.st_mtime || @@ -826,122 +786,27 @@ anno(struct stat *st) return; } - child_id = debugsw ? NOTOK : fork(); - switch (child_id) { - case NOTOK: /* oops */ - if (!debugsw) { - advise(NULL, "unable to fork, so doing annotations by hand..."); - } - if (!cwd) { - cwd = getcpy(pwd()); - } - /* fall */ - - case OK: - /* block a few signals */ - sigemptyset(&set); - sigaddset(&set, SIGHUP); - sigaddset(&set, SIGINT); - sigaddset(&set, SIGQUIT); - sigaddset(&set, SIGTERM); - SIGPROCMASK(SIG_BLOCK, &set, &oset); - - annoaux(); - if (child_id == OK) { - _exit(0); - } - - /* reset the signal mask */ - SIGPROCMASK(SIG_SETMASK, &oset, &set); - - chdir(cwd); - break; - - default: /* no waiting... */ - break; - } -} - - -static void -annoaux(void) -{ - int fd2, fd3, msgnum; - char *cp, *folder, *maildir; - char **ap; - struct msgs *mp; - if (!(folder = getenv("mhfolder")) || !*folder) { if (debugsw) { admonish(NULL, "$mhfolder not set"); } return; } - maildir = toabsdir(folder); - if (chdir(maildir) == NOTOK) { - if (debugsw) { - admonish(maildir, "unable to change directory to"); - } - return; - } - if (!(mp = folder_read(folder))) { - if (debugsw) { - admonish(NULL, "unable to read folder %s", folder); - } - return; - } - - if (mp->nummsg == 0) { - if (debugsw) { - admonish(NULL, "no messages in %s", folder); - } - goto oops; - } - if ((cp = getenv("mhmessages")) == NULL || *cp == 0) { + if (!(msgs = getenv("mhmessages")) || !*msgs) { if (debugsw) { admonish(NULL, "$mhmessages not set"); } - goto oops; - } - if (!debugsw /* MOBY HACK... */ - && pushsw - && (fd3 = open("/dev/null", O_RDWR)) != NOTOK - && (fd2 = dup(fileno(stderr))) != NOTOK) { - dup2(fd3, fileno(stderr)); - close(fd3); - } else { - fd2 = NOTOK; - } - for (ap = brkstring(cp = getcpy(cp), " ", NULL); *ap; ap++) { - m_convert(mp, *ap); - } - free(cp); - if (fd2 != NOTOK) { - dup2(fd2, fileno(stderr)); - } - if (mp->numsel == 0) { - if (debugsw) { - admonish(NULL, "no messages to annotate"); - } - goto oops; + return; } - if (debugsw) { - advise(NULL, "annotate%s as `%s'", inplace ? " inplace" : "", - annotext); + advise(NULL, "annotate as `%s': %s %s", annotext, + folder, msgs); } - for (msgnum = mp->lowsel; msgnum <= mp->hghsel; msgnum++) { - if (is_selected(mp, msgnum)) { - if (debugsw) { - advise(NULL, "annotate message %d", msgnum); - } - annotate(m_name(msgnum), annotext, NULL, inplace, - 1, -2, 0); - } + snprintf(buf, sizeof buf, "anno -comp '%s' '+%s' %s", + annotext, folder, msgs); + if (system(buf) != 0) { + advise(NULL, "unable to annotate"); } - -oops: - folder_free(mp); }