home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / SMM / OUTPHOTO.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-26  |  8.0 KB  |  348 lines

  1. /* OUTPHOTO.C */
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. /* Scans SMM database and posts any photographs into the an SMB base */
  6.  
  7. #define  uint unsigned int
  8.  
  9. #include <dos.h>
  10. #include <share.h>
  11. #include "smblib.h"
  12. #include "smmdefs.h"
  13. #include "crc32.h"
  14.  
  15. #define DAYS 15L             // Hatch every 15 days
  16.  
  17. smb_t smb;
  18. extern int daylight=0;
  19. extern long timezone=0L;
  20.  
  21. unsigned _stklen=16000;           /* Set stack size in code, not header */
  22.  
  23. /****************************************************************************/
  24. /* Checks the disk drive for the existence of a file. Returns 1 if it       */
  25. /* exists, 0 if it doesn't.                                                 */
  26. /****************************************************************************/
  27. char fexist(char *filespec)
  28. {
  29.     struct ffblk f;
  30.  
  31. if(findfirst(filespec,&f,0)==0)
  32.     return(1);
  33. return(0);
  34. }
  35.  
  36.  
  37. /****************************************************************************/
  38. /* Updates 16-bit "rcrc" with character 'ch'                                */
  39. /****************************************************************************/
  40. void ucrc16(uchar ch, ushort *rcrc) {
  41.     ushort i, cy;
  42.     uchar nch=ch;
  43.  
  44. for (i=0; i<8; i++) {
  45.     cy=*rcrc & 0x8000;
  46.     *rcrc<<=1;
  47.     if (nch & 0x80) *rcrc |= 1;
  48.     nch<<=1;
  49.     if (cy) *rcrc ^= 0x1021; }
  50. }
  51.  
  52. /****************************************************************************/
  53. /* Returns 16-crc of string (not counting terminating NULL)                 */
  54. /****************************************************************************/
  55. ushort crc16(char *str)
  56. {
  57.     int     i=0;
  58.     ushort    crc=0;
  59.  
  60. ucrc16(0,&crc);
  61. while(str[i])
  62.     ucrc16(str[i++],&crc);
  63. ucrc16(0,&crc);
  64. ucrc16(0,&crc);
  65. return(crc);
  66. }
  67.  
  68. /****************************************************************************/
  69. /* Returns 32-crc of string (not counting terminating NULL)                 */
  70. /****************************************************************************/
  71. ulong crc32(char *str)
  72. {
  73.     int i=0;
  74.     ulong crc=0xffffffffUL;
  75.  
  76.     while(str[i])
  77.         crc=ucrc32(str[i++],crc);
  78.     crc=~crc;
  79.     return(crc);
  80. }
  81.  
  82.  
  83. char *base41(unsigned int i, char *str)
  84. {
  85.     char c;
  86.     unsigned int j=41*41,k;
  87.  
  88. for(c=0;c<3;c++) {
  89.     k=i/j;
  90.     str[c]='0'+k;
  91.     i-=(k*j);
  92.     j/=41;
  93.     if(str[c]>=':')
  94.         str[c]='A'+(str[c]-':');
  95.     if(str[c]>='[')
  96.         str[c]='#'+(str[c]-'['); }
  97. str[c]=0;
  98. return(str);
  99. }
  100.  
  101.  
  102.  
  103. time_t checktime()
  104. {
  105.     struct tm tm;
  106.  
  107. memset(&tm,0,sizeof(tm));
  108. tm.tm_year=94;
  109. tm.tm_mday=1;
  110. return(mktime(&tm)^0x2D24BD00L);
  111. }
  112.  
  113. #define BUF_LEN 8192
  114.  
  115. int main(int argc, char **argv)
  116. {
  117.     uchar    str[128],tmp[128],buf[BUF_LEN],fname[64],path[128],*p,ch;
  118.     int     i,j,file,in,linelen,all=0;
  119.     ushort    xlat;
  120.     long    length,l;
  121.     ulong    offset,crc;
  122.     time_t    now;
  123.     struct    ffblk ff;
  124.     user_t    user;
  125.     smbmsg_t msg;
  126.     FILE    *stream;
  127.  
  128. fprintf(stderr,"\nOUTPHOTO %s - Write SMM photos to SMB - Developed 1995-1997 "
  129.     "Rob Swindell\n\n",__DATE__);
  130.  
  131. if(checktime()) {
  132.     printf("Time problem!\n");
  133.     return(-1); }
  134.  
  135. if(argc<3) {
  136.     fprintf(stderr,"usage: outphoto <smm.dab> <smb_file>\n\n");
  137.     fprintf(stderr,"example: outphoto c:\\sbbs\\xtrn\\smm\\smm.dab "
  138.         "c:\\sbbs\\data\\subs\\syncdata\n");
  139.     return(1); }
  140.  
  141. for(i=3;i<argc;i++)
  142.     if(!stricmp(argv[i],"/ALL"))
  143.         all=1;
  144.  
  145. strcpy(smb.file,argv[2]);
  146. strupr(smb.file);
  147.  
  148. strcpy(str,argv[1]);
  149. strupr(str);
  150. if((file=open(str,O_RDWR|O_BINARY|O_DENYNONE))==-1) {
  151.     printf("error opening %s\n",str);
  152.     return(1); }
  153. if((stream=fdopen(file,"w+b"))==NULL) {
  154.     printf("error fdopening %s\n",str);
  155.     return(1); }
  156. setvbuf(stream,NULL,_IOFBF,4096);
  157.  
  158. sprintf(str,"%s.SHD",smb.file);
  159. if(!fexist(str)) {
  160.     printf("%s doesn't exist\n",smb.file);
  161.     return(0); }
  162. fprintf(stderr,"Opening %s\n",smb.file);
  163. smb.retry_time=30;
  164. if((i=smb_open(&smb))!=0) {
  165.     printf("smb_open returned %d\n",i);
  166.     return(1); }
  167.  
  168. now=time(NULL);
  169. while(!feof(stream)) {
  170.     if(!fread(&user,sizeof(user_t),1,stream))
  171.         break;
  172.  
  173.     if(user.misc&USER_DELETED || !(user.misc&USER_PHOTO))
  174.         continue;
  175.  
  176.     printf("Photo: %-25.25s  %.24s  "
  177.         ,user.name,ctime(&user.photo));
  178.  
  179.     if(user.photo && now-user.photo<DAYS*24L*60L*60L && !all) {
  180.         printf("skipping\n");
  181.         continue; }
  182.     printf("hatching\n");
  183.  
  184.     for(i=0;user.system[i];i++)
  185.         if(isalnum(user.system[i]))
  186.             break;
  187.     if(!user.system[i])
  188.         fname[0]='~';
  189.     else
  190.         fname[0]=user.system[i];
  191.     for(i=strlen(user.system)-1;i>0;i--)
  192.         if(isalnum(user.system[i]))
  193.             break;
  194.     if(i<=0)
  195.         fname[1]='~';
  196.     else
  197.         fname[1]=user.system[i];
  198.     fname[2]=0;
  199.     strcpy(str,user.system);
  200.     strupr(str);
  201.     strcat(fname,base41(crc16(str),tmp));
  202.     strcat(fname,base41(user.number,tmp));
  203.     strcpy(path,argv[1]);
  204.     p=strchr(path,'\\');
  205.     if(p) *(p+1)=0;
  206.     else path[0]=0;
  207.     sprintf(str,"%sPHOTO\\%s.*",path,fname);
  208.     if(findfirst(str,&ff,0)) {
  209.         printf("%s doesn't exist!\n",str);
  210.         continue; }
  211.     strcpy(fname,ff.ff_name);
  212.     strcpy(path,argv[1]);
  213.     p=strchr(path,'\\');
  214.     if(p) *(p+1)=0;
  215.     else path[0]=0;
  216.     sprintf(str,"%sPHOTO\\%s",path,fname);
  217.  
  218.     printf("Exporting %s",str);
  219.     if((in=open(str,O_RDONLY|O_BINARY|SH_DENYWR))==-1) {
  220.         printf("\nError opening %s\n",str);
  221.         continue; }
  222.  
  223.     memset(buf,0,BUF_LEN);
  224.     crc=0xffffffffUL;
  225.     linelen=0;
  226.     sprintf(buf,"%lx\r\n",filelength(in)^4096);
  227.     l=strlen(buf);
  228.     while(l<(BUF_LEN-128)) {
  229.         if(!read(in,&ch,1))
  230.             break;
  231.         crc=ucrc32(ch,crc);
  232.         if(ch=='`') {
  233.             buf[l++]='`';
  234.             buf[l++]='`';
  235.             linelen++; }
  236.         else if(ch==0xff)
  237.             buf[l++]='\xee';
  238.         else if(ch<0xf)
  239.             buf[l++]=ch|0xf0;
  240.         else if(ch<0x20) {
  241.             buf[l++]='`';
  242.             buf[l++]=ch+'@';
  243.             linelen++; }
  244.         else if(ch>=0xf0) {
  245.             sprintf(str,"`%x",ch&0xf);
  246.             buf[l++]=str[0];
  247.             buf[l++]=str[1];
  248.             linelen++; }
  249.         else if(ch==0xe3) {
  250.             buf[l++]='`';
  251.             buf[l++]='g';
  252.             linelen++; }
  253.         else if(ch==0x8d) {
  254.             buf[l++]='`';
  255.             buf[l++]='h';
  256.             linelen++; }
  257.         else if(ch==0xee) {
  258.             buf[l++]='`';
  259.             buf[l++]='i';
  260.             linelen++; }
  261.         else
  262.             buf[l++]=ch;
  263.         linelen++;
  264.         if(linelen>=70) {
  265.             buf[l++]=CR;
  266.             buf[l++]=LF;
  267.             linelen=0; } }
  268.     buf[l]=0;
  269.     crc=~crc;
  270.     sprintf(str,"%lx\r\n--- OUTPHOTO %s",time(NULL),__DATE__);
  271.     strcat(buf,str);
  272.     printf("\n");
  273.  
  274.     length=strlen(buf);   /* +2 for translation string */
  275.  
  276.     if(smb.status.attr&SMB_HYPERALLOC)
  277.         offset=smb_hallocdat(&smb);
  278.     else {
  279.         i=smb_open_da(&smb);
  280.         if(i) {
  281.             printf("smb_open_da returned %d\n",i);
  282.             exit(1); }
  283.         offset=smb_allocdat(&smb,length+2,1);
  284.         fclose(smb.sda_fp); }
  285.  
  286.     fseek(smb.sdt_fp,offset,SEEK_SET);
  287.     xlat=XLAT_NONE;
  288.     fwrite(&xlat,2,1,smb.sdt_fp);
  289.     fwrite(buf,length,1,smb.sdt_fp);
  290.     length+=2;
  291.  
  292.     memset(&msg,0,sizeof(smbmsg_t));
  293.     memcpy(msg.hdr.id,"SHD\x1a",4);
  294.     msg.hdr.version=SMB_VERSION;
  295.     msg.hdr.when_written.time=time(NULL);
  296.     
  297.     msg.hdr.offset=offset;
  298.  
  299.     strcpy(str,"SMM PHOTO");
  300.     i=smb_hfield(&msg,RECIPIENT,strlen(str),str);
  301.     if(i) {
  302.         printf("smb_hfield returned %d\n",i);
  303.         smb_freemsgdat(&smb,offset,length,1);
  304.         exit(1); }
  305.     strlwr(str);
  306.     msg.idx.to=crc16(str);
  307.  
  308.     strcpy(str,"Digital Dynamics");
  309.     i=smb_hfield(&msg,SENDER,strlen(str),str);
  310.     if(i) {
  311.         printf("smb_hfield returned %d\n",i);
  312.         smb_freemsgdat(&smb,offset,length,1);
  313.         exit(1); }
  314.     strlwr(str);
  315.     msg.idx.from=crc16(str);
  316.  
  317.     sprintf(tmp,"%.25s",user.system);
  318.     strupr(tmp);
  319.     sprintf(str,"%04lx%08lx%08lx%.3s"
  320.         ,user.number^0x191L,crc32(tmp)^0x90120e71L,crc^0x05296328L,fname+9);
  321.     i=smb_hfield(&msg,SUBJECT,strlen(str),str);
  322.     if(i) {
  323.         printf("smb_hfield returned %d\n",i);
  324.         smb_freemsgdat(&smb,offset,length,1);
  325.         exit(1); }
  326.     strlwr(str);
  327.     msg.idx.subj=crc16(str);
  328.  
  329.     i=smb_dfield(&msg,TEXT_BODY,length);
  330.     if(i) {
  331.         printf("smb_dfield returned %d\n",i);
  332.         smb_freemsgdat(&smb,offset,length,1);
  333.         exit(1); }
  334.  
  335.     i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC);
  336.     if(i) {
  337.         printf("smb_addmsghdr returned %d\n",i);
  338.         smb_freemsgdat(&smb,offset,length,1);
  339.         exit(1); }
  340.     smb_freemsgmem(&msg);
  341.     fseek(stream,ftell(stream)-sizeof(user_t),SEEK_SET);
  342.     user.photo=time(NULL);
  343.     fwrite(&user,sizeof(user_t),1,stream);
  344.     fseek(stream,ftell(stream),SEEK_SET); }
  345. return(0);
  346. }
  347.  
  348.