X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Fsend.c;h=76280aa6bd3e81fdae6d9b079c073abf11bc44ae;hb=58cf09aa36e9f7f352a127158bbf1c5678bc6ed8;hp=84e05dfb31386d64a6d1b312c8156e945bbba8ef;hpb=32b2354dbaf4bf934936eb5b102a4a3d2fdd209a;p=mmh diff --git a/uip/send.c b/uip/send.c index 84e05df..76280aa 100644 --- a/uip/send.c +++ b/uip/send.c @@ -22,7 +22,6 @@ #include int debugsw = 0; /* global */ -int verbsw = 0; char *altmsg = NULL; char *annotext = NULL; char *distfile = NULL; @@ -47,27 +46,22 @@ static void armed_done(int) NORETURN; static void anno(struct stat *); static int sendaux(char **, int, char *, struct stat *); static int attach(char *); +static int signandenc(char *); static void clean_up_temporary_files(void); static int get_line(void); static void make_mime_composition_file_entry(char *); static struct swit switches[] = { -#define ALIASW 0 - { "alias aliasfile", 0 }, -#define DEBUGSW 1 +#define DEBUGSW 0 { "debug", -5 }, -#define VERBSW 2 +#define VERBSW 1 { "verbose", 0 }, -#define NVERBSW 3 - { "noverbose", 0 }, -#define WATCSW 4 - { "watch", 0 }, -#define NWATCSW 5 - { "nowatch", 0 }, -#define VERSIONSW 6 +#define NVERBSW 2 + { "noverbose", 2 }, +#define VERSIONSW 3 { "Version", 0 }, -#define HELPSW 7 +#define HELPSW 4 { "help", 0 }, { NULL, 0 } }; @@ -81,17 +75,14 @@ main(int argc, char **argv) int in, out; int n; char *cp, *maildir = NULL; - char buf[BUFSIZ], **ap, **argp, **arguments; + char buf[BUFSIZ], **argp, **arguments; char *msgs[MAXARGS], *vec[MAXARGS]; char *files[MAXARGS]; struct msgs *mp; struct stat st; struct stat st2; - -#ifdef LOCALE setlocale(LC_ALL, ""); -#endif invo_name = mhbasename(argv[0]); /* read user profile/context */ @@ -100,9 +91,6 @@ main(int argc, char **argv) arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; - vec[vecp++] = "-library"; - vec[vecp++] = getcpy(toabsdir("+")); - while ((cp = *argp++)) { if (*cp == '-') { switch (smatch(++cp, switches)) { @@ -122,31 +110,13 @@ main(int argc, char **argv) print_version(invo_name); done(1); + case DEBUGSW: + debugsw++; + /* fall */ case VERBSW: - verbsw++; - vec[vecp++] = --cp; - continue; case NVERBSW: - verbsw = 0; - vec[vecp++] = --cp; - continue; - - case DEBUGSW: - debugsw++; /* fall */ - case WATCSW: - case NWATCSW: vec[vecp++] = --cp; continue; - - case ALIASW: - vec[vecp++] = --cp; - if (!(cp = *argp++) || *cp == '-') { - adios(NULL, "missing argument to %s", - argp[-2]); - } - vec[vecp++] = cp; - continue; - } } else { if (*cp == '/') { @@ -157,16 +127,6 @@ main(int argc, char **argv) } } - /* check for "Aliasfile:" profile entry */ - if ((cp = context_find("Aliasfile"))) { - char *dp = NULL; - - for (ap=brkstring(dp=getcpy(cp), " ", "\n"); ap && *ap; ap++) { - vec[vecp++] = "-alias"; - vec[vecp++] = getcpy(etcpath(*ap)); - } - } - if (!msgp && !nfiles) { msgs[msgp++] = seq_cur; } @@ -273,7 +233,6 @@ sendsbr(char **vec, int vecp, char *drft, struct stat *st) int status; char buffer[BUFSIZ]; char *original_draft; - char *p; /* string pointer for building file name */ /* ** Save the original name of the draft file. The name of the @@ -303,16 +262,37 @@ sendsbr(char **vec, int vecp, char *drft, struct stat *st) break; } + /* + ** Sign and encrypt the message as needed. + ** Use the mhbuild composition file for the draft if there was + ** a successful conversion because that now contains the MIME + ** message. A nice side effect of this is that it leaves the + ** original draft file untouched so that it can be retrieved + ** and modified if desired. + */ + switch (signandenc(drft)) { + case OK: + drft = composition_file_name; + break; + + case NOTOK: + return (NOTOK); + + case DONE: + break; + } + done=armed_done; switch (setjmp(env)) { case OK: status = sendaux(vec, vecp, drft, st) ? NOTOK : OK; - /* rename the original draft */ if (status == OK) { - strncpy(buffer, m_backup(original_draft), - sizeof(buffer)); - if (rename(original_draft, buffer) == NOTOK) { - advise(buffer, "unable to rename %s to", drft); + /* move original draft to +trash folder */ + snprintf(buffer, sizeof buffer, + "= - sizeof (composition_file_name) - 6) { - advise(NULL, "unable to remove original composition file."); - } else { - if (!(p = strrchr(composition_file_name, '/'))) { - p = composition_file_name; - } else { - p++; - } - strcpy(body_file_name, p); - *p++ = ','; - strcpy(p, body_file_name); - strcat(p, ".orig"); - - unlink(composition_file_name); - } } return status; @@ -488,6 +446,58 @@ attach(char *draft_file_name) clean_up_temporary_files(); return (NOTOK); } + /* Remove the automatically created backup of mhbuild. */ + snprintf(buf, sizeof buf, "%s.orig", composition_file_name); + if (unlink(buf) == -1) { + advise(NULL, "unable to remove original composition file."); + } + + return (OK); +} + +static int +signandenc(char *draft_file_name) +{ + char buf[BUFSIZ]; + int dosign = 0; + int doenc = 0; + + if (!(draft_file = fopen(draft_file_name, "r"))) { + adios(NULL, "can't open draft file `%s'.", draft_file_name); + } + + /* We'll grow the buffer as needed. */ + field = (char *)mh_xmalloc(field_size = 256); + + /* Scan the draft file for an attachment header field name. */ + while (get_line() != EOF && *field != '\0' && *field != '-') { + if (strncasecmp(field, sign_hdr, strlen(sign_hdr))==0 && + field[strlen(sign_hdr)] == ':') { + dosign = 1; + } + if (strncasecmp(field, enc_hdr, strlen(enc_hdr))==0 && + field[strlen(enc_hdr)] == ':') { + doenc = 1; + } + } + if (!dosign && !doenc) { + return DONE; + } + + strcpy(composition_file_name, draft_file_name); + + /* We're ready to roll! */ + sprintf(buf, "mhsign -m%s '%s'", doenc ? " -e" : "", + draft_file_name); + if (system(buf) != 0) { + /* some problem */ + return (NOTOK); + } + /* Remove the automatically created backup of mhsign. */ + snprintf(buf, sizeof buf, "%s.orig", draft_file_name); + if (unlink(buf) == -1) { + advise(NULL, "unable to remove original draft file."); + } return (OK); }