genericopenlibs/openenvcore/backend/src/corebackend/usocket.cpp
branchRCL_3
changeset 56 acd3cd4aaceb
parent 54 4332f0f7be53
child 57 2efc27d87e1c
--- a/genericopenlibs/openenvcore/backend/src/corebackend/usocket.cpp	Thu Aug 19 11:33:45 2010 +0300
+++ b/genericopenlibs/openenvcore/backend/src/corebackend/usocket.cpp	Tue Aug 31 16:54:36 2010 +0300
@@ -76,7 +76,7 @@
 // We have to deal with the network byte ordering of AF_INET addresses
 //
 	{
-	if (!aBuf)
+	if (aBuf==0)
 		{
 		iError = EFAULT;
 		SetLength(0);
@@ -194,10 +194,10 @@
 		}
 	}
 
-/*
- * Extract a struct sockaddr from a TSockAddr
- */
 EXPORT_C void TUSockAddr::Get(TAny* addr, unsigned long* len)
+//
+// Extract a struct sockaddr from a TSockAddr
+//
 	{
 	if (addr==0)
 		{
@@ -393,15 +393,18 @@
 
 void CSocketDesc::Write (TDes8& aBuf, TRequestStatus& aStatus)
 	{
-
-    TInt err = maybe_reopen_socket();
-    if (err != KErrNone)
-        {
-        Complete(aStatus, err);
-        return;
-        }
-	
-	iWriteLock.Wait();
+	//Acquire the Lock before write and release it later
+	iWriteLock.Wait();	
+	if (iSocketPtr == NULL)
+		{
+		TInt ret = OpenUsingPreference();
+		if (ret != KErrNone)	// Error in open
+			{
+			Complete(aStatus,ret);
+			iWriteLock.Signal();
+			return;
+			}
+		}
 	CSockDescBase::Write(aBuf, aStatus);
 	iWriteLock.Signal();	
 	}
@@ -424,43 +427,52 @@
 		{
 		return addr.iError;
 		}
-	
-	ret = maybe_reopen_socket();
-	if (ret != KErrNone)
-	    return ret;
-	ATOMICSOCKETOP(ret = iSocket.Bind(addr),return KErrBadHandle)
-	return ret;
+
+	if (iSocketPtr == NULL)
+		{
+		ret = OpenUsingPreference();
+		if (ret != KErrNone)	// Error in open
+			{
+			return ret;
+			}
+		}
+	return iSocket.Bind(addr);
 	}
 
 TInt CSocketDesc::Listen(TUint qSize)
 	{
-
-    TInt ret;
 	if (iStyle == SOCK_DGRAM) // Listen on UDP socket, crashing at RSocket::Listen().
 		{
 		return EOPNOTSUPP;
 		}
-	
-	ret = maybe_reopen_socket();
-	if (ret != KErrNone)
-	    return ret;
-
+	if (iSocketPtr == NULL)
+		{
+		TInt ret = OpenUsingPreference();
+		if (ret != KErrNone)	// Error in open
+			{
+			return ret;
+			}
+		}
 	return CSockDescBase::Listen(qSize);
 	}
 
 TInt CSocketDesc::SockName(int anEnd, struct sockaddr* anAddr,unsigned long* aSize)
 	{
-
-
-	if (!anAddr)
+	TInt ret;
+	if (iSocketPtr == NULL)
         {
-        return EFAULT;
+            ret = OpenUsingPreference();
+            if (ret != KErrNone)    // Error in open
+                {
+                return ret;
+                }
+        }
+	
+	if ( anAddr == 0 ) // if the sockaddr passed is NULL return EFAULT.
+        {
+            return EFAULT;
         }
 
-	TInt ret = maybe_reopen_socket();
-	if (ret != KErrNone)
-	    return ret;
-	
    
     struct sockaddr temp;
     unsigned long len = sizeof( temp );
@@ -491,19 +503,24 @@
 		{
 		return EINVAL;
 		}
-	
-	ret = maybe_reopen_socket();
-	if (ret != KErrNone)
-	    return ret;
+	if (iSocketPtr == NULL)
+		{
+		ret = OpenUsingPreference();
+		if (ret != KErrNone)	// Error in open
+			{
+			return ret;
+			}
+		}
 
 	if (SO_TYPE == anOptionName && SOL_SOCKET == anOptionLevel)
 		{
 		TProtocolDesc protocolInfo;
-		ATOMICSOCKETOP(ret = iSocket.Info(protocolInfo), ret = KErrBadHandle)
+		ret = iSocket.Info(protocolInfo);
 		if (KErrNone == ret )
 			{
-			// Copy the Socket Type to the buffer
-			TInt size = (anOption.Length() < sizeof(protocolInfo.iSockType))? anOption.Length(): sizeof(protocolInfo.iSockType);
+			//Copy the Socket Type to the buffer
+			TInt size;
+			size = (anOption.Length() < sizeof(protocolInfo.iSockType))? anOption.Length(): sizeof(protocolInfo.iSockType);
 			Mem::Copy((unsigned char*)anOption.Ptr(), &protocolInfo.iSockType, size);
 			anOption.SetLength(size);
 			}
@@ -515,16 +532,20 @@
 		TUSockAddr addr;
 		struct sockaddr_in sockAddress;
 		sockAddress.sin_family = AF_INET;
-		ATOMICSOCKETOP(sockAddress.sin_port = iSocket.LocalPort(),return KErrBadHandle)			
-		ATOMICSOCKETOP(iSocket.LocalName(addr);,return KErrBadHandle)		
+		sockAddress.sin_port = iSocket.LocalPort();	
+		iSocket.LocalName(addr);
+
 		TInt a = sizeof(sockAddress);
 		addr.Get(&sockAddress,(unsigned long*)&a);  
-		TInt size = (anOption.Length() < sizeof(sockAddress.sin_addr))? anOption.Length(): sizeof(sockAddress.sin_addr);
+		TInt size;
+		size = (anOption.Length() < sizeof(sockAddress.sin_addr))? anOption.Length(): sizeof(sockAddress.sin_addr);
 		Mem::Copy((unsigned char*)anOption.Ptr(), &(sockAddress.sin_addr), size); 
 		anOption.SetLength(size);
 		return KErrNone;
 		}
 
+
+
 	switch(anOptionLevel)
 		{
 		case IPPROTO_TCP:
@@ -562,8 +583,8 @@
 			anOptionName=KSoIp6MulticastLoop;
 			break;
 		}
-	ATOMICSOCKETOP(ret = iSocket.GetOpt(anOptionName,anOptionLevel,anOption), return KErrBadHandle)
-	return ret;
+
+	return iSocket.GetOpt(anOptionName,anOptionLevel,anOption);
 	}
 
 TInt CSocketDesc::GetInterfaceIndex(TUint32 anAddr)
@@ -577,14 +598,12 @@
 		}
 	else 
 		{
-		TInt ret = KErrNone;
-		ATOMICSOCKETOP(ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl), ret = KErrBadHandle)
+		TInt ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl);
 		if (ret != KErrNone)
 			return KErrGeneral;
 
 		TPckgBuf<TSoInetInterfaceInfo>iface;
