#include <time.h>
int debugsw = 0; /* global */
-int verbsw = 0;
char *altmsg = NULL;
char *annotext = NULL;
char *distfile = NULL;
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
- { "version", 0 },
-#define HELPSW 7
+#define NVERBSW 2
+ { "noverbose", 2 },
+#define VERSIONSW 3
+ { "Version", 0 },
+#define HELPSW 4
{ "help", 0 },
{ NULL, 0 }
};
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 */
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)) {
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 == '/') {
}
}
- /* 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;
}
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
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,
+ "</dev/null refile -file %s +trash",
+ original_draft);
+ if (system(buffer) != 0) {
+ advise(NULL, "unable to trash the draft");
}
}
break;
unlink(distfile);
}
- /*
- ** Get rid of any temporary files that we created for attachments.
- ** Also get rid of the renamed composition file that mhbuild
- ** leaves as a turd. It looks confusing, but we use the body
- ** file name to help build the renamed composition file name.
- */
+ /* Get rid of temporary files that we created for attachments. */
if (drft == composition_file_name) {
clean_up_temporary_files();
-
- if (strlen(composition_file_name) >=
- 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;
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);
}
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;
}