Squashed 'LYNQ_PUBLIC/' content from commit 79d8f932f

git-subtree-dir: LYNQ_PUBLIC
git-subtree-split: 79d8f932fb4ebc4b5aec6c5ace97634912394272
Change-Id: If2527ba937f56fe989487bf71e996f7cfd9fbe61
diff --git a/common_src/lib/liblynq-protcl/dhcp/lynq_dhcp.c b/common_src/lib/liblynq-protcl/dhcp/lynq_dhcp.c
new file mode 100644
index 0000000..ddc796c
--- /dev/null
+++ b/common_src/lib/liblynq-protcl/dhcp/lynq_dhcp.c
@@ -0,0 +1,334 @@
+#include <stdio.h>

+#include <string.h>

+#include <stdbool.h>

+#include <stdlib.h>

+#include "dhcp/lynq_dhcp.h"

+

+bool isVaildIp(const char *ip)

+{

+	int dots = 0; /*number of char*/

+	int setions = 0; /*part of ip(0-255)*/ 

+

+	if (NULL == ip || *ip == '.') { /*排除输入参数为NULL, 或者一个字符为'.'的字符串*/ 

+		return false;

+	}   

+

+	while (*ip) {

+

+		if (*ip == '.') {

+			dots ++; 

+			if (setions >= 0 && setions <= 255) { /*judge ip is vaild*/

+				setions = 0;

+				ip++;

+				continue;

+			}   

+			return false;

+		}   

+		else if (*ip >= '0' && *ip <= '9') { /*judge is number*/

+			setions = setions * 10 + (*ip - '0'); /*求每一段总和*/

+		} else 

+			return false;

+		ip++;   

+	}   

+

+	if (setions >= 0 && setions <= 255) {		/*判断IP最后一段是否合法*/ 

+		if (dots == 3) {

+			return true;

+		}   

+	}   

+

+	return false;

+}

+

+void Restart_Dhcp(char* if_name)

+{

+	char gyCmd[128] = {0};

+	sprintf(gyCmd,"ifconfig %s down",if_name);

+	system(gyCmd);

+		//printf("gyCmd=%s\n",gyCmd);

+	sprintf(gyCmd,"ifconfig %s up",if_name);

+	system(gyCmd);

+		//printf("gyCmd=%s\n",gyCmd);

+}

+

+void lynq_dhcp_get_interfacelist(char* interface_name)

+{

+	char ifname[IFNAME_CNT][IFNAME] = {0};

+

+	char buf[IFNAME]={0};

+	int i=0;

+	FILE * fp = NULL;

+	char gyCmd[128] = {0};

+	//1.Start from the second row and loop to get the first column of data;2.Remove the space from start of line;3.Remove the ":" from end of line;

+	sprintf (gyCmd, "cat /proc/net/dev | awk '{i++; if(i>2){print $1}}' | sed 's/^[\t]*//g' | sed 's/[:]*$//g'");

+

+	//ifconfig | grep encap |grep -v lo | cut -d ' ' -f1

+	//sprintf (gyCmd, "ifconfig | grep flags |grep -v lo | cut -d ':' -f1");

+	fp = popen (gyCmd, "r");

+	

+	while(fgets(buf, sizeof(buf), fp)!=NULL){

+        strtok(buf, "\n");

+		strcat(interface_name,buf);

+		strcat(interface_name,";");

+	}

+

+	pclose(fp);

+}

+

+void lynq_dhcp_get_address(char* inet_addr,int type)

