|
|
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"
1.1.1.2 ! root 139: ,date.da_day,mon[date.da_mon-1],TM_YEAR(date.da_year-1900)
1.1 root 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);
1.1.1.2 ! root 444: msg.hdr.version=smb_ver();
1.1 root 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);
1.1.1.2 ! root 496: date.da_year=((qwkbuf[14]&0xf)*10)+(qwkbuf[15]&0xf);
! 497: if(date.da_year<Y2K_2DIGIT_WINDOW)
! 498: date.da_year+=100;
! 499: date.da_year+=1900;
1.1 root 500: curtime.ti_hour=((qwkbuf[16]&0xf)*10)+(qwkbuf[17]&0xf);
501: curtime.ti_min=((qwkbuf[19]&0xf)*10)+(qwkbuf[20]&0xf); /* From QWK time */
502: curtime.ti_sec=0;
503:
504: msg.hdr.when_written.time=dostounix(&date,&curtime);
505:
506: sprintf(str,"%.25s",block+71); /* Title */
507: smb_hfield(&msg,SUBJECT,strlen(str),str);
508: strlwr(str);
509: msg.idx.subj=crc16(str); }
510:
511: if(qnet) {
512:
513: p++;
514: addr=p;
515: msg.idx.to=qwk_route(addr,fulladdr);
516: if(!fulladdr[0]) { /* Invalid address, so BOUNCE it */
517: /**
518: errormsg(WHERE,ERR_CHK,addr,0);
519: FREE(qwkbuf);
520: smb_freemsgmem(msg);
521: return;
522: **/
523: smb_hfield(&msg,SENDER,strlen(sys_id),sys_id);
524: msg.idx.from=0;
525: msg.idx.to=useron.number;
526: strcpy(to,sender);
527: strcpy(fulladdr,senderaddr);
528: sprintf(str,"BADADDR: %s",addr);
529: smb_hfield(&msg,SUBJECT,strlen(str),str);
530: strlwr(str);
531: msg.idx.subj=crc16(str);
532: net=NET_NONE;
533: smb_hfield(&msg,SENDERNETTYPE,sizeof(net),&net);
534: }
535:
536: smb_hfield(&msg,RECIPIENT,strlen(name),name);
537: net=NET_QWK;
538: smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net);
539:
540: truncsp(fulladdr);
541: smb_hfield(&msg,RECIPIENTNETADDR,strlen(fulladdr),fulladdr);
542:
543: bprintf(text[NetMailing],to,fulladdr,sender,sys_id); }
544:
545: if(inet) { /* Internet E-mail */
546:
547: if(inetmail_cost && !(useron.exempt&FLAG('S'))) {
548: if(useron.cdt+useron.freecdt<inetmail_cost) {
549: bputs(text[NotEnoughCredits]);
550: FREE(qwkbuf);
551: smb_freemsgmem(&msg);
552: return; }
553: sprintf(str,text[NetMailCostContinueQ],inetmail_cost);
554: if(noyes(str)) {
555: FREE(qwkbuf);
556: smb_freemsgmem(&msg);
557: return; } }
558:
559: net=NET_INTERNET;
560: smb_hfield(&msg,RECIPIENT,strlen(name),name);
561: msg.idx.to=0; /* Out-bound NetMail set to 0 */
562: smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net);
563: smb_hfield(&msg,RECIPIENTNETADDR,strlen(to),to);
564:
565: bprintf(text[NetMailing],name,to
566: ,inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name
567: ,sys_inetaddr); }
568:
569: if(qnet || inet) {
570:
571: bputs(text[WritingIndx]);
572:
573: if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) {
574: errormsg(WHERE,ERR_OPEN,"MAIL",i);
575: FREE(qwkbuf);
576: smb_freemsgmem(&msg);
577: return; }
578: sprintf(smb.file,"%sMAIL",data_dir);
579: smb.retry_time=smb_retry_time;
580: if((i=smb_open(&smb))!=0) {
581: smb_stack(&smb,SMB_STACK_POP);
582: errormsg(WHERE,ERR_OPEN,smb.file,i);
583: FREE(qwkbuf);
584: smb_freemsgmem(&msg);
585: return; }
586:
587: if(filelength(fileno(smb.shd_fp))<1L) { /* Create it if it doesn't exist */
588: smb.status.max_crcs=mail_maxcrcs;
589: smb.status.max_msgs=MAX_SYSMAIL;
590: smb.status.max_age=mail_maxage;
591: smb.status.attr=SMB_EMAIL;
592: if((i=smb_create(&smb))!=0) {
593: smb_close(&smb);
594: smb_stack(&smb,SMB_STACK_POP);
595: errormsg(WHERE,ERR_CREATE,smb.file,i);
596: FREE(qwkbuf);
597: smb_freemsgmem(&msg);
598: return; } }
599:
600: length=n*256L; // Extra big for CRLF xlat, was (n-1L)*256L (03/16/96)
601:
602:
603: if(length&0xfff00000UL || !length) {
604: smb_close(&smb);
605: smb_stack(&smb,SMB_STACK_POP);
606: sprintf(str,"REP msg (%ld)",n);
607: errormsg(WHERE,ERR_LEN,str,length);
608: FREE(qwkbuf);
609: smb_freemsgmem(&msg);
610: return; }
611:
612: if((i=smb_open_da(&smb))!=0) {
613: smb_close(&smb);
614: smb_stack(&smb,SMB_STACK_POP);
615: errormsg(WHERE,ERR_OPEN,smb.file,i);
616: FREE(qwkbuf);
617: smb_freemsgmem(&msg);
618: return; }
619: if(sys_misc&SM_FASTMAIL)
620: offset=smb_fallocdat(&smb,length,1);
621: else
622: offset=smb_allocdat(&smb,length,1);
623: smb_close_da(&smb);
624:
625: fseek(smb.sdt_fp,offset,SEEK_SET);
626: xlat=XLAT_NONE;
627: fwrite(&xlat,2,1,smb.sdt_fp);
628: m=2;
629: for(;l<n*128L && m<length;l++) {
630: if(qwkbuf[l]==0 || qwkbuf[l]==LF)
631: continue;
632: if((uchar)qwkbuf[l]==0xe3) {
633: fwrite(crlf,2,1,smb.sdt_fp);
634: m+=2;
635: continue; }
636: fputc(qwkbuf[l],smb.sdt_fp);
637: m++; }
638:
639: for(ch=0;m<length;m++) /* Pad out with NULLs */
640: fputc(ch,smb.sdt_fp);
641: fflush(smb.sdt_fp);
642:
643: msg.hdr.offset=offset;
644:
645: smb_dfield(&msg,TEXT_BODY,length);
646:
647: i=smb_addmsghdr(&smb,&msg,SMB_SELFPACK);
648: smb_close(&smb);
649: smb_stack(&smb,SMB_STACK_POP);
650:
651: smb_freemsgmem(&msg);
652: if(i) {
653: smb_freemsgdat(&smb,offset,length,1);
654: errormsg(WHERE,ERR_WRITE,smb.file,i); }
655: else { /* Successful */
656: if(inet) {
657: if(inetmail_sem[0]) /* update semaphore file */
658: if((fido=nopen(inetmail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
659: close(fido);
660: if(!(useron.exempt&FLAG('S')))
661: subtract_cdt(inetmail_cost); }
662: sprintf(str,"Sent %s NetMail to %s (%s) via QWK"
663: ,qnet ? "QWK":"Internet",name,qnet ? fulladdr : to);
664: logline("EN",str); }
665:
666: FREE((char *)qwkbuf);
667: return; }
668:
669:
670: /****************************** FidoNet **********************************/
671:
672: if(!fidoaddr.zone || !netmail_dir[0]) { // No fido netmail allowed
673: bprintf("\1n\r\nInvalid NetMail address.\r\n");
674: FREE(qwkbuf);
675: return; }
676:
677: memset(&hdr,0,sizeof(hdr)); /* Initialize header to null */
678:
679: if(fromhub || useron.rest&FLAG('Q')) {
680: sprintf(str,"%.25s",block+46); /* From */
681: truncsp(str);
682: sprintf(tmp,"@%s",fromhub ? qhub[fromhub-1]->id : useron.alias);
683: strupr(tmp);
684: strcat(str,tmp); }
685: else
686: strcpy(str,netmail_misc&NMAIL_ALIAS ? useron.alias : useron.name);
687: sprintf(hdr.from,"%.35s",str);
688:
689: sprintf(hdr.to,"%.35s",to);
690:
691: /* Look-up in nodelist? */
692:
693: if(netmail_cost && !(useron.exempt&FLAG('S'))) {
694: if(useron.cdt+useron.freecdt<netmail_cost) {
695: bputs(text[NotEnoughCredits]);
696: FREE(qwkbuf);
697: return; }
698: sprintf(str,text[NetMailCostContinueQ],netmail_cost);
699: if(noyes(str)) {
700: FREE(qwkbuf);
701: return; } }
702:
703: hdr.destzone =fidoaddr.zone;
704: hdr.destnet =fidoaddr.net;
705: hdr.destnode =fidoaddr.node;
706: hdr.destpoint =fidoaddr.point;
707:
708: for(i=0;i<total_faddrs;i++)
709: if(fidoaddr.zone==faddr[i].zone && fidoaddr.net==faddr[i].net)
710: break;
711: if(i==total_faddrs) {
712: for(i=0;i<total_faddrs;i++)
713: if(fidoaddr.zone==faddr[i].zone)
714: break; }
715: if(i==total_faddrs)
716: i=0;
717: hdr.origzone =faddr[i].zone;
718: hdr.orignet =faddr[i].net;
719: hdr.orignode =faddr[i].node;
720: hdr.origpoint =faddr[i].point;
721:
722: strcpy(str,faddrtoa(faddr[i]));
723: bprintf(text[NetMailing],hdr.to,faddrtoa(fidoaddr),hdr.from,str);
724:
725: date.da_mon=((qwkbuf[8]&0xf)*10)+(qwkbuf[9]&0xf);
726: date.da_day=((qwkbuf[11]&0xf)*10)+(qwkbuf[12]&0xf);
1.1.1.2 ! root 727: date.da_year=((qwkbuf[14]&0xf)*10)+(qwkbuf[15]&0xf);
! 728: if(date.da_year<Y2K_2DIGIT_WINDOW)
! 729: date.da_year+=100;
! 730: date.da_year+=1900;
1.1 root 731: curtime.ti_hour=((qwkbuf[16]&0xf)*10)+(qwkbuf[17]&0xf);
732: curtime.ti_min=((qwkbuf[19]&0xf)*10)+(qwkbuf[20]&0xf); /* From QWK time */
733: curtime.ti_sec=0;
734: sprintf(hdr.time,"%02u %3.3s %02u %02u:%02u:%02u" /* To FidoNet */
1.1.1.2 ! root 735: ,date.da_day,mon[date.da_mon-1],TM_YEAR(date.da_year-1900)
1.1 root 736: ,curtime.ti_hour,curtime.ti_min,curtime.ti_sec);
737:
738: hdr.attr=(FIDO_LOCAL|FIDO_PRIVATE);
739:
740: if(netmail_misc&NMAIL_CRASH) hdr.attr|=FIDO_CRASH;
741: if(netmail_misc&NMAIL_HOLD) hdr.attr|=FIDO_HOLD;
742: if(netmail_misc&NMAIL_KILL) hdr.attr|=FIDO_KILLSENT;
743:
744: sprintf(str,"%.25s",block+71); /* Title */
745: truncsp(str);
746: p=str;
747: if((SYSOP || useron.exempt&FLAG('F'))
748: && !strncmpi(p,"CR:",3)) { /* Crash over-ride by sysop */
749: p+=3; /* skip CR: */
750: if(*p==SP) p++; /* skip extra space if it exists */
751: hdr.attr|=FIDO_CRASH; }
752:
753: if((SYSOP || useron.exempt&FLAG('F'))
754: && !strncmpi(p,"FR:",3)) { /* File request */
755: p+=3; /* skip FR: */
756: if(*p==SP) p++;
757: hdr.attr|=FIDO_FREQ; }
758:
759: if((SYSOP || useron.exempt&FLAG('F'))
760: && !strncmpi(p,"RR:",3)) { /* Return receipt request */
761: p+=3; /* skip RR: */
762: if(*p==SP) p++;
763: hdr.attr|=FIDO_RRREQ; }
764:
765: if((SYSOP || useron.exempt&FLAG('F'))
766: && !strncmpi(p,"FA:",3)) { /* File attachment */
767: p+=3; /* skip FA: */
768: if(*p==SP) p++;
769: hdr.attr|=FIDO_FILE; }
770:
771: sprintf(hdr.subj,"%.71s",p);
772:
773: for(i=1;i;i++) {
774: sprintf(str,"%s%u.MSG",netmail_dir,i);
775: if(!fexist(str))
776: break; }
777: if(!i) {
778: bputs(text[TooManyEmailsToday]);
779: return; }
780: if((fido=nopen(str,O_WRONLY|O_CREAT|O_EXCL))==-1) {
781: FREE(qwkbuf);
782: errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_EXCL);
783: return; }
784: write(fido,&hdr,sizeof(hdr));
785:
786: pt_zone_kludge(hdr,fido);
787:
788: if(netmail_misc&NMAIL_DIRECT) {
789: sprintf(str,"\1FLAGS DIR\r\n");
790: write(fido,str,strlen(str)); }
791:
792: l=128L;
793:
794: if(into==NULL) { /* If name@addr on first line, skip first line */
795: while(l<n*128L && (uchar)qwkbuf[l]!=0xe3) l++;
796: l++; }
797:
798: while(l<n*128L) {
799: if(qwkbuf[l]==1) /* Ctrl-A, so skip it and the next char */
800: l++;
801: else if(qwkbuf[l]!=LF) {
802: if((uchar)qwkbuf[l]==0xe3) /* QWK cr/lf char converted to hard CR */
803: qwkbuf[l]=CR;
804: write(fido,(char *)qwkbuf+l,1); }
805: l++; }
806: l=0;
807: write(fido,&l,1); /* Null terminator */
808: close(fido);
809: FREE((char *)qwkbuf);
810: if(netmail_sem[0]) /* update semaphore file */
811: if((fido=nopen(netmail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
812: close(fido);
813: if(!(useron.exempt&FLAG('S')))
814: subtract_cdt(netmail_cost);
815: sprintf(str,"Sent NetMail to %s @%s via QWK",hdr.to,faddrtoa(fidoaddr));
816: logline("EN",str);
817: }
818:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.