Changeset 67725 in vbox for trunk/src/VBox/Main/src-server/win/NetIf-win.cpp
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo
-
old new 7 7 /branches/VBox-4.3/trunk:91223 8 8 /branches/VBox-5.0:104445,104938,104943,104950,104952-104953,104987-104988,104990,106453 9 /branches/VBox-5.1:112367,115992 9 /branches/VBox-5.1:112367,115992,116543,116550,116568,116573 10 10 /branches/andy/draganddrop:90781-91268 11 11 /branches/andy/guestctrl20:78916,78930
-
- Property svn:mergeinfo
-
trunk/src/VBox
- Property svn:mergeinfo
-
old new 7 7 /branches/VBox-4.3/trunk/src/VBox:91223 8 8 /branches/VBox-5.0/src/VBox:104938,104943,104950,104987-104988,104990,106453 9 /branches/VBox-5.1/src/VBox:112367 9 /branches/VBox-5.1/src/VBox:112367,116543,116550,116568,116573 10 10 /branches/andy/draganddrop/src/VBox:90781-91268 11 11 /branches/andy/guestctrl20/src/VBox:78916,78930
-
- Property svn:mergeinfo
-
trunk/src/VBox/Main/src-server/win/NetIf-win.cpp
r67431 r67725 170 170 } 171 171 else 172 Log (("collectNetIfInfo:Unexpected IPv4 prefix length of %d\n",173 pPrefix->PrefixLength));172 LogFunc(("Unexpected IPv4 prefix length of %d\n", 173 pPrefix->PrefixLength)); 174 174 } 175 175 break; … … 183 183 } 184 184 else 185 Log (("collectNetIfInfo:Unexpected IPv6 prefix length of %d\n",186 pPrefix->PrefixLength));185 LogFunc(("Unexpected IPv6 prefix length of %d\n", 186 pPrefix->PrefixLength)); 187 187 } 188 188 break; … … 190 190 } 191 191 if (sizeof(pInfo->MACAddress) != pAdapter->PhysicalAddressLength) 192 Log (("collectNetIfInfo:Unexpected physical address length: %u\n", pAdapter->PhysicalAddressLength));192 LogFunc(("Unexpected physical address length: %u\n", pAdapter->PhysicalAddressLength)); 193 193 else 194 194 memcpy(pInfo->MACAddress.au8, pAdapter->PhysicalAddress, sizeof(pInfo->MACAddress)); … … 986 986 rc = collectNetIfInfo(name, guidIfCopy, &Info, iDefaultInterface); 987 987 if (RT_FAILURE(rc)) 988 LogRel (("vboxNetWinAddComponent:collectNetIfInfo() -> %Rrc\n", rc));989 Log (("vboxNetWinAddComponent:adding %ls\n", lpszName));988 LogRelFunc(("collectNetIfInfo() -> %Rrc\n", rc)); 989 LogFunc(("adding %ls\n", lpszName)); 990 990 /* create a new object and add it to the list */ 991 991 ComObjPtr<HostNetworkInterface> iface; … … 1002 1002 else 1003 1003 { 1004 LogRel (("vboxNetWinAddComponent:HostNetworkInterface::init() -> %Rrc\n", rc));1005 Assert (0);1004 LogRelFunc(("HostNetworkInterface::init() -> %Rrc\n", rc)); 1005 AssertComRC(rc); 1006 1006 } 1007 1007 } 1008 1008 else 1009 LogRel (("vboxNetWinAddComponent:failed to get device instance GUID (0x%x)\n", hr));1009 LogRelFunc(("failed to get device instance GUID (0x%x)\n", hr)); 1010 1010 CoTaskMemFree(lpszName); 1011 1011 } 1012 1012 else 1013 LogRel (("vboxNetWinAddComponent:failed to get device display name (0x%x)\n", hr));1013 LogRelFunc(("failed to get device display name (0x%x)\n", hr)); 1014 1014 1015 1015 return rc; … … 1038 1038 hr = pMpNcc->GetDisplayName(&pwszName); 1039 1039 if (hr == S_OK) 1040 Log (("netIfListHostAdapters:%ls\n", pwszName));1040 LogFunc(("%ls\n", pwszName)); 1041 1041 else 1042 LogRel (("netIfListHostAdapters:failed to get device display name (0x%x)\n", hr));1042 LogRelFunc(("failed to get device display name (0x%x)\n", hr)); 1043 1043 hr = pMpNcc->GetDeviceStatus(&uComponentStatus); 1044 1044 if (hr == S_OK) … … 1051 1051 if (hr == S_OK) 1052 1052 { 1053 Log (("netIfListHostAdapters:id = %ls\n", pId));1053 LogFunc(("id = %ls\n", pId)); 1054 1054 if (!_wcsnicmp(pId, L"sun_VBoxNetAdp", sizeof(L"sun_VBoxNetAdp")/2)) 1055 1055 { … … 1059 1059 } 1060 1060 else 1061 LogRel (("netIfListHostAdapters:failed to get device id (0x%x)\n", hr));1061 LogRelFunc(("failed to get device id (0x%x)\n", hr)); 1062 1062 } 1063 1063 } 1064 1064 else 1065 LogRel (("netIfListHostAdapters:failed to get device status (0x%x)\n", hr));1065 LogRelFunc(("failed to get device status (0x%x)\n", hr)); 1066 1066 pMpNcc->Release(); 1067 1067 } … … 1071 1071 } 1072 1072 else 1073 LogRel (("netIfListHostAdapters:EnumComponents error (0x%x)\n", hr));1073 LogRelFunc(("EnumComponents error (0x%x)\n", hr)); 1074 1074 #endif /* # if defined VBOX_WITH_NETFLT */ 1075 1075 return VINF_SUCCESS; … … 1452 1452 1453 1453 1454 #define netIfLog Log 1454 #define netIfLog LogFunc 1455 1455 1456 1456 struct BoundAdapter … … 1469 1469 1470 1470 if ((hr = pNetCfg->EnumComponents(&GUID_DEVCLASS_NET, &pEnumComponent)) != S_OK) 1471 LogRel (("netIfGetUnboundHostOnlyAdapters:failed to enumerate network adapter components (0x%x)\n", hr));1471 LogRelFunc(("failed to enumerate network adapter components (0x%x)\n", hr)); 1472 1472 else 1473 1473 { … … 1479 1479 memset(&adapter, 0, sizeof(adapter)); 1480 1480 if ((hr = pMiniport->GetDisplayName(&adapter.pName)) != S_OK) 1481 LogRel (("netIfGetUnboundHostOnlyAdapters:failed to get device display name (0x%x)\n", hr));1481 LogRelFunc(("failed to get device display name (0x%x)\n", hr)); 1482 1482 else if ((hr = pMiniport->GetDeviceStatus(&uComponentStatus)) != S_OK) 1483 netIfLog((" netIfGetUnboundHostOnlyAdapters:failed to get device status (0x%x)\n", hr));1483 netIfLog(("failed to get device status (0x%x)\n", hr)); 1484 1484 else if (uComponentStatus != 0) 1485 netIfLog((" netIfGetUnboundHostOnlyAdapters:wrong device status (0x%x)\n", uComponentStatus));1485 netIfLog(("wrong device status (0x%x)\n", uComponentStatus)); 1486 1486 else if ((hr = pMiniport->GetId(&adapter.pHwId)) != S_OK) 1487 LogRel (("netIfGetUnboundHostOnlyAdapters:failed to get device id (0x%x)\n", hr));1487 LogRelFunc(("failed to get device id (0x%x)\n", hr)); 1488 1488 else if (_wcsnicmp(adapter.pHwId, L"sun_VBoxNetAdp", sizeof(L"sun_VBoxNetAdp")/2)) 1489 netIfLog(("n etIfGetUnboundHostOnlyAdapters: not host-only id = %ls, ignored\n", adapter.pHwId));1489 netIfLog(("not host-only id = %ls, ignored\n", adapter.pHwId)); 1490 1490 else if ((hr = pMiniport->GetInstanceGuid(&guid)) != S_OK) 1491 LogRel (("netIfGetUnboundHostOnlyAdapters:failed to get instance id (0x%x)\n", hr));1491 LogRelFunc(("failed to get instance id (0x%x)\n", hr)); 1492 1492 else 1493 1493 { 1494 1494 adapter.guid = *(Guid(guid).raw()); 1495 netIfLog((" netIfGetUnboundHostOnlyAdapters:guid=%RTuuid, name=%ls id = %ls\n", &adapter.guid, adapter.pName, adapter.pHwId));1495 netIfLog(("guid=%RTuuid, name=%ls id = %ls\n", &adapter.guid, adapter.pName, adapter.pHwId)); 1496 1496 adapters.push_back(adapter); 1497 1497 adapter.pName = adapter.pHwId = NULL; /* do not free, will be done later */ … … 1507 1507 pEnumComponent->Release(); 1508 1508 } 1509 netIfLog((" netIfGetUnboundHostOnlyAdapters:return\n"));1509 netIfLog(("return\n")); 1510 1510 return VINF_SUCCESS; 1511 1511 } … … 1518 1518 HRESULT hr; 1519 1519 1520 netIfLog((" netIfGetBoundAdapters:building the list of interfaces\n"));1520 netIfLog(("building the list of interfaces\n")); 1521 1521 /* we are using the INetCfg API for getting the list of miniports */ 1522 1522 hr = VBoxNetCfgWinQueryINetCfg(&pNetCfg, FALSE, … … 1527 1527 if (hr != S_OK) 1528 1528 { 1529 LogRel (("netIfGetBoundAdapters:failed to query INetCfg (0x%x)\n", hr));1529 LogRelFunc(("failed to query INetCfg (0x%x)\n", hr)); 1530 1530 return hr; 1531 1531 } … … 1534 1534 /* fall back to NDIS5 miniport lookup */ 1535 1535 && (hr = pNetCfg->FindComponent(L"sun_VBoxNetFlt", &pFilter))) 1536 LogRel (("netIfGetBoundAdapters:could not find either 'oracle_VBoxNetLwf' or 'sun_VBoxNetFlt' components (0x%x)\n", hr));1536 LogRelFunc(("could not find either 'oracle_VBoxNetLwf' or 'sun_VBoxNetFlt' components (0x%x)\n", hr)); 1537 1537 else 1538 1538 { 1539 1539 INetCfgComponentBindings *pFilterBindings; 1540 1540 if ((pFilter->QueryInterface(IID_INetCfgComponentBindings, (PVOID*)&pFilterBindings)) != S_OK) 1541 LogRel (("netIfGetBoundAdapters:failed to query INetCfgComponentBindings (0x%x)\n", hr));1541 LogRelFunc(("failed to query INetCfgComponentBindings (0x%x)\n", hr)); 1542 1542 else 1543 1543 { … … 1545 1545 INetCfgBindingPath *pBp; 1546 1546 if ((pFilterBindings->EnumBindingPaths(EBP_BELOW, &pEnumBp)) != S_OK) 1547 LogRel (("netIfGetBoundAdapters:failed to enumerate binding paths (0x%x)\n", hr));1547 LogRelFunc(("failed to enumerate binding paths (0x%x)\n", hr)); 1548 1548 else 1549 1549 { … … 1556 1556 { 1557 1557 /** @todo some id of disabled path could be useful. */ 1558 netIfLog((" netIfGetBoundAdapters:INetCfgBindingPath is disabled (0x%x)\n", hr));1558 netIfLog(("INetCfgBindingPath is disabled (0x%x)\n", hr)); 1559 1559 pBp->Release(); 1560 1560 continue; 1561 1561 } 1562 1562 if ((pBp->EnumBindingInterfaces(&pEnumBi)) != S_OK) 1563 LogRel (("netIfGetBoundAdapters:failed to enumerate binding interfaces (0x%x)\n", hr));1563 LogRelFunc(("failed to enumerate binding interfaces (0x%x)\n", hr)); 1564 1564 else 1565 1565 { … … 1569 1569 INetCfgComponent *pAdapter; 1570 1570 if ((hr = pBi->GetLowerComponent(&pAdapter)) != S_OK) 1571 LogRel (("netIfGetBoundAdapters:failed to get lower component (0x%x)\n", hr));1571 LogRelFunc(("failed to get lower component (0x%x)\n", hr)); 1572 1572 else 1573 1573 { 1574 1574 LPWSTR pwszName = NULL; 1575 1575 if ((hr = pAdapter->GetDisplayName(&pwszName)) != S_OK) 1576 LogRel (("netIfGetBoundAdapters:failed to get display name (0x%x)\n", hr));1576 LogRelFunc(("failed to get display name (0x%x)\n", hr)); 1577 1577 else 1578 1578 { … … 1580 1580 DWORD dwChars; 1581 1581 if ((hr = pAdapter->GetDeviceStatus(&uStatus)) != S_OK) 1582 netIfLog((" netIfGetBoundAdapters:%ls: failed to get device status (0x%x)\n",1582 netIfLog(("%ls: failed to get device status (0x%x)\n", 1583 1583 pwszName, hr)); 1584 1584 else if ((hr = pAdapter->GetCharacteristics(&dwChars)) != S_OK) 1585 netIfLog((" netIfGetBoundAdapters:%ls: failed to get device characteristics (0x%x)\n",1585 netIfLog(("%ls: failed to get device characteristics (0x%x)\n", 1586 1586 pwszName, hr)); 1587 1587 else if (uStatus != 0) 1588 netIfLog((" netIfGetBoundAdapters:%ls: wrong status 0x%x\n",1588 netIfLog(("%ls: wrong status 0x%x\n", 1589 1589 pwszName, uStatus)); 1590 1590 else if (dwChars & NCF_HIDDEN) 1591 netIfLog((" netIfGetBoundAdapters:%ls: wrong characteristics 0x%x\n",1591 netIfLog(("%ls: wrong characteristics 0x%x\n", 1592 1592 pwszName, dwChars)); 1593 1593 else … … 1596 1596 LPWSTR pwszHwId = NULL; 1597 1597 if ((hr = pAdapter->GetId(&pwszHwId)) != S_OK) 1598 LogRel (("netIfGetBoundAdapters:%ls: failed to get hardware id (0x%x)\n",1598 LogRelFunc(("%ls: failed to get hardware id (0x%x)\n", 1599 1599 pwszName, hr)); 1600 1600 else if (!_wcsnicmp(pwszHwId, L"sun_VBoxNetAdp", sizeof(L"sun_VBoxNetAdp")/2)) 1601 netIfLog((" netIfGetBoundAdapters:host-only adapter %ls, ignored\n", pwszName));1601 netIfLog(("host-only adapter %ls, ignored\n", pwszName)); 1602 1602 else if ((hr = pAdapter->GetInstanceGuid(&guid)) != S_OK) 1603 LogRel (("netIfGetBoundAdapters:%ls: failed to get instance GUID (0x%x)\n",1603 LogRelFunc(("%ls: failed to get instance GUID (0x%x)\n", 1604 1604 pwszName, hr)); 1605 1605 else … … 1610 1610 adapter.guid = *(Guid(guid).raw()); 1611 1611 adapter.pAdapter = NULL; 1612 netIfLog((" netIfGetBoundAdapters:guid=%RTuuid, name=%ls, hwid=%ls, status=%x, chars=%x\n",1612 netIfLog(("guid=%RTuuid, name=%ls, hwid=%ls, status=%x, chars=%x\n", 1613 1613 &adapter.guid, pwszName, pwszHwId, uStatus, dwChars)); 1614 1614 boundAdapters.push_back(adapter); … … 1650 1650 #endif 1651 1651 1652 /** 1653 * Walk through the list of adpater addresses and extract the required 1654 * information. XP and older don't not have the OnLinkPrefixLength field. 1655 */ 1652 1656 static void netIfFillInfoWithAddressesXp(PNETIFINFO pInfo, PIP_ADAPTER_ADDRESSES pAdapter) 1653 1657 { … … 1690 1694 { 1691 1695 ULONG ip = ((PSOCKADDR_IN)(pPrefix->Address.lpSockaddr))->sin_addr.s_addr; 1692 netIfLog((" netIfFillInfoWithAddressesXp:prefix=%RTnaipv4 len=%u\n", ip, pPrefix->PrefixLength));1696 netIfLog(("prefix=%RTnaipv4 len=%u\n", ip, pPrefix->PrefixLength)); 1693 1697 if ( pPrefix->PrefixLength < sizeof(pInfo->IPNetMask) * 8 1694 1698 && pPrefix->PrefixLength > 0 … … 1699 1703 } 1700 1704 else 1701 netIfLog((" netIfFillInfoWithAddressesXp:Unexpected IPv4 prefix length of %d\n",1705 netIfLog(("Unexpected IPv4 prefix length of %d\n", 1702 1706 pPrefix->PrefixLength)); 1703 1707 } … … 1707 1711 { 1708 1712 PBYTE ipv6 = ((PSOCKADDR_IN6)(pPrefix->Address.lpSockaddr))->sin6_addr.s6_addr; 1709 netIfLog(("netIfFillInfoWithAddressesXp: prefix=%RTnaipv6 len=%u\n", 1710 ipv6, pPrefix->PrefixLength)); 1713 netIfLog(("prefix=%RTnaipv6 len=%u\n", ipv6, pPrefix->PrefixLength)); 1711 1714 if ( pPrefix->PrefixLength < sizeof(pInfo->IPv6NetMask) * 8 1712 1715 && pPrefix->PrefixLength > 0 … … 1717 1720 } 1718 1721 else 1719 netIfLog(("netIfFillInfoWithAddressesXp: Unexpected IPv6 prefix length of %d\n", 1720 pPrefix->PrefixLength)); 1722 netIfLog(("Unexpected IPv6 prefix length of %d\n", pPrefix->PrefixLength)); 1721 1723 } 1722 1724 break; 1723 1725 } 1724 1726 } 1725 netIfLog(("netIfFillInfoWithAddressesXp: %RTnaipv4/%u\n", 1726 pInfo->IPAddress, uPrefixLenV4)); 1727 netIfLog(("netIfFillInfoWithAddressesXp: %RTnaipv6/%u\n", 1728 &pInfo->IPv6Address, uPrefixLenV6)); 1729 } 1730 1731 static void netIfFillInfoWithAddresses(PNETIFINFO pInfo, PIP_ADAPTER_ADDRESSES pAdapter) 1727 netIfLog(("%RTnaipv4/%u\n", pInfo->IPAddress, uPrefixLenV4)); 1728 netIfLog(("%RTnaipv6/%u\n", &pInfo->IPv6Address, uPrefixLenV6)); 1729 } 1730 1731 /** 1732 * Walk through the list of adpater addresses and extract the required 1733 * information. XP and older don't not have the OnLinkPrefixLength field. 1734 */ 1735 static void netIfFillInfoWithAddressesVista(PNETIFINFO pInfo, PIP_ADAPTER_ADDRESSES pAdapter) 1732 1736 { 1733 1737 PIP_ADAPTER_UNICAST_ADDRESS pAddr; 1734 1738 1735 1739 if (sizeof(pInfo->MACAddress) != pAdapter->PhysicalAddressLength) 1736 netIfLog((" netIfFillInfoWithAddresses:Unexpected physical address length: %u\n", pAdapter->PhysicalAddressLength));1740 netIfLog(("Unexpected physical address length: %u\n", pAdapter->PhysicalAddressLength)); 1737 1741 else 1738 1742 memcpy(pInfo->MACAddress.au8, pAdapter->PhysicalAddress, sizeof(pInfo->MACAddress)); … … 1742 1746 for (pAddr = pAdapter->FirstUnicastAddress; pAddr; pAddr = pAddr->Next) 1743 1747 { 1744 if (pAddr->Length < sizeof(IP_ADAPTER_UNICAST_ADDRESS_LH))1745 {1746 netIfLog(("netIfFillInfoWithAddresses: unicast address is too small (%u < %u), fall back to XP implementation\n",1747 pAddr->Length, sizeof(IP_ADAPTER_UNICAST_ADDRESS_LH)));1748 return netIfFillInfoWithAddressesXp(pInfo, pAdapter);1749 }1750 1748 PIP_ADAPTER_UNICAST_ADDRESS_LH pAddrLh = (PIP_ADAPTER_UNICAST_ADDRESS_LH)pAddr; 1751 1749 switch (pAddrLh->Address.lpSockaddr->sa_family) … … 1759 1757 sizeof(pInfo->IPAddress)); 1760 1758 if (pAddrLh->OnLinkPrefixLength > 32) 1761 netIfLog((" netIfFillInfoWithAddresses:Invalid IPv4 prefix length of %d\n", pAddrLh->OnLinkPrefixLength));1759 netIfLog(("Invalid IPv4 prefix length of %d\n", pAddrLh->OnLinkPrefixLength)); 1762 1760 else 1763 1761 RTNetPrefixToMaskIPv4(pAddrLh->OnLinkPrefixLength, &pInfo->IPNetMask); … … 1772 1770 sizeof(pInfo->IPv6Address)); 1773 1771 if (pAddrLh->OnLinkPrefixLength > 128) 1774 netIfLog((" netIfFillInfoWithAddresses:Invalid IPv6 prefix length of %d\n", pAddrLh->OnLinkPrefixLength));1772 netIfLog(("Invalid IPv6 prefix length of %d\n", pAddrLh->OnLinkPrefixLength)); 1775 1773 else 1776 1774 RTNetPrefixToMaskIPv6(pAddrLh->OnLinkPrefixLength, &pInfo->IPv6NetMask); … … 1784 1782 int iPrefixIPv4 = -1; 1785 1783 RTNetMaskToPrefixIPv4(&pInfo->IPNetMask, &iPrefixIPv4); 1786 netIfLog((" netIfFillInfoWithAddresses:%RTnaipv4/%u\n", pInfo->IPAddress, iPrefixIPv4));1784 netIfLog(("%RTnaipv4/%u\n", pInfo->IPAddress, iPrefixIPv4)); 1787 1785 } 1788 1786 if (fIPv6Found) … … 1790 1788 int iPrefixIPv6 = -1; 1791 1789 RTNetMaskToPrefixIPv6(&pInfo->IPv6NetMask, &iPrefixIPv6); 1792 netIfLog((" netIfFillInfoWithAddresses:%RTnaipv6/%u\n", &pInfo->IPv6Address, iPrefixIPv6));1790 netIfLog(("%RTnaipv6/%u\n", &pInfo->IPv6Address, iPrefixIPv6)); 1793 1791 } 1794 1792 } … … 1821 1819 if (dwRc != NO_ERROR) 1822 1820 { 1823 LogRel (("NetIfList:GetAdaptersAddresses failed (0x%x)\n", dwRc));1821 LogRelFunc(("GetAdaptersAddresses failed (0x%x)\n", dwRc)); 1824 1822 hr = HRESULT_FROM_WIN32(dwRc); 1825 1823 } … … 1833 1831 #endif 1834 1832 if (hr != S_OK) 1835 LogRel (("NetIfList:netIfGetBoundAdapters failed (0x%x)\n", hr));1833 LogRelFunc(("netIfGetBoundAdapters failed (0x%x)\n", hr)); 1836 1834 else 1837 1835 { … … 1843 1841 if (!pszUuid) 1844 1842 { 1845 LogRel (("NetIfList:out of memory\n"));1843 LogRelFunc(("out of memory\n")); 1846 1844 break; 1847 1845 } 1848 1846 size_t len = strlen(pszUuid) - 1; 1849 1847 if (pszUuid[0] != '{' || pszUuid[len] != '}') 1850 LogRel (("NetIfList:ignoring invalid GUID %s\n", pAdapter->AdapterName));1848 LogRelFunc(("ignoring invalid GUID %s\n", pAdapter->AdapterName)); 1851 1849 else 1852 1850 { … … 1877 1875 info.bIsDefault = (pAdapter->IfIndex == (DWORD)iDefault); 1878 1876 info.bDhcpEnabled = pAdapter->Flags & IP_ADAPTER_DHCP_ENABLED; 1879 netIfFillInfoWithAddresses(&info, pAdapter); 1877 OSVERSIONINFOEX OSInfoEx; 1878 RT_ZERO(OSInfoEx); 1879 OSInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 1880 if ( GetVersionEx((LPOSVERSIONINFO)&OSInfoEx) 1881 && OSInfoEx.dwMajorVersion < 6) 1882 netIfFillInfoWithAddressesXp(&info, pAdapter); 1883 else 1884 netIfFillInfoWithAddressesVista(&info, pAdapter); 1880 1885 } 1881 1886 else … … 1892 1897 int rc = iface->init((*it).pName, enmType, &info); 1893 1898 if (FAILED(rc)) 1894 LogRel (("NetIfList:HostNetworkInterface::init() -> %Rrc\n", rc));1899 LogRelFunc(("HostNetworkInterface::init() -> %Rrc\n", rc)); 1895 1900 else 1896 1901 {
Note:
See TracChangeset
for help on using the changeset viewer.