From b8cf1e9ae3d5e5ec17e79c0876755594770952b7 Mon Sep 17 00:00:00 2001 From: Pavel Emelyanov Date: Mon, 20 Aug 2012 12:08:40 +0400 Subject: [PATCH] iproute: Fix errno propagation from rtnl_talk 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 --- lib/libnetlink.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/libnetlink.c b/lib/libnetlink.c index 878911ec4..8e8c8b9e5 100644 --- a/lib/libnetlink.c +++ b/lib/libnetlink.c @@ -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; } -- 2.47.3