On Fri, Sep 22, 2023 at 06:57:24AM +0200, Walter Alejandro Iglesias wrote:
> Below, a version without utf8 parser.  I added a ASCII check for the
> subject.  The day will come when wscons support UTF-8, right?  In the
> meantime, just by being careful not to type iso-latin characters while
> using mail on wscons this version does its job.

Last version caused a core dump when sending without subject.  I fixed
that by adding a check in the conditional:

        while (hp->h_subject != NULL && hp->h_subject[i] != '\0') {



Index: send.c
===================================================================
RCS file: /cvs/src/usr.bin/mail/send.c,v
retrieving revision 1.26
diff -u -p -r1.26 send.c
--- send.c      8 Mar 2023 04:43:11 -0000       1.26
+++ send.c      22 Sep 2023 05:47:37 -0000
@@ -33,6 +33,10 @@
 #include "rcv.h"
 #include "extern.h"
 
+/* This will be used to add MIME headers */
+static char noascii_subject;
+static char noascii_body;
+
 static volatile sig_atomic_t sendsignal;       /* Interrupted by a signal? */
 
 /*
@@ -341,6 +345,22 @@ mail1(struct header *hp, int printheader
                else
                        puts("Null message body; hope that's ok");
        }
+
+       /* Check for non ascii characters in the subject */
+       int i, ch;
+       i = 0;
+       while (hp->h_subject != NULL && hp->h_subject[i] != '\0') {
+               if (!isascii(hp->h_subject[i]))
+                       noascii_subject = 1;
+                       i++;
+       }
+
+       /* Check for non ascii characters in the body */
+       while ((ch = getc(mtf)) != EOF)
+               if (!isascii(ch))
+                       noascii_body = 1;
+       rewind(mtf);
+
        /*
         * Now, take the user names from the combined
         * to and cc lists and do all the alias
@@ -524,7 +544,18 @@ puthead(struct header *hp, FILE *fo, int
        if (hp->h_to != NULL && w & GTO)
                fmt("To:", hp->h_to, fo, w&GCOMMA), gotcha++;
        if (hp->h_subject != NULL && w & GSUBJECT)
-               fprintf(fo, "Subject: %s\n", hp->h_subject), gotcha++;
+               fprintf(fo, "Subject: %s\n", hp->h_subject),
+                   gotcha++;
+       if (noascii_subject || noascii_body)
+               fprintf(fo, "MIME-Version: 1.0\n"
+                   "Content-Type: text/plain; charset=utf-8\n"
+                   "Content-Transfer-Encoding: 8bit\n"),
+                   gotcha++;
+       else
+               fprintf(fo, "MIME-Version: 1.0\n"
+                   "Content-Type: text/plain; charset=us-ascii\n"
+                   "Content-Transfer-Encoding: 7bit\n"),
+                   gotcha++;
        if (hp->h_cc != NULL && w & GCC)
                fmt("Cc:", hp->h_cc, fo, w&GCOMMA), gotcha++;
        if (hp->h_bcc != NULL && w & GBCC)
@@ -607,6 +638,5 @@ savemail(char *name, FILE *fi)
 void
 sendint(int s)
 {
-
        sendsignal = s;
 }

-- 
Walter

Reply via email to