|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)mkswapconf.c 4.1 (Berkeley) 8/13/83";
3: #endif
4:
5: /*
6: * Build a swap configuration file.
7: */
8: #include "config.h"
9:
10: #include <stdio.h>
11: #include <ctype.h>
12:
13: swapconf()
14: {
15: register struct file_list *fl;
16: struct file_list *do_swap();
17:
18: fl = conf_list;
19: while (fl) {
20: if (fl->f_type != SYSTEMSPEC) {
21: fl = fl->f_next;
22: continue;
23: }
24: fl = do_swap(fl);
25: }
26: }
27:
28: struct file_list *
29: do_swap(fl)
30: register struct file_list *fl;
31: {
32: FILE *fp;
33: char swapname[80], *cp;
34: register struct file_list *swap;
35: dev_t dev;
36:
37: if (eq(fl->f_fn, "generic")) {
38: fl = fl->f_next;
39: return (fl->f_next);
40: }
41: (void) sprintf(swapname, "swap%s.c", fl->f_fn);
42: fp = fopen(path(swapname), "w");
43: if (fp == 0) {
44: perror(path(swapname));
45: exit(1);
46: }
47: fprintf(fp, "#include \"../h/param.h\"\n");
48: fprintf(fp, "#include \"../h/conf.h\"\n");
49: fprintf(fp, "\n");
50: /*
51: * If there aren't any swap devices
52: * specified, just return, the error
53: * has already been noted.
54: */
55: swap = fl->f_next;
56: if (swap == 0 || swap->f_type != SWAPSPEC) {
57: (void) unlink(path(swapname));
58: fclose(fp);
59: return (swap);
60: }
61: fprintf(fp, "dev_t\trootdev = makedev(%d, %d);\n",
62: major(fl->f_rootdev), minor(fl->f_rootdev));
63: fprintf(fp, "dev_t\targdev = makedev(%d, %d);\n",
64: major(fl->f_argdev), minor(fl->f_argdev));
65: fprintf(fp, "dev_t\tdumpdev = makedev(%d, %d);\n",
66: major(fl->f_dumpdev), minor(fl->f_dumpdev));
67: fprintf(fp, "\n");
68: fprintf(fp, "struct\tswdevt swdevt[] = {\n");
69: do {
70: dev = swap->f_swapdev;
71: fprintf(fp, "\t{ makedev(%d, %d),\t0,\t%d },\t/* %s */\n",
72: major(dev), minor(dev), swap->f_swapsize, swap->f_fn);
73: swap = swap->f_next;
74: } while (swap && swap->f_type == SWAPSPEC);
75: fprintf(fp, "\t{ 0, 0, 0 }\n");
76: fprintf(fp, "};\n");
77: fclose(fp);
78: return (swap);
79: }
80:
81: static int devtablenotread = 1;
82: static struct devdescription {
83: char *dev_name;
84: int dev_major;
85: struct devdescription *dev_next;
86: } *devtable;
87:
88: /*
89: * Given a device name specification figure out:
90: * major device number
91: * partition
92: * device name
93: * unit number
94: * This is a hack, but the system still thinks in
95: * terms of major/minor instead of string names.
96: */
97: dev_t
98: nametodev(name, defunit, defpartition)
99: char *name;
100: int defunit;
101: char defpartition;
102: {
103: char *cp, partition;
104: int unit;
105: register struct devdescription *dp;
106:
107: cp = name;
108: if (cp == 0) {
109: fprintf(stderr, "config: internal error, nametodev\n");
110: exit(1);
111: }
112: while (*cp && !isdigit(*cp))
113: cp++;
114: unit = *cp ? atoi(cp) : defunit;
115: if (unit < 0 || unit > 7) {
116: fprintf(stderr,
117: "config: %s: invalid device specification, unit out of range\n", name);
118: unit = defunit; /* carry on more checking */
119: }
120: if (*cp) {
121: *cp++ = '\0';
122: while (*cp && isdigit(*cp))
123: cp++;
124: }
125: partition = *cp ? *cp : defpartition;
126: if (partition < 'a' || partition > 'h') {
127: fprintf(stderr,
128: "config: %c: invalid device specification, bad partition\n", *cp);
129: partition = defpartition; /* carry on */
130: }
131: if (devtablenotread)
132: initdevtable();
133: for (dp = devtable; dp->dev_next; dp = dp->dev_next)
134: if (eq(name, dp->dev_name))
135: break;
136: if (dp == 0) {
137: fprintf(stderr, "config: %s: unknown device\n", name);
138: return (NODEV);
139: }
140: return (makedev(dp->dev_major, (unit << 3) + (partition - 'a')));
141: }
142:
143: char *
144: devtoname(dev)
145: dev_t dev;
146: {
147: char buf[80];
148: register struct devdescription *dp;
149:
150: if (devtablenotread)
151: initdevtable();
152: for (dp = devtable; dp->dev_next; dp = dp->dev_next)
153: if (major(dev) == dp->dev_major)
154: break;
155: if (dp == 0)
156: dp = devtable;
157: sprintf(buf, "%s%d%c", dp->dev_name,
158: minor(dev) >> 3, (minor(dev) & 07) + 'a');
159: return (ns(buf));
160: }
161:
162: initdevtable()
163: {
164: char buf[BUFSIZ];
165: int maj;
166: register struct devdescription **dp = &devtable;
167: FILE *fp;
168:
169: sprintf(buf, "../conf/devices.%s", machinename);
170: fp = fopen(buf, "r");
171: if (fp == NULL) {
172: fprintf(stderr, "config: can't open %s\n", buf);
173: exit(1);
174: }
175: while (fscanf(fp, "%s\t%d\n", buf, &maj) == 2) {
176: *dp = (struct devdescription *)malloc(sizeof (**dp));
177: (*dp)->dev_name = ns(buf);
178: (*dp)->dev_major = maj;
179: dp = &(*dp)->dev_next;
180: }
181: *dp = 0;
182: fclose(fp);
183: devtablenotread = 0;
184: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.