return MESHD_ERROR_IO_ERROR;
}
- strncpy(bridge, bridge_name, IFNAMSIZ);
+ snprintf(bridge, IFNAMSIZ, "%s", bridge_name);
#ifdef SIOCBRADDBR
val = ioctl(br_fd, SIOCBRADDBR, bridge_name);
#else
return MESHD_ERROR_IO_ERROR;
}
- strncpy(bridge, bridge_name, IFNAMSIZ);
+ snprintf(bridge, IFNAMSIZ, "%s", bridge_name);
#ifdef SIOCBRDELBR
val = ioctl(br_fd, SIOCBRDELBR, bridge_name);
#else
return MESHD_ERROR_IO_ERROR;
}
- strncpy(ifr.ifr_name, bridge_name, IFNAMSIZ);
+ snprintf(ifr.ifr_name, IFNAMSIZ, "%s", bridge_name);
#ifdef SIOCBRADDIF
ifr.ifr_ifindex = if_index;
val = ioctl(br_fd, SIOCBRADDIF, &ifr);
return MESHD_ERROR_IO_ERROR;
}
- strncpy(ifr.ifr_name, bridge_name, IFNAMSIZ);
+ snprintf(ifr.ifr_name, IFNAMSIZ, "%s", bridge_name);
#ifdef SIOCBRDELIF
ifr.ifr_ifindex = if_index;
val = ioctl(br_fd, SIOCBRDELIF, &ifr);
g_free(scan_item->bssid);
g_free(scan_item->object_path);
}
+ g_free(scan_item);
}
static void _on_peer_info_destroy(gpointer data)
{
mesh_peer_info_s *peer = (mesh_peer_info_s *)data;
+
if (peer)
g_free(peer->address);
+ g_free(peer);
}
static void _get_joined_network(mesh_service *service, GVariant *variant)
static void _get_connected_mesh_peers(mesh_service *service, GVariant *variant)
{
GVariantIter *peer = NULL;
- GVariantIter *property = NULL;
- gchar *key = NULL;
GVariant *val = NULL;
gsize len = 0;
GVariant *child;
+ GVariant *dict = NULL;
g_variant_get(variant, "(a(a{sv}))", &peer);
while ((child = g_variant_iter_next_value(peer))) {
return;
}
- g_variant_get(child, "(a{sv})", &property);
- while (g_variant_iter_loop(property, "{sv}", &key, &val)) {
- if (strcasecmp(key, "PeerAddress") == 0) {
- const char *buf = g_variant_get_string(val, &len);
- peer_info->address = g_strdup(buf);
- MESH_LOGD(" Address : %s", peer_info->address);
- }
+ /* a{sv} <- (a{sv}) */
+ dict = g_variant_get_child_value(child, 0);
+ val = g_variant_lookup_value(dict, "PeerAddress", NULL);
+ if (NULL != val) {
+ const char *buf = g_variant_get_string(val, &len);
+ peer_info->address = g_strdup(buf);
+ MESH_LOGD(" Address : %s", peer_info->address);
+ g_variant_unref(val);
+ } else {
+ MESH_LOGE("Unable to get address !");
+ g_free(peer_info);
+ continue;
}
- /* Last element */
+
service->connected_mesh_peers =
g_list_prepend(service->connected_mesh_peers, peer_info);
-
- g_variant_iter_free(property);
}
g_variant_iter_free(peer);
}
char* mesh_interface_get_address(const char* if_name)
{
FILE *pf;
- char buf[32];
+ char buf[32] = { 0, };
char *result = NULL;
- int cnt = 0;
snprintf(buf, sizeof(buf), "/sys/class/net/%s/address", if_name);
pf = fopen(buf, "r");
if (NULL != pf) {
- cnt = fscanf(pf, "%s", buf);
- MESH_LOGD("Interface[%s] address[%s] %d", if_name, buf, cnt);
- result = g_strdup(buf);
+ fgets(buf, 31, pf);
+ MESH_LOGD("Interface[%s] address[%s]", if_name, buf);
+
+ if (strlen(buf) > 0)
+ result = g_strdup(buf);
fclose(pf);
}
static void mac_addr_n2a(char *mac_addr, unsigned char *arg)
{
- snprintf(mac_addr, MAX_MAC_ADDR_LEN+1,
+ /* 11:22:33:44:55:66 (Len:17) */
+ snprintf(mac_addr, MAX_MAC_ADDR_LEN,
"%02X:%02X:%02X:%02X:%02X:%02X",
arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]);
}
[NL80211_STA_INFO_BSS_PARAM] = { .type = NLA_NESTED },
[NL80211_STA_INFO_RX_DURATION] = { .type = NLA_U64 },
};
- char mac_addr[20], state_name[10], dev[20];
+ char mac_addr[MAX_MAC_ADDR_LEN], state_name[10], dev[20];
char *chain;
mesh_nl_state *state = (mesh_nl_state *)arg;
mesh_station_info_s *station_info = NULL;
nla_get_u8(sinfo[NL80211_STA_INFO_PLINK_STATE]);
switch (station_info->mesh_plink) {
case LISTEN:
- strcpy(state_name, "LISTEN");
+ snprintf(state_name, 10, "%s", "LISTEN");
break;
case OPN_SNT:
- strcpy(state_name, "OPN_SNT");
+ snprintf(state_name, 10, "%s", "OPN_SNT");
break;
case OPN_RCVD:
- strcpy(state_name, "OPN_RCVD");
+ snprintf(state_name, 10, "%s", "OPN_RCVD");
break;
case CNF_RCVD:
- strcpy(state_name, "CNF_RCVD");
+ snprintf(state_name, 10, "%s", "CNF_RCVD");
break;
case ESTAB:
- strcpy(state_name, "ESTAB");
+ snprintf(state_name, 10, "%s", "ESTAB");
break;
case HOLDING:
- strcpy(state_name, "HOLDING");
+ snprintf(state_name, 10, "%s", "HOLDING");
break;
case BLOCKED:
- strcpy(state_name, "BLOCKED");
+ snprintf(state_name, 10, "%s", "BLOCKED");
break;
default:
- strcpy(state_name, "UNKNOWN");
+ snprintf(state_name, 10, "%s", "UNKNOWN");
break;
}
MESH_LOGD(" mesh plink:\t%s", state_name);
struct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));
struct nlattr *tb[NL80211_ATTR_MAX + 1];
char ifname[16] = { 0, };
- char macbuf[6*3];
+ char macbuf[MAX_MAC_ADDR_LEN];
NOTUSED(arg);
g_free(scan_item->bssid);
g_free(scan_item->object_path);
}
+ g_free(scan_item);
+}
+
+static void _on_peer_info_destroy(gpointer data)
+{
+ mesh_peer_info_s *peer = (mesh_peer_info_s *)data;
+ if (peer)
+ g_free(peer->address);
+ g_free(peer);
}
static void _on_station_list_destroy(gpointer data)
mesh_service *service = (mesh_service *)user_data;
mesh_network_info_s *joined = NULL;
- ret = mesh_request_get_networks(service);
+ ret = mesh_request_get_joined_network(service);
if (MESHD_ERROR_NONE == ret) {
joined = service->joined_network;
if (joined) {
g_list_free_full(service->scanned_mesh_network, _on_scan_result_destroy);
service->scanned_mesh_network = NULL;
+ /* Clear connected peers list */
+ g_list_free_full(service->connected_mesh_peers, _on_peer_info_destroy);
+ service->connected_mesh_peers = NULL;
+
g_free(service->interface_info);
service->interface_info = NULL;
}