Revision: 201021 RCL_3
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 15 Sep 2010 14:02:55 +0300
branchRCL_3
changeset 64 c44f36bb61a3
parent 60 82ca0c6a68ed
child 75 254b651f304e
Revision: 201021 Kit: 201036
genericopenlibs/openenvcore/backend/bwins/backendu.def
genericopenlibs/openenvcore/backend/bwins/backendwolibrtu.def
genericopenlibs/openenvcore/backend/bwins/old_backendu.def
genericopenlibs/openenvcore/backend/eabi/backendu.def
genericopenlibs/openenvcore/backend/eabi/backendwolibrtu.def
genericopenlibs/openenvcore/backend/eabi/old_backendu.def
genericopenlibs/openenvcore/backend/inc/fdesc.h
genericopenlibs/openenvcore/backend/inc/sysif.h
genericopenlibs/openenvcore/backend/src/corebackend/localif.cpp
genericopenlibs/openenvcore/backend/src/corebackend/usocket.cpp
genericopenlibs/openenvcore/backend/src/corebackend/usocketbase.cpp
genericopenlibs/openenvcore/include/net/if.h
genericopenlibs/openenvcore/include/net/route.h
genericopenlibs/openenvcore/include/sys/sockio.dosc
genericopenlibs/openenvcore/include/sys/sockio.h
genericopenlibs/openenvcore/libc/bwins/libcu.def
genericopenlibs/openenvcore/libc/bwins/old_libcu.def
genericopenlibs/openenvcore/libc/eabi/libcu.def
genericopenlibs/openenvcore/libc/eabi/old_libcu.def
genericopenlibs/openenvcore/libc/src/Fmscalls.cpp
genericopenlibs/openenvcore/libc/src/timefuncs.cpp
genericopenlibs/openenvcore/libc/test/testifioctls/data/tifioctls.ini
genericopenlibs/openenvcore/libc/test/testifioctls/inc/tifioctls.h
genericopenlibs/openenvcore/libc/test/testifioctls/scripts/tifioctls.script
genericopenlibs/openenvcore/libc/test/testifioctls/scripts/tifioctls_hw.script
genericopenlibs/openenvcore/libc/test/testifioctls/src/tifioctls.cpp
genericopenlibs/openenvcore/libc/test/testifioctls/src/tifioctlsblocks.cpp
genericopenlibs/openenvcore/libc/test/testifioctls/src/tifioctlsserver.cpp
genericopenlibs/openenvcore/libc/test/testsocket/inc/tsocket.h
genericopenlibs/openenvcore/libc/test/testsocket/scripts/tsocket.script
genericopenlibs/openenvcore/libc/test/testsocket/scripts/tsocket_hw.script
genericopenlibs/openenvcore/libc/test/testsocket/src/tsocket.cpp
genericopenlibs/openenvcore/libc/test/testsocket/src/tsocketblocks.cpp
genericopenlibs/openenvcore/libc/test/testsocket/src/tsocketserver.cpp
genericopenlibs/openenvcore/test/utils/OEtests_hw.bat
genericservices/taskscheduler/SCHSVR/SchTimer.cpp
lowlevellibsandfws/pluginfw/Framework/frame/RegistryData.cpp
--- a/genericopenlibs/openenvcore/backend/bwins/backendu.def	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/bwins/backendu.def	Wed Sep 15 14:02:55 2010 +0300
@@ -171,3 +171,6 @@
 	_memmove_r @ 170 NONAME
 	_lstat_r @ 171 NONAME
 	_unsetdefaultif_r @ 172 NONAME
+	?freednssuffixes@CLocalSystemInterface@@QAEXPAUif_dns_suffixes@@@Z @ 173 NONAME ; void CLocalSystemInterface::freednssuffixes(struct if_dns_suffixes *)
+	?TZServer@CLocalSystemInterface@@QAEAAVRTz@@AAH@Z @ 174 NONAME ; class RTz & CLocalSystemInterface::TZServer(int &)
+
--- a/genericopenlibs/openenvcore/backend/bwins/backendwolibrtu.def	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/bwins/backendwolibrtu.def	Wed Sep 15 14:02:55 2010 +0300
@@ -171,3 +171,6 @@
 	_memmove_r @ 170 NONAME
 	_lstat_r @ 171 NONAME
 	_unsetdefaultif_r @ 172 NONAME
+	?freednssuffixes@CLocalSystemInterface@@QAEXPAUif_dns_suffixes@@@Z @ 173 NONAME ; void CLocalSystemInterface::freednssuffixes(struct if_dns_suffixes *)
+	?TZServer@CLocalSystemInterface@@QAEAAVRTz@@AAH@Z @ 174 NONAME ; class RTz & CLocalSystemInterface::TZServer(int &)
+
--- a/genericopenlibs/openenvcore/backend/bwins/old_backendu.def	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/bwins/old_backendu.def	Wed Sep 15 14:02:55 2010 +0300
@@ -171,3 +171,6 @@
 	_memmove_r @ 170 NONAME
 	_lstat_r @ 171 NONAME
 	_unsetdefaultif_r @ 172 NONAME
+	?freednssuffixes@CLocalSystemInterface@@QAEXPAUif_dns_suffixes@@@Z @ 173 NONAME ; void CLocalSystemInterface::freednssuffixes(struct if_dns_suffixes *)
+	?TZServer@CLocalSystemInterface@@QAEAAVRTz@@AAH@Z @ 174 NONAME ; class RTz & CLocalSystemInterface::TZServer(int &)
+
--- a/genericopenlibs/openenvcore/backend/eabi/backendu.def	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/eabi/backendu.def	Wed Sep 15 14:02:55 2010 +0300
@@ -175,3 +175,6 @@
 	_memmove_r @ 174 NONAME
 	_lstat_r @ 175 NONAME
 	_unsetdefaultif_r @ 176 NONAME
+	_ZN21CLocalSystemInterface15freednssuffixesEP15if_dns_suffixes @ 177 NONAME
+	_ZN21CLocalSystemInterface8TZServerERi @ 178 NONAME
+
--- a/genericopenlibs/openenvcore/backend/eabi/backendwolibrtu.def	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/eabi/backendwolibrtu.def	Wed Sep 15 14:02:55 2010 +0300
@@ -175,3 +175,6 @@
 	_memmove_r @ 174 NONAME
 	_lstat_r @ 175 NONAME
 	_unsetdefaultif_r @ 176 NONAME
+	_ZN21CLocalSystemInterface15freednssuffixesEP15if_dns_suffixes @ 177 NONAME
+	_ZN21CLocalSystemInterface8TZServerERi @ 178 NONAME
+
--- a/genericopenlibs/openenvcore/backend/eabi/old_backendu.def	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/eabi/old_backendu.def	Wed Sep 15 14:02:55 2010 +0300
@@ -174,4 +174,7 @@
 	_memcpy_r @ 173 NONAME
 	_memmove_r @ 174 NONAME
 	_lstat_r @ 175 NONAME
-  	_unsetdefaultif_r @ 176 NONAME
+	_unsetdefaultif_r @ 176 NONAME
+	_ZN21CLocalSystemInterface15freednssuffixesEP15if_dns_suffixes @ 177 NONAME
+	_ZN21CLocalSystemInterface8TZServerERi @ 178 NONAME
+
--- a/genericopenlibs/openenvcore/backend/inc/fdesc.h	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/inc/fdesc.h	Wed Sep 15 14:02:55 2010 +0300
@@ -641,7 +641,7 @@
 	    {
 	    return ESocketDesc;
 	    }
-	
+	static void FreeDNSSuffixes(char ** suffixes);
 protected:
 	TInt FinalClose();
 private:
@@ -671,8 +671,10 @@
 	TInt StartSubConnection(void *aParam);
 	TInt GetInterface(void *Param, TInt aType);
 	TInt GetInterafceNumber(void *aParam);
-	TInt GetIpAddress( void *aParam );
+	TInt EnumerateRoutes(void* aParam);
 	
+	TInt SetNameServer(void *aParam, int aFlag);
+	TInt GetNameServer(void *aParam, int aFlag);
 	TInt RouteRequest(TInt aReq, void *aParam);
 	TInt GetInterfaceHWAddress(void *aParam);
 	
@@ -686,11 +688,16 @@
 	TInt GetInterafceParamInfo( void *aParam,TInt aType);
 	void FindConnectionDetailsL(CArrayFixFlat<TAccessPointRecord>*& aRecordPtr, TInt& aCount);    
 	void FindConnectionInfoL(TAccessPointRecord &aRecord,char *ptr);
-	TInt GetInterfaceDetails( void *aParam ,TInt aFlag, TInt aType );
+	TInt GetInterfaceDetails( void *aParam ,TInt aFlag, TInt aType, TInt aIapId );
 	TInt SetInterafceParamInfo( void *aParam,TInt aType);
-	TInt SetInterfaceDetails( void *aParam ,TInt aFlag, TInt aType );
-	
-	TInt maybe_reopen_socket()
+	TInt SetInterfaceDetails( void *aParam ,TInt aFlag, TInt aType,TInt aIapId );
+	TInt GetInterfaceAttributes(void *aParam, int aFlag);
+	TInt GetActiveInterfaceIAPIdByName(const char *aIapName,TInt& aIapId);
+	TInt SetInterfaceAttributes(void *aParam, int aFlag);
+	TInt ConvertTInetToSockAddr(const TInetAddr& aInetAddr, sockaddr * aSockAddr );
+	TInt ConvertSockToTInetAddr(const sockaddr * aSockAddr, TInetAddr& aInetAddr);
+	TInt GetInterfaceInfo(TSoInetInterfaceInfo& aIfInfo, TInt aIapId );
+		TInt maybe_reopen_socket()
 	    {
 	    TInt err = KErrNone;
 	    if (!__e32_atomic_load_acq32(&iSocketPtr))
@@ -716,13 +723,18 @@
 		EACCESS_GETBROADCAST,
 		EACCESS_GETPHYSADDR,
 		EACCESS_GETFLAGS,
+		EACCESS_GETDEFGATEWAY,
 		EACCESS_SETMETRIC,
 		EACCESS_SETMTU,
 		EACCESS_SETFLAGS,
 		EACCESS_SETPHYSADDR,
 		EACTIVE_SETIP,
 		EACCESS_SETNETMASK,
-		EACCESS_SETBROADCAST
+		EACCESS_SETBROADCAST,
+		EACCESS_GETDNSSUFFIX,
+		EACCESS_SETDNSSUFFIX,
+		EACCESS_SETNAMESERVERS,
+		EACCESS_GETNAMESERVERS
 		};
 
 	TPtr8 iIoctlBuf;
--- a/genericopenlibs/openenvcore/backend/inc/sysif.h	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/inc/sysif.h	Wed Sep 15 14:02:55 2010 +0300
@@ -36,6 +36,7 @@
 #include <rpipe.h>
 
 #include<tz.h>
+#include <e32atomics.h>
 
 #ifdef SYMBIAN_OE_POSIX_SIGNALS
 #include "signalclient.h"
@@ -114,7 +115,7 @@
 */
 	{
 public:
-	void StorePtrs(RHeap* aHeap, RFs* aFs, RSocketServ* aSs, RCommServ* aCs, RFastLock* aSsLock, RFastLock* aCsLock,RFastLock* aDefConnLock,RFastLock* aAESelectLock)
+	void StorePtrs(RHeap* aHeap, RFs* aFs, RSocketServ* aSs, RCommServ* aCs, RFastLock* aSsLock, RFastLock* aCsLock,RFastLock* aDefConnLock,RFastLock* aAESelectLock,RFastLock* aTzServerLock)
 		{
 		iHeap = aHeap;
 		iFs = aFs;
@@ -124,6 +125,7 @@
 		iCsLock = aCsLock;
 		iDefConnLock = aDefConnLock;
 		iAESelectLock = aAESelectLock;
+		iTzServerLock = aTzServerLock;
 		}
 
 	~TCLSICleanup()
@@ -136,6 +138,7 @@
 		iHeap->Close();
 		iDefConnLock->Close();
 		iAESelectLock->Close();
+		iTzServerLock->Close();
 		}
 private:
 	RHeap* iHeap;
@@ -145,7 +148,8 @@
 	RFastLock* iSsLock;
 	RFastLock* iCsLock;
 	RFastLock* iDefConnLock;
-	RFastLock* iAESelectLock;	
+	RFastLock* iAESelectLock;
+	RFastLock* iTzServerLock;
 	};
 
 
@@ -453,6 +457,8 @@
 	int popen (const wchar_t* file, const wchar_t* cmd, const char* mode, int& anErrno);
 	int pclose (int aFid, int& anErrno);
 	IMPORT_C void CheckOrigins (wchar_t**& wenvp, int& aCount);
+    IMPORT_C void freednssuffixes(if_dns_suffixes * suffixes);
+    
 #ifdef SYMBIAN_OE_POSIX_SIGNALS
 	TInt SignalHandler();
 	IMPORT_C void InitSignalHandler();
@@ -591,6 +597,8 @@
 	//Save the file server session path
 	TInt SaveSessionPath(const TDesC& aPath);
 	
+	static void WaitForNRequest(TRequestStatus **aStatusArray, TInt aNum);
+	
 	static void WaitForNRequest(TRequestStatus aStatusArray[], TInt aNum);
 
 private:
@@ -613,6 +621,8 @@
 	// default RConnection with the new settings.
 	TInt StartDefConnection();
 	
+	// Helper function for doing an on-demand connection to RTz server
+	TInt OnDemandTZServerConnection();
 private:
 	// NOTE: iCleanup should be the first member of CLSI, since iPrivateHeap
 	// will be destroyed from within iCleanup destructor.
@@ -689,6 +699,8 @@
 	// Default connection settings, set/cleared using setdefaultif
 	TConnPref* iDefConnPref;
     RTz     iTzServer;	
