Annotation of sbbs/sbbs3/chksmb.c, revision 1.1

1.1     ! root        1: /* chksmb.c */
        !             2: 
        !             3: /* Synchronet message base (SMB) validity checker */
        !             4: 
        !             5: /* $Id: chksmb.c,v 1.6 2000/11/04 12:03:50 rswindell Exp $ */
        !             6: 
        !             7: /****************************************************************************
        !             8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
        !             9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
        !            10:  *                                                                                                                                                     *
        !            11:  * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
        !            12:  *                                                                                                                                                     *
        !            13:  * This program is free software; you can redistribute it and/or                       *
        !            14:  * modify it under the terms of the GNU General Public License                         *
        !            15:  * as published by the Free Software Foundation; either version 2                      *
        !            16:  * of the License, or (at your option) any later version.                                      *
        !            17:  * See the GNU General Public License for more details: gpl.txt or                     *
        !            18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
        !            19:  *                                                                                                                                                     *
        !            20:  * Anonymous FTP access to the most recent released source is available at     *
        !            21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
        !            22:  *                                                                                                                                                     *
        !            23:  * Anonymous CVS access to the development source and modification history     *
        !            24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
        !            25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
        !            26:  *     (just hit return, no password is necessary)                                                     *
        !            27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
        !            28:  *                                                                                                                                                     *
        !            29:  * For Synchronet coding style and modification guidelines, see                                *
        !            30:  * http://www.synchro.net/source.html                                                                          *
        !            31:  *                                                                                                                                                     *
        !            32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
        !            33:  * format) via e-mail to [email protected]                                                                      *
        !            34:  *                                                                                                                                                     *
        !            35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
        !            36:  ****************************************************************************/
        !            37: 
        !            38: /* ANSI */
        !            39: #include <string.h>            /* strrchr */
        !            40: #include <time.h>              /* ctime */
        !            41: 
        !            42: /* SMB-specific */
        !            43: #include "smblib.h"
        !            44: #include "smbwrap.h"
        !            45: #include "conwrap.h"   /* getch */
        !            46: 
        !            47: /****************************************************************************/
        !            48: /* Returns in 'string' a character representation of the number in l with   */
        !            49: /* commas.                                                                                                                                     */
        !            50: /****************************************************************************/
        !            51: char *ultoac(ulong l, char *string)
        !            52: {
        !            53:        char str[256];
        !            54:        signed char i,j,k;
        !            55: 
        !            56:        sprintf(str,"%lu",l);
        !            57:        i=strlen(str)-1;
        !            58:        j=i/3+1+i;
        !            59:        string[j--]=0;
        !            60:        for(k=1;i>-1;k++) {
        !            61:                string[j--]=str[i--];
        !            62:                if(j>0 && !(k%3))
        !            63:                        string[j--]=','; }
        !            64:        return(string);
        !            65: }
        !            66: 
        !            67: /****************************************************************************/
        !            68: /* Returns an ASCII string for FidoNet address 'addr'                       */
        !            69: /****************************************************************************/
        !            70: char *faddrtoa(fidoaddr_t addr)
        !            71: {
        !            72:        static char str[25];
        !            73:        char point[25];
        !            74: 
        !            75:        sprintf(str,"%u:%u/%u",addr.zone,addr.net,addr.node);
        !            76:        if(addr.point) {
        !            77:                sprintf(point,".%u",addr.point);
        !            78:                strcat(str,point); }
        !            79:        return(str);
        !            80: }
        !            81: 
        !            82: char *usage="\nusage: chksmb [/opts] <filespec.SHD>\n"
        !            83:                        "\n"
        !            84:                        " opts:\n"
        !            85:                        "       s - stop after errored message base\n"
        !            86:                        "       p - pause after errored messsage base\n"
        !            87:                        "       q - quiet mode (no beeps while checking)\n"
        !            88:                        "       a - don't check allocation files\n"
        !            89:                        "       t - don't check translation strings\n"
        !            90:                        "       e - display extended info on corrupted msgs\n";
        !            91: 
        !            92: int main(int argc, char **argv)
        !            93: {
        !            94:        char            str[128],*p,*s,*beep="\7";
        !            95:        int             i,j,x,y,lzh,errors,errlast,stop_on_error=0,pause_on_error=0
        !            96:                                ,chkxlat=1,chkalloc=1,lzhmsg,extinfo=0,msgerr;
        !            97:        ushort          xlat;
        !            98:        ulong           l,m,n,length,size,total=0,orphan=0,deleted=0,headers=0
        !            99:                                ,*offset,*number,xlaterr
        !           100:                                ,delidx
        !           101:                                ,delhdrblocks,deldatblocks,hdrerr=0,lockerr=0,hdrnumerr=0
        !           102:                                ,acthdrblocks,actdatblocks
        !           103:                                ,dfieldlength=0,dfieldoffset=0
        !           104:                                ,dupenum=0,dupenumhdr=0,dupeoff=0,attr=0,actalloc=0
        !           105:                                ,datactalloc=0,misnumbered=0,timeerr=0,idxofferr=0,idxerr
        !           106:                                ,zeronum,idxzeronum,idxnumerr,packable=0L,totallzhsaved=0L
        !           107:                                ,totalmsgs=0,totallzhmsgs=0,totaldelmsgs=0,totalmsgbytes=0L
        !           108:                                ,lzhblocks,lzhsaved;
        !           109:        smb_t           smb;
        !           110:        idxrec_t        idx;
        !           111:        smbmsg_t        msg;
        !           112: 
        !           113:        fprintf(stderr,"\nCHKSMB v2.10 - Check Synchronet Message Base - "
        !           114:                "Copyright 2000 Rob Swindell\n");
        !           115: 
        !           116:        if(argc<2) {
        !           117:                printf("%s",usage);
        !           118:                exit(1); }
        !           119: 
        !           120:        errlast=errors=0;
        !           121:        for(x=1;x<argc;x++) {
        !           122:                if(stop_on_error && errors)
        !           123:                        break;
        !           124:                if(pause_on_error && errlast!=errors) {
        !           125:                        fprintf(stderr,"\7\nHit any key to continue...");
        !           126:                        if(!getch())
        !           127:                                getch();
        !           128:                        printf("\n"); }
        !           129:                errlast=errors;
        !           130:                if(argv[x][0]=='/') {
        !           131:                        for(y=1;argv[x][y];y++)
        !           132:                                switch(toupper(argv[x][y])) {
        !           133:                                        case 'Q':
        !           134:                                                beep="";
        !           135:                                                break;
        !           136:                                        case 'P':
        !           137:                                                pause_on_error=1;
        !           138:                                                break;
        !           139:                                        case 'S':
        !           140:                                                stop_on_error=1;
        !           141:                                                break;
        !           142:                                        case 'T':
        !           143:                                                chkxlat=0;
        !           144:                                                break;
        !           145:                                        case 'A':
        !           146:                                                chkalloc=0;
        !           147:                                                break;
        !           148:                                        case 'E':
        !           149:                                                extinfo=1;
        !           150:                                                break;
        !           151:                                        default:
        !           152:                                                printf("%s",usage);
        !           153:                                                exit(1); }
        !           154:                        continue; }
        !           155: 
        !           156:        strcpy(smb.file,argv[x]);
        !           157:        p=strrchr(smb.file,'.');
        !           158:        s=strrchr(smb.file,'\\');
        !           159:        if(p>s) *p=0;
        !           160: 
        !           161:        sprintf(str,"%s.shd",smb.file);
        !           162:        if(!fexist(str)) {
        !           163:                printf("\n%s doesn't exist.\n",smb.file);
        !           164:                continue; }
        !           165: 
        !           166:        fprintf(stderr,"\nChecking %s Headers\n\n",smb.file);
        !           167: 
        !           168:        smb.retry_time=30;
        !           169:        if((i=smb_open(&smb))!=0) {
        !           170:                printf("smb_open returned %d\n",i);
        !           171:                errors++;
        !           172:                continue; }
        !           173: 
        !           174:        length=filelength(fileno(smb.shd_fp));
        !           175:        if(length<sizeof(smbhdr_t)) {
        !           176:                printf("Empty\n");
        !           177:                smb_close(&smb);
        !           178:                continue; }
        !           179: 
        !           180:        if((i=smb_locksmbhdr(&smb))!=0) {
        !           181:                smb_close(&smb);
        !           182:                printf("smb_locksmbhdr returned %d\n",i);
        !           183:                errors++;
        !           184:                continue; }
        !           185: 
        !           186:        if((length/SHD_BLOCK_LEN)*sizeof(ulong)) {
        !           187:                if((number=(ulong *)MALLOC(((length/SHD_BLOCK_LEN)+2)*sizeof(ulong)))
        !           188:                        ==NULL) {
        !           189:                        printf("Error allocating %lu bytes of memory\n"
        !           190:                                ,(length/SHD_BLOCK_LEN)*sizeof(ulong));
        !           191:                        return(++errors); } }
        !           192:        else
        !           193:                number=NULL;
        !           194: 
        !           195:        if(chkalloc && !(smb.status.attr&SMB_HYPERALLOC)) {
        !           196:                if((i=smb_open_ha(&smb))!=0) {
        !           197:                        printf("smb_open_ha returned %d\n",i);
        !           198:                        return(++errors); }
        !           199: 
        !           200:                if((i=smb_open_da(&smb))!=0) {
        !           201:                        printf("smb_open_da returned %d\n",i);
        !           202:                        return(++errors); } }
        !           203: 
        !           204:        headers=deleted=orphan=dupenumhdr=attr=zeronum=timeerr=lockerr=hdrerr=0;
        !           205:        actalloc=datactalloc=deldatblocks=delhdrblocks=xlaterr=0;
        !           206:        lzhblocks=lzhsaved=acthdrblocks=actdatblocks=0;
        !           207: 
        !           208:        for(l=smb.status.header_offset;l<length;l+=size) {
        !           209:                fprintf(stderr,"\r%2u%%  ",(long)(100.0/((float)length/l)));
        !           210:                msg.idx.offset=l;
        !           211:                msgerr=0;
        !           212:                if((i=smb_lockmsghdr(&smb,&msg))!=0) {
        !           213:                        printf("\n(%06lX) smb_lockmsghdr returned %d\n",l,i);
        !           214:                        lockerr++;
        !           215:                        headers++;
        !           216:                        size=SHD_BLOCK_LEN;
        !           217:                        continue; }
        !           218:                if((i=smb_getmsghdr(&smb,&msg))!=0) {
        !           219:                        smb_unlockmsghdr(&smb,&msg);
        !           220:                        if(chkalloc && !(smb.status.attr&SMB_HYPERALLOC)) {
        !           221:                                fseek(smb.sha_fp
        !           222:                                        ,(l-smb.status.header_offset)/SHD_BLOCK_LEN,SEEK_SET);
        !           223:                                j=fgetc(smb.sha_fp);
        !           224:                                if(j) {                         /* Allocated block or at EOF */
        !           225:                                        printf("%s\n(%06lX) smb_getmsghdr returned %d\n",beep,l,i);
        !           226:                                        hdrerr++; }
        !           227:                                else
        !           228:                                        delhdrblocks++; }
        !           229:                        else {
        !           230:                                /* printf("%s\n(%06lX) smb_getmsghdr returned %d\n",beep,l,i); */
        !           231:                                delhdrblocks++; }
        !           232:                        size=SHD_BLOCK_LEN;
        !           233:                        continue; }
        !           234:                smb_unlockmsghdr(&smb,&msg);
        !           235:                fprintf(stderr,"#%-5lu (%06lX) %-25.25s ",msg.hdr.number,l,msg.from);
        !           236: 
        !           237:                lzhmsg=0;
        !           238:                if(msg.hdr.attr&MSG_DELETE) {
        !           239:                        deleted++;
        !           240:                        if(number)
        !           241:                                number[headers]=0;
        !           242:                        if(smb.status.attr&SMB_HYPERALLOC)
        !           243:                                deldatblocks+=smb_datblocks(smb_getmsgdatlen(&msg)); }
        !           244:                else {
        !           245:                        actdatblocks+=smb_datblocks(smb_getmsgdatlen(&msg));
        !           246:                        if(msg.hdr.number>smb.status.last_msg) {
        !           247:                                fprintf(stderr,"%sOut-Of-Range message number\n",beep);
        !           248:                                msgerr=1;
        !           249:                                if(extinfo)
        !           250:                                        printf("MSGERR: Header number (%lu) greater than last (%lu)\n"
        !           251:                                                ,msg.hdr.number,smb.status.last_msg);
        !           252:                                hdrnumerr++; }
        !           253: 
        !           254:                        if(smb_getmsgidx(&smb,&msg)) {
        !           255:                                fprintf(stderr,"%sNot found in index\n",beep);
        !           256:                                msgerr=1;
        !           257:                                if(extinfo)
        !           258:                                        printf("MSGERR: Header number (%lu) not found in index\n"
        !           259:                                                ,msg.hdr.number);
        !           260:                                orphan++; }
        !           261:                        else if(msg.hdr.attr!=msg.idx.attr) {
        !           262:                                fprintf(stderr,"%sAttributes mismatch index\n",beep);
        !           263:                                msgerr=1;
        !           264:                                if(extinfo)
        !           265:                                        printf("MSGERR: Header attributes (%04X) do not match index "
        !           266:                                                "attributes (%04X)\n"
        !           267:                                                ,msg.hdr.attr,msg.idx.attr);
        !           268:                                attr++; }
        !           269:                        else if(msg.hdr.when_imported.time!=msg.idx.time) {
        !           270:                                fprintf(stderr,"%sImport date/time mismatch index\n",beep);
        !           271:                                msgerr=1;
        !           272:                                if(extinfo)
        !           273:                                        printf("MSGERR: Header import date/time does not match "
        !           274:                                                "index import date/time\n");
        !           275:                                timeerr++; }
        !           276: 
        !           277:                        if(msg.hdr.number==0) {
        !           278:                                fprintf(stderr,"%sZero message number\n",beep);
        !           279:                                msgerr=1;
        !           280:                                if(extinfo)
        !           281:                                        printf("MSGERR: Header number is zero (invalid)\n");
        !           282:                                zeronum++; }
        !           283:                        if(number) {
        !           284:                                for(m=0;m<headers;m++)
        !           285:                                        if(number[m] && msg.hdr.number==number[m]) {
        !           286:                                                fprintf(stderr,"%sDuplicate message number\n",beep);
        !           287:                                                msgerr=1;
        !           288:                                                if(extinfo)
        !           289:                                                        printf("MSGERR: Header number (%lu) duplicated\n"
        !           290:                                                                ,msg.hdr.number);
        !           291:                                                dupenumhdr++;
        !           292:                                                break; }
        !           293:                                number[headers]=msg.hdr.number; }
        !           294:                        if(chkxlat) {           /* Check translation strings */
        !           295:                                for(i=0;i<msg.hdr.total_dfields;i++) {
        !           296:                                        fseek(smb.sdt_fp,msg.hdr.offset+msg.dfield[i].offset,SEEK_SET);
        !           297:                                        if(!fread(&xlat,2,1,smb.sdt_fp))
        !           298:                                                xlat=0xffff;
        !           299:                                        lzh=0;
        !           300:                                        if(xlat==XLAT_LZH) {
        !           301:                                                lzh=1;
        !           302:                                                if(!fread(&xlat,2,1,smb.sdt_fp))
        !           303:                                                        xlat=0xffff; }
        !           304:                                        if(xlat!=XLAT_NONE) {
        !           305:                                                fprintf(stderr,"%sUnsupported Xlat %04X dfield[%u]\n"
        !           306:                                                        ,beep,xlat,i);
        !           307:                                                msgerr=1;
        !           308:                                                if(extinfo)
        !           309:                                                        printf("MSGERR: Unsupported translation type (%04X) "
        !           310:                                                                "in dfield[%u]\n"
        !           311:                                                                ,xlat,i);
        !           312:                                                xlaterr++; }
        !           313:                                        else {
        !           314:                                                if(lzh) {
        !           315:                                                        lzhmsg=1;
        !           316:                                                        if(fread(&m,4,1,smb.sdt_fp)) { /* Get uncompressed len */
        !           317:                                                                lzhsaved+=(smb_datblocks(m+2)
        !           318:                                                                        -smb_datblocks(msg.dfield[i].length))
        !           319:                                                                        *SDT_BLOCK_LEN;
        !           320:                                                                lzhblocks+=smb_datblocks(msg.dfield[i].length);
        !           321:                                                        } } } } } }
        !           322: 
        !           323:                size=smb_getmsghdrlen(&msg);
        !           324:                while(size%SHD_BLOCK_LEN) size++;
        !           325: 
        !           326:                if(chkalloc && !(smb.status.attr&SMB_HYPERALLOC)) {
        !           327:                        fseek(smb.sha_fp,(l-smb.status.header_offset)/SHD_BLOCK_LEN,SEEK_SET);
        !           328:                        for(m=0;m<size;m+=SHD_BLOCK_LEN) {
        !           329:        /***
        !           330:                                if(msg.hdr.attr&MSG_DELETE && (i=fgetc(smb.sha_fp))!=0) {
        !           331:                                        fprintf(stderr,"%sDeleted Header Block %lu marked %02X\n"
        !           332:                                                ,beep,m/SHD_BLOCK_LEN,i);
        !           333:                                        msgerr=1;
        !           334:                                        delalloc++; }
        !           335:        ***/
        !           336:                                if(!(msg.hdr.attr&MSG_DELETE) && (i=fgetc(smb.sha_fp))!=1) {
        !           337:                                        fprintf(stderr,"%sActive Header Block %lu marked %02X\n"
        !           338:                                                ,beep,m/SHD_BLOCK_LEN,i);
        !           339:                                        msgerr=1;
        !           340:                                        if(extinfo)
        !           341:                                                printf("MSGERR: Active header block %lu marked %02X "
        !           342:                                                        "instead of 01\n"
        !           343:                                                        ,m/SHD_BLOCK_LEN,i);
        !           344:                                        actalloc++; } }
        !           345: 
        !           346:                        if(!(msg.hdr.attr&MSG_DELETE)) {
        !           347:                                acthdrblocks+=(size/SHD_BLOCK_LEN);
        !           348:                                for(n=0;n<msg.hdr.total_dfields;n++) {
        !           349:                                        if(msg.dfield[n].offset&0x80000000UL) {
        !           350:                                                msgerr=1;
        !           351:                                                if(extinfo)
        !           352:                                                        printf("MSGERR: Invalid Data Field [%u] Offset: %lu\n"
        !           353:                                                                ,n,msg.dfield[n].offset);
        !           354:                                                dfieldoffset++; }
        !           355:                                        if(msg.dfield[n].length&0x80000000UL) {
        !           356:                                                msgerr=1;
        !           357:                                                if(extinfo)
        !           358:                                                        printf("MSGERR: Invalid Data Field [%u] Length: %lu\n"
        !           359:                                                                ,n,msg.dfield[n].length);
        !           360:                                                dfieldlength++; }
        !           361:                                        fseek(smb.sda_fp
        !           362:                                                ,((msg.hdr.offset+msg.dfield[n].offset)/SDT_BLOCK_LEN)*2
        !           363:                                                ,SEEK_SET);
        !           364:                                        for(m=0;m<msg.dfield[n].length;m+=SDT_BLOCK_LEN) {
        !           365:                                                if(!fread(&i,2,1,smb.sda_fp) || !i) {
        !           366:                                                        fprintf(stderr
        !           367:                                                                ,"%sActive Data Block %lu.%lu marked free\n"
        !           368:                                                                ,beep,n,m/SHD_BLOCK_LEN);
        !           369:                                                        msgerr=1;
        !           370:                                                        if(extinfo)
        !           371:                                                                printf("MSGERR: Active Data Block %lu.%lu "
        !           372:                                                                        "marked free\n"
        !           373:                                                                        ,n,m/SHD_BLOCK_LEN);
        !           374:                                                        datactalloc++; } } } }
        !           375:                        else
        !           376:                                delhdrblocks+=(size/SHD_BLOCK_LEN); }
        !           377: 
        !           378:                else {   /* Hyper Alloc */
        !           379:                        if(msg.hdr.attr&MSG_DELETE)
        !           380:                                delhdrblocks+=(size/SHD_BLOCK_LEN);
        !           381:                        else
        !           382:                                acthdrblocks+=(size/SHD_BLOCK_LEN); }
        !           383: 
        !           384:                totallzhmsgs+=lzhmsg;
        !           385:                headers++;
        !           386:                if(msgerr && extinfo) {
        !           387:                        printf("\n");
        !           388:                        printf("%-20s: %s\n","Message Base",smb.file);
        !           389:                        printf("%-20s: %lu (%lu)\n","Message Number"
        !           390:                                ,msg.hdr.number,msg.offset+1);
        !           391:                        printf("%-20s: %s\n","Subject",msg.subj);
        !           392:                        printf("%-20s: %s","To",msg.to);
        !           393:                        if(msg.to_net.type)
        !           394:                                printf(" (%s)",msg.to_net.type==NET_FIDO
        !           395:                                        ? faddrtoa(*(fidoaddr_t *)msg.to_net.addr) : msg.to_net.addr);
        !           396:                        printf("\n%-20s: %s","From",msg.from);
        !           397:                        if(msg.from_net.type)
        !           398:                                printf(" (%s)",msg.from_net.type==NET_FIDO
        !           399:                                        ? faddrtoa(*(fidoaddr_t *)msg.from_net.addr)
        !           400:                                                : msg.from_net.addr);
        !           401:                        printf("\n");
        !           402:                        printf("%-20s: %.24s\n","When Written"
        !           403:                                ,ctime((time_t *)&msg.hdr.when_written.time));
        !           404:                        printf("%-20s: %.24s\n","When Imported"
        !           405:                                ,ctime((time_t *)&msg.hdr.when_imported.time));
        !           406:                        printf("%-20s: %04hXh\n","Type"
        !           407:                                ,msg.hdr.type);
        !           408:                        printf("%-20s: %04hXh\n","Version"
        !           409:                                ,msg.hdr.version);
        !           410:                        printf("%-20s: %u\n","Length"
        !           411:                                ,msg.hdr.length);
        !           412:                        printf("%-20s: %04hXh\n","Attributes"
        !           413:                                ,msg.hdr.attr);
        !           414:                        printf("%-20s: %08lXh\n","Auxilary Attributes"
        !           415:                                ,msg.hdr.auxattr);
        !           416:                        printf("%-20s: %08lXh\n","Network Attributes"
        !           417:                                ,msg.hdr.netattr);
        !           418:                        printf("%-20s: %06lXh\n","Header Offset"
        !           419:                                ,msg.idx.offset);
        !           420:                        printf("%-20s: %06lXh\n","Data Offset"
        !           421:                                ,msg.hdr.offset);
        !           422:                        printf("%-20s: %u\n","Total Data Fields"
        !           423:                                ,msg.hdr.total_dfields);
        !           424:                        printf("\n"); }
        !           425: 
        !           426:                smb_freemsgmem(&msg); }
        !           427: 
        !           428:        if(number)
        !           429:                FREE(number);
        !           430: 
        !           431:        fprintf(stderr,"\r%79s\r100%%\n","");
        !           432: 
        !           433: 
        !           434:        if(chkalloc && !(smb.status.attr&SMB_HYPERALLOC)) {
        !           435: 
        !           436:                fprintf(stderr,"\nChecking %s Data Blocks\n\n",smb.file);
        !           437: 
        !           438:                length=filelength(fileno(smb.sda_fp));
        !           439: 
        !           440:                fseek(smb.sda_fp,0L,SEEK_SET);
        !           441:                for(l=0;l<length;l+=2) {
        !           442:                        fprintf(stderr,"\r%2u%%  ",l ? (long)(100.0/((float)length/l)) : 0);
        !           443:                        i=0;
        !           444:                        if(!fread(&i,2,1,smb.sda_fp))
        !           445:                                break;
        !           446:                        if(!i)
        !           447:                                deldatblocks++; }
        !           448: 
        !           449:                fclose(smb.sha_fp);
        !           450:                fclose(smb.sda_fp);
        !           451: 
        !           452:                fprintf(stderr,"\r%79s\r100%%\n",""); }
        !           453: 
        !           454:        total=filelength(fileno(smb.sid_fp))/sizeof(idxrec_t);
        !           455: 
        !           456:        dupenum=dupeoff=misnumbered=idxzeronum=idxnumerr=idxofferr=idxerr=delidx=0;
        !           457: 
        !           458:        if(total) {
        !           459: 
        !           460:        fprintf(stderr,"\nChecking %s Index\n\n",smb.file);
        !           461: 
        !           462:        if((offset=(ulong *)MALLOC(total*sizeof(ulong)))==NULL) {
        !           463:                printf("Error allocating %lu bytes of memory\n",total*sizeof(ulong));
        !           464:                return(++errors); }
        !           465:        if((number=(ulong *)MALLOC(total*sizeof(ulong)))==NULL) {
        !           466:                printf("Error allocating %lu bytes of memory\n",total*sizeof(ulong));
        !           467:                return(++errors); }
        !           468:        fseek(smb.sid_fp,0L,SEEK_SET);
        !           469: 
        !           470:        for(l=0;l<total;l++) {
        !           471:                fprintf(stderr,"\r%2lu%%  %5lu ",l ? (long)(100.0/((float)total/l)) : 0,l);
        !           472:                if(!fread(&idx,sizeof(idxrec_t),1,smb.sid_fp))
        !           473:                        break;
        !           474:                fprintf(stderr,"#%-5lu (%06lX) 1st Pass ",idx.number,idx.offset);
        !           475:                if(idx.attr&MSG_DELETE) {
        !           476:        //              fprintf(stderr,"%sMarked for deletion\n",beep);
        !           477:                        delidx++; }
        !           478:                for(m=0;m<l;m++)
        !           479:                        if(number[m]==idx.number) {
        !           480:                                fprintf(stderr,"%sDuplicate message number\n",beep);
        !           481:                                dupenum++;
        !           482:                                break; }
        !           483:                for(m=0;m<l;m++)
        !           484:                        if(offset[m]==idx.offset) {
        !           485:                                fprintf(stderr,"%sDuplicate offset\n",beep,idx.offset);
        !           486:                                dupeoff++;
        !           487:                                break; }
        !           488:                if(idx.offset<smb.status.header_offset) {
        !           489:                        fprintf(stderr,"%sInvalid offset\n",beep);
        !           490:                        idxofferr++;
        !           491:                        break; }
        !           492:                if(idx.number==0) {
        !           493:                        fprintf(stderr,"%sZero message number\n",beep);
        !           494:                        idxzeronum++;
        !           495:                        break; }
        !           496:                if(idx.number>smb.status.last_msg) {
        !           497:                        fprintf(stderr,"%sOut-Of-Range message number\n",beep);
        !           498:                        idxnumerr++;
        !           499:                        break; }
        !           500:                number[l]=idx.number;
        !           501:                offset[l]=idx.offset; }
        !           502: 
        !           503:        if(l<total) {
        !           504:                fprintf(stderr,"%sError reading index record\n",beep);
        !           505:                idxerr=1; }
        !           506:        else {
        !           507:                fprintf(stderr,"\r%79s\r","");
        !           508:                for(m=0;m<total;m++) {
        !           509:                        fprintf(stderr,"\r%2lu%%  %5lu ",m ? (long)(100.0/((float)total/m)) : 0,m);
        !           510:                        fprintf(stderr,"#%-5lu (%06lX) 2nd Pass ",number[m],offset[m]);
        !           511:                        for(n=0;n<m;n++)
        !           512:                                if(number[m] && number[n] && number[m]<number[n]) {
        !           513:                                        fprintf(stderr,"%sMisordered message number\n",beep);
        !           514:                                        misnumbered++;
        !           515:                                        number[n]=0;
        !           516:                                        break; } }
        !           517:                fprintf(stderr,"\r%79s\r100%%\n",""); }
        !           518:        FREE(number);
        !           519:        FREE(offset);
        !           520: 
        !           521:        }       /* if(total) */
        !           522: 
        !           523:        totalmsgs+=smb.status.total_msgs;
        !           524:        totalmsgbytes+=(acthdrblocks*SHD_BLOCK_LEN)+(actdatblocks*SDT_BLOCK_LEN);
        !           525:        totaldelmsgs+=deleted;
        !           526:        totallzhsaved+=lzhsaved;
        !           527:        printf("\n");
        !           528:        printf("%-35.35s (=): %lu\n"
        !           529:                ,"Status Total"
        !           530:                ,smb.status.total_msgs);
        !           531:        printf("%-35.35s (=): %lu\n"
        !           532:                ,"Total Indexes"
        !           533:                ,total);
        !           534:        printf("%-35.35s (=): %lu\n"
        !           535:                ,"Active Indexes"
        !           536:                ,total-delidx);
        !           537:        printf("%-35.35s (=): %lu\n"
        !           538:                ,"Active Headers"
        !           539:                ,headers-deleted);
        !           540:        printf("%-35.35s ( ): %-8lu %13s bytes used\n"
        !           541:                ,"Active Header Blocks"
        !           542:                ,acthdrblocks,ultoac(acthdrblocks*SHD_BLOCK_LEN,str));
        !           543:        printf("%-35.35s ( ): %-8lu %13s bytes used\n"
        !           544:                ,"Active Data Blocks"
        !           545:                ,actdatblocks,ultoac(actdatblocks*SDT_BLOCK_LEN,str));
        !           546:        if(lzhblocks)
        !           547:                printf("%-35.35s ( ): %-8lu %13s bytes saved\n"
        !           548:                        ,"Active LZH Compressed Data Blocks"
        !           549:                        ,lzhblocks,ultoac(lzhsaved,str));
        !           550:        printf("%-35.35s ( ): %lu\n"
        !           551:                ,"Header Records"
        !           552:                ,headers);
        !           553:        printf("%-35.35s ( ): %lu\n"
        !           554:                ,"Deleted Indexes"
        !           555:                ,delidx);
        !           556:        printf("%-35.35s ( ): %lu\n"
        !           557:                ,"Deleted Headers"
        !           558:                ,deleted);
        !           559:        printf("%-35.35s ( ): %-8lu %13s bytes used\n"
        !           560:                ,"Deleted Header Blocks"
        !           561:                ,delhdrblocks,ultoac(delhdrblocks*SHD_BLOCK_LEN,str));
        !           562:        packable+=(delhdrblocks*SHD_BLOCK_LEN);
        !           563:        printf("%-35.35s ( ): %-8lu %13s bytes used\n"
        !           564:                ,"Deleted Data Blocks"
        !           565:                ,deldatblocks,ultoac(deldatblocks*SDT_BLOCK_LEN,str));
        !           566:        packable+=(deldatblocks*SDT_BLOCK_LEN);
        !           567: 
        !           568:        if(orphan)
        !           569:                printf("%-35.35s (!): %lu\n"
        !           570:                        ,"Orphaned Headers"
        !           571:                        ,orphan);
        !           572:        if(idxzeronum)
        !           573:                printf("%-35.35s (!): %lu\n"
        !           574:                        ,"Zeroed Index Numbers"
        !           575:                        ,idxzeronum);
        !           576:        if(zeronum)
        !           577:                printf("%-35.35s (!): %lu\n"
        !           578:                        ,"Zeroed Header Numbers"
        !           579:                        ,zeronum);
        !           580:        if(idxofferr)
        !           581:                printf("%-35.35s (!): %lu\n"
        !           582:                        ,"Invalid Index Offsets"
        !           583:                        ,idxofferr);
        !           584:        if(dupenum)
        !           585:                printf("%-35.35s (!): %lu\n"
        !           586:                        ,"Duplicate Index Numbers"
        !           587:                        ,dupenum);
        !           588:        if(dupeoff)
        !           589:                printf("%-35.35s (!): %lu\n"
        !           590:                        ,"Duplicate Index Offsets"
        !           591:                        ,dupeoff);
        !           592:        if(dupenumhdr)
        !           593:                printf("%-35.35s (!): %lu\n"
        !           594:                        ,"Duplicate Header Numbers"
        !           595:                        ,dupenumhdr);
        !           596:        if(misnumbered)
        !           597:                printf("%-35.35s (!): %lu\n"
        !           598:                        ,"Misordered Index Numbers"
        !           599:                        ,misnumbered);
        !           600:        if(lockerr)
        !           601:                printf("%-35.35s (!): %lu\n"
        !           602:                        ,"Unlockable Header Records"
        !           603:                        ,lockerr);
        !           604:        if(hdrerr)
        !           605:                printf("%-35.35s (!): %lu\n"
        !           606:                        ,"Unreadable Header Records"
        !           607:                        ,hdrerr);
        !           608:        if(idxnumerr)
        !           609:                printf("%-35.35s (!): %lu\n"
        !           610:                        ,"Out-Of-Range Index Numbers"
        !           611:                        ,idxnumerr);
        !           612:        if(hdrnumerr)
        !           613:                printf("%-35.35s (!): %lu\n"
        !           614:                        ,"Out-Of-Range Header Numbers"
        !           615:                        ,hdrnumerr);
        !           616:        if(attr)
        !           617:                printf("%-35.35s (!): %lu\n"
        !           618:                        ,"Mismatched Header Attributes"
        !           619:                        ,attr);
        !           620:        if(timeerr)
        !           621:                printf("%-35.35s (!): %lu\n"
        !           622:                        ,"Mismatched Header Import Time"
        !           623:                        ,timeerr);
        !           624:        if(xlaterr)
        !           625:                printf("%-35.35s (!): %lu\n"
        !           626:                        ,"Unsupported Translation Types"
        !           627:                        ,xlaterr);
        !           628:        if(datactalloc)
        !           629:                printf("%-35.35s (!): %lu\n"
        !           630:                        ,"Misallocated Active Data Blocks"
        !           631:                        ,datactalloc);
        !           632:        if(actalloc)
        !           633:                printf("%-35.35s (!): %lu\n"
        !           634:                        ,"Misallocated Active Header Blocks"
        !           635:                        ,actalloc);
        !           636:        /***
        !           637:        if(delalloc)
        !           638:                printf("%-35.35s (!): %lu\n"
        !           639:                        ,"Misallocated Deleted Header Blocks"
        !           640:                        ,delalloc);
        !           641:        ***/
        !           642: 
        !           643:        if(dfieldoffset)
        !           644:                printf("%-35.35s (!): %lu\n"
        !           645:                        ,"Invalid Data Field Offsets"
        !           646:                        ,dfieldoffset);
        !           647: 
        !           648:        if(dfieldlength)
        !           649:                printf("%-35.35s (!): %lu\n"
        !           650:                        ,"Invalid Data Field Lengths"
        !           651:                        ,dfieldlength);
        !           652: 
        !           653: 
        !           654:        printf("\n%s Message Base ",smb.file);
        !           655:        if(/* (headers-deleted)!=smb.status.total_msgs || */
        !           656:                total!=smb.status.total_msgs
        !           657:                || (headers-deleted)!=total-delidx
        !           658:                || idxzeronum || zeronum
        !           659:                || orphan || dupenumhdr || dupenum || dupeoff || attr
        !           660:                || lockerr || hdrerr || hdrnumerr || idxnumerr || idxofferr
        !           661:                || actalloc || datactalloc || misnumbered || timeerr
        !           662:                || dfieldoffset || dfieldlength || xlaterr || idxerr) {
        !           663:                printf("%shas Errors!\n",beep);
        !           664:                errors++; }
        !           665:        else
        !           666:                printf("is OK\n");
        !           667: 
        !           668:        smb_unlocksmbhdr(&smb);
        !           669:        smb_close(&smb);
        !           670:        }
        !           671: 
        !           672:        if((totalmsgs && (totalmsgs!=smb.status.total_msgs || totallzhmsgs))
        !           673:                || packable)
        !           674:                printf("\n");
        !           675:        if(totalmsgs && totalmsgs!=smb.status.total_msgs)
        !           676:                printf("%-39.39s: %-8lu %13s bytes used\n"
        !           677:                        ,"Total Active Messages"
        !           678:                        ,totalmsgs,ultoac(totalmsgbytes,str));
        !           679:        if(totallzhmsgs && totalmsgs!=smb.status.total_msgs)
        !           680:                printf("%-39.39s: %-8lu %13s bytes saved\n"
        !           681:                        ,"Total LZH Compressed Messages"
        !           682:                        ,totallzhmsgs,ultoac(totallzhsaved,str));
        !           683:        if(packable)
        !           684:                printf("%-39.39s: %-8lu %13s bytes used\n"
        !           685:                        ,"Total Deleted Messages"
        !           686:                        ,totaldelmsgs,ultoac(packable,str));
        !           687: 
        !           688:        if(pause_on_error && errlast!=errors) {
        !           689:                fprintf(stderr,"\7\nHit any key to continue...");
        !           690:                if(!getch())
        !           691:                        getch();
        !           692:                fprintf(stderr,"\n"); }
        !           693: 
        !           694: 
        !           695:        return(errors);
        !           696: }

unix.superglobalmegacorp.com

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