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;
}