+	RFastLock iTzServerLock;
+	TBool	iIsRTzConnected;
     RPointerArray<CSocketDesc> iSocketArray;
 #ifdef SYMBIAN_OE_POSIX_SIGNALS
 	// Signal handler thread
@@ -842,10 +854,8 @@
 #endif // SYMBIAN_OE_POSIX_SIGNALS
 public:
 
-   inline RTz & TZServer()
-        {
-        return iTzServer;
-        } 
+	IMPORT_C RTz & TZServer(TInt& aStatus);
+	
 //ipc server session
 RIpcSession iIpcS;
 friend class RFileDesTransferSession;
@@ -956,6 +966,7 @@
 	TUSockAddr() : TSockAddr(), iError(0) {}
 
 	TUSockAddr(TAny* addr);			// constructor form of Prepare
+	TUSockAddr(const TSockAddr& aSockAddr):TSockAddr(aSockAddr),iError(0){};
 	IMPORT_C TUSockAddr(const TAny* addr, TUint len);	// constructor form of Set
 private:
 	void Prepare(TAny* addr);
--- a/genericopenlibs/openenvcore/backend/src/corebackend/localif.cpp	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/src/corebackend/localif.cpp	Wed Sep 15 14:02:55 2010 +0300
@@ -79,10 +79,42 @@
 		return &backend;
 #endif
 		}
+		
+EXPORT_C RTz& CLocalSystemInterface::TZServer(TInt &aStatus)
+	{
+	aStatus = OnDemandTZServerConnection();
+	return iTzServer;
+	} 
+		
+TInt CLocalSystemInterface::OnDemandTZServerConnection()
+        {
+		TInt v = EFalse;
+		TInt err = KErrNone;
+		
+		if(__e32_atomic_load_acq32(&iIsRTzConnected))
+			return err;
+			
+		iTzServerLock.Wait();
+		if (!iIsRTzConnected) 
+			{
+			err = iTzServer.Connect();
+			if ( err == KErrNone ) 
+				{
+				err = iTzServer.ShareAuto();
+				if( err == KErrNone) {
+					v = ETrue;
+					}
+				}
+			__e32_atomic_store_rel32(&iIsRTzConnected, v); 
+			}
+		iTzServerLock.Signal();
+		
+        return err;
+        } 
 
 // Construction of Backend Object which is going to be singleton object for the process
 EXPORT_C CLocalSystemInterface::CLocalSystemInterface() : iOpenDirList(CLocalSystemInterface::KDirGran),
-iTLDInfoList(CLocalSystemInterface::KTLDInfoListGran), iDefConnResurrect(ETrue), iDefConnPref(NULL)
+iTLDInfoList(CLocalSystemInterface::KTLDInfoListGran), iDefConnResurrect(ETrue), iDefConnPref(NULL), iIsRTzConnected(EFalse)
 		{
 #ifdef SYMBIAN_OE_POSIX_SIGNALS
 		iSignalsInitialized = EFalse;
@@ -165,25 +197,17 @@
 			err |=  iASelectLock.CreateLocal();
 	        //Protect the iDefConnection from concurrent GetDefaultConnection calls
 	        err |= iDefConnLock.CreateLocal();
+			//Protect the time zone server while connecting
+			err |= iTzServerLock.CreateLocal();
 			}
 
-        if(err == KErrNone)
-            {
-            err = iTzServer.Connect();
-            if(!err)
-                {
-                err = iTzServer.ShareAuto();
-                }
-            }
-
-
 		//Panic if any of the above operation returns with error
 		if (err)
 			{
 			User::Panic(KEstlibInit, err);
 			}
 
-		iCleanup.StorePtrs(iPrivateHeap, &iFs, &iSs, &iCs, &iSSLock, &iCSLock,&iDefConnLock,&iASelectLock);
+		iCleanup.StorePtrs(iPrivateHeap, &iFs, &iSs, &iCs, &iSSLock, &iCSLock,&iDefConnLock,&iASelectLock,&iTzServerLock);
 
 		}
 
@@ -219,7 +243,6 @@
 	//close the RTz connection
 	iTzServer.Close();
 
-
 	if( iDefConnPref )
 	    {
 	    switch( iDefConnPref->ExtensionId() )
@@ -1740,6 +1763,11 @@
 	return MapError(err,anErrno);
 	}
 
+EXPORT_C void CLocalSystemInterface::freednssuffixes(if_dns_suffixes * suffixes)
+    {
+    CSocketDesc::FreeDNSSuffixes(suffixes->suffixes);
+    }
+
 int CLocalSystemInterface::ioctl_complete (int fid, int cmd, void* param, TRequestStatus& aStatus, int& anErrno)
 	{
 	return iFids.ioctlcomplete(fid,cmd,param,aStatus,anErrno);
@@ -2166,7 +2194,7 @@
         { 
         timer.After(*reqarray[numReqs+arraycount], timeout); 
         // Wait for any request to complete 
-        CLocalSystemInterface::WaitForNRequest(*reqarray, numReqs+arraycount+1);     
+        CLocalSystemInterface::WaitForNRequest(reqarray, numReqs+arraycount+1);     
         if( (*reqarray[numReqs+arraycount]).Int() == KRequestPending) 
             {
             // The timer hasn't fired yet.
@@ -2181,7 +2209,7 @@
         } 
     else 
         { 
-        CLocalSystemInterface::WaitForNRequest(*reqarray, numReqs+arraycount);
+        CLocalSystemInterface::WaitForNRequest(reqarray, numReqs+arraycount);
         // Completion Status of one request has been gathered
         onedown = ETrue;
         }
@@ -3627,6 +3655,47 @@
 // Used in lieu of User::WaitForNRequest because of need to support pre-Argus builds
 // ---------------------------------------------------------------------------------
 //
+void CLocalSystemInterface::WaitForNRequest(TRequestStatus **aStatusArray, TInt aNum)
+	{
+	if (aNum)
+		{
+		// used to keep count of requests we have not been asked to wait for
+		TInt nOther = -1;
+		TBool done = EFalse;
+
+		do
+			{
+			++nOther;
+			User::WaitForAnyRequest();
+			for (TInt i = 0; i < aNum; ++i)
+				{
+				if ((*aStatusArray[i]).Int() != KRequestPending)
+					{
+					done = ETrue;
+					break;
+					}
+				}
+			} while (!done);
+
+		if (nOther)
+			{
+			// Adjust the thread's signal semaphore to account for the requests
+			// we were not asked to wait for.
+			RThread thrd;
+			for (TInt i = 0; i < nOther; ++i)
+				{
+				thrd.RequestSignal();
+				}
+			}
+		}
+	}
+
+// ---------------------------------------------------------------------------------
+// CLocalSystemInterface::WaitForNRequest
+// Wait for any one of the input asynchronous requests to complete
+// Used in lieu of User::WaitForNRequest because of need to support pre-Argus builds
+// ---------------------------------------------------------------------------------
+//
 void CLocalSystemInterface::WaitForNRequest(TRequestStatus aStatusArray[], TInt aNum)
 	{
 	if (aNum)
--- a/genericopenlibs/openenvcore/backend/src/corebackend/usocket.cpp	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/src/corebackend/usocket.cpp	Wed Sep 15 14:02:55 2010 +0300
@@ -232,7 +232,11 @@
 			fromaddr = (from[15]<<24)+(from[14]<<16)+(from[13]<<8)+from[12];
 		else
 			fromaddr = (from[0]<<24)+(from[1]<<16)+(from[2]<<8)+ from[3];
-		*(TUint32*)sp->sa_data=fromaddr;
+		unsigned char * ptr = (unsigned char *)&fromaddr;
+		sp->sa_data[0] =  ptr[0];
+		sp->sa_data[1] =  ptr[1];
+		sp->sa_data[2] =  ptr[2];
+		sp->sa_data[3] =  ptr[3];
 		*len=8;
 		return;
 		}
@@ -956,7 +960,7 @@
 			ATOMICSOCKETOP(ret=iSocket.GetOpt(KSoTcpRcvAtMark,KSolInetTcp,*param), ret = KErrBadHandle)
 			break;	
 		case SIOCGIFADDR:
-			ret = GetIpAddress(aParam);
+		    ret = GetInterfaceAttributes(aParam, EACTIVE_GETIP);
 			break;	
 		case SIOCGIFNUM:
 			ret = GetInterafceNumber(aParam);
@@ -973,7 +977,37 @@
 		case SIOCGIFACTIVEIAP:
 		    ret = GetActiveInterface( aParam);
 		    break;
-		
+		case SIOCGIFFLAGS:
+		    ret = GetInterfaceAttributes(aParam, EACCESS_GETFLAGS);
+		    break;
+		case SIOCGIFMTU:
+		    ret = GetInterfaceAttributes(aParam, EACCESS_GETMTU);
+		    break;
+		case SIOCGIFNETMASK:
+		    ret = GetInterfaceAttributes(aParam, EACCESS_GETNETMASK);
+		    break;
+		case SIOCGIFDEFGATEWAY:
+		    ret = GetInterfaceAttributes(aParam, EACCESS_GETDEFGATEWAY);
+		    break;
+
+		case SIOCSIFMTU:
+		    ret = SetInterfaceAttributes(aParam, EACCESS_SETMTU);
+		    break;
+		 case SIOCENUMROUTES:
+            ret = EnumerateRoutes(aParam);
+            break;
+		 case SIOCSETDNSSUFFIX:
+		     ret = SetInterfaceAttributes(aParam, EACCESS_SETDNSSUFFIX);
+			 break;
+		 case SIOCGETDNSSUFFIX:
+		     ret = GetInterfaceAttributes(aParam, EACCESS_GETDNSSUFFIX);
+		     break;
+		 case SIOCSNAMESERVER:
+		     ret = SetNameServer(aParam,EACCESS_SETNAMESERVERS );
+		     break;
+		 case SIOCGNAMESERVER:
+		     ret = GetNameServer(aParam, EACCESS_GETNAMESERVERS);
+             break;
 		default:
 			ret=KErrNotSupported;
 			break;
@@ -1017,7 +1051,7 @@
 
     return CSockDescBase::Fcntl(anArg, aCmd);
 	}
-
+/*
 TInt CSocketDesc :: GetIpAddress( void *aParam )
 	{
 	TInetAddr myAddr;
@@ -1031,7 +1065,7 @@
 	ifreq *ifr = (ifreq *)aParam;
 	((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr.s_addr = myIP;
 	return KErrNone;
-	}
+	}*/
 
 TInt CSocketDesc :: GetRemoteIpAddress( void *aParam )
 	{
@@ -1184,279 +1218,310 @@
 	CleanupStack::PopAndDestroy(iapDatabase);	
 	return;
 	}
+#endif // __SYMBIAN_COMPILE_UNUSED__
 
-TInt CSocketDesc :: SetInterfaceDetails( void *aParam ,TInt aFlag, TInt aType )
+
+
+TInt CSocketDesc::GetInterfaceInfo(TSoInetInterfaceInfo& aIfInfo, TInt aIapId )
 	{
-	ifreq *ifr = (ifreq *)aParam;
-	TPckgBuf<TSoInetIfQuery> ifq;
-	TBuf8 <25> ipBuf8;
-	TName aBuf;			
+	 TPckgBuf<TSoInetInterfaceInfo> info;		
 	TInt ret = KErrNone;
 	ATOMICSOCKETOP( ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl), ret = KErrBadHandle )
 	if (ret != KErrNone)
 		{
 		return KErrGeneral;
 		}    	
-	TPckgBuf<TSoInet6InterfaceInfo> info;
-	TSoInet6InterfaceInfo &in = info();	
 	ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle )
 	while(ret == KErrNone)
 		{			
-		if(info().iName != _L("") && info().iName != _L("loop6") && info().iName != _L("loop4"))
-			{   			
-			TDes16& aName = info().iName;							
-			if( ((aFlag == 0 ) && ( aName.FindC(_L("WLAN")) != KErrNotFound )) ||
-					((aFlag == 1) && (aName.FindC(_L("Generic")) != KErrNotFound )) )
+		if(info().iName != _L(""))
+            {   			
+            TPckgBuf<TSoInetIfQuery> optifquery;
+            optifquery().iName = info().iName;
+			ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, optifquery), ret = KErrBadHandle )
+            if( ret  == KErrNone)
+                {
+                if(optifquery().iZone[1] == aIapId && info().iAddress.Address() != NULL)
+                	{
+                    aIfInfo = info();
+                	return KErrNone;
+                	}
+                }
+            }
+			ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle )
+        }
+    return KErrNotFound;
+	}
+TInt CSocketDesc :: SetInterfaceDetails( void *aParam ,TInt /*aFlag*/, TInt aType, TInt aIapId )
+	{
+	TSoInet6InterfaceInfo ifInfo; 
+	TInt ret = KErrNone;
+	if((ret = GetInterfaceInfo(ifInfo,aIapId)) != KErrNone)
+		{
+		return ret;
+		}
+    ifreq *ifr = (ifreq *)aParam;
+	switch(aType)
+		{				
+		case  EACCESS_SETMETRIC:
+			if(ifInfo.iState == EIfUp)										 
 				{
-				switch(aType)
-					{				
-					case  EACCESS_SETMETRIC:
-						if(info().iState == EIfUp)										 
-							{
-							info().iSpeedMetric =  ifr->ifr_metric;
-							}
-						goto setout;
-
-					case  EACCESS_SETMTU:										 
-						if(info().iState == EIfUp)
-							{
-							info().iMtu = ifr->ifr_mtu ;		
-							}		
-						goto setout;
+				ifInfo.iSpeedMetric =  ifr->ifr_metric;
+				}
+			break;
 
-					case  EACCESS_SETNETMASK :																																																					
-						// Presently netmask address is NULL											
-						if((info().iState == EIfUp) && (ifr->ifr_addr.sa_data !=NULL))
-							{																																																		
-							/*
-							CharToTBuf8(ifr->ifr_addr.sa_data,ipBuf8);											
-											if (CnvUtfConverter::ConvertToUnicodeFromUtf8( aBuf,ipBuf8 ) == KErrNone)
-											{													
-												ret = info().iNetMask.Input(aBuf);												
-											}																							
-							info().iNetMask.SetAddress(INET_ADDR(255,255,255,0));	
-							*/
-							return KErrNotSupported;
-							}
-						break;	
-					case  EACCESS_SETBROADCAST :										
-						if((info().iState == EIfUp) && (ifr->ifr_broadaddr.sa_data !=NULL))
-							{																																																		
-							/*CharToTBuf8(ifr->ifr_broadaddr.sa_data,ipBuf8);											
-											if (CnvUtfConverter::ConvertToUnicodeFromUtf8( aBuf,ipBuf8 ) == KErrNone)
-											{													
-												ret = info().iBrdAddr.Input(aBuf);												
-											} 
-							*/												
-							return KErrNotSupported;
-							}
+		case  EACCESS_SETMTU:										 
+			if(ifInfo.iState == EIfUp)
+				{
+				ifInfo.iMtu = ifr->ifr_mtu ;		
+				}		
+			break;
 
-						break;
-					case  EACCESS_SETPHYSADDR :										
-						// Currently no imeplentation is given as KIfHasHardwareAddr is always 
-						// set to 0 for wlan and GPRS
-						if(info().iFeatures&KIfHasHardwareAddr)
-							{
-							return KErrNotSupported;
-							}
-						break;									
-					case  EACCESS_SETFLAGS :										
-						info().iFeatures = 0;
-						// Interface UP
-						if((ifr->ifr_flags & IFF_UP) && (ifr->ifr_flags & IFF_DRV_RUNNING)) 
-							{
-							info().iState = EIfUp;																						
-							}																						
-						else
-							{
-							info().iState = EIfDown;																																	
-							}																																	
+		case  EACCESS_SETPHYSADDR :										
+			// Currently no imeplentation is given as KIfHasHardwareAddr is always 
+			// set to 0 for wlan and GPRS
+			if(ifInfo.iFeatures&KIfHasHardwareAddr)
+				{
+				return KErrNotSupported;
+				}
+			break;							
+		case EACCESS_SETDNSSUFFIX:
+			{
+			if_dns_suffixes * dns_suffix = static_cast<if_dns_suffixes *>(aParam);
+			char **suffixes = dns_suffix->suffixes;
+			TSoInetInterfaceInfoExtnDnsSuffix interfaceInfo;
+			(TSoInetInterfaceInfo &)interfaceInfo = ifInfo;
+			interfaceInfo.iDomainSuffix.DeleteAll();
+            TPckgBuf<TSoInetInterfaceInfoExtnDnsSuffix> configInfo(interfaceInfo);
 
-						// Loopback										
-						if(ifr->ifr_flags & IFF_LOOPBACK)
-							{
-							info().iFeatures |= KIfIsLoopback;																				            													           
-							}																				            													           
+			ATOMICSOCKETOP(ret = iSocket.SetOpt(KSoInetConfigInterface,KSolInetIfCtrl,configInfo), ret = KErrBadHandle)
 
-						// point to point support
-						if(ifr->ifr_flags &  IFF_POINTOPOINT)
-							{
-							info().iFeatures |= KIfIsPointToPoint; 							                
-							} 							                
-
-						// Broadcast
-						if(ifr->ifr_flags & IFF_BROADCAST)
-							{
-							info().iFeatures |=KIfCanBroadcast; 
-							} 
-
+			for(int i = 0; suffixes[i]; i++)  //check the number of suffixes that can be configured
+				{
+				TPtrC8 suffix((const unsigned char *)suffixes[i]); 
+				/*ret = configInfo().iDomainSuffix.Copy(suffix);
+				if(ret != KErrNone)
+				    {
+                    return ret;
+				    }*/
+				ret = CnvUtfConverter::ConvertToUnicodeFromUtf8(configInfo().iDomainSuffix.iSuffixName,suffix);
+				configInfo().iDomainSuffix.iDomainSuffixFunction = EInetAddSuffix;
+               ATOMICSOCKETOP( ret = iSocket.SetOpt(KSoInetConfigInterface,KSolInetIfCtrl,configInfo), ret = KErrBadHandle)
+                if(ret != KErrNone)
+                    {
+                    return ret;
+                    }
+				
+				}
+			return ret;
+			}
+		case EACCESS_SETNAMESERVERS:
+			{
+			if_name_servers *name_server = static_cast<if_name_servers*>(aParam);
+			if((ret = ConvertSockToTInetAddr(&name_server->nameserver1,ifInfo.iNameSer1)) != KErrNone)
+				{
+				return ret;
+				}
+			if((ret = ConvertSockToTInetAddr(&name_server->nameserver2,ifInfo.iNameSer2)) != KErrNone)
+				{
+				return ret;
+				}
+			break;
+			}
 
-						// Multicast
-						if(ifr->ifr_flagshigh & IFF_MULTICAST)
-							{
-							info().iFeatures = KIfCanMulticast;							            	      
-							}
-						//these flags details are available in symbian but not used by lib layer.
-						/* if(info().iFeatures&KIfCanSetMTU)			            	
-							               if(info().iFeatures&KIfHasHardwareAddr)    
-							               if(info().iFeatures&KIfCanSetHardwareAddr) */
-						goto setout;							            	
-
-					default:
-						break;					 
-					}
-				}
-
-			}
-		ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle )
+		default:
+			return KErrArgument;					 
 		}
