|
|
1.1 root 1: /*
2: * N E T C O N F I G
3: *
4: * Ethernet network setup procedure.
5: *
6: * Usage: netconfig device unit { protocol }
7: *
8: * where device is the ethernet device type (ec, il, etc.)
9: * unit is the physical unit number of the device
10: * protocol is a protocol name (ip, chaos, arp, etc.),
11: * optionally followed by protocol-specific arguments
12: *
13: *
14: * (c) Copyright 1985 Nirvonics, Inc.
15: *
16: * Written by Kurt Gollhardt
17: * Last update Thu Mar 14 11:40:10 1985
18: *
19: * This software is the property of Nirvonics, Inc.
20: * All rights reserved.
21: *
22: */
23:
24: #include <stdio.h>
25: #include <ctype.h>
26: #include <signal.h>
27: #include <sys/types.h>
28: #include <sys/ioctl.h>
29: #include <sys/ethernet.h>
30:
31: #define CONFIG_DIR "/usr/ether"
32:
33: extern int dump_ld;
34:
35: #define MAX_ARGS 10
36:
37: char *argv[MAX_ARGS];
38:
39:
40: main(ac,av)
41: char **av;
42: {
43: int fd, unit, min_minor, max_minor, c, usage, dumping;
44: char *dev, devfile[40], prog[40], name[40];
45: extern int optind;
46: extern char *optarg;
47:
48: while ((c = getopt(ac, av, "d")) != EOF)
49: switch (c) {
50: case 'd':
51: dumping++;
52: break;
53: case '?':
54: usage++;
55: break;
56: }
57:
58: if (ac - optind < 3)
59: usage++;
60:
61: if (usage) {
62: fprintf(stderr,
63: "Usage: netconfig [-options] ether_device unit {protocol}\n",
64: av[0]);
65: fprintf(stderr,
66: "Options: -d: insert a dump line-discipline\n");
67: exit(1);
68: }
69:
70: dev = av[optind++];
71: if (strncmp(dev, "/dev/", 5) == 0)
72: dev += 5;
73: sprintf(devfile, "/dev/%s", dev);
74: unit = atoi(av[optind++]);
75: min_minor = unit * CHANS_PER_UNIT;
76: max_minor = min_minor + CHANS_PER_UNIT - 1;
77:
78: signal(SIGHUP, SIG_IGN);
79:
80: while (optind < ac) {
81: if ((fd = findslot(devfile, min_minor, max_minor, 2)) < 0) {
82: fprintf(stderr,
83: "Can't open %s unit %d for address resolution\n",
84: devfile, unit);
85: exit(1);
86: }
87: dup2(fd, 0);
88: close(fd);
89:
90: if (dumping && ioctl(0, FIOPUSHLD, &dump_ld) < 0)
91: fprintf(stderr, "Can't push dump line discipline\n");
92:
93: makeargv(av[optind++]);
94: sprintf(prog, "%s/%sconfig", CONFIG_DIR, argv[0]);
95: sprintf(name, "%s %s%d", argv[0], dev, unit);
96: argv[0] = name;
97:
98: switch (fork()) {
99: case -1:
100: fprintf(stderr, "netconfig: fork failed\n");
101: exit(1);
102: case 0:
103: break;
104: default: /* child */
105: execv(prog, argv);
106: fprintf(stderr, "%s: exec failed\n", prog);
107: _exit(1);
108: }
109: }
110: }
111:
112:
113: makeargv(s)
114: char *s;
115: {
116: register int argc;
117:
118: for (argc = 0; *s && argc < MAX_ARGS-1; ++argc) {
119: argv[argc] = s;
120: while (*s && !isspace(*s))
121: ++s;
122: if (*s)
123: *s++ = '\0';
124: while (*s && isspace(*s))
125: ++s;
126: }
127:
128: argv[argc] = 0;
129: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.