/* ** Copyright 2006, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ #include #include #include #include #include #include #include #include #include static const char *ipaddr(in_addr_t addr) { struct in_addr in_addr; in_addr.s_addr = addr; return inet_ntoa(in_addr); } static void usage(void) { fprintf(stderr,"usage: netcfg [ dhcp]\n"); exit(1); } static int dump_interface(const char *name) { unsigned addr, flags; unsigned char hwbuf[ETH_ALEN]; int prefixLength; if(ifc_get_info(name, &addr, &prefixLength, &flags)) { return 0; } printf("%-8s %s ", name, flags & 1 ? "UP " : "DOWN"); printf("%40s", ipaddr(addr)); printf("/%-4d", prefixLength); printf("0x%08x ", flags); if (!ifc_get_hwaddr(name, hwbuf)) { int i; for(i=0; i < (ETH_ALEN-1); i++) printf("%02x:", hwbuf[i]); printf("%02x\n", hwbuf[i]); } else { printf("\n"); } return 0; } static int dump_interfaces(void) { DIR *d; struct dirent *de; d = opendir("/sys/class/net"); if(d == 0) return -1; while((de = readdir(d))) { if(de->d_name[0] == '.') continue; dump_interface(de->d_name); } closedir(d); return 0; } int main(int argc, char **argv) { if(ifc_init()) { perror("Cannot perform requested operation"); exit(1); } if(argc == 1) { int result = dump_interfaces(); ifc_close(); return result; } if(argc != 3) usage(); char* iname = argv[1]; char* action = argv[2]; if(strlen(iname) > 16) usage(); if (!strcmp(action, "dhcp")) { if (do_dhcp(iname)) { fprintf(stderr, "dhcp failed: %s\n", strerror(errno)); ifc_close(); exit(1); } } else { fprintf(stderr,"no such action '%s'\n", action); usage(); } ifc_close(); return 0; }