HostDnsServiceWin.cpp revision dbbd0cae65188dffbd927bdde2d88cbeec2e26da
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync/* -*- indent-tabs-mode: nil; -*- */
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <VBox/com/string.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <VBox/com/ptr.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <iprt/assert.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <iprt/err.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync#include <Windows.h>
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
7a0e5c38eeca5147034ace6fe624de57ac2988ddvboxsync#include <string>
7a0e5c38eeca5147034ace6fe624de57ac2988ddvboxsync#include <vector>
7a0e5c38eeca5147034ace6fe624de57ac2988ddvboxsync#include "../HostDnsService.h"
7a0e5c38eeca5147034ace6fe624de57ac2988ddvboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsyncstruct HostDnsServiceWin::Data
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync{
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync HostDnsServiceWin::Data(){}
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync HKEY hKeyTcpipParameters;
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync#define DATA_DNS_UPDATE_EVENT 0
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync#define DATA_SHUTDOWN_EVENT 1
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync#define DATA_MAX_EVENT 2
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync HANDLE haDataEvent[DATA_MAX_EVENT];
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync};
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsyncstatic inline int registerNotification(const HKEY& hKey, HANDLE& hEvent)
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync{
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync LONG lrc = RegNotifyChangeKeyValue(hKey,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync TRUE,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync REG_NOTIFY_CHANGE_LAST_SET,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync hEvent,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync TRUE);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync AssertMsgReturn(lrc == ERROR_SUCCESS,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync ("Failed to register event on the key. Please debug me!"),
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync VERR_INTERNAL_ERROR);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync return VINF_SUCCESS;
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync}
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsyncHostDnsServiceWin::HostDnsServiceWin():HostDnsMonitor(true), m(NULL)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync m = new Data();
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync m->haDataEvent[DATA_DNS_UPDATE_EVENT] = CreateEvent(NULL,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync TRUE, FALSE, NULL);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync AssertReleaseMsg(m->haDataEvent[DATA_DNS_UPDATE_EVENT],
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync ("Failed to create event for DNS event (%d)\n", GetLastError()));
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync m->haDataEvent[DATA_SHUTDOWN_EVENT] = CreateEvent(NULL,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync TRUE, FALSE, NULL);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync AssertReleaseMsg(m->haDataEvent[DATA_SHUTDOWN_EVENT],
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync ("Failed to create event for Shutdown signal (%d)\n", GetLastError()));
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync LONG lrc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync TEXT("SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters"),
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync 0, KEY_READ|KEY_NOTIFY, &m->hKeyTcpipParameters);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync AssertReleaseMsg(lrc == ERROR_SUCCESS,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync ("Failed to open Registry Key for read and update notifications (%d)\n",
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync GetLastError()));
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync}
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsyncHostDnsServiceWin::~HostDnsServiceWin()
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync if (m && !m->hKeyTcpipParameters)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync {
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync RegCloseKey(m->hKeyTcpipParameters);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync m->hKeyTcpipParameters = 0;
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync CloseHandle(m->haDataEvent[DATA_DNS_UPDATE_EVENT]);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync CloseHandle(m->haDataEvent[DATA_SHUTDOWN_EVENT]);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync delete m;
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync m = NULL;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync }
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync}
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncHRESULT HostDnsServiceWin::init()
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
0faefdb9edd752514d5dfed8353118e47e57f0ebvboxsync HRESULT hrc = HostDnsMonitor::init();
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync AssertComRCReturn(hrc, hrc);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
e9745a6011708caa5cf92ce0eb03496c0a76b7edvboxsync return updateInfo();
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync}
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsyncvoid HostDnsServiceWin::monitorThreadShutdown()
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync{
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync SetEvent(m->haDataEvent[DATA_SHUTDOWN_EVENT]);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync}
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsyncint HostDnsServiceWin::monitorWorker()
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync{
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync registerNotification(m->hKeyTcpipParameters,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync m->haDataEvent[DATA_DNS_UPDATE_EVENT]);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync monitorThreadInitializationDone();
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync DWORD dwRc;
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync while (true)
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync {
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync dwRc = WaitForMultipleObjects(DATA_MAX_EVENT,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync m->haDataEvent,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync FALSE,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync INFINITE);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync AssertMsgReturn(dwRc != WAIT_FAILED,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync ("WaitForMultipleObjects failed (%d) to wait! Please debug",
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync GetLastError()), VERR_INTERNAL_ERROR);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync if ((dwRc - WAIT_OBJECT_0) == DATA_DNS_UPDATE_EVENT)
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync {
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync updateInfo();
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync notifyAll();
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync ResetEvent(m->haDataEvent[DATA_DNS_UPDATE_EVENT]);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync registerNotification(m->hKeyTcpipParameters,
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync m->haDataEvent[DATA_DNS_UPDATE_EVENT]);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync }
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync else if ((dwRc - WAIT_OBJECT_0) == DATA_SHUTDOWN_EVENT)
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync {
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync break;
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync }
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync else
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync {
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync AssertMsgFailedReturn(
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync ("WaitForMultipleObjects returns out of bound index %d. Please debug!",
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync dwRc),
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync VERR_INTERNAL_ERROR);
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync }
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync }
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync return VINF_SUCCESS;
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync}
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync
e9745a6011708caa5cf92ce0eb03496c0a76b7edvboxsyncHRESULT HostDnsServiceWin::updateInfo()
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync HRESULT hrc;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync DWORD regIndex;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync BYTE abDomain[256];
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync BYTE abNameServers[256];
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync BYTE abSearchList[256];
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
4240a598ac2cb22c56027b5bca5a25ef9f166461vboxsync RT_ZERO(abDomain);
4240a598ac2cb22c56027b5bca5a25ef9f166461vboxsync RT_ZERO(abNameServers);
4240a598ac2cb22c56027b5bca5a25ef9f166461vboxsync RT_ZERO(abSearchList);
4240a598ac2cb22c56027b5bca5a25ef9f166461vboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync regIndex = 0;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync do {
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync CHAR keyName[256];
9f52526783f7b74ada6fcc1d8ba7916c6a144783vboxsync DWORD cbKeyName = sizeof(keyName);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync DWORD keyType = 0;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync BYTE keyData[1024];
9f52526783f7b74ada6fcc1d8ba7916c6a144783vboxsync DWORD cbKeyData = sizeof(keyData);
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync
dbbd0cae65188dffbd927bdde2d88cbeec2e26davboxsync hrc = RegEnumValueA(m->hKeyTcpipParameters, regIndex, keyName, &cbKeyName, 0,
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync &keyType, keyData, &cbKeyData);
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync if ( hrc == ERROR_SUCCESS
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync || hrc == ERROR_MORE_DATA)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync {
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync if ( RTStrICmp("Domain", keyName) == 0
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData > 1
9f52526783f7b74ada6fcc1d8ba7916c6a144783vboxsync && cbKeyData < sizeof(abDomain))
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync memcpy(abDomain, keyData, cbKeyData);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync else if ( RTStrICmp("DhcpDomain", keyName) == 0
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData > 1
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && abDomain[0] == 0
9f52526783f7b74ada6fcc1d8ba7916c6a144783vboxsync && cbKeyData < sizeof(abDomain))
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync memcpy(abDomain, keyData, cbKeyData);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync else if ( RTStrICmp("NameServer", keyName) == 0
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData > 1
9f52526783f7b74ada6fcc1d8ba7916c6a144783vboxsync && cbKeyData < sizeof(abNameServers))
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync memcpy(abNameServers, keyData, cbKeyData);
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync else if ( RTStrICmp("DhcpNameServer", keyName) == 0
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData > 1
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && abNameServers[0] == 0
9f52526783f7b74ada6fcc1d8ba7916c6a144783vboxsync && cbKeyData < sizeof(abNameServers))
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync memcpy(abNameServers, keyData, cbKeyData);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync else if ( RTStrICmp("SearchList", keyName) == 0
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync && cbKeyData > 1
9f52526783f7b74ada6fcc1d8ba7916c6a144783vboxsync && cbKeyData < sizeof(abSearchList))
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync memcpy(abSearchList, keyData, cbKeyData);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync }
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync regIndex++;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync } while (hrc != ERROR_NO_MORE_ITEMS);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync /* OK, now parse and update DNS structures. */
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync /* domain name */
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync HostDnsInformation info;
cf3059114e5c5c6ed5c8308b1ec759377fb5b885vboxsync info.domain = (char*)abDomain;
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync /* server list */
cf3059114e5c5c6ed5c8308b1ec759377fb5b885vboxsync strList2List(info.servers, (char *)abNameServers);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync /* search list */
cf3059114e5c5c6ed5c8308b1ec759377fb5b885vboxsync strList2List(info.searchList, (char *)abSearchList);
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync
e9745a6011708caa5cf92ce0eb03496c0a76b7edvboxsync HostDnsMonitor::setInfo(info);
8dfc5e89cd3421bb0602f33768f00c1f1d40b1d2vboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync return S_OK;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync}
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsyncvoid HostDnsServiceWin::strList2List(std::vector<std::string>& lst, char *strLst)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync{
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync char *next, *current;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync char address[512];
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync AssertPtrReturnVoid(strLst);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync if (strlen(strLst) == 0)
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync return;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync current = strLst;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync do {
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync RT_ZERO(address);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync next = RTStrStr(current, " ");
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync if (next)
9f52526783f7b74ada6fcc1d8ba7916c6a144783vboxsync strncpy(address, current, RT_MIN(sizeof(address)-1, next - current));
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync else
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync strcpy(address, current);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
3f2299591cfeb8a37a3578bef9c44c1790860948vboxsync lst.push_back(std::string(address));
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync current = next + 1;
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync } while(next);
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync
18b1f1bb3429f8bfc1a52cfaeb2445e9fb1f55cdvboxsync}