ifconfig实现

myifconfig
myifconfig all
myifconfig eth0
myifconfig eth0 set
myifconfig eth0 up
myifconfig eth0 down
#include <sys/ioctl.h>
#include <net/if.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <netinet/in.h>

int info_list(int all);

int get_interface_info(char * interface_name);
int set_interface(char * interface_name);

int get_ipaddr(char * interface_name);
int get_mac(char * interface_name);
int get_netmask(char * interface_name);
int get_broadcast(char * interface_name);
int set_ipaddr(char * interface_name,char * ip);
int set_mac(char * interface_name,char * mac);
int set_netmask(char * interface_name,char * netmask);
int set_broadcast(char * interface_name,char * broadcast);

int interface_up(char * interface_name);
int interface_down(char * interface_name);

int usage();


int main(int argc,char * argv[])
{
if(argc == 1)
{
info_list(0);
return 0;
}

if(argc == 2)
{
if(strcmp(argv[1],"all") == 0)
{
info_list(1);
return 0;
}

get_interface_info(argv[1]);

return 0;
}

if(argc == 3)
{
if(strcmp(argv[2],"set") == 0)
{
set_interface(argv[1]);
return 0;
}
if(strcmp(argv[2],"up") == 0)
{
interface_up(argv[1]);
return 0;
}
if(strcmp(argv[2],"down") == 0)
{
interface_down(argv[1]);
return 0;
}

usage();

return 0;
}

usage();

return 0;
}


int info_list(int all)
{
int len;
char *ifreq_pointer;
len = 10*sizeof(struct ifreq);
ifreq_pointer = (char *)malloc(len);

struct ifconf get_info;
get_info.ifc_len = len;
get_info.ifc_ifcu.ifcu_buf = ifreq_pointer;

int sockfd;
sockfd = socket(PF_INET,SOCK_STREAM,0);
ioctl(sockfd,SIOCGIFCONF,&get_info);

int count;
count = get_info.ifc_len / sizeof(struct ifreq);

struct sockaddr_in * return_sockaddr;

struct ifreq * result = (struct ifreq *)ifreq_pointer;
int i = 0;
if(all == 1)
for(i;i<count;i++)
{
printf("%s/n",result[i].ifr_name);
get_ipaddr(result[i].ifr_name);
get_mac(result[i].ifr_name);
get_netmask(result[i].ifr_name);
get_broadcast(result[i].ifr_name);
}
else
{
struct ifreq tmp;
int s;
if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
{
perror("Socket");
exit(-1);
}

for(i;i<count;i++)
{
strcpy(tmp.ifr_name,result[i].ifr_name);
if(ioctl(s,SIOCGIFFLAGS,&tmp) < 0)
{
perror("ioctl");
exit(-1);
}
if((tmp.ifr_ifru.ifru_flags & IFF_UP) == 0)
continue;
printf("%s/n",tmp.ifr_name);
get_ipaddr(tmp.ifr_name);
get_mac(tmp.ifr_name);
get_netmask(tmp.ifr_name);
get_broadcast(tmp.ifr_name);
}
}

exit(0);
}

int get_ipaddr(char * interface_name)
{
int s;
if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
{
perror("Socket");
return -1;
}

struct ifreq ifr;
strcpy(ifr.ifr_name,interface_name);

if(ioctl(s,SIOCGIFADDR,&ifr) < 0)
{
perror("ioctl");
return -1;
}

struct sockaddr_in * ptr;
ptr = (struct sockaddr_in *)&ifr.ifr_ifru.ifru_addr;

printf(" IP:%s/n",inet_ntoa(ptr->sin_addr));

return 0;
}


