ifconfig.c revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h> 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <errno.h> 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <ctype.h> 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/socket.h> 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <netinet/in.h> 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <linux/if.h> 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <linux/sockios.h> 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <arpa/inet.h> 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void die(const char *s) 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr,"error: %s (%s)\n", s, strerror(errno)); 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project exit(-1); 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void setflags(int s, struct ifreq *ifr, int set, int clr) 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ioctl(s, SIOCGIFFLAGS, ifr) < 0) die("SIOCGIFFLAGS"); 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ifr->ifr_flags = (ifr->ifr_flags & (~clr)) | set; 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ioctl(s, SIOCSIFFLAGS, ifr) < 0) die("SIOCSIFFLAGS"); 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic inline void init_sockaddr_in(struct sockaddr_in *sin, const char *addr) 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sin->sin_family = AF_INET; 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sin->sin_port = 0; 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sin->sin_addr.s_addr = inet_addr(addr); 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void setnetmask(int s, struct ifreq *ifr, const char *addr) 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_netmask, addr); 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ioctl(s, SIOCSIFNETMASK, ifr) < 0) die("SIOCSIFNETMASK"); 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void setaddr(int s, struct ifreq *ifr, const char *addr) 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project init_sockaddr_in((struct sockaddr_in *) &ifr->ifr_addr, addr); 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(ioctl(s, SIOCSIFADDR, ifr) < 0) die("SIOCSIFADDR"); 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint ifconfig_main(int argc, char *argv[]) 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project struct ifreq ifr; 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int s; 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsigned int addr, mask, flags; 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char astring[20]; 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char mstring[20]; 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project char *updown, *brdcst, *loopbk, *ppp, *running, *multi; 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--; 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv++; 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(argc == 0) return 0; 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memset(&ifr, 0, sizeof(struct ifreq)); 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project strncpy(ifr.ifr_name, argv[0], IFNAMSIZ); 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ifr.ifr_name[IFNAMSIZ-1] = 0; 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--, argv++; 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project die("cannot open control socket\n"); 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (argc == 0) { 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ioctl(s, SIOCGIFADDR, &ifr) < 0) { 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror(ifr.ifr_name); 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project addr = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr; 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ioctl(s, SIOCGIFNETMASK, &ifr) < 0) { 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror(ifr.ifr_name); 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mask = ((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr; 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0) { 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project perror(ifr.ifr_name); 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return -1; 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project flags = ifr.ifr_flags; 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(astring, "%d.%d.%d.%d", 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project addr & 0xff, 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ((addr >> 8) & 0xff), 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ((addr >> 16) & 0xff), 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ((addr >> 24) & 0xff)); 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project sprintf(mstring, "%d.%d.%d.%d", 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mask & 0xff, 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ((mask >> 8) & 0xff), 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ((mask >> 16) & 0xff), 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ((mask >> 24) & 0xff)); 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%s: ip %s mask %s flags [", ifr.ifr_name, 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project astring, 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project mstring 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ); 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project updown = (flags & IFF_UP) ? "up" : "down"; 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project brdcst = (flags & IFF_BROADCAST) ? " broadcast" : ""; 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project loopbk = (flags & IFF_LOOPBACK) ? " loopback" : ""; 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project ppp = (flags & IFF_POINTOPOINT) ? " point-to-point" : ""; 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project running = (flags & IFF_RUNNING) ? " running" : ""; 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project multi = (flags & IFF_MULTICAST) ? " multicast" : ""; 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("%s%s%s%s%s%s]\n", updown, brdcst, loopbk, ppp, running, multi); 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* char *updown, *brdcst, *loopbk, *ppp, *running, *multi; */ 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while(argc > 0){ 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if(!strcmp(argv[0], "up")) { 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setflags(s, &ifr, IFF_UP, 0); 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strcmp(argv[0], "down")) { 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setflags(s, &ifr, 0, IFF_UP); 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(!strcmp(argv[0], "netmask")) { 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--, argv++; 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (0 == argc) { 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project errno = EINVAL; 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project die("expecting an IP address for parameter \"netmask\""); 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setnetmask(s, &ifr, argv[0]); 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else if(isdigit(argv[0][0])){ 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project setaddr(s, &ifr, argv[0]); 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argc--, argv++; 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 140