sd_genl_family family;
int r;
+ assert(genl);
+ assert(ifindex > 0);
+
r = sd_genl_message_new(genl, SD_GENL_NL80211, NL80211_CMD_GET_INTERFACE, &m);
if (r < 0)
return log_debug_errno(r, "Failed to create generic netlink message: %m");
return log_debug_errno(r, "Could not append NL80211_ATTR_IFINDEX attribute: %m");
r = sd_netlink_call(genl, m, 0, &reply);
+ if (r == -ENODEV) {
+ /* For obsolete WEXT driver. */
+ log_debug_errno(r, "Failed to request information about wifi interface %d. "
+ "The device doesn't seem to have nl80211 interface. Ignoring.",
+ ifindex);
+ goto nodata;
+ }
if (r < 0)
return log_debug_errno(r, "Failed to request information about wifi interface %d: %m", ifindex);
if (!reply)
- return 0;
+ goto nodata;
r = sd_netlink_message_get_errno(reply);
if (r < 0)
return log_debug_errno(r, "Failed to determine genl family: %m");
if (family != SD_GENL_NL80211) {
log_debug("Received message of unexpected genl family %u, ignoring.", family);
- return 0;
+ goto nodata;
}
if (iftype) {
if (ssid) {
r = sd_netlink_message_read_string_strdup(reply, NL80211_ATTR_SSID, ssid);
- if (r < 0 && r != -ENODATA)
+ if (r == -ENODATA)
+ goto nodata;
+ if (r < 0)
return log_debug_errno(r, "Failed to get NL80211_ATTR_SSID attribute: %m");
}
- return r == -ENODATA ? 0 : 1;
+ return 1;
+
+nodata:
+ if (iftype)
+ *iftype = 0;
+ if (ssid)
+ *ssid = NULL;
+ return 0;
}
int wifi_get_station(sd_netlink *genl, int ifindex, struct ether_addr *bssid) {
sd_genl_family family;
int r;
+ assert(genl);
+ assert(ifindex > 0);
+ assert(bssid);
+
r = sd_genl_message_new(genl, SD_GENL_NL80211, NL80211_CMD_GET_STATION, &m);
if (r < 0)
return log_debug_errno(r, "Failed to create generic netlink message: %m");
if (r < 0)
return log_debug_errno(r, "Failed to request information about wifi station: %m");
if (!reply)
- return 0;
+ goto nodata;
r = sd_netlink_message_get_errno(reply);
if (r < 0)
return log_debug_errno(r, "Failed to determine genl family: %m");
if (family != SD_GENL_NL80211) {
log_debug("Received message of unexpected genl family %u, ignoring.", family);
- return 0;
+ goto nodata;
}
r = sd_netlink_message_read_ether_addr(reply, NL80211_ATTR_MAC, bssid);
- if (r < 0 && r != -ENODATA)
+ if (r == -ENODATA)
+ goto nodata;
+ if (r < 0)
return log_debug_errno(r, "Failed to get NL80211_ATTR_MAC attribute: %m");
- return r == -ENODATA ? 0 : 1;
+ return 1;
+
+nodata:
+ *bssid = (struct ether_addr) {};
+ return 0;
}