[haiku-commits] haiku: hrev50117 - src/bin/mail_utils

  • From: waddlesplash@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 3 Mar 2016 04:12:50 +0100 (CET)

hrev50117 adds 1 changeset to branch 'master'
old head: f1b2a12f3b18d84ba37f8ca02d9385d39cff9f69
new head: f765016ffd410653d5c9068f2f74c743782dfddf
overview: 
http://cgit.haiku-os.org/haiku/log/?qt=range&q=f765016ffd41+%5Ef1b2a12f3b18

----------------------------------------------------------------------------

f765016ffd41: mail: Detect terminal input, end of file, better argument parsing.
  
  * If the input is a terminal rather than a file or pipe, only then look
    for the single period on a line as end of text.  Also look for end of
    file as an end of the text, so that piped in text works.
  * Parse multiple e-mail addresses properly, adding a comma between them
    (a space doesn't work).  Also allow mixing of "to" e-mail addresses
    and command line switches, previously all "to" addresses had to be
    at the end.
  * Fewer blank lines in the output, make it look nicer, remove things
    like a redundant display of the body text before text was read.  Also
    no output text when just piping in a message.
  * Avoid buffer overrun by using fgets instead of gets.
  * Use stderr for text the user likely doesn't want to save, and for
    prompts that would be invisible if stdout was redirected to a file.
  
  Signed-off-by: Augustin Cavalier <waddlesplash@xxxxxxxxx>

                                 [ Alexander G. M. Smith <agmsmith@xxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev50117
Commit:      f765016ffd410653d5c9068f2f74c743782dfddf
URL:         http://cgit.haiku-os.org/haiku/commit/?id=f765016ffd41
Author:      Alexander G. M. Smith <agmsmith@xxxxxx>
Date:        Wed Mar  2 18:45:08 2016 UTC
Committer:   Augustin Cavalier <waddlesplash@xxxxxxxxx>
Commit-Date: Thu Mar  3 03:11:15 2016 UTC

----------------------------------------------------------------------------

1 file changed, 45 insertions(+), 36 deletions(-)
src/bin/mail_utils/mail.cpp | 81 +++++++++++++++++++++++------------------

----------------------------------------------------------------------------

diff --git a/src/bin/mail_utils/mail.cpp b/src/bin/mail_utils/mail.cpp
index f33bc07..97aff49 100644
--- a/src/bin/mail_utils/mail.cpp
+++ b/src/bin/mail_utils/mail.cpp
@@ -6,17 +6,18 @@
  *             Santiago (Jacques) Lema
  *             Jérôme Duval, jerome.duval@xxxxxxxxx
  *             Augustin Cavalier, <waddlesplash>
+ *             Alexander G. M. Smith <agmsmith@xxxxxx>
  */
 
 
-#include <Application.h>
-#include <String.h>
-#include <E-mail.h>
-
 #include <stdio.h>
+#include <unistd.h>
 
+#include <Application.h>
+#include <E-mail.h>
+#include <String.h>
 
-#define APP_SIG                                
"application/x-vnd.Haiku-mail_utils-mail"
+#define APP_SIG "application/x-vnd.Haiku-mail_utils-mail"
 
 
 int main(int argc, char* argv[])
@@ -28,17 +29,15 @@ int main(int argc, char* argv[])
                fprintf(stdout,"This program can only send mail, not read 
it.\n");
                fprintf(stdout,"usage: %s [-v] [-s subject] [-c cc-addr] "
                        "[-b bcc-addr] to-addr ...\n", argv[0]);
-               fflush(stdout);
                return 0;
        }
 
-       char *subject = "No title";
+       char *subject = "No subject";
        char *cc = "";
        char *bcc = "";
-       BString to = "";
-       BString body = "";
+       BString to;
+       bool verbose = false;
 
-       bool verbose =false;
        // Parse arguments
        for (int i = 1; i < argc; i++) {
                if (strcmp(argv[i], "-v") == 0)
@@ -53,51 +52,60 @@ int main(int argc, char* argv[])
                        bcc = argv[i+1];
                        i++;
                } else {
+                       if (to.Length() > 0)
+                               to.Append(", ");
                        to.Append(argv[i]);
-                       if (i < argc - 1)
-                               to.Append(" ");
-               }
+               }
        }
 
        if (verbose) {
                fprintf(stdout, "\n");
-               fprintf(stdout, "To:\t<%s> \n", to.String());
-               fprintf(stdout, "Cc:\t<%s> \n", cc);
-               fprintf(stdout, "Bcc:\t<%s> \n", bcc);
-               fprintf(stdout, "Subj:\t<%s> \n", subject);
-               fprintf(stdout, "Body:\t<%s> \n", body.String());
-       fprintf(stdout, "\n");
+               fprintf(stdout, "To:\t%s\n", to.String());
+               fprintf(stdout, "Cc:\t%s\n", cc);
+               fprintf(stdout, "Bcc:\t%s\n", bcc);
+               fprintf(stdout, "Subj:\t%s\n", subject);
+               fprintf(stdout, "\n");
        }
 
        // Check if recipients are valid
