[PATCH V3 1/2] test/smtp-dummy: add --background option and functionality
authorTomi Ollila <tomi.ollila@iki.fi>
Tue, 18 Sep 2012 14:23:01 +0000 (17:23 +0300)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 17:49:33 +0000 (09:49 -0800)
8e/ab5670c69dbf0828a17be23ef1c64cb4a4e8df [new file with mode: 0644]

diff --git a/8e/ab5670c69dbf0828a17be23ef1c64cb4a4e8df b/8e/ab5670c69dbf0828a17be23ef1c64cb4a4e8df
new file mode 100644 (file)
index 0000000..99b3ff3
--- /dev/null
@@ -0,0 +1,148 @@
+Return-Path: <too@guru-group.fi>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+       by olra.theworths.org (Postfix) with ESMTP id 60B4B431FAF\r
+       for <notmuch@notmuchmail.org>; Tue, 18 Sep 2012 07:23:13 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: 0\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none]\r
+       autolearn=disabled\r
+Received: from olra.theworths.org ([127.0.0.1])\r
+       by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
+       with ESMTP id qhNImnqC3i5Y for <notmuch@notmuchmail.org>;\r
+       Tue, 18 Sep 2012 07:23:12 -0700 (PDT)\r
+Received: from guru.guru-group.fi (guru.guru-group.fi [46.183.73.34])\r
+       by olra.theworths.org (Postfix) with ESMTP id 30F80431FAE\r
+       for <notmuch@notmuchmail.org>; Tue, 18 Sep 2012 07:23:12 -0700 (PDT)\r
+Received: by guru.guru-group.fi (Postfix, from userid 501)\r
+       id 2956E1002A4; Tue, 18 Sep 2012 17:23:17 +0300 (EEST)\r
+From: Tomi Ollila <tomi.ollila@iki.fi>\r
+To: notmuch@notmuchmail.org\r
+Subject: [PATCH V3 1/2] test/smtp-dummy: add --background option and\r
+       functionality\r
+Date: Tue, 18 Sep 2012 17:23:01 +0300\r
+Message-Id: <1347978182-8771-1-git-send-email-tomi.ollila@iki.fi>\r
+X-Mailer: git-send-email 1.7.1\r
+Cc: Tomi Ollila <too@iki.fi>\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.13\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+       <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Tue, 18 Sep 2012 14:23:13 -0000\r
+\r
+From: Tomi Ollila <too@iki.fi>\r
+\r
+When shell executes background process using '&' the scheduling of\r
+that new process is arbitrary. It could be that smtp-dummy doesn't\r
+get execution time to listen() it's server socket until some other\r
+process attempts to connect() to it. The --background option in\r
+smtp-dummy makes it to go background *after* it started to listen\r
+its server socket.\r
+\r
+When --background option is used, the line "smtp_dummy_pid='<pid>'"\r
+is printed to stdout from where shell can eval it.\r
+---\r
+\r
+This is v3 of id:"1323766883-17607-1-git-send-email-tomi.ollila@iki.fi"\r
+\r
+addressing (some) Dmitry's comments.\r
+\r
+ test/smtp-dummy.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-\r
+ 1 file changed, 54 insertions(+), 1 deletion(-)\r
+\r
+diff --git a/test/smtp-dummy.c b/test/smtp-dummy.c\r
+index 86d4316..bb13668 100644\r
+--- a/test/smtp-dummy.c\r
++++ b/test/smtp-dummy.c\r
+@@ -119,6 +119,7 @@ do_smtp_to_file (FILE *peer, FILE *output)\r
+ int\r
+ main (int argc, char *argv[])\r
+ {\r
++      const char * progname;\r
+       char *output_filename;\r
+       FILE *peer_file, *output;\r
+       int sock, peer, err;\r
+@@ -126,9 +127,31 @@ main (int argc, char *argv[])\r
+       struct hostent *hostinfo;\r
+       socklen_t peer_addr_len;\r
+       int reuse;\r
++      int background;\r
++\r
++      progname = argv[0];\r
++\r
++      background = 0;\r
++      for (; argc >= 2; argc--, argv++) {\r
++              if (argv[1][0] != '-')\r
++                      break;\r
++              if (strcmp (argv[1], "--") == 0) {\r
++                      argc--;\r
++                      argv++;\r
++                      break;\r
++              }\r
++              if (strcmp (argv[1], "--background") == 0) {\r
++                      background = 1;\r
++                      continue;\r
++              }\r
++              fprintf(stderr, "%s: unregognized option '%s'\n",\r
++                      progname, argv[1]);\r
++              return 1;\r
++      }\r
+ \r
+       if (argc != 2) {\r
+-              fprintf (stderr, "Usage: %s <output-file>\n", argv[0]);\r
++              fprintf (stderr,\r
++                       "Usage: %s [--background] <output-file>\n", progname);\r
+               return 1;\r
+       }\r
+ \r
+@@ -181,6 +204,36 @@ main (int argc, char *argv[])\r
+               return 1;\r
+       }\r
+ \r
++      if (background) {\r
++              int pid = fork ();\r
++              if (pid > 0) {\r
++                      printf ("smtp_dummy_pid='%d'\n", pid);\r
++                      fflush (stdout);\r
++                      close (sock);\r
++                      return 0;\r
++              }\r
++              if (pid < 0) {\r
++                      fprintf (stderr, "Error: fork() failed: %s\n",\r
++                               strerror (errno));\r
++                      close (sock);\r
++                      return 1;\r
++              }\r
++              /* Reached if pid == 0 (the child process). */\r
++              /* Close stdout so that the one interested in pid value will\r
++                 also get EOF. */\r
++              close (STDOUT_FILENO);\r
++              /* dup2() will re-reserve fd of stdout (1) (opportunistically),\r
++                 in case fd of stderr (2) is open. If that was not open we\r
++                 don't care fd of stdout (1) either. */\r
++              dup2 (STDERR_FILENO, STDOUT_FILENO);\r
++\r
++              /* This process is now out of reach of shell's job control.\r
++                 To resolve the rare but possible condition where this\r
++                 "daemon" is started but never connected this process will\r
++                 (only) have 30 seconds to exist. */\r
++              alarm (30);\r
++      }\r
++\r
+       peer_addr_len = sizeof (peer_addr);\r
+       peer = accept (sock, (struct sockaddr *) &peer_addr, &peer_addr_len);\r
+       if (peer == -1) {\r
+-- \r
+1.7.11.4\r
+\r