genericopenlibs/openenvcore/backend/src/corebackend/usocket.cpp
branchRCL_3
changeset 75 254b651f304e
parent 64 c44f36bb61a3
equal deleted inserted replaced
64:c44f36bb61a3 75:254b651f304e
   230 		//If the address is v4 mapped, we take the last 4 bytes from the 16 bytes long v6 structure. 
   230 		//If the address is v4 mapped, we take the last 4 bytes from the 16 bytes long v6 structure. 
   231 		if(isV4Mapped)
   231 		if(isV4Mapped)
   232 			fromaddr = (from[15]<<24)+(from[14]<<16)+(from[13]<<8)+from[12];
   232 			fromaddr = (from[15]<<24)+(from[14]<<16)+(from[13]<<8)+from[12];
   233 		else
   233 		else
   234 			fromaddr = (from[0]<<24)+(from[1]<<16)+(from[2]<<8)+ from[3];
   234 			fromaddr = (from[0]<<24)+(from[1]<<16)+(from[2]<<8)+ from[3];
   235 		unsigned char * ptr = (unsigned char *)&fromaddr;
   235 		*(TUint32*)sp->sa_data=fromaddr;
   236 		sp->sa_data[0] =  ptr[0];
       
   237 		sp->sa_data[1] =  ptr[1];
       
   238 		sp->sa_data[2] =  ptr[2];
       
   239 		sp->sa_data[3] =  ptr[3];
       
   240 		*len=8;
   236 		*len=8;
   241 		return;
   237 		return;
   242 		}
   238 		}
   243 	else if (Family()==AF_INET6)
   239 	else if (Family()==AF_INET6)
   244 		{
   240 		{
   958 			break;	
   954 			break;	
   959 		case SIOCATMARK:
   955 		case SIOCATMARK:
   960 			ATOMICSOCKETOP(ret=iSocket.GetOpt(KSoTcpRcvAtMark,KSolInetTcp,*param), ret = KErrBadHandle)
   956 			ATOMICSOCKETOP(ret=iSocket.GetOpt(KSoTcpRcvAtMark,KSolInetTcp,*param), ret = KErrBadHandle)
   961 			break;	
   957 			break;	
   962 		case SIOCGIFADDR:
   958 		case SIOCGIFADDR:
   963 		    ret = GetInterfaceAttributes(aParam, EACTIVE_GETIP);
   959 			ret = GetIpAddress(aParam);
   964 			break;	
   960 			break;	
   965 		case SIOCGIFNUM:
   961 		case SIOCGIFNUM:
   966 			ret = GetInterafceNumber(aParam);
   962 			ret = GetInterafceNumber(aParam);
   967 			break;	
   963 			break;	
   968 		case SIOCADDRT:
   964 		case SIOCADDRT:
   975 			ret = GetInterfaceHWAddress(aParam);
   971 			ret = GetInterfaceHWAddress(aParam);
   976 		    break;
   972 		    break;
   977 		case SIOCGIFACTIVEIAP:
   973 		case SIOCGIFACTIVEIAP:
   978 		    ret = GetActiveInterface( aParam);
   974 		    ret = GetActiveInterface( aParam);
   979 		    break;
   975 		    break;
   980 		case SIOCGIFFLAGS:
   976 		
   981 		    ret = GetInterfaceAttributes(aParam, EACCESS_GETFLAGS);
       
   982 		    break;
       
   983 		case SIOCGIFMTU:
       
   984 		    ret = GetInterfaceAttributes(aParam, EACCESS_GETMTU);
       
   985 		    break;
       
   986 		case SIOCGIFNETMASK:
       
   987 		    ret = GetInterfaceAttributes(aParam, EACCESS_GETNETMASK);
       
   988 		    break;
       
   989 		case SIOCGIFDEFGATEWAY:
       
   990 		    ret = GetInterfaceAttributes(aParam, EACCESS_GETDEFGATEWAY);
       
   991 		    break;
       
   992 
       
   993 		case SIOCSIFMTU:
       
   994 		    ret = SetInterfaceAttributes(aParam, EACCESS_SETMTU);
       
   995 		    break;
       
   996 		 case SIOCENUMROUTES:
       
   997             ret = EnumerateRoutes(aParam);
       
   998             break;
       
   999 		 case SIOCSETDNSSUFFIX:
       
  1000 		     ret = SetInterfaceAttributes(aParam, EACCESS_SETDNSSUFFIX);
       
  1001 			 break;
       
  1002 		 case SIOCGETDNSSUFFIX:
       
  1003 		     ret = GetInterfaceAttributes(aParam, EACCESS_GETDNSSUFFIX);
       
  1004 		     break;
       
  1005 		 case SIOCSNAMESERVER:
       
  1006 		     ret = SetNameServer(aParam,EACCESS_SETNAMESERVERS );
       
  1007 		     break;
       
  1008 		 case SIOCGNAMESERVER:
       
  1009 		     ret = GetNameServer(aParam, EACCESS_GETNAMESERVERS);
       
  1010              break;
       
  1011 		default:
   977 		default:
  1012 			ret=KErrNotSupported;
   978 			ret=KErrNotSupported;
  1013 			break;
   979 			break;
  1014 		}
   980 		}
  1015 	Complete(aStatus,ret);
   981 	Complete(aStatus,ret);
  1049     if (err != KErrNone)
  1015     if (err != KErrNone)
  1050         return err;
  1016         return err;
  1051 
  1017 
  1052     return CSockDescBase::Fcntl(anArg, aCmd);
  1018     return CSockDescBase::Fcntl(anArg, aCmd);
  1053 	}
  1019 	}
  1054 /*
  1020 
  1055 TInt CSocketDesc :: GetIpAddress( void *aParam )
  1021 TInt CSocketDesc :: GetIpAddress( void *aParam )
  1056 	{
  1022 	{
  1057 	TInetAddr myAddr;
  1023 	TInetAddr myAddr;
  1058 	ATOMICSOCKETOP( iSocket.LocalName(myAddr), return KErrBadHandle )
  1024 	ATOMICSOCKETOP( iSocket.LocalName(myAddr), return KErrBadHandle )
  1059 	TUint32 myIP = myAddr.Address();			
  1025 	TUint32 myIP = myAddr.Address();			
  1063 		}
  1029 		}
  1064 
  1030 
  1065 	ifreq *ifr = (ifreq *)aParam;
  1031 	ifreq *ifr = (ifreq *)aParam;
  1066 	((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr.s_addr = myIP;
  1032 	((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr.s_addr = myIP;
  1067 	return KErrNone;
  1033 	return KErrNone;
  1068 	}*/
  1034 	}
  1069 
  1035 
  1070 TInt CSocketDesc :: GetRemoteIpAddress( void *aParam )
  1036 TInt CSocketDesc :: GetRemoteIpAddress( void *aParam )
  1071 	{
  1037 	{
  1072 	TInetAddr remoteAddr;
  1038 	TInetAddr remoteAddr;
  1073 	ATOMICSOCKETOP( iSocket.RemoteName(remoteAddr), return KErrBadHandle )
  1039 	ATOMICSOCKETOP( iSocket.RemoteName(remoteAddr), return KErrBadHandle )
  1216 		}
  1182 		}
  1217 	CleanupStack::PopAndDestroy();// view
  1183 	CleanupStack::PopAndDestroy();// view
  1218 	CleanupStack::PopAndDestroy(iapDatabase);	
  1184 	CleanupStack::PopAndDestroy(iapDatabase);	
  1219 	return;
  1185 	return;
  1220 	}
  1186 	}
  1221 #endif // __SYMBIAN_COMPILE_UNUSED__
  1187 
  1222 
  1188 TInt CSocketDesc :: SetInterfaceDetails( void *aParam ,TInt aFlag, TInt aType )
  1223 
  1189 	{
  1224 
  1190 	ifreq *ifr = (ifreq *)aParam;
  1225 TInt CSocketDesc::GetInterfaceInfo(TSoInetInterfaceInfo& aIfInfo, TInt aIapId )
  1191 	TPckgBuf<TSoInetIfQuery> ifq;
  1226 	{
  1192 	TBuf8 <25> ipBuf8;
  1227 	 TPckgBuf<TSoInetInterfaceInfo> info;		
  1193 	TName aBuf;			
  1228 	TInt ret = KErrNone;
  1194 	TInt ret = KErrNone;
  1229 	ATOMICSOCKETOP( ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl), ret = KErrBadHandle )
  1195 	ATOMICSOCKETOP( ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl), ret = KErrBadHandle )
  1230 	if (ret != KErrNone)
  1196 	if (ret != KErrNone)
  1231 		{
  1197 		{
  1232 		return KErrGeneral;
  1198 		return KErrGeneral;
  1233 		}    	
  1199 		}    	
       
  1200 	TPckgBuf<TSoInet6InterfaceInfo> info;
       
  1201 	TSoInet6InterfaceInfo &in = info();	
  1234 	ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle )
  1202 	ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle )
  1235 	while(ret == KErrNone)
  1203 	while(ret == KErrNone)
  1236 		{			
  1204 		{			
  1237 		if(info().iName != _L(""))
  1205 		if(info().iName != _L("") && info().iName != _L("loop6") && info().iName != _L("loop4"))
  1238             {   			
  1206 			{   			
  1239             TPckgBuf<TSoInetIfQuery> optifquery;
  1207 			TDes16& aName = info().iName;							
  1240             optifquery().iName = info().iName;
  1208 			if( ((aFlag == 0 ) && ( aName.FindC(_L("WLAN")) != KErrNotFound )) ||
  1241 			ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetIfQueryByName, KSolInetIfQuery, optifquery), ret = KErrBadHandle )
  1209 					((aFlag == 1) && (aName.FindC(_L("Generic")) != KErrNotFound )) )
  1242             if( ret  == KErrNone)
       
  1243                 {
       
  1244                 if(optifquery().iZone[1] == aIapId && info().iAddress.Address() != NULL)
       
  1245                 	{
       
  1246                     aIfInfo = info();
       
  1247                 	return KErrNone;
       
  1248                 	}
       
  1249                 }
       
  1250             }
       
  1251 			ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle )
       
  1252         }
       
  1253     return KErrNotFound;
       
  1254 	}
       
  1255 TInt CSocketDesc :: SetInterfaceDetails( void *aParam ,TInt /*aFlag*/, TInt aType, TInt aIapId )
       
  1256 	{
       
  1257 	TSoInet6InterfaceInfo ifInfo; 
       
  1258 	TInt ret = KErrNone;
       
  1259 	if((ret = GetInterfaceInfo(ifInfo,aIapId)) != KErrNone)
       
  1260 		{
       
  1261 		return ret;
       
  1262 		}
       
  1263     ifreq *ifr = (ifreq *)aParam;
       
  1264 	switch(aType)
       
  1265 		{				
       
  1266 		case  EACCESS_SETMETRIC:
       
  1267 			if(ifInfo.iState == EIfUp)										 
       
  1268 				{
  1210 				{
  1269 				ifInfo.iSpeedMetric =  ifr->ifr_metric;
  1211 				switch(aType)
       
  1212 					{				
       
  1213 					case  EACCESS_SETMETRIC:
       
  1214 						if(info().iState == EIfUp)										 
       
  1215 							{
       
  1216 							info().iSpeedMetric =  ifr->ifr_metric;
       
  1217 							}
       
  1218 						goto setout;
       
  1219 
       
  1220 					case  EACCESS_SETMTU:										 
       
  1221 						if(info().iState == EIfUp)
       
  1222 							{
       
  1223 							info().iMtu = ifr->ifr_mtu ;		
       
  1224 							}		
       
  1225 						goto setout;
       
  1226 
       
  1227 					case  EACCESS_SETNETMASK :																																																					
       
  1228 						// Presently netmask address is NULL											
       
  1229 						if((info().iState == EIfUp) && (ifr->ifr_addr.sa_data !=NULL))
       
  1230 							{																																																		
       
  1231 							/*
       
  1232 							CharToTBuf8(ifr->ifr_addr.sa_data,ipBuf8);											
       
  1233 											if (CnvUtfConverter::ConvertToUnicodeFromUtf8( aBuf,ipBuf8 ) == KErrNone)
       
  1234 											{													
       
  1235 												ret = info().iNetMask.Input(aBuf);												
       
  1236 											}																							
       
  1237 							info().iNetMask.SetAddress(INET_ADDR(255,255,255,0));	
       
  1238 							*/
       
  1239 							return KErrNotSupported;
       
  1240 							}
       
  1241 						break;	
       
  1242 					case  EACCESS_SETBROADCAST :										
       
  1243 						if((info().iState == EIfUp) && (ifr->ifr_broadaddr.sa_data !=NULL))
       
  1244 							{																																																		
       
  1245 							/*CharToTBuf8(ifr->ifr_broadaddr.sa_data,ipBuf8);											
       
  1246 											if (CnvUtfConverter::ConvertToUnicodeFromUtf8( aBuf,ipBuf8 ) == KErrNone)
       
  1247 											{													
       
  1248 												ret = info().iBrdAddr.Input(aBuf);												
       
  1249 											} 
       
  1250 							*/												
       
  1251 							return KErrNotSupported;
       
  1252 							}
       
  1253 
       
  1254 						break;
       
  1255 					case  EACCESS_SETPHYSADDR :										
       
  1256 						// Currently no imeplentation is given as KIfHasHardwareAddr is always 
       
  1257 						// set to 0 for wlan and GPRS
       
  1258 						if(info().iFeatures&KIfHasHardwareAddr)
       
  1259 							{
       
  1260 							return KErrNotSupported;
       
  1261 							}
       
  1262 						break;									
       
  1263 					case  EACCESS_SETFLAGS :										
       
  1264 						info().iFeatures = 0;
       
  1265 						// Interface UP
       
  1266 						if((ifr->ifr_flags & IFF_UP) && (ifr->ifr_flags & IFF_DRV_RUNNING)) 
       
  1267 							{
       
  1268 							info().iState = EIfUp;																						
       
  1269 							}																						
       
  1270 						else
       
  1271 							{
       
  1272 							info().iState = EIfDown;																																	
       
  1273 							}																																	
       
  1274 
       
  1275 						// Loopback										
       
  1276 						if(ifr->ifr_flags & IFF_LOOPBACK)
       
  1277 							{
       
  1278 							info().iFeatures |= KIfIsLoopback;																				            													           
       
  1279 							}																				            													           
       
  1280 
       
  1281 						// point to point support
       
  1282 						if(ifr->ifr_flags &  IFF_POINTOPOINT)
       
  1283 							{
       
  1284 							info().iFeatures |= KIfIsPointToPoint; 							                
       
  1285 							} 							                
       
  1286 
       
  1287 						// Broadcast
       
  1288 						if(ifr->ifr_flags & IFF_BROADCAST)
       
  1289 							{
       
  1290 							info().iFeatures |=KIfCanBroadcast; 
       
  1291 							} 
       
  1292 
       
  1293 
       
  1294 						// Multicast
       
  1295 						if(ifr->ifr_flagshigh & IFF_MULTICAST)
       
  1296 							{
       
  1297 							info().iFeatures = KIfCanMulticast;							            	      
       
  1298 							}
       
  1299 						//these flags details are available in symbian but not used by lib layer.
       
  1300 						/* if(info().iFeatures&KIfCanSetMTU)			            	
       
  1301 							               if(info().iFeatures&KIfHasHardwareAddr)    
       
  1302 							               if(info().iFeatures&KIfCanSetHardwareAddr) */
       
  1303 						goto setout;							            	
       
  1304 
       
  1305 					default:
       
  1306 						break;					 
       
  1307 					}
  1270 				}
  1308 				}
  1271 			break;
  1309 
  1272 
  1310 			}
  1273 		case  EACCESS_SETMTU:										 
  1311 		ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle )
  1274 			if(ifInfo.iState == EIfUp)
  1312 		}
       
  1313 	setout:	
       
  1314 	TPckgBuf<TSoInet6InterfaceInfo> changeToNew(info());
       
  1315 	ATOMICSOCKETOP(ret = iSocket.SetOpt(KSoInetConfigInterface, KSolInetIfCtrl,changeToNew), return KErrBadHandle )
       
  1316 	return ret;
       
  1317 	}
       
  1318 #endif // __SYMBIAN_COMPILE_UNUSED__
       
  1319 
       
  1320 TInt CSocketDesc::GetInterfaceDetails( void *aParam ,TInt aFlag, TInt aType )
       
  1321 	{
       
  1322 	TPckgBuf<TSoInetIfQuery> ifq;
       
  1323 
       
  1324 	TInt ret = KErrNone; 
       
  1325 	ATOMICSOCKETOP( ret = iSocket.SetOpt(KSoInetEnumInterfaces, KSolInetIfCtrl), ret = KErrBadHandle )
       
  1326 	if (ret != KErrNone)
       
  1327 		{
       
  1328 		return KErrGeneral;
       
  1329 		}
       
  1330 	
       
  1331 	ifreq *ifr = (ifreq *)aParam;
       
  1332     *(ifr->ifr_addr.sa_data) = '\0';
       
  1333 
       
  1334 	TPckgBuf<TSoInetInterfaceInfo> info;
       
  1335 	ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle )
       
  1336 	while( ret == KErrNone)
       
  1337 		{
       
  1338 
       
  1339 		if(info().iName != _L("") && info().iName != _L("loop6") && info().iName != _L("loop4"))
       
  1340 			{   
       
  1341 			TDes16& aName = info().iName;
       
  1342 			TName aBuf;
       
  1343 			TBuf8<KMaxName> ipAddr;
       
  1344 			if( ((aFlag == 0 ) && ( aName.FindC(_L("WLAN")) != KErrNotFound )) ||
       
  1345 					((aFlag == 1) && (aName.FindC(_L("Generic")) != KErrNotFound )) )
  1275 				{
  1346 				{
  1276 				ifInfo.iMtu = ifr->ifr_mtu ;		
  1347 				switch(aType)
  1277 				}		
  1348 					{
  1278 			break;
  1349 
  1279 
  1350 					case  EACTIVE_GETIP :
  1280 		case  EACCESS_SETPHYSADDR :										
  1351 						if((info().iState == EIfUp) && (info().iAddress.Address() != NULL))
  1281 			// Currently no imeplentation is given as KIfHasHardwareAddr is always 
  1352 							{
  1282 			// set to 0 for wlan and GPRS
  1353 							if(!((info().iAddress.IsLinkLocal()) || (info().iAddress.IsSiteLocal())))
  1283 			if(ifInfo.iFeatures&KIfHasHardwareAddr)
  1354 								{
  1284 				{
  1355 								info().iAddress.Output(aBuf);  
  1285 				return KErrNotSupported;
  1356 								if (CnvUtfConverter::ConvertFromUnicodeToUtf8( ipAddr, aBuf ) == KErrNone)
       
  1357 									{			
       
  1358 									StrlCopy(ifr->ifr_addr.sa_data,(const char *) ipAddr.PtrZ(),ipAddr.Length()+1);														
       
  1359 									}  
       
  1360 								}
       
  1361 							}
       
  1362 						break;
       
  1363 					case  EACCESS_GETMETRIC:
       
  1364 						ifr->ifr_metric = 0;
       
  1365 						if (info().iState == EIfUp)
       
  1366 							{
       
  1367 							ifr->ifr_metric = info().iSpeedMetric;
       
  1368 							}
       
  1369 						break;
       
  1370 					case  EACCESS_GETMTU:
       
  1371 						ifr->ifr_mtu = 0;
       
  1372 						if (info().iState == EIfUp)
       
  1373 							{
       
  1374 							ifr->ifr_mtu = info().iMtu;
       
  1375 							}
       
  1376 						break;	
       
  1377 					case  EACCESS_GETNETMASK :
       
  1378 						*(ifr->ifr_addr.sa_data) = '\0';
       
  1379 						// Presently netmask address is NULL
       
  1380 						if((info().iState == EIfUp) && (info().iNetMask.Address() != NULL))
       
  1381 							{
       
  1382 							//anAddr = info().iNetMask.Address();	
       
  1383 							info().iNetMask.Output(aBuf);  
       
  1384 							if (CnvUtfConverter::ConvertFromUnicodeToUtf8( ipAddr, aBuf ) == KErrNone)
       
  1385 								{			
       
  1386 								StrlCopy(ifr->ifr_addr.sa_data,(const char *) ipAddr.PtrZ(),ipAddr.Length()+1);												
       
  1387 								}  											
       
  1388 							}
       
  1389 						break;	
       
  1390 					case  EACCESS_GETBROADCAST :
       
  1391 						*(ifr->ifr_broadaddr.sa_data) = '\0';
       
  1392 						// Presently Breaodcast address is NULL
       
  1393 						if((info().iState == EIfUp) && (info().iBrdAddr.Address() != NULL))
       
  1394 							{
       
  1395 
       
  1396 							//anAddr = info().iBrdAddr.Address();	
       
  1397 							info().iBrdAddr.Output(aBuf);  
       
  1398 							if (CnvUtfConverter::ConvertFromUnicodeToUtf8( ipAddr, aBuf ) == KErrNone)
       
  1399 								{			
       
  1400 								StrlCopy(ifr->ifr_broadaddr.sa_data,(const char *) ipAddr.PtrZ(),ipAddr.Length()+1);												
       
  1401 								}											
       
  1402 							}
       
  1403 						break;
       
  1404 					case  EACCESS_GETPHYSADDR :
       
  1405 						ifr->ifr_phys = 0;
       
  1406 						// Currently no imeplentation is given as KIfHasHardwareAddr is always 
       
  1407 						// set to 0 for wlan and GPRS
       
  1408 						if(info().iFeatures&KIfHasHardwareAddr)
       
  1409 							{
       
  1410 							//nada.
       
  1411 							}
       
  1412 						break;									
       
  1413 					case  EACCESS_GETFLAGS :
       
  1414 						ifr->ifr_flags = 0;
       
  1415 						ifr->ifr_flagshigh=0;
       
  1416 						// Interface UP
       
  1417 						if(info().iState == EIfUp)
       
  1418 							{
       
  1419 							ifr->ifr_flags |= IFF_UP; 
       
  1420 							ifr->ifr_flags |= IFF_DRV_RUNNING;
       
  1421 							}
       
  1422 						// Loopback
       
  1423 						if(info().iFeatures&KIfIsLoopback)
       
  1424 							{
       
  1425 							ifr->ifr_flags |= IFF_LOOPBACK;
       
  1426 							}										            													           
       
  1427 
       
  1428 						// point to point support
       
  1429 						if(info().iFeatures&KIfIsPointToPoint) 
       
  1430 							{
       
  1431 							ifr->ifr_flags |= IFF_POINTOPOINT;	
       
  1432 							}
       
  1433 						
       
  1434 						// Broadcast
       
  1435 						if(info().iFeatures&KIfCanBroadcast)
       
  1436 							{
       
  1437 							ifr->ifr_flags |= IFF_BROADCAST;
       
  1438 							}      
       
  1439 
       
  1440 						// Multicast
       
  1441 						if(info().iFeatures&KIfCanMulticast)
       
  1442 							{
       
  1443 							ifr->ifr_flagshigh |= ((IFF_MULTICAST & 0xff00) >> 8);
       
  1444 							}
       
  1445 						//these flags details are available in symbian but not used by lib layer.
       
  1446 						/* if(info().iFeatures&KIfCanSetMTU)			            	
       
  1447 							               if(info().iFeatures&KIfHasHardwareAddr)    
       
  1448 							               if(info().iFeatures&KIfCanSetHardwareAddr) */
       
  1449 
       
  1450 						break;																 				 
       
  1451 				 
       
  1452 					}
  1286 				}
  1453 				}
  1287 			break;							
  1454 
  1288 		case EACCESS_SETDNSSUFFIX:
  1455 			}
  1289 			{
  1456 		ATOMICSOCKETOP( ret = iSocket.GetOpt(KSoInetNextInterface, KSolInetIfCtrl, info), ret = KErrBadHandle )
  1290 			if_dns_suffixes * dns_suffix = static_cast<if_dns_suffixes *>(aParam);
  1457 		}
  1291 			char **suffixes = dns_suffix->suffixes;
  1458 
  1292 			TSoInetInterfaceInfoExtnDnsSuffix interfaceInfo;
  1459 	return KErrNone;	
  1293 			(TSoInetInterfaceInfo &)interfaceInfo = ifInfo;
       
  1294 			interfaceInfo.iDomainSuffix.DeleteAll();
       
  1295             TPckgBuf<TSoInetInterfaceInfoExtnDnsSuffix> configInfo(interfaceInfo);
       
  1296 
       
  1297 			ATOMICSOCKETOP(ret = iSocket.SetOpt(KSoInetConfigInterface,KSolInetIfCtrl,configInfo), ret = KErrBadHandle)
       
  1298 
       
  1299 			for(int i = 0; suffixes[i]; i++)  //check the number of suffixes that can be configured
       
  1300 				{
       
  1301 				TPtrC8 suffix((const unsigned char *)suffixes[i]); 
       
  1302 				/*ret = configInfo().iDomainSuffix.Copy(suffix);
       
  1303 				if(ret != KErrNone)
       
  1304 				    {
       
  1305                     return ret;
       
  1306 				    }*/
       
  1307 				ret = CnvUtfConverter::ConvertToUnicodeFromUtf8(configInfo().iDomainSuffix.iSuffixName,suffix);
       
  1308 				configInfo().iDomainSuffix.iDomainSuffixFunction = EInetAddSuffix;
       
  1309                ATOMICSOCKETOP( ret = iSocket.SetOpt(KSoInetConfigInterface,KSolInetIfCtrl,configInfo), ret = KErrBadHandle)
       
  1310                 if(ret != KErrNone)
       
  1311                     {
       
  1312                     return ret;
       
  1313                     }
       
  1314 				
       
  1315 				}
       
  1316 			return ret;
       
  1317 			}
       
  1318 		case EACCESS_SETNAMESERVERS:
       
  1319 			{
       
  1320 			if_name_servers *name_server = static_cast<if_name_servers*>(aParam);
       
  1321 			if((ret = ConvertSockToTInetAddr(&name_server->nameserver1,ifInfo.iNameSer1)) != KErrNone)
       
  1322 				{
       
  1323 				return ret;
       
  1324 				}
       
  1325 			if((ret = ConvertSockToTInetAddr(&name_server->nameserver2,ifInfo.iNameSer2)) != KErrNone)
       
  1326 				{
       
  1327 				return ret;
       
  1328 				}
       
  1329 			break;
       
  1330 			}
       
  1331 
       
  1332 		default:
       
  1333 			return KErrArgument;					 
       
  1334 		}
       
  1335 	TPckgBuf<TSoInet6InterfaceInfo> pkgIfInfo(ifInfo);
       
  1336 	ATOMICSOCKETOP(ret = iSocket.SetOpt(KSoInetConfigInterface, KSolInetIfCtrl,pkgIfInfo), ret = KErrBadHandle)
       
  1337 	return ret;
       
  1338 	}
       
  1339 
       
  1340 //This function frees the memory allocated by SIOCGETDNSSUFFIX ioctl
       
  1341 void CSocketDesc::FreeDNSSuffixes(char ** suffixes)
       
  1342     {
       
  1343     for(int i = 0; suffixes[i]; i++)
       
  1344         {
       
  1345         delete[] suffixes[i];
       
  1346         }
       
  1347     delete[] suffixes;
       
  1348     }
       
  1349 
       
  1350 TInt CSocketDesc::GetInterfaceDetails( void *aParam ,TInt /*aFlag*/, TInt aType, TInt aIapId )
       
  1351 	{
       
  1352 
       
  1353 	ifreq *ifr = (ifreq *)aParam;
       
  1354 	*(ifr->ifr_addr.sa_data) = '\0';
       
  1355     TInt ret = 0;
       
  1356 
       
  1357     TSoInetInterfaceInfo ifInfo; 
       
  1358 
       
  1359 	if((ret = GetInterfaceInfo(ifInfo,aIapId)) != KErrNone)
       
  1360 		{
       
  1361 		return ret;
       
  1362 		}
       
  1363 
       
  1364 	switch(aType)
       
  1365 		{
       
  1366 
       
  1367 		case  EACTIVE_GETIP :
       
  1368 			if(ifInfo.iState == EIfUp)
       
  1369 				{
       
  1370 				ret = ConvertTInetToSockAddr(ifInfo.iAddress,&ifr->ifr_addr);
       
  1371 				return ret;
       
  1372 				}
       
  1373 			break;
       
  1374 		case  EACCESS_GETMETRIC:
       
  1375 			if(ifInfo.iState == EIfUp)
       
  1376 				{
       
  1377 				ifr->ifr_metric = ifInfo.iSpeedMetric;
       
  1378 				return KErrNone;
       
  1379 				}
       
  1380 			break;
       
  1381 		case  EACCESS_GETMTU:
       
  1382 			if(ifInfo.iState == EIfUp)
       
  1383 				{
       
  1384 				ifr->ifr_mtu = ifInfo.iMtu;
       
  1385 				return KErrNone;
       
  1386 				}
       
  1387 			break;	
       
  1388 		case  EACCESS_GETNETMASK :
       
  1389 			// Presently netmask address is NULL
       
  1390 			if(ifInfo.iState == EIfUp)
       
  1391 				{
       
  1392 				ret = ConvertTInetToSockAddr(ifInfo.iNetMask,&ifr->ifr_addr);
       
  1393 				return ret;
       
  1394 				}
       
  1395 			break;	
       
  1396 		case  EACCESS_GETBROADCAST :
       
  1397 			// Presently Breaodcast address is NULL
       
  1398 			if(ifInfo.iState == EIfUp)
       
  1399 				{
       
  1400 				ret = ConvertTInetToSockAddr(ifInfo.iBrdAddr,&ifr->ifr_broadaddr);
       
  1401 				return ret;
       
  1402 				}
       
  1403 			break;
       
  1404 		case EACCESS_GETDNSSUFFIX:
       
  1405 		    {
       
  1406 
       
  1407 		    TInetSuffix data;
       
  1408 		    TPckgBuf<TInetSuffix> opt(data);
       
  1409 		    // Set the option to start enumeration of domain suffix on the active interface
       
  1410 			TInt err = KErrNone;
       
  1411 		    ATOMICSOCKETOP( err = iSocket.SetOpt(KSoInetEnumDomainSuffix, KSolInetIfCtrl), err = KErrBadHandle) 
       
  1412 		    if(err != KErrNone) 
       
  1413 		        {
       
  1414 		        return err;
       
  1415 		        }
       
  1416 		    struct if_dns_suffixes * dns_suffix = static_cast<if_dns_suffixes *>(aParam);
       
  1417 		    RPointerArray<char> suffixArray;
       
  1418 			ATOMICSOCKETOP (err = iSocket.GetOpt(KSoInetNextDomainSuffix, KSolInetIfCtrl, opt),err = KErrBadHandle)
       
  1419 		    while(err == KErrNone)
       
  1420 		        {
       
  1421                 char *suffix = new char[opt().iSuffixName.Length()+1];
       
  1422                 if((ret = suffixArray.Append(suffix)) != KErrNone)
       
  1423                     {
       
  1424                     suffixArray.ResetAndDestroy();
       
  1425                     return ret;
       
  1426                     }
       
  1427                 TPtr8 ptr((unsigned char *)suffix,opt().iSuffixName.Length()+1);
       
  1428                 ret = CnvUtfConverter::ConvertFromUnicodeToUtf8(ptr,opt().iSuffixName);
       
  1429                 //ptr.Copy(opt().iSuffixName);
       
  1430                 if(ret != KErrNone)
       
  1431                     {
       
  1432                     suffixArray.ResetAndDestroy();
       
  1433                     return ret;
       
  1434                     }
       
  1435                 ptr.ZeroTerminate();
       
  1436 				ATOMICSOCKETOP (err = iSocket.GetOpt(KSoInetNextDomainSuffix, KSolInetIfCtrl, opt),err = KErrBadHandle)
       
  1437 		    	}
       
  1438 
       
  1439 		    dns_suffix->suffixes = new char*[suffixArray.Count() + 1];
       
  1440 		    for(int i = 0 ; i< suffixArray.Count(); i++)
       
  1441 		    	{
       
  1442                 dns_suffix->suffixes[i] = suffixArray[i];
       
  1443 		    	}
       
  1444             dns_suffix->suffixes[suffixArray.Count()] = NULL;
       
  1445             suffixArray.Close();
       
  1446             return KErrNone;
       
  1447 
       
  1448 		}
       
  1449 			
       
  1450 		case EACCESS_GETNAMESERVERS:
       
  1451 			{
       
  1452 			if_name_servers *name_server = static_cast<if_name_servers*>(aParam);
       
  1453 			if((ret = ConvertTInetToSockAddr(ifInfo.iNameSer1, &name_server->nameserver1)) != KErrNone)
       
  1454 				{
       
  1455 				return ret;
       
  1456 				}
       
  1457 			if((ret = ConvertTInetToSockAddr(ifInfo.iNameSer2, &name_server->nameserver2)) != KErrNone)
       
  1458 				{
       
  1459 				return ret;
       
  1460 				}
       
  1461 			return KErrNone;
       
  1462 
       
  1463 			}
       
  1464 
       
  1465 		case  EACCESS_GETPHYSADDR :
       
  1466 			ifr->ifr_phys = 0;
       
  1467 			// Currently no imeplentation is given as KIfHasHardwareAddr is always 
       
  1468 			// set to 0 for wlan and GPRS
       
  1469 			if(ifInfo.iFeatures&KIfHasHardwareAddr)
       
  1470 				{
       
  1471 				//nada.
       
  1472 				}
       
  1473 			return KErrNotSupported;
       
  1474 
       
  1475 		case EACCESS_GETDEFGATEWAY:
       
  1476 			if(ifInfo.iState == EIfUp)
       
  1477 				{
       
  1478 				ret = ConvertTInetToSockAddr(ifInfo.iDefGate,&ifr->ifr_defgatewayaddr);
       
  1479 				return ret;
       
  1480 				}
       
  1481 			break;
       
  1482 
       
  1483 
       
  1484 		case  EACCESS_GETFLAGS :
       
  1485 			ifr->ifr_flags = 0;
       
  1486 			ifr->ifr_flagshigh=0;
       
  1487 			// Interface UP
       
  1488 			if(ifInfo.iState == EIfUp)
       
  1489 				{
       
  1490 				ifr->ifr_flags |= IFF_UP; 
       
  1491 				ifr->ifr_flags |= IFF_DRV_RUNNING;
       
  1492 				}
       
  1493 			// Loopback
       
  1494 			if(ifInfo.iFeatures&KIfIsLoopback)
       
  1495 				{
       
  1496 				ifr->ifr_flags |= IFF_LOOPBACK;
       
  1497 				}										            													           
       
  1498 
       
  1499 			// point to point support
       
  1500 			if(ifInfo.iFeatures&KIfIsPointToPoint) 
       
  1501 				{
       
  1502 				ifr->ifr_flags |= IFF_POINTOPOINT;  
       
  1503 				}
       
  1504 
       
  1505 			// Broadcast
       
  1506 			if(ifInfo.iFeatures&KIfCanBroadcast)
       
  1507 				{
       
  1508 				ifr->ifr_flags |= IFF_BROADCAST;
       
  1509 				}      
       
  1510 
       
  1511 			// Multicast
       
  1512 			if(ifInfo.iFeatures&KIfCanMulticast)
       
  1513 				{
       
  1514 				ifr->ifr_flagshigh |= ((IFF_MULTICAST & 0xff00) >> 8);
       
  1515 				}
       
  1516 			return KErrNone;
       
  1517 
       
  1518 		default:
       
  1519 			return KErrArgument;                   
       
  1520 		}
       
  1521 
       
  1522 
       
  1523 	return KErrNotFound;
       
  1524 
       
  1525 	}
  1460 	}
  1526 
  1461 
  1527 TInt CSocketDesc::Poll(TPollMode aMode,TBool& aReadyStatus,TInt& aErrno)
  1462 TInt CSocketDesc::Poll(TPollMode aMode,TBool& aReadyStatus,TInt& aErrno)
  1528 	{
  1463 	{
  1529 	TInt ret = maybe_reopen_socket();
  1464 	TInt ret = maybe_reopen_socket();
  1736 				}
  1671 				}
  1737 			else if(WcsCmp(str,L"OutgoingGPRS") == 0)
  1672 			else if(WcsCmp(str,L"OutgoingGPRS") == 0)
  1738 				{
  1673 				{
  1739 				servFlag  = 1;	
  1674 				servFlag  = 1;	
  1740 				}
  1675 				}
  1741 			GetInterfaceDetails(ifr,servFlag,EACTIVE_GETIP,ref.iId);
  1676 			GetInterfaceDetails(ifr,servFlag,EACTIVE_GETIP);
  1742 			}
  1677 			}
  1743 		}
  1678 		}
  1744 	ifc->ifc_len = sizeof(ifreq) * apIndex;
  1679 	ifc->ifc_len = sizeof(ifreq) * apIndex;
  1745 	delete apArray;	
  1680 	delete apArray;	
  1746 	return KErrNone;
  1681 	return KErrNone;
  2309         }
  2244         }
  2310     ifreq *ifr = (ifreq * )aParam;
  2245     ifreq *ifr = (ifreq * )aParam;
  2311     ifr->ifr_index  = opt().iZone[1]; //IAP_ID
  2246     ifr->ifr_index  = opt().iZone[1]; //IAP_ID
  2312     return KErrNone;
  2247     return KErrNone;
  2313     }
  2248     }
  2314 
       
  2315 
       
  2316 TInt CSocketDesc::GetActiveInterfaceIAPIdByName(const char *aIapName,TInt& aIapId)
       
  2317     {
       
  2318 
       
  2319     TInt rcIndex = 0;
       
  2320     RConnection *rc;
       
  2321     TAccessPointRecord tempRecord;
       
  2322     char iapName[IFNAMSIZ];
       
  2323     TInt ret = KErrNotFound;
       
  2324 //    ifreq * ifr = static_cast<ifreq *> (aParam); //may not work, will have to reinterper_cast
       
  2325 
       
  2326     while(((CFileTable*)iFids)->RConnectionAt(rcIndex++, rc) == KErrNone)
       
  2327         {
       
  2328         if( GetRConnectionDetails(rc, tempRecord) != KErrNone )
       
  2329             {
       
  2330             continue;
       
  2331             }
       
  2332         TPtr8 ptr((TText8*)iapName, IFNAMSIZ-1);  
       
  2333 
       
  2334         ret = CnvUtfConverter::ConvertFromUnicodeToUtf8(ptr, tempRecord.iName);
       
  2335         if(ret == KErrNone)
       
  2336             {
       
  2337            ptr.ZeroTerminate();
       
  2338             if(StrCmp(iapName, aIapName) == 0)
       
  2339                 {
       
  2340                 aIapId = tempRecord.iId;
       
  2341                 return KErrNone; 
       
  2342                 }
       
  2343             }
       
  2344         }
       
  2345     return ret;  //is it okay? ret contains rite val?
       
  2346     }
       
  2347 //converts Symbian Inetaddres structure to posix sockaddr structure
       
  2348 TInt CSocketDesc::ConvertTInetToSockAddr(const TInetAddr& aInetAddr, sockaddr * aSockAddr )
       
  2349     {
       
  2350     TUSockAddr addr(aInetAddr); 
       
  2351     unsigned long len = sizeof(sockaddr);
       
  2352     addr.Get(aSockAddr,&len);
       
  2353     return addr.iError;
       
  2354     }
       
  2355 
       
  2356 //converts posix sockaddr structure to Symbian Inetaddres structure 
       
  2357 TInt CSocketDesc::ConvertSockToTInetAddr(const sockaddr * aSockAddr, TInetAddr& aInetAddr)
       
  2358     {
       
  2359     unsigned int len = sizeof(sockaddr);
       
  2360     TUSockAddr addr(aSockAddr,len);  
       
  2361     aInetAddr =  addr;
       
  2362     return addr.iError;
       
  2363     }
       
  2364 
       
  2365 //Gets the Iap id by IAP name and using iap id gets the interface details
       
  2366 TInt CSocketDesc::GetInterfaceAttributes(void *aParam, int aFlag)
       
  2367     {
       
  2368     ifreq * ifr = static_cast<ifreq *> (aParam); //may not work, will have to reinterper_cast
       
  2369     TInt ret = KErrGeneral, iapId;
       
  2370     ret = GetActiveInterfaceIAPIdByName(ifr->ifr_name,iapId);
       
  2371     if(ret == KErrNone)
       
  2372         {
       
  2373         ret = GetInterfaceDetails( ifr ,0, aFlag, iapId);  //what to do with return value
       
  2374         }
       
  2375     return ret;
       
  2376         
       
  2377     }
       
  2378 
       
  2379 //Gets the Iap id by IAP name and using iap id sets the interface details
       
  2380 TInt CSocketDesc::SetInterfaceAttributes(void *aParam, int aFlag)
       
  2381     {
       
  2382     ifreq * ifr = static_cast<ifreq *> (aParam); //access of only if_name guaranteed to work.
       
  2383     TInt ret = KErrGeneral, iapId;
       
  2384     ret = GetActiveInterfaceIAPIdByName(ifr->ifr_name,iapId);
       
  2385     if(ret == KErrNone)
       
  2386         {
       
  2387         ret = SetInterfaceDetails( aParam ,0, aFlag, iapId);  //what to do with return value
       
  2388         }
       
  2389     return ret;
       
  2390     }
       
  2391 
       
  2392 //Enumerates the routes configured on the system	
       
  2393 TInt CSocketDesc::EnumerateRoutes(void *aParam)
       
  2394     {
       
  2395     TInt ret = KErrNone;
       
  2396     rtconf *rtc = (rtconf*)aParam;
       
  2397     TInt routeCount = (rtc->rt_len) /sizeof (route_entry);
       
  2398     route_entry *rtentry = rtc->rtc_rtcu.rtcu_entry;
       
  2399     ATOMICSOCKETOP(ret =  iSocket.SetOpt(KSoInetEnumRoutes, KSolInetRtCtrl),ret = KErrBadHandle)
       
  2400     if(ret != KErrNone )
       
  2401         {
       
  2402         return ret;
       
  2403         }
       
  2404     //If the length is zero, we fill the number of routes available information
       
  2405     TInt count = 0;
       
  2406     TPckgBuf<TSoInetRouteInfo> route;
       
  2407     if(routeCount <=0 || rtc->rtc_buf ==NULL)
       
  2408         {
       
  2409 		ATOMICSOCKETOP(ret = iSocket.GetOpt(KSoInetNextRoute, KSolInetRtCtrl, route), ret = KErrBadHandle)
       
  2410         while(ret == KErrNone)
       
  2411         	{
       
  2412         	count++;
       
  2413 			ATOMICSOCKETOP(ret = iSocket.GetOpt(KSoInetNextRoute, KSolInetRtCtrl, route), ret = KErrBadHandle)
       
  2414         	}
       
  2415         rtc->rt_len = count * sizeof(route_entry) ;
       
  2416         return KErrNone;
       
  2417         }
       
  2418     for(TInt i=0; i<routeCount ; i++) 
       
  2419     	{
       
  2420 		ATOMICSOCKETOP(ret = iSocket.GetOpt(KSoInetNextRoute, KSolInetRtCtrl, route),ret = KErrBadHandle)
       
  2421     	if(ret != KErrNone)
       
  2422     		{
       
  2423     		break;
       
  2424     		}	
       
  2425     	ConvertTInetToSockAddr(route().iDstAddr, &rtentry[i].dst_addr);
       
  2426     	ConvertTInetToSockAddr(route().iIfAddr, &rtentry[i].ifaddr);
       
  2427     	ConvertTInetToSockAddr(route().iGateway, &rtentry[i].gateway_addr);
       
  2428     	ConvertTInetToSockAddr(route().iNetMask, &rtentry[i].dst_netmask);
       
  2429     	TInt state = route().iState;
       
  2430     	TInt type = route().iType;
       
  2431     	rtentry[i].rt_metric = route().iMetric;
       
  2432     	rtentry[i].rt_flags.state = state;
       
  2433     	rtentry[i].rt_flags.type = type;
       
  2434 
       
  2435     	}
       
  2436 
       
  2437     return KErrNone;    
       
  2438     }
       
  2439 
       
  2440 //Sets the nameserver of an interface
       
  2441 TInt CSocketDesc::SetNameServer(void *aParam, int aFlag)
       
  2442     {
       
  2443     if_name_servers * dns_server = static_cast<if_name_servers *> (aParam); //access of only if_name guaranteed to work.
       
  2444     TInt iapId;
       
  2445     TInt ret = GetActiveInterfaceIAPIdByName(dns_server->if_name, iapId);
       
  2446     if(ret == KErrNone)
       
  2447         {
       
  2448         ret = SetInterfaceDetails( aParam ,0, aFlag, iapId);  //what to do with return value
       
  2449         }
       
  2450     return ret;
       
  2451     }
       
  2452 
       
  2453 //Gets the nameserver of an interface
       
  2454 TInt CSocketDesc::GetNameServer(void *aParam, int aFlag)
       
  2455     {
       
  2456     if_name_servers * dns_server = static_cast<if_name_servers *> (aParam); //access of only if_name guaranteed to work.
       
  2457     TInt iapId;
       
  2458     TInt ret = GetActiveInterfaceIAPIdByName(dns_server->if_name, iapId);
       
  2459     if(ret == KErrNone)
       
  2460         {
       
  2461         ret = GetInterfaceDetails( dns_server ,0, aFlag, iapId);  //what to do with return value
       
  2462         }
       
  2463     return ret;     
       
  2464     }