mhmail: For mailx(1) compat: A period alone on a line means EOF.
authormarkus schnalke <meillo@marmaro.de>
Sat, 5 May 2012 09:38:23 +0000 (11:38 +0200)
committermarkus schnalke <meillo@marmaro.de>
Sat, 5 May 2012 09:38:23 +0000 (11:38 +0200)
Also renamed the -body switch to -bodytext because its argument is the
body text and not a file containing the body text. The rename should
clarify this. After all, typing `-body' results in the same as typing
`-bodytext' or only `-b'.

man/mhmail.man1
uip/mhmail.c

index 0210c73..d2dcaae 100644 (file)
@@ -9,14 +9,14 @@ mhmail \- send mail
 .na
 .B mhmail
 .IR addrs ...
 .na
 .B mhmail
 .IR addrs ...
-.RB [ \-body
-.IR text ]
 .RB [ \-cc
 .IR addrs ...]
 .RB [ \-from
 .IR addr ]
 .RB [ \-subject
 .IR subject ]
 .RB [ \-cc
 .IR addrs ...]
 .RB [ \-from
 .IR addr ]
 .RB [ \-subject
 .IR subject ]
+.RB [ \-bodytext
+.IR text ]
 .RB [ \-Version ]
 .RB [ \-help ]
 .ad
 .RB [ \-Version ]
 .RB [ \-help ]
 .ad
@@ -69,16 +69,23 @@ switch can be used to specify the
 By default,
 .B mhmail
 will read the message to be sent from the
 By default,
 .B mhmail
 will read the message to be sent from the
-standard input.  You can specify the text of the message at the command
+standard input.
+The message is terminated by either end-of-file or by a single period
+alone on a line. This is compatible to
+.B mail 
+and
+.BR mailx .
+Alternatively, you can specify the text of the message at the command
 line with the
 line with the
-.B \-body
+.B \-bodytext
 .I text
 .I text
-switch.  If the standard input has zero
-length,
+switch.
+.PP
+If the standard input has zero length,
 .B mhmail
 .B mhmail
-will not send the message.  You can use the switch
-.B \-body
-`' to force an empty message.
+will not send the message.  You can use
+.B \-bodytext
+"" to force an empty message.
 .PP
 Normally, addresses appearing as arguments are put in the `To:'
 field.  If the
 .PP
 Normally, addresses appearing as arguments are put in the `To:'
 field.  If the
index 5c7f002..a85899d 100644 (file)
@@ -15,7 +15,7 @@
 
 static struct swit switches[] = {
 #define BODYSW  0
 
 static struct swit switches[] = {
 #define BODYSW  0
-       { "body text", 0 },
+       { "bodytext text", 0 },
 #define CCSW  1
        { "cc addrs ...", 0 },
 #define FROMSW  2
 #define CCSW  1
        { "cc addrs ...", 0 },
 #define FROMSW  2
@@ -42,8 +42,6 @@ main(int argc, char **argv)
 {
        pid_t child_id;
        int status, iscc = 0, nvec;
 {
        pid_t child_id;
        int status, iscc = 0, nvec;
-       unsigned int i;
-       int somebody;
        char *cp, *tolist = NULL, *cclist = NULL, *subject = NULL;
        char *from = NULL, *body = NULL, **argp, **arguments;
        char *vec[5], buf[BUFSIZ];
        char *cp, *tolist = NULL, *cclist = NULL, *subject = NULL;
        char *from = NULL, *body = NULL, **argp, **arguments;
        char *vec[5], buf[BUFSIZ];
@@ -139,16 +137,24 @@ main(int argc, char **argv)
 
        if (body) {
                fprintf(out, "%s", body);
 
        if (body) {
                fprintf(out, "%s", body);
-               if (*body && *(body + strlen(body) - 1) != '\n')
+               if (*body && body[strlen(body) - 1] != '\n')
                        fputs("\n", out);
        } else {
                        fputs("\n", out);
        } else {
-               for (somebody = 0; (i = fread(buf, sizeof(*buf), sizeof(buf),
-                               stdin)) > 0; somebody++)
-                       if (fwrite(buf, sizeof(*buf), i, out) != i)
+               int empty = 1;
+
+               while (fgets(buf, sizeof buf, stdin)) {
+                       if (buf[0]=='.' && buf[1]=='\n') {
+                               /* A period alone on a line means EOF. */
+                               break;
+                       }
+                       empty = 0;
+                       if (fputs(buf, out) == EOF) {
                                adios(tmpfil, "error writing");
                                adios(tmpfil, "error writing");
-               if (!somebody) {
+                       }
+               }
+               if (empty) {
                        unlink(tmpfil);
                        unlink(tmpfil);
-                       done(1);
+                       adios(NULL, "not sending message with empty body");
                }
        }
        fclose(out);
                }
        }
        fclose(out);