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