-    if (strcmp(to.String(), "") == 0 &&
-       strcmp(cc, "") == 0 &&
-       strcmp(bcc, "") == 0) {
+       if (strcmp(to.String(), "") == 0 &&
+               strcmp(cc, "") == 0 &&
+               strcmp(bcc, "") == 0) {
 
-               fprintf(stdout, "[Error]: You must specify at least one 
recipient "
+               fprintf(stderr, "[Error]: You must specify at least one 
recipient "
                        "in to, cc or bcc fields.\n");
                return -1;
        }
 
-       // Read each line until we get a single dot "." on a line
+       bool isTerminal = isatty(STDIN_FILENO) != 0;
+       if (isTerminal) {
+               fprintf(stderr, "Now type your message.\n"
+                       "Type '.' alone on a line to end your text and send 
it.\n");
+       }
+
+       BString body;
        char line[32768] = "";
 
-       printf("Now type your message.\nType '.' alone on a line to send 
it.\n");
+       // Read each line and collect the body text until we get an end of text
+       // marker.  That's a single dot "." on a line typed in by the user,
+       // or end of file when reading a file.
        do {
-           gets(line);
-
-           if (strcmp(line, ".") != 0) {
-               body.Append(line).Append("\n");
+               if (fgets(line, sizeof(line), stdin) == NULL) {
+                       // End of file or an error happened, just send 
collected body text.
+                       break;
                }
-           // fprintf(stdout,"Line: %s \n",line);
-       } while (strcmp(line, ".") != 0);
 
+               if (isTerminal && strcmp(line, ".\n") == 0)
+                       break;
+
+               body.Append(line);
+       } while (true);
 
        if (verbose)
-               fprintf(stdout, "\nBody:\n%s\n", body.String());
+               fprintf(stdout, "\nBody:\n%s\n", body.String());
 
        if (verbose)
-               fprintf(stdout, "\nSending E-mail...\n");
+               fprintf(stderr, "Sending E-mail...\n");
        fflush(stdout);
 
        BMailMessage mail;
@@ -105,14 +113,15 @@ int main(int argc, char* argv[])
        mail.AddHeaderField(B_MAIL_CC, cc);
        mail.AddHeaderField(B_MAIL_BCC, bcc);
        mail.AddHeaderField(B_MAIL_SUBJECT, subject);
-       mail.AddContent(body.String(), strlen(body.String()));
+       mail.AddContent(body.String(), body.Length());
        status_t result = mail.Send();
 
        if (result == B_OK) {
-               fprintf(stdout, "\nMessage was sent successfully.\n");
+               if (verbose)
+                       fprintf(stderr, "Message was sent successfully.\n");
                return 0;
        }
 
-       fprintf(stdout, "Message failed to send: %s", strerror(result));
+       fprintf(stderr, "Message failed to send: %s\n", strerror(result));
        return result;
 }


Other related posts:

  • » [haiku-commits] haiku: hrev50117 - src/bin/mail_utils - waddlesplash