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

  1. #line 1 "NETMAIL.C"
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. #include "sbbs.h"
  6. #include "qwk.h"
  7.  
  8. /****************************************************************************/
  9. /****************************************************************************/
  10. void inetmail(char *into, char *subj, char mode)
  11. {
  12.     char    str[256],str2[256],msgpath[256],title[256],name[256],ch
  13.             ,buf[SDT_BLOCK_LEN],*p,addr[256];
  14.     ushort    xlat=XLAT_NONE,net=NET_INTERNET;
  15.     int     i,j,x,file;
  16.     long    l;
  17.     ulong    length,offset;
  18.     FILE    *instream;
  19.     node_t    node;
  20.     smbmsg_t msg;
  21.  
  22. strcpy(name,into);
  23. strcpy(addr,into);
  24. strcpy(title,subj);
  25.  
  26. if((!SYSOP && !(inetmail_misc&NMAIL_ALLOW)) || useron.rest&FLAG('M')) {
  27.     bputs(text[NoNetMailAllowed]);
  28.     return; }
  29.  
  30. if(inetmail_cost && !(useron.exempt&FLAG('S'))) {
  31.     if(useron.cdt+useron.freecdt<inetmail_cost) {
  32.         bputs(text[NotEnoughCredits]);
  33.         return; }
  34.     sprintf(str,text[NetMailCostContinueQ],inetmail_cost);
  35.     if(noyes(str))
  36.         return; }
  37.  
  38. p=strrchr(name,'@');
  39. if(!p)
  40.     p=strrchr(name,'!');
  41. if(p) {
  42.     *p=0;
  43.     truncsp(name); }
  44. bprintf(text[NetMailing],name,addr
  45.     ,inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name
  46.     ,sys_inetaddr);
  47. action=NODE_SMAL;
  48. nodesync();
  49.  
  50. sprintf(msgpath,"%sNETMAIL.MSG",node_dir);
  51. if(!writemsg(msgpath,nulstr,title,mode,0,into)) {
  52.     bputs(text[Aborted]);
  53.     return; }
  54.  
  55. if(mode&WM_FILE) {
  56.     sprintf(str2,"%sFILE\\%04u.OUT",data_dir,useron.number);
  57.     mkdir(str2);
  58.     sprintf(str2,"%sFILE\\%04u.OUT\\%s",data_dir,useron.number,title);
  59.     if(fexist(str2)) {
  60.         bputs(text[FileAlreadyThere]);
  61.         remove(msgpath);
  62.         return; }
  63.     if(online==ON_LOCAL) {        /* Local upload */
  64.         bputs(text[EnterPath]);
  65.         if(!getstr(str,60,K_LINE|K_UPPER)) {
  66.             bputs(text[Aborted]);
  67.             remove(msgpath);
  68.             return; }
  69.         backslash(str);
  70.         strcat(str,title);
  71.         mv(str,str2,1); }
  72.     else { /* Remote */
  73.         menu("ULPROT");
  74.         mnemonics(text[ProtocolOrQuit]);
  75.         strcpy(str,"Q");
  76.         for(x=0;x<total_prots;x++)
  77.             if(prot[x]->ulcmd[0] && chk_ar(prot[x]->ar,useron)) {
  78.                 sprintf(tmp,"%c",prot[x]->mnemonic);
  79.                 strcat(str,tmp); }
  80.         ch=getkeys(str,0);
  81.         if(ch=='Q' || sys_status&SS_ABORT) {
  82.             bputs(text[Aborted]);
  83.             remove(msgpath);
  84.             return; }
  85.         for(x=0;x<total_prots;x++)
  86.             if(prot[x]->ulcmd[0] && prot[x]->mnemonic==ch
  87.                 && chk_ar(prot[x]->ar,useron))
  88.                 break;
  89.         if(x<total_prots)    /* This should be always */
  90.             protocol(cmdstr(prot[x]->ulcmd,str2,nulstr,NULL),0); }
  91.     l=flength(str2);
  92.     if(l>0)
  93.         bprintf(text[FileNBytesReceived],title,ultoac(l,tmp));
  94.     else {
  95.         bprintf(text[FileNotReceived],title);
  96.         remove(msgpath);
  97.         return; } }
  98.  
  99. if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) {
  100.     errormsg(WHERE,ERR_OPEN,"MAIL",i);
  101.     return; }
  102. sprintf(smb.file,"%sMAIL",data_dir);
  103. smb.retry_time=smb_retry_time;
  104. if((i=smb_open(&smb))!=0) {
  105.     smb_stack(&smb,SMB_STACK_POP);
  106.     errormsg(WHERE,ERR_OPEN,smb.file,i);
  107.     return; }
  108.  
  109. if(filelength(fileno(smb.shd_fp))<1) {     /* Create it if it doesn't exist */
  110.     smb.status.max_crcs=mail_maxcrcs;
  111.     smb.status.max_age=mail_maxage;
  112.     smb.status.max_msgs=MAX_SYSMAIL;
  113.     smb.status.attr=SMB_EMAIL;
  114.     if((i=smb_create(&smb))!=0) {
  115.         smb_close(&smb);
  116.         smb_stack(&smb,SMB_STACK_POP);
  117.         errormsg(WHERE,ERR_CREATE,smb.file,i);
  118.         return; } }
  119.  
  120. if((i=smb_locksmbhdr(&smb))!=0) {
  121.     smb_close(&smb);
  122.     smb_stack(&smb,SMB_STACK_POP);
  123.     errormsg(WHERE,ERR_LOCK,smb.file,i);
  124.     return; }
  125.  
  126. length=flength(msgpath)+2;     /* +2 for translation string */
  127.  
  128. if(length&0xfff00000UL) {
  129.     smb_unlocksmbhdr(&smb);
  130.     smb_close(&smb);
  131.     smb_stack(&smb,SMB_STACK_POP);
  132.     errormsg(WHERE,ERR_LEN,msgpath,length);
  133.     return; }
  134.  
  135. if((i=smb_open_da(&smb))!=0) {
  136.     smb_unlocksmbhdr(&smb);
  137.     smb_close(&smb);
  138.     smb_stack(&smb,SMB_STACK_POP);
  139.     errormsg(WHERE,ERR_OPEN,smb.file,i);
  140.     return; }
  141. if(sys_misc&SM_FASTMAIL)
  142.     offset=smb_fallocdat(&smb,length,1);
  143. else
  144.     offset=smb_allocdat(&smb,length,1);
  145. smb_close_da(&smb);
  146.  
  147. if((file=open(msgpath,O_RDONLY|O_BINARY))==-1
  148.     || (instream=fdopen(file,"rb"))==NULL) {
  149.     smb_freemsgdat(&smb,offset,length,1);
  150.     smb_unlocksmbhdr(&smb);
  151.     smb_close(&smb);
  152.     smb_stack(&smb,SMB_STACK_POP);
  153.     errormsg(WHERE,ERR_OPEN,msgpath,O_RDONLY|O_BINARY);
  154.     return; }
  155.  
  156. setvbuf(instream,NULL,_IOFBF,2*1024);
  157. fseek(smb.sdt_fp,offset,SEEK_SET);
  158. xlat=XLAT_NONE;
  159. fwrite(&xlat,2,1,smb.sdt_fp);
  160. x=SDT_BLOCK_LEN-2;                /* Don't read/write more than 255 */
  161. while(!feof(instream)) {
  162.     memset(buf,0,x);
  163.     j=fread(buf,1,x,instream);
  164.     if((j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR)
  165.         buf[j-1]=buf[j-2]=0;
  166.     fwrite(buf,j,1,smb.sdt_fp);
  167.     x=SDT_BLOCK_LEN; }
  168. fflush(smb.sdt_fp);
  169. fclose(instream);
  170.  
  171. memset(&msg,0,sizeof(smbmsg_t));
  172. memcpy(msg.hdr.id,"SHD\x1a",4);
  173. msg.hdr.version=SMB_VERSION;
  174. if(mode&WM_FILE)
  175.     msg.hdr.auxattr|=MSG_FILEATTACH;
  176. msg.hdr.when_written.time=msg.hdr.when_imported.time=time(NULL);
  177. msg.hdr.when_written.zone=msg.hdr.when_imported.zone=sys_timezone;
  178.  
  179. msg.hdr.offset=offset;
  180.  
  181. net=NET_INTERNET;
  182. smb_hfield(&msg,RECIPIENT,strlen(name),name);
  183. msg.idx.to=0;    /* Out-bound NetMail set to 0 */
  184. smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net);
  185. smb_hfield(&msg,RECIPIENTNETADDR,strlen(addr),addr);
  186.  
  187. strcpy(str,inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name);
  188. smb_hfield(&msg,SENDER,strlen(str),str);
  189.  
  190. sprintf(str,"%u",useron.number);
  191. smb_hfield(&msg,SENDEREXT,strlen(str),str);
  192. msg.idx.from=useron.number;
  193.  
  194. /*
  195. smb_hfield(&msg,SENDERNETTYPE,sizeof(net),&net);
  196. smb_hfield(&msg,SENDERNETADDR,strlen(sys_inetaddr),sys_inetaddr);
  197. */
  198.  
  199. smb_hfield(&msg,SUBJECT,strlen(title),title);
  200. strcpy(str,title);
  201. strlwr(str);
  202. msg.idx.subj=crc16(str);
  203.  
  204. smb_dfield(&msg,TEXT_BODY,length);
  205.  
  206. smb_unlocksmbhdr(&smb);
  207. i=smb_addmsghdr(&smb,&msg,SMB_SELFPACK);
  208. smb_close(&smb);
  209. smb_stack(&smb,SMB_STACK_POP);
  210.  
  211. smb_freemsgmem(&msg);
  212. if(i) {
  213.     smb_freemsgdat(&smb,offset,length,1);
  214.     errormsg(WHERE,ERR_WRITE,smb.file,i);
  215.     return; }
  216.  
  217. if(mode&WM_FILE && online==ON_REMOTE)
  218.     autohangup();
  219.  
  220. if(inetmail_sem[0])      /* update semaphore file */
  221.     if((file=nopen(inetmail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
  222.         close(file);
  223. if(!(useron.exempt&FLAG('S')))
  224.     subtract_cdt(inetmail_cost);
  225. sprintf(str,"Sent Internet Mail to %s (%s)",name,addr);
  226. logline("EN",str);
  227. }
  228.  
  229. void qnetmail(char *into, char *subj, char mode)
  230. {
  231.     char    str[256],str2[128],msgpath[128],title[128],to[128],fulladdr[128],ch
  232.             ,buf[SDT_BLOCK_LEN],*addr,*p;
  233.     ushort    xlat=XLAT_NONE,net=NET_QWK,touser;
  234.     int     i,j,x,file;
  235.     long    l;
  236.     ulong    length,offset;
  237.     FILE    *instream;
  238.     node_t    node;
  239.     smbmsg_t msg;
  240.  
  241. strcpy(to,into);
  242. strcpy(title,subj);
  243.  
  244. if(useron.rest&FLAG('M')) {
  245.     bputs(text[NoNetMailAllowed]);
  246.     return; }
  247.  
  248. addr=strrchr(to,'@');
  249. if(!addr) {
  250.     bputs("Invalid netmail address\r\n");
  251.     return; }
  252. *addr=0;
  253. addr++;
  254. strupr(addr);
  255. truncsp(addr);
  256. touser=qwk_route(addr,fulladdr);
  257. if(!fulladdr[0]) {
  258.     bputs("Invalid netmail address\r\n");
  259.     return; }
  260.  
  261. truncsp(to);
  262. if(!stricmp(to,"SBBS") && !SYSOP) {
  263.     bputs("Invalid netmail address\r\n");
  264.     return; }
  265. bprintf(text[NetMailing],to,fulladdr
  266.     ,useron.alias,sys_id);
  267. action=NODE_SMAL;
  268. nodesync();
  269.  
  270. sprintf(msgpath,"%sNETMAIL.MSG",node_dir);
  271. if(!writemsg(msgpath,nulstr,title,mode|WM_QWKNET,0,to)) {
  272.     bputs(text[Aborted]);
  273.     return; }
  274.  
  275. if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) {
  276.     errormsg(WHERE,ERR_OPEN,"MAIL",i);
  277.     return; }
  278. sprintf(smb.file,"%sMAIL",data_dir);
  279. smb.retry_time=smb_retry_time;
  280. if((i=smb_open(&smb))!=0) {
  281.     smb_stack(&smb,SMB_STACK_POP);
  282.     errormsg(WHERE,ERR_OPEN,smb.file,i);
  283.     return; }
  284.  
  285. if(filelength(fileno(smb.shd_fp))<1) {     /* Create it if it doesn't exist */
  286.     smb.status.max_crcs=mail_maxcrcs;
  287.     smb.status.max_msgs=MAX_SYSMAIL;
  288.     smb.status.max_age=mail_maxage;
  289.     smb.status.attr=SMB_EMAIL;
  290.     if((i=smb_create(&smb))!=0) {
  291.         smb_close(&smb);
  292.         smb_stack(&smb,SMB_STACK_POP);
  293.         errormsg(WHERE,ERR_CREATE,smb.file,i);
  294.         return; } }
  295.  
  296. if((i=smb_locksmbhdr(&smb))!=0) {
  297.     smb_close(&smb);
  298.     smb_stack(&smb,SMB_STACK_POP);
  299.     errormsg(WHERE,ERR_LOCK,smb.file,i);
  300.     return; }
  301.  
  302. length=flength(msgpath)+2;     /* +2 for translation string */
  303.  
  304. if(length&0xfff00000UL) {
  305.     smb_unlocksmbhdr(&smb);
  306.     smb_close(&smb);
  307.     smb_stack(&smb,SMB_STACK_POP);
  308.     errormsg(WHERE,ERR_LEN,msgpath,length);
  309.     return; }
  310.  
  311. if((i=smb_open_da(&smb))!=0) {
  312.     smb_unlocksmbhdr(&smb);
  313.     smb_close(&smb);
  314.     smb_stack(&smb,SMB_STACK_POP);
  315.     errormsg(WHERE,ERR_OPEN,smb.file,i);
  316.     return; }
  317. if(sys_misc&SM_FASTMAIL)
  318.     offset=smb_fallocdat(&smb,length,1);
  319. else
  320.     offset=smb_allocdat(&smb,length,1);
  321. smb_close_da(&smb);
  322.  
  323. if((file=open(msgpath,O_RDONLY|O_BINARY))==-1
  324.     || (instream=fdopen(file,"rb"))==NULL) {
  325.     smb_freemsgdat(&smb,offset,length,1);
  326.     smb_unlocksmbhdr(&smb);
  327.     smb_close(&smb);
  328.     smb_stack(&smb,SMB_STACK_POP);
  329.     errormsg(WHERE,ERR_OPEN,msgpath,O_RDONLY|O_BINARY);
  330.     return; }
  331.  
  332. setvbuf(instream,NULL,_IOFBF,2*1024);
  333. fseek(smb.sdt_fp,offset,SEEK_SET);
  334. xlat=XLAT_NONE;
  335. fwrite(&xlat,2,1,smb.sdt_fp);
  336. x=SDT_BLOCK_LEN-2;                /* Don't read/write more than 255 */
  337. while(!feof(instream)) {
  338.     memset(buf,0,x);
  339.     j=fread(buf,1,x,instream);
  340.     if((j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR)
  341.         buf[j-1]=buf[j-2]=0;
  342.     fwrite(buf,j,1,smb.sdt_fp);
  343.     x=SDT_BLOCK_LEN; }
  344. fflush(smb.sdt_fp);
  345. fclose(instream);
  346.  
  347. memset(&msg,0,sizeof(smbmsg_t));
  348. memcpy(msg.hdr.id,"SHD\x1a",4);
  349. msg.hdr.version=SMB_VERSION;
  350. if(mode&WM_FILE)
  351.     msg.hdr.auxattr|=MSG_FILEATTACH;
  352. msg.hdr.when_written.time=msg.hdr.when_imported.time=time(NULL);
  353. msg.hdr.when_written.zone=msg.hdr.when_imported.zone=sys_timezone;
  354.  
  355. msg.hdr.offset=offset;
  356.  
  357. net=NET_QWK;
  358. smb_hfield(&msg,RECIPIENT,strlen(to),to);
  359. msg.idx.to=touser;
  360. smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net);
  361. smb_hfield(&msg,RECIPIENTNETADDR,strlen(fulladdr),fulladdr);
  362.  
  363. smb_hfield(&msg,SENDER,strlen(useron.alias),useron.alias);
  364.  
  365. sprintf(str,"%u",useron.number);
  366. smb_hfield(&msg,SENDEREXT,strlen(str),str);
  367. msg.idx.from=useron.number;
  368.  
  369. smb_hfield(&msg,SUBJECT,strlen(title),title);
  370. strcpy(str,title);
  371. strlwr(str);
  372. msg.idx.subj=crc16(str);
  373.  
  374. smb_dfield(&msg,TEXT_BODY,length);
  375.  
  376. smb_unlocksmbhdr(&smb);
  377. i=smb_addmsghdr(&smb,&msg,SMB_SELFPACK);
  378. smb_close(&smb);
  379. smb_stack(&smb,SMB_STACK_POP);
  380.  
  381. smb_freemsgmem(&msg);
  382. if(i) {
  383.     smb_freemsgdat(&smb,offset,length,1);
  384.     errormsg(WHERE,ERR_WRITE,smb.file,i);
  385.     return; }
  386.  
  387. sprintf(str,"Sent QWK NetMail to %s (%s)",to,fulladdr);
  388. logline("EN",str);
  389. }
  390.