int get_mac(char * interface_name)
{
if(strcmp(interface_name,"lo") == 0)
{
return 0;
}

int s;

if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
{
perror("Socket");
return -1;
}

struct ifreq ifr;

strcpy(ifr.ifr_name,interface_name);

if(ioctl(s,SIOCGIFHWADDR,&ifr) != 0)
{
perror("ioctl");
return -1;
}

u_char * ptr;
ptr =(u_char *)&ifr.ifr_ifru.ifru_hwaddr.sa_data[0];
printf(" MAC:%02x-%02x-%02x-%02x-%02x-%02x/n",*ptr,*(ptr+1),*(ptr+2),*(ptr+3),*(ptr+4),*(ptr+5));

return 0;
}


int get_netmask(char * interface_name)
{
int s;

if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
{
perror("Socket");
return -1;
}

struct ifreq ifr;
strcpy(ifr.ifr_name,interface_name);

if(ioctl(s,SIOCGIFNETMASK,&ifr) < 0)
{
perror("ioctl");
return -1;
}

struct sockaddr_in * ptr;
ptr = (struct sockaddr_in *)&ifr.ifr_ifru.ifru_netmask;

printf(" Netmask:%s/n",inet_ntoa(ptr->sin_addr));

return 0;
}


int get_broadcast(char * interface_name)
{
int s;

if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
{
perror("Socket");
return -1;
}

struct ifreq ifr;
strcpy(ifr.ifr_name,interface_name);

if(ioctl(s,SIOCGIFBRDADDR,&ifr) < 0)
{
perror("ioctl");
return -1;
}

struct sockaddr_in * ptr;
ptr = (struct sockaddr_in *)&ifr.ifr_ifru.ifru_broadaddr;

printf(" Broadcast:%s/n",inet_ntoa(ptr->sin_addr));

return 0;

}

int get_interface_info(char * interface_name)
{
get_ipaddr(interface_name);
get_mac(interface_name);
get_netmask(interface_name);
get_broadcast(interface_name);

return 0;
}


int set_interface(char * interface_name)
{
char ip[18];
char mac_addr[20];
char netmask[18];
char broadcast[18];

printf("Change ");
get_ipaddr(interface_name);
printf("To: ");
fgets(ip,17,stdin);
if(strcmp(ip,"/n") == 0)
goto set_mac;
set_ipaddr(interface_name,ip);

set_mac:
printf("Change ");
get_mac(interface_name);
printf("To: ");
fgets(mac_addr,19,stdin);
if(strcmp(mac_addr,"/n") == 0)
goto set_netmask;
set_mac(interface_name,mac_addr);

set_netmask:
printf("Change ");
get_netmask(interface_name);
printf("To: ");
fgets(netmask,17,stdin);
if(strcmp(netmask,"/n") == 0)
goto set_broadcast;
set_netmask(interface_name,netmask);

set_broadcast:
printf("Change ");
get_broadcast(interface_name);
printf("To: ");
fgets(broadcast,17,stdin);
if(strcmp(broadcast,"/n") == 0)
return 0;
set_broadcast(interface_name,broadcast);

return 0;
}


int interface_up(char * interface_name)
{
int s;

if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
{
perror("Socket");
return -1;
}

struct ifreq ifr;
strcpy(ifr.ifr_name,interface_name);

short flag;
flag = IFF_UP;
if(ioctl(s,SIOCGIFFLAGS,&ifr) < 0)
{
perror("ioctl");
return -1;
}

ifr.ifr_ifru.ifru_flags |= flag;

if(ioctl(s,SIOCSIFFLAGS,&ifr) < 0)
{
perror("ioctl");
return -1;
}

return 0;

}


int interface_down(char * interface_name)
{
if(strcmp(interface_name,"lo") == 0)
{
printf("You can't pull down interface lo/n");
return 0;
}

int s;

if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
{
perror("Socket");
return -1;
}

struct ifreq ifr;
strcpy(ifr.ifr_name,interface_name);

short flag;
flag = ~IFF_UP;
if(ioctl(s,SIOCGIFFLAGS,&ifr) < 0)
{
perror("ioctl");
return -1;
}

ifr.ifr_ifru.ifru_flags &= flag;

if(ioctl(s,SIOCSIFFLAGS,&ifr) < 0)
{
perror("ioctl");
return -1;
}

return 0;
}

