- while ((c = getc(fp)) != EOF) {
- if (c > 127 || c < 0) {
- binary = 1;
- break;
- }
- }
-
- (void)fclose(fp);
-
- content_type = binary ? "application/octet-stream" : "text/plain";
- }
-
- /*
- * 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. */
- (void) fprintf (composition_file, "#%s <>", content_type);
- } else {
- /* Suppress Content-Id, insert simple Content-Disposition. */
- (void) 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. */
- (void) fprintf (composition_file, "#%s <>", content_type);
- } else {
- /* Suppress Content-Id, insert Content-Disposition with
- modification date. */
- (void) 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.
- */
-
- (void)fprintf(composition_file, " %s\n", file_name);
-
- return;
-}
-
-/*
- * Split large message into several messages of
- * type "message/partial" and send them.
- */
-
-static int
-splitmsg (char **vec, int vecp, char *drft, struct stat *st, int delay)
-{
- int compnum, nparts, partno, state, status;
- long pos, start;
- time_t clock;
- char *cp, *dp, buffer[BUFSIZ], msgid[BUFSIZ];
- char subject[BUFSIZ];
- char name[NAMESZ], partnum[BUFSIZ];
- FILE *in;
-
- if ((in = fopen (drft, "r")) == NULL)
- adios (drft, "unable to open for reading");
-
- cp = dp = NULL;
- start = 0L;
-
- /*
- * Scan through the message and examine the various header fields,
- * as well as locate the beginning of the message body.
- */
- for (compnum = 1, state = FLD;;) {
- switch (state = m_getfld (state, name, buffer, sizeof(buffer), in)) {
- case FLD:
- case FLDPLUS:
- case FLDEOF:
- compnum++;
-
- /*
- * This header field is discarded.
- */
- if (!mh_strcasecmp (name, "Message-ID")) {
- while (state == FLDPLUS)
- state = m_getfld (state, name, buffer, sizeof(buffer), in);
- } else if (uprf (name, XXX_FIELD_PRF)
- || !mh_strcasecmp (name, VRSN_FIELD)
- || !mh_strcasecmp (name, "Subject")
- || !mh_strcasecmp (name, "Encrypted")) {
- /*
- * These header fields are copied to the enclosed
- * header of the first message in the collection
- * of message/partials. For the "Subject" header
- * field, we also record it, so that a modified
- * version of it, can be copied to the header
- * of each messsage/partial in the collection.
- */
- if (!mh_strcasecmp (name, "Subject")) {
- size_t sublen;
-
- strncpy (subject, buffer, BUFSIZ);
- sublen = strlen (subject);
- if (sublen > 0 && subject[sublen - 1] == '\n')
- subject[sublen - 1] = '\0';
- }
-
- dp = add (concat (name, ":", buffer, NULL), dp);
- while (state == FLDPLUS) {
- state = m_getfld (state, name, buffer, sizeof(buffer), in);
- dp = add (buffer, dp);
- }
- } else {
- /*
- * These header fields are copied to the header of
- * each message/partial in the collection.
- */
- cp = add (concat (name, ":", buffer, NULL), cp);
- while (state == FLDPLUS) {
- state = m_getfld (state, name, buffer, sizeof(buffer), in);
- cp = add (buffer, cp);
- }