--- /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 <f32file.h> // RFs
+#include <in_sock.h> // TInetAddr
+#include <es_ini.h>
+#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<THostNameEntry>(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