diff -r 000000000000 -r af10295192d8 tcpiputils/dnd/src/llmnrconf.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tcpiputils/dnd/src/llmnrconf.cpp Tue Jan 26 15:23:49 2010 +0200 @@ -0,0 +1,130 @@ +// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// llmnrconf.cpp - LLMNR (linklocal multicast name resolver) configuration +// file parser module +// + +#ifdef LLMNR_ENABLED +#include // RFs +#include // TInetAddr +#include +#include "dnd_ini.h" +#include "engine.h" +#include "llmnrresponder.h" // this +#include "inet6log.h" + +CLlmnrConf::CLlmnrConf(CDndEngine &aControl) +: iControl(aControl) + { + } + +CLlmnrConf::~CLlmnrConf() + { + delete iHostList; + } + +void CLlmnrConf::ConstructL() + { + iLlmnrEntries = iControl.GetIniValue(DND_INI_LLMNR, LLMNR_INI_ENTRIES, 0, 0, KLlmnrMaxEnabled); + iNotifyTime = iControl.GetIniValue(DND_INI_LLMNR, LLMNR_INI_NOTIFYTIME, KLlmnrIni_NotifyTime, 1, KMaxTInt); + iRescans = iControl.GetIniValue(DND_INI_LLMNR, LLMNR_INI_RESCANS, KLlmnrIni_Rescans, 1, 255); + iTTL = iControl.GetIniValue(DND_INI_LLMNR, LLMNR_INI_TTL, KLlmnrIni_Ttl, 1, KMaxTInt); + } + +void CLlmnrConf::GetHostNamesL() + { + delete iHostList; + iHostList = NULL; + // Aways allocate the array "skeleton" to keep things simple. + iHostList = new (ELeave) CArrayFixFlat(iLlmnrEntries < 1 ? 1 : iLlmnrEntries); + + for (TUint i = 1; i <= iLlmnrEntries; ++i) + { + THostNameEntry entry; + + // Borrow he iName field of the entry + entry.iName = LLMNR_INI_ENTRY; + entry.iName.AppendNum(i); + TPtrC entrystr; + if(!iControl.FindVar(DND_INI_LLMNR, entry.iName, entrystr)) + { + // This log message should probably be logged in release also + LOG(Log::Printf(_L("DND LMNR: %S is missing [%S] %S%d\r\n"), &DND_INI_DATA, &DND_INI_LLMNR, &LLMNR_INI_ENTRY, (TInt)i)); + continue; + } + + TLex wordLex(entrystr); + + // Get hostname + wordLex.Mark(); + while (!wordLex.Eos() && wordLex.Peek() != ',') + wordLex.Inc(); + + TInt err = 0; + for (;;) + { + const TInt N = wordLex.MarkedToken().Length(); + if (N <= 0 || N > entry.iName.MaxLength()) + { + err = 1; + break; // invalid hostname (either not given or too long) + } + entry.iName = wordLex.MarkedToken(); + + // By default, entry is valid for ... + entry.iVersion = EIPany; // ...both IPv4 and IPv6 + entry.iIfName.SetLength(0); // ...any interface + if(wordLex.Eos()) + break; + + // Get interface name + wordLex.Inc(); + if(wordLex.Peek() != ',') // not ",," after hostname + { + wordLex.Mark(); + while (!wordLex.Eos() && wordLex.Peek() != ',') + wordLex.Inc(); + if (wordLex.MarkedToken().Length() > entry.iIfName.MaxLength()) + { + err = 2; + break; + } + entry.iIfName = wordLex.MarkedToken(); + } + + if(wordLex.Eos()) + break; + + // Get ip-version + wordLex.Inc(); + if(wordLex.Eos()) // Eos after ',' + break; + + TInt n; + if((wordLex.Val(n) != KErrNone) || (n != 0 && n != 4 && n != 6)) + err = 1; + else + entry.iVersion = (TIpVer)n; + break; + } + if (err) + { + LOG(Log::Printf(_L("DND LMNR: %S has invalid [%S] %S%d= %S [ignored]\r\n"), &DND_INI_DATA, &DND_INI_LLMNR, &LLMNR_INI_ENTRY, (TInt)i, &entrystr)); + } + else + iHostList->AppendL(entry); + } + } + +#endif