From: Michal Sojka <sojkam1@fel.cvut.cz>
To: Tomi Ollila <tomi.ollila@iki.fi>, notmuch@notmuchmail.org
Cc: Tomi Ollila <too@iki.fi>
Subject: Re: [PATCH V3 1/2] test/smtp-dummy: add --background option and functionality
Date: Thu, 20 Sep 2012 18:37:51 +0200 [thread overview]
Message-ID: <87zk4k4pls.fsf@steelpick.2x.cz> (raw)
In-Reply-To: <1347978182-8771-1-git-send-email-tomi.ollila@iki.fi>
Hi Tomi,
On Tue, Sep 18 2012, Tomi Ollila wrote:
> From: Tomi Ollila <too@iki.fi>
>
> When shell executes background process using '&' the scheduling of
> that new process is arbitrary. It could be that smtp-dummy doesn't
> get execution time to listen() it's server socket until some other
> process attempts to connect() to it. The --background option in
> smtp-dummy makes it to go background *after* it started to listen
> its server socket.
>
> When --background option is used, the line "smtp_dummy_pid='<pid>'"
> is printed to stdout from where shell can eval it.
> ---
>
> This is v3 of id:"1323766883-17607-1-git-send-email-tomi.ollila@iki.fi"
>
> addressing (some) Dmitry's comments.
>
> test/smtp-dummy.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 54 insertions(+), 1 deletion(-)
>
> diff --git a/test/smtp-dummy.c b/test/smtp-dummy.c
> index 86d4316..bb13668 100644
> --- a/test/smtp-dummy.c
> +++ b/test/smtp-dummy.c
> @@ -119,6 +119,7 @@ do_smtp_to_file (FILE *peer, FILE *output)
> int
> main (int argc, char *argv[])
> {
> + const char * progname;
> char *output_filename;
> FILE *peer_file, *output;
> int sock, peer, err;
> @@ -126,9 +127,31 @@ main (int argc, char *argv[])
> struct hostent *hostinfo;
> socklen_t peer_addr_len;
> int reuse;
> + int background;
> +
> + progname = argv[0];
> +
> + background = 0;
> + for (; argc >= 2; argc--, argv++) {
> + if (argv[1][0] != '-')
This is ugly, but all right. I do not think we need to have high
standards for this piece of code :)
> + break;
> + if (strcmp (argv[1], "--") == 0) {
> + argc--;
> + argv++;
> + break;
> + }
> + if (strcmp (argv[1], "--background") == 0) {
> + background = 1;
> + continue;
> + }
> + fprintf(stderr, "%s: unregognized option '%s'\n",
> + progname, argv[1]);
> + return 1;
> + }
>
> if (argc != 2) {
> - fprintf (stderr, "Usage: %s <output-file>\n", argv[0]);
> + fprintf (stderr,
> + "Usage: %s [--background] <output-file>\n", progname);
> return 1;
> }
>
> @@ -181,6 +204,36 @@ main (int argc, char *argv[])
> return 1;
> }
>
> + if (background) {
> + int pid = fork ();
> + if (pid > 0) {
> + printf ("smtp_dummy_pid='%d'\n", pid);
> + fflush (stdout);
> + close (sock);
> + return 0;
> + }
> + if (pid < 0) {
> + fprintf (stderr, "Error: fork() failed: %s\n",
> + strerror (errno));
> + close (sock);
> + return 1;
> + }
> + /* Reached if pid == 0 (the child process). */
> + /* Close stdout so that the one interested in pid value will
> + also get EOF. */
> + close (STDOUT_FILENO);
> + /* dup2() will re-reserve fd of stdout (1) (opportunistically),
> + in case fd of stderr (2) is open. If that was not open we
> + don't care fd of stdout (1) either. */
> + dup2 (STDERR_FILENO, STDOUT_FILENO);
> +
> + /* This process is now out of reach of shell's job control.
> + To resolve the rare but possible condition where this
> + "daemon" is started but never connected this process will
> + (only) have 30 seconds to exist. */
> + alarm (30);
30 seconds is probably enough. If it turns out that we need longer
timeout in some scenario, I'd suggest to call alarm() also when
something is received on the socket to extend the timeout.
Overall, both patches LGTM.
-Michal
next prev parent reply other threads:[~2012-09-20 16:38 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-18 14:23 [PATCH V3 1/2] test/smtp-dummy: add --background option and functionality Tomi Ollila
2012-09-18 14:23 ` [PATCH V3 2/2] test/test-lib.sh: take the --background feature in smtp-dummy into use Tomi Ollila
2012-09-20 16:37 ` Michal Sojka [this message]
2012-10-20 16:08 ` [PATCH V3 1/2] test/smtp-dummy: add --background option and functionality Ethan Glasser-Camp
2012-10-20 21:04 ` David Bremner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://notmuchmail.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87zk4k4pls.fsf@steelpick.2x.cz \
--to=sojkam1@fel.cvut.cz \
--cc=notmuch@notmuchmail.org \
--cc=tomi.ollila@iki.fi \
--cc=too@iki.fi \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhetil.org/notmuch.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).