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

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

unix.superglobalmegacorp.com

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