-	setout:	
-	TPckgBuf<TSoInet6InterfaceInfo> changeToNew(info());
-	ATOMICSOCKETOP(ret = iSocket.SetOpt(KSoInetConfigInterface, KSolInetIfCtrl,changeToNew), return KErrBadHandle )
+	TPckgBuf<TSoInet6InterfaceInfo> pkgIfInfo(ifInfo);
+	ATOMICSOCKETOP(ret = iSocket.SetOpt(KSoInetConfigInterface, KSolInetIfCtrl,pkgIfInfo), ret = KErrBadHandle)
 	return ret;
 	}
-#endif // __SYMBIAN_COMPILE_UNUSED__
 
-TInt CSocketDesc::GetInterfaceDetails( void *aParam ,TInt aFlag, TInt aType )
+//This function frees the memory allocated by SIOCGETDNSSUFFIX ioctl
+void CSocketDesc::FreeDNSSuffixes(char ** suffixes)
+    {
+    for(int i = 0; suffixes[i]; i++)
+        {
+        delete[] suffixes[i];
+        }
+    delete[] suffixes;
+    }
+
+TInt CSocketDesc::GetInterfaceDetails( void *aParam ,TInt /*aFlag*/, TInt aType, TInt aIapId )
 	{
-	TPckgBuf<TSoInetIfQuery> ifq;
 
-	TInt ret = KErrNone; 
-	ATOMICSOCKETOP( ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl), ret = KErrBadHandle )
-	if (ret != KErrNone)
+	ifreq *ifr = (ifreq *)aParam;
+	*(ifr->ifr_addr.sa_data) = '\0';
+    TInt ret = 0;
+
+    TSoInetInterfaceInfo ifInfo; 
+
+	if((ret = GetInterfaceInfo(ifInfo,aIapId)) != KErrNone)
 		{
-		return KErrGeneral;
+		return ret;
 		}
-	
-	ifreq *ifr = (ifreq *)aParam;
-    *(ifr->ifr_addr.sa_data) = '\0';
 
-	TPckgBuf<TSoInetInterfaceInfo> info;
-	ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle )
-	while( ret == KErrNone)
+	switch(aType)
 		{
 
-		if(info().iName != _L("") && info().iName != _L("loop6") && info().iName != _L("loop4"))
-			{   
-			TDes16& aName = info().iName;
-			TName aBuf;
-			TBuf8<KMaxName> ipAddr;
-			if( ((aFlag == 0 ) && ( aName.FindC(_L("WLAN")) != KErrNotFound )) ||
-					((aFlag == 1) && (aName.FindC(_L("Generic")) != KErrNotFound )) )
+		case  EACTIVE_GETIP :
+			if(ifInfo.iState == EIfUp)
+				{
+				ret = ConvertTInetToSockAddr(ifInfo.iAddress,&ifr->ifr_addr);
+				return ret;
+				}
+			break;
+		case  EACCESS_GETMETRIC:
+			if(ifInfo.iState == EIfUp)
+				{
+				ifr->ifr_metric = ifInfo.iSpeedMetric;
+				return KErrNone;
+				}
+			break;
+		case  EACCESS_GETMTU:
+			if(ifInfo.iState == EIfUp)
 				{
-				switch(aType)
-					{
-
-					case  EACTIVE_GETIP :
-						if((info().iState == EIfUp) && (info().iAddress.Address() != NULL))
-							{
-							if(!((info().iAddress.IsLinkLocal()) || (info().iAddress.IsSiteLocal())))
-								{
-								info().iAddress.Output(aBuf);  
-								if (CnvUtfConverter::ConvertFromUnicodeToUtf8( ipAddr, aBuf ) == KErrNone)
-									{			
-									StrlCopy(ifr->ifr_addr.sa_data,(const char *) ipAddr.PtrZ(),ipAddr.Length()+1);														
-									}  
-								}
-							}
-						break;
-					case  EACCESS_GETMETRIC:
-						ifr->ifr_metric = 0;
-						if (info().iState == EIfUp)
-							{
-							ifr->ifr_metric = info().iSpeedMetric;
-							}
-						break;
-					case  EACCESS_GETMTU:
-						ifr->ifr_mtu = 0;
-						if (info().iState == EIfUp)
-							{
-							ifr->ifr_mtu = info().iMtu;
-							}
-						break;	
-					case  EACCESS_GETNETMASK :
-						*(ifr->ifr_addr.sa_data) = '\0';
-						// Presently netmask address is NULL
-						if((info().iState == EIfUp) && (info().iNetMask.Address() != NULL))
-							{
-							//anAddr = info().iNetMask.Address();	
-							info().iNetMask.Output(aBuf);  
-							if (CnvUtfConverter::ConvertFromUnicodeToUtf8( ipAddr, aBuf ) == KErrNone)
-								{			
-								StrlCopy(ifr->ifr_addr.sa_data,(const char *) ipAddr.PtrZ(),ipAddr.Length()+1);												
-								}  											
-							}
-						break;	
-					case  EACCESS_GETBROADCAST :
-						*(ifr->ifr_broadaddr.sa_data) = '\0';
-						// Presently Breaodcast address is NULL
-						if((info().iState == EIfUp) && (info().iBrdAddr.Address() != NULL))
-							{
+				ifr->ifr_mtu = ifInfo.iMtu;
+				return KErrNone;
+				}
+			break;	
+		case  EACCESS_GETNETMASK :
+			// Presently netmask address is NULL
+			if(ifInfo.iState == EIfUp)
+				{
+				ret = ConvertTInetToSockAddr(ifInfo.iNetMask,&ifr->ifr_addr);
+				return ret;
+				}
+			break;	
+		case  EACCESS_GETBROADCAST :
+			// Presently Breaodcast address is NULL
+			if(ifInfo.iState == EIfUp)
+				{
+				ret = ConvertTInetToSockAddr(ifInfo.iBrdAddr,&ifr->ifr_broadaddr);
+				return ret;
+				}
+			break;
+		case EACCESS_GETDNSSUFFIX:
+		    {
 
-							//anAddr = info().iBrdAddr.Address();	
-							info().iBrdAddr.Output(aBuf);  
-							if (CnvUtfConverter::ConvertFromUnicodeToUtf8( ipAddr, aBuf ) == KErrNone)
-								{			
-								StrlCopy(ifr->ifr_broadaddr.sa_data,(const char *) ipAddr.PtrZ(),ipAddr.Length()+1);												
-								}											
-							}
-						break;
-					case  EACCESS_GETPHYSADDR :
-						ifr->ifr_phys = 0;
-						// Currently no imeplentation is given as KIfHasHardwareAddr is always 
-						// set to 0 for wlan and GPRS
-						if(info().iFeatures&KIfHasHardwareAddr)
-							{
-							//nada.
-							}
-						break;									
-					case  EACCESS_GETFLAGS :
-						ifr->ifr_flags = 0;
-						ifr->ifr_flagshigh=0;
-						// Interface UP
-						if(info().iState == EIfUp)
-							{
-							ifr->ifr_flags |= IFF_UP; 
-							ifr->ifr_flags |= IFF_DRV_RUNNING;
-							}
-						// Loopback
-						if(info().iFeatures&KIfIsLoopback)
-							{
-							ifr->ifr_flags |= IFF_LOOPBACK;
-							}										            													           
+		    TInetSuffix data;
+		    TPckgBuf<TInetSuffix> opt(data);
+		    // Set the option to start enumeration of domain suffix on the active interface
+			TInt err = KErrNone;
+		    ATOMICSOCKETOP( err = iSocket.SetOpt(KSoInetEnumDomainSuffix, KSolInetIfCtrl), err = KErrBadHandle) 
+		    if(err != KErrNone) 
+		        {
+		        return err;
+		        }
+		    struct if_dns_suffixes * dns_suffix = static_cast<if_dns_suffixes *>(aParam);
+		    RPointerArray<char> suffixArray;
+			ATOMICSOCKETOP (err = iSocket.GetOpt(KSoInetNextDomainSuffix, KSolInetIfCtrl, opt),err = KErrBadHandle)
+		    while(err == KErrNone)
+		        {
+                char *suffix = new char[opt().iSuffixName.Length()+1];
+                if((ret = suffixArray.Append(suffix)) != KErrNone)
+                    {
+                    suffixArray.ResetAndDestroy();
+                    return ret;
+                    }
+                TPtr8 ptr((unsigned char *)suffix,opt().iSuffixName.Length()+1);
+                ret = CnvUtfConverter::ConvertFromUnicodeToUtf8(ptr,opt().iSuffixName);
+                //ptr.Copy(opt().iSuffixName);
+                if(ret != KErrNone)
+                    {
+                    suffixArray.ResetAndDestroy();
+                    return ret;
+                    }
+                ptr.ZeroTerminate();
+				ATOMICSOCKETOP (err = iSocket.GetOpt(KSoInetNextDomainSuffix, KSolInetIfCtrl, opt),err = KErrBadHandle)
+		    	}
+
+		    dns_suffix->suffixes = new char*[suffixArray.Count() + 1];
+		    for(int i = 0 ; i< suffixArray.Count(); i++)
+		    	{
+                dns_suffix->suffixes[i] = suffixArray[i];
+		    	}
+            dns_suffix->suffixes[suffixArray.Count()] = NULL;
+            suffixArray.Close();
+            return KErrNone;
 
-						// point to point support
-						if(info().iFeatures&KIfIsPointToPoint) 
-							{
-							ifr->ifr_flags |= IFF_POINTOPOINT;	
-							}
-						
-						// Broadcast
-						if(info().iFeatures&KIfCanBroadcast)
-							{
-							ifr->ifr_flags |= IFF_BROADCAST;
-							}      
+		}
+			
+		case EACCESS_GETNAMESERVERS:
+			{
+			if_name_servers *name_server = static_cast<if_name_servers*>(aParam);
+			if((ret = ConvertTInetToSockAddr(ifInfo.iNameSer1, &name_server->nameserver1)) != KErrNone)
+				{
+				return ret;
+				}
+			if((ret = ConvertTInetToSockAddr(ifInfo.iNameSer2, &name_server->nameserver2)) != KErrNone)
+				{
+				return ret;
+				}
+			return KErrNone;
+
+			}
+
+		case  EACCESS_GETPHYSADDR :
+			ifr->ifr_phys = 0;
+			// Currently no imeplentation is given as KIfHasHardwareAddr is always 
+			// set to 0 for wlan and GPRS
+			if(ifInfo.iFeatures&KIfHasHardwareAddr)
+				{
+				//nada.
+				}
+			return KErrNotSupported;
 
-						// Multicast
-						if(info().iFeatures&KIfCanMulticast)
-							{
-							ifr->ifr_flagshigh |= ((IFF_MULTICAST & 0xff00) >> 8);
-							}
-						//these flags details are available in symbian but not used by lib layer.
-						/* if(info().iFeatures&KIfCanSetMTU)			            	
-							               if(info().iFeatures&KIfHasHardwareAddr)    
-							               if(info().iFeatures&KIfCanSetHardwareAddr) */
+		case EACCESS_GETDEFGATEWAY:
+			if(ifInfo.iState == EIfUp)
+				{
+				ret = ConvertTInetToSockAddr(ifInfo.iDefGate,&ifr->ifr_defgatewayaddr);
+				return ret;
+				}
+			break;
+
 
-						break;																 				 
-				 
-					}
+		case  EACCESS_GETFLAGS :
+			ifr->ifr_flags = 0;
+			ifr->ifr_flagshigh=0;
+			// Interface UP
+			if(ifInfo.iState == EIfUp)
+				{
+				ifr->ifr_flags |= IFF_UP; 
+				ifr->ifr_flags |= IFF_DRV_RUNNING;
+				}
+			// Loopback
+			if(ifInfo.iFeatures&KIfIsLoopback)
+				{
+				ifr->ifr_flags |= IFF_LOOPBACK;
+				}										            													           
+
+			// point to point support
+			if(ifInfo.iFeatures&KIfIsPointToPoint) 
+				{
+				ifr->ifr_flags |= IFF_POINTOPOINT;  
 				}
 
-			}
-		ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle )
+			// Broadcast
+			if(ifInfo.iFeatures&KIfCanBroadcast)
+				{
+				ifr->ifr_flags |= IFF_BROADCAST;
+				}      
+
+			// Multicast
+			if(ifInfo.iFeatures&KIfCanMulticast)
+				{
+				ifr->ifr_flagshigh |= ((IFF_MULTICAST & 0xff00) >> 8);
+				}
+			return KErrNone;
+
+		default:
+			return KErrArgument;                   
 		}
 
