void netSetDefaultRoute( char *gw ) { struct rtentry re; struct sockaddr_in *in_addr; unsigned char *addr; int fd; unsigned char adr_gw[4]; scanip( gw, adr_gw ); memset(&re,0,sizeof(struct rtentry)); in_addr = (struct sockaddr_in *)&re.rt_dst; in_addr->sin_family = AF_INET; in_addr = (struct sockaddr_in *)&re.rt_gateway; in_addr->sin_family = AF_INET; addr=(unsigned char*)&in_addr->sin_addr.s_addr; in_addr = (struct sockaddr_in *)&re.rt_genmask; in_addr->sin_family = AF_INET; fd=socket(AF_INET,SOCK_DGRAM,0); if ( fd < 0 ) return; re.rt_flags = RTF_GATEWAY | RTF_UP; memcpy(addr,adr_gw,4); ioctl(fd,SIOCADDRT,&re); close(fd); return; }
int netSetIP( char *dev, char *ip, char *mask, char *brdcast ) { int fd; struct ifreq req; int rc=-1; unsigned char adr_ip[4]; unsigned char adr_mask[4]; unsigned char adr_brdcast[4]; struct sockaddr_in addr; fd=socket(AF_INET,SOCK_DGRAM,0); if ( !fd ) return -1; scanip( ip, adr_ip ); scanip( mask, adr_mask ); scanip( brdcast, adr_brdcast ); /* init structures */ bzero(&req,sizeof(req)); strcpy(req.ifr_name,dev); bzero(&addr,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = *((unsigned long *) adr_ip); memcpy(&req.ifr_addr,&addr,sizeof(addr)); if( ioctl(fd,SIOCSIFADDR,&req) < 0 ) goto abbruch; addr.sin_addr.s_addr = *((unsigned long *) adr_mask); memcpy(&req.ifr_addr,&addr,sizeof(addr)); if( ioctl(fd,SIOCSIFNETMASK,&req) < 0 ) goto abbruch; addr.sin_addr.s_addr = *((unsigned long *) adr_brdcast); memcpy(&req.ifr_addr,&addr,sizeof(addr)); if( ioctl(fd,SIOCSIFBRDADDR,&req) < 0 ) goto abbruch; rc = 0; abbruch: close(fd); return rc; }
int scan(void) { int sockfd; while(1) { sockfd=scanip(); if(sockfd==0) { printf("cannot match\n"); } else { printf("scan success\n"); close(sockfd); break; } sleep(60); } }