|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.