-	return KErrNone;	
+
+	return KErrNotFound;
+
 	}
 
 TInt CSocketDesc::Poll(TPollMode aMode,TBool& aReadyStatus,TInt& aErrno)
@@ -1673,7 +1738,7 @@
 				{
 				servFlag  = 1;	
 				}
-			GetInterfaceDetails(ifr,servFlag,EACTIVE_GETIP);
+			GetInterfaceDetails(ifr,servFlag,EACTIVE_GETIP,ref.iId);
 			}
 		}
 	ifc->ifc_len = sizeof(ifreq) * apIndex;
@@ -2246,3 +2311,154 @@
     ifr->ifr_index  = opt().iZone[1]; //IAP_ID
     return KErrNone;
     }
+
+
+TInt CSocketDesc::GetActiveInterfaceIAPIdByName(const char *aIapName,TInt& aIapId)
+    {
+
+    TInt rcIndex = 0;
+    RConnection *rc;
+    TAccessPointRecord tempRecord;
+    char iapName[IFNAMSIZ];
+    TInt ret = KErrNotFound;
+//    ifreq * ifr = static_cast<ifreq *> (aParam); //may not work, will have to reinterper_cast
+
+    while(((CFileTable*)iFids)->RConnectionAt(rcIndex++, rc) == KErrNone)
+        {
+        if( GetRConnectionDetails(rc, tempRecord) != KErrNone )
+            {
+            continue;
+            }
+        TPtr8 ptr((TText8*)iapName, IFNAMSIZ-1);  
+
+        ret = CnvUtfConverter::ConvertFromUnicodeToUtf8(ptr, tempRecord.iName);
+        if(ret == KErrNone)
+            {
+           ptr.ZeroTerminate();
+            if(StrCmp(iapName, aIapName) == 0)
+                {
+                aIapId = tempRecord.iId;
+                return KErrNone; 
+                }
+            }
+        }
+    return ret;  //is it okay? ret contains rite val?
+    }
+//converts Symbian Inetaddres structure to posix sockaddr structure
+TInt CSocketDesc::ConvertTInetToSockAddr(const TInetAddr& aInetAddr, sockaddr * aSockAddr )
+    {
+    TUSockAddr addr(aInetAddr); 
+    unsigned long len = sizeof(sockaddr);
+    addr.Get(aSockAddr,&len);
+    return addr.iError;
+    }
+
+//converts posix sockaddr structure to Symbian Inetaddres structure 
+TInt CSocketDesc::ConvertSockToTInetAddr(const sockaddr * aSockAddr, TInetAddr& aInetAddr)
+    {
+    unsigned int len = sizeof(sockaddr);
+    TUSockAddr addr(aSockAddr,len);  
+    aInetAddr =  addr;
+    return addr.iError;
+    }
+
+//Gets the Iap id by IAP name and using iap id gets the interface details
+TInt CSocketDesc::GetInterfaceAttributes(void *aParam, int aFlag)
+    {
+    ifreq * ifr = static_cast<ifreq *> (aParam); //may not work, will have to reinterper_cast
+    TInt ret = KErrGeneral, iapId;
+    ret = GetActiveInterfaceIAPIdByName(ifr->ifr_name,iapId);
+    if(ret == KErrNone)
+        {
+        ret = GetInterfaceDetails( ifr ,0, aFlag, iapId);  //what to do with return value
+        }
+    return ret;
+        
+    }
+
+//Gets the Iap id by IAP name and using iap id sets the interface details
+TInt CSocketDesc::SetInterfaceAttributes(void *aParam, int aFlag)
+    {
+    ifreq * ifr = static_cast<ifreq *> (aParam); //access of only if_name guaranteed to work.
+    TInt ret = KErrGeneral, iapId;
+    ret = GetActiveInterfaceIAPIdByName(ifr->ifr_name,iapId);
+    if(ret == KErrNone)
+        {
+        ret = SetInterfaceDetails( aParam ,0, aFlag, iapId);  //what to do with return value
+        }
+    return ret;
+    }
+
+//Enumerates the routes configured on the system	
+TInt CSocketDesc::EnumerateRoutes(void *aParam)
+    {
+    TInt ret = KErrNone;
+    rtconf *rtc = (rtconf*)aParam;
+    TInt routeCount = (rtc->rt_len) /sizeof (route_entry);
+    route_entry *rtentry = rtc->rtc_rtcu.rtcu_entry;
+    ATOMICSOCKETOP(ret =  iSocket.SetOpt(KSoInetEnumRoutes, KSolInetRtCtrl),ret = KErrBadHandle)
+    if(ret != KErrNone )
+        {
+        return ret;
+        }
+    //If the length is zero, we fill the number of routes available information
+    TInt count = 0;
+    TPckgBuf<TSoInetRouteInfo> route;
+    if(routeCount <=0 || rtc->rtc_buf ==NULL)
+        {
+		ATOMICSOCKETOP(ret = iSocket.GetOpt(KSoInetNextRoute, KSolInetRtCtrl, route), ret = KErrBadHandle)
+        while(ret == KErrNone)
+        	{
+        	count++;
+			ATOMICSOCKETOP(ret = iSocket.GetOpt(KSoInetNextRoute, KSolInetRtCtrl, route), ret = KErrBadHandle)
+        	}
+        rtc->rt_len = count * sizeof(route_entry) ;
+        return KErrNone;
+        }
+    for(TInt i=0; i<routeCount ; i++) 
+    	{
+		ATOMICSOCKETOP(ret = iSocket.GetOpt(KSoInetNextRoute, KSolInetRtCtrl, route),ret = KErrBadHandle)
+    	if(ret != KErrNone)
+    		{
+    		break;
+    		}	
+    	ConvertTInetToSockAddr(route().iDstAddr, &rtentry[i].dst_addr);
+    	ConvertTInetToSockAddr(route().iIfAddr, &rtentry[i].ifaddr);
+    	ConvertTInetToSockAddr(route().iGateway, &rtentry[i].gateway_addr);
+    	ConvertTInetToSockAddr(route().iNetMask, &rtentry[i].dst_netmask);
+    	TInt state = route().iState;
+    	TInt type = route().iType;
+    	rtentry[i].rt_metric = route().iMetric;
+    	rtentry[i].rt_flags.state = state;
+    	rtentry[i].rt_flags.type = type;
+
+    	}
+
+    return KErrNone;    
+    }
+
+//Sets the nameserver of an interface
+TInt CSocketDesc::SetNameServer(void *aParam, int aFlag)
+    {
+    if_name_servers * dns_server = static_cast<if_name_servers *> (aParam); //access of only if_name guaranteed to work.
+    TInt iapId;
+    TInt ret = GetActiveInterfaceIAPIdByName(dns_server->if_name, iapId);
+    if(ret == KErrNone)
+        {
+        ret = SetInterfaceDetails( aParam ,0, aFlag, iapId);  //what to do with return value
+        }
+    return ret;
+    }
+
+//Gets the nameserver of an interface
+TInt CSocketDesc::GetNameServer(void *aParam, int aFlag)
+    {
+    if_name_servers * dns_server = static_cast<if_name_servers *> (aParam); //access of only if_name guaranteed to work.
+    TInt iapId;
+    TInt ret = GetActiveInterfaceIAPIdByName(dns_server->if_name, iapId);
+    if(ret == KErrNone)
+        {
+        ret = GetInterfaceDetails( dns_server ,0, aFlag, iapId);  //what to do with return value
+        }
+    return ret;     
+    }
--- a/genericopenlibs/openenvcore/backend/src/corebackend/usocketbase.cpp	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/src/corebackend/usocketbase.cpp	Wed Sep 15 14:02:55 2010 +0300
@@ -114,7 +114,7 @@
 		{
 		ATOMICSOCKETOP(iSocket.Send(aBuf.Mid(bytesWritten), 0, tempStatus, len),Complete(tempStatus,KErrBadHandle))		
 		User::WaitForRequest(tempStatus);			
-		if (len() == 0)
+		if (len() == 0 || tempStatus.Int() == KErrDisconnected )
 			{
 			break;
 			}
--- a/genericopenlibs/openenvcore/include/net/if.h	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/include/net/if.h	Wed Sep 15 14:02:55 2010 +0300
@@ -277,7 +277,8 @@
 		struct	sockaddr ifru_addr;
 		struct	sockaddr ifru_dstaddr;
 		struct	sockaddr ifru_broadaddr;
-		struct sockaddr ifru_hwaddr;		
+		struct sockaddr ifru_hwaddr;
+		struct sockaddr ifru_defgatewayaddr;
 		short	ifru_flags[2];
 		short	ifru_index;
 		int	ifru_metric;
@@ -304,6 +305,7 @@
 #define	ifr_reqcap	ifr_ifru.ifru_cap[0]	/* requested capabilities */
 #define	ifr_curcap	ifr_ifru.ifru_cap[1]	/* current capabilities */
 #define	ifr_index	ifr_ifru.ifru_index	/* interface index */
+#define ifr_defgatewayaddr ifr_ifru.ifru_defgatewayaddr /* default gateway address*/
 };
 
 #define	_SIZEOF_ADDR_IFREQ(ifr) \
@@ -408,6 +410,25 @@
 IMPORT_C int unsetdefaultif();
 #endif
 
