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

unix.superglobalmegacorp.com

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