+ /*
+ ** Make sure that the attachment file exists and is readable.
+ ** Append a mhbuild directive to the draft file. This starts with
+ ** the content type. Append a file name attribute and a private
+ ** x-unix-mode attribute. Also append a description obtained
+ ** (if possible) by running the "file" command on the file.
+ */
+
+ if (stat(file_name, &st) == -1 || access(file_name, R_OK) != 0) {
+ clean_up_temporary_files();
+ adios((char *)0, "unable to access file \"%s\"", file_name);
+ }
+
+ switch (attachformat) {
+ case 0:
+ /* Insert name, file mode, and Content-Id. */
+ (void)fprintf(composition_file,
+ "#%s; name=\"%s\"; x-unix-mode=0%.3ho",
+ content_type, ((p = strrchr(file_name, '/'))
+ == (char *)0) ? file_name : p + 1,
+ (unsigned short)(st.st_mode & 0777));
+
+ if (strlen(file_name) > MAXPATHLEN) {
+ clean_up_temporary_files();
+ adios((char *)0, "attachment file name `%s' too long.",
+ file_name);
+ }
+
+ (void)sprintf(cmd, "file '%s'", file_name);
+
+ if ((fp = popen(cmd, "r")) != (FILE *)0 &&
+ fgets(cmd, sizeof (cmd), fp) != (char *)0) {
+ *strchr(cmd, '\n') = '\0';
+
+ /*
+ ** The output of the "file" command is of the form
+ **
+ ** file: description
+ **
+ ** Strip off the "file:" and subsequent white space.
+ */
+
+ for (p = cmd; *p != '\0'; p++) {
+ if (*p == ':') {
+ for (p++; *p != '\0'; p++) {
+ if (*p != '\t')
+ break;
+ }
+ break;
+ }
+ }
+
+ if (*p != '\0')
+ /* Insert Content-Description. */
+ (void)fprintf(composition_file, " [ %s ]", p);
+
+ (void)pclose(fp);
+ }
+
+ break;
+ case 1:
+ if (stringdex(m_maildir(invo_name), file_name) == 0) {
+ /*
+ ** Content had been placed by send into a temp file.
+ ** Don't generate Content-Disposition header, because
+ ** it confuses Microsoft Outlook, Build 10.0.6626, at
+ ** least.
+ */
+ fprintf(composition_file, "#%s <>", content_type);
+ } else {
+ /*
+ ** Suppress Content-Id, insert simple
+ ** Content-Disposition.
+ */
+ fprintf(composition_file,
+ "#%s; name=\"%s\" <>{attachment}",
+ content_type,
+ ((p = strrchr(file_name, '/')) == (char *)0) ?
+ file_name : p + 1);
+ }
+
+ break;
+ case 2:
+ if (stringdex(m_maildir(invo_name), file_name) == 0) {
+ /*
+ ** Content had been placed by send into a temp file.
+ ** Don't generate Content-Disposition header, because
+ ** it confuses Microsoft Outlook, Build 10.0.6626, at
+ ** least.
+ */
+ fprintf(composition_file, "#%s <>", content_type);
+ } else {
+ /*
+ ** Suppress Content-Id, insert Content-Disposition
+ ** with modification date.
+ */
+ fprintf(composition_file,
+ "#%s; name=\"%s\" <>{attachment; modification-date=\"%s\"}",
+ content_type,
+ ((p = strrchr(file_name, '/')) == (char *)0) ?
+ file_name : p + 1, dtime(&st.st_mtime, 0));
+ }
+
+ break;
+ default:
+ adios((char *)0, "unsupported attachformat %d", attachformat);
+ }
+
+ /*
+ ** Finish up with the file name.
+ */