+#ifdef  __SYMBIAN32__
+
+#define MAXDNSSUFFIXES   16
+
+struct if_dns_suffixes
+{
+char if_name[IFNAMSIZ];
+char ** suffixes;
+};
+
+void freednssuffixes(struct if_dns_suffixes *);
+struct if_name_servers
+    {
+    char if_name[IFNAMSIZ];
+    struct sockaddr nameserver1;
+    struct sockaddr nameserver2;
+    };
+#endif
+
 #ifdef __SYMBIAN32__
 #ifdef __cplusplus
 }
--- a/genericopenlibs/openenvcore/include/net/route.h	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/include/net/route.h	Wed Sep 15 14:02:55 2010 +0300
@@ -138,6 +138,36 @@
 #endif //__SYMBIAN32__  
 };
 
+#ifdef __SYMBIAN32__
+struct rtconf
+    {
+    int rt_len; //size of the allocated buffer
+    union
+        {
+        caddr_t rtcu_buf;
+        struct route_entry * rtcu_entry;
+        }rtc_rtcu;
+#define rtc_buf rtc_rtcu.rtcu_buf   /* buffer address */
+#define rtc_req rtc_rtcu.rtcu_entry   /* array of structures returned */
+    };
+
+struct route_entry
+    {
+    struct sockaddr ifaddr;  //address of the interface
+    struct sockaddr dst_addr; //destination address
+    struct sockaddr  gateway_addr;
+    struct sockaddr dst_netmask;
+    struct
+        {
+        int state;
+        int type;
+        }rt_flags;
+    short int rt_metric;
+    char rt_dev[IFNAMSIZ]; //name of the interface
+    };
+#endif
+
+
 #define	RTF_UP		0x1		/* route usable */
 #define	RTF_GATEWAY	0x2		/* destination is a gateway */
 #define	RTF_HOST	0x4		/* host entry (net otherwise) */
--- a/genericopenlibs/openenvcore/include/sys/sockio.dosc	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/include/sys/sockio.dosc	Wed Sep 15 14:02:55 2010 +0300
@@ -98,3 +98,76 @@
 @released
 */
 
+/** @def SIOCGIFFLAGS
+Socket Ioctl option. Gets MAC address.
+
+@publishedAll
+@released
+*/
+
+/** @def SIOCGIFMTU
+
+Socket Ioctl option. Gets IF MTU .
+
+@publishedAll
+@released
+*/
+
+
+/** @def SIOCGIFNETMASK
+Socket Ioctl option. Gets net addr mask .
+
+@publishedAll
+@released
+*/
+
+/** @def SIOCGIFDEFGATEWAY
+Socket Ioctl option. Gets the default gateway of the interface .
+
+@publishedAll
+@released
+*/
+
+
+/** @def SIOCSIFMTU
+Socket Ioctl option. set IF mtu .
+
+@publishedAll
+@released
+*/
+
+/** @def SIOCENUMROUTES
+Socket Ioctl option. Enumerate routes .
+
+@publishedAll
+@released
+*/
+
+/** @def SIOCSETDNSSUFFIX
+Socket Ioctl option. Sets the dns suffixes of the interface  .
+
+@publishedAll
+@released
+*/
+
+/** @def SIOCGETDNSSUFFIX
+Socket Ioctl option. Gets the dns suffixes of the interface .
+
+@publishedAll
+@released
+*/
+
+/** @def SIOCSNAMESERVER
+Socket Ioctl option. Sets the name server on the interface .
+
+@publishedAll
+@released
+*/
+
+
+/** @def SIOCGNAMESERVER
+Socket Ioctl option. Get the name server on the interface .
+
+@publishedAll
+@released
+*/
\ No newline at end of file
--- a/genericopenlibs/openenvcore/include/sys/sockio.h	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/include/sys/sockio.h	Wed Sep 15 14:02:55 2010 +0300
@@ -53,7 +53,20 @@
 #define	SIOCGIFNUM			_IOR('i', 87, int)	/* get interface numbers */
 #define	SIOCADDRT	 _IOW('r', 12, struct rtentry)	/* add route */
 #define	SIOCDELRT	 _IOW('r', 13, struct rtentry)	/* delete route */
+#define SIOCENUMROUTES _IOWR('r', 14, struct rtentry)  /*enumerate routes*/
 #define	SIOCGIFHWADDR _IOW('s', 14, struct ifreq)	/* get MAC address*/
+#define SIOCGIFFLAGS    _IOWR('i', 17, struct ifreq)    /* get ifnet flags */
+#define SIOCGIFMTU  _IOWR('i', 51, struct ifreq)    /* get IF mtu */
+#define SIOCGIFNETMASK  _IOWR('i', 37, struct ifreq)    /* get net addr mask */
+#define SIOCSIFADDR  _IOW('i', 12, struct ifreq)    /* set ifnet address */
+#define SIOCSIFFLAGS     _IOW('i', 16, struct ifreq)    /* set ifnet flags */
+#define SIOCSIFMTU   _IOW('i', 52, struct ifreq)    /* set IF mtu */
+#define SIOCSIFNETMASK   _IOW('i', 22, struct ifreq)    /* set net addr mask */
+#define SIOCGIFDEFGATEWAY _IOWR('i',123,struct ifreq) /* get the default gateway of the interface */
+#define SIOCSETDNSSUFFIX _IOWR('i',124,struct if_dns_suffixes) /* set the dns suffixes of the interface */
+#define SIOCGETDNSSUFFIX _IOWR('i',125,struct if_dns_suffixes) /* get the dns suffixes of the interface */
+#define SIOCSNAMESERVER  _IOWR('i', 41, struct if_name_servers)  /*Set the name server on the interface */
+#define SIOCGNAMESERVER  _IOWR('i', 42, struct if_name_servers) /*Get the name server on the interface*/
 #else	// __SYMBIAN32__
 #define	SIOCSHIWAT	 _IOW('s',  0, int)		/* set high watermark */
 #define	SIOCGHIWAT	 _IOR('s',  1, int)		/* get high watermark */
--- a/genericopenlibs/openenvcore/libc/bwins/libcu.def	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/bwins/libcu.def	Wed Sep 15 14:02:55 2010 +0300
@@ -595,4 +595,6 @@
 	set_fmode @ 594 NONAME
 	get_fmode @ 595 NONAME
 	sigenable @ 596 NONAME
-  	unsetdefaultif @ 597 NONAME
+	unsetdefaultif @ 597 NONAME
+	freednssuffixes @ 598 NONAME
+
--- a/genericopenlibs/openenvcore/libc/bwins/old_libcu.def	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/bwins/old_libcu.def	Wed Sep 15 14:02:55 2010 +0300
@@ -595,4 +595,6 @@
 	set_fmode @ 594 NONAME
 	get_fmode @ 595 NONAME
 	sigenable @ 596 NONAME
- 	unsetdefaultif @ 597 NONAME
+	unsetdefaultif @ 597 NONAME
+	freednssuffixes @ 598 NONAME
+
--- a/genericopenlibs/openenvcore/libc/eabi/libcu.def	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/eabi/libcu.def	Wed Sep 15 14:02:55 2010 +0300
@@ -595,4 +595,6 @@
 	set_fmode @ 594 NONAME
 	get_fmode @ 595 NONAME
 	sigenable @ 596 NONAME
-  	unsetdefaultif @ 597 NONAME
+	unsetdefaultif @ 597 NONAME
+	freednssuffixes @ 598 NONAME
+
--- a/genericopenlibs/openenvcore/libc/eabi/old_libcu.def	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/eabi/old_libcu.def	Wed Sep 15 14:02:55 2010 +0300
@@ -595,4 +595,6 @@
 	set_fmode @ 594 NONAME
 	get_fmode @ 595 NONAME
 	sigenable @ 596 NONAME
-  	unsetdefaultif @ 597 NONAME
+	unsetdefaultif @ 597 NONAME
+	freednssuffixes @ 598 NONAME
+
--- a/genericopenlibs/openenvcore/libc/src/Fmscalls.cpp	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/src/Fmscalls.cpp	Wed Sep 15 14:02:55 2010 +0300
@@ -333,6 +333,10 @@
 	}
 
 
