X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Fsendsbr.c;h=dfd974f481694c9b9d6763cd450038ab2caa884f;hb=356f49083391bd018b6c5dfed21e59247b4cc74a;hp=3865258f955d032338769531646f4927f4750d56;hpb=9f8f8b1e1d553774865f2c177191c359c3dc652c;p=mmh diff --git a/uip/sendsbr.c b/uip/sendsbr.c index 3865258..dfd974f 100644 --- a/uip/sendsbr.c +++ b/uip/sendsbr.c @@ -63,7 +63,7 @@ static int sendaux (char **, int, char *, struct stat *); static int attach(char *, char *, int); static void clean_up_temporary_files(void); static int get_line(void); -static void make_mime_composition_file_entry(char *, int); +static void make_mime_composition_file_entry(char *, int, char *); /* @@ -209,19 +209,27 @@ attach(char *attachment_header_field_name, char *draft_file_name, field = (char *)mh_xmalloc(field_size = 256); /* - * Scan the draft file for a header field name that matches the -attach - * argument. The existence of one indicates that the draft has attachments. - * Bail out if there are no attachments because we're done. Read to the - * end of the headers even if we have no attachments. + * Scan the draft file for a header field name, with a non-empty + * body, that matches the -attach argument. The existence of one + * indicates that the draft has attachments. Bail out if there + * are no attachments because we're done. Read to the end of the + * headers even if we have no attachments. */ length = strlen(attachment_header_field_name); has_attachment = 0; - while (get_line() != EOF && *field != '\0' && *field != '-') - if (strncasecmp(field, attachment_header_field_name, length) == 0 && field[length] == ':') - has_attachment = 1; + while (get_line() != EOF && *field != '\0' && *field != '-') { + if (strncasecmp(field, attachment_header_field_name, length) == 0 && + field[length] == ':') { + for (p = field + length + 1; *p == ' ' || *p == '\t'; p++) + ; + if (strlen (p) > 0) { + has_attachment = 1; + } + } + } if (has_attachment == 0) return (DONE); @@ -267,14 +275,16 @@ attach(char *attachment_header_field_name, char *draft_file_name, } /* - * Start at the beginning of the draft file. Copy all non-attachment header fields - * to the temporary composition file. Then add the dashed line separator. + * Start at the beginning of the draft file. Copy all + * non-attachment header fields to the temporary composition + * file. Then add the dashed line separator. */ rewind(draft_file); while (get_line() != EOF && *field != '\0' && *field != '-') - if (strncasecmp(field, attachment_header_field_name, length) != 0 || field[length] != ':') + if (strncasecmp(field, attachment_header_field_name, length) != 0 || + field[length] != ':') (void)fprintf(composition_file, "%s\n", field); (void)fputs("--------\n", composition_file); @@ -292,14 +302,18 @@ attach(char *attachment_header_field_name, char *draft_file_name, /* * Add a mhbuild MIME composition file line for the body if there was one. + * Set the default content type to text/plain so that mhbuild takes care + * of any necessary encoding. */ if (has_body) - make_mime_composition_file_entry(body_file_name, attachformat); + make_mime_composition_file_entry(body_file_name, attachformat, + "text/plain"); /* - * Now, go back to the beginning of the draft file and look for header fields - * that specify attachments. Add a mhbuild MIME composition file for each. + * Now, go back to the beginning of the draft file and look for + * header fields that specify attachments. Add a mhbuild MIME + * composition file for each. */ if ((fp = fopen (p = etcpath ("mhn.defaults"), "r"))) { @@ -310,19 +324,36 @@ attach(char *attachment_header_field_name, char *draft_file_name, rewind(draft_file); while (get_line() != EOF && *field != '\0' && *field != '-') { - if (strncasecmp(field, attachment_header_field_name, length) == 0 && field[length] == ':') { + if (strncasecmp(field, attachment_header_field_name, length) == 0 && + field[length] == ':') { for (p = field + length + 1; *p == ' ' || *p == '\t'; p++) ; - make_mime_composition_file_entry(p, attachformat); + /* Skip empty attachment_header_field_name lines. */ + if (strlen (p) > 0) { + struct stat st; + if (stat (p, &st) == OK) { + if (S_ISREG (st.st_mode)) { + /* Don't set the default content type so take + make_mime_composition_file_entry() will try + to infer it from the file type. */ + make_mime_composition_file_entry(p, attachformat, 0); + } else { + adios (NULL, "unable to attach %s, not a plain file", + p); + } + } else { + adios (NULL, "unable to access file \"%s\"", p); + } + } } } (void)fclose(composition_file); /* - * We're ready to roll! Run mhbuild on the composition file. Note that mhbuild - * is in the context as buildmimeproc. + * We're ready to roll! Run mhbuild on the composition file. + * Note that mhbuild is in the context as buildmimeproc. */ (void)sprintf(buf, "%s %s", buildmimeproc, composition_file_name); @@ -382,7 +413,8 @@ get_line(void) } static void -make_mime_composition_file_entry(char *file_name, int attachformat) +make_mime_composition_file_entry(char *file_name, int attachformat, + char *default_content_type) { int binary; /* binary character found flag */ int c; /* current character */ @@ -393,7 +425,7 @@ make_mime_composition_file_entry(char *file_name, int attachformat) char *p; /* miscellaneous string pointer */ struct stat st; /* file status buffer */ - content_type = (char *)0; + content_type = default_content_type; /* * Check the file name for a suffix. Scan the context for that suffix on a