-		ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, iface), ret = KErrBadHandle )
-		while(ret == KErrNone)
+		while(iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, iface) == KErrNone)
 			{
 			TSoInetInterfaceInfo &info = iface();
 			TInt result;
@@ -593,13 +612,13 @@
 				if (anAddr == info.iAddress.Address()) 
 					{      	
 					ifq().iName = info.iName;
-					ATOMICSOCKETOP( result = iSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, ifq), result = KErrBadHandle )
+					result = iSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, ifq);
 					if (result == KErrNone)
 						aIndex = ifq().iIndex;
 
 					}
 				}
-			ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, iface), ret = KErrBadHandle )
+
 			}   	
 		}
 	return aIndex;
@@ -616,10 +635,14 @@
 		{
 		return EINVAL;
 		}
-	
-	ret = maybe_reopen_socket();
-	if (ret != KErrNone)
-	    return ret;
+	if (iSocketPtr == NULL)
+		{
+		ret = OpenUsingPreference();
+		if (ret != KErrNone)	// Error in open
+			{
+			return ret;
+			}
+		}
 
 	switch(anOptionLevel)
 		{
@@ -671,26 +694,30 @@
 			maddr=(from[0]<<24)+(from[1]<<16)+(from[2]<<8)+from[3];
 			multiAddr.SetAddress( maddr);
 			multiAddr.ConvertToV4Mapped();
-			if (multiAddr.IsMulticast())
-			    {
-                req().iAddr = multiAddr.Ip6Address();
-                req().iInterface = aIndex;  
-			    }
-			ATOMICSOCKETOP( ret = iSocket.SetOpt(anOptionName, anOptionLevel, req), return KErrBadHandle )
-			return ret;
+			if(multiAddr.IsMulticast()){
+			req().iAddr = multiAddr.Ip6Address();
+			req().iInterface = aIndex;  
+			}
+			return iSocket.SetOpt(anOptionName, anOptionLevel, req);
 
 		case IP_MULTICAST_TTL:
 			anOptionLevel=KSolInetIp;
 			anOptionName=KSoIp6MulticastHops;
 			Option = (TInt*)anOption.Ptr();
 			ttlValue = *Option;
-			ATOMICSOCKETOP( ret = iSocket.SetOpt(anOptionName,anOptionLevel,ttlValue), return KErrBadHandle )
-			return ret;
-			
+			return iSocket.SetOpt(anOptionName,anOptionLevel,ttlValue);
+
 		case SO_BROADCAST: 
 			//check if user is trying to disable broadcast
 			Option = (TInt*)anOption.Ptr();
-			return (*Option == 0 ? KErrNotSupported : KErrNone);
+			if (*Option == 0)  
+				{
+				return KErrNotSupported;
+				}	
+			else 
+				{
+				return KErrNone;	
+				}
 
 		case IP_MULTICAST_IF:
 			{
@@ -699,11 +726,10 @@
 			struct in_addr *inAddress = (struct in_addr*)anOption.Ptr();	    
 			struct sockaddr_in sockAddress; 	 		    
 			sockAddress.sin_family = AF_INET;
-			ATOMICSOCKETOP(sockAddress.sin_port = iSocket.LocalPort();,return KErrBadHandle)         
+			sockAddress.sin_port = iSocket.LocalPort();
 			sockAddress.sin_addr.s_addr = inAddress->s_addr;
-			TUSockAddr ifAddress(&sockAddress, sizeof(sockAddress));
-			ATOMICSOCKETOP( ret = iSocket.Bind(ifAddress), return KErrBadHandle )
-			return ret;
+			TUSockAddr ifAddress(&sockAddress, sizeof(sockAddress));    	
+			return iSocket.Bind(ifAddress);		
 			}
 
 		case IP_MULTICAST_LOOP:
@@ -711,11 +737,11 @@
 			anOptionName=KSoIp6MulticastLoop;
 			break;	    	
 
-
+		default:
+			break;
 
 		}