+{

+	char ifname[IFNAME_CNT][IFNAME] = {0};

+	int i=0;

+	char buf[32]={0};

+	char interface_name[IFNAME] = {0};

+	char gyCmd[128] = {0};

+	FILE * fp = NULL;

+

+	lynq_dhcp_get_interfacelist(interface_name);

+	char delims[] = ";";  

+    char *result = NULL;  

+    result = strtok( interface_name, delims );  

+    while( result != NULL ) {  

+	   strcpy(ifname[i++],result);	   

+       result = strtok( NULL, delims );  

+    }          

+	for(i=0;i<IFNAME_CNT;i++){

+		if(strlen(ifname[i])){

+			//printf("[%s][%d]ifname[%s]\n",__FUNCTION__,__LINE__,ifname[i]);

+			switch (type) {

+				case DHCP_IPADDR:

+					sprintf(gyCmd,"ifconfig %s | grep \"inet addr:\" | awk '{print $2}' | awk 'NR==1'",ifname[i]);

+					break;

+				case DHCP_NETMASK:

+					sprintf(gyCmd,"ifconfig %s | grep \"inet addr:\" | awk '{print $4}' | awk 'NR==1'",ifname[i]);

+					break;

+				case DHCP_GATEWAY:

+					sprintf(gyCmd,"route -n | grep %s | awk 'NR==1' | awk '{print $2}'",ifname[i]);

+					break;

+				case DHCP_BROADCAST:

+					sprintf(gyCmd,"ifconfig %s | grep \"inet addr:\" | awk '{print $6}' | awk 'NR==1'",ifname[i]);

+					break;

+				default:

+					break;

+			}

+			//printf("[%s][%d]gyCmd[%s]\n",__FUNCTION__,__LINE__,gyCmd);

+				fp = popen (gyCmd, "r");

+				if(fgets(buf, sizeof(buf), fp)!=NULL){

+					buf[strlen(buf)-1]='\0';

+					//printf("[%s][%d]strlen(buf)[%d][%s]\n",__FUNCTION__,__LINE__,strlen(buf),buf);

+					if(strlen(buf)>1){

+						if(strstr(buf, "Device not found") != NULL ){

+							strcat(inet_addr,ifname[i]);

+							strcat(inet_addr,":Not Found!;");

+						}else{

+							strcat(inet_addr,ifname[i]);

+							strcat(inet_addr,":");

+							strcat(inet_addr,buf);

+							strcat(inet_addr,";");

+						}

+

+						//printf("[%s][%d]addr[%s][%d]\n",__FUNCTION__,__LINE__,addr[i],i);

+					}else if(!strlen(buf)){

+						strcat(inet_addr,ifname[i]);

+						strcat(inet_addr,":Not Found!;");	

+						//printf("[%s][%d]addr[%s][%d]\n",__FUNCTION__,__LINE__,addr[i],i);

+					}

+				}else{

+					strcat(inet_addr,ifname[i]);

+					strcat(inet_addr,":Not Found!;");	

+					

+				}

+				pclose(fp);

+		}

+	}

+	//printf("[%s][%d]addr[%s][%d]\n",__FUNCTION__,__LINE__,addr[i],i);

+

+}

+

+#if 0

+//ifconfig eth1 | grep "inet addr:" | awk '{print $2}' | cut -c 6-

+char* Get_Dhcp_Ip(char addr[16][64])

+{

+	char ifname[IFNAME_CNT][IFNAME] = {0};

+	int i=0;

+	char buf[IFNAME]={0};

+

+	char gyCmd[128] = {0};

+	FILE * fp = NULL;

+	Search_Interface(ifname);

+	for(i=0;i<IFNAME_CNT;i++){

+		if(strlen(ifname[i])){

+			printf("[%s][%d]ifname[%s]\n",__FUNCTION__,__LINE__,ifname[i]);

+			sprintf(gyCmd,"ifconfig %s | grep \"inet\" | awk '{print $2}' | awk 'NR==1'",ifname[i]);

+				fp = popen (gyCmd, "r");

+				while(fgets(buf, sizeof(buf), fp)!=NULL){

+					if(strstr(buf, "Device not found") != NULL ){

+						strcpy(addr[i],ifname[i]);

+						strcat(addr[i],":Not Found!");

+					}else{

+						if(strlen(buf)>1){

+							strtok(buf, "\n");

+							

+							strcpy(addr[i],ifname[i]);

+							strcat(addr[i],":");

+							strcat(addr[i],buf);

+							//printf("[%s][%d]addr[%s][%d]\n",__FUNCTION__,__LINE__,addr[i],i);

+						}

+					}

+				}

+				pclose(fp);

+		}

+	}

+

+	return addr;

+}

+

+char* Get_Dhcp_NetMask(char addr[16][64])

+{

+	char ifname[IFNAME_CNT][IFNAME] = {0};

+	int i=0;

+	char buf[IFNAME]={0};

+

+	char gyCmd[128] = {0};

+	FILE * fp = NULL;

+	Search_Interface(ifname);

+	for(i=0;i<IFNAME_CNT;i++){

+		if(strlen(ifname[i])){

+			printf("[%s][%d]ifname[%s]\n",__FUNCTION__,__LINE__,ifname[i]);

+			sprintf(gyCmd,"ifconfig %s | grep \"inet\" | awk '{print $4}' | awk 'NR==1'",ifname[i]);

+				fp = popen (gyCmd, "r");

+				while(fgets(buf, sizeof(buf), fp)!=NULL){

+					if(strstr(buf, "Device not found") != NULL ){

+						strcpy(addr[i],ifname[i]);

+						strcat(addr[i],":Not Found!");

+					}else{

+						if(strlen(buf)>1){

+							strtok(buf, "\n");

+							

+							strcpy(addr[i],ifname[i]);

+							strcat(addr[i],":");

+							strcat(addr[i],buf);

+							//printf("[%s][%d]addr[%s][%d]\n",__FUNCTION__,__LINE__,addr[i],i);

+						}

+					}

+				}

+				pclose(fp);

+		}

+	}

+

+	return addr;

+}

