+ }
+ fclose(composition_file);
+
+ /* We're ready to roll! */
+ sprintf(buf, "mhbuild %s", composition_file_name);
+ if (system(buf) != 0) {
+ /* some problem */
+ 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);
+}
+
+static void
+clean_up_temporary_files(void)
+{
+ unlink(body_file_name);
+ unlink(composition_file_name);
+
+ return;
+}
+
+static int
+get_line(void)
+{
+ int c; /* current character */
+ int n; /* number of bytes in buffer */
+ char *p;
+
+ /*
+ ** Get a line from the input file, growing the field buffer as
+ ** needed. We do this so that we can fit an entire line in the
+ ** buffer making it easy to do a string comparison on both the
+ ** field name and the field body which might be a long path name.
+ */
+ for (n = 0, p = field; (c = getc(draft_file)) != EOF; *p++ = c) {
+ if (c == '\n' && (c = getc(draft_file)) != ' ' && c != '\t') {
+ ungetc(c, draft_file);
+ c = '\n';
+ break;
+ }
+ if (++n >= field_size - 1) {
+ field = (char *)mh_xrealloc(field, field_size += 256);
+ p = field + n - 1;
+ }
+ }
+ *p = '\0';
+
+ return (c);
+}
+
+static void
+make_mime_composition_file_entry(char *file_name)
+{
+ FILE *fp;
+ struct node *np;
+ char *cp;
+ 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) {
+ cmd = np->n_field;
+ break;
+ }
+ }
+ snprintf(cmdbuf, sizeof cmdbuf, "%s %s", cmd, file_name);
+
+ if (!(fp = popen(cmdbuf, "r"))) {
+ clean_up_temporary_files();
+ adios(NULL, "unable to determine content type with `%s'",
+ cmdbuf);
+ }
+ if (fgets(content_type, sizeof content_type, fp) &&
+ (cp = strrchr(content_type, '\n'))) {
+ *cp = '\0';