fixed error messages
[unix-history] / usr / src / sbin / fsck / setup.c
CommitLineData
eb93b62a
KM
1#ifndef lint
2static char version[] = "@(#)setup.c 3.1 (Berkeley) %G%";
3#endif
4
5#include <sys/param.h>
6#include <sys/inode.h>
7#include <sys/fs.h>
8#include <sys/stat.h>
9#include "fsck.h"
10
11char *calloc();
12
13setup(dev)
14 char *dev;
15{
16 dev_t rootdev;
17 struct stat statb;
18 daddr_t super = bflag ? bflag : SBLOCK;
19 int i, j, c, d, cgd;
20 long size;
21 BUFAREA asblk;
22# define altsblock asblk.b_un.b_fs
23
24 if (stat("/", &statb) < 0)
25 errexit("Can't stat root\n");
26 rootdev = statb.st_dev;
27 if (stat(dev, &statb) < 0) {
28 error("Can't stat %s\n", dev);
29 return (0);
30 }
31 rawflg = 0;
32 if ((statb.st_mode & S_IFMT) == S_IFBLK)
33 ;
34 else if ((statb.st_mode & S_IFMT) == S_IFCHR)
35 rawflg++;
36 else {
37 if (reply("file is not a block or character device; OK") == 0)
38 return (0);
39 }
40 if (rootdev == statb.st_rdev)
41 hotroot++;
42 if ((dfile.rfdes = open(dev, 0)) < 0) {
43 error("Can't open %s\n", dev);
44 return (0);
45 }
46 if (preen == 0)
47 printf("** %s", dev);
48 if (nflag || (dfile.wfdes = open(dev, 1)) < 0) {
49 dfile.wfdes = -1;
50 if (preen)
51 pfatal("NO WRITE ACCESS");
52 printf(" (NO WRITE)");
53 }
54 if (preen == 0)
55 printf("\n");
56 fixcg = 0; inosumbad = 0; offsumbad = 0; frsumbad = 0; sbsumbad = 0;
57 dfile.mod = 0;
58 n_files = n_blks = n_ffree = n_bfree = 0;
59 muldup = enddup = &duplist[0];
60 badlnp = &badlncnt[0];
61 lfdir = 0;
62 rplyflag = 0;
63 initbarea(&sblk);
64 initbarea(&fileblk);
65 initbarea(&inoblk);
66 initbarea(&cgblk);
67 initbarea(&asblk);
68 /*
69 * Read in the super block and its summary info.
70 */
71 if (bread(&dfile, (char *)&sblock, super, (long)SBSIZE) == 0)
72 return (0);
73 sblk.b_bno = super;
74 sblk.b_size = SBSIZE;
75 /*
76 * run a few consistency checks of the super block
77 */
78 if (sblock.fs_magic != FS_MAGIC)
79 { badsb("MAGIC NUMBER WRONG"); return (0); }
80 if (sblock.fs_ncg < 1)
81 { badsb("NCG OUT OF RANGE"); return (0); }
82 if (sblock.fs_cpg < 1 || sblock.fs_cpg > MAXCPG)
83 { badsb("CPG OUT OF RANGE"); return (0); }
84 if (sblock.fs_ncg * sblock.fs_cpg < sblock.fs_ncyl ||
85 (sblock.fs_ncg - 1) * sblock.fs_cpg >= sblock.fs_ncyl)
86 { badsb("NCYL DOES NOT JIVE WITH NCG*CPG"); return (0); }
87 if (sblock.fs_sbsize > SBSIZE)
88 { badsb("SIZE PREPOSTEROUSLY LARGE"); return (0); }
89 /*
90 * Set all possible fields that could differ, then do check
91 * of whole super block against an alternate super block.
92 * When an alternate super-block is specified this check is skipped.
93 */
94 if (bflag)
95 goto sbok;
96 if (getblk(&asblk, cgsblock(&sblock, sblock.fs_ncg - 1),
97 sblock.fs_sbsize) == 0)
98 return (0);
99 altsblock.fs_link = sblock.fs_link;
100 altsblock.fs_rlink = sblock.fs_rlink;
101 altsblock.fs_time = sblock.fs_time;
102 altsblock.fs_cstotal = sblock.fs_cstotal;
103 altsblock.fs_cgrotor = sblock.fs_cgrotor;
104 altsblock.fs_fmod = sblock.fs_fmod;
105 altsblock.fs_clean = sblock.fs_clean;
106 altsblock.fs_ronly = sblock.fs_ronly;
107 altsblock.fs_flags = sblock.fs_flags;
108 altsblock.fs_maxcontig = sblock.fs_maxcontig;
109 altsblock.fs_minfree = sblock.fs_minfree;
110 altsblock.fs_rotdelay = sblock.fs_rotdelay;
111 altsblock.fs_maxbpg = sblock.fs_maxbpg;
112 bcopy((char *)sblock.fs_csp, (char *)altsblock.fs_csp,
113 sizeof sblock.fs_csp);
114 bcopy((char *)sblock.fs_fsmnt, (char *)altsblock.fs_fsmnt,
115 sizeof sblock.fs_fsmnt);
116 if (bcmp((char *)&sblock, (char *)&altsblock, (int)sblock.fs_sbsize))
117 { badsb("TRASHED VALUES IN SUPER BLOCK"); return (0); }
118sbok:
119 fmax = sblock.fs_size;
120 imax = sblock.fs_ncg * sblock.fs_ipg;
121 n_bad = cgsblock(&sblock, 0); /* boot block plus dedicated sblock */
122 /*
123 * read in the summary info.
124 */
125 for (i = 0, j = 0; i < sblock.fs_cssize; i += sblock.fs_bsize, j++) {
126 size = sblock.fs_cssize - i < sblock.fs_bsize ?
127 sblock.fs_cssize - i : sblock.fs_bsize;
128 sblock.fs_csp[j] = (struct csum *)calloc(1, (unsigned)size);
129 if (bread(&dfile, (char *)sblock.fs_csp[j],
130 fsbtodb(&sblock, sblock.fs_csaddr + j * sblock.fs_frag),
131 size) == 0)
132 return (0);
133 }
134 /*
135 * allocate and initialize the necessary maps
136 */
137 bmapsz = roundup(howmany(fmax, NBBY), sizeof(short));
138 blockmap = calloc((unsigned)bmapsz, sizeof (char));
139 if (blockmap == NULL) {
140 printf("cannot alloc %d bytes for blockmap\n", bmapsz);
141 goto badsb;
142 }
143 freemap = calloc((unsigned)bmapsz, sizeof (char));
144 if (freemap == NULL) {
145 printf("cannot alloc %d bytes for freemap\n", bmapsz);
146 goto badsb;
147 }
148 statemap = calloc((unsigned)(imax + 1), sizeof(char));
149 if (statemap == NULL) {
150 printf("cannot alloc %d bytes for statemap\n", imax + 1);
151 goto badsb;
152 }
153 lncntp = (short *)calloc((unsigned)(imax + 1), sizeof(short));
154 if (lncntp == NULL) {
155 printf("cannot alloc %d bytes for lncntp\n",
156 (imax + 1) * sizeof(short));
157 goto badsb;
158 }
159 for (c = 0; c < sblock.fs_ncg; c++) {
160 cgd = cgdmin(&sblock, c);
161 if (c == 0) {
162 d = cgbase(&sblock, c);
163 cgd += howmany(sblock.fs_cssize, sblock.fs_fsize);
164 } else
165 d = cgsblock(&sblock, c);
166 for (; d < cgd; d++)
167 setbmap(d);
168 }
169
170 return (1);
171
172badsb:
173 ckfini();
174 return (0);
175# undef altsblock
176}
177
178badsb(s)
179 char *s;
180{
181
182 if (preen)
183 printf("%s: ", devname);
184 printf("BAD SUPER BLOCK: %s\n", s);
185 pwarn("USE -b OPTION TO FSCK TO SPECIFY LOCATION OF AN ALTERNATE\n");
186 pfatal("SUPER-BLOCK TO SUPPLY NEEDED INFORMATION; SEE fsck(8).\n");
187}