Annotation of coherent/b/etc/fsck/init.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     Perform initialization for phases of fsck
                      3:  */
                      4: #include "fsck.h"
                      5: #include <mnttab.h>
                      6: #include <mtab.h>
                      7: 
                      8: int    fsfd;                           /* file system file descriptor */
                      9: int    writeflg;                       /* write ok or read-only flag */
                     10: daddr_t        fsize = SUPERI+1;               /* file system size in blocks  */
                     11:                                        /* Allows for read of Super Block */
                     12: int    isize;                          /* First block not in inode list */
                     13: daddr_t        totfree;                        /* Running total free block count */
                     14: unsigned       ninodes;                /* number of inodes */
                     15: int    numfiles;                       /* number of files in file system */
                     16: 
                     17: char   superb[BSIZE];                  /* Super Block */
                     18: struct filsys *sbp = superb;
                     19: int    sbpfix;                         /* flag for super block fixes */
                     20: 
                     21: int    offsets[] =                     /* table of offsets for the levels */
                     22:                { ND, ND+NI, ND+NI+NII, /* of indirection of blocks in the */
                     23:                  ND+NI+NII+NIII };     /* inode block list */
                     24: 
                     25: daddr_t        dupblck[DUPTBLSIZE];            /* duplicate referenced blocks */
                     26: int    totdups;                        /* number of dup blocks so far */
                     27: 
                     28: /*
                     29:  *  A small aside is the fact that the link counter table allocates an
                     30:  *  unsigned short if !SMALLMODEL, but is in fact only an unsigned char
                     31:  *  if SMALLMODEL.  As a result, we cannot currently fsck correctly a
                     32:  *  filesystem with any inode having more than 255 links if SMALLMODEL.
                     33:  *  The reason for this is that the virtual system is heavily designed
                     34:  *  to work with byte sized tables, and that's that for now!  Anyway,
                     35:  *  everybody has a 386 by now!
                     36:  */
                     37: 
                     38: #if !SMALLMODEL
                     39: unsigned short *linkPtr;
                     40: unsigned char  *flagptr, *blockPtr, *dupPtr;
                     41: #endif
                     42: 
                     43: init()
                     44: {
                     45:        int mode;
                     46:        struct stat status;
                     47:        unsigned short stmode;
                     48: 
                     49:        mode = (mdaction == NO) ? 0 : 2;
                     50: 
                     51:        if ( (fsfd = open(fsname, mode)) == (-1) ) {
                     52:                mode = 0;
                     53:                if ( (fsfd = open(fsname, mode)) == (-1) ) {
                     54:                        nonfatal("Can't open: %s", fsname);
                     55:                        return;
                     56:                }
                     57:        }
                     58: 
                     59:        if (mode == 0) {
                     60:                daction  = NO;
                     61:                writeflg = FALSE;
                     62:        } else {
                     63:                daction  = mdaction;
                     64:                writeflg = TRUE;
                     65:        }
                     66:        
                     67:        printf("%s: %s\n", fsname, (mode == 0) ? "(NO WRITE)" : "");
                     68: 
                     69:        if ( fstat(fsfd, &status) == (-1) ) {
                     70:                nonfatal("Can't stat: %s", fsname);
                     71:                return;
                     72:        }
                     73: 
                     74:        stmode = status.st_mode & S_IFMT;
                     75:        if ( (stmode != S_IFBLK) && (stmode != S_IFCHR) ) 
                     76:                switch(query("file is not a block or character device; OK?")){
                     77:                case YES:
                     78:                        break;
                     79:                case NO:
                     80:                        errflag = TRUE;
                     81:                        return;
                     82:                }
                     83: 
                     84:        domount();
                     85:        sbpfix = FALSE;
                     86:        readsuper();
                     87:        checksuper();
                     88:        if ( !errflag )
                     89:                alloctables();
                     90: }
                     91: 
                     92: /*
                     93:  *     Read in the super block and canonicalize
                     94:  */
                     95: 
                     96: readsuper()
                     97: {
                     98:        register int i;
                     99: 
                    100:        bread((daddr_t)SUPERI, superb);
                    101:        sbp = superb;
                    102: 
                    103:        canshort(sbp->s_isize);
                    104:        candaddr(sbp->s_fsize);
                    105:        canshort(sbp->s_nfree);
                    106:        for(i=0; i<NICFREE; i++)
                    107:                candaddr(sbp->s_free[i]);
                    108:        canshort(sbp->s_ninode);
                    109:        for(i=0; i<NICINOD; i++)
                    110:                canino(sbp->s_inode[i]);
                    111:        cantime(sbp->s_time);
                    112:        candaddr(sbp->s_tfree);
                    113:        canino(sbp->s_tinode);
                    114:        canshort(sbp->s_m);
                    115:        canshort(sbp->s_n);
                    116:        canlong(sbp->s_unique);
                    117: 
                    118: }
                    119: 
                    120: /*
                    121:  *     Check super block for obvious inconsistencies
                    122:  */
                    123: 
                    124: checksuper()
                    125: {
                    126:        fsize = sbp->s_fsize;
                    127:        isize = sbp->s_isize;
                    128:        totfree = fsize - isize;
                    129:        
                    130:        if ( (isize<=INODEI) || (isize>=fsize) || (fsize<=INODEI) ) {
                    131:                badsuper("Size check: fsize %U isize %u", fsize, isize);
                    132:                errflag = TRUE;
                    133:        }
                    134: 
                    135:        if ( sbp->s_nfree > NICFREE )
                    136:                badsuper("Too large free block count");
                    137: 
                    138:        if ( sbp->s_ninode > NICINOD )
                    139:                badsuper("Too large free i-node count");
                    140: }
                    141: 
                    142: /*
                    143:  *     Super Block Error Functions
                    144:  */
                    145: badsuper(x)
                    146: {
                    147:        printf("%r\n", &x);
                    148:        printf("fsck: %s: Bad Super Block: %u\n", fsname, SUPERI);
                    149: }
                    150: 
                    151: /*
                    152:  *     Allocate the necessary buffers for tables
                    153:  */
                    154: alloctables()
                    155: {
                    156:        unsigned num, numl;
                    157: 
                    158:        numl = 0;
                    159:        if (!fflag) {
                    160:                ninodes = (unsigned) (isize - INODEI) * INOPB;
                    161:                numl = (unsigned) ninodes;
                    162:        }
                    163:        
                    164:        num = (unsigned) ((fsize+NBPC-1)/NBPC) * sizeof(char);
                    165: #if SMALLMODEL
                    166:        initV(numl, numl, num, num); /* virtual allocation */
                    167: #else
                    168:        if (NULL != linkPtr) {
                    169:                free(linkPtr);
                    170:                free(flagPtr);
                    171:                free(blockPtr);
                    172:                free(dupPtr);
                    173:        }
                    174:        linkPtr  = calloc(numl, sizeof(unsigned short));
                    175:        flagPtr  = calloc(numl, sizeof(unsigned char));
                    176:        blockPtr = calloc(num,  sizeof(unsigned char));
                    177:        dupPtr   = calloc(num,  sizeof(unsigned char));
                    178: #endif
                    179:        numfiles =              /* number of files in the file system */
                    180:        totdups = 0;            /* num dup blocks */
                    181: }
                    182: 
                    183: /*
                    184:  *     domount() checks the files /etc/mnttab and /etc/mtab to find
                    185:  *     out where the file system is mounted (if at all).  It then 
                    186:  *     reports where (and when if possible) it was last mounted.
                    187:  */
                    188: char *mnttab_name = "/etc/mnttab";
                    189: char *mtab_name          = "/etc/mtab";
                    190: char *bttime_name = "/etc/boottime";
                    191: 
                    192: domount()
                    193: {
                    194:        int fd;
                    195:        struct mnttab mnttab;
                    196:        struct mtab mtab;
                    197:        register char *name;
                    198:        struct stat sbuf;
                    199:        time_t boottime;
                    200:        int nothing();
                    201:        char devname[MNTNSIZ+6] = "/dev/";
                    202: 
                    203:        mounted = FALSE;
                    204:        name = fsname;                          /* strip off all initial */
                    205:        while (*name++ != '\0') ;               /* directories in fsname */
                    206:        while ( (*--name != '/') && (name>fsname) ) ;
                    207:        if (*name == '/') name++;
                    208: 
                    209:        if ( stat(bttime_name, &sbuf) == -1 )
                    210:                boottime = (time_t)0;
                    211:        else
                    212:                boottime = sbuf.st_mtime;
                    213:                                
                    214:        if ( (fd=open(mnttab_name, 0)) != (-1) ) {
                    215:                while ( read(fd, &mnttab, sizeof(mnttab))==sizeof(mnttab) ) 
                    216:                        if ( mnttab.mt_dev[0] && mnttab.mt_filsys[0] ) {
                    217:                                strncpy(&devname[5], mnttab.mt_filsys, MNTNSIZ);
                    218:                                devname[MNTNSIZ+5] = '\0';
                    219:                                statit(devname, nothing);
                    220:                                if (stats.st_rdev != fsysrdev)
                    221:                                        continue;
                    222:                                statit(mnttab.mt_dev, nothing);
                    223:                                mounted = (stats.st_dev == fsysrdev);
                    224:                                prmnttab(&mnttab, boottime);
                    225:                                return;
                    226:                        }
                    227:        }
                    228:        if ( (fd=open(mtab_name, 0)) != (-1) ) {
                    229:                while ( read(fd, &mtab, sizeof(mtab))==sizeof(mtab) ) 
                    230:                        if ( mtab.mt_name[0] && mtab.mt_special[0] ) {
                    231:                                strncpy(&devname[5], mtab.mt_special, MNAMSIZ);
                    232:                                devname[MNAMSIZ+5] = '\0';
                    233:                                statit(devname, nothing);
                    234:                                if (stats.st_rdev != fsysrdev)
                    235:                                        continue;
                    236:                                statit(mtab.mt_name, nothing);
                    237:                                mounted = (stats.st_dev == fsysrdev);
                    238:                                prmtab(&mtab);
                    239:                                return;
                    240:                        }
                    241:        }
                    242: 
                    243:        if (fsysrdev == rootdev)
                    244:                mounted = TRUE;
                    245:        else
                    246:                mounted = FALSE;
                    247: 
                    248: }
                    249: 
                    250: prmnttab(ptr, boottime)
                    251: struct mnttab *ptr;
                    252: time_t boottime;
                    253: {
                    254:        if (mounted) {
                    255:                if (boottime < ptr->mt_time)
                    256:                        boottime = ptr->mt_time;
                    257:                printf("%s mounted on %.*s as of %s", fsname, MNTNSIZ, 
                    258:                                        ptr->mt_dev, ctime(&boottime));
                    259:        } else
                    260:                printf("%s unmounted.  Last mounted on %.*s -- %s",
                    261:                                                fsname, MNTNSIZ, ptr->mt_dev,
                    262:                                                        ctime(&ptr->mt_time));
                    263: }
                    264: 
                    265: 
                    266: prmtab(ptr)
                    267: struct mtab *ptr;
                    268: {
                    269:        if (mounted)
                    270:                printf("%s mounted on %.*s\n", fsname, MNAMSIZ, ptr->mt_name);
                    271:        else
                    272:                printf("%s unmounted.  Last mounted on %.*s\n", fsname,
                    273:                                                        MNAMSIZ, ptr->mt_name);
                    274: }
                    275: 
                    276: nothing()
                    277: {}

unix.superglobalmegacorp.com

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