Return success if there are any valid answer rather than exit with error.

bloatcheck on x86_64:

function                                             old     new   delta
nslookup_main                                        917     924      +7
send_queries                                        2115    2121      +6
.rodata                                           136606  136609      +3
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 16/0)               Total: 16
bytes
   text    data     bss     dec     hex filename
 839394   14660    2080  856134   d1046 busybox_old
 839410   14660    2080  856150   d1056 busybox_unstripped

Signed-off-by: Natanael Copa <nc...@alpinelinux.org>
---
 networking/nslookup.c | 34 ++++++++++++++++++----------------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/networking/nslookup.c b/networking/nslookup.c
index c43e60558..d14412386 100644
--- a/networking/nslookup.c
+++ b/networking/nslookup.c
@@ -265,7 +265,7 @@ struct query {
        const char *name;
        unsigned qlen;
 //     unsigned latency;
-//     uint8_t rcode;
+       uint8_t rcode;
        unsigned char query[512];
 //     unsigned char reply[512];
 };
@@ -321,7 +321,7 @@ struct globals {
        struct query *query;
        char *search;
        smalluint have_search_directive;
-       smalluint exitcode;
+       smallint answer;
 } FIX_ALIASING;
 #define G (*(struct globals*)bb_common_bufsiz1)
 #define INIT_G() do { \
@@ -625,28 +625,31 @@ static int send_queries(struct ns *ns)
 
                /* Process reply */
                G.query[qn].qlen = 0; /* flag: "reply received" */
+               G.query[qn].rcode = rcode;
                tcur = monotonic_ms();
 #if 1
                if (option_mask32 & OPT_debug) {
                        printf("Query #%d completed in %ums:\n", qn, tcur - 
tstart);
                }
                if (rcode != 0) {
-                       printf("** server can't find %s: %s\n",
-                                       G.query[qn].name, rcodes[rcode]);
-                       G.exitcode = EXIT_FAILURE;
+                       printf("** server can't find %s: %s\n\n",
+                               G.query[qn].name, rcodes[rcode]);
                } else {
                        switch (parse_reply(reply, recvlen)) {
                        case -1:
-                               printf("*** Can't find %s: Parse error\n", 
G.query[qn].name);
-                               G.exitcode = EXIT_FAILURE;
+                               printf("*** Can't find %s: Parse error\n\n", 
G.query[qn].name);
+                               G.query[qn].rcode = 0x10;
                                break;
 
                        case 0:
-                               printf("*** Can't find %s: No answer\n", 
G.query[qn].name);
+                               G.query[qn].rcode = 0x20;
+                               break;
+                       default:
+                               bb_putchar('\n');
+                               G.answer++;
                                break;
                        }
                }
-               bb_putchar('\n');
                n_replies++;
                if (n_replies >= G.query_count)
                        goto ret;
@@ -1004,21 +1007,20 @@ int nslookup_main(int argc UNUSED_PARAM, char **argv)
        }
 
        err = 0;
-       for (rc = 0; rc < G.query_count; rc++) {
-               if (G.query[rc].qlen) {
-                       printf("*** Can't find %s: No answer\n", 
G.query[rc].name);
-                       err = 1;
+       for (rc = 0; !G.answer && rc < G.query_count; rc++) {
+               if (G.query[rc].qlen || G.query[rc].rcode == 0x20) {
+                       printf("*** Can't find %s: No answer\n\n", 
G.query[rc].name);
+               } else if (G.query[rc].rcode != 0) {
+                       err = EXIT_FAILURE;
                }
        }
-       if (err) /* should this affect exicode too? */
-               bb_putchar('\n');
 
        if (ENABLE_FEATURE_CLEAN_UP) {
                free(G.server);
                free(G.query);
        }
 
-       return G.exitcode;
+       return err;
 }
 
 #endif
-- 
2.25.0

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to