From 67bf48c1cb3ed55249c27e6f02f5c938b20e027d Mon Sep 17 00:00:00 2001
From: Josh Gao <jmgao@google.com>
Date: Fri, 9 Jun 2017 10:51:18 -0700
Subject: netcat: make -l exit after handling a request.

Bug: http://b/62305466
---
 toys/net/netcat.c | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/toys/net/netcat.c b/toys/net/netcat.c
index 13ba3114..795f7b3c 100644
--- a/toys/net/netcat.c
+++ b/toys/net/netcat.c
@@ -126,11 +126,15 @@ void netcat_main(void)
 // TODO xconnect
       if (connect(sockfd, (struct sockaddr *)address, sizeof(*address))<0)
         perror_exit("connect");
-      in1 = out2 = sockfd;
 
-    // Listen for incoming connections
+      // We have a connection. Disarm timeout.
+      set_alarm(0);
+
+      in1 = out2 = sockfd;
 
+      pollinate(in1, in2, out1, out2, TT.idle, TT.quit_delay);
     } else {
+      // Listen for incoming connections
       socklen_t len = sizeof(*address);
 
       if (listen(sockfd, 5)) error_exit("listen");
@@ -143,7 +147,7 @@ void netcat_main(void)
         if (CFG_TOYBOX_FORK && toys.optc && xfork()) goto cleanup;
       }
 
-      for (;;) {
+      do {
         child = 0;
         len = sizeof(*address); // gcc's insane optimizer can overwrite this
         in1 = out2 = accept(sockfd, (struct sockaddr *)address, &len);
@@ -189,15 +193,10 @@ void netcat_main(void)
 
         pollinate(in1, in2, out1, out2, TT.idle, TT.quit_delay);
         close(in1);
-      }
+      } while (!(toys.optflags&FLAG_l));
     }
   }
 
-  // We have a connection. Disarm timeout.
-  set_alarm(0);
-
-  pollinate(in1, in2, out1, out2, TT.idle, TT.quit_delay);
-
 cleanup:
   if (CFG_TOYBOX_FREE) {
     close(in1);
-- 
cgit v1.2.3