home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / SMB / FIXSMB / FIXSMB.C next >
Encoding:
C/C++ Source or Header  |  1997-04-26  |  5.5 KB  |  227 lines

  1. /* FIXSMB.C */
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. /* Re-generates an SMB message base based on SHD and SDT files */
  6.  
  7. #include "smblib.h"
  8.  
  9. smb_t smb;
  10.  
  11. char *usage="usage: fixsmb [/opts] <smb_file>\n"
  12.             "\n"
  13.             " opts:\n"
  14.             "       m - force mail format instead of sub-board format\n"
  15.             "\n"
  16.             "   ex: FIXSMB /M MAIL\n"
  17.             "   or: FIXSMB DEBATE\n";
  18.  
  19. void remove_re(char *str)
  20. {
  21. while(!strnicmp(str,"RE:",3)) {
  22.     strcpy(str,str+3);
  23.     while(str[0]==SP)
  24.         strcpy(str,str+1); }
  25. }
  26.  
  27. /****************************************************************************/
  28. /* Updates 16-bit "rcrc" with character 'ch'                                */
  29. /****************************************************************************/
  30. void ucrc16(uchar ch, ushort *rcrc) {
  31.     ushort i, cy;
  32.     uchar nch=ch;
  33.  
  34. for (i=0; i<8; i++) {
  35.     cy=*rcrc & 0x8000;
  36.     *rcrc<<=1;
  37.     if (nch & 0x80) *rcrc |= 1;
  38.     nch<<=1;
  39.     if (cy) *rcrc ^= 0x1021; }
  40. }
  41.  
  42. /****************************************************************************/
  43. /* Returns 16-crc of string (not counting terminating NULL)                 */
  44. /****************************************************************************/
  45. ushort crc16(char *str)
  46. {
  47.     int     i=0;
  48.     ushort    crc=0;
  49.  
  50. ucrc16(0,&crc);
  51. while(str[i])
  52.     ucrc16(str[i++],&crc);
  53. ucrc16(0,&crc);
  54. ucrc16(0,&crc);
  55. return(crc);
  56. }
  57.  
  58. #define MAIL (1<<0)
  59.  
  60. int main(int argc, char **argv)
  61. {
  62.     char        str[128],c;
  63.     int         i,w,mode=0;
  64.     ulong        l,length,size,n,m;
  65.     smbmsg_t    msg;
  66.     smbstatus_t status;
  67.  
  68. printf("\nFIXSMB v1.22 · Rebuild Synchronet Message Base · Developed 1995-1997 "
  69.     "Rob Swindell\n");
  70.  
  71. smb.file[0]=0;
  72. for(i=1;i<argc;i++)
  73.     if(argv[i][0]=='/')
  74.         switch(toupper(argv[i][1])) {
  75.             case 'M':
  76.                 mode|=MAIL;
  77.                 break;
  78.             default:
  79.                 printf(usage);
  80.                 exit(1); }
  81.     else
  82.         strcpy(smb.file,argv[i]);
  83.  
  84. if(!smb.file[0]) {
  85.     printf(usage);
  86.     exit(1); }
  87.  
  88. strupr(smb.file);
  89. smb.retry_time=30;
  90.  
  91. if((i=smb_open(&smb))!=0) {
  92.     printf("smb_open returned %d\n",i);
  93.     exit(1); }
  94.  
  95. if((i=smb_locksmbhdr(&smb))!=0) {
  96.     smb_close(&smb);
  97.     printf("smb_locksmbhdr returned %d\n",i);
  98.     exit(1); }
  99.  
  100. if((i=smb_getstatus(&smb))!=0) {
  101.     smb_unlocksmbhdr(&smb);
  102.     smb_close(&smb);
  103.     printf("smb_getstatus returned %d\n",i);
  104.     exit(1); }
  105.  
  106. if(mode&MAIL && !(status.attr&SMB_EMAIL)) {
  107.     status.attr|=SMB_EMAIL;
  108.     if((i=smb_putstatus(&smb))!=0) {
  109.         smb_unlocksmbhdr(&smb);
  110.         smb_close(&smb);
  111.         printf("smb_putstatus returned %d\n",i);
  112.         exit(1); } }
  113.  
  114. if(!(status.attr&SMB_HYPERALLOC)) {
  115.  
  116.     if((i=smb_open_ha(&smb))!=0) {
  117.         smb_close(&smb);
  118.         printf("smb_open_ha returned %d\n",i);
  119.         exit(1); }
  120.  
  121.     if((i=smb_open_da(&smb))!=0) {
  122.         smb_close(&smb);
  123.         printf("smb_open_da returned %d\n",i);
  124.         exit(1); }
  125.  
  126.     rewind(smb.sha_fp);
  127.     chsize(fileno(smb.sha_fp),0L);        /* Truncate the header allocation file */
  128.     rewind(smb.sda_fp);
  129.     chsize(fileno(smb.sda_fp),0L);        /* Truncate the data allocation file */
  130.     }
  131.  
  132. rewind(smb.sid_fp);
  133. chsize(fileno(smb.sid_fp),0L);            /* Truncate the index */
  134.  
  135.  
  136. if(!(status.attr&SMB_HYPERALLOC)) {
  137.     length=filelength(fileno(smb.sdt_fp));
  138.     w=0;
  139.     for(l=0;l<length;l+=SDT_BLOCK_LEN)    /* Init .SDA file to NULL */
  140.         fwrite(&w,2,1,smb.sda_fp);
  141.  
  142.     length=filelength(fileno(smb.shd_fp));
  143.     c=0;
  144.     for(l=0;l<length;l+=SHD_BLOCK_LEN)    /* Init .SHD file to NULL */
  145.         fwrite(&c,1,1,smb.sha_fp); }
  146. else
  147.     length=filelength(fileno(smb.shd_fp));
  148.  
  149. n=1;    /* messsage number */
  150. for(l=status.header_offset;l<length;l+=size) {
  151.     printf("\r%2u%%  ",(long)(100.0/((float)length/l)));
  152.     msg.idx.offset=l;
  153.     if((i=smb_lockmsghdr(&smb,&msg))!=0) {
  154.         printf("\n(%06lX) smb_lockmsghdr returned %d\n",l,i);
  155.         continue; }
  156.     if((i=smb_getmsghdr(&smb,&msg))!=0) {
  157.         smb_unlockmsghdr(&smb,&msg);
  158.         printf("\n(%06lX) smb_getmsghdr returned %d\n",l,i);
  159.         size=SHD_BLOCK_LEN;
  160.         continue; }
  161.     smb_unlockmsghdr(&smb,&msg);
  162.     printf("#%-5lu (%06lX) %-25.25s ",msg.hdr.number,l,msg.from);
  163.     if(!(msg.hdr.attr&MSG_DELETE)) {   /* Don't index deleted messages */
  164.         msg.offset=n-1;
  165.         msg.hdr.number=n;
  166.         msg.idx.number=n;
  167.         msg.idx.attr=msg.hdr.attr;
  168.         msg.idx.time=msg.hdr.when_imported.time;
  169.         strcpy(str,msg.subj);
  170.         strlwr(str);
  171.         remove_re(str);
  172.         msg.idx.subj=crc16(str);
  173.         if(status.attr&SMB_EMAIL) {
  174.             if(msg.to_ext)
  175.                 msg.idx.to=atoi(msg.to_ext);
  176.             else
  177.                 msg.idx.to=0;
  178.             if(msg.from_ext)
  179.                 msg.idx.from=atoi(msg.from_ext);
  180.             else
  181.                 msg.idx.from=0; }
  182.         else {
  183.             strcpy(str,msg.to);
  184.             strlwr(str);
  185.             msg.idx.to=crc16(str);
  186.             strcpy(str,msg.from);
  187.             strlwr(str);
  188.             msg.idx.from=crc16(str); }
  189.         if((i=smb_putmsg(&smb,&msg))!=0) {
  190.             printf("\nsmb_putmsg returned %d\n",i);
  191.             continue; }
  192.         n++; }
  193.     else
  194.         printf("Not indexing deleted message\n");
  195.     size=smb_getmsghdrlen(&msg);
  196.     while(size%SHD_BLOCK_LEN)
  197.         size++;
  198.  
  199.     if(!(status.attr&SMB_HYPERALLOC)) {
  200.         /**************************/
  201.         /* Allocate header blocks */
  202.         /**************************/
  203.         fseek(smb.sha_fp,(l-status.header_offset)/SHD_BLOCK_LEN,SEEK_SET);
  204.         if(msg.hdr.attr&MSG_DELETE) c=0;        /* mark as free */
  205.         else c=1;                                /* or allocated */
  206.  
  207.         for(i=0;i<size/SHD_BLOCK_LEN;i++)
  208.             fputc(c,smb.sha_fp);
  209.  
  210.         /************************/
  211.         /* Allocate data blocks */
  212.         /************************/
  213.  
  214.         if(!(msg.hdr.attr&MSG_DELETE))
  215.             smb_incdat(&smb,msg.hdr.offset,smb_getmsgdatlen(&msg),1);
  216.         }
  217.  
  218.     smb_freemsgmem(&msg); }
  219. printf("\nDone.\n");
  220. status.total_msgs=status.last_msg=n-1;
  221. if((i=smb_putstatus(&smb))!=0)
  222.     printf("\nsmb_putstatus returned %d\n",i);
  223. smb_unlocksmbhdr(&smb);
  224. smb_close(&smb);
  225. return(0);
  226. }
  227.