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