blob: ddc796c6b9f7b1707604ac1d7f1bc24337518752 [file] [log] [blame]
#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