Annotation of 43BSD/etc/fsck/setup.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.