|
|
1.1 ! root 1: /* SMBUTIL.C */ ! 2: ! 3: /* Synchronet Message Base Utility */ ! 4: ! 5: #define SMBUTIL_VER "1.24" ! 6: ! 7: #include "smblib.h" ! 8: #include "smbutil.h" ! 9: #include "crc32.h" ! 10: #include "crc16.c" ! 11: ! 12: #ifdef __WATCOMC__ ! 13: #include <dos.h> ! 14: #endif ! 15: ! 16: /********************/ ! 17: /* Global variables */ ! 18: /********************/ ! 19: ! 20: ulong mode=0L; ! 21: ushort tzone=PST; ! 22: char filein[128]; ! 23: char attach[128]; ! 24: ! 25: /************************/ ! 26: /* Program usage/syntax */ ! 27: /************************/ ! 28: ! 29: char *usage= ! 30: "usage: smbutil [/opts] cmd <filespec.SHD>\n" ! 31: "\n" ! 32: "cmd:\n" ! 33: " l[n] = list msgs starting at number n\n" ! 34: " r[n] = read msgs starting at number n\n" ! 35: " v[n] = view msg headers starting at number n\n" ! 36: " k[n] = kill (delete) n msgs\n" ! 37: " i<f> = import from text file f\n" ! 38: " s = display msg base status\n" ! 39: " c = change msg base status\n" ! 40: " m = maintain msg base - delete old msgs and msgs over max\n" ! 41: " p[k] = pack msg base (k specifies minimum packable Kbytes)\n" ! 42: "opts:\n" ! 43: " a = always pack msg base (disable compression analysis)\n" ! 44: " z[n] = set time zone (n=min +/- from UT or 'EST','EDT','CST',etc)\n" ! 45: ; ! 46: ! 47: /****************************************************************************/ ! 48: /* Checks the disk drive for the existence of a file. Returns 1 if it */ ! 49: /* exists, 0 if it doesn't. */ ! 50: /****************************************************************************/ ! 51: char fexist(char *filespec) ! 52: { ! 53: struct ffblk f; ! 54: ! 55: if(findfirst(filespec,&f,0)==0) ! 56: return(1); ! 57: return(0); ! 58: } ! 59: ! 60: /****************************************************************************/ ! 61: /* Returns the length of the file in 'filespec' */ ! 62: /****************************************************************************/ ! 63: long flength(char *filespec) ! 64: { ! 65: struct ffblk f; ! 66: ! 67: if(findfirst(filespec,&f,0)==0) ! 68: #ifdef __WATCOMC__ ! 69: return(f.size); ! 70: #else ! 71: return(f.ff_fsize); ! 72: #endif ! 73: return(-1L); ! 74: } ! 75: ! 76: ! 77: /****************************************************************************/ ! 78: /* Adds a new message to the message base */ ! 79: /****************************************************************************/ ! 80: void postmsg(smbstatus_t status) ! 81: { ! 82: char str[128],buf[SDT_BLOCK_LEN]; ! 83: ushort xlat; ! 84: int i,j,k,file; ! 85: long length; ! 86: ulong offset,crc=0xffffffffUL; ! 87: FILE *instream; ! 88: smbmsg_t msg; ! 89: ! 90: length=flength(filein); ! 91: if(length<1L) { ! 92: printf("Invalid file size for '%s'\n",filein); ! 93: exit(1); } ! 94: length+=2; /* for translation string */ ! 95: if(!(status.attr&SMB_HYPERALLOC)) { ! 96: i=smb_open_da(10); ! 97: if(i) { ! 98: printf("smb_open_da returned %d\n",i); ! 99: exit(1); } ! 100: offset=smb_allocdat(length,1); ! 101: fclose(sda_fp); } ! 102: else ! 103: offset=smb_hallocdat(); ! 104: ! 105: if((file=open(filein,O_RDONLY|O_BINARY))==-1 ! 106: || (instream=fdopen(file,"rb"))==NULL) { ! 107: printf("Error opening %s for read\n",filein); ! 108: smb_freemsgdat(offset,length,1); ! 109: exit(1); } ! 110: setvbuf(instream,NULL,_IOFBF,32*1024); ! 111: fseek(sdt_fp,offset,SEEK_SET); ! 112: xlat=XLAT_NONE; ! 113: fwrite(&xlat,2,1,sdt_fp); ! 114: k=SDT_BLOCK_LEN-2; ! 115: while(!feof(instream)) { ! 116: memset(buf,0,k); ! 117: j=fread(buf,1,k,instream); ! 118: if(status.max_crcs) ! 119: for(i=0;i<j;i++) ! 120: crc=ucrc32(buf[i],crc); ! 121: fwrite(buf,k,1,sdt_fp); ! 122: k=SDT_BLOCK_LEN; } ! 123: fflush(sdt_fp); ! 124: fclose(instream); ! 125: crc=~crc; ! 126: ! 127: memset(&msg,0,sizeof(smbmsg_t)); ! 128: memcpy(msg.hdr.id,"SHD\x1a",4); ! 129: msg.hdr.version=SMB_VERSION; ! 130: msg.hdr.when_written.time=time(NULL); ! 131: msg.hdr.when_written.zone=tzone; ! 132: msg.hdr.when_imported=msg.hdr.when_written; ! 133: ! 134: if(status.max_crcs) { ! 135: i=smb_addcrc(status.max_crcs,crc,10); ! 136: if(i) { ! 137: printf("smb_addcrc returned %d\n",i); ! 138: smb_freemsgdat(offset,length,1); ! 139: exit(1); } } ! 140: ! 141: msg.hdr.offset=offset; ! 142: ! 143: printf("To User Name: "); ! 144: gets(str); ! 145: i=smb_hfield(&msg,RECIPIENT,strlen(str),str); ! 146: if(i) { ! 147: printf("smb_hfield returned %d\n",i); ! 148: smb_freemsgdat(offset,length,1); ! 149: exit(1); } ! 150: if(status.attr&SMB_EMAIL) { ! 151: printf("To User Number: "); ! 152: gets(str); ! 153: i=smb_hfield(&msg,RECIPIENTEXT,strlen(str),str); ! 154: if(i) { ! 155: printf("smb_hfield returned %d\n",i); ! 156: smb_freemsgdat(offset,length,1); ! 157: exit(1); } ! 158: msg.idx.to=atoi(str); } ! 159: else { ! 160: strlwr(str); ! 161: msg.idx.to=crc16(str); } ! 162: ! 163: printf("From User Name: "); ! 164: gets(str); ! 165: i=smb_hfield(&msg,SENDER,strlen(str),str); ! 166: if(i) { ! 167: printf("smb_hfield returned %d\n",i); ! 168: smb_freemsgdat(offset,length,1); ! 169: exit(1); } ! 170: if(status.attr&SMB_EMAIL) { ! 171: printf("From User Number: "); ! 172: gets(str); ! 173: i=smb_hfield(&msg,SENDEREXT,strlen(str),str); ! 174: if(i) { ! 175: printf("smb_hfield returned %d\n",i); ! 176: smb_freemsgdat(offset,length,1); ! 177: exit(1); } ! 178: msg.idx.from=atoi(str); } ! 179: else { ! 180: strlwr(str); ! 181: msg.idx.from=crc16(str); } ! 182: ! 183: printf("Subject: "); ! 184: gets(str); ! 185: i=smb_hfield(&msg,SUBJECT,strlen(str),str); ! 186: if(i) { ! 187: printf("smb_hfield returned %d\n",i); ! 188: smb_freemsgdat(offset,length,1); ! 189: exit(1); } ! 190: strlwr(str); ! 191: msg.idx.subj=crc16(str); ! 192: ! 193: i=smb_dfield(&msg,TEXT_BODY,length); ! 194: if(i) { ! 195: printf("smb_dfield returned %d\n",i); ! 196: smb_freemsgdat(offset,length,1); ! 197: exit(1); } ! 198: ! 199: i=smb_addmsghdr(&msg,&status,status.attr&SMB_HYPERALLOC,10); ! 200: ! 201: if(i) { ! 202: printf("smb_addmsghdr returned %d\n",i); ! 203: smb_freemsgdat(offset,length,1); ! 204: exit(1); } ! 205: smb_freemsgmem(msg); ! 206: ! 207: } ! 208: ! 209: /****************************************************************************/ ! 210: /* Shows the message base header */ ! 211: /****************************************************************************/ ! 212: void showstatus() ! 213: { ! 214: int i; ! 215: smbstatus_t status; ! 216: ! 217: i=smb_locksmbhdr(10); ! 218: if(i) { ! 219: printf("smb_locksmbhdr returned %d\n",i); ! 220: return; } ! 221: i=smb_getstatus(&status); ! 222: smb_unlocksmbhdr(); ! 223: if(i) { ! 224: printf("smb_getstatus returned %d\n",i); ! 225: return; } ! 226: printf("last_msg =%lu\n" ! 227: "total_msgs =%lu\n" ! 228: "header_offset =%lu\n" ! 229: "max_crcs =%lu\n" ! 230: "max_msgs =%lu\n" ! 231: "max_age =%u\n" ! 232: "attr =%04Xh\n" ! 233: ,status.last_msg ! 234: ,status.total_msgs ! 235: ,status.header_offset ! 236: ,status.max_crcs ! 237: ,status.max_msgs ! 238: ,status.max_age ! 239: ,status.attr ! 240: ); ! 241: } ! 242: ! 243: /****************************************************************************/ ! 244: /* Configure message base header */ ! 245: /****************************************************************************/ ! 246: void config() ! 247: { ! 248: char max_msgs[128],max_crcs[128],max_age[128],header_offset[128],attr[128]; ! 249: int i; ! 250: smbstatus_t status; ! 251: ! 252: i=smb_locksmbhdr(10); ! 253: if(i) { ! 254: printf("smb_locksmbhdr returned %d\n",i); ! 255: return; } ! 256: i=smb_getstatus(&status); ! 257: smb_unlocksmbhdr(); ! 258: if(i) { ! 259: printf("smb_getstatus returned %d\n",i); ! 260: return; } ! 261: printf("Header offset =%-5lu New value (CR=No Change): ",status.header_offset); ! 262: gets(header_offset); ! 263: printf("Max msgs =%-5lu New value (CR=No Change): ",status.max_msgs); ! 264: gets(max_msgs); ! 265: printf("Max crcs =%-5lu New value (CR=No Change): ",status.max_crcs); ! 266: gets(max_crcs); ! 267: printf("Max age =%-5u New value (CR=No Change): ",status.max_age); ! 268: gets(max_age); ! 269: printf("Attributes =%-5u New value (CR=No Change): ",status.attr); ! 270: gets(attr); ! 271: i=smb_locksmbhdr(10); ! 272: if(i) { ! 273: printf("smb_locksmbhdr returned %d\n",i); ! 274: return; } ! 275: i=smb_getstatus(&status); ! 276: if(i) { ! 277: printf("smb_getstatus returned %d\n",i); ! 278: smb_unlocksmbhdr(); ! 279: return; } ! 280: if(isdigit(max_msgs[0])) ! 281: status.max_msgs=atol(max_msgs); ! 282: if(isdigit(max_crcs[0])) ! 283: status.max_crcs=atol(max_crcs); ! 284: if(isdigit(max_age[0])) ! 285: status.max_age=atoi(max_age); ! 286: if(isdigit(header_offset[0])) ! 287: status.header_offset=atol(header_offset); ! 288: if(isdigit(attr[0])) ! 289: status.attr=atoi(attr); ! 290: i=smb_putstatus(status); ! 291: smb_unlocksmbhdr(); ! 292: if(i) ! 293: printf("smb_putstatus returned %d\n",i); ! 294: } ! 295: ! 296: /****************************************************************************/ ! 297: /* Lists messages' to, from, and subject */ ! 298: /****************************************************************************/ ! 299: void listmsgs(ulong start, ulong count) ! 300: { ! 301: int i; ! 302: ulong l=0; ! 303: smbmsg_t msg; ! 304: idxrec_t idxrec; ! 305: ! 306: if(!start) ! 307: start=1; ! 308: fseek(sid_fp,(start-1L)*sizeof(idxrec_t),SEEK_SET); ! 309: while(l<count) { ! 310: if(!fread(&msg.idx,1,sizeof(idxrec_t),sid_fp)) ! 311: break; ! 312: i=smb_lockmsghdr(msg,10); ! 313: if(i) { ! 314: printf("smb_lockmsghdr returned %d\n",i); ! 315: break; } ! 316: i=smb_getmsghdr(&msg); ! 317: smb_unlockmsghdr(msg); ! 318: if(i) { ! 319: printf("smb_getmsghdr returned %d\n",i); ! 320: break; } ! 321: printf("%4lu %-25.25s %-25.25s %.20s\n" ! 322: ,msg.hdr.number,msg.from,msg.to,msg.subj); ! 323: smb_freemsgmem(msg); ! 324: l++; } ! 325: } ! 326: ! 327: /****************************************************************************/ ! 328: /* Returns an ASCII string for FidoNet address 'addr' */ ! 329: /****************************************************************************/ ! 330: char *faddrtoa(fidoaddr_t addr) ! 331: { ! 332: static char str[25]; ! 333: char point[25]; ! 334: ! 335: sprintf(str,"%u:%u/%u",addr.zone,addr.net,addr.node); ! 336: if(addr.point) { ! 337: sprintf(point,".%u",addr.point); ! 338: strcat(str,point); } ! 339: return(str); ! 340: } ! 341: ! 342: char *binstr(uchar *buf, ushort length) ! 343: { ! 344: static char str[128]; ! 345: char tmp[128]; ! 346: int i; ! 347: ! 348: str[0]=0; ! 349: for(i=0;i<length;i++) ! 350: if(buf[i] && (buf[i]<SP || buf[i]>=0x7f)) ! 351: break; ! 352: if(i==length) /* not binary */ ! 353: return(buf); ! 354: for(i=0;i<length;i++) { ! 355: sprintf(tmp,"%02X ",buf[i]); ! 356: strcat(str,tmp); } ! 357: return(str); ! 358: } ! 359: ! 360: /****************************************************************************/ ! 361: /* Converts when_t.zone into ASCII format */ ! 362: /****************************************************************************/ ! 363: char *zonestr(short zone) ! 364: { ! 365: static char str[32]; ! 366: ! 367: switch(zone) { ! 368: case 0: return("UT"); ! 369: case AST: return("AST"); ! 370: case EST: return("EST"); ! 371: case CST: return("CST"); ! 372: case MST: return("MST"); ! 373: case PST: return("PST"); ! 374: case YST: return("YST"); ! 375: case HST: return("HST"); ! 376: case BST: return("BST"); ! 377: case ADT: return("ADT"); ! 378: case EDT: return("EDT"); ! 379: case CDT: return("CDT"); ! 380: case MDT: return("MDT"); ! 381: case PDT: return("PDT"); ! 382: case YDT: return("YDT"); ! 383: case HDT: return("HDT"); ! 384: case BDT: return("BDT"); ! 385: case MID: return("MID"); ! 386: case VAN: return("VAN"); ! 387: case EDM: return("EDM"); ! 388: case WIN: return("WIN"); ! 389: case BOG: return("BOG"); ! 390: case CAR: return("CAR"); ! 391: case RIO: return("RIO"); ! 392: case FER: return("FER"); ! 393: case AZO: return("AZO"); ! 394: case LON: return("LON"); ! 395: case BER: return("BER"); ! 396: case ATH: return("ATH"); ! 397: case MOS: return("MOS"); ! 398: case DUB: return("DUB"); ! 399: case KAB: return("KAB"); ! 400: case KAR: return("KAR"); ! 401: case BOM: return("BOM"); ! 402: case KAT: return("KAT"); ! 403: case DHA: return("DHA"); ! 404: case BAN: return("BAN"); ! 405: case HON: return("HON"); ! 406: case TOK: return("TOK"); ! 407: case SYD: return("SYD"); ! 408: case NOU: return("NOU"); ! 409: case WEL: return("WEL"); ! 410: } ! 411: ! 412: sprintf(str,"%02d:%02d",zone/60,zone<0 ? (-zone)%60 : zone%60); ! 413: return(str); ! 414: } ! 415: ! 416: ! 417: /****************************************************************************/ ! 418: /* Displays message header information */ ! 419: /****************************************************************************/ ! 420: void viewmsgs(ulong start, ulong count) ! 421: { ! 422: char when_written[128] ! 423: ,when_imported[128]; ! 424: int i; ! 425: ulong l=0; ! 426: smbmsg_t msg; ! 427: idxrec_t idxrec; ! 428: ! 429: if(!start) ! 430: start=1; ! 431: fseek(sid_fp,(start-1L)*sizeof(idxrec_t),SEEK_SET); ! 432: while(l<count) { ! 433: if(!fread(&msg.idx,1,sizeof(idxrec_t),sid_fp)) ! 434: break; ! 435: i=smb_lockmsghdr(msg,10); ! 436: if(i) { ! 437: printf("smb_lockmsghdr returned %d\n",i); ! 438: break; } ! 439: i=smb_getmsghdr(&msg); ! 440: smb_unlockmsghdr(msg); ! 441: if(i) { ! 442: printf("smb_getmsghdr returned %d\n",i); ! 443: break; } ! 444: ! 445: sprintf(when_written,"%.24s %s" ! 446: ,ctime((time_t *)&msg.hdr.when_written.time) ! 447: ,zonestr(msg.hdr.when_written.zone)); ! 448: sprintf(when_imported,"%.24s %s" ! 449: ,ctime((time_t *)&msg.hdr.when_imported.time) ! 450: ,zonestr(msg.hdr.when_imported.zone)); ! 451: ! 452: printf( "%-20.20s %s\n" ! 453: "%-20.20s %s\n" ! 454: "%-20.20s %s\n" ! 455: "%-20.20s %04Xh\n" ! 456: "%-20.20s %04Xh\n" ! 457: "%-20.20s %u\n" ! 458: "%-20.20s %04Xh\n" ! 459: "%-20.20s %08lXh\n" ! 460: "%-20.20s %08lXh\n" ! 461: "%-20.20s %s\n" ! 462: "%-20.20s %s\n" ! 463: "%-20.20s %ld (%ld)\n" ! 464: "%-20.20s %ld\n" ! 465: "%-20.20s %ld\n" ! 466: "%-20.20s %ld\n" ! 467: "%-20.20s %s\n" ! 468: "%-20.20s %06lXh\n" ! 469: "%-20.20s %u\n", ! 470: ! 471: "subj", ! 472: msg.subj, ! 473: ! 474: "from", ! 475: msg.from, ! 476: ! 477: "to", ! 478: msg.to, ! 479: ! 480: "type", ! 481: msg.hdr.type, ! 482: ! 483: "version", ! 484: msg.hdr.version, ! 485: ! 486: "length", ! 487: msg.hdr.length, ! 488: ! 489: "attr", ! 490: msg.hdr.attr, ! 491: ! 492: "auxattr", ! 493: msg.hdr.auxattr, ! 494: ! 495: "netattr", ! 496: msg.hdr.netattr, ! 497: ! 498: "when_written", ! 499: when_written, ! 500: ! 501: "when_imported", ! 502: when_imported, ! 503: ! 504: "number", ! 505: msg.hdr.number, ! 506: ftell(sid_fp)/sizeof(idxrec_t), ! 507: ! 508: "thread_orig", ! 509: msg.hdr.thread_orig, ! 510: ! 511: "thread_next", ! 512: msg.hdr.thread_next, ! 513: ! 514: "thread_first", ! 515: msg.hdr.thread_first, ! 516: ! 517: "reserved[16]", ! 518: binstr(msg.hdr.reserved,16), ! 519: ! 520: "offset", ! 521: msg.hdr.offset, ! 522: ! 523: "total_dfields", ! 524: msg.hdr.total_dfields ! 525: ); ! 526: for(i=0;i<msg.hdr.total_dfields;i++) ! 527: printf("dfield[%02u].type %02Xh\n" ! 528: "dfield[%02u].offset %lu\n" ! 529: "dfield[%02u].length %lu\n" ! 530: ,i,msg.dfield[i].type ! 531: ,i,msg.dfield[i].offset ! 532: ,i,msg.dfield[i].length); ! 533: ! 534: for(i=0;i<msg.total_hfields;i++) ! 535: printf("hfield[%02u].type %02Xh\n" ! 536: "hfield[%02u].length %d\n" ! 537: "hfield[%02u]_dat %s\n" ! 538: ,i,msg.hfield[i].type ! 539: ,i,msg.hfield[i].length ! 540: ,i,binstr(msg.hfield_dat[i],msg.hfield[i].length)); ! 541: ! 542: if(msg.from_net.type) ! 543: printf("from_net.type %02Xh\n" ! 544: "from_net.addr %s\n" ! 545: ,msg.from_net.type ! 546: ,msg.from_net.type==NET_FIDO ! 547: ? faddrtoa(*(fidoaddr_t *)msg.from_net.addr) : msg.from_net.addr); ! 548: ! 549: if(msg.to_net.type) ! 550: printf("to_net.type %02Xh\n" ! 551: "to_net.addr %s\n" ! 552: ,msg.to_net.type ! 553: ,msg.to_net.type==NET_FIDO ! 554: ? faddrtoa(*(fidoaddr_t *)msg.to_net.addr) : msg.to_net.addr); ! 555: ! 556: if(msg.replyto_net.type) ! 557: printf("replyto_net.type %02Xh\n" ! 558: "replyto_net.addr %s\n" ! 559: ,msg.replyto_net.type ! 560: ,msg.replyto_net.type==NET_FIDO ! 561: ? faddrtoa(*(fidoaddr_t *)msg.replyto_net.addr) ! 562: : msg.replyto_net.addr); ! 563: ! 564: printf("from_agent %02Xh\n" ! 565: "to_agent %02Xh\n" ! 566: "replyto_agent %02Xh\n" ! 567: ,msg.from_agent ! 568: ,msg.to_agent ! 569: ,msg.replyto_agent); ! 570: ! 571: printf("\n"); ! 572: smb_freemsgmem(msg); ! 573: l++; } ! 574: } ! 575: ! 576: /****************************************************************************/ ! 577: /* Maintain message base - deletes messages older than max age (in days) */ ! 578: /* or messages that exceed maximum */ ! 579: /****************************************************************************/ ! 580: void maint(void) ! 581: { ! 582: int i; ! 583: ulong l,m,n,f,flagged=0; ! 584: time_t now; ! 585: smbstatus_t status; ! 586: smbmsg_t msg; ! 587: idxrec_t HUGE16 *idx; ! 588: ! 589: printf("Maintaining %s\r\n",smb_file); ! 590: now=time(NULL); ! 591: i=smb_locksmbhdr(10); ! 592: if(i) { ! 593: printf("smb_locksmbhdr returned %d\n",i); ! 594: return; } ! 595: i=smb_getstatus(&status); ! 596: if(i) { ! 597: smb_unlocksmbhdr(); ! 598: printf("smb_getstatus returned %d\n",i); ! 599: return; } ! 600: if(!status.total_msgs) { ! 601: smb_unlocksmbhdr(); ! 602: printf("Empty\n"); ! 603: return; } ! 604: printf("Loading index...\n"); ! 605: if((idx=(idxrec_t *)LMALLOC(sizeof(idxrec_t)*status.total_msgs)) ! 606: ==NULL) { ! 607: smb_unlocksmbhdr(); ! 608: printf("can't allocate %lu bytes of memory\n" ! 609: ,sizeof(idxrec_t)*status.total_msgs); ! 610: return; } ! 611: fseek(sid_fp,0L,SEEK_SET); ! 612: for(l=0;l<status.total_msgs;l++) { ! 613: printf("%lu of %lu\r" ! 614: ,l+1,status.total_msgs); ! 615: if(!fread(&idx[l],1,sizeof(idxrec_t),sid_fp)) ! 616: break; } ! 617: printf("\nDone.\n\n"); ! 618: ! 619: printf("Scanning for pre-flagged messages...\n"); ! 620: for(m=0;m<l;m++) { ! 621: printf("\r%2u%%",m ? (long)(100.0/((float)l/m)) : 0); ! 622: if(idx[m].attr&MSG_DELETE) ! 623: flagged++; } ! 624: printf("\r100%% (%lu pre-flagged for deletion)\n",flagged); ! 625: ! 626: if(status.max_age) { ! 627: printf("Scanning for messages more than %u days old...\n" ! 628: ,status.max_age); ! 629: for(m=f=0;m<l;m++) { ! 630: printf("\r%2u%%",m ? (long)(100.0/((float)l/m)) : 0); ! 631: if(idx[m].attr&(MSG_PERMANENT|MSG_DELETE)) ! 632: continue; ! 633: if(now>idx[m].time && (now-idx[m].time)/(24L*60L*60L)>status.max_age) { ! 634: f++; ! 635: flagged++; ! 636: idx[m].attr|=MSG_DELETE; } } /* mark for deletion */ ! 637: printf("\r100%% (%lu flagged for deletion)\n",f); } ! 638: ! 639: printf("Scanning for read messages to be killed...\n"); ! 640: for(m=f=0;m<l;m++) { ! 641: printf("\r%2u%%",m ? (long)(100.0/((float)l/m)) : 0); ! 642: if(idx[m].attr&(MSG_PERMANENT|MSG_DELETE)) ! 643: continue; ! 644: if((idx[m].attr&(MSG_READ|MSG_KILLREAD))==(MSG_READ|MSG_KILLREAD)) { ! 645: f++; ! 646: flagged++; ! 647: idx[m].attr|=MSG_DELETE; } } ! 648: printf("\r100%% (%lu flagged for deletion)\n",f); ! 649: ! 650: if(l-flagged>status.max_msgs) { ! 651: printf("Flagging excess messages for deletion...\n"); ! 652: for(m=n=0,f=flagged;l-flagged>status.max_msgs && m<l;m++) { ! 653: if(idx[m].attr&(MSG_PERMANENT|MSG_DELETE)) ! 654: continue; ! 655: printf("%lu of %lu\r",++n,(l-f)-status.max_msgs); ! 656: flagged++; ! 657: idx[m].attr|=MSG_DELETE; } /* mark for deletion */ ! 658: printf("\nDone.\n\n"); } ! 659: ! 660: if(!flagged) { /* No messages to delete */ ! 661: LFREE(idx); ! 662: smb_unlocksmbhdr(); ! 663: return; } ! 664: ! 665: if(!(mode&NOANALYSIS)) { ! 666: ! 667: printf("Freeing allocated header and data blocks for deleted messages...\n"); ! 668: if(!(status.attr&SMB_HYPERALLOC)) { ! 669: i=smb_open_da(10); ! 670: if(i) { ! 671: smb_unlocksmbhdr(); ! 672: printf("smb_open_da returned %d\n",i); ! 673: exit(1); } ! 674: i=smb_open_ha(10); ! 675: if(i) { ! 676: smb_unlocksmbhdr(); ! 677: printf("smb_open_ha returned %d\n",i); ! 678: exit(1); } } ! 679: ! 680: for(m=n=0;m<l;m++) { ! 681: if(idx[m].attr&MSG_DELETE) { ! 682: printf("%lu of %lu\r",++n,flagged); ! 683: msg.idx=idx[m]; ! 684: msg.hdr.number=msg.idx.number; ! 685: if((i=smb_getmsgidx(&msg))!=0) { ! 686: printf("\nsmb_getmsgidx returned %d\n",i); ! 687: continue; } ! 688: i=smb_lockmsghdr(msg,10); ! 689: if(i) { ! 690: printf("\nsmb_lockmsghdr returned %d\n",i); ! 691: break; } ! 692: if((i=smb_getmsghdr(&msg))!=0) { ! 693: smb_unlockmsghdr(msg); ! 694: printf("\nsmb_getmsghdr returned %d\n",i); ! 695: break; } ! 696: msg.hdr.attr|=MSG_DELETE; /* mark header as deleted */ ! 697: if((i=smb_putmsg(msg))!=0) { ! 698: smb_freemsgmem(msg); ! 699: smb_unlockmsghdr(msg); ! 700: printf("\nsmb_putmsg returned %d\n",i); ! 701: break; } ! 702: smb_unlockmsghdr(msg); ! 703: if((i=smb_freemsg(msg,status))!=0) { ! 704: smb_freemsgmem(msg); ! 705: printf("\nsmb_freemsg returned %d\n",i); ! 706: break; } ! 707: smb_freemsgmem(msg); } } ! 708: if(!(status.attr&SMB_HYPERALLOC)) { ! 709: fclose(sha_fp); ! 710: fclose(sda_fp); } ! 711: printf("\nDone.\n\n"); } ! 712: ! 713: printf("Re-writing index...\n"); ! 714: rewind(sid_fp); ! 715: if(chsize(fileno(sid_fp),0L)) ! 716: printf("chsize failed!\n"); ! 717: for(m=n=0;m<l;m++) { ! 718: if(idx[m].attr&MSG_DELETE) ! 719: continue; ! 720: printf("%lu of %lu\r",++n,l-flagged); ! 721: fwrite(&idx[m],sizeof(idxrec_t),1,sid_fp); } ! 722: printf("\nDone.\n\n"); ! 723: fflush(sid_fp); ! 724: ! 725: LFREE(idx); ! 726: status.total_msgs-=flagged; ! 727: smb_putstatus(status); ! 728: smb_unlocksmbhdr(); ! 729: } ! 730: ! 731: /****************************************************************************/ ! 732: /* Kills 'msgs' number of messags */ ! 733: /* Returns actual number of messages killed. */ ! 734: /****************************************************************************/ ! 735: ulong kill(ulong msgs) ! 736: { ! 737: int i; ! 738: ulong l,m,n,flagged=0; ! 739: smbstatus_t status; ! 740: smbmsg_t msg; ! 741: idxrec_t *idx; ! 742: ! 743: i=smb_locksmbhdr(10); ! 744: if(i) { ! 745: printf("smb_locksmbhdr returned %d\n",i); ! 746: return(0); } ! 747: i=smb_getstatus(&status); ! 748: if(i) { ! 749: smb_unlocksmbhdr(); ! 750: printf("smb_getstatus returned %d\n",i); ! 751: return(0); } ! 752: printf("Loading index...\n"); ! 753: if((idx=(idxrec_t *)LMALLOC(sizeof(idxrec_t)*status.total_msgs)) ! 754: ==NULL) { ! 755: smb_unlocksmbhdr(); ! 756: printf("can't allocate %lu bytes of memory\n" ! 757: ,sizeof(idxrec_t)*status.total_msgs); ! 758: return(0); } ! 759: fseek(sid_fp,0L,SEEK_SET); ! 760: for(l=0;l<status.total_msgs;l++) { ! 761: printf("%lu of %lu\r" ! 762: ,l+1,status.total_msgs); ! 763: if(!fread(&idx[l],1,sizeof(idxrec_t),sid_fp)) ! 764: break; } ! 765: printf("\nDone.\n\n"); ! 766: ! 767: printf("Flagging messages for deletion...\n"); ! 768: for(m=0;m<l && flagged<msgs;m++) { ! 769: if(idx[m].attr&(MSG_PERMANENT)) ! 770: continue; ! 771: printf("%lu of %lu\r",++flagged,msgs); ! 772: idx[m].attr|=MSG_DELETE; } /* mark for deletion */ ! 773: printf("\nDone.\n\n"); ! 774: ! 775: printf("Freeing allocated header and data blocks for deleted messages...\n"); ! 776: if(!(status.attr&SMB_HYPERALLOC)) { ! 777: i=smb_open_da(10); ! 778: if(i) { ! 779: smb_unlocksmbhdr(); ! 780: printf("smb_open_da returned %d\n",i); ! 781: exit(1); } ! 782: i=smb_open_ha(10); ! 783: if(i) { ! 784: smb_unlocksmbhdr(); ! 785: printf("smb_open_ha returned %d\n",i); ! 786: exit(1); } } ! 787: ! 788: for(m=n=0;m<l;m++) { ! 789: if(idx[m].attr&MSG_DELETE) { ! 790: printf("%lu of %lu\r",++n,flagged); ! 791: msg.idx=idx[m]; ! 792: i=smb_lockmsghdr(msg,10); ! 793: if(i) { ! 794: printf("\nsmb_lockmsghdr returned %d\n",i); ! 795: break; } ! 796: msg.hdr.number=msg.idx.number; ! 797: if((i=smb_getmsgidx(&msg))!=0) { ! 798: smb_unlockmsghdr(msg); ! 799: printf("\nsmb_getmsgidx returned %d\n",i); ! 800: break; } ! 801: if((i=smb_getmsghdr(&msg))!=0) { ! 802: smb_unlockmsghdr(msg); ! 803: printf("\nsmb_getmsghdr returned %d\n",i); ! 804: break; } ! 805: msg.hdr.attr|=MSG_DELETE; /* mark header as deleted */ ! 806: if((i=smb_putmsg(msg))!=0) { ! 807: smb_unlockmsghdr(msg); ! 808: printf("\nsmb_putmsg returned %d\n",i); ! 809: break; } ! 810: smb_unlockmsghdr(msg); ! 811: smb_freemsg(msg,status); ! 812: smb_freemsgmem(msg); } } ! 813: ! 814: if(!(status.attr&SMB_HYPERALLOC)) { ! 815: fclose(sha_fp); ! 816: fclose(sda_fp); } ! 817: ! 818: printf("\nDone.\n\n"); ! 819: ! 820: printf("Re-writing index...\n"); ! 821: rewind(sid_fp); ! 822: chsize(fileno(sid_fp),0L); ! 823: for(m=n=0;m<l;m++) { ! 824: if(idx[m].attr&MSG_DELETE) ! 825: continue; ! 826: printf("%lu of %lu\r",++n,l-flagged); ! 827: fwrite(&idx[m],1,sizeof(idxrec_t),sid_fp); } ! 828: printf("\nDone.\n\n"); ! 829: ! 830: fflush(sid_fp); ! 831: ! 832: LFREE(idx); ! 833: status.total_msgs-=flagged; ! 834: smb_putstatus(status); ! 835: smb_unlocksmbhdr(); ! 836: return(flagged); ! 837: } ! 838: ! 839: typedef struct { ! 840: ulong old,new; ! 841: } datoffset_t; ! 842: ! 843: /****************************************************************************/ ! 844: /* Removes all unused blocks from SDT and SHD files */ ! 845: /****************************************************************************/ ! 846: void packmsgs(ulong packable) ! 847: { ! 848: uchar buf[SDT_BLOCK_LEN],ch,fname[128],tmpfname[128]; ! 849: int i,file,size; ! 850: ulong l,m,n,datoffsets=0,length,total; ! 851: FILE *tmp_sdt,*tmp_shd,*tmp_sid; ! 852: smbhdr_t hdr; ! 853: smbstatus_t status; ! 854: smbmsg_t msg; ! 855: datoffset_t *datoffset=NULL; ! 856: ! 857: printf("Packing %s\n",smb_file); ! 858: i=smb_locksmbhdr(10); ! 859: if(i) { ! 860: printf("smb_locksmbhdr returned %d\n",i); ! 861: return; } ! 862: i=smb_getstatus(&status); ! 863: if(i) { ! 864: smb_unlocksmbhdr(); ! 865: printf("smb_getstatus returned %d\n",i); ! 866: return; } ! 867: ! 868: if(!(status.attr&SMB_HYPERALLOC)) { ! 869: i=smb_open_ha(10); ! 870: if(i) { ! 871: smb_unlocksmbhdr(); ! 872: printf("smb_open_ha returned %d\n",i); ! 873: return; } ! 874: i=smb_open_da(10); ! 875: if(i) { ! 876: smb_unlocksmbhdr(); ! 877: fclose(sha_fp); ! 878: printf("smb_open_da returned %d\n",i); ! 879: return; } } ! 880: ! 881: if(!status.total_msgs) { ! 882: printf("Empty\n"); ! 883: rewind(shd_fp); ! 884: chsize(fileno(shd_fp),status.header_offset); ! 885: rewind(sdt_fp); ! 886: chsize(fileno(sdt_fp),0L); ! 887: rewind(sid_fp); ! 888: chsize(fileno(sid_fp),0L); ! 889: if(!(status.attr&SMB_HYPERALLOC)) { ! 890: rewind(sha_fp); ! 891: chsize(fileno(sha_fp),0L); ! 892: rewind(sda_fp); ! 893: chsize(fileno(sda_fp),0L); ! 894: fclose(sha_fp); ! 895: fclose(sda_fp); } ! 896: smb_unlocksmbhdr(); ! 897: return; } ! 898: ! 899: ! 900: if(!(status.attr&SMB_HYPERALLOC) && !(mode&NOANALYSIS)) { ! 901: printf("Analyzing data blocks...\n"); ! 902: ! 903: length=filelength(fileno(sda_fp)); ! 904: ! 905: fseek(sda_fp,0L,SEEK_SET); ! 906: for(l=m=0;l<length;l+=2) { ! 907: printf("\r%2u%% ",l ? (long)(100.0/((float)length/l)) : 0); ! 908: i=0; ! 909: if(!fread(&i,2,1,sda_fp)) ! 910: break; ! 911: if(!i) ! 912: m++; } ! 913: ! 914: printf("\rAnalyzing header blocks...\n"); ! 915: ! 916: length=filelength(fileno(sha_fp)); ! 917: ! 918: fseek(sha_fp,0L,SEEK_SET); ! 919: for(l=n=0;l<length;l++) { ! 920: printf("\r%2u%% ",l ? (long)(100.0/((float)length/l)) : 0); ! 921: ch=0; ! 922: if(!fread(&ch,1,1,sha_fp)) ! 923: break; ! 924: if(!ch) ! 925: n++; } ! 926: ! 927: if(!m && !n) { ! 928: printf("\rAlready compressed.\n\n"); ! 929: fclose(sha_fp); ! 930: fclose(sda_fp); ! 931: smb_unlocksmbhdr(); ! 932: return; } ! 933: ! 934: if(packable && (m*SDT_BLOCK_LEN)+(n*SHD_BLOCK_LEN)<packable*1024L) { ! 935: printf("\rLess than %luk compressable bytes.\n\n",packable); ! 936: fclose(sha_fp); ! 937: fclose(sda_fp); ! 938: smb_unlocksmbhdr(); ! 939: return; } ! 940: ! 941: printf("\rCompressing %lu data blocks (%lu bytes)\n" ! 942: " and %lu header blocks (%lu bytes)\n" ! 943: ,m,m*SDT_BLOCK_LEN,n,n*SHD_BLOCK_LEN); } ! 944: ! 945: if(!(status.attr&SMB_HYPERALLOC)) { ! 946: rewind(sha_fp); ! 947: chsize(fileno(sha_fp),0L); /* Reset both allocation tables */ ! 948: rewind(sda_fp); ! 949: chsize(fileno(sda_fp),0L); } ! 950: ! 951: if(status.attr&SMB_HYPERALLOC && !(mode&NOANALYSIS)) { ! 952: printf("Analyzing %s\n",smb_file); ! 953: ! 954: length=filelength(fileno(shd_fp)); ! 955: m=n=0; ! 956: for(l=status.header_offset;l<length;l+=size) { ! 957: printf("\r%2u%% ",(long)(100.0/((float)length/l))); ! 958: msg.idx.offset=l; ! 959: if((i=smb_lockmsghdr(msg,10))!=0) { ! 960: printf("\n(%06lX) smb_lockmsghdr returned %d\n",l,i); ! 961: size=SHD_BLOCK_LEN; ! 962: continue; } ! 963: if((i=smb_getmsghdr(&msg))!=0) { ! 964: smb_unlockmsghdr(msg); ! 965: m++; ! 966: size=SHD_BLOCK_LEN; ! 967: continue; } ! 968: smb_unlockmsghdr(msg); ! 969: if(msg.hdr.attr&MSG_DELETE) { ! 970: m+=smb_hdrblocks(msg.hdr.length); ! 971: total=0; ! 972: for(i=0;i<msg.hdr.total_dfields;i++) ! 973: total+=msg.dfield[i].length; ! 974: n+=smb_datblocks(total); } ! 975: size=smb_getmsghdrlen(msg); ! 976: if(size<1) size=SHD_BLOCK_LEN; ! 977: while(size%SHD_BLOCK_LEN) ! 978: size++; ! 979: smb_freemsgmem(msg); } ! 980: ! 981: ! 982: if(!m && !n) { ! 983: printf("\rAlready compressed.\n\n"); ! 984: smb_unlocksmbhdr(); ! 985: return; } ! 986: ! 987: if(packable && (n*SDT_BLOCK_LEN)+(m*SHD_BLOCK_LEN)<packable*1024L) { ! 988: printf("\rLess than %luk compressable bytes.\n\n",packable); ! 989: smb_unlocksmbhdr(); ! 990: return; } ! 991: ! 992: printf("\rCompressing %lu data blocks (%lu bytes)\n" ! 993: " and %lu header blocks (%lu bytes)\n" ! 994: ,n,n*SDT_BLOCK_LEN,m,m*SHD_BLOCK_LEN); } ! 995: ! 996: sprintf(fname,"%s.SD$",smb_file); ! 997: tmp_sdt=fopen(fname,"wb"); ! 998: sprintf(fname,"%s.SH$",smb_file); ! 999: tmp_shd=fopen(fname,"wb"); ! 1000: sprintf(fname,"%s.SI$",smb_file); ! 1001: tmp_sid=fopen(fname,"wb"); ! 1002: if(!tmp_sdt || !tmp_shd || !tmp_sid) { ! 1003: smb_unlocksmbhdr(); ! 1004: if(!(status.attr&SMB_HYPERALLOC)) { ! 1005: fclose(sha_fp); ! 1006: fclose(sda_fp); } ! 1007: printf("error opening temp file\n"); ! 1008: return; } ! 1009: setvbuf(tmp_sdt,NULL,_IOFBF,2*1024); ! 1010: setvbuf(tmp_shd,NULL,_IOFBF,2*1024); ! 1011: setvbuf(tmp_sid,NULL,_IOFBF,2*1024); ! 1012: if(!(status.attr&SMB_HYPERALLOC) ! 1013: && (datoffset=(datoffset_t *)LMALLOC(sizeof(datoffset_t)*status.total_msgs)) ! 1014: ==NULL) { ! 1015: smb_unlocksmbhdr(); ! 1016: fclose(sha_fp); ! 1017: fclose(sda_fp); ! 1018: fclose(tmp_sdt); ! 1019: fclose(tmp_shd); ! 1020: fclose(tmp_sid); ! 1021: printf("error allocating mem\n"); ! 1022: return; } ! 1023: fseek(shd_fp,0L,SEEK_SET); ! 1024: fread(&hdr,1,sizeof(smbhdr_t),shd_fp); ! 1025: fwrite(&hdr,1,sizeof(smbhdr_t),tmp_shd); ! 1026: fwrite(&status,1,sizeof(smbstatus_t),tmp_shd); ! 1027: for(l=sizeof(smbhdr_t)+sizeof(smbstatus_t);l<status.header_offset;l++) { ! 1028: fread(&ch,1,1,shd_fp); /* copy additional base header records */ ! 1029: fwrite(&ch,1,1,tmp_shd); } ! 1030: fseek(sid_fp,0L,SEEK_SET); ! 1031: total=0; ! 1032: for(l=0;l<status.total_msgs;l++) { ! 1033: printf("%lu of %lu\r",l+1,status.total_msgs); ! 1034: if(!fread(&msg.idx,1,sizeof(idxrec_t),sid_fp)) ! 1035: break; ! 1036: if(msg.idx.attr&MSG_DELETE) { ! 1037: printf("\nDeleted index.\n"); ! 1038: continue; } ! 1039: i=smb_lockmsghdr(msg,10); ! 1040: if(i) { ! 1041: printf("\nsmb_lockmsghdr returned %d\n",i); ! 1042: continue; } ! 1043: i=smb_getmsghdr(&msg); ! 1044: smb_unlockmsghdr(msg); ! 1045: if(i) { ! 1046: printf("\nsmb_getmsghdr returned %d\n",i); ! 1047: continue; } ! 1048: if(msg.hdr.attr&MSG_DELETE) { ! 1049: printf("\nDeleted header.\n"); ! 1050: smb_freemsgmem(msg); ! 1051: continue; } ! 1052: for(m=0;m<datoffsets;m++) ! 1053: if(msg.hdr.offset==datoffset[m].old) ! 1054: break; ! 1055: if(m<datoffsets) { /* another index pointed to this data */ ! 1056: printf("duplicate index\n"); ! 1057: msg.hdr.offset=datoffset[m].new; ! 1058: smb_incdat(datoffset[m].new,smb_getmsgdatlen(msg),1); } ! 1059: else { ! 1060: ! 1061: if(!(status.attr&SMB_HYPERALLOC)) ! 1062: datoffset[datoffsets].old=msg.hdr.offset; ! 1063: ! 1064: fseek(sdt_fp,msg.hdr.offset,SEEK_SET); ! 1065: ! 1066: m=smb_getmsgdatlen(msg); ! 1067: if(m>16L*1024L*1024L) { ! 1068: printf("\nInvalid data length (%lu)\n",m); ! 1069: continue; } ! 1070: ! 1071: if(!(status.attr&SMB_HYPERALLOC)) { ! 1072: datoffset[datoffsets].new=msg.hdr.offset ! 1073: =smb_fallocdat(m,1); ! 1074: datoffsets++; ! 1075: fseek(tmp_sdt,msg.hdr.offset,SEEK_SET); } ! 1076: else { ! 1077: fseek(tmp_sdt,0L,SEEK_END); ! 1078: msg.hdr.offset=ftell(tmp_sdt); } ! 1079: ! 1080: /* Actually copy the data */ ! 1081: ! 1082: n=smb_datblocks(m); ! 1083: for(m=0;m<n;m++) { ! 1084: fread(buf,1,SDT_BLOCK_LEN,sdt_fp); ! 1085: if(!m && *(ushort *)buf!=XLAT_NONE && *(ushort *)buf!=XLAT_LZH) { ! 1086: printf("\nUnsupported translation type (%04X)\n" ! 1087: ,*(ushort *)buf); ! 1088: break; } ! 1089: fwrite(buf,1,SDT_BLOCK_LEN,tmp_sdt); } ! 1090: if(m<n) ! 1091: continue; } ! 1092: ! 1093: /* Write the new index entry */ ! 1094: length=smb_getmsghdrlen(msg); ! 1095: if(status.attr&SMB_HYPERALLOC) ! 1096: msg.idx.offset=ftell(tmp_shd); ! 1097: else ! 1098: msg.idx.offset=smb_fallochdr(length)+status.header_offset; ! 1099: fwrite(&msg.idx,1,sizeof(idxrec_t),tmp_sid); ! 1100: ! 1101: /* Write the new header entry */ ! 1102: fseek(tmp_shd,msg.idx.offset,SEEK_SET); ! 1103: fwrite(&msg.hdr,1,sizeof(msghdr_t),tmp_shd); ! 1104: for(n=0;n<msg.hdr.total_dfields;n++) ! 1105: fwrite(&msg.dfield[n],1,sizeof(dfield_t),tmp_shd); ! 1106: for(n=0;n<msg.total_hfields;n++) { ! 1107: fwrite(&msg.hfield[n],1,sizeof(hfield_t),tmp_shd); ! 1108: fwrite(msg.hfield_dat[n],1,msg.hfield[n].length,tmp_shd); } ! 1109: while(length%SHD_BLOCK_LEN) { /* pad with NULLs */ ! 1110: fputc(0,tmp_shd); ! 1111: length++; } ! 1112: total++; ! 1113: smb_freemsgmem(msg); } ! 1114: ! 1115: if(datoffset) ! 1116: LFREE(datoffset); ! 1117: if(!(status.attr&SMB_HYPERALLOC)) { ! 1118: fclose(sha_fp); ! 1119: fclose(sda_fp); } ! 1120: ! 1121: /* Change *.SH$ into *.SHD */ ! 1122: fclose(shd_fp); ! 1123: fclose(tmp_shd); ! 1124: sprintf(fname,"%s.SHD",smb_file); ! 1125: remove(fname); ! 1126: sprintf(tmpfname,"%s.SH$",smb_file); ! 1127: rename(tmpfname,fname); ! 1128: ! 1129: /* Change *.SD$ into *.SDT */ ! 1130: fclose(sdt_fp); ! 1131: fclose(tmp_sdt); ! 1132: sprintf(fname,"%s.SDT",smb_file); ! 1133: remove(fname); ! 1134: sprintf(tmpfname,"%s.SD$",smb_file); ! 1135: rename(tmpfname,fname); ! 1136: ! 1137: /* Change *.SI$ into *.SID */ ! 1138: fclose(sid_fp); ! 1139: fclose(tmp_sid); ! 1140: sprintf(fname,"%s.SID",smb_file); ! 1141: remove(fname); ! 1142: sprintf(tmpfname,"%s.SI$",smb_file); ! 1143: rename(tmpfname,fname); ! 1144: ! 1145: if((i=smb_open(10))!=0) { ! 1146: printf("Error %d reopening %s\n",i,smb_file); ! 1147: return; } ! 1148: ! 1149: status.total_msgs=total; ! 1150: if((i=smb_putstatus(status))!=0) ! 1151: printf("\nsmb_putstatus returned %d\n",i); ! 1152: printf("\nDone.\n\n"); ! 1153: } ! 1154: ! 1155: ! 1156: /****************************************************************************/ ! 1157: /* Read messages in message base */ ! 1158: /****************************************************************************/ ! 1159: void readmsgs(ulong start) ! 1160: { ! 1161: char str[128],*inbuf,*outbuf; ! 1162: int i,ch,done=0,domsg=1,lzh; ! 1163: ushort xlat; ! 1164: ulong l,count,outlen; ! 1165: smbmsg_t msg; ! 1166: ! 1167: if(start) ! 1168: msg.offset=start-1; ! 1169: else ! 1170: msg.offset=0; ! 1171: while(!done) { ! 1172: if(domsg) { ! 1173: fseek(sid_fp,msg.offset*sizeof(idxrec_t),SEEK_SET); ! 1174: if(!fread(&msg.idx,1,sizeof(idxrec_t),sid_fp)) ! 1175: break; ! 1176: i=smb_lockmsghdr(msg,10); ! 1177: if(i) { ! 1178: printf("smb_lockmsghdr returned %d\n",i); ! 1179: break; } ! 1180: i=smb_getmsghdr(&msg); ! 1181: if(i) { ! 1182: printf("smb_getmsghdr returned %d\n",i); ! 1183: break; } ! 1184: ! 1185: printf("\n%lu (%lu)\n",msg.hdr.number,msg.offset+1); ! 1186: printf("Subj : %s\n",msg.subj); ! 1187: printf("To : %s",msg.to); ! 1188: if(msg.to_net.type) ! 1189: printf(" (%s)",msg.to_net.type==NET_FIDO ! 1190: ? faddrtoa(*(fidoaddr_t *)msg.to_net.addr) : msg.to_net.addr); ! 1191: printf("\nFrom : %s",msg.from); ! 1192: if(msg.from_net.type) ! 1193: printf(" (%s)",msg.from_net.type==NET_FIDO ! 1194: ? faddrtoa(*(fidoaddr_t *)msg.from_net.addr) ! 1195: : msg.from_net.addr); ! 1196: printf("\nDate : %.24s %s",ctime((time_t *)&msg.hdr.when_written.time) ! 1197: ,zonestr(msg.hdr.when_written.zone)); ! 1198: printf("\n\n"); ! 1199: for(i=0;i<msg.hdr.total_dfields;i++) ! 1200: switch(msg.dfield[i].type) { ! 1201: case TEXT_BODY: ! 1202: case TEXT_TAIL: ! 1203: fseek(sdt_fp,msg.hdr.offset+msg.dfield[i].offset ! 1204: ,SEEK_SET); ! 1205: fread(&xlat,2,1,sdt_fp); ! 1206: l=2; ! 1207: lzh=0; ! 1208: while(xlat!=XLAT_NONE) { ! 1209: if(xlat==XLAT_LZH) ! 1210: lzh=1; ! 1211: fread(&xlat,2,1,sdt_fp); ! 1212: l+=2; } ! 1213: if(lzh) { ! 1214: if((inbuf=(char *)LMALLOC(msg.dfield[i].length)) ! 1215: ==NULL) { ! 1216: printf("Malloc error of %lu\n" ! 1217: ,msg.dfield[i].length); ! 1218: exit(1); } ! 1219: fread(inbuf,msg.dfield[i].length-l,1,sdt_fp); ! 1220: outlen=*(long *)inbuf; ! 1221: if((outbuf=(char *)LMALLOC(outlen))==NULL) { ! 1222: printf("Malloc error of lzh %lu\n" ! 1223: ,outlen); ! 1224: exit(1); } ! 1225: lzh_decode(inbuf,msg.dfield[i].length-l,outbuf); ! 1226: LFREE(inbuf); ! 1227: for(l=0;l<outlen;l++) ! 1228: putchar(outbuf[l]); ! 1229: LFREE(outbuf); } ! 1230: else { ! 1231: for(;l<msg.dfield[i].length;l++) { ! 1232: ch=fgetc(sdt_fp); ! 1233: if(ch) ! 1234: putchar(ch); } } ! 1235: printf("\n"); ! 1236: break; } ! 1237: i=smb_unlockmsghdr(msg); ! 1238: if(i) { ! 1239: printf("smb_unlockmsghdr returned %d\n",i); ! 1240: break; } ! 1241: smb_freemsgmem(msg); } ! 1242: domsg=1; ! 1243: printf("\nReading %s (?=Menu): ",smb_file); ! 1244: switch(toupper(getch())) { ! 1245: case '?': ! 1246: printf("\n" ! 1247: "\n" ! 1248: "(R)e-read current message\n" ! 1249: "(L)ist messages\n" ! 1250: "(T)en more titles\n" ! 1251: "(V)iew message headers\n" ! 1252: "(Q)uit\n" ! 1253: "(+/-) Forward/Backward\n" ! 1254: "\n"); ! 1255: domsg=0; ! 1256: break; ! 1257: case 'Q': ! 1258: printf("Quit\n"); ! 1259: done=1; ! 1260: break; ! 1261: case 'R': ! 1262: printf("Re-read\n"); ! 1263: break; ! 1264: case '-': ! 1265: printf("Backwards\n"); ! 1266: if(msg.offset) ! 1267: msg.offset--; ! 1268: break; ! 1269: case 'T': ! 1270: printf("Ten titles\n"); ! 1271: listmsgs(msg.offset+2,10); ! 1272: msg.offset+=10; ! 1273: domsg=0; ! 1274: break; ! 1275: case 'L': ! 1276: printf("List messages\n"); ! 1277: listmsgs(1,-1); ! 1278: domsg=0; ! 1279: break; ! 1280: case 'V': ! 1281: printf("View message headers\n"); ! 1282: viewmsgs(1,-1); ! 1283: domsg=0; ! 1284: break; ! 1285: case CR: ! 1286: case '+': ! 1287: printf("Next\n"); ! 1288: msg.offset++; ! 1289: break; } } ! 1290: } ! 1291: ! 1292: /***************/ ! 1293: /* Entry point */ ! 1294: /***************/ ! 1295: int main(int argc, char **argv) ! 1296: { ! 1297: char cmd[128]="",*p,*s; ! 1298: int i,j,x,y; ! 1299: ulong l; ! 1300: smbstatus_t status; ! 1301: ! 1302: #ifdef __TURBOC__ ! 1303: timezone=0; /* Fix for Borland C++ EST default */ ! 1304: daylight=0; /* Fix for Borland C++ EDT default */ ! 1305: #elif defined(__WATCOMC__) ! 1306: putenv("TZ=UCT0"); /* Fix for Watcom C++ EDT default */ ! 1307: #endif ! 1308: setvbuf(stdout,0,_IONBF,0); ! 1309: ! 1310: smb_file[0]=0; ! 1311: printf("\nSynchronet Message Base Utility v%s "\ ! 1312: "Copyright 1995 Digital Dynamics\n\n" ! 1313: ,SMBUTIL_VER); ! 1314: for(x=1;x<argc;x++) { ! 1315: if(argv[x][0]=='/') { ! 1316: for(j=1;argv[x][j];j++) ! 1317: switch(toupper(argv[x][j])) { ! 1318: case 'A': ! 1319: mode|=NOANALYSIS; ! 1320: break; ! 1321: case 'Z': ! 1322: if(isdigit(argv[x][j+1])) ! 1323: tzone=atoi(argv[x]+j+1); ! 1324: else if(!stricmp(argv[x]+j+1,"EST")) ! 1325: tzone=EST; ! 1326: else if(!stricmp(argv[x]+j+1,"EDT")) ! 1327: tzone=EDT; ! 1328: else if(!stricmp(argv[x]+j+1,"CST")) ! 1329: tzone=CST; ! 1330: else if(!stricmp(argv[x]+j+1,"CDT")) ! 1331: tzone=CDT; ! 1332: else if(!stricmp(argv[x]+j+1,"MST")) ! 1333: tzone=MST; ! 1334: else if(!stricmp(argv[x]+j+1,"MDT")) ! 1335: tzone=MDT; ! 1336: else if(!stricmp(argv[x]+j+1,"PST")) ! 1337: tzone=PST; ! 1338: else if(!stricmp(argv[x]+j+1,"PDT")) ! 1339: tzone=PDT; ! 1340: j=strlen(argv[x])-1; ! 1341: break; ! 1342: default: ! 1343: printf("\nUnknown opt '%c'\n",argv[x][j]); ! 1344: case '?': ! 1345: printf("%s",usage); ! 1346: exit(1); ! 1347: break; } } ! 1348: else { ! 1349: if(!cmd[0]) ! 1350: strcpy(cmd,argv[x]); ! 1351: else { ! 1352: sprintf(smb_file,"%.64s",argv[x]); ! 1353: p=strrchr(smb_file,'.'); ! 1354: s=strrchr(smb_file,'\\'); ! 1355: if(p>s) *p=0; ! 1356: strupr(smb_file); ! 1357: printf("Opening %s\r\n",smb_file); ! 1358: if((i=smb_open(10))!=0) { ! 1359: printf("error %d opening %s message base\n",i,smb_file); ! 1360: exit(1); } ! 1361: if(!filelength(fileno(shd_fp))) { ! 1362: printf("Empty\n"); ! 1363: smb_close(); ! 1364: continue; } ! 1365: for(y=0;cmd[y];y++) ! 1366: switch(toupper(cmd[y])) { ! 1367: case 'I': ! 1368: strcpy(filein,cmd+1); ! 1369: i=smb_locksmbhdr(10); ! 1370: if(i) { ! 1371: printf("smb_locksmbhdr returned %d\n",i); ! 1372: return(1); } ! 1373: i=smb_getstatus(&status); ! 1374: if(i) { ! 1375: printf("smb_getstatus returned %d\n",i); ! 1376: return(1); } ! 1377: smb_unlocksmbhdr(); ! 1378: postmsg(status); ! 1379: y=strlen(cmd)-1; ! 1380: break; ! 1381: case 'K': ! 1382: printf("Killing %lu messages...\n",atol(cmd+1)); ! 1383: l=kill(atol(cmd+1)); ! 1384: printf("%lu messages killed.\n",l); ! 1385: y=strlen(cmd)-1; ! 1386: break; ! 1387: case 'S': ! 1388: showstatus(); ! 1389: break; ! 1390: case 'C': ! 1391: config(); ! 1392: break; ! 1393: case 'L': ! 1394: listmsgs(atol(cmd+1),-1L); ! 1395: y=strlen(cmd)-1; ! 1396: break; ! 1397: case 'P': ! 1398: packmsgs(atol(cmd+y+1)); ! 1399: y=strlen(cmd)-1; ! 1400: break; ! 1401: case 'R': ! 1402: readmsgs(atol(cmd+1)); ! 1403: y=strlen(cmd)-1; ! 1404: break; ! 1405: case 'V': ! 1406: viewmsgs(atol(cmd+1),-1L); ! 1407: y=strlen(cmd)-1; ! 1408: break; ! 1409: case 'M': ! 1410: maint(); ! 1411: break; ! 1412: default: ! 1413: printf("%s",usage); ! 1414: break; } ! 1415: smb_close(); } } } ! 1416: if(!cmd[0]) ! 1417: printf("%s",usage); ! 1418: return(0); ! 1419: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.