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

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"
        !           139:        ,date.da_day,mon[date.da_mon-1],date.da_year-1900
        !           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);
        !           444:     msg.hdr.version=SMB_VERSION;
        !           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);
        !           496:     date.da_year=((qwkbuf[14]&0xf)*10)+(qwkbuf[15]&0xf)+1900;
        !           497:     curtime.ti_hour=((qwkbuf[16]&0xf)*10)+(qwkbuf[17]&0xf);
        !           498:     curtime.ti_min=((qwkbuf[19]&0xf)*10)+(qwkbuf[20]&0xf);  /* From QWK time */
        !           499:     curtime.ti_sec=0;
        !           500: 
        !           501:     msg.hdr.when_written.time=dostounix(&date,&curtime);
        !           502: 
        !           503:        sprintf(str,"%.25s",block+71);              /* Title */
        !           504:        smb_hfield(&msg,SUBJECT,strlen(str),str);
        !           505:     strlwr(str);
        !           506:        msg.idx.subj=crc16(str); }
        !           507: 
        !           508: if(qnet) {
        !           509: 
        !           510:        p++;
        !           511:        addr=p;
        !           512:        msg.idx.to=qwk_route(addr,fulladdr);
        !           513:        if(!fulladdr[0]) {              /* Invalid address, so BOUNCE it */
        !           514:        /**
        !           515:                errormsg(WHERE,ERR_CHK,addr,0);
        !           516:                FREE(qwkbuf);
        !           517:                smb_freemsgmem(msg);
        !           518:                return;
        !           519:        **/
        !           520:                smb_hfield(&msg,SENDER,strlen(sys_id),sys_id);
        !           521:                msg.idx.from=0;
        !           522:                msg.idx.to=useron.number;
        !           523:                strcpy(to,sender);
        !           524:                strcpy(fulladdr,senderaddr);
        !           525:                sprintf(str,"BADADDR: %s",addr);
        !           526:                smb_hfield(&msg,SUBJECT,strlen(str),str);
        !           527:                strlwr(str);
        !           528:                msg.idx.subj=crc16(str);
        !           529:                net=NET_NONE;
        !           530:         smb_hfield(&msg,SENDERNETTYPE,sizeof(net),&net);
        !           531:        }
        !           532: 
        !           533:        smb_hfield(&msg,RECIPIENT,strlen(name),name);
        !           534:        net=NET_QWK;
        !           535:        smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net);
        !           536: 
        !           537:        truncsp(fulladdr);
        !           538:        smb_hfield(&msg,RECIPIENTNETADDR,strlen(fulladdr),fulladdr);
        !           539: 
        !           540:        bprintf(text[NetMailing],to,fulladdr,sender,sys_id); }
        !           541: 
        !           542: if(inet) {                             /* Internet E-mail */
        !           543: 
        !           544:     if(inetmail_cost && !(useron.exempt&FLAG('S'))) {
        !           545:         if(useron.cdt+useron.freecdt<inetmail_cost) {
        !           546:             bputs(text[NotEnoughCredits]);
        !           547:             FREE(qwkbuf);
        !           548:                        smb_freemsgmem(&msg);
        !           549:             return; }
        !           550:         sprintf(str,text[NetMailCostContinueQ],inetmail_cost);
        !           551:         if(noyes(str)) {
        !           552:             FREE(qwkbuf);
        !           553:                        smb_freemsgmem(&msg);
        !           554:             return; } }
        !           555: 
        !           556:        net=NET_INTERNET;
        !           557:        smb_hfield(&msg,RECIPIENT,strlen(name),name);
        !           558:     msg.idx.to=0;   /* Out-bound NetMail set to 0 */
        !           559:     smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net);
        !           560:        smb_hfield(&msg,RECIPIENTNETADDR,strlen(to),to);
        !           561: 
        !           562:        bprintf(text[NetMailing],name,to
        !           563:         ,inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name
        !           564:                ,sys_inetaddr); }
        !           565: 
        !           566: if(qnet || inet) {
        !           567: 
        !           568:     bputs(text[WritingIndx]);
        !           569: 
        !           570:        if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) {
        !           571:                errormsg(WHERE,ERR_OPEN,"MAIL",i);
        !           572:                FREE(qwkbuf);
        !           573:                smb_freemsgmem(&msg);
        !           574:                return; }
        !           575:        sprintf(smb.file,"%sMAIL",data_dir);
        !           576:        smb.retry_time=smb_retry_time;
        !           577:        if((i=smb_open(&smb))!=0) {
        !           578:                smb_stack(&smb,SMB_STACK_POP);
        !           579:                errormsg(WHERE,ERR_OPEN,smb.file,i);
        !           580:                FREE(qwkbuf);
        !           581:                smb_freemsgmem(&msg);
        !           582:                return; }
        !           583: 
        !           584:        if(filelength(fileno(smb.shd_fp))<1L) {   /* Create it if it doesn't exist */
        !           585:                smb.status.max_crcs=mail_maxcrcs;
        !           586:                smb.status.max_msgs=MAX_SYSMAIL;
        !           587:                smb.status.max_age=mail_maxage;
        !           588:                smb.status.attr=SMB_EMAIL;
        !           589:                if((i=smb_create(&smb))!=0) {
        !           590:                        smb_close(&smb);
        !           591:                        smb_stack(&smb,SMB_STACK_POP);
        !           592:                        errormsg(WHERE,ERR_CREATE,smb.file,i);
        !           593:                        FREE(qwkbuf);
        !           594:                        smb_freemsgmem(&msg);
        !           595:                        return; } }
        !           596: 
        !           597:        length=n*256L;  // Extra big for CRLF xlat, was (n-1L)*256L (03/16/96)
        !           598: 
        !           599: 
        !           600:        if(length&0xfff00000UL || !length) {
        !           601:                smb_close(&smb);
        !           602:                smb_stack(&smb,SMB_STACK_POP);
        !           603:                sprintf(str,"REP msg (%ld)",n);
        !           604:                errormsg(WHERE,ERR_LEN,str,length);
        !           605:                FREE(qwkbuf);
        !           606:                smb_freemsgmem(&msg);
        !           607:                return; }
        !           608: 
        !           609:        if((i=smb_open_da(&smb))!=0) {
        !           610:                smb_close(&smb);
        !           611:                smb_stack(&smb,SMB_STACK_POP);
        !           612:                errormsg(WHERE,ERR_OPEN,smb.file,i);
        !           613:                FREE(qwkbuf);
        !           614:                smb_freemsgmem(&msg);
        !           615:                return; }
        !           616:        if(sys_misc&SM_FASTMAIL)
        !           617:                offset=smb_fallocdat(&smb,length,1);
        !           618:        else
        !           619:                offset=smb_allocdat(&smb,length,1);
        !           620:        smb_close_da(&smb);
        !           621: 
        !           622:        fseek(smb.sdt_fp,offset,SEEK_SET);
        !           623:        xlat=XLAT_NONE;
        !           624:        fwrite(&xlat,2,1,smb.sdt_fp);
        !           625:        m=2;
        !           626:        for(;l<n*128L && m<length;l++) {
        !           627:                if(qwkbuf[l]==0 || qwkbuf[l]==LF)
        !           628:                        continue;
        !           629:                if((uchar)qwkbuf[l]==0xe3) {
        !           630:                        fwrite(crlf,2,1,smb.sdt_fp);
        !           631:                        m+=2;
        !           632:                        continue; }
        !           633:                fputc(qwkbuf[l],smb.sdt_fp);
        !           634:                m++; }
        !           635: 
        !           636:        for(ch=0;m<length;m++)                  /* Pad out with NULLs */
        !           637:                fputc(ch,smb.sdt_fp);
        !           638:        fflush(smb.sdt_fp);
        !           639: 
        !           640:        msg.hdr.offset=offset;
        !           641: 
        !           642:        smb_dfield(&msg,TEXT_BODY,length);
        !           643: 
        !           644:        i=smb_addmsghdr(&smb,&msg,SMB_SELFPACK);
        !           645:        smb_close(&smb);
        !           646:        smb_stack(&smb,SMB_STACK_POP);
        !           647: 
        !           648:        smb_freemsgmem(&msg);
        !           649:        if(i) {
        !           650:                smb_freemsgdat(&smb,offset,length,1);
        !           651:                errormsg(WHERE,ERR_WRITE,smb.file,i); }
        !           652:        else {          /* Successful */
        !           653:                if(inet) {
        !           654:                        if(inetmail_sem[0])      /* update semaphore file */
        !           655:                                if((fido=nopen(inetmail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
        !           656:                                        close(fido);
        !           657:                        if(!(useron.exempt&FLAG('S')))
        !           658:                                subtract_cdt(inetmail_cost); }
        !           659:                sprintf(str,"Sent %s NetMail to %s (%s) via QWK"
        !           660:                        ,qnet ? "QWK":"Internet",name,qnet ? fulladdr : to);
        !           661:                logline("EN",str); }
        !           662: 
        !           663:        FREE((char *)qwkbuf);
        !           664:        return; }
        !           665: 
        !           666: 
        !           667: /****************************** FidoNet **********************************/
        !           668: 
        !           669: if(!fidoaddr.zone || !netmail_dir[0]) {  // No fido netmail allowed
        !           670:        bprintf("\1n\r\nInvalid NetMail address.\r\n");
        !           671:        FREE(qwkbuf);
        !           672:        return; }
        !           673: 
        !           674: memset(&hdr,0,sizeof(hdr));   /* Initialize header to null */
        !           675: 
        !           676: if(fromhub || useron.rest&FLAG('Q')) {
        !           677:        sprintf(str,"%.25s",block+46);              /* From */
        !           678:        truncsp(str);
        !           679:        sprintf(tmp,"@%s",fromhub ? qhub[fromhub-1]->id : useron.alias);
        !           680:        strupr(tmp);
        !           681:        strcat(str,tmp); }
        !           682: else
        !           683:        strcpy(str,netmail_misc&NMAIL_ALIAS ? useron.alias : useron.name);
        !           684: sprintf(hdr.from,"%.35s",str);
        !           685: 
        !           686: sprintf(hdr.to,"%.35s",to);
        !           687: 
        !           688: /* Look-up in nodelist? */
        !           689: 
        !           690: if(netmail_cost && !(useron.exempt&FLAG('S'))) {
        !           691:        if(useron.cdt+useron.freecdt<netmail_cost) {
        !           692:                bputs(text[NotEnoughCredits]);
        !           693:                FREE(qwkbuf);
        !           694:                return; }
        !           695:        sprintf(str,text[NetMailCostContinueQ],netmail_cost);
        !           696:        if(noyes(str)) {
        !           697:                FREE(qwkbuf);
        !           698:                return; } }
        !           699: 
        !           700: hdr.destzone   =fidoaddr.zone;
        !           701: hdr.destnet    =fidoaddr.net;
        !           702: hdr.destnode   =fidoaddr.node;
        !           703: hdr.destpoint  =fidoaddr.point;
        !           704: 
        !           705: for(i=0;i<total_faddrs;i++)
        !           706:        if(fidoaddr.zone==faddr[i].zone && fidoaddr.net==faddr[i].net)
        !           707:         break;
        !           708: if(i==total_faddrs) {
        !           709:        for(i=0;i<total_faddrs;i++)
        !           710:                if(fidoaddr.zone==faddr[i].zone)
        !           711:                        break; }
        !           712: if(i==total_faddrs)
        !           713:        i=0;
        !           714: hdr.origzone   =faddr[i].zone;
        !           715: hdr.orignet    =faddr[i].net;
        !           716: hdr.orignode   =faddr[i].node;
        !           717: hdr.origpoint   =faddr[i].point;
        !           718: 
        !           719: strcpy(str,faddrtoa(faddr[i]));
        !           720: bprintf(text[NetMailing],hdr.to,faddrtoa(fidoaddr),hdr.from,str);
        !           721: 
        !           722: date.da_mon=((qwkbuf[8]&0xf)*10)+(qwkbuf[9]&0xf);
        !           723: date.da_day=((qwkbuf[11]&0xf)*10)+(qwkbuf[12]&0xf);
        !           724: date.da_year=((qwkbuf[14]&0xf)*10)+(qwkbuf[15]&0xf)+1900;
        !           725: curtime.ti_hour=((qwkbuf[16]&0xf)*10)+(qwkbuf[17]&0xf);
        !           726: curtime.ti_min=((qwkbuf[19]&0xf)*10)+(qwkbuf[20]&0xf);         /* From QWK time */
        !           727: curtime.ti_sec=0;
        !           728: sprintf(hdr.time,"%02u %3.3s %02u  %02u:%02u:%02u"          /* To FidoNet */
        !           729:        ,date.da_day,mon[date.da_mon-1],date.da_year-1900
        !           730:        ,curtime.ti_hour,curtime.ti_min,curtime.ti_sec);
        !           731: 
        !           732: hdr.attr=(FIDO_LOCAL|FIDO_PRIVATE);
        !           733: 
        !           734: if(netmail_misc&NMAIL_CRASH) hdr.attr|=FIDO_CRASH;
        !           735: if(netmail_misc&NMAIL_HOLD)  hdr.attr|=FIDO_HOLD;
        !           736: if(netmail_misc&NMAIL_KILL)  hdr.attr|=FIDO_KILLSENT;
        !           737: 
        !           738: sprintf(str,"%.25s",block+71);      /* Title */
        !           739: truncsp(str);
        !           740: p=str;
        !           741: if((SYSOP || useron.exempt&FLAG('F'))
        !           742:     && !strncmpi(p,"CR:",3)) {     /* Crash over-ride by sysop */
        !           743:     p+=3;               /* skip CR: */
        !           744:     if(*p==SP) p++;     /* skip extra space if it exists */
        !           745:     hdr.attr|=FIDO_CRASH; }
        !           746: 
        !           747: if((SYSOP || useron.exempt&FLAG('F'))
        !           748:     && !strncmpi(p,"FR:",3)) {     /* File request */
        !           749:     p+=3;               /* skip FR: */
        !           750:     if(*p==SP) p++;
        !           751:     hdr.attr|=FIDO_FREQ; }
        !           752: 
        !           753: if((SYSOP || useron.exempt&FLAG('F'))
        !           754:     && !strncmpi(p,"RR:",3)) {     /* Return receipt request */
        !           755:     p+=3;               /* skip RR: */
        !           756:     if(*p==SP) p++;
        !           757:     hdr.attr|=FIDO_RRREQ; }
        !           758: 
        !           759: if((SYSOP || useron.exempt&FLAG('F'))
        !           760:        && !strncmpi(p,"FA:",3)) {     /* File attachment */
        !           761:        p+=3;                           /* skip FA: */
        !           762:     if(*p==SP) p++;
        !           763:        hdr.attr|=FIDO_FILE; }
        !           764: 
        !           765: sprintf(hdr.subj,"%.71s",p);
        !           766: 
        !           767: for(i=1;i;i++) {
        !           768:        sprintf(str,"%s%u.MSG",netmail_dir,i);
        !           769:        if(!fexist(str))
        !           770:                break; }
        !           771: if(!i) {
        !           772:        bputs(text[TooManyEmailsToday]);
        !           773:        return; }
        !           774: if((fido=nopen(str,O_WRONLY|O_CREAT|O_EXCL))==-1) {
        !           775:        FREE(qwkbuf);
        !           776:        errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_EXCL);
        !           777:        return; }
        !           778: write(fido,&hdr,sizeof(hdr));
        !           779: 
        !           780: pt_zone_kludge(hdr,fido);
        !           781: 
        !           782: if(netmail_misc&NMAIL_DIRECT) {
        !           783:        sprintf(str,"\1FLAGS DIR\r\n");
        !           784:     write(fido,str,strlen(str)); }
        !           785: 
        !           786: l=128L;
        !           787: 
        !           788: if(into==NULL) {         /* If name@addr on first line, skip first line */
        !           789:        while(l<n*128L && (uchar)qwkbuf[l]!=0xe3) l++;
        !           790:        l++; }
        !           791: 
        !           792: while(l<n*128L) {
        !           793:        if(qwkbuf[l]==1)   /* Ctrl-A, so skip it and the next char */
        !           794:                l++;
        !           795:        else if(qwkbuf[l]!=LF) {
        !           796:                if((uchar)qwkbuf[l]==0xe3) /* QWK cr/lf char converted to hard CR */
        !           797:                        qwkbuf[l]=CR;
        !           798:                write(fido,(char *)qwkbuf+l,1); }
        !           799:        l++; }
        !           800: l=0;
        !           801: write(fido,&l,1);      /* Null terminator */
        !           802: close(fido);
        !           803: FREE((char *)qwkbuf);
        !           804: if(netmail_sem[0])             /* update semaphore file */
        !           805:        if((fido=nopen(netmail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1)
        !           806:                close(fido);
        !           807: if(!(useron.exempt&FLAG('S')))
        !           808:        subtract_cdt(netmail_cost);
        !           809: sprintf(str,"Sent NetMail to %s @%s via QWK",hdr.to,faddrtoa(fidoaddr));
        !           810: logline("EN",str);
        !           811: }
        !           812: 

unix.superglobalmegacorp.com

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