batctl: Prefer netlink hardif status retrieval over sysfs

Message ID 20190619073750.19810-1-sven@narfation.org (mailing list archive)
State Accepted, archived
Commit ce5f0efb35bff8a80992df63876bcac1d4a94867
Delegated to: Simon Wunderlich
Headers
Series batctl: Prefer netlink hardif status retrieval over sysfs |

Commit Message

Sven Eckelmann June 19, 2019, 7:37 a.m. UTC
  The sysfs code in batman-adv was changed to print a deprecated warning when
sysfs files are accessed. The `batctl if` call would therefore cause
warnings like this in the kernel log:

  batman_adv: [Deprecated]: batctl (pid 18540) Use of sysfs file "iface_status".
  Use batadv genl family instead

It is now appropriate to try the generic netlink BATADV_CMD_GET_HARDIF
request first to get the status of the interface before falling back to
sysfs.

Reported-by: Linus Lüssing <linus.luessing@c0d3.blue>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
---
 interface.c | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)
  

Patch

diff --git a/interface.c b/interface.c
index 5ff25a7..0a694c9 100644
--- a/interface.c
+++ b/interface.c
@@ -67,18 +67,18 @@  static int get_iface_status_netlink_parse(struct nl_msg *msg, void *arg)
 static char *get_iface_status_netlink(unsigned int meshif, unsigned int hardif,
 				      char *iface_status)
 {
+	char *ret_status = NULL;
 	struct nl_sock *sock;
 	struct nl_msg *msg;
 	int batadv_family;
 	struct nl_cb *cb;
 	int ret;
 
-	strncpy(iface_status, "<error reading status>\n", IFACE_STATUS_LEN);
-	iface_status[IFACE_STATUS_LEN - 1] = '\0';
+	iface_status[0] = '\0';
 
 	sock = nl_socket_alloc();
 	if (!sock)
-		return iface_status;
+		return NULL;
 
 	ret = genl_connect(sock);
 	if (ret < 0)
@@ -111,6 +111,9 @@  static char *get_iface_status_netlink(unsigned int meshif, unsigned int hardif,
 
 	nl_recvmsgs(sock, cb);
 
+	if (strlen(iface_status) > 0)
+		ret_status = iface_status;
+
 err_free_msg:
 	nlmsg_free(msg);
 err_free_cb:
@@ -118,7 +121,7 @@  static char *get_iface_status_netlink(unsigned int meshif, unsigned int hardif,
 err_free_sock:
 	nl_socket_free(sock);
 
-	return iface_status;
+	return ret_status;
 }
 
 static struct nla_policy link_policy[IFLA_MAX + 1] = {
@@ -161,13 +164,17 @@  static int print_interfaces_rtnl_parse(struct nl_msg *msg, void *arg)
 	if (master != print_arg->ifindex)
 		goto err;
 
-	snprintf(path_buff, sizeof(path_buff), SYS_IFACE_STATUS_FMT, ifname);
-	ret = read_file("", path_buff, USE_READ_BUFF | SILENCE_ERRORS, 0, 0, 0);
-	if (ret != EXIT_SUCCESS)
-		status = get_iface_status_netlink(master, ifm->ifi_index,
-						  iface_status);
-	else
-		status = line_ptr;
+	status = get_iface_status_netlink(master, ifm->ifi_index, iface_status);
+	if (!status) {
+		snprintf(path_buff, sizeof(path_buff), SYS_IFACE_STATUS_FMT,
+			 ifname);
+		ret = read_file("", path_buff, USE_READ_BUFF | SILENCE_ERRORS,
+				0, 0, 0);
+		if (ret != EXIT_SUCCESS)
+			status = "<error reading status>\n";
+		else
+			status = line_ptr;
+	}
 
 	printf("%s: %s", ifname, status);