-	ATOMICSOCKETOP( ret = iSocket.SetOpt(anOptionName,anOptionLevel,anOption), return KErrBadHandle )
-	return ret;
+	return iSocket.SetOpt(anOptionName,anOptionLevel,anOption);
 	}
 
 void CSocketDesc::Sync (TRequestStatus& aStatus)
@@ -726,14 +752,19 @@
 
 void CSocketDesc::RecvFrom(TDes8& aDesc, TSockAddr& from, int flags, TRequestStatus& aStatus)
 	{
-    TInt err = maybe_reopen_socket();
-    if (err != KErrNone)
-        {
-        Complete(aStatus, err);
-        return;
-        }
+	iReadLock.Wait();
+	// RSocket::Open() is postponed from socket()
+	if (iSocketPtr == NULL)
+		{
+		TInt ret = OpenUsingPreference();
+		if (ret != KErrNone)
+			{
+			Complete(aStatus,ret);	// Error in open
+			iReadLock.Signal();
+			return;
+			}
+		}
 
-	iReadLock.Wait();
 	CSockDescBase::RecvFrom(aDesc, from, flags, aStatus);
 	iReadLock.Signal();
 	}
@@ -749,23 +780,25 @@
 
 void CSocketDesc::SendTo(TDes8& aDesc, const struct sockaddr* anAddr, unsigned long aAddrLen, int flags, TRequestStatus& aStatus)
 	{
-    TInt err = maybe_reopen_socket();
-    if (err != KErrNone)
-        {
-        Complete(aStatus, err);
-        return;
-        }
-    
-	TUSockAddr toAddr(anAddr, aAddrLen);
-	
-	iWriteLock.Wait();  
+	iWriteLock.Wait();	
+
+	if (iSocketPtr == NULL)
+		{
+		TInt ret = OpenUsingPreference();
+		if (ret != KErrNone)
+			{
+			Complete(aStatus,ret);   // Error in open
+			iWriteLock.Signal();
+			return;
+			}
+		}
+	TUSockAddr toAddr(anAddr,aAddrLen);
 	CSockDescBase::SendTo(aDesc, toAddr, flags, aStatus);
 	iWriteLock.Signal();
 	}
 
 void CSocketDesc::SendToCancel()
 	{
-// Should we use atomic loads here?
 	if (iSocketPtr != NULL)
 		{
 		CSockDescBase::SendToCancel();
@@ -774,8 +807,7 @@
 
 void CSocketDesc::Shutdown(TUint aHow,TRequestStatus& aStatus)
 	{
-
-    if (__e32_atomic_load_acq32(&iSocketPtr) == NULL) // Not opened at all. Nothing to do.
+	if (iSocketPtr == NULL) // Not opened at all. Nothing to do.
 		{
 		Complete(aStatus,KErrNone);
 		return;
@@ -787,61 +819,52 @@
 
 void CSocketDesc::Accept(CFileDescBase*& aNewSocket, TRequestStatus& aStatus, RSocketServ& aSs, TSockAddr * /*aAddr*/)
 	{
-    aNewSocket = NULL;
-	TInt err = maybe_reopen_socket();
-	if (err != KErrNone)
-	    {
-        Complete(aStatus, err);
-        return;
-	    }
-	
+	//Acquire the Lock before accept and release it later
 	iReadLock.Wait();
-	// what are the below coverity thingummichs?
+
+	TInt err = KErrNone;
+	if (iSocketPtr == NULL)
+		{
+		err = OpenUsingPreference();
+		if (err != KErrNone)	// Error in open
+			{			
+			Complete(aStatus,err);
+			iReadLock.Signal();
+			return;
+			}
+		}
+
 	//coverity[alloc_fn]
 	//coverity[assign]
 	CSocketDesc *newSocket = new CSocketDesc;
-	if (!newSocket)
-	    {
-        Complete(aStatus, KErrNoMemory);
-        iReadLock.Signal();
-        return;
-	    }
-	
-	err = newSocket->CreateLock();
-	if (err)
+	if (newSocket!=0)
 		{
-        Complete(aStatus, KErrNoMemory);
-        delete newSocket;
-        iReadLock.Signal();
-        //coverity[memory_leak]
-        return;
-		}
+		err = newSocket->CreateLock();
+		if (err)
+			{
+			Complete(aStatus, KErrNoMemory);
+			delete newSocket;
+			aNewSocket = NULL;
+			iReadLock.Signal();
+			//coverity[memory_leak]
+			return;
+			}
 
-	err = newSocket->iSocket.Open(aSs);
-	if (err)
+		err=newSocket->iSocket.Open(aSs);
+		}
+	if (newSocket ==0 || err!=KErrNone)
 		{
-		Complete(aStatus, err);
-		newSocket->FinalClose();  // this will Close locks
+		Complete(aStatus,KErrNoMemory);
 		delete newSocket;
-
+		aNewSocket = NULL;
 		iReadLock.Signal();
 		//coverity[memory_leak]
 		return;
 		}
 	newSocket->iSocketPtr = &newSocket->iSocket;
 	newSocket->iStyle = iStyle;
-	err = KErrNone;
-	ATOMICSOCKETOP( iSocket.Accept(newSocket->iSocket,aStatus), err = KErrBadHandle )
-	if( err )
-	    {
-	    Complete(aStatus, err);
-	    newSocket->FinalClose();  // this will Close locks
-	    delete newSocket;
-	    }
-	else
-	    {
-	    aNewSocket = newSocket;
-	    }
+	iSocket.Accept(newSocket->iSocket,aStatus);
+	aNewSocket = newSocket;
 	iReadLock.Signal();
 	}
 
@@ -849,7 +872,7 @@
 	{
 	if (iSocketPtr != NULL)
 		{
-		ATOMICSOCKETOP( iSocket.CancelAccept(), NOP )
+		iSocket.CancelAccept();
 		}
 	}
 
@@ -862,63 +885,56 @@
 		aStatus = addr.iError;
 		return;
 		}
-	
-	TInt err = maybe_reopen_socket();
-	if (err != KErrNone)
-	    {
-        aStatus = err;
-        return;
-	    }
-	
-	iWriteLock.Wait();
-	if( GetConnectionProgress() == EFalse )
-	    {
-		ATOMICSOCKETOP(iSocket.Connect(addr, aStatus), Complete(aStatus,KErrBadHandle))
-	    User::WaitForRequest(aStatus);
-	    if( aStatus.Int() == KErrWouldBlock )
-	        SetConnectionProgress(ETrue);
-	    }
-	else
-	    {
-	    aStatus = EALREADY;
-	    }
-	iWriteLock.Signal();
+	if (iSocketPtr == NULL)
+		{
+		// RSocket::Open() is postponed from socket()	
+		TInt ret = OpenUsingPreference();
+		if (ret != KErrNone)	// error in open
+			{
+			aStatus = ret;
+			return;
+			}
+		}
+
+	iSocket.Connect(addr,aStatus);
+	User::WaitForRequest(aStatus);
 	}
 
 void CSocketDesc::ConnectCancel()
 	{
 	if (iSocketPtr != NULL)
 		{
-		ATOMICSOCKETOP(iSocket.CancelConnect(),NOP)
+		iSocket.CancelConnect();
 		}
 	}
 
 void CSocketDesc::Ioctl(int aCmd, void* aParam, TRequestStatus& aStatus)
 	{
-	TInt ret = KErrNone;
+	TInt ret=KErrNone;
 	int* param = reinterpret_cast<int*>(aParam);
 
-	ret = maybe_reopen_socket();
-	if (ret != KErrNone)
-	    {
-        Complete(aStatus, ret);
-        return;
-	    }
+	if (iSocketPtr == NULL)
+		{
+		ret = OpenUsingPreference();
+		if (ret != KErrNone)	// Error in open
+			{
+			Complete(aStatus,ret);
+			return;
+			}
+		}
 
 	switch ((unsigned)aCmd)
 		{
 		case FIONREAD:
 		case E32IONREAD:
-		    {
-			ATOMICSOCKETOP( ret=iSocket.GetOpt(KSOReadBytesPending,KSOLSocket,*param), ret = KErrBadHandle )
-		    }
+			ret=iSocket.GetOpt(KSOReadBytesPending,KSOLSocket,*param);
 			break;
 		case E32IOSELECT:
 			{
 			iIoctlBuf.Set((TText8*)aParam,4,4);
 			iIoctlLock.Wait();
 			iIoctlFlag = ETrue;		
-			ATOMICSOCKETOP(iSocket.Ioctl(KIOctlSelect,aStatus,&iIoctlBuf,KSOLSocket), Complete(aStatus,KErrBadHandle))
+			iSocket.Ioctl(KIOctlSelect,aStatus,&iIoctlBuf,KSOLSocket);
 			}
 			return;
 		case SIOCGIFCONF:
@@ -953,7 +969,7 @@
 			ret = StopInterface(aParam);
 			break;	
 		case SIOCATMARK:
-			ATOMICSOCKETOP(ret=iSocket.GetOpt(KSoTcpRcvAtMark,KSolInetTcp,*param), ret = KErrBadHandle)
+			ret=iSocket.GetOpt(KSoTcpRcvAtMark,KSolInetTcp,*param);
 			break;	
 		case SIOCGIFADDR:
 			ret = GetIpAddress(aParam);
@@ -995,7 +1011,7 @@
 	{
 	if (iSocketPtr && iIoctlFlag)
 		{
-		ATOMICSOCKETOP(iSocket.CancelIoctl(), NOP)
+		iSocket.CancelIoctl();
 		iIoctlLock.Signal();
 		iIoctlFlag = EFalse;
 		}
@@ -1010,25 +1026,27 @@
 //
 TInt CSocketDesc::Fcntl(TUint anArg, TUint aCmd)
 	{
-
-    TInt err = maybe_reopen_socket();
-    if (err != KErrNone)
-        return err;
-
-    return CSockDescBase::Fcntl(anArg, aCmd);
+	if (iSocketPtr == NULL)
+		{
+		TInt ret = OpenUsingPreference();
+		if (ret != KErrNone)	// Error in open
+			{
+			return ret;
+			}
+		}
+	return CSockDescBase::Fcntl(anArg, aCmd);
 	}
 
 TInt CSocketDesc :: GetIpAddress( void *aParam )
 	{
 	TInetAddr myAddr;
-	ATOMICSOCKETOP( iSocket.LocalName(myAddr), return KErrBadHandle )
+	iSocket.LocalName(myAddr);
 	TUint32 myIP = myAddr.Address();			
-	if (myIP == 0)
+	ifreq *ifr = (ifreq *)aParam;
+	if(myIP == 0)
 		{
 		return KErrGeneral;
 		}
-
-	ifreq *ifr = (ifreq *)aParam;
 	((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr.s_addr = myIP;
 	return KErrNone;
 	}
@@ -1036,14 +1054,13 @@
 TInt CSocketDesc :: GetRemoteIpAddress( void *aParam )
 	{
 	TInetAddr remoteAddr;
-	ATOMICSOCKETOP( iSocket.RemoteName(remoteAddr), return KErrBadHandle )
+	iSocket.RemoteName(remoteAddr);
 	TUint32 remoteIP = remoteAddr.Address();			
-
-	if (remoteIP == 0)
+	ifreq *ifr = (ifreq *)aParam;
+	if(remoteIP == 0)
 		{
 		return KErrGeneral;
 		}
-	ifreq *ifr = (ifreq *)aParam;
 	((struct sockaddr_in *)&ifr->ifr_dstaddr)->sin_addr.s_addr = remoteIP;
 	return KErrNone;
 	}
@@ -1191,16 +1208,16 @@
 	TPckgBuf<TSoInetIfQuery> ifq;
 	TBuf8 <25> ipBuf8;
 	TName aBuf;			
-	TInt ret = KErrNone;
-	ATOMICSOCKETOP( ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl), ret = KErrBadHandle )
+
+	TInt ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl);
 	if (ret != KErrNone)
 		{
 		return KErrGeneral;
 		}    	
 	TPckgBuf<TSoInet6InterfaceInfo> info;
 	TSoInet6InterfaceInfo &in = info();	
-	ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle )
-	while(ret == KErrNone)
+
+	while(iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info) == KErrNone)
 		{			
 		if(info().iName != _L("") && info().iName != _L("loop6") && info().iName != _L("loop4"))
 			{   			
@@ -1307,33 +1324,28 @@
 					}
 				}
 
-			}
-		ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle )
+			}					 	 
 		}
 	setout:	
 	TPckgBuf<TSoInet6InterfaceInfo> changeToNew(info());
