add manual page, update
[unix-history] / usr / src / usr.sbin / config / mkswapconf.c
CommitLineData
cd68466f
DF
1/*
2 * Copyright (c) 1980 Regents of the University of California.
86f9c1e9
KB
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
b8c620d6
KB
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.
cd68466f
DF
16 */
17
d194e412 18#ifndef lint
b8c620d6 19static char sccsid[] = "@(#)mkswapconf.c 5.6 (Berkeley) %G%";
86f9c1e9 20#endif /* not lint */
d194e412
SL
21
22/*
23 * Build a swap configuration file.
24 */
25#include "config.h"
26
27#include <stdio.h>
28#include <ctype.h>
29
30swapconf()
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
45struct file_list *
46do_swap(fl)
47 register struct file_list *fl;
48{
49 FILE *fp;
900434b1 50 char swapname[80];
d194e412
SL
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
98static int devtablenotread = 1;
99static 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 */
114dev_t
115nametodev(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;
8243525f 132 if (unit < 0 || unit > 31) {
d194e412
SL
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();
dc076cc6 150 for (dp = devtable; dp; dp = dp->dev_next)
d194e412
SL
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
160char *
161devtoname(dev)
162 dev_t dev;
163{
164 char buf[80];
165 register struct devdescription *dp;
166
167 if (devtablenotread)
168 initdevtable();
dc076cc6 169 for (dp = devtable; dp; dp = dp->dev_next)
d194e412
SL
170 if (major(dev) == dp->dev_major)
171 break;
172 if (dp == 0)
173 dp = devtable;
9bd38ba8 174 (void) sprintf(buf, "%s%d%c", dp->dev_name,
d194e412
SL
175 minor(dev) >> 3, (minor(dev) & 07) + 'a');
176 return (ns(buf));
177}
178
179initdevtable()
180{
181 char buf[BUFSIZ];
182 int maj;
183 register struct devdescription **dp = &devtable;
184 FILE *fp;
185
9bd38ba8 186 (void) sprintf(buf, "../conf/devices.%s", machinename);
d194e412
SL
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}