#endif
}
-int
-if_getssid(struct interface *ifp)
+static int
+if_getssid1(const char *ifname, char *ssid)
{
int s, retval = -1;
#if defined(SIOCG80211NWID)
#if defined(SIOCG80211NWID) /* NetBSD */
memset(&ifr, 0, sizeof(ifr));
- strlcpy(ifr.ifr_name, ifp->name, sizeof(ifr.ifr_name));
+ strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
memset(&nwid, 0, sizeof(nwid));
ifr.ifr_data = (void *)&nwid;
if (ioctl(s, SIOCG80211NWID, &ifr) == 0) {
- if (nwid.i_len > sizeof(ifp->ssid)) {
+ if (ssid == NULL)
+ retval = nwid.i_len;
+ else if (nwid.i_len > IF_SSIDSIZE) {
errno = ENOBUFS;
retval = -1;
} else {
retval = nwid.i_len;
- memcpy(ifp->ssid, nwid.i_nwid, nwid.i_len);
+ memcpy(ssid, nwid.i_nwid, nwid.i_len);
ssid[nwid.i_len] = '\0';
- ifp->ssid_len = nwid.i_len;
}
}
#elif defined(IEEE80211_IOC_SSID) /* FreeBSD */
memset(nwid, 0, sizeof(nwid));
ireq.i_data = &nwid;
if (ioctl(s, SIOCG80211, &ireq) == 0) {
- if (ireq.i_len > sizeof(ifp->ssid)) {
+ if (ssid == NULL)
+ retval = ireq.i_len;
+ else if (ireq.i_len > IF_SSIDSIZE) {
errno = ENOBUFS;
retval = -1;
} else {
retval = ireq.i_len;
- memcpy(ifp->ssid, nwid, ireq.i_len);
- ifp->ssid[ireq.i_len] = '\0';
- ifp->ssid_len = ireq.i_len;
+ memcpy(ssid, nwid, ireq.i_len);
+ ssid[ireq.i_len] = '\0';
}
}
#endif
return retval;
}
+int
+if_getssid(struct interface *ifp)
+{
+ int r;
+
+ r = if_getssid1(ifp->name, ifp->ssid);
+ if (r != -1)
+ ifp->ssid_len = (unsigned int)r;
+ return r;
+}
+
/*
* FreeBSD allows for Virtual Access Points
* We need to check if the interface is a Virtual Interface Master
if (ifmr.ifm_status & IFM_AVALID &&
IFM_TYPE(ifmr.ifm_active) == IFM_IEEE80211)
{
- if (if_getssid(ifname, NULL) == -1)
+ if (if_getssid1(ifname, NULL) == -1)
return 1;
}
return 0;
else
pfx = NULL;
if (pfx) {
- int pfx_len;
+ size_t pfx_len;
ssize_t psl;
pfx_len = strlen(pfx);
psl = print_string(NULL, 0,
(const uint8_t *)ifp->ssid, ifp->ssid_len);
if (psl != -1) {
- EMALLOC(elen, pfx_len + psl + 1);
+ EMALLOC(elen, pfx_len + (size_t)psl + 1);
memcpy(env[elen], pfx, pfx_len);
- print_string(env[elen] + pfx_len, psl,
+ print_string(env[elen] + pfx_len, (size_t)psl,
(const uint8_t *)ifp->ssid, ifp->ssid_len);
elen++;
}