--- 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;
+
+ }
+
+