📄 ifconfig.c
字号:
/* ifconfig.c copied from net-tools * linqianghe@163.com * 2006-10-19 */ #define DFLT_AF "myinet"#include "config.h"#include "af_inet.h"#include "log.h"#include <features.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/ioctl.h>#include <netinet/in.h>#include <stdio.h>#include <errno.h>#include <fcntl.h>#include <ctype.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <netdb.h>#include <stdio.h>/* Ugh. But libc5 doesn't provide POSIX types. */#include <asm/types.h>#ifdef HAVE_HWSLIP#include <linux/if_slip.h>#endif#include "interface.h"#include "sockets.h"#include "net-support.h"#include "util.h"extern struct aftype myinet_aftype;char *Release = "ipv4-module 2.0", *Version = "ifconfig 1.42 (2006-10-19)";int opt_a = 0; /* show all interfaces */int opt_i = 0; /* show the statistics */int opt_v = 0; /* debugging output flag */int addr_family = 0; /* currently selected AF */static int if_print(char *ifname){ int res; if( ife_short ) printf( "Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg\n" ); if( !ifname ){ res = for_all_interfaces( do_if_print, &opt_a ); }else{ struct interface *ife; ife = lookup_interface(ifname); res = do_if_fetch(ife); if (res >= 0) ife_print(ife); } return res; }static void version(void){ fprintf(stderr, "%s\n%s\n", Release, Version); exit(0);}static void usage(void){ fprintf(stderr, "Usage:\n ifconfig [-a] [-i] [-v] [-s] <interface> [[<AF>] <address>]\n"); fprintf(stderr, " [add <address>[/<prefixlen>]]\n"); fprintf(stderr, " [del <address>[/<prefixlen>]]\n"); fprintf(stderr, " [[-]broadcast [<address>]] [[-]pointopoint [<address>]]\n"); fprintf(stderr, " [netmask <address>] [dstaddr <address>] [tunnel <address>]\n"); fprintf(stderr, " [hw <HW> <address>] [metric <NN>] [mtu <NN>]\n"); fprintf(stderr, " [[-]trailers] [[-]arp] [[-]allmulti]\n"); fprintf(stderr, " [multicast] [[-]promisc]\n"); fprintf(stderr, " [mem_start <NN>] [io_addr <NN>] [irq <NN>] [media <type>]\n"); fprintf(stderr, " [txqueuelen <NN>]\n"); fprintf(stderr, " [[-]dynamic]\n"); fprintf(stderr, " [up|down] ...\n\n"); fprintf(stderr, " <HW>=Hardware Type.\n"); fprintf(stderr, " List of possible hardware types:\n"); print_hwlist(0); /* 1 = ARPable */ fprintf(stderr, " <AF>=Address family. Default: %s\n", DFLT_AF); fprintf(stderr, " List of possible address families:\n"); print_aflist(0); /* 1 = routeable */ exit(E_USAGE);}static int set_flag(char *ifname, short flag){ struct ifreq ifr; safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ); if( ioctl(skfd, SIOCGIFFLAGS, &ifr) < 0 ){ PR_ERR( "%s: unknown interface: %s\n", ifname, strerror(errno) ); return (-1); } safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ); ifr.ifr_flags |= flag; if( ioctl(skfd, SIOCSIFFLAGS, &ifr) < 0 ){ PR_ERR( "SIOCSIFFLAGS: %s", strerror(errno) ); return -1; } return (0);}static int clr_flag(char *ifname, short flag){ struct ifreq ifr; int fd; if( strchr(ifname, ':') ){ fd = get_socket_for_af( MY_AF_INET); if (fd < 0) { PR_ERR( "No support for MYINET on this system.\n" ); return -1; } }else fd = skfd; safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ); if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) { PR_ERR( "%s: unknown interface: %s\n", ifname, strerror(errno) ); return -1; } safe_strncpy(ifr.ifr_name, ifname, IFNAMSIZ); ifr.ifr_flags &= ~flag; if( ioctl(fd, SIOCSIFFLAGS, &ifr) < 0 ){ PR_ERR( "SIOCSIFFLAGS: %s", strerror(errno) ); return -1; } return (0);}static int set_netmask(int skfd, struct ifreq *ifr, struct sockaddr *sa){ int err = 0; memcpy((char *) &ifr->ifr_netmask, (char *) sa, sizeof(struct sockaddr)); if( ioctl(skfd, SIOCSIFNETMASK, ifr) < 0 ){ fprintf(stderr, "SIOCSIFNETMASK: %s\n", strerror(errno)); err = 1; } return 0;}static int get_nmbc_parent(char *parent, unsigned long *nm, unsigned long *bc){ struct interface *i; struct sockaddr_in *sin; i = lookup_interface( parent ); if( !i ) return -1; if( do_if_fetch(i) < 0 ) return 0; sin = (struct sockaddr_in *)&i->netmask; memcpy( nm, &sin->sin_addr.s_addr, sizeof(unsigned long) ); sin = (struct sockaddr_in *)&i->broadaddr; memcpy( bc, &sin->sin_addr.s_addr, sizeof(unsigned long) ); return 0;}struct ifcmd { int flag; unsigned long addr; char *base; int baselen;};static unsigned char searcher[256];static int set_ip_using(const char *name, int c, unsigned long ip){ struct ifreq ifr; struct sockaddr_in sin; safe_strncpy( ifr.ifr_name, name, IFNAMSIZ ); memset(&sin, 0, sizeof(struct sockaddr)); sin.sin_family = MY_AF_INET; sin.sin_addr.s_addr = ip; memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr)); if( ioctl(skfd, c, &ifr) < 0 ) return -1; return 0;}static int do_ifcmd(struct interface *x, struct ifcmd *ptr){ char *z, *e; struct sockaddr_in *sin; int i; if (do_if_fetch(x) < 0) return 0; if( strncmp(x->name, ptr->base, ptr->baselen) != 0 ) return 0; z = strchr(x->name, ':'); if( !z || !*z ) return 0; z++; for( e = z; *e; e++ ) if( *e == '-' ) return 0; i = atoi(z); if (i < 0 || i > 255) abort(); searcher[i] = 1; sin = (struct sockaddr_in *)&x->dstaddr; if( sin->sin_addr.s_addr != ptr->addr ){ return 0; } if( ptr->flag ){ if (set_flag(x->name, IFF_UP | IFF_RUNNING) == -1) return -1; }else{ if( clr_flag(x->name, IFF_UP) == -1 ) return -1; } return 1;}static int set_ifstate(char *parent, unsigned long ip, unsigned long nm, unsigned long bc, int flag){ char buf[IFNAMSIZ]; struct ifcmd pt; int i; pt.base = parent; pt.baselen = strlen(parent); pt.addr = ip; pt.flag = flag; memset(searcher, 0, sizeof(searcher)); i = for_all_interfaces((int (*)(struct interface *,void *))do_ifcmd, &pt); if( i == -1 ) return -1; if( i == 1 ) return 0; for( i = 0; i < 256; i++ ) if( searcher[i] == 0 ) break; if( i == 256 ) return -1; if( snprintf(buf, IFNAMSIZ, "%s:%d", parent, i) > IFNAMSIZ ) return -1; if( set_ip_using(buf, SIOCSIFADDR, ip) == -1 ) return -1; if( set_ip_using(buf, SIOCSIFNETMASK, nm) == -1 ) return -1; if( set_ip_using(buf, SIOCSIFBRDADDR, bc) == -1 ) return -1; if( set_flag(buf, IFF_BROADCAST) == -1 ) return -1; return 0;}int main( int argc, char **argv ){ struct sockaddr sa; struct sockaddr_in sin; char **spp; struct ifreq ifr; struct aftype *ap; struct hwtype *hw; int goterr = 0, didnetmask = 0; char host[128]; int fd; argc--; argv++; while( argc && *argv[0] == '-' ){ if( !strcmp(*argv, "-a") ) opt_a = 1; else if( !strcmp(*argv, "-s") ) ife_short = 1; else if (!strcmp(*argv, "-v")) opt_v = 1; else if( !strcmp(*argv, "-V") || !strcmp(*argv, "-version") || !strcmp(*argv, "--version")) version(); else if( !strcmp(*argv, "-?") || !strcmp(*argv, "-h") || !strcmp(*argv, "-help") || !strcmp(*argv, "--help") ) usage(); else{ fprintf(stderr, "ifconfig: option `%s' not recognised.\n", argv[0]); fprintf(stderr, "ifconfig: `--help' gives usage information.\n"); exit(1); } argv++; argc--; } if( (skfd = sockets_open(0)) < 0 ){ PR_ERR( "socket: %s\n", strerror(errno) ); exit(1); } if( argc == 0 ){ int err = if_print( (char *) NULL ); (void)close(skfd); exit(err < 0); } spp = argv; safe_strncpy(ifr.ifr_name, *spp++, IFNAMSIZ); if( *spp == (char *) NULL ){ int err = if_print( ifr.ifr_name ); (void) close(skfd); exit(err < 0); } if( (ap = get_aftype(*spp)) != NULL ) spp++; else ap = get_aftype(DFLT_AF); if( ap ){ addr_family = ap->af; skfd = ap->fd; } while( *spp != (char *) NULL ){ if( !strcmp(*spp, "arp") ){ goterr |= clr_flag(ifr.ifr_name, IFF_NOARP); spp++; continue; } if( !strcmp(*spp, "-arp") ){ goterr |= set_flag(ifr.ifr_name, IFF_NOARP); spp++; continue; } if (!strcmp(*spp, "trailers")) { goterr |= clr_flag(ifr.ifr_name, IFF_NOTRAILERS); spp++; continue; } if (!strcmp(*spp, "-trailers")) { goterr |= set_flag(ifr.ifr_name, IFF_NOTRAILERS); spp++; continue; } if( !strcmp(*spp, "promisc") ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -