#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 |