123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* 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/. */
- #if defined(XP_MACOSX) || defined(XP_LINUX)
- #include <unistd.h>
- #elif defined(XP_WIN)
- #include <winsock2.h>
- #endif
- #include "nsNetworkInfoService.h"
- #include "mozilla/ScopeExit.h"
- #if defined(XP_MACOSX) || defined(XP_WIN) || defined(XP_LINUX)
- #include "NetworkInfoServiceImpl.h"
- #else
- #error "Unsupported platform for nsNetworkInfoService! Check moz.build"
- #endif
- namespace mozilla {
- namespace net {
- NS_IMPL_ISUPPORTS(nsNetworkInfoService,
- nsINetworkInfoService)
- nsNetworkInfoService::nsNetworkInfoService()
- {
- }
- nsresult
- nsNetworkInfoService::Init()
- {
- return NS_OK;
- }
- nsresult
- nsNetworkInfoService::ListNetworkAddresses(nsIListNetworkAddressesListener* aListener)
- {
- nsresult rv;
- AddrMapType addrMap;
- rv = DoListAddresses(addrMap);
- if (NS_WARN_IF(NS_FAILED(rv))) {
- aListener->OnListNetworkAddressesFailed();
- return NS_OK;
- }
- uint32_t addrCount = addrMap.Count();
- const char** addrStrings = (const char**) malloc(sizeof(*addrStrings) * addrCount);
- if (!addrStrings) {
- aListener->OnListNetworkAddressesFailed();
- return NS_OK;
- }
- auto autoFreeAddrStrings = MakeScopeExit([&] {
- free(addrStrings);
- });
- uint32_t idx = 0;
- for (auto iter = addrMap.Iter(); !iter.Done(); iter.Next()) {
- addrStrings[idx++] = iter.Data().get();
- }
- aListener->OnListedNetworkAddresses(addrStrings, addrCount);
- return NS_OK;
- }
- // TODO: Bug 1275373: https://bugzilla.mozilla.org/show_bug.cgi?id=1275373
- // Use platform-specific implementation of DoGetHostname on Cocoa and Windows.
- static nsresult
- DoGetHostname(nsACString& aHostname)
- {
- char hostnameBuf[256];
- int result = gethostname(hostnameBuf, 256);
- if (result == -1) {
- return NS_ERROR_FAILURE;
- }
- // Ensure that there is always a terminating NUL byte.
- hostnameBuf[255] = '\0';
- // Find the first '.', terminate string there.
- char* dotLocation = strchr(hostnameBuf, '.');
- if (dotLocation) {
- *dotLocation = '\0';
- }
- if (strlen(hostnameBuf) == 0) {
- return NS_ERROR_FAILURE;
- }
- aHostname.AssignASCII(hostnameBuf);
- return NS_OK;
- }
- nsresult
- nsNetworkInfoService::GetHostname(nsIGetHostnameListener* aListener)
- {
- nsresult rv;
- nsCString hostnameStr;
- rv = DoGetHostname(hostnameStr);
- if (NS_FAILED(rv)) {
- aListener->OnGetHostnameFailed();
- return NS_OK;
- }
- aListener->OnGotHostname(hostnameStr);
- return NS_OK;
- }
- } // namespace net
- } // namespace mozilla
|