Exit early or continue on error instead of putting conditional into
conditional to make reading the code a bit easier.

Also, the call to memcpy() can be skipped by initialising prog with the
desired prefix.

Signed-off-by: Phil Sutter <p...@nwl.cc>
---
 misc/ss.c | 53 ++++++++++++++++++++++++++++++-----------------------
 1 file changed, 30 insertions(+), 23 deletions(-)

diff --git a/misc/ss.c b/misc/ss.c
index a9ae85ec564e9..4988d34e18c78 100644
--- a/misc/ss.c
+++ b/misc/ss.c
@@ -870,31 +870,38 @@ static void init_service_resolver(void)
 {
        char buf[128];
        FILE *fp = popen("/usr/sbin/rpcinfo -p 2>/dev/null", "r");
-       if (fp) {
-               fgets(buf, sizeof(buf), fp);
-               while (fgets(buf, sizeof(buf), fp) != NULL) {
-                       unsigned int progn, port;
-                       char proto[128], prog[128];
-                       if (sscanf(buf, "%u %*d %s %u %s", &progn, proto,
-                                  &port, prog+4) == 4) {
-                               struct scache *c = malloc(sizeof(*c));
-                               if (c) {
-                                       c->port = port;
-                                       memcpy(prog, "rpc.", 4);
-                                       c->name = strdup(prog);
-                                       if (strcmp(proto, TCP_PROTO) == 0)
-                                               c->proto = TCP_PROTO;
-                                       else if (strcmp(proto, UDP_PROTO) == 0)
-                                               c->proto = UDP_PROTO;
-                                       else
-                                               c->proto = NULL;
-                                       c->next = rlist;
-                                       rlist = c;
-                               }
-                       }
-               }
+
+       if (!fp)
+               return;
+
+       if (!fgets(buf, sizeof(buf), fp)) {
                pclose(fp);
+               return;
+       }
+       while (fgets(buf, sizeof(buf), fp) != NULL) {
+               unsigned int progn, port;
+               char proto[128], prog[128] = "rpc.";
+               struct scache *c;
+
+               if (sscanf(buf, "%u %*d %s %u %s",
+                          &progn, proto, &port, prog+4) != 4)
+                       continue;
+
+               if (!(c = malloc(sizeof(*c))))
+                       continue;
+
+               c->port = port;
+               c->name = strdup(prog);
+               if (strcmp(proto, TCP_PROTO) == 0)
+                       c->proto = TCP_PROTO;
+               else if (strcmp(proto, UDP_PROTO) == 0)
+                       c->proto = UDP_PROTO;
+               else
+                       c->proto = NULL;
+               c->next = rlist;
+               rlist = c;
        }
+       pclose(fp);
 }
 
 static int ip_local_port_min, ip_local_port_max;
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to