|
|
1.1 root 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);
1.1.1.2 ! root 173: msg.hdr.version=smb_ver();
1.1 root 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);
1.1.1.2 ! root 349: msg.hdr.version=smb_ver();
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.