home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / SBL / SBL2SMB.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-25  |  8.2 KB  |  331 lines

  1. /* SBL2SMB.C */
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. /* Scans SBL database and posts any additions/updates into the an SMB base */
  6.  
  7. #define  uint unsigned int
  8.  
  9. #include <dos.h>
  10. #include "smblib.h"
  11. #include "sbldefs.h"
  12.  
  13. smb_t        smb;
  14. extern int    daylight=0;
  15. extern long timezone=0L;
  16.  
  17. unsigned    _stklen=16000;
  18.  
  19. /****************************************************************************/
  20. /* Checks the disk drive for the existence of a file. Returns 1 if it       */
  21. /* exists, 0 if it doesn't.                                                 */
  22. /****************************************************************************/
  23. char fexist(char *filespec)
  24. {
  25.     struct ffblk f;
  26.  
  27. if(findfirst(filespec,&f,0)==0)
  28.     return(1);
  29. return(0);
  30. }
  31.  
  32.  
  33. /****************************************************************************/
  34. /* Updates 16-bit "rcrc" with character 'ch'                                */
  35. /****************************************************************************/
  36. void ucrc16(uchar ch, ushort *rcrc) {
  37.     ushort i, cy;
  38.     uchar nch=ch;
  39.  
  40. for (i=0; i<8; i++) {
  41.     cy=*rcrc & 0x8000;
  42.     *rcrc<<=1;
  43.     if (nch & 0x80) *rcrc |= 1;
  44.     nch<<=1;
  45.     if (cy) *rcrc ^= 0x1021; }
  46. }
  47.  
  48. /****************************************************************************/
  49. /* Returns 16-crc of string (not counting terminating NULL)                 */
  50. /****************************************************************************/
  51. ushort crc16(char *str)
  52. {
  53.     int     i=0;
  54.     ushort    crc=0;
  55.  
  56. ucrc16(0,&crc);
  57. while(str[i])
  58.     ucrc16(str[i++],&crc);
  59. ucrc16(0,&crc);
  60. ucrc16(0,&crc);
  61. return(crc);
  62. }
  63.  
  64.  
  65. /****************************************************************************/
  66. /* Converts unix time format (long - time_t) into a char str MM/DD/YY        */
  67. /****************************************************************************/
  68. char *unixtodstr(time_t unix, char *str)
  69. {
  70.     struct time curtime;
  71.     struct date date;
  72.  
  73. if(!unix)
  74.     strcpy(str,"00/00/00");
  75. else {
  76.     unixtodos(unix,&date,&curtime);
  77.     if((unsigned)date.da_mon>12) {      /* DOS leap year bug */
  78.         date.da_mon=1;
  79.         date.da_year++; }
  80.     if((unsigned)date.da_day>31)
  81.         date.da_day=1;
  82.     sprintf(str,"%02u/%02u/%02u",date.da_mon,date.da_day
  83.         ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); }
  84. return(str);
  85. }
  86.  
  87. #define BUF_LEN 8192
  88.  
  89. int main(int argc, char **argv)
  90. {
  91.     uchar    str[128],tmp[128],buf[BUF_LEN],*p,software[128];
  92.     int     i,file;
  93.     ushort    xlat;
  94.     long    length;
  95.     ulong    offset;
  96.     time_t    last,t;
  97.     bbs_t    bbs;
  98.     smbmsg_t msg;
  99.     smbstatus_t status;
  100.     FILE    *stream;
  101.  
  102. fprintf(stderr,"\nSBL2SMB v2.00 - Write SBL to SMB - Developed 1994-1997 "
  103.     "Rob Swindell\n\n");
  104. if(argc<3) {
  105.     fprintf(stderr,"usage: sbl2smb <sbl.dab> <smb_file> [/s:software]\n\n");
  106.     fprintf(stderr,"ex: sbl2smb c:\\sbbs\\xtrn\\sbl\\sbl.dab "
  107.         "c:\\sbbs\\data\\subs\\syncdata /s:syn\n");
  108.     return(1); }
  109.  
  110. software[0]=0;
  111. if(argc>3 && !strnicmp(argv[3],"/S:",3))
  112.     strcpy(software,argv[3]+3);
  113.  
  114. strcpy(smb.file,argv[2]);
  115. strupr(smb.file);
  116.  
  117. strcpy(str,argv[1]);
  118. strupr(str);
  119. if((file=open(str,O_RDONLY|O_BINARY|O_DENYNONE))==-1) {
  120.     printf("error opening %s\n",str);
  121.     return(1); }
  122. if((stream=fdopen(file,"rb"))==NULL) {
  123.     printf("error fdopening %s\n",str);
  124.     return(1); }
  125. strcpy(tmp,str);
  126. p=strrchr(tmp,'.');
  127. if(p) {
  128.     (*p)=0;
  129.     strcat(tmp,"2SMB.DAB");
  130.     if((file=open(tmp,O_RDWR|O_BINARY|O_CREAT,S_IWRITE|S_IREAD))==-1) {
  131.         printf("error opening %s\n",str);
  132.         return(1); }
  133.     t=time(NULL);
  134.     if(read(file,&last,sizeof(time_t))!=sizeof(time_t))
  135.         last=t;
  136.     lseek(file,0L,SEEK_SET);
  137.     write(file,&t,sizeof(time_t));
  138.     close(file); }
  139.  
  140. sprintf(str,"%s.SHD",smb.file);
  141. if(!fexist(str)) {
  142.     printf("%s doesn't exist\n",smb.file);
  143.     return(0); }
  144. fprintf(stderr,"Opening %s\n",smb.file);
  145. smb.retry_time=30;
  146. if((i=smb_open(&smb))!=0) {
  147.     printf("smb_open returned %d\n",i);
  148.     return(1); }
  149. i=smb_locksmbhdr(&smb);
  150. if(i) {
  151.     printf("smb_locksmbhdr returned %d\n",i);
  152.     return(1); }
  153. i=smb_getstatus(&smb);
  154. smb_unlocksmbhdr(&smb);
  155. if(i) {
  156.     printf("smb_getstatus returned %d\n",i);
  157.     return(1); }
  158.  
  159. while(!feof(stream)) {
  160.     if(!fread(&bbs,sizeof(bbs_t),1,stream))
  161.         break;
  162.     if(!bbs.name[0] || bbs.misc&FROM_SMB
  163.         || (bbs.updated<last && bbs.created<last))
  164.         continue;
  165.     if(software[0] && strnicmp(software,bbs.software,strlen(software)))
  166.         continue;
  167.  
  168.     printf("%s\r\n",bbs.name);
  169.     memset(buf,0,BUF_LEN);
  170.  
  171.     sprintf(str,"%-15.15s%s\r\n"
  172.         ,"Name:",bbs.name);
  173.     strcat(buf,str);
  174.  
  175.     sprintf(str,"%-15.15s%s\r\n"
  176.         ,"Birth:",unixtodstr(bbs.birth,tmp));
  177.     strcat(buf,str);
  178.  
  179.     sprintf(str,"%-15.15s%s\r\n"
  180.         ,"Software:",bbs.software);
  181.     strcat(buf,str);
  182.  
  183.     for(i=0;i<bbs.total_sysops;i++) {
  184.         sprintf(str,"%-15.15s%s\r\n"
  185.             ,"Sysop:",bbs.sysop[i]);
  186.         strcat(buf,str); }
  187.  
  188.     strcat(buf,"\r\n");
  189.     for(i=0;i<bbs.total_numbers;i++) {
  190.         sprintf(str,"%-15.15s%s\r\n"
  191.             ,"Number:",bbs.number[i].number);
  192.         strcat(buf,str);
  193.         sprintf(str,"%-15.15s%s\r\n"
  194.             ,"Modem:",bbs.number[i].modem);
  195.         strcat(buf,str);
  196.         sprintf(str,"%-15.15s%s\r\n"
  197.             ,"Location:",bbs.number[i].location);
  198.         strcat(buf,str);
  199.         sprintf(str,"%-15.15s%u\r\n"
  200.             ,"MinRate:",bbs.number[i].min_rate);
  201.         strcat(buf,str);
  202.         sprintf(str,"%-15.15s%u\r\n"
  203.             ,"MaxRate:",bbs.number[i].max_rate);
  204.         strcat(buf,str);
  205.         if(i+1<bbs.total_numbers)
  206.             strcat(buf,"\r\n"); }
  207.  
  208.     if(bbs.total_networks)
  209.         strcat(buf,"\r\n");
  210.     for(i=0;i<bbs.total_networks;i++) {
  211.         sprintf(str,"%-15.15s%s\r\n"
  212.             ,"Network:",bbs.network[i]);
  213.         strcat(buf,str);
  214.         sprintf(str,"%-15.15s%s\r\n"
  215.             ,"Address:",bbs.address[i]);
  216.         strcat(buf,str);
  217.         if(i+1<bbs.total_networks)
  218.             strcat(buf,"\r\n"); }
  219.  
  220.     strcat(buf,"\r\n");
  221.     for(i=0;i<bbs.total_terminals;i++) {
  222.         sprintf(str,"%-15.15s%s\r\n"
  223.             ,"Terminal:",bbs.terminal[i]);
  224.         strcat(buf,str); }
  225.  
  226.     strcat(buf,"\r\n");
  227.     sprintf(str,"%-15.15s%lu\r\n"
  228.         ,"Megs:",bbs.megs);
  229.     strcat(buf,str);
  230.     sprintf(str,"%-15.15s%lu\r\n"
  231.         ,"Msgs:",bbs.msgs);
  232.     strcat(buf,str);
  233.     sprintf(str,"%-15.15s%lu\r\n"
  234.         ,"Files:",bbs.files);
  235.     strcat(buf,str);
  236.     sprintf(str,"%-15.15s%u\r\n"
  237.         ,"Nodes:",bbs.nodes);
  238.     strcat(buf,str);
  239.     sprintf(str,"%-15.15s%u\r\n"
  240.         ,"Users:",bbs.users);
  241.     strcat(buf,str);
  242.     sprintf(str,"%-15.15s%u\r\n"
  243.         ,"Subs:",bbs.subs);
  244.     strcat(buf,str);
  245.     sprintf(str,"%-15.15s%u\r\n"
  246.         ,"Dirs:",bbs.dirs);
  247.     strcat(buf,str);
  248.     sprintf(str,"%-15.15s%u\r\n"
  249.         ,"Xtrns:",bbs.xtrns);
  250.     strcat(buf,str);
  251.  
  252.     if(bbs.desc[0][0])
  253.         strcat(buf,"\r\n");
  254.     for(i=0;i<5;i++) {
  255.         if(!bbs.desc[i][0])
  256.             break;
  257.         sprintf(str,"%-15.15s%s\r\n"
  258.             ,"Desc:",bbs.desc[i]);
  259.         strcat(buf,str); }
  260.  
  261.     strcat(buf,"\r\n--- SBL2SMB v1.10");
  262.  
  263.     length=strlen(buf);   /* +2 for translation string */
  264.  
  265.     if(status.attr&SMB_HYPERALLOC)
  266.         offset=smb_hallocdat(&smb);
  267.     else {
  268.         i=smb_open_da(&smb);
  269.         if(i) {
  270.             printf("smb_open_da returned %d\n",i);
  271.             exit(1); }
  272.         offset=smb_allocdat(&smb,length+2,1);
  273.         fclose(smb.sda_fp); }
  274.  
  275.     fseek(smb.sdt_fp,offset,SEEK_SET);
  276.     xlat=XLAT_NONE;
  277.     fwrite(&xlat,2,1,smb.sdt_fp);
  278.     fwrite(buf,length,1,smb.sdt_fp);
  279.     length+=2;
  280.  
  281.     memset(&msg,0,sizeof(smbmsg_t));
  282.     memcpy(msg.hdr.id,"SHD\x1a",4);
  283.     msg.hdr.version=SMB_VERSION;
  284.     msg.hdr.when_written.time=time(NULL);
  285.     
  286.     msg.hdr.offset=offset;
  287.  
  288.     strcpy(str,"SBL");
  289.     i=smb_hfield(&msg,RECIPIENT,strlen(str),str);
  290.     if(i) {
  291.         printf("smb_hfield returned %d\n",i);
  292.         smb_freemsgdat(&smb,offset,length,1);
  293.         exit(1); }
  294.     strlwr(str);
  295.     msg.idx.to=crc16(str);
  296.  
  297.     strcpy(str,bbs.user);
  298.     i=smb_hfield(&msg,SENDER,strlen(str),str);
  299.     if(i) {
  300.         printf("smb_hfield returned %d\n",i);
  301.         smb_freemsgdat(&smb,offset,length,1);
  302.         exit(1); }
  303.     strlwr(str);
  304.     msg.idx.from=crc16(str);
  305.  
  306.     strcpy(str,bbs.name);
  307.     i=smb_hfield(&msg,SUBJECT,strlen(str),str);
  308.     if(i) {
  309.         printf("smb_hfield returned %d\n",i);
  310.         smb_freemsgdat(&smb,offset,length,1);
  311.         exit(1); }
  312.     strlwr(str);
  313.     msg.idx.subj=crc16(str);
  314.  
  315.     i=smb_dfield(&msg,TEXT_BODY,length);
  316.     if(i) {
  317.         printf("smb_dfield returned %d\n",i);
  318.         smb_freemsgdat(&smb,offset,length,1);
  319.         exit(1); }
  320.  
  321.     i=smb_addmsghdr(&smb,&msg,status.attr&SMB_HYPERALLOC);
  322.     if(i) {
  323.         printf("smb_addmsghdr returned %d\n",i);
  324.         smb_freemsgdat(&smb,offset,length,1);
  325.         exit(1); }
  326.     smb_freemsgmem(&msg); }
  327. return(0);
  328. }
  329.  
  330. /* End of SBL2SMB.C */
  331.