]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
iproute: Fix errno propagation from rtnl_talk
authorPavel Emelyanov <xemul@parallels.com>
Mon, 20 Aug 2012 08:08:40 +0000 (12:08 +0400)
committerStephen Hemminger <shemminger@vyatta.com>
Mon, 20 Aug 2012 19:54:48 +0000 (12:54 -0700)
Callers of rtnl_talk check errno value for their needs. In particular, the addrs
and routes restoring code validly reports success if the EEXISTS is in there.

However, the errno value can be sometimes screwed up by the perror call. Thus
we should only set it _after_ the message was emitted.

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
lib/libnetlink.c

index 878911ec4610d7247d78d1bb1d5324e00c98d5cc..8e8c8b9e574a469a365d176f790523a46db17b88 100644 (file)
@@ -360,13 +360,14 @@ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer,
                                if (l < sizeof(struct nlmsgerr)) {
                                        fprintf(stderr, "ERROR truncated\n");
                                } else {
-                                       errno = -err->error;
-                                       if (errno == 0) {
+                                       if (!err->error) {
                                                if (answer)
                                                        memcpy(answer, h, h->nlmsg_len);
                                                return 0;
                                        }
-                                       perror("RTNETLINK answers");
+
+                                       fprintf(stderr, "RTNETLINK answers: %s\n", strerror(-err->error));
+                                       errno = -err->error;
                                }
                                return -1;
                        }