struct options { const char *name; #ifdef CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS const unsigned int flags:6; const unsigned int arg_flags:10; #else const unsigned char flags; const unsigned char arg_flags; #endif const unsigned short selector; }; #define ifreq_offsetof(x) offsetof(struct ifreq, x) static const struct arg1opt Arg1Opt[] = { {"SIOCSIFMETRIC", SIOCSIFMETRIC, ifreq_offsetof(ifr_metric)}, {"SIOCSIFMTU", SIOCSIFMTU, ifreq_offsetof(ifr_mtu)}, {"SIOCSIFTXQLEN", SIOCSIFTXQLEN, ifreq_offsetof(ifr_qlen)}, {"SIOCSIFDSTADDR", SIOCSIFDSTADDR, ifreq_offsetof(ifr_dstaddr)}, {"SIOCSIFNETMASK", SIOCSIFNETMASK, ifreq_offsetof(ifr_netmask)}, {"SIOCSIFBRDADDR", SIOCSIFBRDADDR, ifreq_offsetof(ifr_broadaddr)}, #ifdef CONFIG_FEATURE_IFCONFIG_HW {"SIOCSIFHWADDR", SIOCSIFHWADDR, ifreq_offsetof(ifr_hwaddr)}, #endif {"SIOCSIFDSTADDR", SIOCSIFDSTADDR, ifreq_offsetof(ifr_dstaddr)}, #ifdef SIOCSKEEPALIVE {"SIOCSKEEPALIVE", SIOCSKEEPALIVE, ifreq_offsetof(ifr_data)}, #endif #ifdef SIOCSOUTFILL {"SIOCSOUTFILL", SIOCSOUTFILL, ifreq_offsetof(ifr_data)}, #endif
int setInAddr( char *interface, char *Ipaddr, char *Netmask, char *HwMac, int type) { struct ifreq ifr; int skfd=0; struct in_addr in_addr, in_netmask, in_broadaddr; struct sockaddr sa; int default_type= (IFACE_FLAG_T) | (IP_ADDR_T) | (NET_MASK_T) | (HW_ADDR_T); int request_action=0; request_action =type & default_type; skfd = socket(AF_INET, SOCK_DGRAM, 0); if(skfd==-1) return -1; strcpy(ifr.ifr_name, interface); if (ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0){ close( skfd ); return (-1); } if(request_action ==IFACE_FLAG_T){ return 0; } ifr.ifr_flags = IFF_UP | IFF_RUNNING | IFF_BROADCAST | IFF_MULTICAST; if(request_action & IP_ADDR_T ){ if (Ipaddr) { inet_aton(Ipaddr, &in_addr); (((struct sockaddr_in *)(&ifr.ifr_addr))->sin_addr).s_addr= in_addr.s_addr; ifr.ifr_addr.sa_family = AF_INET; if (ioctl(skfd, SIOCSIFADDR, &ifr) < 0) goto set_err; } } if(request_action & NET_MASK_T){ if (Ipaddr && Netmask) { inet_aton(Netmask, &in_netmask); (((struct sockaddr_in *)(&ifr.ifr_netmask))->sin_addr).s_addr= in_netmask.s_addr; ifr.ifr_netmask.sa_family = AF_INET; if (ioctl(skfd, SIOCSIFNETMASK, &ifr) < 0) goto set_err; in_broadaddr.s_addr = (in_addr.s_addr & in_netmask.s_addr) | ~in_netmask.s_addr; (((struct sockaddr_in *)(&ifr.ifr_broadaddr))->sin_addr).s_addr= in_broadaddr.s_addr; ifr.ifr_broadaddr.sa_family = AF_INET; if (ioctl(skfd, SIOCSIFBRDADDR, &ifr) < 0) goto set_err; } } if(request_action & HW_ADDR_T){ if(HwMac){ sa.sa_family = ARPHRD_ETHER; memcpy(&sa.sa_data,HwMac,6); memcpy((((char *) (&ifr)) +ifreq_offsetof(ifr_hwaddr)), &sa, sizeof(struct sockaddr)); if (ioctl(skfd, SIOCSIFHWADDR, &ifr) < 0) goto set_err; } } close( skfd ); return 0; set_err: close(skfd); perror(interface); return -1; }