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

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: 

unix.superglobalmegacorp.com

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