ifconfg.c源代码

来源:互联网 发布:java reflectasm 编辑:程序博客网 时间:2024/06/03 21:24
/*Linux ifconfig,c简易源代码*/#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;     //获取myifconfig all的参数    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);}//获取IP:SIOCGIFADDRint    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;}//获取MAC:SIOCGIFHWADDRint 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;}//获取netmask:SIOCGIFNETMASKint 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;}//获取广播地址:SIOCGIFBRDADDRint 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;}//ifconfig up接口:SIOCSIFFLAGSint 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;}//设置IPint 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;}//设置MACint 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;}

原创粉丝点击