From 0a2545b4488d8f3b634f1ae56d477463215a0fcd Mon Sep 17 00:00:00 2001 From: Kalle Lampila Date: Wed, 20 Mar 2013 15:30:09 +0200 Subject: [PATCH] Read MAC address using ioctl if .mac.info file doesn't exist Only some of kernel drivers write MAC to /opt/etc/.mac.info, so add alternative way to get MAC using ioctl. Signed-off-by: Kalle Lampila Change-Id: I5824f10f20386be86106a61bce1f1fa7f141a432 --- src/utils/util.c | 73 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 19 deletions(-) diff --git a/src/utils/util.c b/src/utils/util.c index bb468ab..001cdb6 100644 --- a/src/utils/util.c +++ b/src/utils/util.c @@ -21,6 +21,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -34,6 +37,7 @@ #define WIFI_MAC_INFO_FILE "/opt/etc/.mac.info" #define WIFI_MAC_INFO_LENGTH 17 +#define WIFI_DEV_NAME "wlan0" GKeyFile *netconfig_keyfile_load(const char *pathname) { @@ -392,40 +396,64 @@ void netconfig_del_wifi_found_notification(void) void netconfig_set_wifi_mac_address(void) { - FILE *fp; + FILE *fp = NULL; + struct ifreq ifr; + int ctl_sk = -1; char buf[WIFI_MAC_INFO_LENGTH + 1]; char *mac_info; mac_info = vconf_get_str(VCONFKEY_WIFI_BSSID_ADDRESS); if (mac_info == NULL) { ERR("Failed to open vconf key %s", VCONFKEY_WIFI_BSSID_ADDRESS); - return; } INFO("%s : %s", VCONFKEY_WIFI_BSSID_ADDRESS, mac_info); fp = fopen(WIFI_MAC_INFO_FILE, "r"); - if (fp == NULL) { - ERR("Failed to open file %s", WIFI_MAC_INFO_FILE); - g_free(mac_info); - return; - } + if (fp != NULL) { + if (fgets(buf, sizeof(buf), fp) == NULL) { + ERR("Failed to get MAC info from %s", WIFI_MAC_INFO_FILE); + goto done; + } - if (fgets(buf, sizeof(buf), fp) == NULL) { - ERR("Failed to get MAC info from %s", WIFI_MAC_INFO_FILE); - goto done; - } + INFO("%s : %s", WIFI_MAC_INFO_FILE, buf); - INFO("%s : %s", WIFI_MAC_INFO_FILE, buf); + if (strlen(buf) < WIFI_MAC_INFO_LENGTH) { + ERR("Failed to get MAC info from %s", WIFI_MAC_INFO_FILE); + goto done; + } - if (strlen(buf) < WIFI_MAC_INFO_LENGTH) { - ERR("Failed to get MAC info from %s", WIFI_MAC_INFO_FILE); - goto done; - } + buf[WIFI_MAC_INFO_LENGTH] = '\0'; + } else { + // not MAC into file use ioctl to get MAC + ctl_sk = socket(PF_INET,SOCK_DGRAM,0); + if (ctl_sk < 0 ) { + ERR("Failed to open socket"); + goto done; + } - buf[WIFI_MAC_INFO_LENGTH] = '\0'; + memset(&ifr, 0, sizeof(struct ifreq)); + strncpy(ifr.ifr_name, WIFI_DEV_NAME, sizeof(ifr.ifr_name) - 1); + ifr.ifr_name[sizeof(ifr.ifr_name) - 1] = 0; - if (g_str_equal(mac_info, buf) == TRUE) + if (ioctl(ctl_sk, SIOCGIFHWADDR, &ifr) != 0) { + ERR("Failed to SIOCGIFHWADDR ioctl"); + goto done; + } + + snprintf(buf, WIFI_MAC_INFO_LENGTH + 1, + "%02x:%02x:%02x:%02x:%02x:%02x", + (unsigned char)ifr.ifr_hwaddr.sa_data[0], + (unsigned char)ifr.ifr_hwaddr.sa_data[1], + (unsigned char)ifr.ifr_hwaddr.sa_data[2], + (unsigned char)ifr.ifr_hwaddr.sa_data[3], + (unsigned char)ifr.ifr_hwaddr.sa_data[4], + (unsigned char)ifr.ifr_hwaddr.sa_data[5]); + + INFO("%s MAC address: %s", WIFI_DEV_NAME, buf); + } + + if (mac_info && (g_str_equal(mac_info, buf) == TRUE)) goto done; if (vconf_set_str(VCONFKEY_WIFI_BSSID_ADDRESS, buf) != 0) @@ -433,5 +461,12 @@ void netconfig_set_wifi_mac_address(void) done: g_free(mac_info); - fclose(fp); + + if (fp != NULL) { + fclose(fp); + } + + if (ctl_sk >= 0) { + close(ctl_sk); + } } -- 2.34.1