int set_ipaddr(char * interface_name,char * ip)
{
int s;

if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
{
perror("Socket");
return -1;
}

struct ifreq ifr;
strcpy(ifr.ifr_name,interface_name);

struct sockaddr_in addr;
bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family = PF_INET;
inet_aton(ip,&addr.sin_addr);

memcpy(&ifr.ifr_ifru.ifru_addr,&addr,sizeof(struct sockaddr_in));

if(ioctl(s,SIOCSIFADDR,&ifr) < 0)
{
perror("ioctl");
return -1;
}

return 0;
}

int set_mac(char * interface_name,char * mac_addr)
{
int s;
if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
{
perror("Socket");
return -1;
}

struct ifreq ifr;
strcpy(ifr.ifr_name,interface_name);

if(ioctl(s,SIOCGIFHWADDR,&ifr) < 0)
{
perror("ioctl");
return -1;
}

sa_family_t get_family;
get_family = ifr.ifr_ifru.ifru_hwaddr.sa_family;

interface_down(interface_name);

bzero(&ifr,sizeof(struct ifreq));
strcpy(ifr.ifr_name,interface_name);
ifr.ifr_ifru.ifru_hwaddr.sa_family = get_family;

short tmp;
int i,j;
j = 0;
for(i = 0;i < 17; i += 3)
{
if(mac_addr[i] < 58 && mac_addr[i] > 47)
tmp = mac_addr[i]-48;
if(mac_addr[i] < 71 && mac_addr[i] > 64)
tmp = mac_addr[i]-55;
if(mac_addr[i] < 103 && mac_addr[i] > 96)
tmp = mac_addr[i]-87;
tmp = tmp << 4;
if(mac_addr[i+1] < 58 && mac_addr[i+1] > 47)
tmp |= (mac_addr[i+1]-48);
if(mac_addr[i+1] < 71 && mac_addr[i+1] > 64)
tmp |= (mac_addr[i+1]-55);
if(mac_addr[i+1] < 103 && mac_addr[i+1] > 96)
tmp |= (mac_addr[i+1]-87);
memcpy(&ifr.ifr_ifru.ifru_hwaddr.sa_data[j++],&tmp,1);
}

if(ioctl(s,SIOCSIFHWADDR,&ifr) < 0)
{
perror("ioctl");
return -1;
}

interface_up(interface_name);

return 0;
}

int set_netmask(char * interface_name,char * netmask)
{
int s;

if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
{
perror("Socket");
return -1;
}

struct ifreq ifr;
strcpy(ifr.ifr_name,interface_name);

struct sockaddr_in netmask_addr;
bzero(&netmask_addr,sizeof(struct sockaddr_in));
netmask_addr.sin_family = PF_INET;
inet_aton(netmask,&netmask_addr.sin_addr);

memcpy(&ifr.ifr_ifru.ifru_netmask,&netmask_addr,sizeof(struct sockaddr_in));

if(ioctl(s,SIOCSIFNETMASK,&ifr) < 0)
{
perror("ioctl");
return -1;
}

return 0;

}


int set_broadcast(char * interface_name,char * broadcast)
{
int s;

if((s = socket(PF_INET,SOCK_STREAM,0)) < 0)
{
perror("Socket");
return -1;
}

struct ifreq ifr;
strcpy(ifr.ifr_name,interface_name);

struct sockaddr_in broadcast_addr;
bzero(&broadcast_addr,sizeof(struct sockaddr_in));
broadcast_addr.sin_family = PF_INET;
inet_aton(broadcast,&broadcast_addr.sin_addr);

memcpy(&ifr.ifr_ifru.ifru_broadaddr,&broadcast_addr,sizeof(struct sockaddr_in));

if(ioctl(s,SIOCSIFBRDADDR,&ifr) < 0)
{
perror("ioctl");
return -1;
}

return 0;
}


int usage(void)
{
printf("Usage: myifconfig [all]|[interface [set|up|down]]/n");
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值