On Mon, 24 Jul 2023 16:09:27 +1000
David Gibson <david(a)gibson.dropbear.id.au> wrote:
Errors on send() or recv() calls on a netlink
socket don't indicate errors
with the netlink operations we're attempting, but rather that something's
gone wrong with the mechanics of netlink itself. We don't really expect
this to ever happen, and if it does, it's not clear what we could to to
recover.
So, treat errors from these calls as fatal, rather than returning the error
up the stack. This makes handling failures in the callers of nl_req()
simpler.
Signed-off-by: David Gibson <david(a)gibson.dropbear.id.au>
---
netlink.c | 36 +++++++++++++++++-------------------
1 file changed, 17 insertions(+), 19 deletions(-)
diff --git a/netlink.c b/netlink.c
index 3620fd6..826c926 100644
--- a/netlink.c
+++ b/netlink.c
@@ -103,9 +103,9 @@ fail:
* @req: Request with netlink header
* @len: Request length
*
- * Return: received length on success, negative error code on failure
+ * Return: received length on success, terminates on error
*/
-static int nl_req(int s, char *buf, const void *req, ssize_t len)
+static ssize_t nl_req(int s, char *buf, const void *req, ssize_t len)
{
char flush[NLBUFSIZ];
int done = 0;
@@ -124,11 +124,17 @@ static int nl_req(int s, char *buf, const void *req, ssize_t len)
}
}
- if ((send(s, req, len, 0) < len) ||
- (len = recv(s, buf, NLBUFSIZ, 0)) < 0)
- return -errno;
+ n = send(s, req, len, 0);
+ if (n < 0)
+ die("netlink: Failed to send(): %s", strerror(errno));
+ else if (n < len)
+ die("netlink: Short send");
If you respin, probably worth doing:
die("netlink: Short send (%li out of %li bytes)", n, len);
Done.
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!