|
|
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); ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.