Annotation of sbbs/sbbs2/netmail.c, revision 1.1.1.2

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.