-	ATOMICSOCKETOP(ret = iSocket.SetOpt(KSoInetConfigInterface, KSolInetIfCtrl,changeToNew), return KErrBadHandle )
-	return ret;
+	return iSocket.SetOpt(KSoInetConfigInterface, KSolInetIfCtrl,changeToNew); 		
 	}
 #endif // __SYMBIAN_COMPILE_UNUSED__
 
 TInt CSocketDesc::GetInterfaceDetails( void *aParam ,TInt aFlag, TInt aType )
 	{
+	ifreq *ifr = (ifreq *)aParam;
 	TPckgBuf<TSoInetIfQuery> ifq;
 
-	TInt ret = KErrNone; 
-	ATOMICSOCKETOP( ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl), ret = KErrBadHandle )
+	TInt ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl);
 	if (ret != KErrNone)
 		{
 		return KErrGeneral;
 		}
-	
-	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)
+	while(iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info) == KErrNone)
 		{
 
 		if(info().iName != _L("") && info().iName != _L("loop6") && info().iName != _L("loop4"))
@@ -1448,12 +1460,12 @@
 							               if(info().iFeatures&KIfCanSetHardwareAddr) */
 
 						break;																 				 
-				 
+					default:
+						break;					 
 					}
 				}
 
-			}
-		ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle )
+			}				 	 
 		}
 
 	return KErrNone;	
