Date: Tue, 30 Jul 2013 09:32:59 GMT From: svn-freebsd-gecko@chruetertee.ch To: freebsd-gecko@freebsd.org Subject: [SVN-Commit] r1295 - in trunk/www: firefox-nightly/files firefox/files seamonkey/files Message-ID: <201307300932.r6U9Wxj0097921@trillian.chruetertee.ch>
next in thread | raw e-mail | index | archive | help
Author: jbeich Date: Tue Jul 30 09:32:58 2013 New Revision: 1295 Log: improve style based on review Submitted by: J.R. Oldroyd <fbsd@opal.com> Modified: trunk/www/firefox-nightly/files/patch-bug893397 trunk/www/firefox/files/patch-bug893397 trunk/www/seamonkey/files/patch-bug893397 Modified: trunk/www/firefox-nightly/files/patch-bug893397 ============================================================================== --- trunk/www/firefox-nightly/files/patch-bug893397 Tue Jul 30 09:32:51 2013 (r1294) +++ trunk/www/firefox-nightly/files/patch-bug893397 Tue Jul 30 09:32:58 2013 (r1295) @@ -31,191 +31,175 @@ index 0000000..80d4cb6 --- /dev/null +++ netwerk/wifi/nsWifiScannerFreeBSD.cpp -@@ -0,0 +1,187 @@ +@@ -0,0 +1,171 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + -+// Developed by J.R. Oldroyd <fbsd@opal.com> and offered to the FreeBSD -+// www/chromium and www/firefox ports under the terms of each browser's -+// license. ++// Developed by J.R. Oldroyd <fbsd@opal.com>, December 2012. + +// For FreeBSD we use the getifaddrs(3) to obtain the list of interfaces +// and then check for those with an 802.11 media type and able to return -+// a list of stations. This is similar to ifconfig(8). ++// a list of stations. This is similar to ifconfig(8). + -+#include "nsCOMPtr.h" -+#include "nsComponentManagerUtils.h" -+#include "nsServiceManagerUtils.h" -+#include "nsThreadUtils.h" -+#include "nsXPCOM.h" -+#include "nsXPCOMCID.h" -+#include "nsIObserver.h" -+#include "nsIObserverService.h" -+#include "nsWifiMonitor.h" -+#include "nsWifiAccessPoint.h" -+ -+#include "nsServiceManagerUtils.h" -+#include "nsComponentManagerUtils.h" -+#include "mozilla/Services.h" -+ -+using namespace mozilla; -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include <unistd.h> +#include <sys/types.h> ++#include <sys/ioctl.h> +#include <sys/socket.h> -+#include <sys/sockio.h> +#include <net/if.h> +#include <net/if_media.h> -+#include <ifaddrs.h> +#include <net80211/ieee80211_ioctl.h> -+#include <net/ethernet.h> + -+// Convert a wifi frequency to the corresponding channel. -+// Taken from wifi_data_provider_linux.cc where it says this was -+// adapted from geolocaiton/wifilib.cc in googleclient (internal to google). -+int frequency_to_channel(int frequency_Mhz) { -+ if (frequency_Mhz >= 2412 && frequency_Mhz <= 2472) // Channels 1-13. -+ return (frequency_Mhz - 2407) / 5; -+ if (frequency_Mhz == 2484) -+ return 14; -+ if (frequency_Mhz > 5000 && frequency_Mhz < 6000) // .11a bands. -+ return (frequency_Mhz - 5000) / 5; -+ // Ignore everything else. -+ return -1; // invalid channel -+} ++#include <ifaddrs.h> ++#include <string.h> ++#include <unistd.h> + -+nsresult -+FreeBSDGetAccessPointData(nsCOMArray<nsWifiAccessPoint> &accessPoints) { -+ bool res; -+ char *dupn; -+ struct ifaddrs *ifal, *ifa; -+ struct ifreq ifr; -+ struct ifmediareq ifmr; -+ struct ieee80211req i802r; -+ int s; -+ char iscanbuf[32*1024], *vsr; -+ unsigned len; -+ nsWifiAccessPoint *ap; -+ -+ if (getifaddrs(&ifal) < 0) -+ return NS_ERROR_FAILURE; -+ -+ accessPoints.Clear(); -+ -+ res = false; -+ dupn = NULL; -+ for (ifa = ifal; ifa; ifa = ifa->ifa_next) { -+ memset(&ifr, 0, sizeof(ifr)); -+ -+ if (dupn != NULL && strcmp(dupn, ifa->ifa_name) == 0) -+ continue; -+ dupn = ifa->ifa_name; -+ -+ strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name)); -+ ifr.ifr_addr.sa_family = AF_LOCAL; -+ -+ if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0) -+ continue; -+ -+ (void) memset(&ifmr, 0, sizeof(ifmr)); -+ (void) strncpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name)); -+ -+ if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) { -+ close(s); -+ continue; -+ } -+ if (IFM_TYPE(ifmr.ifm_active) != IFM_IEEE80211) { -+ close(s); -+ continue; -+ } -+ -+ (void) memset(&i802r, 0, sizeof(i802r)); -+ (void) strncpy(i802r.i_name, ifa->ifa_name, sizeof(i802r.i_name)); -+ i802r.i_type = IEEE80211_IOC_SCAN_RESULTS; -+ i802r.i_data = iscanbuf; -+ i802r.i_len = sizeof(iscanbuf); -+ if (ioctl(s, SIOCG80211, &i802r) < 0) { -+ close(s); -+ continue; -+ } -+ -+ close(s); -+ -+ vsr = (char *) i802r.i_data; -+ len = i802r.i_len; -+ while (len >= sizeof(struct ieee80211req_scan_result)) { -+ struct ieee80211req_scan_result *isr; -+ char *id; -+ int idlen; -+ char ssid[IEEE80211_NWID_LEN+1]; -+ -+ isr = (struct ieee80211req_scan_result *) vsr; -+ -+ if (isr->isr_meshid_len) { -+ id = vsr + isr->isr_ie_off + isr->isr_ssid_len; -+ idlen = isr->isr_meshid_len; -+ } -+ else { -+ id = vsr + isr->isr_ie_off; -+ idlen = isr->isr_ssid_len; -+ } -+ strncpy(ssid, id, idlen); -+ ssid[idlen] = '\0'; -+ ap = new nsWifiAccessPoint(); -+ ap->setSSID(ssid, strlen(ssid)); -+ ap->setMac(isr->isr_bssid); -+ ap->setSignal(isr->isr_rssi); -+ // apd.radio_signal_strength = (isr->isr_rssi/2) + isr->isr_noise; -+ // apd.signal_to_noise = apd.radio_signal_strength - isr->isr_noise; -+ // apd.channel = frequency_to_channel(isr->isr_freq); -+ LOG(( "FreeBSD access point: " -+ << "SSID: " << apd.ssid << ", " -+ << "MAC: " << apd.mac_address << ", " -+ << "Strength: " << apd.radio_signal_strength << ":" -+ << apd.signal_to_noise << ", " -+ << "Channel: " << apd.channel )); -+ accessPoints.AppendObject(ap); -+ res = true; -+ len -= isr->isr_len; -+ vsr += isr->isr_len; -+ } -+ } ++#include "nsWifiAccessPoint.h" ++ ++using namespace mozilla; ++ ++static nsresult ++FreeBSDGetAccessPointData(nsCOMArray<nsWifiAccessPoint> &accessPoints) ++{ ++ bool res = false; ++ char *dupn = NULL; ++ struct ifaddrs *ifal, *ifa; ++ unsigned len; ++ ++ // get list of interfaces ++ if (getifaddrs(&ifal) < 0) ++ return NS_ERROR_FAILURE; ++ ++ accessPoints.Clear(); ++ ++ // loop through the interfaces ++ for (ifa = ifal; ifa; ifa = ifa->ifa_next) { ++ int s; ++ struct ifreq ifr; ++ struct ifmediareq ifmr; ++ struct ieee80211req i802r; ++ char iscanbuf[32*1024], *vsr; ++ ++ memset(&ifr, 0, sizeof(ifr)); ++ ++ // list can contain duplicates, so ignore those ++ if (dupn != NULL && strcmp(dupn, ifa->ifa_name) == 0) ++ continue; ++ dupn = ifa->ifa_name; ++ ++ // store interface name in socket structure ++ strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name)); ++ ifr.ifr_addr.sa_family = AF_LOCAL; ++ ++ // open socket to interface ++ if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0) ++ continue; ++ ++ // clear interface media structure ++ (void) memset(&ifmr, 0, sizeof(ifmr)); ++ (void) strncpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name)); ++ ++ // get interface media information ++ if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) { ++ close(s); ++ continue; ++ } ++ ++ // check interface is a WiFi interface ++ if (IFM_TYPE(ifmr.ifm_active) != IFM_IEEE80211) { ++ close(s); ++ continue; ++ } ++ ++ // perform WiFi scan ++ (void) memset(&i802r, 0, sizeof(i802r)); ++ (void) strncpy(i802r.i_name, ifa->ifa_name, sizeof(i802r.i_name)); ++ i802r.i_type = IEEE80211_IOC_SCAN_RESULTS; ++ i802r.i_data = iscanbuf; ++ i802r.i_len = sizeof(iscanbuf); ++ if (ioctl(s, SIOCG80211, &i802r) < 0) { ++ close(s); ++ continue; ++ } ++ ++ // close socket ++ close(s); ++ ++ // loop through WiFi networks and build geoloc-lookup structure ++ vsr = (char *) i802r.i_data; ++ len = i802r.i_len; ++ while (len >= sizeof(struct ieee80211req_scan_result)) { ++ struct ieee80211req_scan_result *isr; ++ char *id; ++ int idlen; ++ char ssid[IEEE80211_NWID_LEN+1]; ++ nsWifiAccessPoint *ap; ++ ++ isr = (struct ieee80211req_scan_result *) vsr; ++ ++ // determine size of this entry ++ if (isr->isr_meshid_len) { ++ id = vsr + isr->isr_ie_off + isr->isr_ssid_len; ++ idlen = isr->isr_meshid_len; ++ } ++ else { ++ id = vsr + isr->isr_ie_off; ++ idlen = isr->isr_ssid_len; ++ } ++ ++ // copy network data ++ strncpy(ssid, id, idlen); ++ ssid[idlen] = '\0'; ++ ap = new nsWifiAccessPoint(); ++ ap->setSSID(ssid, strlen(ssid)); ++ ap->setMac(isr->isr_bssid); ++ ap->setSignal(isr->isr_rssi); ++ accessPoints.AppendObject(ap); ++ res = true; ++ ++ // log the data ++ LOG(( "FreeBSD access point: " ++ << "SSID: " << ssid << ", " ++ << "MAC: " << isr->isr_bssid << ", " ++ << "Strength: " << isr->isr_rssi ", " ++ << "Channel: " << isr->isr_freq << "MHz" )); ++ ++ // increment pointers ++ len -= isr->isr_len; ++ vsr += isr->isr_len; ++ } ++ } + -+ freeifaddrs(ifal); ++ freeifaddrs(ifal); + -+ return res ? NS_OK : NS_ERROR_FAILURE; ++ return res ? NS_OK : NS_ERROR_FAILURE; +} + +nsresult +nsWifiMonitor::DoScan() +{ -+ // Regularly get the access point data. ++ // Regularly get the access point data. + -+ nsCOMArray<nsWifiAccessPoint> lastAccessPoints; -+ nsCOMArray<nsWifiAccessPoint> accessPoints; ++ nsCOMArray<nsWifiAccessPoint> lastAccessPoints; ++ nsCOMArray<nsWifiAccessPoint> accessPoints; + -+ do { -+ nsresult rv = FreeBSDGetAccessPointData(accessPoints); -+ if (NS_FAILED(rv)) -+ return rv; ++ do { ++ nsresult rv = FreeBSDGetAccessPointData(accessPoints); ++ if (NS_FAILED(rv)) ++ return rv; + -+ bool accessPointsChanged = !AccessPointsEqual(accessPoints, lastAccessPoints); -+ ReplaceArray(lastAccessPoints, accessPoints); ++ bool accessPointsChanged = !AccessPointsEqual(accessPoints, lastAccessPoints); ++ ReplaceArray(lastAccessPoints, accessPoints); + -+ rv = CallWifiListeners(lastAccessPoints, accessPointsChanged); -+ NS_ENSURE_SUCCESS(rv, rv); ++ rv = CallWifiListeners(lastAccessPoints, accessPointsChanged); ++ NS_ENSURE_SUCCESS(rv, rv); + -+ // wait for some reasonable amount of time. pref? -+ LOG(("waiting on monitor\n")); ++ // wait for some reasonable amount of time. pref? ++ LOG(("waiting on monitor\n")); + -+ ReentrantMonitorAutoEnter mon(mReentrantMonitor); -+ mon.Wait(PR_SecondsToInterval(60)); -+ } -+ while (mKeepGoing); ++ ReentrantMonitorAutoEnter mon(mReentrantMonitor); ++ mon.Wait(PR_SecondsToInterval(60)); ++ } ++ while (mKeepGoing); + -+ return NS_OK; ++ return NS_OK; +} Modified: trunk/www/firefox/files/patch-bug893397 ============================================================================== --- trunk/www/firefox/files/patch-bug893397 Tue Jul 30 09:32:51 2013 (r1294) +++ trunk/www/firefox/files/patch-bug893397 Tue Jul 30 09:32:58 2013 (r1295) @@ -31,191 +31,175 @@ index 0000000..80d4cb6 --- /dev/null +++ netwerk/wifi/nsWifiScannerFreeBSD.cpp -@@ -0,0 +1,187 @@ +@@ -0,0 +1,171 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + -+// Developed by J.R. Oldroyd <fbsd@opal.com> and offered to the FreeBSD -+// www/chromium and www/firefox ports under the terms of each browser's -+// license. ++// Developed by J.R. Oldroyd <fbsd@opal.com>, December 2012. + +// For FreeBSD we use the getifaddrs(3) to obtain the list of interfaces +// and then check for those with an 802.11 media type and able to return -+// a list of stations. This is similar to ifconfig(8). ++// a list of stations. This is similar to ifconfig(8). + -+#include "nsCOMPtr.h" -+#include "nsComponentManagerUtils.h" -+#include "nsServiceManagerUtils.h" -+#include "nsThreadUtils.h" -+#include "nsXPCOM.h" -+#include "nsXPCOMCID.h" -+#include "nsIObserver.h" -+#include "nsIObserverService.h" -+#include "nsWifiMonitor.h" -+#include "nsWifiAccessPoint.h" -+ -+#include "nsServiceManagerUtils.h" -+#include "nsComponentManagerUtils.h" -+#include "mozilla/Services.h" -+ -+using namespace mozilla; -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include <unistd.h> +#include <sys/types.h> ++#include <sys/ioctl.h> +#include <sys/socket.h> -+#include <sys/sockio.h> +#include <net/if.h> +#include <net/if_media.h> -+#include <ifaddrs.h> +#include <net80211/ieee80211_ioctl.h> -+#include <net/ethernet.h> + -+// Convert a wifi frequency to the corresponding channel. -+// Taken from wifi_data_provider_linux.cc where it says this was -+// adapted from geolocaiton/wifilib.cc in googleclient (internal to google). -+int frequency_to_channel(int frequency_Mhz) { -+ if (frequency_Mhz >= 2412 && frequency_Mhz <= 2472) // Channels 1-13. -+ return (frequency_Mhz - 2407) / 5; -+ if (frequency_Mhz == 2484) -+ return 14; -+ if (frequency_Mhz > 5000 && frequency_Mhz < 6000) // .11a bands. -+ return (frequency_Mhz - 5000) / 5; -+ // Ignore everything else. -+ return -1; // invalid channel -+} ++#include <ifaddrs.h> ++#include <string.h> ++#include <unistd.h> + -+nsresult -+FreeBSDGetAccessPointData(nsCOMArray<nsWifiAccessPoint> &accessPoints) { -+ bool res; -+ char *dupn; -+ struct ifaddrs *ifal, *ifa; -+ struct ifreq ifr; -+ struct ifmediareq ifmr; -+ struct ieee80211req i802r; -+ int s; -+ char iscanbuf[32*1024], *vsr; -+ unsigned len; -+ nsWifiAccessPoint *ap; -+ -+ if (getifaddrs(&ifal) < 0) -+ return NS_ERROR_FAILURE; -+ -+ accessPoints.Clear(); -+ -+ res = false; -+ dupn = NULL; -+ for (ifa = ifal; ifa; ifa = ifa->ifa_next) { -+ memset(&ifr, 0, sizeof(ifr)); -+ -+ if (dupn != NULL && strcmp(dupn, ifa->ifa_name) == 0) -+ continue; -+ dupn = ifa->ifa_name; -+ -+ strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name)); -+ ifr.ifr_addr.sa_family = AF_LOCAL; -+ -+ if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0) -+ continue; -+ -+ (void) memset(&ifmr, 0, sizeof(ifmr)); -+ (void) strncpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name)); -+ -+ if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) { -+ close(s); -+ continue; -+ } -+ if (IFM_TYPE(ifmr.ifm_active) != IFM_IEEE80211) { -+ close(s); -+ continue; -+ } -+ -+ (void) memset(&i802r, 0, sizeof(i802r)); -+ (void) strncpy(i802r.i_name, ifa->ifa_name, sizeof(i802r.i_name)); -+ i802r.i_type = IEEE80211_IOC_SCAN_RESULTS; -+ i802r.i_data = iscanbuf; -+ i802r.i_len = sizeof(iscanbuf); -+ if (ioctl(s, SIOCG80211, &i802r) < 0) { -+ close(s); -+ continue; -+ } -+ -+ close(s); -+ -+ vsr = (char *) i802r.i_data; -+ len = i802r.i_len; -+ while (len >= sizeof(struct ieee80211req_scan_result)) { -+ struct ieee80211req_scan_result *isr; -+ char *id; -+ int idlen; -+ char ssid[IEEE80211_NWID_LEN+1]; -+ -+ isr = (struct ieee80211req_scan_result *) vsr; -+ -+ if (isr->isr_meshid_len) { -+ id = vsr + isr->isr_ie_off + isr->isr_ssid_len; -+ idlen = isr->isr_meshid_len; -+ } -+ else { -+ id = vsr + isr->isr_ie_off; -+ idlen = isr->isr_ssid_len; -+ } -+ strncpy(ssid, id, idlen); -+ ssid[idlen] = '\0'; -+ ap = new nsWifiAccessPoint(); -+ ap->setSSID(ssid, strlen(ssid)); -+ ap->setMac(isr->isr_bssid); -+ ap->setSignal(isr->isr_rssi); -+ // apd.radio_signal_strength = (isr->isr_rssi/2) + isr->isr_noise; -+ // apd.signal_to_noise = apd.radio_signal_strength - isr->isr_noise; -+ // apd.channel = frequency_to_channel(isr->isr_freq); -+ LOG(( "FreeBSD access point: " -+ << "SSID: " << apd.ssid << ", " -+ << "MAC: " << apd.mac_address << ", " -+ << "Strength: " << apd.radio_signal_strength << ":" -+ << apd.signal_to_noise << ", " -+ << "Channel: " << apd.channel )); -+ accessPoints.AppendObject(ap); -+ res = true; -+ len -= isr->isr_len; -+ vsr += isr->isr_len; -+ } -+ } ++#include "nsWifiAccessPoint.h" ++ ++using namespace mozilla; ++ ++static nsresult ++FreeBSDGetAccessPointData(nsCOMArray<nsWifiAccessPoint> &accessPoints) ++{ ++ bool res = false; ++ char *dupn = NULL; ++ struct ifaddrs *ifal, *ifa; ++ unsigned len; ++ ++ // get list of interfaces ++ if (getifaddrs(&ifal) < 0) ++ return NS_ERROR_FAILURE; ++ ++ accessPoints.Clear(); ++ ++ // loop through the interfaces ++ for (ifa = ifal; ifa; ifa = ifa->ifa_next) { ++ int s; ++ struct ifreq ifr; ++ struct ifmediareq ifmr; ++ struct ieee80211req i802r; ++ char iscanbuf[32*1024], *vsr; ++ ++ memset(&ifr, 0, sizeof(ifr)); ++ ++ // list can contain duplicates, so ignore those ++ if (dupn != NULL && strcmp(dupn, ifa->ifa_name) == 0) ++ continue; ++ dupn = ifa->ifa_name; ++ ++ // store interface name in socket structure ++ strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name)); ++ ifr.ifr_addr.sa_family = AF_LOCAL; ++ ++ // open socket to interface ++ if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0) ++ continue; ++ ++ // clear interface media structure ++ (void) memset(&ifmr, 0, sizeof(ifmr)); ++ (void) strncpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name)); ++ ++ // get interface media information ++ if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) { ++ close(s); ++ continue; ++ } ++ ++ // check interface is a WiFi interface ++ if (IFM_TYPE(ifmr.ifm_active) != IFM_IEEE80211) { ++ close(s); ++ continue; ++ } ++ ++ // perform WiFi scan ++ (void) memset(&i802r, 0, sizeof(i802r)); ++ (void) strncpy(i802r.i_name, ifa->ifa_name, sizeof(i802r.i_name)); ++ i802r.i_type = IEEE80211_IOC_SCAN_RESULTS; ++ i802r.i_data = iscanbuf; ++ i802r.i_len = sizeof(iscanbuf); ++ if (ioctl(s, SIOCG80211, &i802r) < 0) { ++ close(s); ++ continue; ++ } ++ ++ // close socket ++ close(s); ++ ++ // loop through WiFi networks and build geoloc-lookup structure ++ vsr = (char *) i802r.i_data; ++ len = i802r.i_len; ++ while (len >= sizeof(struct ieee80211req_scan_result)) { ++ struct ieee80211req_scan_result *isr; ++ char *id; ++ int idlen; ++ char ssid[IEEE80211_NWID_LEN+1]; ++ nsWifiAccessPoint *ap; ++ ++ isr = (struct ieee80211req_scan_result *) vsr; ++ ++ // determine size of this entry ++ if (isr->isr_meshid_len) { ++ id = vsr + isr->isr_ie_off + isr->isr_ssid_len; ++ idlen = isr->isr_meshid_len; ++ } ++ else { ++ id = vsr + isr->isr_ie_off; ++ idlen = isr->isr_ssid_len; ++ } ++ ++ // copy network data ++ strncpy(ssid, id, idlen); ++ ssid[idlen] = '\0'; ++ ap = new nsWifiAccessPoint(); ++ ap->setSSID(ssid, strlen(ssid)); ++ ap->setMac(isr->isr_bssid); ++ ap->setSignal(isr->isr_rssi); ++ accessPoints.AppendObject(ap); ++ res = true; ++ ++ // log the data ++ LOG(( "FreeBSD access point: " ++ << "SSID: " << ssid << ", " ++ << "MAC: " << isr->isr_bssid << ", " ++ << "Strength: " << isr->isr_rssi ", " ++ << "Channel: " << isr->isr_freq << "MHz" )); ++ ++ // increment pointers ++ len -= isr->isr_len; ++ vsr += isr->isr_len; ++ } ++ } + -+ freeifaddrs(ifal); ++ freeifaddrs(ifal); + -+ return res ? NS_OK : NS_ERROR_FAILURE; ++ return res ? NS_OK : NS_ERROR_FAILURE; +} + +nsresult +nsWifiMonitor::DoScan() +{ -+ // Regularly get the access point data. ++ // Regularly get the access point data. + -+ nsCOMArray<nsWifiAccessPoint> lastAccessPoints; -+ nsCOMArray<nsWifiAccessPoint> accessPoints; ++ nsCOMArray<nsWifiAccessPoint> lastAccessPoints; ++ nsCOMArray<nsWifiAccessPoint> accessPoints; + -+ do { -+ nsresult rv = FreeBSDGetAccessPointData(accessPoints); -+ if (NS_FAILED(rv)) -+ return rv; ++ do { ++ nsresult rv = FreeBSDGetAccessPointData(accessPoints); ++ if (NS_FAILED(rv)) ++ return rv; + -+ bool accessPointsChanged = !AccessPointsEqual(accessPoints, lastAccessPoints); -+ ReplaceArray(lastAccessPoints, accessPoints); ++ bool accessPointsChanged = !AccessPointsEqual(accessPoints, lastAccessPoints); ++ ReplaceArray(lastAccessPoints, accessPoints); + -+ rv = CallWifiListeners(lastAccessPoints, accessPointsChanged); -+ NS_ENSURE_SUCCESS(rv, rv); ++ rv = CallWifiListeners(lastAccessPoints, accessPointsChanged); ++ NS_ENSURE_SUCCESS(rv, rv); + -+ // wait for some reasonable amount of time. pref? -+ LOG(("waiting on monitor\n")); ++ // wait for some reasonable amount of time. pref? ++ LOG(("waiting on monitor\n")); + -+ ReentrantMonitorAutoEnter mon(mReentrantMonitor); -+ mon.Wait(PR_SecondsToInterval(60)); -+ } -+ while (mKeepGoing); ++ ReentrantMonitorAutoEnter mon(mReentrantMonitor); ++ mon.Wait(PR_SecondsToInterval(60)); ++ } ++ while (mKeepGoing); + -+ return NS_OK; ++ return NS_OK; +} Modified: trunk/www/seamonkey/files/patch-bug893397 ============================================================================== --- trunk/www/seamonkey/files/patch-bug893397 Tue Jul 30 09:32:51 2013 (r1294) +++ trunk/www/seamonkey/files/patch-bug893397 Tue Jul 30 09:32:58 2013 (r1295) @@ -44,191 +44,175 @@ index 0000000..80d4cb6 --- /dev/null +++ mozilla/netwerk/wifi/nsWifiScannerFreeBSD.cpp -@@ -0,0 +1,187 @@ +@@ -0,0 +1,171 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + -+// Developed by J.R. Oldroyd <fbsd@opal.com> and offered to the FreeBSD -+// www/chromium and www/firefox ports under the terms of each browser's -+// license. ++// Developed by J.R. Oldroyd <fbsd@opal.com>, December 2012. + +// For FreeBSD we use the getifaddrs(3) to obtain the list of interfaces +// and then check for those with an 802.11 media type and able to return -+// a list of stations. This is similar to ifconfig(8). ++// a list of stations. This is similar to ifconfig(8). + -+#include "nsCOMPtr.h" -+#include "nsComponentManagerUtils.h" -+#include "nsServiceManagerUtils.h" -+#include "nsThreadUtils.h" -+#include "nsXPCOM.h" -+#include "nsXPCOMCID.h" -+#include "nsIObserver.h" -+#include "nsIObserverService.h" -+#include "nsWifiMonitor.h" -+#include "nsWifiAccessPoint.h" -+ -+#include "nsServiceManagerUtils.h" -+#include "nsComponentManagerUtils.h" -+#include "mozilla/Services.h" -+ -+using namespace mozilla; -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include <unistd.h> +#include <sys/types.h> ++#include <sys/ioctl.h> +#include <sys/socket.h> -+#include <sys/sockio.h> +#include <net/if.h> +#include <net/if_media.h> -+#include <ifaddrs.h> +#include <net80211/ieee80211_ioctl.h> -+#include <net/ethernet.h> + -+// Convert a wifi frequency to the corresponding channel. -+// Taken from wifi_data_provider_linux.cc where it says this was -+// adapted from geolocaiton/wifilib.cc in googleclient (internal to google). -+int frequency_to_channel(int frequency_Mhz) { -+ if (frequency_Mhz >= 2412 && frequency_Mhz <= 2472) // Channels 1-13. -+ return (frequency_Mhz - 2407) / 5; -+ if (frequency_Mhz == 2484) -+ return 14; -+ if (frequency_Mhz > 5000 && frequency_Mhz < 6000) // .11a bands. -+ return (frequency_Mhz - 5000) / 5; -+ // Ignore everything else. -+ return -1; // invalid channel -+} ++#include <ifaddrs.h> ++#include <string.h> ++#include <unistd.h> + -+nsresult -+FreeBSDGetAccessPointData(nsCOMArray<nsWifiAccessPoint> &accessPoints) { -+ bool res; -+ char *dupn; -+ struct ifaddrs *ifal, *ifa; -+ struct ifreq ifr; -+ struct ifmediareq ifmr; -+ struct ieee80211req i802r; -+ int s; -+ char iscanbuf[32*1024], *vsr; -+ unsigned len; -+ nsWifiAccessPoint *ap; -+ -+ if (getifaddrs(&ifal) < 0) -+ return NS_ERROR_FAILURE; -+ -+ accessPoints.Clear(); -+ -+ res = false; -+ dupn = NULL; -+ for (ifa = ifal; ifa; ifa = ifa->ifa_next) { -+ memset(&ifr, 0, sizeof(ifr)); -+ -+ if (dupn != NULL && strcmp(dupn, ifa->ifa_name) == 0) -+ continue; -+ dupn = ifa->ifa_name; -+ -+ strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name)); -+ ifr.ifr_addr.sa_family = AF_LOCAL; -+ -+ if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0) -+ continue; -+ -+ (void) memset(&ifmr, 0, sizeof(ifmr)); -+ (void) strncpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name)); -+ -+ if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) { -+ close(s); -+ continue; -+ } -+ if (IFM_TYPE(ifmr.ifm_active) != IFM_IEEE80211) { -+ close(s); -+ continue; -+ } -+ -+ (void) memset(&i802r, 0, sizeof(i802r)); -+ (void) strncpy(i802r.i_name, ifa->ifa_name, sizeof(i802r.i_name)); -+ i802r.i_type = IEEE80211_IOC_SCAN_RESULTS; -+ i802r.i_data = iscanbuf; -+ i802r.i_len = sizeof(iscanbuf); -+ if (ioctl(s, SIOCG80211, &i802r) < 0) { -+ close(s); -+ continue; -+ } -+ -+ close(s); -+ -+ vsr = (char *) i802r.i_data; -+ len = i802r.i_len; -+ while (len >= sizeof(struct ieee80211req_scan_result)) { -+ struct ieee80211req_scan_result *isr; -+ char *id; -+ int idlen; -+ char ssid[IEEE80211_NWID_LEN+1]; -+ -+ isr = (struct ieee80211req_scan_result *) vsr; -+ -+ if (isr->isr_meshid_len) { -+ id = vsr + isr->isr_ie_off + isr->isr_ssid_len; -+ idlen = isr->isr_meshid_len; -+ } -+ else { -+ id = vsr + isr->isr_ie_off; -+ idlen = isr->isr_ssid_len; -+ } -+ strncpy(ssid, id, idlen); -+ ssid[idlen] = '\0'; -+ ap = new nsWifiAccessPoint(); -+ ap->setSSID(ssid, strlen(ssid)); -+ ap->setMac(isr->isr_bssid); -+ ap->setSignal(isr->isr_rssi); -+ // apd.radio_signal_strength = (isr->isr_rssi/2) + isr->isr_noise; -+ // apd.signal_to_noise = apd.radio_signal_strength - isr->isr_noise; -+ // apd.channel = frequency_to_channel(isr->isr_freq); -+ LOG(( "FreeBSD access point: " -+ << "SSID: " << apd.ssid << ", " -+ << "MAC: " << apd.mac_address << ", " -+ << "Strength: " << apd.radio_signal_strength << ":" -+ << apd.signal_to_noise << ", " -+ << "Channel: " << apd.channel )); -+ accessPoints.AppendObject(ap); -+ res = true; -+ len -= isr->isr_len; -+ vsr += isr->isr_len; -+ } -+ } ++#include "nsWifiAccessPoint.h" ++ ++using namespace mozilla; ++ ++static nsresult ++FreeBSDGetAccessPointData(nsCOMArray<nsWifiAccessPoint> &accessPoints) ++{ ++ bool res = false; ++ char *dupn = NULL; ++ struct ifaddrs *ifal, *ifa; ++ unsigned len; ++ ++ // get list of interfaces ++ if (getifaddrs(&ifal) < 0) ++ return NS_ERROR_FAILURE; ++ ++ accessPoints.Clear(); ++ ++ // loop through the interfaces ++ for (ifa = ifal; ifa; ifa = ifa->ifa_next) { ++ int s; ++ struct ifreq ifr; ++ struct ifmediareq ifmr; ++ struct ieee80211req i802r; ++ char iscanbuf[32*1024], *vsr; ++ ++ memset(&ifr, 0, sizeof(ifr)); ++ ++ // list can contain duplicates, so ignore those ++ if (dupn != NULL && strcmp(dupn, ifa->ifa_name) == 0) ++ continue; ++ dupn = ifa->ifa_name; ++ ++ // store interface name in socket structure ++ strncpy(ifr.ifr_name, ifa->ifa_name, sizeof(ifr.ifr_name)); ++ ifr.ifr_addr.sa_family = AF_LOCAL; ++ ++ // open socket to interface ++ if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0) ++ continue; ++ ++ // clear interface media structure ++ (void) memset(&ifmr, 0, sizeof(ifmr)); ++ (void) strncpy(ifmr.ifm_name, ifa->ifa_name, sizeof(ifmr.ifm_name)); ++ ++ // get interface media information ++ if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0) { ++ close(s); ++ continue; ++ } ++ ++ // check interface is a WiFi interface ++ if (IFM_TYPE(ifmr.ifm_active) != IFM_IEEE80211) { ++ close(s); ++ continue; ++ } ++ ++ // perform WiFi scan ++ (void) memset(&i802r, 0, sizeof(i802r)); ++ (void) strncpy(i802r.i_name, ifa->ifa_name, sizeof(i802r.i_name)); ++ i802r.i_type = IEEE80211_IOC_SCAN_RESULTS; ++ i802r.i_data = iscanbuf; ++ i802r.i_len = sizeof(iscanbuf); ++ if (ioctl(s, SIOCG80211, &i802r) < 0) { ++ close(s); ++ continue; ++ } ++ ++ // close socket ++ close(s); ++ ++ // loop through WiFi networks and build geoloc-lookup structure ++ vsr = (char *) i802r.i_data; ++ len = i802r.i_len; ++ while (len >= sizeof(struct ieee80211req_scan_result)) { ++ struct ieee80211req_scan_result *isr; ++ char *id; ++ int idlen; ++ char ssid[IEEE80211_NWID_LEN+1]; ++ nsWifiAccessPoint *ap; ++ ++ isr = (struct ieee80211req_scan_result *) vsr; ++ ++ // determine size of this entry ++ if (isr->isr_meshid_len) { ++ id = vsr + isr->isr_ie_off + isr->isr_ssid_len; ++ idlen = isr->isr_meshid_len; ++ } ++ else { ++ id = vsr + isr->isr_ie_off; ++ idlen = isr->isr_ssid_len; ++ } ++ ++ // copy network data ++ strncpy(ssid, id, idlen); ++ ssid[idlen] = '\0'; ++ ap = new nsWifiAccessPoint(); ++ ap->setSSID(ssid, strlen(ssid)); ++ ap->setMac(isr->isr_bssid); ++ ap->setSignal(isr->isr_rssi); ++ accessPoints.AppendObject(ap); ++ res = true; ++ ++ // log the data ++ LOG(( "FreeBSD access point: " ++ << "SSID: " << ssid << ", " ++ << "MAC: " << isr->isr_bssid << ", " ++ << "Strength: " << isr->isr_rssi ", " ++ << "Channel: " << isr->isr_freq << "MHz" )); ++ ++ // increment pointers ++ len -= isr->isr_len; ++ vsr += isr->isr_len; ++ } ++ } + -+ freeifaddrs(ifal); ++ freeifaddrs(ifal); + -+ return res ? NS_OK : NS_ERROR_FAILURE; ++ return res ? NS_OK : NS_ERROR_FAILURE; +} + +nsresult +nsWifiMonitor::DoScan() +{ -+ // Regularly get the access point data. ++ // Regularly get the access point data. + -+ nsCOMArray<nsWifiAccessPoint> lastAccessPoints; -+ nsCOMArray<nsWifiAccessPoint> accessPoints; ++ nsCOMArray<nsWifiAccessPoint> lastAccessPoints; ++ nsCOMArray<nsWifiAccessPoint> accessPoints; + -+ do { -+ nsresult rv = FreeBSDGetAccessPointData(accessPoints); -+ if (NS_FAILED(rv)) -+ return rv; ++ do { ++ nsresult rv = FreeBSDGetAccessPointData(accessPoints); ++ if (NS_FAILED(rv)) ++ return rv; + -+ bool accessPointsChanged = !AccessPointsEqual(accessPoints, lastAccessPoints); -+ ReplaceArray(lastAccessPoints, accessPoints); ++ bool accessPointsChanged = !AccessPointsEqual(accessPoints, lastAccessPoints); ++ ReplaceArray(lastAccessPoints, accessPoints); + -+ rv = CallWifiListeners(lastAccessPoints, accessPointsChanged); -+ NS_ENSURE_SUCCESS(rv, rv); ++ rv = CallWifiListeners(lastAccessPoints, accessPointsChanged); ++ NS_ENSURE_SUCCESS(rv, rv); + -+ // wait for some reasonable amount of time. pref? -+ LOG(("waiting on monitor\n")); ++ // wait for some reasonable amount of time. pref? ++ LOG(("waiting on monitor\n")); + -+ ReentrantMonitorAutoEnter mon(mReentrantMonitor); -+ mon.Wait(PR_SecondsToInterval(60)); -+ } -+ while (mKeepGoing); ++ ReentrantMonitorAutoEnter mon(mReentrantMonitor); ++ mon.Wait(PR_SecondsToInterval(60)); ++ } ++ while (mKeepGoing); + -+ return NS_OK; ++ return NS_OK; +}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307300932.r6U9Wxj0097921>