ifconfig实现

    技术2022-05-12  8

    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:x-x-x-x-x-x/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; }

    最新回复(0)