+#endif

+

+int lynq_dhcp_set_address(char *inet_addr,char *interface_name ,int type)

+{

+	char ifname[IFNAME_CNT][IFNAME] = {0};

+	int i=0;

+	int find=0;

+	char gyCmd[128] = {0};

+	char ifn[IFNAME] = {0};

+	char delims[] = ";";  

+    char *result = NULL;  

+    if (!isVaildIp(inet_addr)) {

+		return DHCP_FAIL_INVALID_IP;

+    }   

+	lynq_dhcp_get_interfacelist(ifn);

+

+    result = strtok( ifn, delims );  

+    while( result != NULL ) {  

+	   strcpy(ifname[i++],result);	   

+       result = strtok( NULL, delims );  

+    }     

+	if(interface_name==NULL)

+		return DHCP_FAIL_INVALID_IFNAME;	

+	for(i=0;i<IFNAME_CNT;i++){

+		if(strlen(ifname[i]))

+			if(!strcmp(ifname[i],interface_name))

+				find=1;

+	}

+

+	switch (type) {

+		case DHCP_IPADDR:

+			sprintf(gyCmd,"ifconfig %s %s",interface_name,inet_addr);

+			system(gyCmd);

+			//printf("gyCmd=%s\n",gyCmd);

+			break;

+		case DHCP_NETMASK:

+			sprintf(gyCmd,"ifconfig %s netmask %s",interface_name,inet_addr);

+			system(gyCmd);

+			break;

+		case DHCP_GATEWAY:

+			sprintf(gyCmd,"route add %s gw %s ",interface_name,inet_addr);

+			system(gyCmd);

+			break;

+		case DHCP_BROADCAST:

+			sprintf(gyCmd,"ifconfig %s broadcast %s",interface_name,inet_addr);

+			system(gyCmd);

+			break;

+		default:

+			break;

+	}

+

+	Restart_Dhcp(interface_name);

+	if(find)

+		return DHCP_SUCCESS;

+	else

+		return DHCP_FAIL_NO_DEV;

+}

+

+int lynq_dhcp_enable(char* interface_name,int enable)

+{

+	char ifname[IFNAME_CNT][IFNAME] = {0};

+	int i=0;

+	char gyCmd[128] = {0};

+	int find=0;

+	char ifn[IFNAME] = {0};

+	char delims[] = ";";  

+    char *result = NULL;  

+	if(interface_name==NULL)

+		return DHCP_FAIL_INVALID_IFNAME;	

+	lynq_dhcp_get_interfacelist(ifn);

+    result = strtok( ifn, delims );  

+    while( result != NULL ) {  

+	   strcpy(ifname[i++],result);	   

+       result = strtok( NULL, delims );  

+    }   	

+	for(i=0;i<IFNAME_CNT;i++){

+		if(strlen(ifname[i]))

+			if(!strcmp(ifname[i],interface_name))

+				find=1;

+	}

+	switch (enable) {

+		case DHCP_ON:

+			sprintf(gyCmd,"ifconfig %s up",interface_name);

+			break;

+		case DHCP_OFF:

+			sprintf(gyCmd,"ifconfig %s  down",interface_name);

+			break;

+		default:

+			break;

+	}

+

+	if(find)

+		return DHCP_SUCCESS;

+	else

+		return DHCP_FAIL_NO_DEV;

+}

+#if 0

+//my_test1 0 192.168.125.55 eth1 0

+int main(int argc,  char *argv[])

+{

+	char ip_addr[16][64] = {0};

+	int i;

+	char* buf=NULL;

+	//Get_Dhcp_Ip(ip_addr);

+	printf("%d\n",atoi(argv[1]));

+	Get_Dhcp(ip_addr,atoi(argv[1]));

+	for(i=0;i<IFNAME_CNT;i++){

+		printf("[%s][%d]out[%s][%d]\n",__FUNCTION__,__LINE__,ip_addr[i],i);

+	}

+	buf=Set_Dhcp(argv[2],argv[3],argv[4]);

+	printf("buf=%s\n",buf);

+	return 0;

+}

+#endif
\ No newline at end of file