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