Annotation of researchv10dc/cmd/x, revision 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.