Annotation of researchv10dc/cmd/x, revision 1.1.1.1

1.1       root        1: #line 1 "/usr/include/stdio.h"
                      2: 
                      3: 
                      4: 
                      5: extern struct  _iobuf {
                      6:        int     _cnt;
                      7:        unsigned char   *_ptr;
                      8:        unsigned char   *_base;
                      9:        short   _flag;
                     10:        char    _file;
                     11: } _iob[ 120 ];
                     12: 
                     13: 
                     14: 
                     15: 
                     16: 
                     17: 
                     18: 
                     19: 
                     20: 
                     21: 
                     22: 
                     23: 
                     24: 
                     25: 
                     26: 
                     27: 
                     28: 
                     29: 
                     30: 
                     31: 
                     32: 
                     33: 
                     34: 
                     35: 
                     36: 
                     37: 
                     38:  struct _iobuf *fopen();
                     39:  struct _iobuf *fdopen();
                     40:  struct _iobuf *freopen();
                     41:  struct _iobuf *popen();
                     42: long   ftell();
                     43: char   *fgets();
                     44: 
                     45: 
                     46: #line 1 "/usr/include/tmpnam.h"
                     47: 
                     48: 
                     49: #line 46 "/usr/include/stdio.h"
                     50: 
                     51: #line 2 "fsck.c"
                     52: #line 1 "/usr/include/ctype.h"
                     53: 
                     54: 
                     55: 
                     56: 
                     57: 
                     58: 
                     59: 
                     60: 
                     61: 
                     62: extern char    _ctype[];
                     63: 
                     64: 
                     65: 
                     66: 
                     67: 
                     68: 
                     69: 
                     70: 
                     71: 
                     72: 
                     73: 
                     74: 
                     75: 
                     76: 
                     77: 
                     78: 
                     79: #line 3 "fsck.c"
                     80: #line 1 "/usr/include/sys/param.h"
                     81: 
                     82: #line 4 "/usr/include/sys/param.h"
                     83: 
                     84: 
                     85: 
                     86: 
                     87: 
                     88: 
                     89: 
                     90: 
                     91: 
                     92: 
                     93: 
                     94: #line 19 "/usr/include/sys/param.h"
                     95: 
                     96: 
                     97: 
                     98: 
                     99: 
                    100: 
                    101: 
                    102: 
                    103: 
                    104: 
                    105: 
                    106: 
                    107: 
                    108: 
                    109: #line 36 "/usr/include/sys/param.h"
                    110: 
                    111: 
                    112: #line 1 "/usr/include/signal.h"
                    113: 
                    114: 
                    115: 
                    116: 
                    117: 
                    118: 
                    119: 
                    120: 
                    121: 
                    122: 
                    123: 
                    124: 
                    125: 
                    126: 
                    127: 
                    128: 
                    129: 
                    130: 
                    131: 
                    132: 
                    133: 
                    134: 
                    135: 
                    136: 
                    137: 
                    138: 
                    139: 
                    140: 
                    141: 
                    142: 
                    143: 
                    144: 
                    145: 
                    146: 
                    147: 
                    148: 
                    149: 
                    150: 
                    151: typedef int    (*SIG_TYP)();
                    152: 
                    153: SIG_TYP signal();
                    154: 
                    155: 
                    156: 
                    157: 
                    158: 
                    159: 
                    160: 
                    161: 
                    162: 
                    163: 
                    164: 
                    165: 
                    166: 
                    167: 
                    168: 
                    169: 
                    170: 
                    171: 
                    172: #line 39 "/usr/include/sys/param.h"
                    173: 
                    174: 
                    175: 
                    176: #line 44 "/usr/include/sys/param.h"
                    177: 
                    178: 
                    179: 
                    180: 
                    181: 
                    182: 
                    183: 
                    184: 
                    185: 
                    186: 
                    187: 
                    188: 
                    189: 
                    190: #line 63 "/usr/include/sys/param.h"
                    191: 
                    192: 
                    193: 
                    194: 
                    195: 
                    196: 
                    197: 
                    198: 
                    199: 
                    200: 
                    201: #line 75 "/usr/include/sys/param.h"
                    202: 
                    203: 
                    204: 
                    205: 
                    206: 
                    207: 
                    208: 
                    209: 
                    210: 
                    211: 
                    212: 
                    213: 
                    214: 
                    215: 
                    216: 
                    217: 
                    218: 
                    219: 
                    220: 
                    221: 
                    222: 
                    223: 
                    224: 
                    225: 
                    226: #line 101 "/usr/include/sys/param.h"
                    227: 
                    228: 
                    229: 
                    230: 
                    231: #line 107 "/usr/include/sys/param.h"
                    232: 
                    233: 
                    234: 
                    235: 
                    236: 
                    237: 
                    238: #line 115 "/usr/include/sys/param.h"
                    239: 
                    240: 
                    241: 
                    242: #line 121 "/usr/include/sys/param.h"
                    243: 
                    244: 
                    245: 
                    246: 
                    247: 
                    248: 
                    249: 
                    250: 
                    251: #line 131 "/usr/include/sys/param.h"
                    252: #line 1 "/usr/include/sys/types.h"
                    253: 
                    254: #line 4 "/usr/include/sys/types.h"
                    255: 
                    256: 
                    257: 
                    258: #line 9 "/usr/include/sys/types.h"
                    259: 
                    260: 
                    261: 
                    262: 
                    263: 
                    264: 
                    265: 
                    266: 
                    267: 
                    268: 
                    269: 
                    270: 
                    271: 
                    272: 
                    273: 
                    274: 
                    275: 
                    276: 
                    277: 
                    278: 
                    279: 
                    280: #line 33 "/usr/include/sys/types.h"
                    281: typedef        unsigned char   u_char;
                    282: typedef        unsigned short  u_short;
                    283: typedef        unsigned int    u_int;
                    284: typedef        unsigned long   u_long;
                    285: 
                    286: typedef        long    daddr_t;
                    287: typedef        char *  caddr_t;
                    288: typedef        unsigned short  ino_t;
                    289: typedef        long    swblk_t;
                    290: typedef        long    clicks_t;
                    291: typedef        long    time_t;
                    292: typedef        long    label_t[14];
                    293: typedef        unsigned short  dev_t;
                    294: typedef        long    off_t;
                    295: typedef        struct { unsigned long lo; long hi; } llong_t;
                    296: 
                    297: 
                    298: 
                    299: 
                    300: 
                    301: 
                    302: 
                    303: 
                    304: 
                    305: 
                    306: 
                    307: #line 62 "/usr/include/sys/types.h"
                    308: 
                    309: typedef struct         fd_set { unsigned int fds_bits[ (128+ sizeof(int) * 8 -1)/( sizeof(int) * 8 ) ]; } fd_set;
                    310: 
                    311: 
                    312: 
                    313: 
                    314: #line 132 "/usr/include/sys/param.h"
                    315: 
                    316: 
                    317: #line 136 "/usr/include/sys/param.h"
                    318: 
                    319: llong_t        ltoL();
                    320: llong_t        Lladd();
                    321: llong_t        Luadd();
                    322: llong_t        LLadd();
                    323: 
                    324: unsigned Lshift();
                    325: #line 4 "fsck.c"
                    326: #line 1 "/usr/include/sys/filsys.h"
                    327: 
                    328: #line 4 "/usr/include/sys/filsys.h"
                    329: struct filsys
                    330: {
                    331:        unsigned short s_isize;
                    332:        daddr_t s_fsize;
                    333:        short   s_ninode;
                    334:        ino_t   s_inode[ 100 ];
                    335:        char    s_flock;
                    336:        char    s_ilock;
                    337:        char    s_fmod;
                    338:        char    s_ronly;
                    339:        time_t  s_time;
                    340:        daddr_t s_tfree;
                    341:        ino_t   s_tinode;
                    342:        short   s_dinfo[2];
                    343: 
                    344: 
                    345: 
                    346: 
                    347:        char    s_fsmnt[14];
                    348:        ino_t   s_lasti;
                    349:        ino_t   s_nbehind;
                    350:        union {
                    351:                struct {
                    352:                        short   S_nfree;
                    353:                        daddr_t S_free[ 178 ];
                    354:                } R;
                    355:                struct {
                    356:                        char    S_valid;
                    357:                        char    S_flag;
                    358: 
                    359:                        long    S_bfree[ 961 ];
                    360:                } B;
                    361:                struct {
                    362:                        char    S_valid;
                    363:                        char    S_flag;
                    364:                        long    S_bsize;
                    365:                        struct buf *    S_blk[ 961 -1];
                    366:                } N;
                    367:        } U;
                    368: };
                    369: 
                    370: 
                    371: 
                    372: 
                    373: 
                    374: 
                    375: #line 53 "/usr/include/sys/filsys.h"
                    376: 
                    377: 
                    378: 
                    379: 
                    380: 
                    381: 
                    382: 
                    383: 
                    384: #line 5 "fsck.c"
                    385: #line 1 "/usr/include/sys/dir.h"
                    386: 
                    387: 
                    388: 
                    389: struct direct
                    390: {
                    391:        ino_t   d_ino;
                    392:        char    d_name[ 14 ];
                    393: };
                    394: #line 6 "fsck.c"
                    395: #line 1 "/usr/include/sys/fblk.h"
                    396: struct fblk
                    397: {
                    398:        int     df_nfree;
                    399:        daddr_t df_free[ 178 ];
                    400: };
                    401: #line 7 "fsck.c"
                    402: #line 1 "/usr/include/sys/ino.h"
                    403: 
                    404: #line 5 "/usr/include/sys/ino.h"
                    405: struct dinode
                    406: {
                    407:        unsigned short di_mode;
                    408:        short   di_nlink;
                    409:        short   di_uid;
                    410:        short   di_gid;
                    411:        off_t   di_size;
                    412:        char    di_addr[40];
                    413:        time_t  di_atime;
                    414:        time_t  di_mtime;
                    415:        time_t  di_ctime;
                    416: };
                    417: 
                    418: #line 22 "/usr/include/sys/ino.h"
                    419: #line 8 "fsck.c"
                    420: #line 1 "/usr/include/sys/inode.h"
                    421: 
                    422: #line 11 "/usr/include/sys/inode.h"
                    423: 
                    424: 
                    425: 
                    426: struct inode
                    427: {
                    428:        short   i_flag;
                    429:        dev_t   i_dev;
                    430:        char    i_fstyp;
                    431:        unsigned short i_count;
                    432:        long    i_number;
                    433:        unsigned short i_mode;
                    434:        short   i_nlink;
                    435:        short   i_uid;
                    436:        short   i_gid;
                    437:        off_t   i_size;
                    438:        struct  inode *i_mroot;
                    439:        struct  inode *i_mpoint;
                    440:        struct  stdata *i_sptr;
                    441:        union {
                    442:                struct {
                    443:                        daddr_t I_addr[ 13 ];
                    444:                        daddr_t I_lastr;
                    445:                        struct buf *I_bufp;
                    446:                } i_f;
                    447: 
                    448: 
                    449: 
                    450:                struct {
                    451:                        daddr_t I_rdev;
                    452:                } i_d;
                    453: 
                    454:                struct {
                    455:                        long I_tag;
                    456:                        struct inode *I_cip;
                    457:                        int I_fsflags;
                    458:                        time_t I_atime;
                    459:                        time_t I_mtime;
                    460:                        time_t I_ctime;
                    461:                        dev_t I_rdev;
                    462:                } i_a;
                    463: 
                    464: 
                    465: 
                    466: 
                    467: 
                    468: 
                    469: 
                    470:                struct {
                    471:                        struct proc *I_proc;
                    472:                        int         I_sigmask;
                    473:                } i_p;
                    474: 
                    475: 
                    476:        } i_un;
                    477:        struct inode *i_hlink;
                    478: };
                    479: 
                    480: 
                    481: 
                    482: 
                    483: 
                    484: 
                    485: 
                    486: 
                    487: 
                    488: 
                    489: 
                    490: 
                    491: 
                    492: 
                    493: 
                    494: 
                    495: 
                    496: 
                    497: 
                    498: 
                    499: 
                    500: 
                    501: 
                    502: 
                    503: 
                    504: 
                    505: 
                    506: 
                    507: 
                    508: 
                    509: 
                    510: 
                    511: 
                    512: 
                    513: 
                    514: 
                    515: 
                    516: 
                    517: 
                    518: 
                    519: 
                    520: 
                    521: struct argnamei {
                    522:        short flag;
                    523:        short len;
                    524:        union {
                    525:                short   mode;
                    526:                struct inode *il;
                    527:                caddr_t buf;
                    528:        } un;
                    529: };
                    530: 
                    531: 
                    532: 
                    533: 
                    534: 
                    535: 
                    536: 
                    537: 
                    538: 
                    539: 
                    540: 
                    541: struct nx {
                    542:        struct inode *dp;
                    543:        char *cp;
                    544:        char *nbuf;
                    545:        short nlen;
                    546:        short nlink;
                    547: };
                    548: 
                    549: 
                    550: #line 140 "/usr/include/sys/inode.h"
                    551: 
                    552: 
                    553: 
                    554: 
                    555: #line 151 "/usr/include/sys/inode.h"
                    556: 
                    557: 
                    558: #line 160 "/usr/include/sys/inode.h"
                    559: 
                    560: 
                    561: #line 9 "fsck.c"
                    562: #line 1 "/usr/include/sys/stat.h"
                    563: struct stat
                    564: {
                    565:        dev_t   st_dev;
                    566:        ino_t   st_ino;
                    567:        unsigned short st_mode;
                    568:        short   st_nlink;
                    569:        short   st_uid;
                    570:        short   st_gid;
                    571:        dev_t   st_rdev;
                    572:        off_t   st_size;
                    573:        time_t  st_atime;
                    574:        time_t  st_mtime;
                    575:        time_t  st_ctime;
                    576: };
                    577: 
                    578: 
                    579: 
                    580: 
                    581: 
                    582: 
                    583: 
                    584: 
                    585: 
                    586: 
                    587: 
                    588: 
                    589: 
                    590: 
                    591: 
                    592: #line 10 "fsck.c"
                    593: #line 1 "/usr/include/fstab.h"
                    594: 
                    595: #line 7 "/usr/include/fstab.h"
                    596: 
                    597: 
                    598: #line 11 "/usr/include/fstab.h"
                    599: 
                    600: 
                    601: 
                    602: 
                    603: 
                    604: struct fstab{
                    605:        char    fs_spec[ 32 ];
                    606:        char    fs_file[ 32 ];
                    607:        int     fs_ftype;
                    608:        int     fs_flags;
                    609:        int     fs_passno;
                    610: };
                    611: 
                    612: 
                    613: #line 28 "/usr/include/fstab.h"
                    614: 
                    615: 
                    616: 
                    617: 
                    618: struct fstab *getfsent();
                    619: struct fstab *getfsspec();
                    620: struct fstab *getfsfile();
                    621: int    setfsent();
                    622: int    endfsent();
                    623: 
                    624: 
                    625: #line 41 "/usr/include/fstab.h"
                    626: 
                    627: struct mtab {
                    628:        char    file[ 32 ];
                    629:        char    spec[ 32 -1];
                    630:        char    type;
                    631: };
                    632: 
                    633: 
                    634: #line 11 "fsck.c"
                    635: #line 1 "/usr/include/pwd.h"
                    636: struct passwd {
                    637:        char    *pw_name;
                    638:        char    *pw_passwd;
                    639:        int     pw_uid;
                    640:        int     pw_gid;
                    641:        int     pw_quota;
                    642:        char    *pw_comment;
                    643:        char    *pw_gecos;
                    644:        char    *pw_dir;
                    645:        char    *pw_shell;
                    646: };
                    647: extern struct passwd *getpwent();
                    648: extern struct passwd *getpwuid();
                    649: extern struct passwd *getpwnam();
                    650: extern struct passwd *pwdecode();
                    651: #line 12 "fsck.c"
                    652: 
                    653: 
                    654: 
                    655: 
                    656: 
                    657: 
                    658: 
                    659: 
                    660: 
                    661: 
                    662: 
                    663: 
                    664: 
                    665: 
                    666: 
                    667: 
                    668: 
                    669: 
                    670: 
                    671: 
                    672: 
                    673: 
                    674: 
                    675: 
                    676: 
                    677: 
                    678: 
                    679: 
                    680: 
                    681: typedef struct dinode  DINODE;
                    682: typedef struct direct  DIRECT;
                    683: 
                    684: 
                    685: 
                    686: 
                    687: 
                    688: 
                    689: 
                    690: 
                    691: 
                    692: 
                    693: 
                    694: 
                    695: 
                    696: daddr_t        startib;
                    697: unsigned niblk;
                    698: 
                    699: struct bufarea {
                    700:        struct bufarea  *b_next;
                    701:        daddr_t b_bno;
                    702:        union {
                    703:                char    b_buf[ ( (( 64 ) & 64) ? 4096: 1024) ];
                    704:                short   b_lnks[ ( ( (( 64 ) & 64) ? 4096: 1024) /sizeof(short)) ];
                    705:                daddr_t b_indir[ ( ( (( 64 ) & 64) ? 4096: 1024) /sizeof(daddr_t)) ];
                    706:                struct filsys b_fs;
                    707:                struct fblk b_fb;
                    708:                struct dinode b_dinode[ ( (( 64 ) & 64) ? 64: 16) ];
                    709:                DIRECT b_dir[ ( ( (( 64 ) & 64) ? 4096: 1024) /sizeof(struct direct)) ];
                    710:        } b_un;
                    711:        char    b_dirty;
                    712: };
                    713: 
                    714: typedef struct bufarea BUFAREA;
                    715: 
                    716: BUFAREA        inoblk;
                    717: BUFAREA        fileblk;
                    718: BUFAREA        sblk;
                    719: BUFAREA        *poolhead;
                    720: 
                    721: 
                    722: 
                    723: 
                    724: 
                    725: 
                    726: 
                    727: 
                    728: 
                    729: 
                    730: 
                    731: struct filecntl {
                    732:        int     rfdes;
                    733:        int     wfdes;
                    734:        int     mod;
                    735: };
                    736: 
                    737: struct filecntl        dfile;
                    738: struct filecntl        sfile;
                    739: 
                    740: typedef unsigned MEMSIZE;
                    741: 
                    742: MEMSIZE        memsize;
                    743: 
                    744: 
                    745: 
                    746: 
                    747: 
                    748: 
                    749: 
                    750: 
                    751: daddr_t        duplist[ 100 ];
                    752: daddr_t        *enddup;
                    753: daddr_t        *muldup;
                    754: 
                    755: 
                    756: ino_t  badlncnt[ 500 ];
                    757: ino_t  *badlnp;
                    758: 
                    759: char   sflag;
                    760: char   csflag;
                    761: char   nflag;
                    762: char   yflag;
                    763: char   tflag;
                    764: char   preen;
                    765: char   rplyflag;
                    766: char   hotroot;
                    767: char   rawflg;
                    768: char   rmscr;
                    769: char   fixfree;
                    770: char   *membase;
                    771: char   *blkmap;
                    772: char   *freemap;
                    773: char   *statemap;
                    774: char   *pathp;
                    775: char   *thisname;
                    776: char   *srchname;
                    777: char   pathname[200];
                    778: char   scrfile[80];
                    779: char   *lfname =       "lost+found";
                    780: char   *checklist = "/etc/fstab" ;
                    781: char   big;
                    782: 
                    783: short  *lncntp;
                    784: 
                    785: int    cylsize;
                    786: int    stepsize;
                    787: int    badblk;
                    788: int    dupblk;
                    789: int    (*pfunc)();
                    790: int    zcleared;
                    791: 
                    792: ino_t  inum;
                    793: ino_t  imax;
                    794: ino_t  parentdir;
                    795: ino_t  lastino;
                    796: ino_t  lfdir;
                    797: ino_t  orphan;
                    798: 
                    799: off_t  filsize;
                    800: off_t  maxblk;
                    801: off_t  bmapsz;
                    802: 
                    803: daddr_t        smapblk;
                    804: daddr_t        lncntblk;
                    805: daddr_t        fmapblk;
                    806: daddr_t        n_free;
                    807: daddr_t        n_blks;
                    808: daddr_t        n_files;
                    809: daddr_t        fmin;
                    810: daddr_t        fmax;
                    811: 
                    812: 
                    813: 
                    814: 
                    815: 
                    816: 
                    817: 
                    818: 
                    819: 
                    820: 
                    821: 
                    822: 
                    823: 
                    824: 
                    825: 
                    826: 
                    827: 
                    828: 
                    829: 
                    830: 
                    831: 
                    832: 
                    833: 
                    834: 
                    835: 
                    836: 
                    837: 
                    838: 
                    839: int    (*signal())();
                    840: long   lseek();
                    841: long   time();
                    842: DINODE *ginode();
                    843: BUFAREA        *getblk();
                    844: BUFAREA        *search();
                    845: int    dirscan();
                    846: int    findino();
                    847: int    catch();
                    848: int    mkentry();
                    849: int    chgdd();
                    850: int    pass1();
                    851: int    pass1b();
                    852: int    pass2();
                    853: int    pass3();
                    854: int    pass4();
                    855: int    pass5();
                    856: 
                    857: char   *devname;
                    858: 
                    859: main(argc,argv)
                    860: int    argc;
                    861: char   *argv[];
                    862: {
                    863:        register struct _iobuf *fp;
                    864:        register n;
                    865:        register char *p;
                    866:        char filename[50];
                    867:        char *sbrk();
                    868: 
                    869:        setbuf( (&_iob[1]) , 0 );
                    870:        sync();
                    871:        while(--argc > 0 && **++argv == '-') {
                    872:                switch(*++*argv) {
                    873:                        case 'p':
                    874:                                preen++;
                    875:                                break;
                    876:                        case 't':
                    877:                        case 'T':
                    878:                                tflag++;
                    879:                                if(**++argv == '-' || --argc <= 0)
                    880:                                        errexit("Bad -t option\n");
                    881:                                p = scrfile;
                    882:                                while(*p++ = **argv)
                    883:                                        (*argv)++;
                    884:                                break;
                    885:                        case 's':
                    886:                                stype(++*argv);
                    887:                                sflag++;
                    888:                                break;
                    889:                        case 'S':
                    890:                                stype(++*argv);
                    891:                                csflag++;
                    892:                                break;
                    893:                        case 'n':
                    894:                        case 'N':
                    895:                                nflag++;
                    896:                                yflag = 0;
                    897:                                break;
                    898:                        case 'y':
                    899:                        case 'Y':
                    900:                                yflag++;
                    901:                                nflag = 0;
                    902:                                break;
                    903:                        default:
                    904:                                errexit("%c option?\n",**argv);
                    905:                }
                    906:        }
                    907:        if(nflag && (sflag || csflag))
                    908:                errexit("Incompatible options: -n and -%s\n",sflag?"s":"S");
                    909:        if(sflag && csflag)
                    910:                sflag = 0;
                    911:        memsize = (MEMSIZE)sbrk(0);
                    912:        memsize = MAXDATA - memsize - sizeof(int);
                    913:        while(memsize >= 2*sizeof(BUFAREA) &&
                    914:                (membase = sbrk(memsize)) == (char *)-1)
                    915:                memsize -= 1024;
                    916:        if(memsize < 2*sizeof(BUFAREA))
                    917:                errexit("Can't get memory\n");
                    918:        if (signal( 2 , (SIG_TYP)1 ) != (SIG_TYP)1 )
                    919:                signal( 2 , catch);
                    920:        if(argc) {
                    921:                while(argc-- > 0){
                    922:                        hotroot = 0;
                    923:                        check(*argv++);
                    924:                }
                    925:        }
                    926:        else {
                    927:                struct fstab *fsp;
                    928:                int pid, passno, anygtr, sumstatus = 0;
                    929:                passno = 1;
                    930:                do {
                    931:                        anygtr = 0;
                    932:                        if (setfsent() == 0)
                    933:                                errexit("Can't open checklist file: %s\n",
                    934:  "/etc/fstab" );
                    935:                        while ( (fsp = getfsent()) != 0){
                    936:                                if (fsp->fs_ftype != 0)
                    937:                                        continue;
                    938:                                if (preen == 0 ||
                    939:                                    passno == 1 && fsp->fs_passno == passno) {
                    940:                                        if (blockcheck(fsp->fs_spec) == 0 &&
                    941:                                            preen)
                    942:                                                exit(8);
                    943:                                } else if (fsp->fs_passno > passno)
                    944:                                        anygtr = 1;
                    945:                                else if (fsp->fs_passno == passno) {
                    946:                                        pid = fork();
                    947:                                        if (pid < 0) {
                    948:                                                perror("fork");
                    949:                                                exit(8);
                    950:                                        }
                    951:                                        if (pid == 0)
                    952:                                                if (blockcheck(fsp->fs_spec)== 0 )
                    953:                                                        exit(8);
                    954:                                                else
                    955:                                                        exit(0);
                    956:                                }
                    957:                        }
                    958:                        if (preen) {
                    959:                                int status;
                    960:                                while (wait(&status) != -1)
                    961:                                        sumstatus |= status;
                    962:                        }
                    963:                        passno++;
                    964:                } while (anygtr);
                    965:                if (sumstatus)
                    966:                        exit(8);
                    967:                endfsent();
                    968:        }
                    969:        exit(0);
                    970: }
                    971: 
                    972: char *rawname(), *strrchr(), *unrawname();
                    973: 
                    974: blockcheck(name)
                    975:        char    *name;
                    976: {
                    977:        struct  stat    stat_slash, stat_block, stat_char;
                    978:        char    *raw;
                    979:        int     looped = 0;
                    980: 
                    981:        hotroot = 0;
                    982:        if (stat("/", &stat_slash) < 0){
                    983:                error("Can't stat root\n");
                    984:                return( 0 );
                    985:        }
                    986:   retry:
                    987:        if (stat(name, &stat_block) < 0){
                    988:                error("Can't stat %s\n", name);
                    989:                return( 0 );
                    990:        }
                    991:        big = 0 ;
                    992:        if (stat_block.st_mode & 0060000 ){
                    993:                if( (( stat_block.st_rdev ) & 64) )
                    994:                        big = 64 ;
                    995:                raw = rawname(name);
                    996:                if (stat(raw, &stat_char) < 0){
                    997:                        error("Can't stat %s\n", raw);
                    998:                        return( 0 );
                    999:                }
                   1000:                if (stat_char.st_mode & 0020000 ){
                   1001:                        if (stat_slash.st_dev == stat_block.st_rdev) {
                   1002:                                hotroot++;
                   1003:                                raw = unrawname(name);
                   1004:                        }
                   1005:                        check(raw);
                   1006:                        return( 1 );
                   1007:                } else if(big == 64 ) {
                   1008:                        check(name);
                   1009:                        return( 1 );
                   1010:                } else {
                   1011:                        error("%s is not a character device\n", raw);
                   1012:                        return( 0 );
                   1013:                }
                   1014:        } else
                   1015:        if (stat_block.st_mode & 0020000 ){
                   1016:                if (looped) {
                   1017:                        error("Can't make sense out of name %s\n", name);
                   1018:                        return( 0 );
                   1019:                }
                   1020:                name = unrawname(name);
                   1021:                looped++;
                   1022:                goto retry;
                   1023:        }
                   1024:        error("Can't make sense out of name %s\n", name);
                   1025:        return( 0 );
                   1026: }
                   1027: 
                   1028: char *
                   1029: unrawname(cp)
                   1030:        char    *cp;
                   1031: {
                   1032:        char    *dp = strrchr(cp, '/');
                   1033:        struct stat stb;
                   1034:        if (dp == 0)
                   1035:                return(cp);
                   1036:        if (stat(cp, &stb) < 0)
                   1037:                return(cp);
                   1038:        if ((stb.st_mode& 0170000 ) != 0020000 )
                   1039:                return(cp);
                   1040:        if (*(dp+1) != 'r')
                   1041:                return(cp);
                   1042:        strcpy(dp+1, dp+2);
                   1043:        return(cp);
                   1044: }
                   1045: 
                   1046: char *
                   1047: rawname(cp)
                   1048:        char *cp;
                   1049: {
                   1050:        static char rawbuf[32];
                   1051:        char *dp = strrchr(cp, '/');
                   1052: 
                   1053:        if (dp == 0)
                   1054:                return (0);
                   1055:        if(big == 64 )
                   1056:                return(cp);
                   1057:        *dp = 0;
                   1058:        strcpy(rawbuf, cp);
                   1059:        *dp = '/';
                   1060:        strcat(rawbuf, "/r");
                   1061:        strcat(rawbuf, dp+1);
                   1062:        return (rawbuf);
                   1063: }
                   1064: 
                   1065: check(dev)
                   1066: char *dev;
                   1067: {
                   1068: 
                   1069:        devname = dev;
                   1070:        check1(dev);
                   1071:        devname = 0;
                   1072: }
                   1073: 
                   1074: check1(dev)
                   1075: char *dev;
                   1076: {
                   1077:        register DINODE *dp;
                   1078:        register n;
                   1079:        register ino_t *blp;
                   1080:        ino_t savino;
                   1081:        daddr_t blk;
                   1082:        BUFAREA *bp1, *bp2;
                   1083: 
                   1084:        if(setup(dev) == 0 )
                   1085:                return;
                   1086:        if (preen==0) {
                   1087:                printf("** Checking %s\n", dev);
                   1088:                printf("** Phase 1 - Check Blocks and Sizes\n");
                   1089:        }
                   1090:        pfunc = pass1;
                   1091:        for(inum = 1; inum <= imax; inum++) {
                   1092:                if((dp = ginode()) == 0 )
                   1093:                        continue;
                   1094:                if( ((dp->di_mode & 0170000 ) != 0) ) {
                   1095:                        lastino = inum;
                   1096:                        if(ftypeok(dp) == 0 ) {
                   1097:                                pfatal("UNKNOWN FILE TYPE I=%u",inum);
                   1098:                                if(reply("CLEAR") == 1 ) {
                   1099:  clear((char *)( dp ),sizeof(DINODE)) ;
                   1100:  inoblk.b_dirty = 1 ;
                   1101:                                }
                   1102:                                continue;
                   1103:                        }
                   1104:                        n_files++;
                   1105:                        if( dolncnt( dp->di_nlink ,0) <= 0) {
                   1106:                                if(badlnp < &badlncnt[ 500 ])
                   1107:                                        *badlnp++ = inum;
                   1108:                                else {
                   1109:                                        pfatal("LINK COUNT TABLE OVERFLOW");
                   1110:                                        if(reply("CONTINUE") == 0 )
                   1111:                                                errexit("");
                   1112:                                }
                   1113:                        }
                   1114:  dostate( ((dp->di_mode & 0170000 ) == 0040000 ) ? 02 : 01 ,0) ;
                   1115:                        badblk = dupblk = 0;
                   1116:                        filsize = 0;
                   1117:                        maxblk = 0;
                   1118:                        ckinode(dp, 0 );
                   1119:                        if((n = dostate(0,1) ) == 02 || n == 01 )
                   1120:                                sizechk(dp);
                   1121:                }
                   1122:                else if(dp->di_mode != 0) {
                   1123:                        pfatal("PARTIALLY ALLOCATED INODE I=%u",inum);
                   1124:                        if(reply("CLEAR") == 1 ) {
                   1125:  clear((char *)( dp ),sizeof(DINODE)) ;
                   1126:  inoblk.b_dirty = 1 ;
                   1127:                        }
                   1128:                }
                   1129:        }
                   1130: 
                   1131: 
                   1132:        if(enddup != &duplist[0]) {
                   1133:                if (preen)
                   1134:                        pfatal("INTERNAL ERROR: dups with -p");
                   1135:                printf("** Phase 1b - Rescan For More DUPS\n");
                   1136:                pfunc = pass1b;
                   1137:                for(inum = 1; inum <= lastino; inum++) {
                   1138:                        if( dostate(0,1) != 0 && (dp = ginode()) != 0 )
                   1139:                                if(ckinode(dp, 0 ) & 01 )
                   1140:                                        break;
                   1141:                }
                   1142:        }
                   1143:        if(rawflg) {
                   1144:                if(inoblk.b_dirty)
                   1145:                        bwrite(&dfile,membase,startib,(int)niblk* ( (( big ) & 64) ? 4096: 1024) );
                   1146:                inoblk.b_dirty = 0;
                   1147:                if(poolhead) {
                   1148:                        clear(membase,niblk* ( (( 64 ) & 64) ? 4096: 1024) );
                   1149:                        for(bp1 = poolhead;bp1->b_next;bp1 = bp1->b_next);
                   1150:                        bp2 = &((BUFAREA *)membase)[(niblk* ( (( 64 ) & 64) ? 4096: 1024) )/sizeof(BUFAREA)];
                   1151:                        while(--bp2 >= (BUFAREA *)membase) {
                   1152:  ( bp2 )->b_dirty = 0;( bp2 )->b_bno = (daddr_t)-1 ;
                   1153:                                bp2->b_next = bp1->b_next;
                   1154:                                bp1->b_next = bp2;
                   1155:                        }
                   1156:                }
                   1157:                rawflg = 0;
                   1158: 
                   1159:        }
                   1160: 
                   1161: 
                   1162:        if (preen == 0)
                   1163:                printf("** Phase 2 - Check Pathnames\n");
                   1164:        inum = ((ino_t)2) ;
                   1165:        thisname = pathp = pathname;
                   1166:        pfunc = pass2;
                   1167:        switch( dostate(0,1) ) {
                   1168:                case 0 :
                   1169:                        errexit("ROOT INODE UNALLOCATED. TERMINATING.\n");
                   1170:                case 01 :
                   1171:                        pfatal("ROOT INODE NOT DIRECTORY");
                   1172:                        if(reply("FIX") == 0 || (dp = ginode()) == 0 )
                   1173:                                errexit("");
                   1174:                        dp->di_mode &= ~ 0170000 ;
                   1175:                        dp->di_mode |= 0040000 ;
                   1176:  inoblk.b_dirty = 1 ;
                   1177:  dostate( 02 ,0) ;
                   1178:                case 02 :
                   1179:                        descend();
                   1180:                        break;
                   1181:                case 03 :
                   1182:                        pfatal("DUPS/BAD IN ROOT INODE");
                   1183:                        printf("\n");
                   1184:                        if(reply("CONTINUE") == 0 )
                   1185:                                errexit("");
                   1186:  dostate( 02 ,0) ;
                   1187:                        descend();
                   1188:        }
                   1189: 
                   1190: 
                   1191:        if (preen == 0)
                   1192:                printf("** Phase 3 - Check Connectivity\n");
                   1193:        for(inum = 1; inum <= lastino; inum++) {
                   1194:                if( dostate(0,1) == 02 ) {
                   1195:                        pfunc = findino;
                   1196:                        srchname = "..";
                   1197:                        savino = inum;
                   1198:                        do {
                   1199:                                orphan = inum;
                   1200:                                if((dp = ginode()) == 0 )
                   1201:                                        break;
                   1202:                                filsize = dp->di_size;
                   1203:                                parentdir = 0;
                   1204:                                ckinode(dp, 1 );
                   1205:                                if((inum = parentdir) == 0)
                   1206:                                        break;
                   1207:                        } while( dostate(0,1) == 02 );
                   1208:                        inum = orphan;
                   1209:                        if(linkup() == 1 ) {
                   1210:                                thisname = pathp = pathname;
                   1211:                                *pathp++ = '?';
                   1212:                                pfunc = pass2;
                   1213:                                descend();
                   1214:                        }
                   1215:                        inum = savino;
                   1216:                }
                   1217:        }
                   1218: 
                   1219: 
                   1220:        if (preen == 0)
                   1221:                printf("** Phase 4 - Check Reference Counts\n");
                   1222:        pfunc = pass4;
                   1223:        zcleared = 0;
                   1224:        for(inum = 1; inum <= lastino; inum++) {
                   1225:                switch( dostate(0,1) ) {
                   1226:                        case 01 :
                   1227:                                if(n = dolncnt(0,1) )
                   1228:                                        adjust((short)n);
                   1229:                                else {
                   1230:                                        for(blp = badlncnt;blp < badlnp; blp++)
                   1231:                                                if(*blp == inum) {
                   1232:                                                        clri("UNREF",preen? 0 : 1 , 1 );
                   1233:                                                        break;
                   1234:                                                }
                   1235:                                }
                   1236:                                break;
                   1237:                        case 02 :
                   1238:                                clri("UNREF", 1 , 0 );
                   1239:                                break;
                   1240:                        case 03 :
                   1241:                                clri("BAD/DUP", 1 , 0 );
                   1242:                }
                   1243:        }
                   1244:        if (zcleared)
                   1245:                pwarn("%u LINKLESS FILES CLEARED\n", zcleared);
                   1246:        if(imax - n_files != sblk.b_un.b_fs .s_tinode) {
                   1247:                pwarn("FREE INODE COUNT %u SHOULD BE %u IN SUPERBLK",
                   1248:  sblk.b_un.b_fs .s_tinode, imax - n_files);
                   1249:                if (preen)
                   1250:                        printf(" (FIXED)\n");
                   1251:                if (preen || reply("FIX") == 1 ) {
                   1252:  sblk.b_un.b_fs .s_tinode = imax - n_files;
                   1253:  sblk.b_dirty = 1 ;
                   1254:                }
                   1255:        }
                   1256:        flush(&dfile,&fileblk);
                   1257: 
                   1258:        if (preen == 0)
                   1259:                printf("** Phase 5 - Check Free List ");
                   1260:        if(sflag || (csflag && rplyflag == 0)) {
                   1261:                if (preen == 0)
                   1262:                        printf("(Ignored)\n");
                   1263:                fixfree = 1;
                   1264:        }
                   1265:        else {
                   1266:                if (preen == 0)
                   1267:                        printf("\n");
                   1268:                if(freemap)
                   1269:                        copy(blkmap,freemap,(MEMSIZE)bmapsz);
                   1270:                else {
                   1271:                        for(blk = 0; blk < fmapblk; blk++) {
                   1272:                                bp1 = getblk((BUFAREA *) 0 ,blk);
                   1273:                                bp2 = getblk((BUFAREA *) 0 ,blk+fmapblk);
                   1274:                                copy(bp1->b_un.b_buf,bp2->b_un.b_buf, ( (( big ) & 64) ? 4096: 1024) );
                   1275:  ( bp2 )->b_dirty = 1 ;
                   1276:                        }
                   1277:                }
                   1278:                badblk = dupblk = 0;
                   1279:                if(big == 0 ) {
                   1280:  fileblk.b_un.b_fb .df_nfree = sblk.b_un.b_fs . U.R.S_nfree ;
                   1281:                        for(n = 0; n < 178 ; n++)
                   1282:  fileblk.b_un.b_fb .df_free[n] = sblk.b_un.b_fs . U.R.S_free [n];
                   1283:                }
                   1284:                freechk();
                   1285:                if(badblk) {
                   1286:                        pfatal("%d BAD BLKS IN FREE LIST",badblk);
                   1287:                        printf("\n");
                   1288:                }
                   1289:                if(dupblk)
                   1290:                        pwarn("%d DUP BLKS IN FREE LIST\n",dupblk);
                   1291:                if(fixfree == 0) {
                   1292:                        if((n_blks+n_free) != (fmax-fmin)) {
                   1293:                                pwarn("%ld BLK(S) MISSING\n",
                   1294:                                        fmax-fmin-n_blks-n_free);
                   1295:                                fixfree = 1;
                   1296:                        }
                   1297:                        else if(big == 0 && n_free != sblk.b_un.b_fs .s_tfree) {
                   1298:                                pwarn("FREE BLK COUNT WRONG IN SUPERBLK");
                   1299:                                if (preen)
                   1300:                                        printf(" (FIXED)\n");
                   1301:                                if(preen || reply("FIX") == 1 ) {
                   1302:  sblk.b_un.b_fs .s_tfree = n_free;
                   1303:  sblk.b_dirty = 1 ;
                   1304:                                }
                   1305:                        }
                   1306:                }
                   1307:                if(fixfree) {
                   1308:                        pwarn("BAD FREE LIST");
                   1309:                        if (preen)
                   1310:                                printf(" (SALVAGED)\n");
                   1311:                        else if(reply("SALVAGE") == 0 )
                   1312:                                fixfree = 0;
                   1313:                }
                   1314:        }
                   1315: 
                   1316:        if(fixfree) {
                   1317:                if (preen == 0)
                   1318:                        printf("** Phase 6 - Salvage Free List\n");
                   1319:                makefree();
                   1320:                n_free = sblk.b_un.b_fs .s_tfree;
                   1321:        }
                   1322: 
                   1323:        pwarn("%ld files %ld blocks %ld free\n", n_files,n_blks,n_free);
                   1324:        if(dfile.mod) {
                   1325:                time(& sblk.b_un.b_fs .s_time);
                   1326:  sblk.b_dirty = 1 ;
                   1327:        }
                   1328:        ckfini();
                   1329:        sync();
                   1330:        if(dfile.mod && hotroot) {
                   1331:                printf("ROOT MODIFIED\n");
                   1332:        }
                   1333:        if(dfile.mod && preen == 0)
                   1334:                printf("\n***** FILE SYSTEM WAS MODIFIED *****\n");
                   1335: }
                   1336: 
                   1337: 
                   1338: error(s1,s2,s3,s4)
                   1339: char *s1;
                   1340: {
                   1341:        printf(s1,s2,s3,s4);
                   1342: }
                   1343: 
                   1344: 
                   1345: errexit(s1,s2,s3,s4)
                   1346: char *s1;
                   1347: {
                   1348:        error(s1,s2,s3,s4);
                   1349:        exit(8);
                   1350: }
                   1351: 
                   1352: 
                   1353: #line 718 "fsck.c"
                   1354: pfatal(s,a1,a2,a3)
                   1355: {
                   1356: 
                   1357:        if (preen) {
                   1358:                printf("%s: ", devname);
                   1359:                printf(s, a1, a2, a3);
                   1360:                printf("\n");
                   1361:                preendie();
                   1362:        }
                   1363:        printf(s, a1, a2, a3);
                   1364: }
                   1365: 
                   1366: 
                   1367: #line 734 "fsck.c"
                   1368: preendie()
                   1369: {
                   1370: 
                   1371:        printf("%s: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.\n", devname);
                   1372:        exit(8);
                   1373: }
                   1374: 
                   1375: 
                   1376: #line 745 "fsck.c"
                   1377: pwarn(s,a1,a2,a3,a4,a5,a6)
                   1378: {
                   1379: 
                   1380:        if (preen)
                   1381:                printf("%s: ", devname);
                   1382:        printf(s, a1, a2, a3, a4, a5, a6);
                   1383: }
                   1384: 
                   1385: ckinode(dp,flg)
                   1386: DINODE *dp;
                   1387: register flg;
                   1388: {
                   1389:        register daddr_t *ap;
                   1390:        register ret;
                   1391:        int (*func)(), n;
                   1392:        daddr_t iaddrs[ 13 ];
                   1393: 
                   1394:        if( ( ((dp->di_mode & 0170000 ) == 0060000 ) || ((dp->di_mode & 0170000 ) == 0020000 ) ) )
                   1395:                return( 04 );
                   1396:        l3tol(iaddrs,dp->di_addr, 13 );
                   1397:        func = (flg == 0 ) ? pfunc : dirscan;
                   1398:        for(ap = iaddrs; ap < &iaddrs[ 13 -3]; ap++) {
                   1399:                if(*ap && (ret = (*func)(*ap)) & 01 )
                   1400:                        return(ret);
                   1401:        }
                   1402:        for(n = 1; n < 4; n++) {
                   1403:                if(*ap && (ret = iblock(*ap,n,flg)) & 01 )
                   1404:                        return(ret);
                   1405:                ap++;
                   1406:        }
                   1407:        return( 04 );
                   1408: }
                   1409: 
                   1410: 
                   1411: iblock(blk,ilevel,flg)
                   1412: daddr_t blk;
                   1413: register ilevel;
                   1414: {
                   1415:        register daddr_t *ap;
                   1416:        register n;
                   1417:        int (*func)();
                   1418:        BUFAREA ib;
                   1419: 
                   1420:        if(flg == 0 ) {
                   1421:                func = pfunc;
                   1422:                if(((n = (*func)(blk)) & 04 ) == 0)
                   1423:                        return(n);
                   1424:        }
                   1425:        else
                   1426:                func = dirscan;
                   1427:        if( ( blk < fmin || blk >= fmax) )
                   1428:                return( 02 );
                   1429:  ( &ib )->b_dirty = 0;( &ib )->b_bno = (daddr_t)-1 ;
                   1430:        if(getblk(&ib,blk) == 0 )
                   1431:                return( 02 );
                   1432:        ilevel--;
                   1433:        for(ap = ib.b_un.b_indir; ap < &ib.b_un.b_indir[ ( ( (( big ) & 64) ? 4096: 1024) /sizeof(daddr_t)) ]; ap++) {
                   1434:                if(*ap) {
                   1435:                        if(ilevel > 0) {
                   1436:                                n = iblock(*ap,ilevel,flg);
                   1437:                        }
                   1438:                        else
                   1439:                                n = (*func)(*ap);
                   1440:                        if(n & 01 )
                   1441:                                return(n);
                   1442:                }
                   1443:        }
                   1444:        return( 04 );
                   1445: }
                   1446: 
                   1447: 
                   1448: pass1(blk)
                   1449: daddr_t blk;
                   1450: {
                   1451:        register daddr_t *dlp;
                   1452: 
                   1453:        if( ( blk < fmin || blk >= fmax) ) {
                   1454:                blkerr("BAD",blk);
                   1455:                if(++badblk >= 10 ) {
                   1456:                        printf("EXCESSIVE BAD BLKS I=%u",inum);
                   1457:                        if(reply("CONTINUE") == 0 )
                   1458:                                errexit("");
                   1459:                        return( 01 );
                   1460:                }
                   1461:                return( 02 );
                   1462:        }
                   1463:        if( domap( blk ,1) ) {
                   1464:                blkerr("DUP",blk);
                   1465:                if(++dupblk >= 10 ) {
                   1466:                        printf("EXCESSIVE DUP BLKS I=%u",inum);
                   1467:                        if(reply("CONTINUE") == 0 )
                   1468:                                errexit("");
                   1469:                        return( 01 );
                   1470:                }
                   1471:                if(enddup >= &duplist[ 100 ]) {
                   1472:                        printf("DUP TABLE OVERFLOW.");
                   1473:                        if(reply("CONTINUE") == 0 )
                   1474:                                errexit("");
                   1475:                        return( 01 );
                   1476:                }
                   1477:                for(dlp = duplist; dlp < muldup; dlp++) {
                   1478:                        if(*dlp == blk) {
                   1479:                                *enddup++ = blk;
                   1480:                                break;
                   1481:                        }
                   1482:                }
                   1483:                if(dlp >= muldup) {
                   1484:                        *enddup++ = *muldup;
                   1485:                        *muldup++ = blk;
                   1486:                }
                   1487:        }
                   1488:        else {
                   1489:                n_blks++;
                   1490:  domap( blk ,0) ;
                   1491:        }
                   1492:        filsize++;
                   1493:        return( 04 );
                   1494: }
                   1495: 
                   1496: 
                   1497: pass1b(blk)
                   1498: daddr_t blk;
                   1499: {
                   1500:        register daddr_t *dlp;
                   1501: 
                   1502:        if( ( blk < fmin || blk >= fmax) )
                   1503:                return( 02 );
                   1504:        for(dlp = duplist; dlp < muldup; dlp++) {
                   1505:                if(*dlp == blk) {
                   1506:                        blkerr("DUP",blk);
                   1507:                        *dlp = *--muldup;
                   1508:                        *muldup = blk;
                   1509:                        return(muldup == duplist ? 01 : 04 );
                   1510:                }
                   1511:        }
                   1512:        return( 04 );
                   1513: }
                   1514: 
                   1515: 
                   1516: pass2(dirp)
                   1517: register DIRECT *dirp;
                   1518: {
                   1519:        register char *p;
                   1520:        register n;
                   1521:        DINODE *dp;
                   1522: 
                   1523:        if((inum = dirp->d_ino) == 0)
                   1524:                return( 04 );
                   1525:        thisname = pathp;
                   1526:        for(p = dirp->d_name; p < &dirp->d_name[ 14 ]; )
                   1527:                if((*pathp++ = *p++) == 0) {
                   1528:                        --pathp;
                   1529:                        break;
                   1530:                }
                   1531:        *pathp = 0;
                   1532:        n = 0 ;
                   1533:        if(inum > imax || inum <= 0)
                   1534:                n = direrr("I OUT OF RANGE");
                   1535:        else {
                   1536:        again:
                   1537:                switch( dostate(0,1) ) {
                   1538:                        case 0 :
                   1539:                                n = direrr("UNALLOCATED");
                   1540:                                break;
                   1541:                        case 03 :
                   1542:                                if((n = direrr("DUP/BAD")) == 1 )
                   1543:                                        break;
                   1544:                                if((dp = ginode()) == 0 )
                   1545:                                        break;
                   1546:  dostate( ((dp->di_mode & 0170000 ) == 0040000 ) ? 02 : 01 ,0) ;
                   1547:                                goto again;
                   1548:                        case 01 :
                   1549:  dolncnt(0,2) ;
                   1550:                                break;
                   1551:                        case 02 :
                   1552:  dolncnt(0,2) ;
                   1553:                                descend();
                   1554:                }
                   1555:        }
                   1556:        pathp = thisname;
                   1557:        if(n == 0 )
                   1558:                return( 04 );
                   1559:        dirp->d_ino = 0;
                   1560:        return( 04 | 010 );
                   1561: }
                   1562: 
                   1563: 
                   1564: pass4(blk)
                   1565: daddr_t blk;
                   1566: {
                   1567:        register daddr_t *dlp;
                   1568: 
                   1569:        if( ( blk < fmin || blk >= fmax) )
                   1570:                return( 02 );
                   1571:        if( domap( blk ,1) ) {
                   1572:                for(dlp = duplist; dlp < enddup; dlp++)
                   1573:                        if(*dlp == blk) {
                   1574:                                *dlp = *--enddup;
                   1575:                                return( 04 );
                   1576:                        }
                   1577:  domap( blk ,2) ;
                   1578:                n_blks--;
                   1579:        }
                   1580:        return( 04 );
                   1581: }
                   1582: 
                   1583: 
                   1584: pass5(blk)
                   1585: daddr_t blk;
                   1586: {
                   1587:        if( ( blk < fmin || blk >= fmax) ) {
                   1588:                fixfree = 1;
                   1589:                if (preen)
                   1590:                        pfatal("BAD BLOCKS IN FREE LIST.");
                   1591:                if(++badblk >= 10 ) {
                   1592:                        printf("EXCESSIVE BAD BLKS IN FREE LIST.");
                   1593:                        if(reply("CONTINUE") == 0 )
                   1594:                                errexit("");
                   1595:                        return( 01 );
                   1596:                }
                   1597:                return( 02 );
                   1598:        }
                   1599:        if( domap( blk ,1+4) ) {
                   1600:                fixfree = 1;
                   1601:                if(++dupblk >= 100 ) {
                   1602:                        printf("EXCESSIVE DUP BLKS IN FREE LIST.");
                   1603:                        if(reply("CONTINUE") == 0 )
                   1604:                                errexit("");
                   1605:                        return( 01 );
                   1606:                }
                   1607:        }
                   1608:        else {
                   1609:                n_free++;
                   1610:  domap( blk ,0+4) ;
                   1611:        }
                   1612:        return( 04 );
                   1613: }
                   1614: 
                   1615: 
                   1616: blkerr(s,blk)
                   1617: daddr_t blk;
                   1618: char *s;
                   1619: {
                   1620:        pfatal("%ld %s I=%u",blk,s,inum);
                   1621:        printf("\n");
                   1622:  dostate( 03 ,0) ;
                   1623: }
                   1624: 
                   1625: 
                   1626: descend()
                   1627: {
                   1628:        register DINODE *dp;
                   1629:        register char *savname;
                   1630:        off_t savsize;
                   1631: 
                   1632:  dostate( 01 ,0) ;
                   1633:        if((dp = ginode()) == 0 )
                   1634:                return;
                   1635:        savname = thisname;
                   1636:        *pathp++ = '/';
                   1637:        savsize = filsize;
                   1638:        filsize = dp->di_size;
                   1639:        ckinode(dp, 1 );
                   1640:        thisname = savname;
                   1641:        *--pathp = 0;
                   1642:        filsize = savsize;
                   1643: }
                   1644: 
                   1645: 
                   1646: dirscan(blk)
                   1647: daddr_t blk;
                   1648: {
                   1649:        register DIRECT *dirp;
                   1650:        register char *p1, *p2;
                   1651:        register n;
                   1652:        DIRECT direntry;
                   1653: 
                   1654:        if( ( blk < fmin || blk >= fmax) ) {
                   1655:                filsize -= ( (( big ) & 64) ? 4096: 1024) ;
                   1656:                return( 02 );
                   1657:        }
                   1658:        for(dirp = fileblk.b_un .b_dir; dirp < & fileblk.b_un .b_dir[ ( ( (( big ) & 64) ? 4096: 1024) /sizeof(struct direct)) ] &&
                   1659:                filsize > 0; dirp++, filsize -= sizeof(DIRECT)) {
                   1660:                if(getblk(&fileblk,blk) == 0 ) {
                   1661:                        filsize -= (& fileblk.b_un .b_dir[ ( ( (( big ) & 64) ? 4096: 1024) /sizeof(struct direct)) ]-dirp)*
                   1662:                                sizeof(DIRECT);
                   1663:                        return( 02 );
                   1664:                }
                   1665:                p1 = &dirp->d_name[ 14 ];
                   1666:                p2 = &direntry.d_name[ 14 ];
                   1667:                while(p1 > (char *)dirp)
                   1668:                        *--p2 = *--p1;
                   1669:                if((n = (*pfunc)(&direntry)) & 010 ) {
                   1670:                        if(getblk(&fileblk,blk) != 0 ) {
                   1671:                                p1 = &dirp->d_name[ 14 ];
                   1672:                                p2 = &direntry.d_name[ 14 ];
                   1673:                                while(p1 > (char *)dirp)
                   1674:                                        *--p1 = *--p2;
                   1675:  fileblk.b_dirty = 1 ;
                   1676:                        }
                   1677:                        else
                   1678:                                n &= ~ 010 ;
                   1679:                }
                   1680:                if(n & 01 )
                   1681:                        return(n);
                   1682:        }
                   1683:        return(filsize > 0 ? 04 : 01 );
                   1684: }
                   1685: 
                   1686: 
                   1687: direrr(s)
                   1688: char *s;
                   1689: {
                   1690:        register DINODE *dp;
                   1691: 
                   1692:        pwarn("%s ",s);
                   1693:        pinode();
                   1694:        printf("\n");
                   1695:        if((dp = ginode()) != 0 && ftypeok(dp))
                   1696:                pfatal("%s=%s", ((dp->di_mode & 0170000 ) == 0040000 ) ?"DIR":"FILE",pathname);
                   1697:        else
                   1698:                pfatal("NAME=%s",pathname);
                   1699:        return(reply("REMOVE"));
                   1700: }
                   1701: 
                   1702: 
                   1703: adjust(lcnt)
                   1704: register short lcnt;
                   1705: {
                   1706:        register DINODE *dp;
                   1707: 
                   1708:        if((dp = ginode()) == 0 )
                   1709:                return;
                   1710:        if(dp->di_nlink == lcnt) {
                   1711:                if(linkup() == 0 )
                   1712:                        clri("UNREF", 0 , 0 );
                   1713:        }
                   1714:        else {
                   1715:                pwarn("LINK COUNT %s",
                   1716:                        (lfdir==inum)?lfname:( ((dp->di_mode & 0170000 ) == 0040000 ) ?"DIR":"FILE"));
                   1717:                pinode();
                   1718:                printf(" COUNT %d SHOULD BE %d",
                   1719:                        dp->di_nlink,dp->di_nlink-lcnt);
                   1720:                if (preen) {
                   1721:                        if (lcnt < 0) {
                   1722:                                printf("\n");
                   1723:                                preendie();
                   1724:                        }
                   1725:                        printf(" (ADJUSTED)\n");
                   1726:                }
                   1727:                if(preen || reply("ADJUST") == 1 ) {
                   1728:                        dp->di_nlink -= lcnt;
                   1729:  inoblk.b_dirty = 1 ;
                   1730:                }
                   1731:        }
                   1732: }
                   1733: 
                   1734: 
                   1735: clri(s,flg,jclr)
                   1736: char *s;
                   1737: {
                   1738:        register DINODE *dp;
                   1739: 
                   1740:        if((dp = ginode()) == 0 )
                   1741:                return;
                   1742:        if(flg == 1 ) {
                   1743:                pwarn("%s %s",s, ((dp->di_mode & 0170000 ) == 0040000 ) ?"DIR":"FILE");
                   1744:                pinode();
                   1745:        }
                   1746:        if(preen || reply("CLEAR") == 1 ) {
                   1747:                if (preen)
                   1748:                        if (jclr == 1 )
                   1749:                                zcleared++;
                   1750:                        else
                   1751:                                printf(" (CLEARED)\n");
                   1752:                n_files--;
                   1753:                pfunc = pass4;
                   1754:                ckinode(dp, 0 );
                   1755:  clear((char *)( dp ),sizeof(DINODE)) ;
                   1756:  inoblk.b_dirty = 1 ;
                   1757:        }
                   1758: }
                   1759: 
                   1760: 
                   1761: setup(dev)
                   1762: char *dev;
                   1763: {
                   1764:        register n;
                   1765:        register BUFAREA *bp;
                   1766:        register MEMSIZE msize;
                   1767:        char *mbase;
                   1768:        daddr_t bcnt, nscrblk;
                   1769:        dev_t rootdev;
                   1770:        off_t smapsz, lncntsz, totsz;
                   1771:        struct stat statarea;
                   1772: 
                   1773:        if(stat("/",&statarea) < 0)
                   1774:                errexit("Can't stat root\n");
                   1775:        rootdev = statarea.st_dev;
                   1776:        if(stat(dev,&statarea) < 0) {
                   1777:                error("Can't stat %s\n",dev);
                   1778:                return( 0 );
                   1779:        }
                   1780:        rawflg = 0;
                   1781:        big = 0 ;
                   1782:        if((statarea.st_mode & 0170000 ) == 0060000 ) {
                   1783:                if( (( statarea.st_rdev ) & 64) )
                   1784:                        big = 64 ;
                   1785:        }
                   1786:        else if((statarea.st_mode & 0170000 ) == 0020000 )
                   1787:                rawflg++;
                   1788:        else {
                   1789:                if (reply("file is not a block or character device; OK") == 0 )
                   1790:                        return( 0 );
                   1791:        }
                   1792:        if(rootdev == statarea.st_rdev)
                   1793:                hotroot++;
                   1794:        if((dfile.rfdes = open(dev,0)) < 0) {
                   1795:                error("Can't open %s\n",dev);
                   1796:                return( 0 );
                   1797:        }
                   1798:        if (preen == 0)
                   1799:                printf("\n%s",dev);
                   1800:        if(nflag || (dfile.wfdes = open(dev,1)) < 0) {
                   1801:                dfile.wfdes = -1;
                   1802:                if (preen)
                   1803:                        pfatal("NO WRITE ACCESS");
                   1804:                printf(" (NO WRITE)");
                   1805:        }
                   1806:        if (preen == 0)
                   1807:                printf("\n");
                   1808:        fixfree = 0;
                   1809:        dfile.mod = 0;
                   1810:        n_files = n_blks = n_free = 0;
                   1811:        muldup = enddup = &duplist[0];
                   1812:        badlnp = &badlncnt[0];
                   1813:        lfdir = 0;
                   1814:        rplyflag = 0;
                   1815:  ( &sblk )->b_dirty = 0;( &sblk )->b_bno = (daddr_t)-1 ;
                   1816:  ( &fileblk )->b_dirty = 0;( &fileblk )->b_bno = (daddr_t)-1 ;
                   1817:  ( &inoblk )->b_dirty = 0;( &inoblk )->b_bno = (daddr_t)-1 ;
                   1818:        sfile.wfdes = sfile.rfdes = -1;
                   1819:        rmscr = 0;
                   1820:        if(getblk(&sblk, ((daddr_t)1) ) == 0 ) {
                   1821:                ckfini();
                   1822:                return( 0 );
                   1823:        }
                   1824:        imax = ((ino_t) sblk.b_un.b_fs .s_isize - ( ((daddr_t)1) +1)) * ( (( big ) & 64) ? 64: 16) ;
                   1825:        fmin = (daddr_t) sblk.b_un.b_fs .s_isize;
                   1826:        fmax = sblk.b_un.b_fs .s_fsize;
                   1827:        if(fmin >= fmax ||
                   1828:                (imax/ ( (( big ) & 64) ? 64: 16) ) != ((ino_t) sblk.b_un.b_fs .s_isize-( ((daddr_t)1) +1))) {
                   1829:                pfatal("Size check: fsize %ld isize %d",
                   1830:  sblk.b_un.b_fs .s_fsize, sblk.b_un.b_fs .s_isize);
                   1831:                printf("\n");
                   1832:                ckfini();
                   1833:                return( 0 );
                   1834:        }
                   1835:        if (preen == 0)
                   1836:                printf("File System: %.12s\n\n", sblk.b_un.b_fs .s_fsmnt);
                   1837:        bmapsz = (((( ((( fmax )+(( 8 )-1))/( 8 )) )+(( sizeof(*lncntp) )-1))/( sizeof(*lncntp) ))*( sizeof(*lncntp) )) ;
                   1838:        smapsz = (((( ((( (long)(imax+1) )+(( ( 8 / 2 ) )-1))/( ( 8 / 2 ) )) )+(( sizeof(*lncntp) )-1))/( sizeof(*lncntp) ))*( sizeof(*lncntp) )) ;
                   1839:        lncntsz = (long)(imax+1) * sizeof(*lncntp);
                   1840:        if(bmapsz > smapsz+lncntsz)
                   1841:                smapsz = bmapsz-lncntsz;
                   1842:        totsz = bmapsz+smapsz+lncntsz;
                   1843:        msize = memsize;
                   1844:        mbase = membase;
                   1845:        if(rawflg) {
                   1846:                if(msize < (MEMSIZE)( 11 * ( (( big ) & 64) ? 4096: 1024) ) + 2*sizeof(BUFAREA))
                   1847:                        rawflg = 0;
                   1848:                else {
                   1849:                        msize -= (MEMSIZE) 11 * ( (( big ) & 64) ? 4096: 1024) ;
                   1850:                        mbase += (MEMSIZE) 11 * ( (( big ) & 64) ? 4096: 1024) ;
                   1851:                        niblk = 11 ;
                   1852:                        startib = fmax;
                   1853:                }
                   1854:        }
                   1855:        clear(mbase,msize);
                   1856:        if((off_t)msize < totsz) {
                   1857:                bmapsz = (((( bmapsz )+(( ( (( big ) & 64) ? 4096: 1024) )-1))/( ( (( big ) & 64) ? 4096: 1024) ))*( ( (( big ) & 64) ? 4096: 1024) )) ;
                   1858:                smapsz = (((( smapsz )+(( ( (( big ) & 64) ? 4096: 1024) )-1))/( ( (( big ) & 64) ? 4096: 1024) ))*( ( (( big ) & 64) ? 4096: 1024) )) ;
                   1859:                lncntsz = (((( lncntsz )+(( ( (( big ) & 64) ? 4096: 1024) )-1))/( ( (( big ) & 64) ? 4096: 1024) ))*( ( (( big ) & 64) ? 4096: 1024) )) ;
                   1860:                nscrblk = (bmapsz+smapsz+lncntsz)>> ( (( big ) & 64) ? 12: 10) ;
                   1861:                if(tflag == 0) {
                   1862:                        printf("\nNEED SCRATCH FILE (%ld BLKS)\n",nscrblk);
                   1863:                        do {
                   1864:                                printf("ENTER FILENAME:  ");
                   1865:                                if((n = getline( (&_iob[0]) ,scrfile,sizeof(scrfile))) == (-1) )
                   1866:                                        errexit("\n");
                   1867:                        } while(n == 0);
                   1868:                }
                   1869:                if(stat(scrfile,&statarea) < 0 ||
                   1870:                        (statarea.st_mode & 0170000 ) == 0100000 )
                   1871:                        rmscr++;
                   1872:                if((sfile.wfdes = creat(scrfile,0666)) < 0 ||
                   1873:                        (sfile.rfdes = open(scrfile,0)) < 0) {
                   1874:                        error("Can't create %s\n",scrfile);
                   1875:                        ckfini();
                   1876:                        return( 0 );
                   1877:                }
                   1878:                bp = &((BUFAREA *)mbase)[(msize/sizeof(BUFAREA))];
                   1879:                poolhead = 0 ;
                   1880:                while(--bp >= (BUFAREA *)mbase) {
                   1881:  ( bp )->b_dirty = 0;( bp )->b_bno = (daddr_t)-1 ;
                   1882:                        bp->b_next = poolhead;
                   1883:                        poolhead = bp;
                   1884:                }
                   1885:                bp = poolhead;
                   1886:                for(bcnt = 0; bcnt < nscrblk; bcnt++) {
                   1887:                        bp->b_bno = bcnt;
                   1888:  ( bp )->b_dirty = 1 ;
                   1889:                        flush(&sfile,bp);
                   1890:                }
                   1891:                blkmap = freemap = statemap = (char *) 0 ;
                   1892:                lncntp = (short *) 0 ;
                   1893:                smapblk = bmapsz / ( (( big ) & 64) ? 4096: 1024) ;
                   1894:                lncntblk = smapblk + smapsz / ( (( big ) & 64) ? 4096: 1024) ;
                   1895:                fmapblk = smapblk;
                   1896:        }
                   1897:        else {
                   1898:                if(rawflg && (off_t)msize > totsz+ ( (( big ) & 64) ? 4096: 1024) ) {
                   1899:                        niblk += (unsigned)((off_t)msize-totsz)>> ( (( big ) & 64) ? 12: 10) ;
                   1900:                        if(niblk > 110 )
                   1901:                                niblk = 110 ;
                   1902:                        msize = memsize - (niblk* ( (( big ) & 64) ? 4096: 1024) );
                   1903:                        mbase = membase + (niblk* ( (( big ) & 64) ? 4096: 1024) );
                   1904:                }
                   1905:                poolhead = 0 ;
                   1906:                blkmap = mbase;
                   1907:                statemap = &mbase[(MEMSIZE)bmapsz];
                   1908:                freemap = statemap;
                   1909:                lncntp = (short *)&statemap[(MEMSIZE)smapsz];
                   1910:        }
                   1911:        return( 1 );
                   1912: }
                   1913: 
                   1914: 
                   1915: DINODE *
                   1916: ginode()
                   1917: {
                   1918:        register DINODE *dp;
                   1919:        register char *mbase;
                   1920:        daddr_t iblk;
                   1921: 
                   1922:        if(inum > imax)
                   1923:                return( 0 );
                   1924:        iblk = ((daddr_t)((((unsigned)( inum )+2* ( (( big ) & 64) ? 64: 16) -1)/ ( (( big ) & 64) ? 64: 16) ))) ;
                   1925:        if(rawflg) {
                   1926:                mbase = membase;
                   1927:                if(iblk < startib || iblk >= startib+niblk) {
                   1928:                        if(inoblk.b_dirty)
                   1929:                                bwrite(&dfile,mbase,startib,(int)niblk* ( (( big ) & 64) ? 4096: 1024) );
                   1930:                        inoblk.b_dirty = 0;
                   1931:                        if(bread(&dfile,mbase,iblk,(int)niblk* ( (( big ) & 64) ? 4096: 1024) ) == 0 ) {
                   1932:                                startib = fmax;
                   1933:                                return( 0 );
                   1934:                        }
                   1935:                        startib = iblk;
                   1936:                }
                   1937:                dp = (DINODE *)&mbase[(unsigned)((iblk-startib)<< ( (( big ) & 64) ? 12: 10) )];
                   1938:        }
                   1939:        else if(getblk(&inoblk,iblk) != 0 )
                   1940:                dp = inoblk.b_un.b_dinode;
                   1941:        else
                   1942:                return( 0 );
                   1943:        return(dp + ((int)((( inum )+2* ( (( big ) & 64) ? 64: 16) -1)% ( (( big ) & 64) ? 64: 16) )) );
                   1944: }
                   1945: 
                   1946: 
                   1947: ftypeok(dp)
                   1948: DINODE *dp;
                   1949: {
                   1950:        switch(dp->di_mode & 0170000 ) {
                   1951:                case 0040000 :
                   1952:                case 0100000 :
                   1953:                case 0060000 :
                   1954:                case 0020000 :
                   1955: 
                   1956:                case 0120000 :
                   1957: 
                   1958:                        return( 1 );
                   1959:                default:
                   1960:                        return( 0 );
                   1961:        }
                   1962: }
                   1963: 
                   1964: 
                   1965: reply(s)
                   1966: char *s;
                   1967: {
                   1968:        char line[80];
                   1969: 
                   1970:        if (preen)
                   1971:                pfatal("INTERNAL ERROR: GOT TO reply()");
                   1972:        rplyflag = 1;
                   1973:        printf("\n%s? ",s);
                   1974:        if(nflag || csflag || dfile.wfdes < 0) {
                   1975:                printf(" no\n\n");
                   1976:                return( 0 );
                   1977:        }
                   1978:        if(yflag) {
                   1979:                printf(" yes\n\n");
                   1980:                return( 1 );
                   1981:        }
                   1982:        if(getline( (&_iob[0]) ,line,sizeof(line)) == (-1) )
                   1983:                errexit("\n");
                   1984:        printf("\n");
                   1985:        if(line[0] == 'y' || line[0] == 'Y')
                   1986:                return( 1 );
                   1987:        else
                   1988:                return( 0 );
                   1989: }
                   1990: 
                   1991: 
                   1992: getline(fp,loc,maxlen)
                   1993:  struct _iobuf *fp;
                   1994: char *loc;
                   1995: {
                   1996:        register n;
                   1997:        register char *p, *lastloc;
                   1998: 
                   1999:        p = loc;
                   2000:        lastloc = &p[maxlen-1];
                   2001:        while((n = (--( fp )->_cnt>=0? (int)*( fp )->_ptr++:_filbuf( fp )) ) != '\n') {
                   2002:                if(n == (-1) )
                   2003:                        return( (-1) );
                   2004:                if(! ((_ctype+1)[ n ]& 010 ) && p < lastloc)
                   2005:                        *p++ = n;
                   2006:        }
                   2007:        *p = 0;
                   2008:        return(p - loc);
                   2009: }
                   2010: 
                   2011: 
                   2012: stype(p)
                   2013: register char *p;
                   2014: {
                   2015:        if(*p == 0)
                   2016:                return;
                   2017:        cylsize = atoi(p);
                   2018:        while(*p && *p != ':')
                   2019:                p++;
                   2020:        if(*p)
                   2021:                p++;
                   2022:        stepsize = atoi(p);
                   2023:        if(stepsize <= 0 || stepsize > cylsize ||
                   2024:        cylsize <= 0 || cylsize > 1000 ) {
                   2025:                error("Invalid -s argument, defaults assumed\n");
                   2026:                cylsize = stepsize = 0;
                   2027:        }
                   2028: }
                   2029: 
                   2030: 
                   2031: dostate(s,flg)
                   2032: {
                   2033:        register char *p;
                   2034:        register unsigned byte, shift;
                   2035:        BUFAREA *bp;
                   2036: 
                   2037:        byte = (inum)/ ( 8 / 2 ) ;
                   2038:        shift = 2 * ((inum)% ( 8 / 2 ) );
                   2039:        if(statemap != 0 ) {
                   2040:                bp = 0 ;
                   2041:                p = &statemap[byte];
                   2042:        }
                   2043:        else if((bp = getblk((BUFAREA *) 0 ,
                   2044:                        (daddr_t)(smapblk+(byte/ ( (( big ) & 64) ? 4096: 1024) )))) == 0 )
                   2045:                errexit("Fatal I/O error\n");
                   2046:        else
                   2047:                p = &bp->b_un.b_buf[byte% ( (( big ) & 64) ? 4096: 1024) ];
                   2048:        switch(flg) {
                   2049:                case 0:
                   2050:                        *p &= ~( 03 <<(shift));
                   2051:                        *p |= s<<(shift);
                   2052:                        if(bp != 0 )
                   2053:  ( bp )->b_dirty = 1 ;
                   2054:                        return(s);
                   2055:                case 1:
                   2056:                        return((*p>>(shift)) & 03 );
                   2057:        }
                   2058:        return( 0 );
                   2059: }
                   2060: 
                   2061: 
                   2062: domap(blk,flg)
                   2063: daddr_t blk;
                   2064: {
                   2065:        register char *p;
                   2066:        register unsigned n;
                   2067:        register BUFAREA *bp;
                   2068:        off_t byte;
                   2069: 
                   2070:        byte = blk >> 3 ;
                   2071:        n = 1<<((unsigned)(blk & 07 ));
                   2072:        if(flg & 04) {
                   2073:                p = freemap;
                   2074:                blk = fmapblk;
                   2075:        }
                   2076:        else {
                   2077:                p = blkmap;
                   2078:                blk = 0;
                   2079:        }
                   2080:        if(p != 0 ) {
                   2081:                bp = 0 ;
                   2082:                p += (unsigned)byte;
                   2083:        }
                   2084:        else if((bp = getblk((BUFAREA *) 0 ,blk+(byte>> ( (( big ) & 64) ? 12: 10) ))) == 0 )
                   2085:                errexit("Fatal I/O error\n");
                   2086:        else
                   2087:                p = &bp->b_un.b_buf[(unsigned)(byte& ( (( big ) & 64) ? 07777: 01777) )];
                   2088:        switch(flg&03) {
                   2089:                case 0:
                   2090:                        *p |= n;
                   2091:                        break;
                   2092:                case 1:
                   2093:                        n &= *p;
                   2094:                        bp = 0 ;
                   2095:                        break;
                   2096:                case 2:
                   2097:                        *p &= ~n;
                   2098:        }
                   2099:        if(bp != 0 )
                   2100:  ( bp )->b_dirty = 1 ;
                   2101:        return(n);
                   2102: }
                   2103: 
                   2104: 
                   2105: dolncnt(val,flg)
                   2106: short val;
                   2107: {
                   2108:        register short *sp;
                   2109:        register BUFAREA *bp;
                   2110: 
                   2111:        if(lncntp != 0 ) {
                   2112:                bp = 0 ;
                   2113:                sp = &lncntp[inum];
                   2114:        }
                   2115:        else if((bp = getblk((BUFAREA *) 0 ,(daddr_t)(lncntblk+(inum/ ( ( (( big ) & 64) ? 4096: 1024) /sizeof(short)) )))) == 0 )
                   2116:                errexit("Fatal I/O error\n");
                   2117:        else
                   2118:                sp = &bp->b_un.b_lnks[inum% ( ( (( big ) & 64) ? 4096: 1024) /sizeof(short)) ];
                   2119:        switch(flg) {
                   2120:                case 0:
                   2121:                        *sp = val;
                   2122:                        break;
                   2123:                case 1:
                   2124:                        bp = 0 ;
                   2125:                        break;
                   2126:                case 2:
                   2127:                        (*sp)--;
                   2128:        }
                   2129:        if(bp != 0 )
                   2130:  ( bp )->b_dirty = 1 ;
                   2131:        return(*sp);
                   2132: }
                   2133: 
                   2134: 
                   2135: BUFAREA *
                   2136: getblk(bp,blk)
                   2137: daddr_t blk;
                   2138: register BUFAREA *bp;
                   2139: {
                   2140:        register struct filecntl *fcp;
                   2141: 
                   2142:        if(bp == 0 ) {
                   2143:                bp = search(blk);
                   2144:                fcp = &sfile;
                   2145:        }
                   2146:        else
                   2147:                fcp = &dfile;
                   2148:        if(bp->b_bno == blk)
                   2149:                return(bp);
                   2150:        flush(fcp,bp);
                   2151:        if(bread(fcp,bp->b_un.b_buf,blk, ( (( big ) & 64) ? 4096: 1024) ) != 0 ) {
                   2152:                bp->b_bno = blk;
                   2153:                return(bp);
                   2154:        }
                   2155:        bp->b_bno = (daddr_t)-1;
                   2156:        return( 0 );
                   2157: }
                   2158: 
                   2159: 
                   2160: flush(fcp,bp)
                   2161: struct filecntl *fcp;
                   2162: register BUFAREA *bp;
                   2163: {
                   2164:        if(bp->b_dirty) {
                   2165:                bwrite(fcp,bp->b_un.b_buf,bp->b_bno, ( (( big ) & 64) ? 4096: 1024) );
                   2166:        }
                   2167:        bp->b_dirty = 0;
                   2168: }
                   2169: 
                   2170: 
                   2171: rwerr(s,blk)
                   2172: char *s;
                   2173: daddr_t blk;
                   2174: {
                   2175:        if (preen == 0)
                   2176:                printf("\n");
                   2177:        pfatal("CAN NOT %s: BLK %ld",s,blk);
                   2178:        if(reply("CONTINUE") == 0 )
                   2179:                errexit("Program terminated\n");
                   2180: }
                   2181: 
                   2182: 
                   2183: sizechk(dp)
                   2184: register DINODE *dp;
                   2185: {
                   2186: 
                   2187: #line 1559 "fsck.c"
                   2188:        if( ((dp->di_mode & 0170000 ) == 0040000 ) && (dp->di_size % sizeof(DIRECT)) != 0) {
                   2189:                pwarn("DIRECTORY MISALIGNED I=%u\n",inum);
                   2190:                if (preen == 0)
                   2191:                        printf("\n");
                   2192:        }
                   2193: }
                   2194: 
                   2195: 
                   2196: ckfini()
                   2197: {
                   2198:        flush(&dfile,&fileblk);
                   2199:        flush(&dfile,&sblk);
                   2200:        flush(&dfile,&inoblk);
                   2201:        close(dfile.rfdes);
                   2202:        close(dfile.wfdes);
                   2203:        close(sfile.rfdes);
                   2204:        close(sfile.wfdes);
                   2205:        if(rmscr) {
                   2206:                unlink(scrfile);
                   2207:        }
                   2208: }
                   2209: 
                   2210: 
                   2211: pinode()
                   2212: {
                   2213:        register DINODE *dp;
                   2214:        register char *p;
                   2215:        struct passwd *passwd;
                   2216:        char *ctime();
                   2217: 
                   2218:        printf(" I=%u ",inum);
                   2219:        if((dp = ginode()) == 0 )
                   2220:                return;
                   2221:        printf(" OWNER=");
                   2222:        if((passwd = getpwuid((int)dp->di_uid)) != 0) {
                   2223:                printf("%s ", passwd->pw_name);
                   2224:        }
                   2225:        else {
                   2226:                printf("%d ",dp->di_uid);
                   2227:        }
                   2228:        printf("MODE=%o\n",dp->di_mode);
                   2229:        if (preen)
                   2230:                printf("%s: ", devname);
                   2231:        printf("SIZE=%ld ",dp->di_size);
                   2232:        p = ctime(&dp->di_mtime);
                   2233:        printf("MTIME=%12.12s %4.4s ",p+4,p+20);
                   2234: }
                   2235: 
                   2236: 
                   2237: copy(fp,tp,size)
                   2238: register char *tp, *fp;
                   2239: MEMSIZE size;
                   2240: {
                   2241:        while(size--)
                   2242:                *tp++ = *fp++;
                   2243: }
                   2244: 
                   2245: 
                   2246: freechk()
                   2247: {
                   2248:        register daddr_t *ap;
                   2249:        register int i, j;
                   2250: 
                   2251:        if(big == 64 ) {
                   2252:                for(i = sblk.b_un.b_fs .s_isize; i < sblk.b_un.b_fs .s_fsize; i++) {
                   2253:                        j = i - sblk.b_un.b_fs .s_isize;
                   2254:                        if(! domap( i ,1+4) ) {
                   2255:  sblk.b_un.b_fs . U.B.S_bfree [j>>5] |= (1 << (j&31));
                   2256:                                n_free++;
                   2257:                        }
                   2258:                        else
                   2259:  sblk.b_un.b_fs . U.B.S_bfree [j>>5] &= ~(1 << (j&31));
                   2260:                }
                   2261:  sblk.b_un.b_fs . U.B.S_valid = 1;
                   2262:  sblk.b_un.b_fs .s_tfree = n_free;
                   2263:  sblk.b_dirty = 1 ;
                   2264:                return;
                   2265:        }
                   2266:        if( fileblk.b_un.b_fb .df_nfree == 0)
                   2267:                return;
                   2268:        do {
                   2269:                if( fileblk.b_un.b_fb .df_nfree <= 0 || fileblk.b_un.b_fb .df_nfree > 178 ) {
                   2270:                        pwarn("BAD FREEBLK COUNT");
                   2271:                        printf("\n");
                   2272:                        fixfree = 1;
                   2273:                        return;
                   2274:                }
                   2275:                ap = & fileblk.b_un.b_fb .df_free[ fileblk.b_un.b_fb .df_nfree];
                   2276:                while(--ap > & fileblk.b_un.b_fb .df_free[0]) {
                   2277:                        if(pass5(*ap) == 01 )
                   2278:                                return;
                   2279:                }
                   2280:                if(*ap == (daddr_t)0 || pass5(*ap) != 04 )
                   2281:                        return;
                   2282:        } while(getblk(&fileblk,*ap) != 0 );
                   2283: }
                   2284: 
                   2285: 
                   2286: makefree()
                   2287: {
                   2288:        register i, cyl, step;
                   2289:        int j;
                   2290:        char flg[ 1000 ];
                   2291:        short addr[ 1000 ];
                   2292:        daddr_t blk, baseblk;
                   2293: 
                   2294:        if(big == 64 )
                   2295:                return;
                   2296:  sblk.b_un.b_fs . U.R.S_nfree = 0;
                   2297:  sblk.b_un.b_fs .s_flock = 0;
                   2298:  sblk.b_un.b_fs .s_fmod = 0;
                   2299:  sblk.b_un.b_fs .s_tfree = 0;
                   2300:  sblk.b_un.b_fs .s_ninode = 0;
                   2301:  sblk.b_un.b_fs .s_ilock = 0;
                   2302:  sblk.b_un.b_fs .s_ronly = 0;
                   2303:        if(cylsize == 0 || stepsize == 0) {
                   2304:                step = sblk.b_un.b_fs .s_dinfo[0];
                   2305:                cyl = sblk.b_un.b_fs .s_dinfo[1];
                   2306:        }
                   2307:        else {
                   2308:                step = stepsize;
                   2309:                cyl = cylsize;
                   2310:        }
                   2311:        if(step > cyl || step <= 0 || cyl <= 0 || cyl > 1000 ) {
                   2312:                error("Default free list spacing assumed\n");
                   2313:                step = 9 ;
                   2314:                cyl = 400 ;
                   2315:        }
                   2316:  sblk.b_un.b_fs .s_dinfo[0] = step;
                   2317:  sblk.b_un.b_fs .s_dinfo[1] = cyl;
                   2318:        clear(flg,sizeof(flg));
                   2319:        i = 0;
                   2320:        for(j = 0; j < cyl; j++) {
                   2321:                while(flg[i])
                   2322:                        i = (i + 1) % cyl;
                   2323:                addr[j] = i + 1;
                   2324:                flg[i]++;
                   2325:                i = (i + step) % cyl;
                   2326:        }
                   2327:        baseblk = (daddr_t) (((( fmax )+(( cyl )-1))/( cyl ))*( cyl )) ;
                   2328:        clear((char *)& fileblk.b_un.b_fb , ( (( big ) & 64) ? 4096: 1024) );
                   2329:  fileblk.b_un.b_fb .df_nfree++;
                   2330:        for( ; baseblk > 0; baseblk -= cyl)
                   2331:                for(i = 0; i < cyl; i++) {
                   2332:                        blk = baseblk - addr[i];
                   2333:                        if(! ( blk < fmin || blk >= fmax) && ! domap( blk ,1) ) {
                   2334:  sblk.b_un.b_fs .s_tfree++;
                   2335:                                if( fileblk.b_un.b_fb .df_nfree >= 178 ) {
                   2336:  fileblk.b_dirty = 1 ;
                   2337:                                        fileblk.b_bno = blk;
                   2338:                                        flush(&dfile,&fileblk);
                   2339:                                        clear((char *)& fileblk.b_un.b_fb , ( (( big ) & 64) ? 4096: 1024) );
                   2340:                                }
                   2341:  fileblk.b_un.b_fb .df_free[ fileblk.b_un.b_fb .df_nfree] = blk;
                   2342:  fileblk.b_un.b_fb .df_nfree++;
                   2343:                        }
                   2344:                }
                   2345:  sblk.b_un.b_fs . U.R.S_nfree = fileblk.b_un.b_fb .df_nfree;
                   2346:        for(i = 0; i < 178 ; i++)
                   2347:  sblk.b_un.b_fs . U.R.S_free [i] = fileblk.b_un.b_fb .df_free[i];
                   2348:  sblk.b_dirty = 1 ;
                   2349: }
                   2350: 
                   2351: 
                   2352: clear(p,cnt)
                   2353: register char *p;
                   2354: MEMSIZE cnt;
                   2355: {
                   2356:        while(cnt--)
                   2357:                *p++ = 0;
                   2358: }
                   2359: 
                   2360: 
                   2361: BUFAREA *
                   2362: search(blk)
                   2363: daddr_t blk;
                   2364: {
                   2365:        register BUFAREA *pbp, *bp;
                   2366: 
                   2367:        for(bp = (BUFAREA *) &poolhead; bp->b_next; ) {
                   2368:                pbp = bp;
                   2369:                bp = pbp->b_next;
                   2370:                if(bp->b_bno == blk)
                   2371:                        break;
                   2372:        }
                   2373:        pbp->b_next = bp->b_next;
                   2374:        bp->b_next = poolhead;
                   2375:        poolhead = bp;
                   2376:        return(bp);
                   2377: }
                   2378: 
                   2379: 
                   2380: findino(dirp)
                   2381: register DIRECT *dirp;
                   2382: {
                   2383:        register char *p1, *p2;
                   2384: 
                   2385:        if(dirp->d_ino == 0)
                   2386:                return( 04 );
                   2387:        for(p1 = dirp->d_name,p2 = srchname;*p2++ == *p1; p1++) {
                   2388:                if(*p1 == 0 || p1 == &dirp->d_name[ 14 -1]) {
                   2389:                        if(dirp->d_ino > 0 && dirp->d_ino <= imax)
                   2390:                                parentdir = dirp->d_ino;
                   2391:                        return( 01 );
                   2392:                }
                   2393:        }
                   2394:        return( 04 );
                   2395: }
                   2396: 
                   2397: 
                   2398: mkentry(dirp)
                   2399: register DIRECT *dirp;
                   2400: {
                   2401:        register ino_t in;
                   2402:        register char *p;
                   2403: 
                   2404:        if(dirp->d_ino)
                   2405:                return( 04 );
                   2406:        dirp->d_ino = orphan;
                   2407:        in = orphan;
                   2408:        p = &dirp->d_name[8];
                   2409:        *--p = 0;
                   2410:        while(p > dirp->d_name) {
                   2411:                *--p = (in % 10) + '0';
                   2412:                in /= 10;
                   2413:        }
                   2414:        *p = '#';
                   2415:        return( 010 | 01 );
                   2416: }
                   2417: 
                   2418: 
                   2419: chgdd(dirp)
                   2420: register DIRECT *dirp;
                   2421: {
                   2422:        if(dirp->d_name[0] == '.' && dirp->d_name[1] == '.' &&
                   2423:        dirp->d_name[2] == 0) {
                   2424:                dirp->d_ino = lfdir;
                   2425:                return( 010 | 01 );
                   2426:        }
                   2427:        return( 04 );
                   2428: }
                   2429: 
                   2430: 
                   2431: linkup()
                   2432: {
                   2433:        register DINODE *dp;
                   2434:        register lostdir;
                   2435:        register ino_t pdir;
                   2436: 
                   2437:        if((dp = ginode()) == 0 )
                   2438:                return( 0 );
                   2439:        lostdir = ((dp->di_mode & 0170000 ) == 0040000 ) ;
                   2440:        pdir = parentdir;
                   2441:        if (preen && dp->di_size == 0)
                   2442:                return( 0 );
                   2443:        pwarn("UNREF %s ",lostdir ? "DIR" : "FILE");
                   2444:        pinode();
                   2445:        if (preen)
                   2446:                printf(" (RECONNECTED)\n");
                   2447:        else
                   2448:                if (reply("RECONNECT") == 0 )
                   2449:                        return( 0 );
                   2450:        orphan = inum;
                   2451:        if(lfdir == 0) {
                   2452:                inum = ((ino_t)2) ;
                   2453:                if((dp = ginode()) == 0 ) {
                   2454:                        inum = orphan;
                   2455:                        return( 0 );
                   2456:                }
                   2457:                pfunc = findino;
                   2458:                srchname = lfname;
                   2459:                filsize = dp->di_size;
                   2460:                parentdir = 0;
                   2461:                ckinode(dp, 1 );
                   2462:                inum = orphan;
                   2463:                if((lfdir = parentdir) == 0) {
                   2464:                        pfatal("SORRY. NO lost+found DIRECTORY");
                   2465:                        printf("\n\n");
                   2466:                        return( 0 );
                   2467:                }
                   2468:        }
                   2469:        inum = lfdir;
                   2470:        if((dp = ginode()) == 0 || ! ((dp->di_mode & 0170000 ) == 0040000 ) || dostate(0,1) != 01 ) {
                   2471:                inum = orphan;
                   2472:                pfatal("SORRY. NO lost+found DIRECTORY");
                   2473:                printf("\n\n");
                   2474:                return( 0 );
                   2475:        }
                   2476:        if(dp->di_size & ( (( big ) & 64) ? 07777: 01777) ) {
                   2477:                dp->di_size = (((( dp->di_size )+(( ( (( big ) & 64) ? 4096: 1024) )-1))/( ( (( big ) & 64) ? 4096: 1024) ))*( ( (( big ) & 64) ? 4096: 1024) )) ;
                   2478:  inoblk.b_dirty = 1 ;
                   2479:        }
                   2480:        filsize = dp->di_size;
                   2481:        inum = orphan;
                   2482:        pfunc = mkentry;
                   2483:        if((ckinode(dp, 1 ) & 010 ) == 0) {
                   2484:                pfatal("SORRY. NO SPACE IN lost+found DIRECTORY");
                   2485:                printf("\n\n");
                   2486:                return( 0 );
                   2487:        }
                   2488:  dolncnt(0,2) ;
                   2489:        if(lostdir) {
                   2490:                pfunc = chgdd;
                   2491:                dp = ginode();
                   2492:                filsize = dp->di_size;
                   2493:                ckinode(dp, 1 );
                   2494:                inum = lfdir;
                   2495:                if((dp = ginode()) != 0 ) {
                   2496:                        dp->di_nlink++;
                   2497:  inoblk.b_dirty = 1 ;
                   2498:  dolncnt( dolncnt(0,1) +1 ,0) ;
                   2499:                }
                   2500:                inum = orphan;
                   2501:                pwarn("DIR I=%u CONNECTED. ",orphan);
                   2502:                printf("PARENT WAS I=%u\n",pdir);
                   2503:                if (preen == 0)
                   2504:                        printf("\n");
                   2505:        }
                   2506:        return( 1 );
                   2507: }
                   2508: 
                   2509: 
                   2510: bread(fcp,buf,blk,size)
                   2511: daddr_t blk;
                   2512: register struct filecntl *fcp;
                   2513: register size;
                   2514: char *buf;
                   2515: {
                   2516:        if(lseek(fcp->rfdes,blk<< ( (( big ) & 64) ? 12: 10) ,0) < 0)
                   2517:                rwerr("SEEK",blk);
                   2518:        else if(read(fcp->rfdes,buf,size) == size)
                   2519:                return( 1 );
                   2520:        rwerr("READ",blk);
                   2521:        return( 0 );
                   2522: }
                   2523: 
                   2524: 
                   2525: bwrite(fcp,buf,blk,size)
                   2526: daddr_t blk;
                   2527: register struct filecntl *fcp;
                   2528: register size;
                   2529: char *buf;
                   2530: {
                   2531:        if(fcp->wfdes < 0)
                   2532:                return( 0 );
                   2533:        if(lseek(fcp->wfdes,blk<< ( (( big ) & 64) ? 12: 10) ,0) < 0)
                   2534:                rwerr("SEEK",blk);
                   2535:        else if(write(fcp->wfdes,buf,size) == size) {
                   2536:                fcp->mod = 1;
                   2537:                return( 1 );
                   2538:        }
                   2539:        rwerr("WRITE",blk);
                   2540:        return( 0 );
                   2541: }
                   2542: 
                   2543: catch()
                   2544: {
                   2545:        ckfini();
                   2546:        exit(12);
                   2547: }

unix.superglobalmegacorp.com

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