+EXPORT_C void freednssuffixes(if_dns_suffixes * suffixes)
+    {
+    return Backend()->freednssuffixes(suffixes);
+    }
 
 /*
 Gets the path name of the current working directory.
--- a/genericopenlibs/openenvcore/libc/src/timefuncs.cpp	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/src/timefuncs.cpp	Wed Sep 15 14:02:55 2010 +0300
@@ -221,7 +221,12 @@
     TDateTime tdt = time.DateTime();
     
     //enable the cache
-    CTzConverter* ctzConverter = CTzConverter::NewL(Backend()->TZServer());
+	TInt status = KErrNone;
+	RTz& rtzServer = Backend()->TZServer(status);
+	if(status != KErrNone)
+		User::Leave(status);
+
+    CTzConverter* ctzConverter = CTzConverter::NewL(rtzServer);
     
     CleanupStack::PushL(ctzConverter);
     if(ctzConverter->ConvertToLocalTime(time) == KErrNone)      
@@ -243,7 +248,7 @@
         CleanupStack::PushL(zoneid);
         
         atmStruct->tm_isdst  = -1;
-        UpdateDstAndTznameL(Backend()->TZServer(), *zoneid, atmStruct, time, Utime, tdt, ETzWallTimeReference);
+        UpdateDstAndTznameL(rtzServer, *zoneid, atmStruct, time, Utime, tdt, ETzWallTimeReference);
         CleanupStack::PopAndDestroy(zoneid);
         }   
     
@@ -280,8 +285,12 @@
         return;
         }
 
+	TInt status = KErrNone;
+	RTz& rtzServer = Backend()->TZServer(status);
+	if(status != KErrNone)
+		User::Leave(status);
 
-    CTzConverter* ctzConverter = CTzConverter::NewL(Backend()->TZServer());      
+    CTzConverter* ctzConverter = CTzConverter::NewL(rtzServer);      
     CleanupStack::PushL(ctzConverter);
  /* Following fields are updated if successful:
   * tm_wday
@@ -305,7 +314,7 @@
         CleanupStack::PushL(zoneid);
 
         aTmStruct->tm_isdst  = -1;
-        UpdateDstAndTznameL(Backend()->TZServer(), *zoneid, aTmStruct, oldTime, time, tdt, ETzUtcTimeReference);
+        UpdateDstAndTznameL(rtzServer, *zoneid, aTmStruct, oldTime, time, tdt, ETzUtcTimeReference);
         CleanupStack::PopAndDestroy(zoneid);
         }
     cachetm = *aTmStruct;
--- a/genericopenlibs/openenvcore/libc/test/testifioctls/data/tifioctls.ini	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/test/testifioctls/data/tifioctls.ini	Wed Sep 15 14:02:55 2010 +0300
@@ -41,3 +41,17 @@
 Param1 = eth[0x000000]
 [SectionNullIFName]
 Param1 = \0
+
+[SectionIAPDetails]
+IAPName = Ethernet with Daemon Dynamic IP
+
+[SectionSetIfDNSSuffix]
+DNSSuffix0 = noe.nokia.com
+DNSSuffix1 = apac.nokia.com
+DNSSuffix2 = symbian.intra	
+Hostname1 = uklondabs02
+Hostname2 = uklondabs02.symbian.intra
+
+[SectionSetIfNameServer]
+NameServer1 = 172.30.251.135
+NameServer2 = 172.30.251.142
--- a/genericopenlibs/openenvcore/libc/test/testifioctls/inc/tifioctls.h	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/test/testifioctls/inc/tifioctls.h	Wed Sep 15 14:02:55 2010 +0300
@@ -43,6 +43,15 @@
 _LIT(KTestMacAddressNegative1, "TestMacAddressNegative1");
 _LIT(KTestioctlfile, "Testioctlfile");
 _LIT(KTestioctl1, "Testioctl1");
+_LIT(KTestioctlGetIfIpAddr, "TestGetIfIPAddr");
+_LIT(KTestioctlGetIfAttributes, "TestGetIfAttributes");
+_LIT(KTestioctlSetIfAttributes, "TestSetIfAttributes");
+_LIT(KTestioctlSetIfDNSSuffix, "TestSetIfDNSSuffix");
+_LIT(KTestioctlGetIfDNSSuffix, "TestGetIfDNSSuffix");
+_LIT(KTestRouteIoctl, "TestRouteIoctl");
+_LIT(KTestNumberOfRoutesIoctl, "TestNumberOfRoutesIoctl");
+_LIT(KTestSetNameServers, "TestSetNameServers");
+_LIT(KTestGetNameServers, "TestGetNameServers");
 
 
 class CTestIfioctls : public CTestStep
@@ -75,7 +84,20 @@
 	TInt TestMacAddressNegative1();
 	TInt Testioctlfile();
 	TInt Testioctl1();
-	
+	TInt TestGetIfIPAddr();
+	TInt GetIapName(char * aIapName,int len);
+	TInt StartIap(const char *aIapName, int &fd);
+	TInt TestGetIfAttributes();
+	void printFlags(TInt flags);
+	TInt TestSetIfAttributes();
+	void FreeDnsSuffixes(char ** suffixes);
+	TInt TestSetIfDNSSuffix();
+	TInt TestGetIfDNSSuffix();	
+	TInt TestRouteIoctl();
+	TInt TestNumberOfRoutesIoctl();
+	TInt TestSetNameServers();
+	TInt TestGetNameServers();
+
 	// util function
 	void ReadStringParam(char* aString);
 public:
--- a/genericopenlibs/openenvcore/libc/test/testifioctls/scripts/tifioctls.script	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/test/testifioctls/scripts/tifioctls.script	Wed Sep 15 14:02:55 2010 +0300
@@ -112,3 +112,71 @@
 RUN_TEST_STEP !Result=0 50 tifioctls Testioctl1
 END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0021
 
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0022
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0022
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestGetIfIPAddr \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0022
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0023
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0023
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestGetIfAttributes \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0023
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0024
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0024
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestSetIfAttributes \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0024
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0025
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0025
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 100 tifioctls TestSetIfDNSSuffix \tstdapis\tifioctls.ini  SectionSetIfDNSSuffix
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0025
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0026
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0026
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestGetIfDNSSuffix \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0026
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0027
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0027
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestRouteIoctl \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0027
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0028
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0028
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestNumberOfRoutesIoctl \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0028
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0029
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0029
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestGetNameServers \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0029
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0030
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0030
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestSetNameServers \tstdapis\tifioctls.ini SectionSetIfNameServer
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0030
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0031
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0031
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestGetNameServers \tstdapis\tifioctls.ini SectionSetIfNameServer
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0031
+
+
+
+
+
+
+
+
+
--- a/genericopenlibs/openenvcore/libc/test/testifioctls/scripts/tifioctls_hw.script	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/test/testifioctls/scripts/tifioctls_hw.script	Wed Sep 15 14:02:55 2010 +0300
@@ -53,31 +53,31 @@
 START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLSHW-0008
 //! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLSHW-0008
 //! @SYMTestStatus 	3.Released
-RUN_TEST_STEP !Result=0 5 tifioctls TestIfNameIndex
+RUN_TEST_STEP !Result=0 10 tifioctls TestIfNameIndex
 END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLSHW-0008
 
 START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLSHW-0009
 //! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLSHW-0009
 //! @SYMTestStatus 	3.Released
-RUN_TEST_STEP !Result=0 5 tifioctls TestIfIndexToName \tstdapis\tifioctls.ini SectionTestIfIndexToName_1
+RUN_TEST_STEP !Result=0 10 tifioctls TestIfIndexToName \tstdapis\tifioctls.ini SectionTestIfIndexToName_1
 END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLSHW-0009
 
 START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLSHW-0010
 //! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLSHW-0010
 //! @SYMTestStatus 	3.Released
-RUN_TEST_STEP !Result=0 5 tifioctls TestIfIndexToName \tstdapis\tifioctls.ini SectionTestIfIndexToName_2
+RUN_TEST_STEP !Result=0 10 tifioctls TestIfIndexToName \tstdapis\tifioctls.ini SectionTestIfIndexToName_2
 END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLSHW-0010
 
 START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLSHW-0011
 //! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLSHW-0011
 //! @SYMTestStatus 	3.Released
-RUN_TEST_STEP !Result=0 5 tifioctls TestIfNameToIndex \tstdapis\tifioctls.ini SectionTestIfNameToIndex_1
+RUN_TEST_STEP !Result=0 10 tifioctls TestIfNameToIndex \tstdapis\tifioctls.ini SectionTestIfNameToIndex_1
 END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLSHW-0011
 
 START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLSHW-0012
 //! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLSHW-0012
 //! @SYMTestStatus 	3.Released
-RUN_TEST_STEP !Result=0 5 tifioctls TestSiocGIfIndex \tstdapis\tifioctls.ini SectionTestSiocGIfIndex
+RUN_TEST_STEP !Result=0 10 tifioctls TestSiocGIfIndex \tstdapis\tifioctls.ini SectionTestSiocGIfIndex
 END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLSHW-0012
 
 START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLSHW-0013
@@ -92,3 +92,63 @@
 RUN_TEST_STEP !Result=0 50 tifioctls Testioctl1
 END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLSHW-0014
 
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0015
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0015
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestGetIfIPAddr \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0015
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0016
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0016
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestGetIfAttributes \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0016
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0017
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0017
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestSetIfAttributes \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0017
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0018
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0018
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 100 tifioctls TestSetIfDNSSuffix \tstdapis\tifioctls.ini  SectionSetIfDNSSuffix
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0018
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0019
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0019
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestGetIfDNSSuffix \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0019
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0020
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0020
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestRouteIoctl \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0020
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0021
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0021
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestNumberOfRoutesIoctl \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0021
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0022
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0022
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestGetNameServers \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0022
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0023
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0023
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestSetNameServers \tstdapis\tifioctls.ini SectionSetIfNameServer
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0023
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TIFIOCTLS-0024
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TIFIOCTLS-0024
+//! @SYMTestStatus 	3.Released
+RUN_TEST_STEP !Result=0 50 tifioctls TestGetNameServers \tstdapis\tifioctls.ini 
+END_TESTCASE  		OPENENV-LIBC-CIT-TIFIOCTLS-0024
+
--- a/genericopenlibs/openenvcore/libc/test/testifioctls/src/tifioctls.cpp	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/test/testifioctls/src/tifioctls.cpp	Wed Sep 15 14:02:55 2010 +0300
@@ -181,7 +181,65 @@
    	   			err = Testioctl1();
    	   			SetTestStepResult(err ? static_cast<TVerdict>(err) : EPass);
    	   			}	
-   	   	return TestStepResult(); 
+   	   	else if(TestStepName() == KTestioctlGetIfIpAddr)
+   	   	    {
+            INFO_PRINTF1(_L("TestGetIfIPAddr():"));
+            err = TestGetIfIPAddr();
+            SetTestStepResult(err ? static_cast<TVerdict>(err) : EPass);
+
+   	   	    }
+        else if(TestStepName() == KTestioctlGetIfAttributes)
+            {
+            INFO_PRINTF1(_L("TestGetIfAttributes():"));
+            err = TestGetIfAttributes();
+            SetTestStepResult(err ? static_cast<TVerdict>(err) : EPass);
+
+            }
+        else if(TestStepName() == KTestioctlSetIfAttributes)
+            {
+            INFO_PRINTF1(_L("TestSetIfAttributes():"));
+            err = TestSetIfAttributes();
+            SetTestStepResult(err ? static_cast<TVerdict>(err) : EPass);
+
+            }
+        else if(TestStepName() == KTestioctlSetIfDNSSuffix)
+            {
+            INFO_PRINTF1(_L("TestSetIfDNSSuffix():"));
+            err = TestSetIfDNSSuffix();
+            SetTestStepResult(err ? static_cast<TVerdict>(err) : EPass);
+
+            }
+        else if(TestStepName() == KTestioctlGetIfDNSSuffix)
+            {
+            INFO_PRINTF1(_L("TestGetIfDNSSuffix():"));
+            err = TestGetIfDNSSuffix();
+            SetTestStepResult(err ? static_cast<TVerdict>(err) : EPass);
+            }
+        else if(TestStepName() == KTestRouteIoctl)
+             {
+             INFO_PRINTF1(_L("TestRouteIoctl():"));
+             err = TestRouteIoctl();
+             SetTestStepResult(err ? static_cast<TVerdict>(err) : EPass);
+             }   
+        else if(TestStepName() == KTestNumberOfRoutesIoctl)
+             {
+             INFO_PRINTF1(_L("TestNumberOfRoutesIoctl():"));
+             err = TestNumberOfRoutesIoctl();
+             SetTestStepResult(err ? static_cast<TVerdict>(err) : EPass);
+             }   
+        else if(TestStepName() == KTestSetNameServers)
+            {
+            INFO_PRINTF1(_L("TestSetNameServers():"));
+            err = TestSetNameServers();
+            SetTestStepResult(err ? static_cast<TVerdict>(err) : EPass);
+            }
+        else if(TestStepName() == KTestGetNameServers)
+            {
+            INFO_PRINTF1(_L("TestGetNameServers():"));
+            err = TestGetNameServers();
+            SetTestStepResult(err ? static_cast<TVerdict>(err) : EPass);
+            }
+   		return TestStepResult(); 
 
 	}
  
--- a/genericopenlibs/openenvcore/libc/test/testifioctls/src/tifioctlsblocks.cpp	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/test/testifioctls/src/tifioctlsblocks.cpp	Wed Sep 15 14:02:55 2010 +0300
@@ -1188,5 +1188,608 @@
 		res=KErrGeneral;
 		}
 
-	return res;
-	}
+    return res;
+    }
+
+TInt CTestIfioctls::GetIapName(char * aIapName, int len)
+    {
+    _LIT(KIAPSectionName, "SectionIAPDetails");
+    _LIT(KIAPName,"IAPName");
+    TPtrC iapName;
+    TBool res = GetStringFromConfig(KIAPSectionName, KIAPName, iapName);
+    if (!res)
+        {
+        INFO_PRINTF1(_L("Unable to read the iapname fro the ini file.")) ;    
+        return KErrGeneral;
+        }
+    TPtr8 iap((unsigned char *)aIapName, len);
+    iap.Copy(iapName);
+    iap.ZeroTerminate();
+    return KErrNone;
+    }
+
+TInt CTestIfioctls::StartIap(const char *aIapName, int &fd)
+    {
+    TPtr8 iapName8((TUint8 * )aIapName,strlen(aIapName),strlen(aIapName)+1);
+    TBuf<IFNAMSIZ> iapName16;
+    iapName16.Copy(iapName8);
+    INFO_PRINTF2(_L("starting iap = %S"), &iapName16);
+
+    if((fd = socket(AF_INET, SOCK_DGRAM , 0)) < 0)
+        {
+        INFO_PRINTF2(_L("Error creating scocket errno = %d\n "),errno);
+        return -1;
+        }
+
+    if(ioctl(fd,SIOCSIFNAME,aIapName) == -1)
+        {
+        INFO_PRINTF2(_L("unable to set the interface name, reason = %d\n"), errno);
+        close(fd);
+        return -1;
+        }
+
+    if(ioctl(fd,SIOCIFSTART,aIapName) == -1)
+        {
+        INFO_PRINTF2(_L("unable to start the interface, reason = %d\n"),errno);
+        close(fd);
+        return -1;
+        }
+    return KErrNone;
+    }
+
+TInt CTestIfioctls::TestGetIfIPAddr()
+    {
+    char iapName[IFNAMSIZ];
+    GetIapName(iapName, sizeof(iapName));
+    int fd;
+    ifreq ifr;
+
+
+    if(StartIap(iapName, fd) != KErrNone)
+        {
+        INFO_PRINTF2(_L("unable to start the iap, reason = %d\n"),errno);
+        return -1;
+        }
+    strcpy(ifr.ifr_name,iapName);
+    if(ioctl(fd,SIOCGIFADDR,&ifr) == -1) //getting the interface ip
+        {
+        INFO_PRINTF2(_L("unable to get ip of the interface, reason = %d\n"),errno);
+        close(fd);
+        return -1;
+        }
+    char address[50];
+
+    if(inet_ntop(ifr.ifr_ifru.ifru_addr.sa_family,&(ifr.ifr_ifru.ifru_addr.sa_data),address,sizeof(address)) == NULL)
+        {
+        INFO_PRINTF2(_L("cannot convert to address to string, reason = %d \n"), errno);
+        close(fd);
+        return -1;
+        }
+    TPtr8 ipAddr8((TUint8*)address,strlen(address),strlen(address)+1);
+    TBuf<50> ipAddr16;
+    ipAddr16.Copy(ipAddr8);
+    INFO_PRINTF3(_L("family = %d, ipaddr = %S\n"),ifr.ifr_ifru.ifru_addr.sa_family,&ipAddr16);
+
+    sockaddr_in addr;
+    memcpy(&addr,&ifr.ifr_ifru.ifru_addr,sizeof(sockaddr_in));
+    addr.sin_port = 12346;
+
+    if (bind(fd,(sockaddr*)&addr,sizeof(addr)) < 0)
+        {
+        INFO_PRINTF2(_L("Error binding to socket, errno = %d\n"),errno);
+        close(fd);
+        return -1;
+        }
+    close(fd);
+    return KErrNone;
+
+    }
+
+void CTestIfioctls::printFlags(TInt flags)
+    {
+    if(flags & IFF_UP)
+        {
+        INFO_PRINTF1(_L("\t\tThe inteface is up\n"));
+        }
+    else
+        {
+        INFO_PRINTF1(_L("\t\tThe inteface is down\n"));
+        }
+    if(flags & IFF_LOOPBACK)
+        {
+        INFO_PRINTF1(_L("\t\tThe inteface a loopback\n"));
+        }
+    if(flags & IFF_POINTOPOINT)
+        {
+        INFO_PRINTF1(_L("\t\tThe inteface a P2P\n"));
+        }
+    if(flags & IFF_BROADCAST)
+        {
+        INFO_PRINTF1(_L("\t\tThe inteface a Broadcast\n"));
+        }
+    }
+
+TInt CTestIfioctls::TestGetIfAttributes()
+    {
+    char iapName[IFNAMSIZ];
+    GetIapName(iapName, sizeof(iapName));
+    int fd;
+    ifreq ifr;
+
+
+    if(StartIap(iapName, fd) != KErrNone)
+        {
+        INFO_PRINTF2(_L("unable to start the iap, reason = %d\n"),errno);
+        return -1;
+        }
+    strcpy(ifr.ifr_name,iapName);
+
+    if(ioctl(fd,SIOCGIFFLAGS,&ifr) == -1)
+        {
+        INFO_PRINTF2(_L("unable to get the flags for iap , reason = %d\n"),errno);
+        close(fd);
+        return -1;
+        }
+
+    printFlags(*((int *)ifr.ifr_ifru.ifru_flags));
+
+    if(ioctl(fd,SIOCGIFMTU,&ifr) == -1)
+        {
+        INFO_PRINTF2(_L("unable to get the mtu for the iap, reason = %d"),errno);
+        close(fd);
+        return -1;
+        }
+    INFO_PRINTF2(_L("The current MTU  = %d\n"),ifr.ifr_ifru.ifru_mtu);
+
+    if(ioctl(fd,SIOCGIFNETMASK,&ifr) == -1)
+        {
+        INFO_PRINTF2(_L("unable to get the netmask for the iap reason = %d\n"), errno);
+        close(fd);
+        return -1;
+        }
+    char addr[50];
+    addr[0] = '\0';
+
+    if(inet_ntop(ifr.ifr_ifru.ifru_addr.sa_family,&(ifr.ifr_ifru.ifru_addr.sa_data),addr,sizeof(addr)) == NULL)
+        {
+        INFO_PRINTF2(_L("cannot convert to address to string, error no = %d\n"),errno);
+        close(fd);
+        return -1;
+        }
+    TPtr8 addr8((TUint8 *)addr, strlen(addr), strlen(addr)+1);
+    TBuf<50> addr16;
+    addr16.Copy(addr8);
+    INFO_PRINTF2(_L("netmask  for the iap = %S \n"),&addr16);
+
+    if(ioctl(fd,SIOCGIFDEFGATEWAY,&ifr) == -1)
+        {
+        INFO_PRINTF2(_L("unable to get the gateway for the iap, reason = %d\n"),errno);
+        close(fd);
+        return -1;
+        }
+    addr[0] = '\0';
+    if(inet_ntop(ifr.ifr_ifru.ifru_addr.sa_family,&(ifr.ifr_ifru.ifru_defgatewayaddr),addr,sizeof(addr)) == NULL)
+        {
+        INFO_PRINTF2(_L("cannot convert to address to string, error no = %d\n"),errno);
+        close(fd);
+        return -1;
+        }
+    addr8.Set((TUint8 *)addr, strlen(addr), strlen(addr)+1);
+    addr16.Copy(addr8);
+    INFO_PRINTF2(_L("gateway  for the iap = %S\n"),&addr16);
+    close(fd);
+    return KErrNone;
+    }
+
+TInt CTestIfioctls::TestSetIfAttributes()
+    {
+    char iapName[IFNAMSIZ];
+    GetIapName(iapName, sizeof(iapName));
+    int fd;
+    ifreq ifr;
+
+
+    if(StartIap(iapName, fd) != KErrNone)
+        {
+        INFO_PRINTF2(_L("unable to start the iap, reason = %d\n"),errno);
+        return -1;
+        }
+    strcpy(ifr.ifr_name,iapName);
+
+
+    ifreq ifr1;
+    strcpy(ifr1.ifr_name,iapName);
+
+    if(ioctl(fd,SIOCGIFMTU,&ifr) == -1)
+        {
+        INFO_PRINTF2(_L("unable to get the mtu for the iap, reason = %d"),errno);
+        close(fd);
+        return -1;
+        }
+    ifr.ifr_ifru.ifru_mtu++;
+
+    if(ioctl(fd,SIOCSIFMTU,&ifr) == -1)
+        {
+        INFO_PRINTF2(_L("unable to set the mtu for the iap, reason = %d"),errno);
+        close(fd);
+        return -1;
+        }
+
+    if(ioctl(fd,SIOCGIFMTU,&ifr1) == -1)
+        {
+        INFO_PRINTF2(_L("unable to get the mtu for the iap , reason = %d"),errno);
+        close(fd);
+        return -1;
+        }
+
+    if(ifr.ifr_ifru.ifru_mtu != ifr1.ifr_ifru.ifru_mtu)
+        {
+        INFO_PRINTF2(_L("unable to set the mtu for the iap = %s"),ifr.ifr_name);
+        close(fd);
+        return -1;
+        }
+    close(fd);
+    return KErrNone;
+    }
+
+void CTestIfioctls::FreeDnsSuffixes(char ** suffixes)
+    {
+    for(int i = 0; suffixes[i]; i++)
+        {
+        delete [] suffixes[i];
+        }
+    delete []suffixes;
+    }
+
+#define MAX_SUFFIXES  3
+#define SUFFIXLEN   50
+TInt CTestIfioctls::TestSetIfDNSSuffix()
+    {
+    char iapName[IFNAMSIZ];
+    //    ifreq ifr1;
+    GetIapName(iapName, sizeof(iapName));
+    int fd;
+
+    struct if_dns_suffixes dns_suffixes;
+    strcpy(dns_suffixes.if_name,iapName);
+
+    if(StartIap(iapName, fd) != KErrNone)
+        {
+        INFO_PRINTF2(_L("unable to start the iap, reason = %d\n"),errno);
+        return -1;
+        }
+
+    char **&suffixes = dns_suffixes.suffixes;
+
+    suffixes = new char*[MAX_SUFFIXES+1];
+    suffixes[MAX_SUFFIXES] = NULL;
+
+    _LIT(KDNSSuffix, "DNSSuffix");
+
+    for(int i = 0; i < MAX_SUFFIXES; i++)
+        {
+        TPtrC suffix16;
+        TBuf<20> suffixTag(KDNSSuffix);
+        suffixTag.AppendNum(i);
+        suffixes[i] = NULL;
+        TBool res = GetStringFromConfig(ConfigSection(), suffixTag, suffix16);
+        if (!res)
+            {
+            INFO_PRINTF1(_L("Unable to read the iapname from the ini file.")) ;    
+            FreeDnsSuffixes(suffixes);
+            close(fd);
+            return KErrGeneral;
+            }
+        suffixes[i] = new char[suffix16.Length() + 1];
+        TPtr8 suffix8((TUint8*)suffixes[i],suffix16.Length() + 1);
+        suffix8.Copy(suffix16);
+        suffix8.ZeroTerminate();
+        }
+
+    if(ioctl(fd,SIOCSETDNSSUFFIX,&dns_suffixes) == -1)
+        {
+        INFO_PRINTF2(_L("unable to set the dbs suffixes , reason = %d\n"),errno);
+        close(fd);
+        FreeDnsSuffixes(suffixes);
+        return -1;
+        }
+    _LIT(KHostname1, "Hostname1");
+    TPtrC hostname16;
+    char hostname[50];
+    TPtr8 hostname8((TUint8*)hostname, sizeof(hostname));
+
+    TBool res = GetStringFromConfig(ConfigSection(), KHostname1, hostname16);
+    if (!res)
+        {
+        INFO_PRINTF1(_L("Unable to read the hostname from the ini file.")) ;    
+        FreeDnsSuffixes(suffixes);
+        close(fd);
+        return KErrGeneral;
+        }
+    hostname8.Copy(hostname16);
+    hostname8.ZeroTerminate();
+    hostent * hentry;
+    ifreq defaultif;
+    strcpy(defaultif.ifr_name, iapName);
+    if(setdefaultif(&defaultif) != KErrNone)
+        {
+        INFO_PRINTF2(_L("setdefaultif failed, reason = %d "),errno) ;    
+        FreeDnsSuffixes(suffixes);
+        close(fd);
+        return KErrGeneral;
+        }
+
+    if((hentry = gethostbyname(hostname)) == NULL)
+        {
+    INFO_PRINTF3(_L("getbyhostname failed for %S with errno = %d"),&hostname16,errno) ;    
+       // FreeDnsSuffixes(suffixes);
+       // close(fd);
+     //   return KErrGeneral;
+
+        } 
+    _LIT(KHostname2, "Hostname2");
+
+ res = GetStringFromConfig(ConfigSection(), KHostname2, hostname16);
+    if (!res)
+        {
+        INFO_PRINTF1(_L("Unable to read the hostname from the ini file.")) ;    
+        FreeDnsSuffixes(suffixes);
+        close(fd);
+        return KErrGeneral;
+        }
+    hostname8.Copy(hostname16);
+    hostname8.ZeroTerminate();
+    if((hentry = gethostbyname(hostname)) == NULL)
+        {
+    INFO_PRINTF3(_L("getbyhostname failed  for %S  with errno = %d "),&hostname16,errno) ;    
+       // FreeDnsSuffixes(suffixes);
+       // close(fd);
+       // return KErrGeneral;
+
+        } 
+
+    hostname8.Copy(_L8("2IND04966"));
+      hostname8.ZeroTerminate();
+      if((hentry = gethostbyname(hostname)) == NULL)
+          {
+          INFO_PRINTF3(_L("getbyhostname failed for %s, errno  =  %d "),&hostname8, errno) ;    
+          } 
+    
+    
+    FreeDnsSuffixes(suffixes);
+    close(fd);
+    return KErrNone;
+
+    }
+
+
+TInt CTestIfioctls::TestGetIfDNSSuffix()
+    {
+    char iapName[IFNAMSIZ];
+    GetIapName(iapName, sizeof(iapName));
+    int fd;
+
+    if(StartIap(iapName, fd) != KErrNone)
+        {
+        INFO_PRINTF2(_L("unable to start the iap, reason = %d\n"),errno);
+        return -1;
+        }
+
+    struct if_dns_suffixes dns_suffixes;
+    strcpy(dns_suffixes.if_name,iapName);
+
+    if(ioctl(fd,SIOCGETDNSSUFFIX,&dns_suffixes) == -1)
+        {
+        INFO_PRINTF2(_L("unable to get the dns suffixes , reason = %d\n"),errno);
+        close(fd);
+        return -1;
+        }
+
+    INFO_PRINTF1(_L("printing dns suffixes"));
+    for(int i = 0; dns_suffixes.suffixes[i]; i++)
+        {
+        TPtr8 suffix8((TUint8 *)dns_suffixes.suffixes[i],strlen(dns_suffixes.suffixes[i]),strlen(dns_suffixes.suffixes[i])+1);
+        TBuf<SUFFIXLEN> suffix16;
+        suffix16.Copy(suffix8);
+        INFO_PRINTF3(_L("suffixes %d =  %S"),i,&suffix16);
+        }
+    freednssuffixes(&dns_suffixes);
+    close(fd);
+    return KErrNone;
+    }
+
+TInt CTestIfioctls::TestGetNameServers()
+    {
+    if_name_servers dns_server;
+    char iapName[IFNAMSIZ];
+    GetIapName(iapName, sizeof(iapName));
+    int sockfd;
+    strcpy(dns_server.if_name, iapName);
+
+    if(StartIap(iapName, sockfd) != KErrNone)
+        {
+        INFO_PRINTF2(_L("unable to start the iap, reason = %d\n"),errno);
+        return -1;
+        }
+
+    TInt ret = ioctl(sockfd, SIOCGNAMESERVER, &dns_server);
+    if(ret == -1)
+        {
+        INFO_PRINTF2(_L("IOCTL option failed with errno =%d"), errno);
+        close(sockfd);
+        return errno;
+        }
+    char addr[50];
+    addr[0] = '\0';
+
+    if(inet_ntop(dns_server.nameserver1.sa_family,&(dns_server.nameserver1.sa_data),addr,sizeof(addr)) == NULL)
+        {
+        INFO_PRINTF2(_L("cannot convert to address to string, error no = %d\n"),errno);
+        close(sockfd);
+        return -1;
+        }
+    TPtr8 addr8((TUint8 *)addr, strlen(addr), strlen(addr)+1);
+    TBuf<50> addr16;
+    addr16.Copy(addr8);
+    INFO_PRINTF2(_L("nameserver2  for the iap = %S \n"),&addr16);
+    if(inet_ntop(dns_server.nameserver2.sa_family,&(dns_server.nameserver2.sa_data),addr,sizeof(addr)) == NULL)
+        {   
+        INFO_PRINTF2(_L("cannot convert to address to string, error no = %d\n"),errno);
+        close(sockfd);
+        return -1;
+        }
+    addr8.Set((TUint8 *)addr, strlen(addr), strlen(addr)+1 );
+    addr16.Copy(addr8);
+    INFO_PRINTF2(_L("nameserver2  for the iap = %S \n"),&addr16);
+    close(sockfd);
+
+        return KErrNone;
+    }
+
+TInt CTestIfioctls::TestSetNameServers()
+    {
+    if_name_servers dns_server;
+
+    char iapName[IFNAMSIZ];
+    GetIapName(iapName, sizeof(iapName));
+
+    memset(&dns_server,0, sizeof(dns_server));
+    strcpy(dns_server.if_name, iapName);
+    TPtrC nameServer16;
+    _LIT(KNameSrv1, "NameServer1");
+    _LIT(KNameSrv2, "NameServer2");
+
+    TBool res = GetStringFromConfig(ConfigSection(), KNameSrv1, nameServer16);
+    if (!res)
+        {
+        INFO_PRINTF1(_L("Unable to read the nameserver1 from the ini file.")) ;    
+        return KErrGeneral;
+        }
+    char nameServer1[50];
+    TPtr8 nameServer8((TUint8 *)nameServer1, sizeof(nameServer1));
+    nameServer8.Copy(nameServer16);
+    nameServer8.ZeroTerminate();
+    res = GetStringFromConfig(ConfigSection(), KNameSrv2, nameServer16);
+    if (!res)
+        {
+        INFO_PRINTF1(_L("Unable to read nameserver2 from the ini file.")) ;    
+        return KErrGeneral;
+        }
+
+    char nameServer2[50];
+    nameServer8.Set((TUint8 *)nameServer2,  0, sizeof(nameServer2));
+    nameServer8.Copy(nameServer16);
+    nameServer8.ZeroTerminate();
+    
+    dns_server.nameserver1.sa_family = AF_INET;
+    dns_server.nameserver2.sa_family = AF_INET;
+    TInt addr1 = inet_addr(nameServer1);
+    TInt addr2 = inet_addr(nameServer2);
+    unsigned char * ptr = (unsigned char *)&addr1;
+    dns_server.nameserver1.sa_data[0] = ptr[0];
+    dns_server.nameserver1.sa_data[1] = ptr[1];
+    dns_server.nameserver1.sa_data[2] = ptr[2];
+    dns_server.nameserver1.sa_data[3] = ptr[3];
+   
+    ptr = (unsigned char *)&addr2;
+    dns_server.nameserver2.sa_data[0] = ptr[0];
+    dns_server.nameserver2.sa_data[1] = ptr[1];
+    dns_server.nameserver2.sa_data[2] = ptr[2];
+    dns_server.nameserver2.sa_data[3] = ptr[3];
+    
+    TInt sockfd;
+    if(StartIap(iapName, sockfd) != KErrNone)
+        {
+        INFO_PRINTF2(_L("unable to start the iap, reason = %d\n"),errno);
+        return -1;
+        }
+
+
+    TInt ret = ioctl(sockfd, SIOCSNAMESERVER, &dns_server);
+    if(ret == -1)
+        {
+        INFO_PRINTF2(_L("IOCTL option failed with errno =%d"), errno);
+        close(sockfd);
+        return errno;
+        }
+
+    return KErrNone;
+
+    }
+
+//Testcase added to enumerate routes configured on the device.
+//Use Ioctl option SIOCENUMROUTES to get the route details.
+//PreCondition: User needs to allocate space for the buffer.
+TInt CTestIfioctls::TestRouteIoctl()
+    {
+    rtconf rtc;
+    TInt ret = 0;
+    rtc.rt_len = 0;
+    TInt sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
+    if(sockfd < 0)
+        {
+        INFO_PRINTF2(_L("Unable to create the socket errno =%d"), errno);
+        return -1;
+        }
+    if((ret = ioctl (sockfd, SIOCENUMROUTES,&rtc)) == -1)
+        {
+        INFO_PRINTF2(_L("Unable to get the routes configured, errno = %d"), errno);
+        close(sockfd);
+        return -1;
+        }
+
+    if (rtc.rt_len == 0)
+        {
+        INFO_PRINTF1(_L("No routes were found,"));
+        close(sockfd);
+        return KErrNone;
+        }
+    if((rtc.rtc_buf = (caddr_t)malloc( rtc.rt_len )) == NULL)
+        {
+        INFO_PRINTF1(_L("Unable to allocate memory "));
+        close(sockfd);
+        return KErrNoMemory;
+        }
+    
+    INFO_PRINTF1(_L("Now will fetch the routes!\n"));
+    if((ret = ioctl (sockfd, SIOCENUMROUTES,&rtc)) == -1)
+        {
+        INFO_PRINTF2(_L("Unable to get the routs configured, errno = %d"), errno);
+        close(sockfd);
+        free(rtc.rtc_buf);
+        return -1;
+        }
+    close(sockfd);
+    free(rtc.rtc_buf);
+    return KErrNone;
+    }
+
+
+//With the route_entry buffer size zero, it should return the number of routes present on the system
+//To use this ioctl effectively, we can find the number of routes by passing length as Zero and then
+//pass the count*sizeof(route_entry) as the len the next time to fecth the route information.
+TInt CTestIfioctls::TestNumberOfRoutesIoctl()
+    {
+    rtconf rtc;
+    rtc.rt_len = 0;
+    TInt ret = 0;
+
+    TInt sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
+    if(sockfd < 0)
+        {
+        INFO_PRINTF2(_L("Unable to create the socket errno =%d"), errno);
+        return -1;
+        }
+    if((ret = ioctl (sockfd, SIOCENUMROUTES,&rtc)) == -1)
+        {
+        INFO_PRINTF2(_L("Unable to get the routs configures, errno = %d"), errno);
+        return -1;
+        }
+
+    INFO_PRINTF2(_L("The number of routes available is %d\n"), rtc.rt_len/sizeof(route_entry));
+    close(sockfd);
+    return KErrNone;
+
+    }
+
+
--- a/genericopenlibs/openenvcore/libc/test/testifioctls/src/tifioctlsserver.cpp	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/test/testifioctls/src/tifioctlsserver.cpp	Wed Sep 15 14:02:55 2010 +0300
@@ -202,6 +202,42 @@
 		{
 		testStep = new CTestIfioctls(aStepName);
 		}
+	if(aStepName == KTestioctlGetIfIpAddr)
+	    {
+	    testStep = new CTestIfioctls(aStepName);
+	    }
+	if(aStepName == KTestioctlGetIfAttributes)
+	    {
+	    testStep = new CTestIfioctls(aStepName);
+	    }
+	if(aStepName == KTestioctlSetIfAttributes)
+	    {
+	    testStep = new CTestIfioctls(aStepName);
+	    }
+	if(aStepName == KTestioctlSetIfDNSSuffix)
+	    {
+	    testStep = new CTestIfioctls(aStepName);
+	    }
+	if(aStepName == KTestioctlGetIfDNSSuffix)
+	    {
+	    testStep = new CTestIfioctls(aStepName);
+	    }
+   if(aStepName == KTestRouteIoctl)
+        {
+        testStep = new CTestIfioctls(aStepName);
+        }
+   if(aStepName == KTestNumberOfRoutesIoctl)
+        {
+        testStep = new CTestIfioctls(aStepName);
+        }
+   if(aStepName == KTestSetNameServers)
+        {
+        testStep = new CTestIfioctls(aStepName);
+        }
+   if(aStepName == KTestGetNameServers)
+        {
+        testStep = new CTestIfioctls(aStepName);
+        }
 	return testStep;
 	}
 
--- a/genericopenlibs/openenvcore/libc/test/testsocket/inc/tsocket.h	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/test/testsocket/inc/tsocket.h	Wed Sep 15 14:02:55 2010 +0300
@@ -135,6 +135,7 @@
 _LIT(KTestSockIoctl, "TestSockIoctl");
 _LIT(KSockErrnoTest, "SockErrnoTest");
 _LIT(KSockSendOnClosedConn,"SockSendOnClosedConn");
+_LIT(KSockWriteOnClosedConn,"SockWriteOnClosedConn");
 class CTestSocket : public CTestStep
 	{
 public:
@@ -232,5 +233,6 @@
 	TInt close_socket(int fd);
 	TInt SockErrnoTest();
 	TInt SockSendOnClosedConn();
+	TInt SockWriteOnClosedConn();
 	};
 #endif 
--- a/genericopenlibs/openenvcore/libc/test/testsocket/scripts/tsocket.script	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/test/testsocket/scripts/tsocket.script	Wed Sep 15 14:02:55 2010 +0300
@@ -619,3 +619,11 @@
 //commeneted because of network test
 RUN_TEST_STEP !Result=0 50 tsocket  SockSendOnClosedConn
 END_TESTCASE  		OPENENV-LIBC-CIT-TESTSOCKET-00100
+
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TESTSOCKET-00101
+//! @SYMTestCaseID 	OPENENV-LIBC-CIT-TESTSOCKET-00101
+//! @SYMTestStatus 	3.Released
+//commeneted because of network test
+RUN_TEST_STEP !Result=0 50 tsocket  SockWriteOnClosedConn
+END_TESTCASE  		OPENENV-LIBC-CIT-TESTSOCKET-00101
--- a/genericopenlibs/openenvcore/libc/test/testsocket/scripts/tsocket_hw.script	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/test/testsocket/scripts/tsocket_hw.script	Wed Sep 15 14:02:55 2010 +0300
@@ -621,3 +621,8 @@
 START_TESTCASE  	OPENENV-LIBC-CIT-TESTSOCKET-00101
 RUN_TEST_STEP !Result=0 50 tsocket  SockSendOnClosedConn
 END_TESTCASE  		OPENENV-LIBC-CIT-TESTSOCKET-00101
+
+START_TESTCASE  	OPENENV-LIBC-CIT-TESTSOCKET-00102
+RUN_TEST_STEP !Result=0 50 tsocket  SockWriteOnClosedConn
+END_TESTCASE  		OPENENV-LIBC-CIT-TESTSOCKET-00101
+
--- a/genericopenlibs/openenvcore/libc/test/testsocket/src/tsocket.cpp	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/test/testsocket/src/tsocket.cpp	Wed Sep 15 14:02:55 2010 +0300
@@ -637,6 +637,13 @@
             err = SockSendOnClosedConn();
             SetTestStepResult(err ? static_cast<TVerdict>(err) : EPass);
             }
+   	if(TestStepName() == KSockWriteOnClosedConn )
+   	            {
+   	            INFO_PRINTF1(_L("SockWriteOnClosedConn():"));
+   	            err = SockWriteOnClosedConn();
+   	            SetTestStepResult(err ? static_cast<TVerdict>(err) : EPass);
+   	            }
+   	
    	
 return TestStepResult(); 
 
--- a/genericopenlibs/openenvcore/libc/test/testsocket/src/tsocketblocks.cpp	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/test/testsocket/src/tsocketblocks.cpp	Wed Sep 15 14:02:55 2010 +0300
@@ -5204,6 +5204,100 @@
     return ret; 
     }
 
+
+void* createNwrite_socket(TAny* aParam)
+    {
+    sockaddr_in serv_addr;
+        int err1;
+        int ret = 0;
+        char *msg ="testing socket send";
+        int sock_fd;
+        serv_addr.sin_family = AF_INET;
+        serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
+        serv_addr.sin_port = (int)aParam;
+        sock_fd = socket(AF_INET,SOCK_STREAM,0);
+        if (sock_fd < 0)
+            {
+            ret = -1;
+            goto close;
+            }
+        if (connect(sock_fd,(sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
+            {
+            ret = -1;
+            goto close;
+            }
+        sleep(5);  
+        err1 = write(sock_fd, msg, strlen(msg)+1);
+        if(err1 < 0)
+            {
+            ret = -1;
+            goto close;    
+            }
+        sleep(5);
+        err1 = write(sock_fd, msg,strlen(msg)+1);
+        if(err1 ==  -1 )
+           {
+            printf("write() failed returned errno = %d", errno);
+           }
+        else
+            {
+            ret = -1;
+            }
+        close:
+        close(sock_fd);
+        return (void*)ret;
+
+    }
+TInt CTestSocket::SockWriteOnClosedConn()
+    {
+    
+        int sock_fd,newsock_fd;
+        unsigned int addr_len;  
+        sockaddr_in serv_addr,new_socket;
+        TInt ret = KErrNone;
+        int threadRetVal = 0;
+        void *threadRetValPtr = (void*)&threadRetVal;
+        sock_fd = socket(AF_INET,SOCK_STREAM,0);
+        if (sock_fd < 0)
+            {
+            return KErrSocket;
+            }
+        serv_addr.sin_family = AF_INET;
+        serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
+        serv_addr.sin_port = htons(12350);
+        pthread_t clientThread;
+        if (bind(sock_fd,(sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
+            {
+            INFO_PRINTF2(_L("bind return with errno = %d"), errno);
+            return  KErrBind;
+            }
+        if(-1 == listen(sock_fd, 1))
+           {
+             printf("error listen failed");
+             close(sock_fd);
+             return  -1;
+           }
+        pthread_create(&clientThread, NULL, &createNwrite_socket, (void*)(serv_addr.sin_port));
+           addr_len = sizeof(new_socket);
+           newsock_fd = accept(sock_fd,(sockaddr*)&new_socket,&addr_len);  
+           if (errno != 0 )
+               {
+               INFO_PRINTF2(_L("Accept return with errno = %d"), errno);
+               ret = -1;
+               }
+          
+           close(newsock_fd);
+           close(sock_fd);
+           pthread_join(clientThread, &threadRetValPtr );
+           if (threadRetVal < 0)
+               {  
+               INFO_PRINTF1(_L("SockWriteOnClosedConn failed"));
+               ret = threadRetVal;
+               }
+           return ret;
+    }
+
+
 // ========================== OTHER EXPORTED FUNCTIONS =========================
 // None
 
--- a/genericopenlibs/openenvcore/libc/test/testsocket/src/tsocketserver.cpp	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/libc/test/testsocket/src/tsocketserver.cpp	Wed Sep 15 14:02:55 2010 +0300
@@ -455,6 +455,10 @@
             {
             testStep = new CTestSocket(aStepName);
             }
+	if(aStepName == KSockWriteOnClosedConn )
+	    {
+        testStep = new CTestSocket(aStepName);
+	    }
 	
 	return testStep;
 	}
--- a/genericopenlibs/openenvcore/test/utils/OEtests_hw.bat	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericopenlibs/openenvcore/test/utils/OEtests_hw.bat	Wed Sep 15 14:02:55 2010 +0300
@@ -162,3 +162,4 @@
 del e:\sys$rom.zip
 del c:\logs\testexecute\TestResults.htm
 copy c:\logs\testexecute\*.* e:\
+copy c:\ced.log e:\
--- a/genericservices/taskscheduler/SCHSVR/SchTimer.cpp	Wed Sep 15 00:31:55 2010 +0300
+++ b/genericservices/taskscheduler/SCHSVR/SchTimer.cpp	Wed Sep 15 14:02:55 2010 +0300
@@ -404,6 +404,7 @@
 CPropertyNotifier::~CPropertyNotifier()
 	{
 	Cancel();
+	iProperty.Close();
 	}
 
 void CPropertyNotifier::AttachL()
@@ -416,7 +417,10 @@
 void CPropertyNotifier::SetPropertyL(const TUid& aCategory, TUint aKey)
 	{
 	if (IsActive())
+	    {
 		Cancel();
+		iProperty.Close();
+	    }
 	iCategory = aCategory;
 	iKey = aKey;
 	AttachL();	
--- a/lowlevellibsandfws/pluginfw/Framework/frame/RegistryData.cpp	Wed Sep 15 00:31:55 2010 +0300
+++ b/lowlevellibsandfws/pluginfw/Framework/frame/RegistryData.cpp	Wed Sep 15 14:02:55 2010 +0300
@@ -681,6 +681,7 @@
 			return EFalse;
 			}
 		err = loader.CheckLibraryHash(dllFullName, ETrue);
+		loader.Close();
 		if(err != KErrNone)
 			{
 #ifdef __ECOM_TRACE