|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)ifconfig.c 4.5 (Berkeley) 11/2/83";
3: #endif
4:
5: #include <sys/types.h>
6: #include <sys/socket.h>
7: #include <sys/ioctl.h>
8:
9: #include <netinet/in.h>
10: #include <net/if.h>
11:
12: #include <stdio.h>
13: #include <errno.h>
14: #include <ctype.h>
15: #include <netdb.h>
16:
17: struct ifreq ifr;
18: struct sockaddr_in sin = { AF_INET };
19: char name[30];
20: int flags;
21: int s;
22:
23: int setifflags(), setifaddr();
24:
25: struct cmd {
26: char *c_name;
27: int c_parameter;
28: int (*c_func)();
29: } cmds[] = {
30: { "up", IFF_UP, setifflags } ,
31: { "down", -IFF_UP, setifflags },
32: { "trailers", -IFF_NOTRAILERS,setifflags },
33: { "-trailers", IFF_NOTRAILERS, setifflags },
34: { "arp", -IFF_NOARP, setifflags },
35: { "-arp", IFF_NOARP, setifflags },
36: { "debug", IFF_DEBUG, setifflags },
37: { "-debug", -IFF_DEBUG, setifflags },
38: #ifdef notdef
39: #define EN_SWABIPS 0x100
40: { "swabips", EN_SWABIPS, setifflags },
41: { "-swabips", -EN_SWABIPS, setifflags },
42: #endif
43: { 0, 0, setifaddr },
44: };
45:
46: main(argc, argv)
47: int argc;
48: char *argv[];
49: {
50:
51: if (argc < 2) {
52: fprintf(stderr, "usage: ifconfig interface %s %s %s\n",
53: "[ address ] [ up ] [ down ]",
54: "[ trailers | -trailers ]",
55: "[ arp | -arp ]");
56: exit(1);
57: }
58: s = socket(AF_INET, SOCK_DGRAM, 0);
59: if (s < 0) {
60: perror("ifconfig: socket");
61: exit(1);
62: }
63: argc--, argv++;
64: strcpy(name, *argv);
65: strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
66: if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
67: Perror("ioctl (SIOCGIFFLAGS)");
68: exit(1);
69: }
70: flags = ifr.ifr_flags;
71: argc--, argv++;
72: if (argc == 0) {
73: status();
74: exit(0);
75: }
76: while (argc > 0) {
77: register struct cmd *p;
78:
79: for (p = cmds; p->c_name; p++)
80: if (strcmp(*argv, p->c_name) == 0)
81: break;
82: if (p->c_func)
83: (*p->c_func)(*argv, p->c_parameter);
84: argc--, argv++;
85: }
86: exit(0);
87: }
88:
89: /*ARGSUSED*/
90: setifaddr(addr, param)
91: char *addr;
92: int param;
93: {
94:
95: getaddr(addr, (struct sockaddr_in *)&ifr.ifr_addr);
96: strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
97: if (ioctl(s, SIOCSIFADDR, (caddr_t)&ifr) < 0)
98: Perror("ioctl (SIOCSIFADDR)");
99: }
100:
101: setifflags(vname, value)
102: char *vname;
103: int value;
104: {
105:
106: if (value < 0) {
107: value = -value;
108: flags &= ~value;
109: } else
110: flags |= value;
111: ifr.ifr_flags = flags;
112: strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
113: if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0)
114: Perror(vname);
115: }
116:
117: status()
118: {
119: struct sockaddr_in *sin;
120:
121: strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
122: if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0)
123: Perror("ioctl (SIOCGIFADDR)");
124: sin = (struct sockaddr_in *)&ifr.ifr_addr;
125: printf("%s: %s ", name, inet_ntoa(sin->sin_addr));
126: #define IFFBITS \
127: "\020\1UP\2BROADCAST\3DEBUG\4ROUTE\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP"
128: printb("flags", flags, IFFBITS); putchar('\n');
129: }
130:
131: Perror(cmd)
132: char *cmd;
133: {
134: extern int errno;
135:
136: fprintf(stderr, "ifconfig: ");
137: switch (errno) {
138:
139: case ENXIO:
140: fprintf(stderr, "%s: ", cmd);
141: fprintf(stderr, "no such interface\n");
142: break;
143:
144: case EPERM:
145: fprintf(stderr, "%s: permission denied\n");
146: break;
147:
148: default:
149: perror(cmd);
150: }
151: exit(1);
152: }
153:
154: struct in_addr inet_makeaddr();
155:
156: getaddr(s, sin)
157: char *s;
158: struct sockaddr_in *sin;
159: {
160: struct hostent *hp;
161: struct netent *np;
162: int val;
163:
164: hp = gethostbyname(s);
165: if (hp) {
166: sin->sin_family = hp->h_addrtype;
167: bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length);
168: return;
169: }
170: np = getnetbyname(s);
171: if (np) {
172: sin->sin_family = np->n_addrtype;
173: sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
174: return;
175: }
176: sin->sin_family = AF_INET;
177: val = inet_addr(s);
178: if (val != -1) {
179: sin->sin_addr.s_addr = val;
180: return;
181: }
182: val = inet_network(s);
183: if (val != -1) {
184: sin->sin_addr = inet_makeaddr(val, INADDR_ANY);
185: return;
186: }
187: fprintf(stderr, "%s: bad value\n", s);
188: exit(1);
189: }
190:
191: /*
192: * Print a value a la the %b format of the kernel's printf
193: */
194: printb(s, v, bits)
195: char *s;
196: register char *bits;
197: register unsigned short v;
198: {
199: register int i, any = 0;
200: register char c;
201:
202: if (bits && *bits == 8)
203: printf("%s=%o", s, v);
204: else
205: printf("%s=%x", s, v);
206: bits++;
207: if (bits) {
208: putchar('<');
209: while (i = *bits++) {
210: if (v & (1 << (i-1))) {
211: if (any)
212: putchar(',');
213: any = 1;
214: for (; (c = *bits) > 32; bits++)
215: putchar(c);
216: } else
217: for (; *bits > 32; bits++)
218: ;
219: }
220: putchar('>');
221: }
222: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.