@@ -1461,14 +1473,19 @@
 
 TInt CSocketDesc::Poll(TPollMode aMode,TBool& aReadyStatus,TInt& aErrno)
 	{
-	TInt ret = maybe_reopen_socket();
-    if (ret != KErrNone)
-        {
-        return ret;
-        }
+	TInt ret;
+
+	if (iSocketPtr == NULL)
+		{
+		ret = OpenUsingPreference();
+		if (ret != KErrNone)	// Error in open
+			{
+			return ret;
+			}
+		}
 
     TInt status;
-    ATOMICSOCKETOP(ret = iSocket.GetOpt(KSOSelectPoll, KSOLSocket, status), ret = KErrBadHandle)
+    ret = iSocket.GetOpt(KSOSelectPoll, KSOLSocket, status);
     if (ret == KErrNone)
 		{
     	aReadyStatus = status & aMode;	
@@ -1480,11 +1497,16 @@
 /* The synchronous - non-blocking Poll */
 TInt CSocketDesc::Poll(TUint aEvents)
 	{
+	TInt err = 0;
 
-    TInt err = maybe_reopen_socket();
-	if (err != KErrNone)
-	    return err;
-		
+	if (iSocketPtr == NULL)
+		{
+		err = OpenUsingPreference();
+		if (err != KErrNone)	// Error in open
+			{
+			return err;
+			}
+		}
 	return CSockDescBase::Poll(aEvents);
 	}
 
@@ -1545,8 +1567,6 @@
 	TInt ifCount = ifc.ifc_len / sizeof(ifreq);
 	TInt i = 0;
 
-	// We wouldn't need this if we were using a StrNcmp below
-	ifrQuery->ifr_name[IFNAMSIZ-1] = 0; // don't assume NULL terminated input
 	// Search for the interface name
 	for (; i < ifCount; i++, ifr++)
 		{
@@ -1592,10 +1612,11 @@
 			ret = KErrArgument;
 			}
 
-		if (ret == KErrNone)
-		    {
-            ifc->ifc_len = sizeof(ifreq) * count;
-		    }
+		if (ret != KErrNone)
+			{
+			return ret;
+			}
+		ifc->ifc_len = sizeof(ifreq) * count;
 		return ret;
 		}
 
@@ -1635,7 +1656,7 @@
 	for (apIndex = 0; apIndex < length; apIndex++,ifr++)
 		{
 		TAccessPointRecord& ref = (*apArray)[apIndex];
-		ifr->ifr_name[IFNAMSIZ-1] = 0; // don't assume NULL terminated input
+		// Catch the character pointer
 		TPtr8 ptr((TText8*)ifr->ifr_name, IFNAMSIZ);
 
 		ret = CnvUtfConverter::ConvertFromUnicodeToUtf8(ptr, ref.iName);
@@ -1684,12 +1705,12 @@
 TInt CSocketDesc::SetInterfaceByName(void *aParam)
 	{
 	ifreq *ifr = (ifreq *)aParam;
-	if (!ifr)
+	if (ifr == NULL)
 		{
 		return KErrArgument;
 		}
 
-	ifr->ifr_name[IFNAMSIZ-1] = 0; // don't assume NULL terminated input
+	// Copy the null terminated interface name
 	TPtrC8 ptr((TText8*)ifr->ifr_name);
 	TInt ret = CnvUtfConverter::ConvertToUnicodeFromUtf8(iConnPref.iName,ptr);
 	if(ret > KErrNone )
@@ -1752,34 +1773,20 @@
 	         }
 	     else // No connection preference is set
 	         {
-	         ret = ECONNABORTED;
-            }
-        }
-    
-    if (ret == KErrNone)
-        {
-        __e32_atomic_store_rel32(&iSocketPtr, (unsigned long)&iSocket);
-        }
-    
-    iConnectInProgress = EFalse;
-
-    return ret;
-    }
+             ret = iSocket.Open(*iSockServPtr,addrfamily,iStyle,iProtocol);	         
+	         }
+	    }
+	
+	if(KErrNone == ret)
+		{
+		iSocketPtr = &iSocket;
+		}
+	iConnectInProgress = EFalse;
+	return ret;
+	}
 
 void CSocketDesc::TempClose()
     {
-    TUint32 ret = __e32_atomic_ior_ord32((void *)&iCount,0x8000);
-    if( ret >= 0x8000 )
-        {
-        // This indicates a TempClose has already been done from one of the threads
-        return;
-        }
-    // loop and yeild till no more references are held to the iSocket
-    while( iCount != 0x8000 )
-        {
-        // Yeild for 1 ms
-        User::After(1000);
-        }
     if (iSocket.SubSessionHandle() != 0)
         {
 	    iSocketPtr = NULL;
@@ -2118,8 +2125,7 @@
 		ConvertRtEntry(iroute(), rt);
 
 		//add the entry
-		ATOMICSOCKETOP( ret = iSocket.SetOpt(aReq, KSolInetRtCtrl, iroute),return KErrBadHandle )
-		return ret;
+		return iSocket.SetOpt(aReq, KSolInetRtCtrl, iroute);
 		}
 
 	return KErrUnknown;				
@@ -2169,23 +2175,22 @@
 
 TInt CSocketDesc::GetInterfaceByName(const TDesC& aIfName, TPckgBuf<TSoInetInterfaceInfo>& aIface)
 	{
-	TInt ret = KErrNone;
-	ATOMICSOCKETOP(ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl), ret = KErrBadHandle)
+	TInt ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl);
 	if (ret != KErrNone)
 		{
 		return ret;
 		}
 	TPckgBuf<TSoInetInterfaceInfo> iface;
-	ATOMICSOCKETOP(ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, iface), ret = KErrBadHandle)
-	while(ret == KErrNone)
+	while((ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, iface)) == KErrNone)
 		{
-		if (!iface().iAddress.IsUnspecified() && iface().iName.CompareF(aIfName) == 0)
+		if(!iface().iAddress.IsUnspecified()
+				&& iface().iName.CompareF(aIfName) == 0)
 			{
 			aIface = iface;
 			return ret;    	        
 			}
-		ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, iface), ret = KErrBadHandle )
 		}   	
+
 	return KErrUnknown;	
 	}
 
@@ -2198,25 +2203,27 @@
 		return KErrArgument;	
 		}
 
-	if (ifr->ifr_name[0] != '\0')
+	if (ifr->ifr_name[0]!='\0')
 		{
-        TPckgBuf<TSoInetInterfaceInfo> iface;
-        TFileName name;
-        ifr->ifr_name[IFNAMSIZ-1] = 0; // don't assume NULL terminated input
-        name.Copy(TPtrC8((TText8*)ifr->ifr_name));
-    
-        TInt ret = GetInterfaceByName(name, iface); 		
-        if (ret != KErrNone)
-            return ret;
-    
-        if (iface().iHwAddr.Length() > sizeof(SSockAddr))		
-            {
-            Mem::Copy(&(ifr->ifr_hwaddr.sa_data[0]),&(iface().iHwAddr[sizeof(SSockAddr)]), 6);
-            ifr->ifr_hwaddr.sa_family = (TUint16)iface().iHwAddr.Family();
-            ifr->ifr_hwaddr.sa_port = ByteOrder::Swap16(iface().iHwAddr.Port());				
-            return ret;
-            }
+	TPckgBuf<TSoInetInterfaceInfo> iface;
+	TFileName name;
+	name.Copy(TPtrC8((TText8*)ifr->ifr_name));
+
+		TInt ret = GetInterfaceByName(name, iface); 		
+		
+		if (ret != KErrNone)
+			{
+		return ret;		
+			}
+
+	if(iface().iHwAddr.Length() > sizeof(SSockAddr))		
+		{
+		Mem::Copy(&(ifr->ifr_hwaddr.sa_data[0]),&(iface().iHwAddr[sizeof(SSockAddr)]), 6);
+		ifr->ifr_hwaddr.sa_family = (TUint16)iface().iHwAddr.Family();
+		ifr->ifr_hwaddr.sa_port = ByteOrder::Swap16(iface().iHwAddr.Port());				
+		return ret;				
 		}
+		}	
 
 	return KErrUnknown;
 	}
@@ -2229,15 +2236,14 @@
 TInt CSocketDesc::GetActiveInterface( void *aParam)
     {
     TInt ifindex = -1;
-    TInt ret = KErrNone;
-    ATOMICSOCKETOP(ret = iSocket.GetOpt(KSoInterfaceIndex, KSolInetIp , ifindex), ret = KErrBadHandle)
+    TInt ret = iSocket.GetOpt(KSoInterfaceIndex, KSolInetIp , ifindex);
     if(ret!=KErrNone)
         {
         return ret;
         }   
     TPckgBuf<TSoInetIfQuery> opt;
     opt().iIndex = ifindex;
-    ATOMICSOCKETOP(ret = iSocket.GetOpt(KSoInetIfQueryByIndex, KSolInetIfQuery, opt), ret = KErrBadHandle)
+    ret = iSocket.GetOpt(KSoInetIfQueryByIndex, KSolInetIfQuery, opt);
     if(ret!=KErrNone)
         {
         return ret;