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