|
|
1.1 root 1: #line 1 "FIDO.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: /*********************************************/
6: /* Functions that pertain solely to FidoNet */
7: /*********************************************/
8:
9: #include "sbbs.h"
10:
11: extern char *mon[];
12: void inetmail(char *into, char *subj, char mode);
13: void qnetmail(char *into, char *subj, char mode);
14: int qwk_route(char *inaddr, char *fulladdr);
15:
16: void pt_zone_kludge(fmsghdr_t hdr,int fido)
17: {
18: char str[256];
19:
20: sprintf(str,"\1INTL %u:%u/%u %u:%u/%u\r"
21: ,hdr.destzone,hdr.destnet,hdr.destnode
22: ,hdr.origzone,hdr.orignet,hdr.orignode);
23: write(fido,str,strlen(str));
24:
25: if(hdr.destpoint) {
26: sprintf(str,"\1TOPT %u\r"
27: ,hdr.destpoint);
28: write(fido,str,strlen(str)); }
29:
30: if(hdr.origpoint) {
31: sprintf(str,"\1FMPT %u\r"
32: ,hdr.origpoint);
33: write(fido,str,strlen(str)); }
34: }
35:
36: int lookup_netuser(char *into)
37: {
38: char to[128],name[26],str[256],q[128];
39: int i;
40: FILE *stream;
41:
42: if(strchr(into,'@'))
43: return(0);
44: strcpy(to,into);
45: strupr(to);
46: sprintf(str,"%sQNET\\USERS.DAT",data_dir);
47: if((stream=fnopen(&i,str,O_RDONLY))==NULL)
48: return(0);
49: while(!feof(stream)) {
50: if(!fgets(str,250,stream))
51: break;
52: str[25]=0;
53: truncsp(str);
54: strcpy(name,str);
55: strupr(name);
56: str[35]=0;
57: truncsp(str+27);
58: sprintf(q,"Do you mean %s @%s",str,str+27);
59: if(strstr(name,to) && yesno(q)) {
60: fclose(stream);
61: sprintf(into,"%s@%s",str,str+27);
62: return(0); }
63: if(sys_status&SS_ABORT)
64: break; }
65: fclose(stream);
66: return(1);
67: }
68:
69: /****************************************************************************/
70: /* Send FidoNet NetMail from BBS */
71: /****************************************************************************/
72: void netmail(char *into, char *title, char mode)
73: {
74: char str[256],subj[128],to[256],fname[128],*buf,*p,ch;
75: int file,fido,x,cc_found,cc_sent;
76: uint i;
77: long length,l;
78: faddr_t addr;
79: fmsghdr_t hdr;
80:
81: sprintf(subj,"%.127s",title);
82:
83:
84: strcpy(to,into);
85:
86: lookup_netuser(to);
87:
88: p=strrchr(to,'@'); /* Find '@' in name@addr */
89: if(p && !isdigit(*(p+1)) && !strchr(p,'.') && !strchr(p,':')) {
90: mode&=~WM_FILE;
91: qnetmail(to,title,mode|WM_NETMAIL);
92: return; }
93: if(p==NULL || !strchr(p+1,'/') || !total_faddrs) {
94: if(!p && dflt_faddr.zone)
95: addr=dflt_faddr;
96: else if(inetmail_misc&NMAIL_ALLOW) {
97: if(mode&WM_FILE && !SYSOP && !(inetmail_misc&NMAIL_FILE))
98: mode&=~WM_FILE;
99: inetmail(into,title,mode|WM_NETMAIL);
100: return; }
101: else if(dflt_faddr.zone)
102: addr=dflt_faddr;
103: else {
104: bprintf("\1n\r\nInvalid NetMail address.\r\n");
105: return; } }
106: else {
107: addr=atofaddr(p+1); /* Get fido address */
108: *p=0; /* Chop off address */
109: }
110:
111: if(mode&WM_FILE && !SYSOP && !(netmail_misc&NMAIL_FILE))
112: mode&=~WM_FILE;
113:
114: if((!SYSOP && !(netmail_misc&NMAIL_ALLOW)) || useron.rest&FLAG('M')
115: || !total_faddrs) {
116: bputs(text[NoNetMailAllowed]);
117: return; }
118:
119: truncsp(to); /* Truncate off space */
120:
121: memset(&hdr,0,sizeof(hdr)); /* Initialize header to null */
122: strcpy(hdr.from,netmail_misc&NMAIL_ALIAS ? useron.alias : useron.name);
123: sprintf(hdr.to,"%.35s",to);
124:
125: /* Look-up in nodelist? */
126:
127: if(netmail_cost && !(useron.exempt&FLAG('S'))) {
128: if(useron.cdt+useron.freecdt<netmail_cost) {
129: bputs(text[NotEnoughCredits]);
130: return; }
131: sprintf(str,text[NetMailCostContinueQ],netmail_cost);
132: if(noyes(str))
133: return; }
134:
135:
136: now=time(NULL);
137: unixtodos(now,&date,&curtime);
138: sprintf(hdr.time,"%02u %3.3s %02u %02u:%02u:%02u"
139: ,date.da_day,mon[date.da_mon-1],date.da_year-1900
140: ,curtime.ti_hour,curtime.ti_min,curtime.ti_sec);
141:
142: hdr.destzone =addr.zone;
143: hdr.destnet =addr.net;
144: hdr.destnode =addr.node;
145: hdr.destpoint =addr.point;
146:
147: for(i=0;i<total_faddrs;i++)
148: if(addr.zone==faddr[i].zone && addr.net==faddr[i].net)
149: break;
150: if(i==total_faddrs) {
151: for(i=0;i<total_faddrs;i++)
152: if(addr.zone==faddr[i].zone)
153: break; }
154: if(i==total_faddrs)
155: i=0;
156: hdr.origzone =faddr[i].zone;
157: hdr.orignet =faddr[i].net;
158: hdr.orignode =faddr[i].node;
159: hdr.origpoint =faddr[i].point;
160:
161: strcpy(str,faddrtoa(faddr[i]));
162: bprintf(text[NetMailing],hdr.to,faddrtoa(addr),hdr.from,str);
163:
164: hdr.attr=(FIDO_LOCAL|FIDO_PRIVATE);
165:
166: if(netmail_misc&NMAIL_CRASH) hdr.attr|=FIDO_CRASH;
167: if(netmail_misc&NMAIL_HOLD) hdr.attr|=FIDO_HOLD;
168: if(netmail_misc&NMAIL_KILL) hdr.attr|=FIDO_KILLSENT;
169: if(mode&WM_FILE) hdr.attr|=FIDO_FILE;
170:
171: sprintf(str,"%sNETMAIL.MSG",node_dir);
172: remove(str); /* Just incase it's already there */
173: // mode&=~WM_FILE;
174: if(!writemsg(str,nulstr,subj,WM_NETMAIL|mode,INVALID_SUB,into)) {
175: bputs(text[Aborted]);
176: return; }
177:
178: if(mode&WM_FILE) {
179: strcpy(fname,subj);
180: sprintf(str,"%sFILE\\%04u.OUT",data_dir,useron.number);
181: mkdir(str);
182: strcpy(tmp,data_dir);
183: if(tmp[0]=='.') /* Relative path */
184: sprintf(tmp,"%s%s",node_dir,data_dir);
185: sprintf(str,"%sFILE\\%04u.OUT\\%s",tmp,useron.number,fname);
186: strcpy(subj,str);
187: if(fexist(str)) {
188: bputs(text[FileAlreadyThere]);
189: return; }
190: if(online==ON_LOCAL) { /* Local upload */
191: bputs(text[EnterPath]);
192: if(!getstr(str,60,K_LINE|K_UPPER)) {
193: bputs(text[Aborted]);
194: return; }
195: backslash(str);
196: strcat(str,fname);
197: if(mv(str,subj,1))
198: return; }
199: else { /* Remote */
200: menu("ULPROT");
201: mnemonics(text[ProtocolOrQuit]);
202: strcpy(str,"Q");
203: for(x=0;x<total_prots;x++)
204: if(prot[x]->ulcmd[0] && chk_ar(prot[x]->ar,useron)) {
205: sprintf(tmp,"%c",prot[x]->mnemonic);
206: strcat(str,tmp); }
207: ch=getkeys(str,0);
208: if(ch=='Q' || sys_status&SS_ABORT) {
209: bputs(text[Aborted]);
210: return; }
211: for(x=0;x<total_prots;x++)
212: if(prot[x]->ulcmd[0] && prot[x]->mnemonic==ch
213: && chk_ar(prot[x]->ar,useron))
214: break;
215: if(x<total_prots) /* This should be always */
216: protocol(cmdstr(prot[x]->ulcmd,subj,nulstr,NULL),0); }
217: l=flength(subj);
218: if(l>0)
219: bprintf(text[FileNBytesReceived],fname,ultoac(l,tmp));
220: else {
221: bprintf(text[FileNotReceived],fname);
222: return; } }
223:
224: p=subj;
225: if((SYSOP || useron.exempt&FLAG('F'))
226: && !strncmpi(p,"CR:",3)) { /* Crash over-ride by sysop */
227: p+=3; /* skip CR: */
228: if(*p==SP) p++; /* skip extra space if it exists */
229: hdr.attr|=FIDO_CRASH; }
230:
231: if((SYSOP || useron.exempt&FLAG('F'))
232: && !strncmpi(p,"FR:",3)) { /* File request */
233: p+=3; /* skip FR: */
234: if(*p==SP) p++;
235: hdr.attr|=FIDO_FREQ; }
236:
237: if((SYSOP || useron.exempt&FLAG('F'))
238: && !strncmpi(p,"RR:",3)) { /* Return receipt request */
239: p+=3; /* skip RR: */
240: if(*p==SP) p++;
241: hdr.attr|=FIDO_RRREQ; }
242:
243: if((SYSOP || useron.exempt&FLAG('F'))
244: && !strncmpi(p,"FA:",3)) { /* File Attachment */
245: p+=3; /* skip FA: */
246: if(*p==SP) p++;
247: hdr.attr|=FIDO_FILE; }
248:
249: sprintf(hdr.subj,"%.71s",p);
250:
251: sprintf(str,"%sNETMAIL.MSG",node_dir);
252: if((file=nopen(str,O_RDONLY))==-1) {
253: close(fido);
254: errormsg(WHERE,ERR_OPEN,str,O_RDONLY);
255: return; }
256: length=filelength(file);
257: if((buf=(char *)MALLOC(length))==NULL) {
258: close(fido);
259: close(file);
260: errormsg(WHERE,ERR_ALLOC,str,length);
261: return; }
262: read(file,buf,length);
263: close(file);
264:
265: cc_sent=0;
266: while(1) {
267: for(i=1;i;i++) {
268: sprintf(str,"%s%u.MSG",netmail_dir,i);
269: if(!fexist(str))
270: break; }
271: if(!i) {
272: bputs(text[TooManyEmailsToday]);
273: return; }
274: if((fido=nopen(str,O_WRONLY|O_CREAT|O_EXCL))==-1) {
275: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_EXCL);
276: return; }
277: write(fido,&hdr,sizeof(hdr));
278:
279: pt_zone_kludge(hdr,fido);
280:
281: if(netmail_misc&NMAIL_DIRECT) {
282: sprintf(str,"\1FLAGS DIR\r\n");
283: write(fido,str,strlen(str)); }
284: if(mode&WM_FILE) {
285: sprintf(str,"\1FLAGS KFS\r\n");
286: write(fido,str,strlen(str)); }
287:
288: if(cc_sent) {
289: sprintf(str,"* Originally to: %s\r\n\r\n",into);
290: write(fido,str,strlen(str)); }
291:
292: l=0L;
293: while(l<length) {
294: if(buf[l]==1) /* Ctrl-A, so skip it and the next char */
295: l++;
296: else if(buf[l]!=LF) {
297: if((uchar)buf[l]==0x8d) /* r0dent i converted to normal i */
298: buf[l]='i';
299: write(fido,buf+l,1); }
300: l++; }
301: l=0;
302: write(fido,&l,1); /* Null terminator */
303: close(fido);
304:
305: if(!(useron.exempt&FLAG('S')))
306: subtract_cdt(netmail_cost);
307: if(mode&WM_FILE)
308: sprintf(str,"Sent NetMail file attachment to %s (%s)"
309: ,hdr.to,faddrtoa(addr));
310: else
311: sprintf(str,"Sent NetMail to %s (%s)"
312: ,hdr.to,faddrtoa(addr));
313: logline("EN",str);
314:
315: cc_found=0;
316: for(l=0;l<length && cc_found<=cc_sent;l++)
317: if(l+3<length && !strnicmp(buf+l,"CC:",3)) {
318: cc_found++;
319: l+=2; }
320: else {
321: while(l<length && *(buf+l)!=LF)
322: l++; }
323: if(!cc_found)
324: break;
325: while(l<length && *(buf+l)==SP) l++;
326: for(i=0;l<length && *(buf+l)!=LF && i<128;i++,l++)
327: str[i]=buf[l];
328: if(!i)
329: break;
330: str[i]=0;
331: p=strrchr(str,'@');
332: if(p) {
333: addr=atofaddr(p+1);
334: *p=0;
335: sprintf(hdr.to,"%.35s",str); }
336: else {
337: atofaddr(str);
338: strcpy(hdr.to,"Sysop"); }
339: hdr.destzone =addr.zone;
340: hdr.destnet =addr.net;
341: hdr.destnode =addr.node;
342: hdr.destpoint =addr.point;
343: cc_sent++; }
344:
345: if(netmail_sem[0]) /* update semaphore file */
346: if((file=nopen(netmail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
347: close(file);
348:
349: FREE(buf);
350: }
351:
352: /****************************************************************************/
353: /* Send FidoNet NetMail from QWK REP Packet */
354: /****************************************************************************/
355: void qwktonetmail(FILE *rep, char *block, char *into, uchar fromhub)
356: {
357: char HUGE16 *qwkbuf,to[129],name[129],sender[129],senderaddr[129]
358: ,str[256],*p,*cp,*addr,fulladdr[129],ch,buf[SDT_BLOCK_LEN];
359: int i,fido,inet=0,qnet=0,x;
360: ushort net,xlat;
361: long l,offset,length,m,n;
362: faddr_t fidoaddr;
363: fmsghdr_t hdr;
364: smbmsg_t msg;
365:
366: if(useron.rest&FLAG('M')) {
367: bputs(text[NoNetMailAllowed]);
368: return; }
369:
370: sprintf(str,"%.6s",block+116);
371: n=atol(str); /* i = number of 128 byte records */
372:
373: if(n<2L || n>999999L) {
374: errormsg(WHERE,ERR_CHK,"QWK blocks",n);
375: return; }
376: if((qwkbuf=MALLOC(n*128L))==NULL) {
377: errormsg(WHERE,ERR_ALLOC,nulstr,n*128L);
378: return; }
379: memcpy((char *)qwkbuf,block,128);
380: fread(qwkbuf+128,n-1,128,rep);
381:
382: if(into==NULL)
383: sprintf(to,"%-128.128s",(char *)qwkbuf+128); /* To user on first line */
384: else
385: strcpy(to,into);
386:
387: p=strchr(to,0xe3); /* chop off at first CR */
388: if(p) *p=0;
389:
390: strcpy(name,to);
391: p=strchr(name,'@');
392: if(p) *p=0;
393: truncsp(name);
394:
395:
396: p=strrchr(to,'@'); /* Find '@' in name@addr */
397: if(p && !isdigit(*(p+1)) && !strchr(p,'.') && !strchr(p,':')) { /* QWKnet */
398: qnet=1;
399: *p=0; }
400: else if(p==NULL || !isdigit(*(p+1)) || !total_faddrs) {
401: if(p==NULL && dflt_faddr.zone)
402: fidoaddr=dflt_faddr;
403: else if(inetmail_misc&NMAIL_ALLOW) { /* Internet */
404: inet=1;
405: /*
406: if(p)
407: *p=0; /* Chop off address */
408: */
409: }
410: else if(dflt_faddr.zone)
411: fidoaddr=dflt_faddr;
412: else {
413: bprintf("\1n\r\nInvalid NetMail address.\r\n");
414: FREE(qwkbuf);
415: return; } }
416: else {
417: fidoaddr=atofaddr(p+1); /* Get fido address */
418: *p=0; /* Chop off address */
419: }
420:
421:
422: if(!inet && !qnet && /* FidoNet */
423: ((!SYSOP && !(netmail_misc&NMAIL_ALLOW)) || !total_faddrs)) {
424: bputs(text[NoNetMailAllowed]);
425: FREE(qwkbuf);
426: return; }
427:
428: truncsp(to); /* Truncate off space */
429:
430: if(!stricmp(to,"SBBS") && !SYSOP && qnet) {
431: FREE(qwkbuf);
432: return; }
433:
434: l=128; /* Start of message text */
435:
436: if(qnet || inet) {
437:
438: if(into==NULL) { /* If name@addr on first line, skip first line */
439: while(l<(n*128L) && (uchar)qwkbuf[l]!=0xe3) l++;
440: l++; }
441:
442: memset(&msg,0,sizeof(smbmsg_t));
443: memcpy(msg.hdr.id,"SHD\x1a",4);
444: msg.hdr.version=SMB_VERSION;
445: msg.hdr.when_imported.time=time(NULL);
446: msg.hdr.when_imported.zone=sys_timezone;
447:
448: if(fromhub || useron.rest&FLAG('Q')) {
449: net=NET_QWK;
450: smb_hfield(&msg,SENDERNETTYPE,sizeof(net),&net);
451: if(!strncmp((uchar *)qwkbuf+l,"@VIA:",5)) {
452: sprintf(str,"%.128s",qwkbuf+l+5);
453: cp=strchr(str,0xe3);
454: if(cp) *cp=0;
455: l+=strlen(str)+1;
456: cp=str;
457: while(*cp && *cp<=SP) cp++;
458: sprintf(senderaddr,"%s/%s"
459: ,fromhub ? qhub[fromhub-1]->id : useron.alias,cp);
460: strupr(senderaddr);
461: smb_hfield(&msg,SENDERNETADDR,strlen(senderaddr),senderaddr); }
462: else {
463: if(fromhub)
464: strcpy(senderaddr,qhub[fromhub-1]->id);
465: else
466: strcpy(senderaddr,useron.alias);
467: strupr(senderaddr);
468: smb_hfield(&msg,SENDERNETADDR,strlen(senderaddr),senderaddr); }
469: sprintf(sender,"%.25s",block+46); } /* From name */
470: else { /* Not Networked */
471: msg.hdr.when_written.zone=sys_timezone;
472: sprintf(str,"%u",useron.number);
473: smb_hfield(&msg,SENDEREXT,strlen(str),str);
474: strcpy(sender,(qnet || inetmail_misc&NMAIL_ALIAS)
475: ? useron.alias : useron.name);
476: }
477: truncsp(sender);
478: smb_hfield(&msg,SENDER,strlen(sender),sender);
479: if(fromhub)
480: msg.idx.from=0;
481: else
482: msg.idx.from=useron.number;
483: if(!strncmp((uchar *)qwkbuf+l,"@TZ:",4)) {
484: sprintf(str,"%.128s",qwkbuf+l);
485: cp=strchr(str,0xe3);
486: if(cp) *cp=0;
487: l+=strlen(str)+1;
488: cp=str+4;
489: while(*cp && *cp<=SP) cp++;
490: msg.hdr.when_written.zone=(short)ahtoul(cp); }
491: else
492: msg.hdr.when_written.zone=sys_timezone;
493:
494: date.da_mon=((qwkbuf[8]&0xf)*10)+(qwkbuf[9]&0xf);
495: date.da_day=((qwkbuf[11]&0xf)*10)+(qwkbuf[12]&0xf);
496: date.da_year=((qwkbuf[14]&0xf)*10)+(qwkbuf[15]&0xf)+1900;
497: curtime.ti_hour=((qwkbuf[16]&0xf)*10)+(qwkbuf[17]&0xf);
498: curtime.ti_min=((qwkbuf[19]&0xf)*10)+(qwkbuf[20]&0xf); /* From QWK time */
499: curtime.ti_sec=0;
500:
501: msg.hdr.when_written.time=dostounix(&date,&curtime);
502:
503: sprintf(str,"%.25s",block+71); /* Title */
504: smb_hfield(&msg,SUBJECT,strlen(str),str);
505: strlwr(str);
506: msg.idx.subj=crc16(str); }
507:
508: if(qnet) {
509:
510: p++;
511: addr=p;
512: msg.idx.to=qwk_route(addr,fulladdr);
513: if(!fulladdr[0]) { /* Invalid address, so BOUNCE it */
514: /**
515: errormsg(WHERE,ERR_CHK,addr,0);
516: FREE(qwkbuf);
517: smb_freemsgmem(msg);
518: return;
519: **/
520: smb_hfield(&msg,SENDER,strlen(sys_id),sys_id);
521: msg.idx.from=0;
522: msg.idx.to=useron.number;
523: strcpy(to,sender);
524: strcpy(fulladdr,senderaddr);
525: sprintf(str,"BADADDR: %s",addr);
526: smb_hfield(&msg,SUBJECT,strlen(str),str);
527: strlwr(str);
528: msg.idx.subj=crc16(str);
529: net=NET_NONE;
530: smb_hfield(&msg,SENDERNETTYPE,sizeof(net),&net);
531: }
532:
533: smb_hfield(&msg,RECIPIENT,strlen(name),name);
534: net=NET_QWK;
535: smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net);
536:
537: truncsp(fulladdr);
538: smb_hfield(&msg,RECIPIENTNETADDR,strlen(fulladdr),fulladdr);
539:
540: bprintf(text[NetMailing],to,fulladdr,sender,sys_id); }
541:
542: if(inet) { /* Internet E-mail */
543:
544: if(inetmail_cost && !(useron.exempt&FLAG('S'))) {
545: if(useron.cdt+useron.freecdt<inetmail_cost) {
546: bputs(text[NotEnoughCredits]);
547: FREE(qwkbuf);
548: smb_freemsgmem(&msg);
549: return; }
550: sprintf(str,text[NetMailCostContinueQ],inetmail_cost);
551: if(noyes(str)) {
552: FREE(qwkbuf);
553: smb_freemsgmem(&msg);
554: return; } }
555:
556: net=NET_INTERNET;
557: smb_hfield(&msg,RECIPIENT,strlen(name),name);
558: msg.idx.to=0; /* Out-bound NetMail set to 0 */
559: smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net);
560: smb_hfield(&msg,RECIPIENTNETADDR,strlen(to),to);
561:
562: bprintf(text[NetMailing],name,to
563: ,inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name
564: ,sys_inetaddr); }
565:
566: if(qnet || inet) {
567:
568: bputs(text[WritingIndx]);
569:
570: if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) {
571: errormsg(WHERE,ERR_OPEN,"MAIL",i);
572: FREE(qwkbuf);
573: smb_freemsgmem(&msg);
574: return; }
575: sprintf(smb.file,"%sMAIL",data_dir);
576: smb.retry_time=smb_retry_time;
577: if((i=smb_open(&smb))!=0) {
578: smb_stack(&smb,SMB_STACK_POP);
579: errormsg(WHERE,ERR_OPEN,smb.file,i);
580: FREE(qwkbuf);
581: smb_freemsgmem(&msg);
582: return; }
583:
584: if(filelength(fileno(smb.shd_fp))<1L) { /* Create it if it doesn't exist */
585: smb.status.max_crcs=mail_maxcrcs;
586: smb.status.max_msgs=MAX_SYSMAIL;
587: smb.status.max_age=mail_maxage;
588: smb.status.attr=SMB_EMAIL;
589: if((i=smb_create(&smb))!=0) {
590: smb_close(&smb);
591: smb_stack(&smb,SMB_STACK_POP);
592: errormsg(WHERE,ERR_CREATE,smb.file,i);
593: FREE(qwkbuf);
594: smb_freemsgmem(&msg);
595: return; } }
596:
597: length=n*256L; // Extra big for CRLF xlat, was (n-1L)*256L (03/16/96)
598:
599:
600: if(length&0xfff00000UL || !length) {
601: smb_close(&smb);
602: smb_stack(&smb,SMB_STACK_POP);
603: sprintf(str,"REP msg (%ld)",n);
604: errormsg(WHERE,ERR_LEN,str,length);
605: FREE(qwkbuf);
606: smb_freemsgmem(&msg);
607: return; }
608:
609: if((i=smb_open_da(&smb))!=0) {
610: smb_close(&smb);
611: smb_stack(&smb,SMB_STACK_POP);
612: errormsg(WHERE,ERR_OPEN,smb.file,i);
613: FREE(qwkbuf);
614: smb_freemsgmem(&msg);
615: return; }
616: if(sys_misc&SM_FASTMAIL)
617: offset=smb_fallocdat(&smb,length,1);
618: else
619: offset=smb_allocdat(&smb,length,1);
620: smb_close_da(&smb);
621:
622: fseek(smb.sdt_fp,offset,SEEK_SET);
623: xlat=XLAT_NONE;
624: fwrite(&xlat,2,1,smb.sdt_fp);
625: m=2;
626: for(;l<n*128L && m<length;l++) {
627: if(qwkbuf[l]==0 || qwkbuf[l]==LF)
628: continue;
629: if((uchar)qwkbuf[l]==0xe3) {
630: fwrite(crlf,2,1,smb.sdt_fp);
631: m+=2;
632: continue; }
633: fputc(qwkbuf[l],smb.sdt_fp);
634: m++; }
635:
636: for(ch=0;m<length;m++) /* Pad out with NULLs */
637: fputc(ch,smb.sdt_fp);
638: fflush(smb.sdt_fp);
639:
640: msg.hdr.offset=offset;
641:
642: smb_dfield(&msg,TEXT_BODY,length);
643:
644: i=smb_addmsghdr(&smb,&msg,SMB_SELFPACK);
645: smb_close(&smb);
646: smb_stack(&smb,SMB_STACK_POP);
647:
648: smb_freemsgmem(&msg);
649: if(i) {
650: smb_freemsgdat(&smb,offset,length,1);
651: errormsg(WHERE,ERR_WRITE,smb.file,i); }
652: else { /* Successful */
653: if(inet) {
654: if(inetmail_sem[0]) /* update semaphore file */
655: if((fido=nopen(inetmail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
656: close(fido);
657: if(!(useron.exempt&FLAG('S')))
658: subtract_cdt(inetmail_cost); }
659: sprintf(str,"Sent %s NetMail to %s (%s) via QWK"
660: ,qnet ? "QWK":"Internet",name,qnet ? fulladdr : to);
661: logline("EN",str); }
662:
663: FREE((char *)qwkbuf);
664: return; }
665:
666:
667: /****************************** FidoNet **********************************/
668:
669: if(!fidoaddr.zone || !netmail_dir[0]) { // No fido netmail allowed
670: bprintf("\1n\r\nInvalid NetMail address.\r\n");
671: FREE(qwkbuf);
672: return; }
673:
674: memset(&hdr,0,sizeof(hdr)); /* Initialize header to null */
675:
676: if(fromhub || useron.rest&FLAG('Q')) {
677: sprintf(str,"%.25s",block+46); /* From */
678: truncsp(str);
679: sprintf(tmp,"@%s",fromhub ? qhub[fromhub-1]->id : useron.alias);
680: strupr(tmp);
681: strcat(str,tmp); }
682: else
683: strcpy(str,netmail_misc&NMAIL_ALIAS ? useron.alias : useron.name);
684: sprintf(hdr.from,"%.35s",str);
685:
686: sprintf(hdr.to,"%.35s",to);
687:
688: /* Look-up in nodelist? */
689:
690: if(netmail_cost && !(useron.exempt&FLAG('S'))) {
691: if(useron.cdt+useron.freecdt<netmail_cost) {
692: bputs(text[NotEnoughCredits]);
693: FREE(qwkbuf);
694: return; }
695: sprintf(str,text[NetMailCostContinueQ],netmail_cost);
696: if(noyes(str)) {
697: FREE(qwkbuf);
698: return; } }
699:
700: hdr.destzone =fidoaddr.zone;
701: hdr.destnet =fidoaddr.net;
702: hdr.destnode =fidoaddr.node;
703: hdr.destpoint =fidoaddr.point;
704:
705: for(i=0;i<total_faddrs;i++)
706: if(fidoaddr.zone==faddr[i].zone && fidoaddr.net==faddr[i].net)
707: break;
708: if(i==total_faddrs) {
709: for(i=0;i<total_faddrs;i++)
710: if(fidoaddr.zone==faddr[i].zone)
711: break; }
712: if(i==total_faddrs)
713: i=0;
714: hdr.origzone =faddr[i].zone;
715: hdr.orignet =faddr[i].net;
716: hdr.orignode =faddr[i].node;
717: hdr.origpoint =faddr[i].point;
718:
719: strcpy(str,faddrtoa(faddr[i]));
720: bprintf(text[NetMailing],hdr.to,faddrtoa(fidoaddr),hdr.from,str);
721:
722: date.da_mon=((qwkbuf[8]&0xf)*10)+(qwkbuf[9]&0xf);
723: date.da_day=((qwkbuf[11]&0xf)*10)+(qwkbuf[12]&0xf);
724: date.da_year=((qwkbuf[14]&0xf)*10)+(qwkbuf[15]&0xf)+1900;
725: curtime.ti_hour=((qwkbuf[16]&0xf)*10)+(qwkbuf[17]&0xf);
726: curtime.ti_min=((qwkbuf[19]&0xf)*10)+(qwkbuf[20]&0xf); /* From QWK time */
727: curtime.ti_sec=0;
728: sprintf(hdr.time,"%02u %3.3s %02u %02u:%02u:%02u" /* To FidoNet */
729: ,date.da_day,mon[date.da_mon-1],date.da_year-1900
730: ,curtime.ti_hour,curtime.ti_min,curtime.ti_sec);
731:
732: hdr.attr=(FIDO_LOCAL|FIDO_PRIVATE);
733:
734: if(netmail_misc&NMAIL_CRASH) hdr.attr|=FIDO_CRASH;
735: if(netmail_misc&NMAIL_HOLD) hdr.attr|=FIDO_HOLD;
736: if(netmail_misc&NMAIL_KILL) hdr.attr|=FIDO_KILLSENT;
737:
738: sprintf(str,"%.25s",block+71); /* Title */
739: truncsp(str);
740: p=str;
741: if((SYSOP || useron.exempt&FLAG('F'))
742: && !strncmpi(p,"CR:",3)) { /* Crash over-ride by sysop */
743: p+=3; /* skip CR: */
744: if(*p==SP) p++; /* skip extra space if it exists */
745: hdr.attr|=FIDO_CRASH; }
746:
747: if((SYSOP || useron.exempt&FLAG('F'))
748: && !strncmpi(p,"FR:",3)) { /* File request */
749: p+=3; /* skip FR: */
750: if(*p==SP) p++;
751: hdr.attr|=FIDO_FREQ; }
752:
753: if((SYSOP || useron.exempt&FLAG('F'))
754: && !strncmpi(p,"RR:",3)) { /* Return receipt request */
755: p+=3; /* skip RR: */
756: if(*p==SP) p++;
757: hdr.attr|=FIDO_RRREQ; }
758:
759: if((SYSOP || useron.exempt&FLAG('F'))
760: && !strncmpi(p,"FA:",3)) { /* File attachment */
761: p+=3; /* skip FA: */
762: if(*p==SP) p++;
763: hdr.attr|=FIDO_FILE; }
764:
765: sprintf(hdr.subj,"%.71s",p);
766:
767: for(i=1;i;i++) {
768: sprintf(str,"%s%u.MSG",netmail_dir,i);
769: if(!fexist(str))
770: break; }
771: if(!i) {
772: bputs(text[TooManyEmailsToday]);
773: return; }
774: if((fido=nopen(str,O_WRONLY|O_CREAT|O_EXCL))==-1) {
775: FREE(qwkbuf);
776: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_EXCL);
777: return; }
778: write(fido,&hdr,sizeof(hdr));
779:
780: pt_zone_kludge(hdr,fido);
781:
782: if(netmail_misc&NMAIL_DIRECT) {
783: sprintf(str,"\1FLAGS DIR\r\n");
784: write(fido,str,strlen(str)); }
785:
786: l=128L;
787:
788: if(into==NULL) { /* If name@addr on first line, skip first line */
789: while(l<n*128L && (uchar)qwkbuf[l]!=0xe3) l++;
790: l++; }
791:
792: while(l<n*128L) {
793: if(qwkbuf[l]==1) /* Ctrl-A, so skip it and the next char */
794: l++;
795: else if(qwkbuf[l]!=LF) {
796: if((uchar)qwkbuf[l]==0xe3) /* QWK cr/lf char converted to hard CR */
797: qwkbuf[l]=CR;
798: write(fido,(char *)qwkbuf+l,1); }
799: l++; }
800: l=0;
801: write(fido,&l,1); /* Null terminator */
802: close(fido);
803: FREE((char *)qwkbuf);
804: if(netmail_sem[0]) /* update semaphore file */
805: if((fido=nopen(netmail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
806: close(fido);
807: if(!(useron.exempt&FLAG('S')))
808: subtract_cdt(netmail_cost);
809: sprintf(str,"Sent NetMail to %s @%s via QWK",hdr.to,faddrtoa(fidoaddr));
810: logline("EN",str);
811: }
812:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.